jangular-cli
Version:
A powerful CLI tool for rapidly bootstrapping Angular 17 & Spring Boot (Java 21) applications with integrated security, services, and enterprise-ready best practices.
386 lines (297 loc) • 11.7 kB
Markdown
# Jangular
<p align="center">
<img src="logo.svg" alt="Jangular Logo" width="400" height="300">
</p>
## Enterprise-Grade Java API & Angular Starter Kit
Jangular is a comprehensive starter kit that combines the power of Spring Boot for backend development and Angular for frontend, with built-in authentication and authorization systems. This project aims to accelerate enterprise-level development by providing a robust foundation for creating secure, scalable applications.
## Features
- **Full-Stack Solution**: Seamlessly integrates Spring Boot backend with Angular frontend
- **Authentication & Authorization**: Pre-configured security using Spring Security and JWT tokens
- **Database Flexibility**: Support for MySQL, PostgreSQL, and MSSQL databases
- **Database Integration**: Database support with JPA/Hibernate
- **Database Migration**: Automated database schema management with Flyway
- **CLI Tool**: Simple command-line interface for project initialization
- **Ready-to-Use Components**: Login, registration, and dashboard components
- **Route Protection**: Built-in authentication guards for securing routes
- **Token Management**: HTTP interceptors for automatic token handling
- **Service Architecture**: Well-structured service layer for API communication
## Technologies
### Backend
- Java 21
- Spring Boot 3.4.3
- Spring Security
- Spring Data JPA
- JWT Authentication
- Flyway Migration
- MySQL, PostgreSQL, or MSSQL support
- Lombok
- Maven
### Frontend
- Angular (latest version)
- TypeScript
- Angular Material
- RxJS
- Lazy-loaded modules
- Route Guards
- HTTP Interceptors
- Reactive Forms
### CLI Tool
- Node.js
- Commander.js
- Inquirer.js
- Chalk
- fs-extra
## Getting Started
### Prerequisites
- Java 21 or higher
- Node.js 16 or higher
- npm or yarn
- MySQL 8.0 or higher, PostgreSQL, or MSSQL
- Maven 3.6 or higher
### Installation
#### Using the Jangular CLI (Recommended)
```bash
# Install the Jangular CLI
npm install jangular-cli
# Create a new Jangular project
jangular init my-project
# Navigate to your project
cd my-project
# Start the backend
npm run start:backend
# In another terminal, start the frontend
npm run start:frontend
```
#### Interactive CLI Setup
When initializing a new project, the CLI will prompt you for configuration options:
```
Creating new JAngular project: my-project
✔ Enter base package name: com.example.myproject
✔ Select database type: [MySQL/PostgreSQL/MSSQL]
✔ Enter database name: my_project_db
✔ Enter database username: devuser
✔ Enter database password: ********
```
#### CLI Command Reference
```bash
# View help information
jangular --help
# Initialize a new project
jangular init <projectName>
# Display version
jangular --version
```
#### Manual Installation
1. Clone the repository:
```bash
git clone https://github.com/yourusername/jangular.git
cd jangular
```
2. Configure your database settings in `application.properties` or `application.yml`.
3. Build and run the backend:
```bash
mvn clean install
mvn spring-boot:run
```
4. In a separate terminal, navigate to the frontend directory and run:
```bash
cd frontend
npm install
ng serve
```
## Project Structure
```
jangular-project/
├── backend/ # Spring Boot application
│ ├── src/
│ │ ├── main/
│ │ │ ├── java/ # Java source files
│ │ │ ├── resources/ # Backend resources
│ │ │ │ ├── db/migration/ # Flyway migration scripts
│ │ └── test/ # Test files
│ └── pom.xml # Maven configuration
├── frontend/ # Angular application
│ ├── src/
│ │ ├── app/
│ │ │ ├── auth/ # Authentication module
│ │ │ ├── components/ # UI components
│ │ │ ├── services/ # API services
│ │ │ ├── guards/ # Route guards
│ │ │ └── interceptors/ # HTTP interceptors
│ │ ├── assets/ # Static assets
│ │ └── environments/ # Environment configurations
│ ├── package.json # NPM dependencies
│ └── angular.json # Angular CLI configuration
├── package.json # Root package.json with scripts
└── README.md # Project documentation
```
## Database Configuration
Jangular supports multiple database systems:
### MySQL Configuration
```yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/your_database_name
username: your_username
password: your_password
driver-class-name: com.mysql.cj.jdbc.Driver
```
### PostgreSQL Configuration
```yaml
spring:
datasource:
url: jdbc:postgresql://localhost:5432/your_database_name
username: your_username
password: your_password
driver-class-name: org.postgresql.Driver
```
### MSSQL Configuration
```yaml
spring:
datasource:
url: jdbc:sqlserver://localhost:1433;databaseName=your_database_name
username: your_username
password: your_password
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
```
## Contributing to Templates
Jangular uses Git submodules for the frontend and backend templates:
- Backend template: `github/nathangtg/jangular-backend`
- Frontend template: `github/nathangtg/frontend`
### How to Contribute
1. **Clone the repository with submodules**:
```bash
git clone --recurse-submodules https://github.com/yourusername/jangular-cli.git
cd jangular-cli
```
2. **Update submodules** (if you didn't clone with `--recurse-submodules`):
```bash
git submodule update --init --recursive
```
3. **Making changes to templates**:
For backend template:
```bash
# Navigate to backend template
cd templates/backend
# Make your changes
# Commit and push changes
git add .
git commit -m "Description of your changes"
git push origin master
```
For frontend template:
```bash
# Navigate to frontend template
cd templates/frontend
# Make your changes
# Commit and push changes
git add .
git commit -m "Description of your changes"
git push origin master
```
4. **Update the main repository to reference the new template version**:
```bash
# Return to the main project directory
cd ..
# Update the submodule reference
git add templates/backend # or templates/frontend
git commit -m "Update template reference"
git push
```
## API Endpoints
### Authentication Controller (`/api/auth`)
| Method | Endpoint | Description | Access |
|--------|----------|-------------|--------|
| POST | `/api/auth/login` | User login | Public |
| POST | `/api/auth/register` | User registration | Public |
| POST | `/api/auth/refresh` | Refresh access token | Public |
| POST | `/api/auth/logout` | User logout | Authenticated |
### User Controller (`/api/users`)
| Method | Endpoint | Description | Access |
|--------|----------|-------------|--------|
| GET | `/api/users/me` | Get current user info | Authenticated |
| GET | `/api/users/{id}` | Get user by ID | Admin |
| GET | `/api/users` | Get all users | Admin |
| PUT | `/api/users/{id}` | Update user information | User or Admin |
| POST | `/api/users/{id}/change-password` | Change user password | User or Admin |
| DELETE | `/api/users/{id}` | Soft delete a user | Admin |
| POST | `/api/users/{id}/roles` | Add role to user | Admin |
| DELETE | `/api/users/{id}/roles/{roleName}` | Remove role from user | Admin |
| GET | `/api/users/{id}/login-history` | Get user login history | User or Admin |
| GET | `/api/users/{id}/login-history/range` | Get login history for date range | User or Admin |
| GET | `/api/users/{id}/active-sessions` | Get active sessions | User or Admin |
## Authentication System
### Authentication Flow
1. User registers/logs in through the Angular frontend
2. Backend validates credentials and issues JWT tokens (access and refresh)
3. Tokens are stored securely in the browser's local storage
4. Token interceptor attaches the access token to all subsequent API requests
5. Protected routes check token validity using the auth guard
6. Refresh token functionality automatically renews expired tokens
## Angular Routes Configuration
The following table provides an overview of the application's route structure.
### Main Application Routes
| Path | Component/Module | Guard(s) | Description |
|--------------|----------------|-------------|-------------|
| `/auth` | `AuthModule` (Lazy-loaded) | None | Loads authentication-related routes (Login/Register) |
| `/dashboard` | `DashboardComponent` | `authGuard` | Protected dashboard for authenticated users |
| `/admin/users` | `UserModule` (Lazy-loaded) | `AdminGuard` (Inside `UserModule`) | Admin panel for managing users |
| `/` | Redirects to `/dashboard` | None | Default redirection |
### User Module Routes (`/admin/users`)
| Path | Component | Guard(s) | Description |
|-----------------|----------------------|-------------|-------------|
| `/admin/users` | `UserListComponent` | `AdminGuard` | Displays a list of users |
| `/admin/users/:id` | `UserDetailComponent` | `AdminGuard` | Shows details of a specific user |
| `/admin/users/:id/edit` | `UserDetailComponent` | `AdminGuard` | Edit user details |
The **User Module** is lazily loaded to improve performance, ensuring admin-related routes are only loaded when required.
## Key Services
### Auth Service
```typescript
// Key methods provided by AuthService
login(username: string, password: string): Observable<AuthResponse>
register(user: RegisterRequest): Observable<UserDTO>
refreshToken(refreshToken: string): Observable<AuthResponse>
logout(): void
isAuthenticated(): boolean
getAccessToken(): string
```
### User Service
```typescript
// Key methods provided by UserService
getCurrentUser(): Observable<UserDTO>
getUserById(id: number): Observable<UserDTO>
updateUser(id: number, user: UserDTO): Observable<UserDTO>
changePassword(id: number, oldPassword: string, newPassword: string): Observable<void>
```
## Customization
- Modify authentication providers in Spring Security configuration
- Add custom user roles and permissions
- Extend the database schema for additional user properties
- Customize UI components to match your brand identity
- Add additional Angular modules and components
- Extend authentication with social login providers
- Configure different database providers based on your infrastructure requirements
## Development Workflow
### Backend Development
1. Define entity models in Java classes
2. Create repositories for database operations
3. Implement service layer for business logic
4. Expose REST endpoints through controllers
5. Configure security settings for endpoints
### Frontend Development
1. Create new components using Angular CLI
2. Define services for API communication
3. Set up routes in the appropriate module
4. Implement components with reactive forms
5. Style components according to your design system
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
1. Fork the repository
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add some amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request
## License
This project is licensed under the MIT License - see the LICENSE file for details.
---
**Jangular** - Accelerating Enterprise Application Development