You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

20 KiB

开发指南

**本文档引用的文件** - [CrmAppApplication.java](file://crm-app/src/main/java/com/crm/app/CrmAppApplication.java) - [application.yml](file://crm-app/src/main/resources/application.yml) - [AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java) - [SystemController.java](file://crm-auth/src/main/java/com/crm/auth/controller/SystemController.java) - [AuthService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthService.java) - [AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java) - [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java) - [SysDeptServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysDeptServiceImpl.java) - [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java) - [JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java) - [TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java) - [DataScopeInterceptor.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeInterceptor.java) - [BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java) - [OwnedEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/OwnedEntity.java) - [Result.java](file://crm-base/src/main/java/com/crm/base/domain/result/Result.java) - [PageResult.java](file://crm-base/src/main/java/com/crm/base/domain/result/PageResult.java) - [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java) - [MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java) - [RedisConfig.java](file://crm-base/src/main/java/com/crm/base/config/RedisConfig.java) - [SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java) - [MetaObjectFillHandler.java](file://crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.java) - [DataScope.java](file://crm-base/src/main/java/com/crm/base/annotation/DataScope.java) - [BaseServiceImpl.java](file://crm-base/src/main/java/com/crm/base/service/impl/BaseServiceImpl.java) - [IBaseService.java](file://crm-base/src/main/java/com/crm/base/service/IBaseService.java) - [FileApiImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileApiImpl.java) - [FileInfoServiceImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileInfoServiceImpl.java) - [FileController.java](file://crm-file/src/main/java/com/crm/file/controller/FileController.java) - [OrphanChunkCleanupTask.java](file://crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java)

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考虑
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本指南面向新加入的开发者,提供从环境搭建到业务模块快速落地的完整路径。内容涵盖:

  • 项目开发规范、代码风格与命名约定
  • Git 工作流与协作流程
  • 基于基础框架(Base 层)快速实现实体、Service、Controller、数据访问层
  • 高级特性:自定义注解、AOP 切面、消息队列集成、定时任务
  • 代码审查清单、性能优化建议与安全编码规范

目标是确保代码质量与团队协作效率,帮助开发者在统一规范下高效交付。

项目结构

本项目采用多模块 Maven 工程,按领域与职责划分:

  • crm-app:应用启动入口与全局配置
  • crm-base:通用能力(基础实体、结果封装、异常处理、安全上下文、MyBatis Plus、Redis、雪花ID等)
  • crm-auth:认证授权与系统管理(用户、角色、菜单、部门、权限、数据范围)
  • crm-file:文件服务(上传、分片、预览、清理任务)
graph TB
subgraph "应用层"
APP["crm-app<br/>启动入口"]
end
subgraph "基础能力"
BASE["crm-base<br/>通用组件"]
end
subgraph "业务域"
AUTH["crm-auth<br/>认证与系统管理"]
FILE["crm-file<br/>文件服务"]
end
APP --> AUTH
APP --> FILE
AUTH --> BASE
FILE --> BASE

图表来源

  • CrmAppApplication.java
  • application.yml

章节来源

  • CrmAppApplication.java
  • application.yml

核心组件

  • 基础实体与分页结果
    • BaseEntity:公共字段(如创建时间、更新时间等)
    • OwnedEntity:数据所有权扩展(用于数据范围控制)
    • Result/PageResult:统一响应体与分页封装
  • 异常与全局处理
    • GlobalExceptionHandlerAdvice:统一异常捕获与错误码返回
  • MyBatis Plus 与数据库
    • MybatisPlusConfig:分页插件、元对象填充处理器等
    • MetaObjectFillHandler:自动填充审计字段
    • SnowflakeIdWorker:分布式主键生成
  • Redis 缓存
    • RedisConfig:序列化策略与连接配置
  • 安全上下文与数据范围
    • DataScope 注解与拦截器:实现数据可见性控制
    • SecurityUtils:获取当前登录用户信息

章节来源

  • BaseEntity.java
  • OwnedEntity.java
  • Result.java
  • PageResult.java
  • GlobalExceptionHandlerAdvice.java
  • MybatisPlusConfig.java
  • MetaObjectFillHandler.java
  • SnowflakeIdWorker.java
  • RedisConfig.java
  • DataScope.java

架构总览

整体分层清晰:Controller -> Service -> Mapper -> DB,辅以安全、缓存、分页、审计等横切能力。

sequenceDiagram
participant Client as "客户端"
participant Controller as "控制器(Controller)"
participant Service as "服务层(Service)"
participant Mapper as "数据访问(Mapper)"
participant DB as "数据库"
participant Cache as "缓存(Redis)"
Client->>Controller : "HTTP 请求"
Controller->>Service : "调用业务方法"
Service->>Cache : "可选:读取/写入缓存"
Service->>Mapper : "CRUD/查询"
Mapper->>DB : "SQL 执行"
DB-->>Mapper : "结果集"
Mapper-->>Service : "实体/DTO"
Service-->>Controller : "业务结果"
Controller-->>Client : "统一响应(Result)"

图表来源

  • AuthController.java
  • AuthService.java
  • AuthServiceImpl.java
  • BaseServiceImpl.java

详细组件分析

认证与鉴权(Auth)

  • 控制器
    • AuthController:登录、登出、用户信息等接口
    • SystemController:系统级接口(如字典、配置等)
  • 安全配置
    • SecurityConfig:Spring Security 配置、放行路径、过滤器链
    • JwtAuthenticationFilter:JWT 解析与认证上下文设置
    • TokenService:令牌签发、校验、刷新
    • DataScopeInterceptor:数据范围拦截,结合 @DataScope 注解
  • 服务层
    • IAuthService / AuthServiceImpl:登录逻辑、第三方登录、权限加载
    • IAuthUserService / AuthUserServiceImpl:用户信息查询、密码校验
    • ISysDeptService / SysDeptServiceImpl:部门树构建与缓存
classDiagram
class AuthController {
+登录()
+登出()
+获取用户信息()
}
class AuthService {
+登录(参数)
+第三方登录(类型, 参数)
+加载权限(用户)
}
class AuthUserServiceImpl {
+校验密码()
+查询用户()
}
class SecurityConfig {
+配置过滤器链()
+配置授权规则()
}
class JwtAuthenticationFilter {
+解析JWT()
+设置认证上下文()
}
class TokenService {
+签发()
+校验()
+刷新()
}
class DataScopeInterceptor {
+拦截请求()
+注入数据范围条件()
}
AuthController --> AuthService : "调用"
AuthService --> AuthUserServiceImpl : "使用"
SecurityConfig --> JwtAuthenticationFilter : "注册"
SecurityConfig --> DataScopeInterceptor : "注册"

图表来源

  • AuthController.java
  • AuthService.java
  • AuthServiceImpl.java
  • AuthUserServiceImpl.java
  • SecurityConfig.java
  • JwtAuthenticationFilter.java
  • TokenService.java
  • DataScopeInterceptor.java

章节来源

  • AuthController.java
  • SystemController.java
  • SecurityConfig.java
  • JwtAuthenticationFilter.java
  • TokenService.java
  • DataScopeInterceptor.java
  • AuthService.java
  • AuthServiceImpl.java
  • AuthUserServiceImpl.java
  • SysDeptServiceImpl.java

文件服务(File)

  • 控制器
    • FileController:上传、下载、分片初始化、断点续传、预览
  • 服务层
    • FileApiImpl:对外文件 API 实现(对接 MinIO/本地存储)
    • FileInfoServiceImpl:文件元信息管理、状态流转
  • 定时任务
    • OrphanChunkCleanupTask:清理孤儿分片,避免磁盘膨胀
flowchart TD
Start(["开始"]) --> Init["初始化分片会话"]
Init --> Upload["上传分片"]
Upload --> Merge{"是否全部上传完成?"}
Merge --> |否| Upload
Merge --> |是| SaveMeta["保存文件元信息"]
SaveMeta --> Preview["生成预览链接"]
Preview --> Done(["结束"])

图表来源

  • FileController.java
  • FileApiImpl.java
  • FileInfoServiceImpl.java
  • OrphanChunkCleanupTask.java

章节来源

  • FileController.java
  • FileApiImpl.java
  • FileInfoServiceImpl.java
  • OrphanChunkCleanupTask.java

基础服务与通用能力(Base)

  • BaseServiceImpl:通用 CRUD、分页、批量操作封装
  • IBaseService:通用接口定义
  • 元对象填充:MetaObjectFillHandler 自动填充创建人、创建时间等
  • 雪花ID:SnowflakeIdWorker 分布式主键
  • Redis:RedisConfig 统一序列化与过期策略
  • 数据范围:@DataScope 注解配合拦截器实现行级数据隔离
classDiagram
class BaseServiceImpl {
+新增()
+更新()
+删除()
+分页查询()
+批量操作()
}
class IBaseService {
<<interface>>
}
class MetaObjectFillHandler {
+填充审计字段()
}
class SnowflakeIdWorker {
+生成ID()
}
class RedisConfig {
+序列化配置()
+连接配置()
}
class DataScope {
<<annotation>>
}
BaseServiceImpl ..|> IBaseService
BaseServiceImpl --> MetaObjectFillHandler : "使用"
BaseServiceImpl --> SnowflakeIdWorker : "使用"
BaseServiceImpl --> RedisConfig : "使用"

图表来源

  • BaseServiceImpl.java
  • IBaseService.java
  • MetaObjectFillHandler.java
  • SnowflakeIdWorker.java
  • RedisConfig.java
  • DataScope.java

章节来源

  • BaseServiceImpl.java
  • IBaseService.java
  • MetaObjectFillHandler.java
  • SnowflakeIdWorker.java
  • RedisConfig.java
  • DataScope.java

依赖关系分析

  • 模块依赖
    • crm-app 依赖 crm-auth、crm-file
    • crm-auth、crm-file 依赖 crm-base
  • 运行时依赖
    • Spring Security、JWT、MyBatis Plus、Redis、MinIO(文件服务)
  • 关键耦合点
    • 安全上下文与数据范围贯穿各模块
    • 统一异常处理与结果封装在 base 层
graph LR
APP["crm-app"] --> AUTH["crm-auth"]
APP --> FILE["crm-file"]
AUTH --> BASE["crm-base"]
FILE --> BASE

图表来源

  • CrmAppApplication.java
  • application.yml

章节来源

  • CrmAppApplication.java
  • application.yml

性能考虑

  • 数据库
    • 合理使用索引,避免全表扫描;分页查询限制返回字段
    • 批量操作优先使用批量插入/更新,减少往返次数
  • 缓存
    • 热点数据入缓存(如部门树、字典),注意一致性策略与过期时间
    • 避免大对象缓存,合理序列化
  • 异步与任务
    • 耗时操作异步化(如文件处理、通知发送)
    • 定时任务幂等设计,失败重试与告警
  • 连接与线程池
    • 合理配置线程池大小与超时时间,避免阻塞
    • 监控慢 SQL,定期优化

[本节为通用指导,不直接分析具体文件]

故障排查指南

  • 统一异常
    • GlobalExceptionHandlerAdvice 捕获并返回标准错误码与消息
  • 常见错误
    • 认证失败:检查 JWT 配置、过滤器链顺序、TokenService 签名密钥
    • 数据范围异常:确认 @DataScope 注解与拦截器生效,上下文用户信息正确
    • 文件上传失败:检查 MinIO 配置、分片大小、临时目录权限
  • 日志与追踪
    • 开启必要日志级别,定位问题链路
    • 使用 TraceId 贯穿请求链路

章节来源

  • GlobalExceptionHandlerAdvice.java
  • JwtAuthenticationFilter.java
  • TokenService.java
  • DataScopeInterceptor.java

结论

通过统一的 Base 能力与清晰的模块边界,团队可以快速扩展业务功能。遵循本指南中的规范与实践,可显著提升代码质量、可维护性与协作效率。建议在迭代中持续完善监控、测试与文档,保障系统稳定演进。

[本节为总结性内容,不直接分析具体文件]

附录

开发规范与命名约定

  • 包与类
    • 包名小写,按模块划分;类名大驼峰,动词+名词表示行为
    • 接口以 I 开头,实现类以 Impl 结尾
  • 方法与变量
    • 方法名动宾结构,布尔方法用 is/has/can 前缀
    • 常量全大写加下划线,枚举值全大写
  • 注释与文档
    • 复杂逻辑添加行内注释;接口使用 Swagger/Knife4j 注解描述

[本节为通用指导,不直接分析具体文件]

Git 工作流

  • 分支模型
    • main:生产分支;develop:开发主干;feature/:功能分支;hotfix/:热修复
  • 提交规范
    • 类型:feat/fix/docs/style/refactor/test/chore
    • 格式:type(scope): subject
  • 合并流程
    • 功能分支合并至 develop,PR 需至少一名 Reviewer 批准
    • 发布前打 tag,main 分支仅允许受保护合并

[本节为通用指导,不直接分析具体文件]

快速上手:从零到一开发业务模块

  • 创建实体
    • 继承 BaseEntity/OwnedEntity,标注表映射与字段属性
  • 创建 Mapper
    • 继承 CrmBaseMapper,定义必要方法或沿用默认 CRUD
  • 创建 Service
    • 继承 BaseServiceImpl,实现业务逻辑,必要时注入缓存
  • 创建 Controller
    • 定义 REST 接口,统一返回 Result/PageResult
  • 数据范围与权限
    • 需要数据隔离的方法上添加 @DataScope,并在拦截器中生效
  • 示例参考
    • 认证模块的 Controller/Service/Mapper 组织方式

章节来源

  • BaseEntity.java
  • OwnedEntity.java
  • BaseServiceImpl.java
  • AuthController.java
  • AuthService.java
  • AuthServiceImpl.java

高级特性

  • 自定义注解
    • 使用 @DataScope 实现数据范围控制;可扩展审计、限流等注解
  • AOP 切面
    • 基于注解的切面实现日志、性能统计、权限校验等横切逻辑
  • 消息队列集成
    • 引入 MQ 客户端,封装生产者/消费者模板,保证可靠投递与幂等消费
  • 定时任务
    • 使用 @Scheduled 或任务调度框架,实现幂等与失败重试

章节来源

  • DataScope.java
  • OrphanChunkCleanupTask.java

代码审查清单

  • 结构与可读性
    • 包结构清晰,类职责单一,方法长度适中
  • 安全性
    • 输入校验、越权防护、敏感信息脱敏、SQL 防注入
  • 健壮性
    • 异常处理完备,空值与边界条件覆盖
  • 性能
    • 避免 N+1 查询,合理使用缓存与索引
  • 可测试性
    • 单元测试覆盖核心逻辑,Mock 外部依赖

[本节为通用指导,不直接分析具体文件]

安全编码规范

  • 认证与授权
    • 最小权限原则,接口级鉴权,敏感操作二次确认
  • 数据安全
    • 传输加密(HTTPS)、存储加密(敏感字段)、日志脱敏
  • 依赖安全
    • 定期升级依赖,扫描漏洞,禁用不安全算法

[本节为通用指导,不直接分析具体文件]