# spring-template
**Repository Path**: Soullose/spring-template
## Basic Information
- **Project Name**: spring-template
- **Description**: springboot项目模版-ORM(JPA,QueryDSL)-JWT(redis)
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-11-05
- **Last Updated**: 2026-04-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Spring Template
基于 Spring Boot 3.5 的企业级后端项目模板,采用 DDD(领域驱动设计)+ CQRS(命令查询职责分离)架构范式,集成 RBAC 权限管理、JWT 无状态鉴权、分布式缓存、工作流引擎等核心能力。
## ✨ 核心特性
- **DDD + CQRS 架构** — 严格的四层分层(接口层 / 应用层 / 领域层 / 基础设施层),Command/Query 职责分离
- **RBAC 权限体系** — 用户-角色-权限多对多模型,支持多租户、用户组、组织架构
- **JWT 无状态鉴权** — Apache Shiro 2.0 + JWT Token,禁用 Session,支持多种登录方式(账号密码/手机验证码/邮箱验证码)
- **国密加密** — 内置 SM4 对称加密(对象池优化)、Google Tink 加密引擎、BCrypt 密码哈希
- **分布式 ID 生成** — 基于 Snowflake 的 UID 生成器,支持 RingBuffer 缓冲预分配
- **工作流引擎** — 集成 Flowable,独立数据源配置
- **Netty 通信** — Modbus TCP 协议客户端/服务端实现
- **MQTT 集成** — Spring Integration MQTT 消息收发
- **API 文档** — Knife4j (OpenAPI 3) 自动生成
## 🛠 技术栈
| 类别 | 技术 | 版本 |
|------|------|------|
| 运行时 | Java | 17 |
| 框架 | Spring Boot | 3.5.0 |
| 安全框架 | Apache Shiro | 2.0.6 |
| ORM | Spring Data JPA + QueryDSL | 5.1.0 |
| 数据库 | MySQL | 8.3.0 |
| 缓存 | Redisson + Spring Data Redis | 3.44.0 |
| 工作流 | Flowable | 6.8.1 |
| 集成 | Apache Camel | 4.10.3 |
| 脚本引擎 | Groovy | 4.0.26 |
| API 文档 | Knife4j (OpenAPI 3) | 4.5.0 |
| Token | JJWT | 0.12.6 |
| 加密 | Google Tink / 国密 SM4 | - |
| 对象映射 | MapStruct | 1.5.5 |
| 工具库 | Hutool / Guava / Apache Commons | - |
| 文档处理 | Apache POI / PDFBox | 5.4.0 / 3.0.0 |
| 本地缓存 | Caffeine | - |
| 构建 | Maven | - |
## 📐 架构设计
### 分层架构
```mermaid
graph TB
subgraph "接口层 interfaces / adapter"
Controller["Controller
参数校验 & DTO/VO 转换"]
Facade["ServiceFacade
用例编排门面"]
end
subgraph "应用层 app / command"
AppService["ApplicationService
用例编排 & 事务边界"]
CommandHandler["CommandHandler
命令处理器"]
end
subgraph "领域层 domain"
DomainModel["Aggregate / Entity
聚合根 & 实体"]
DomainService["DomainService
领域服务"]
DomainEvent["DomainEvent
领域事件"]
end
subgraph "基础设施层 infrastructure / framework"
RepositoryImpl["Repository Impl
数据持久化"]
ExternalAPI["External API
外部服务封装"]
Framework["Framework
通用技术组件"]
end
Controller --> Facade
Facade --> AppService
AppService --> CommandHandler
CommandHandler --> DomainService
DomainService --> DomainModel
DomainModel --> DomainEvent
DomainService --> RepositoryImpl
RepositoryImpl --> ExternalAPI
AppService --> Framework
```
### RBAC 权限模型
```mermaid
erDiagram
SysUser ||--o{ SysUserRole : "用户-角色关联"
SysRole ||--o{ SysUserRole : "角色-用户关联"
SysRole ||--o{ SysPermission : "角色-权限关联"
SysUser }|--|{ SysUserGroup : "用户组"
SysUser }|--|{ SysOrg : "组织架构"
SysUser }|--|{ SysTenant : "租户"
```
## 📁 目录结构
```
com.w2.springtemplate
├── adapter/ # [接口层] 处理页面请求的 Controller
├── app/ # [应用层] 处理 request,包括 command 和 query
├── client/ # [对外接口] 对外暴露的接口或对象
├── command/ # [CQRS] Command 定义及 Handler
│ └── user/
│ ├── RegisterSysUserCommand.java
│ ├── ChangePasswordCommand.java
│ └── handler/ # Command Handler 实现
├── common/
│ └── config/ # 统一配置(JPA / Knife4j / Redis / Shiro)
├── domain/ # [领域层] 领域模型 & 领域服务
│ ├── experimental/ # DDD 实验性基类(Entity / ValueObject)
│ ├── model/user/ # 用户聚合(实体 & DTO)
│ └── service/ # 领域服务
│ ├── role/
│ ├── user/
│ └── userGroup/
├── framework/ # [框架层] 通用技术基础设施
│ ├── command/ # CQRS 框架(Handler 分发 & 运行环境)
│ ├── constants/ # 常量 & Redis Key 前缀
│ ├── encrypt/gm/sm4/ # 国密 SM4 加密(对象池优化)
│ ├── encrypt/tink/ # Google Tink 加密引擎
│ ├── event/guava/ # Guava EventBus 事件总线
│ ├── fsg/uid/ # 分布式 UID 生成器(Snowflake + RingBuffer)
│ ├── handlers/ # 通用 Handler & 登录事件处理
│ ├── io/ # I/O 工具(PDF / 字体)
│ ├── jpa/ # JPA 基础设施(BaseEntity / ID 生成器 / Auditor)
│ ├── logback/ # Logback 自定义配色
│ ├── netty/
│ │ ├── modjn/ # Modbus TCP 协议实现(客户端 & 服务端)
│ │ └── study/ # Netty 学习示例
│ ├── oos/client/ # 对象存储客户端(SangFor OOS)
│ ├── shiro/ # Shiro 扩展
│ │ ├── authc/ # 多 Realm 认证策略
│ │ ├── bcrypt/ # BCrypt 密码服务
│ │ ├── cache/ # Shiro Redis 缓存
│ │ ├── filter/ # JWT Bearer & 账号登录过滤器
│ │ ├── jwt/ # JWT 工具类
│ │ ├── realm/ # 多登录方式 Realm(账号/手机/邮箱)
│ │ └── session/ # 无 Session Subject 工厂
│ ├── vfs/ # Apache VFS 虚拟文件系统
│ └── workflow/ # Flowable 工作流配置
├── infrastructure/ # [基础设施层] Repository 实现 & Service 实现
│ ├── converters/ # 对象转换器
│ ├── repository/ # JPA Repository 接口
│ └── serviceImpl/ # 领域服务实现
├── interfaces/ # [接口层] 对外用户交互及接口
│ ├── user/
│ │ ├── controller/ # 用户 Controller
│ │ ├── facade/ # 用户服务门面 & DTO
│ │ └── internal/ # 门面实现
│ └── web/ # 通用 Web 控制器(登录 / 测试等)
├── model/ # 模型 & 参数对象
└── utils/ # 工具类(BCrypt / Redis)
```
## 🔧 核心模块说明
### 安全认证(Shiro + JWT)
- **无状态鉴权**:禁用 Session,采用 JWT Token 方式,Token 通过 Redis 管理
- **多 Realm 支持**:`UserAccountRealm`(账号密码)、`PhoneCodeRealm`(手机验证码)、`EmailCodeRealm`(邮箱验证码)
- **密码安全**:BCrypt 哈希 + 登录失败重试限制(`RetryPasswordCredentialsMatcher`)
- **过滤器链**:`BearerAuthenticFilter`(JWT Bearer 认证)、`UserAccountLoginFilter`(账号登录)
### 加密引擎
- **SM4 国密加密**:`SM4Cipher` + `SM4CipherPool`(基于 Apache Commons Pool 对象池),支持多种模式(`SM4Mode`)
- **Google Tink**:`TinkEncryptor` 提供通用加密能力
### 分布式 UID 生成
- **Snowflake 算法**:`DefaultUidGenerator`(默认)和 `CachedUidGenerator`(RingBuffer 缓冲预分配,高性能)
- **Worker ID 分配**:`DisposableWorkerIdAssigner` 基于数据库自动分配 Worker ID,支持 Docker 环境
### Netty Modbus 通信
- **Modbus TCP 协议**:完整的客户端/服务端实现,包含编解码器(`ModbusDecoder` / `ModbusEncoder`)
- **功能码支持**:WriteSingleCoil、WriteSingleRegister 等
### 工作流引擎
- **Flowable 集成**:独立数据源配置(`w2_flowable` 数据库),通过 `FlowableProcessor` 控制开关
### 事件总线
- **Guava EventBus**:`W2EventBusProvider` 提供进程内事件发布/订阅能力,支持 `W2Event` / `W2Listener` 自定义扩展
## 🚀 快速开始
### 环境要求
- **JDK** 17+
- **MySQL** 8.0+
- **Redis** 6.0+
- **Maven** 3.8+
### 数据库配置
1. 创建业务数据库:
```sql
CREATE DATABASE `w2-api` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
```
2. 如需工作流功能,创建工作流数据库:
```sql
CREATE DATABASE `w2_flowable` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
```
3. 修改 [`src/main/resources/application.yml`](src/main/resources/application.yml) 中的数据库连接信息:
```yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/w2-api?allowPublicKeyRetrieval=true
username: root
password: your_password
```
### Redis 配置
修改 [`src/main/resources/application.yml`](src/main/resources/application.yml) 中的 Redis 连接信息:
```yaml
spring:
data:
redis:
host: 127.0.0.1
port: 6379
password: your_redis_password
```
### 构建与运行
```bash
# 编译打包
./mvnw clean package -DskipTests
# 运行
java -jar target/spring-template-0.0.1-SNAPSHOT.jar
# 或使用 Maven 直接运行
./mvnw spring-boot:run
```
服务默认启动端口:**19999**
### API 文档
启动后访问 Knife4j API 文档:
```
http://localhost:19999/doc.html
```
## 📄 许可证
本项目基于 [LICENSE](LICENSE) 文件中声明的许可证发布。