Appearance
架构参考文档
🏗️ 系统架构:JPwise项目的完整架构说明和技术栈详解
📋 目录
项目总览
项目基本信息
- 项目名称: JPwise (jpwise-java-boot)
- 技术架构: 基于 Spring Boot 3.2.4 的企业级应用平台
- 架构模式: 模块化单体架构
- 主要功能: 工作流管理、文档协作、系统管理等企业功能
核心特性
- ✅ 模块化设计 - 各功能模块独立开发和部署
- ✅ 工作流集成 - 内置完整的工作流引擎
- ✅ 多数据源支持 - 支持多种数据库类型
- ✅ 统一工具体系 - 丰富的封装工具类
- ✅ 快速开发框架 - Basic继承体系减少重复代码
模块架构
模块划分
jpwise-java-boot/
├── jpwise-admin/ # 🚀 主应用模块和入口
├── jpwise-common/ # 🔧 共享工具、配置和基础类
├── jpwise-system/ # 💼 核心系统功能
├── jpwise-workflow/ # 📋 工作流引擎和流程管理
├── jpwise-visualdev/ # 🎨 可视化开发工具和表单构建器
├── jpwise-file/ # 📁 文件管理和存储服务
├── jpwise-extend/ # 📈 业务扩展和自定义模块
├── jpwise-hr/ # 👥 人力资源模块
├── jpwise-officeAuto/ # 📄 办公自动化模块
├── jpwise-design/ # 🎯 设计项目模块
└── jpwise-docSystem/ # 📚 档案系统模块
模块职责
jpwise-admin (主应用模块)
- 作用: 项目启动入口和配置中心
- 主类:
jpwise.JpWiseAdminApplication
- 端口: 30000
- 包含: 主配置、启动类、全局配置
jpwise-common (核心模块) ⭐
- 作用: 提供所有工具类、基础配置、公共组件
- 核心内容:
- 工具类 (
jpwise.util.*
) - 基础实体 (
jpwise.model.base.*
) - 常量定义 (
jpwise.constant.*
) - 异常定义 (
jpwise.exception.*
)
- 工具类 (
jpwise-system (系统模块)
- 作用: 核心系统功能
- 包含: 用户管理、权限控制、菜单管理、组织架构
jpwise-workflow (工作流模块)
- 作用: 工作流引擎和流程管理
- 重要: 不要在业务模块中重复实现工作流接口
jpwise-extend (主要开发模块) ⭐
- 作用: 业务扩展和自定义开发
- 数据源:
DbNameConst.JPWISE_DEMO
- 用途: 大部分新功能在此模块开发
技术栈详解
核心框架
xml
<!-- Spring Boot 3.2.4 -->
<spring-boot.version>3.2.4</spring-boot.version>
<!-- Java 17+ -->
<java.version>17</java.version>
<!-- MyBatis-Flex 1.10.8 (ORM框架) -->
<mybatis-flex.version>1.10.8</mybatis-flex.version>
<!-- Sa-Token 1.39.0 (权限认证) -->
<sa-token.version>1.39.0</sa-token.version>
<!-- Jackson 2.18.3 (JSON处理) -->
<jackson.version>2.18.3</jackson.version>
数据库支持
- MySQL: 5.7.x+ / 8.0.x (主要支持)
- SQL Server: 2012+
- Oracle: 11g+
- PostgreSQL: 12+
- 达梦 DM8: 企业版支持
- 人大金仓 KingbaseES: V8 R6
缓存和存储
- Redis: 5.0+ (Windows) / 6.0.x+ (Linux/Mac)
- Redisson: 3.x (Redis客户端)
- 本地存储: 支持本地文件存储
- MinIO: 对象存储支持
构建工具
- Maven: 3.6.3+ (构建工具)
- JDK: OpenJDK 17 (推荐)
三层架构
架构模式
┌─────────────────┐
│ Controller │ ← REST API层,处理HTTP请求
│ (接口层) │
└─────────────────┘
↓
┌─────────────────┐
│ Service │ ← 业务逻辑层,处理业务规则
│ (业务层) │
└─────────────────┘
↓
┌─────────────────┐
│ Mapper │ ← 数据访问层,操作数据库
│ (数据层) │
└─────────────────┘
Controller层职责
java
@RestController
@RequestMapping("/api/extend/Business")
public class BusinessController {
// 职责:
// 1. 接收HTTP请求
// 2. 参数验证和转换
// 3. 调用Service层方法
// 4. 返回统一格式的响应
@BuildQuery
@GetMapping
public ActionResult<PageListVO<BusinessEntity>> getList(QueryBuilder pagination) {
List<BusinessEntity> data = businessService.getList(pagination);
PaginationVO paginationVO = JsonUtil.getJsonToBean(pagination, PaginationVO.class);
return ActionResult.page(data, paginationVO);
}
}
Service层职责
java
@Service
@UseDataSource(DbNameConst.JPWISE_DEMO)
public class BusinessServiceImpl extends ServiceImpl<BusinessMapper, BusinessEntity>
implements BusinessService {
// 职责:
// 1. 业务逻辑处理
// 2. 事务管理
// 3. 数据验证
// 4. 调用Mapper层操作数据
// 5. 缓存管理
// 6. 消息通知
@Override
@Transactional(rollbackFor = Exception.class)
public void create(BusinessEntity entity) {
// 业务逻辑处理
validateBusiness(entity);
setDefaultValues(entity);
this.save(entity);
sendNotification(entity);
}
}
Mapper层职责
java
@Mapper
public interface BusinessMapper extends BaseMapper<BusinessEntity> {
// 职责:
// 1. 数据库CRUD操作
// 2. 复杂SQL查询
// 3. 数据映射
// MyBatis-Flex通过Service实现类提供的基础操作:
// - this.save() 保存
// - this.updateById() 更新
// - this.getById() 查询
// - this.list() 列表查询
// - this.page() 分页查询
}
统一返回格式
ActionResult结构
java
public class ActionResult<T> {
private int code; // 状态码
private String msg; // 消息
private T data; // 数据
private long time; // 时间戳
// 分页字段
private PaginationVO pagination;
// 静态方法
public static <T> ActionResult<T> success(T data);
public static <T> ActionResult<T> fail(String message);
public static <T> ActionResult<T> page(List<T> data, PaginationVO pagination);
}
使用方式
java
// 成功返回数据
return ActionResult.success(entity);
// 成功返回消息
return ActionResult.success(MsgCode.SU001.get());
// 失败返回
return ActionResult.fail("操作失败");
return ActionResult.fail(MsgCode.FA001.get());
// 分页返回
return ActionResult.page(dataList, paginationVO);
响应格式
json
{
"code": 200,
"msg": "操作成功",
"data": {
// 具体数据
},
"time": 1692000000000
}
异常体系
异常类层次
java
// 项目定义的异常类
jpwise.exception.BusinessException // 业务异常
jpwise.exception.DataException // 数据异常
jpwise.exception.WorkFlowException // 工作流异常
// 使用方式
if (businessConditionFails) {
throw new BusinessException("业务规则验证失败");
}
if (dataValidationFails) {
throw new DataException("数据格式错误");
}
if (workflowError) {
throw new WorkFlowException("工作流状态异常");
}
全局异常处理
java
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
public ActionResult handleBusinessException(BusinessException e) {
return ActionResult.fail(e.getMessage());
}
@ExceptionHandler(DataException.class)
public ActionResult handleDataException(DataException e) {
return ActionResult.fail("数据异常:" + e.getMessage());
}
}
数据库架构
多数据源配置
java
// 数据源常量
public class DbNameConst {
public static final String JPWISE_BASE = "jpwise_base"; // 基础数据库
public static final String JPWISE_DEMO = "jpwise_demo"; // 测试项目
public static final String JPWISE_HR = "jpwise_hr"; // 人力资源
public static final String JPWISE_AFFAIR = "jpwise_affair"; // 事务数据库
public static final String JPWISE_DESIGN = "jpwise_design"; // 设计项目
public static final String JPWISE_DOCSYSTEM = "jpwise_docsystem"; // 档案系统
}
// 使用方式
@Service
@UseDataSource(DbNameConst.JPWISE_DEMO)
public class BusinessServiceImpl { }
MyBatis-Flex特性
java
// 1. 实体映射
@Table("business_table")
public class BusinessEntity {
@Id
@Column("id")
private String id;
@Column("name")
private String name;
}
// 2. 查询构建器
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq(Entity::getName, "test")
.like(Entity::getDescription, "keyword")
.between(Entity::getCreateTime, startDate, endDate);
// 3. 分页查询 - 在Service实现类中使用
Page<Entity> page = new Page<>(1, 10);
Page<Entity> result = this.page(page, queryWrapper);
缓存架构
Redis集成
java
@Autowired
private RedisUtil redisUtil;
// 基础操作
redisUtil.insert(key, data, RedisUtil.CACHE_HOUR); // 存储1小时
redisUtil.insert(key, data, RedisUtil.CACHE_DAY); // 存储1天
Object value = redisUtil.getString(key); // 获取
redisUtil.remove(key); // 删除
// 复杂对象
Map<String, Object> map = redisUtil.getMap(key);
缓存策略
java
public BusinessEntity getWithCache(String id) {
// 1. 先查缓存
String cacheKey = "business:" + id;
BusinessEntity cached = (BusinessEntity) redisUtil.getString(cacheKey);
if (cached != null) {
return cached;
}
// 2. 查数据库
BusinessEntity entity = this.getById(id);
if (entity != null) {
// 3. 存入缓存
redisUtil.insert(cacheKey, entity, RedisUtil.CACHE_HOUR);
}
return entity;
}
统一配置
环境配置
yaml
# application.yml
spring:
profiles:
active: dev # dev, test, preview, pro
# 各环境配置文件
application-dev.yml # 开发环境
application-test.yml # 测试环境
application-preview.yml # 预发布环境
application-pro.yml # 生产环境
关键配置项
yaml
# 服务端口
server:
port: 30000
# 数据源配置
spring:
datasource:
# 多数据源配置...
# MyBatis-Flex配置
mybatis-flex:
configuration:
map-underscore-to-camel-case: false # 不转换下划线
# Redis配置
spring:
redis:
host: localhost
port: 6379
开发工作流
标准开发流程
mermaid
graph LR
A[需求分析] --> B[选择开发方式]
B --> C{Basic继承?}
C -->|是| D[继承BasicController]
C -->|否| E[手工实现]
D --> F[使用工具类]
E --> F
F --> G[编写业务逻辑]
G --> H[测试验证]
H --> I[代码审查]
质量保证
- 代码规范: 统一的代码风格和命名规范
- 单元测试: JUnit 5 测试框架
- 集成测试: 完整的接口测试
- 代码审查: 团队代码审查流程
监控和运维
应用监控
- 健康检查: Spring Boot Actuator
- 日志管理: Logback日志框架
- 性能监控: 内置性能统计
部署架构
- 单体部署: 传统WAR包部署
- 容器化: Docker容器支持
- 配置管理: 外部配置文件管理
💡 架构优势:JPwise采用模块化单体架构,既保持了单体应用的简单性,又具备了模块化的灵活性。通过统一的工具体系和开发规范,确保了代码质量和开发效率。