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.
37 KiB
37 KiB
架构设计
**本文引用的文件** - [CrmAppApplication.java](file://crm-app/src/main/java/com/crm/app/CrmAppApplication.java) - [application.yml](file://crm-app/src/main/resources/application.yml) - [AuthApplication.java](file://crm-auth/src/main/java/com/crm/auth/AuthApplication.java) - [application.yml](file://crm-auth/src/main/resources/application.yml) - [SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java) - [PermissionConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/PermissionConfig.java) - [DataInitializer.java](file://crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java) - [AuthProperties.java](file://crm-auth/src/main/java/com/crm/auth/config/AuthProperties.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) - [DataScopeTables.java](file://crm-auth/src/main/java/com/crm/auth/security/DataScopeTables.java) - [SecurityExceptionHandlers.java](file://crm-auth/src/main/java/com/crm/auth/security/SecurityExceptionHandlers.java) - [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) - [IAuthService.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) - [IAuthUserService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthUserService.java) - [AuthUserServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java) - [ISysDeptService.java](file://crm-auth/src/main/java/com/crm/auth/service/ISysDeptService.java) - [SysDeptServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/SysDeptServiceImpl.java) - [DeptTreeCache.java](file://crm-auth/src/main/java/com/crm/auth/service/DeptTreeCache.java) - [AuthIdentityMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/AuthIdentityMapper.java) - [AuthUserMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/AuthUserMapper.java) - [SysDeptMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysDeptMapper.java) - [SysMenuMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysMenuMapper.java) - [SysRoleMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysRoleMapper.java) - [SysRoleMenuMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysRoleMenuMapper.java) - [SysUserDeptMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysUserDeptMapper.java) - [SysUserRoleMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/SysUserRoleMapper.java) - [AuthUser.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java) - [AuthIdentity.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthIdentity.java) - [SysDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysDept.java) - [SysMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysMenu.java) - [SysRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRole.java) - [SysRoleMenu.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysRoleMenu.java) - [SysUserDept.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserDept.java) - [SysUserRole.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/SysUserRole.java) - [LoginParam.java](file://crm-auth/src/main/java/com/crm/auth/domain/param/LoginParam.java) - [LoginResultDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/LoginResultDTO.java) - [UserInfoDTO.java](file://crm-auth/src/main/java/com/crm/auth/domain/dto/UserInfoDTO.java) - [DataScopeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/DataScopeEnum.java) - [IdentityTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/IdentityTypeEnum.java) - [MenuTypeEnum.java](file://crm-auth/src/main/java/com/crm/auth/domain/enums/MenuTypeEnum.java) - [DingTalkAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/DingTalkAuthClient.java) - [ThirdPartyAuthClient.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClient.java) - [ThirdPartyAuthClientFactory.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyAuthClientFactory.java) - [ThirdPartyUserInfo.java](file://crm-auth/src/main/java/com/crm/auth/service/client/ThirdPartyUserInfo.java) - [GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java) - [DataScope.java](file://crm-base/src/main/java/com/crm/base/annotation/DataScope.java) - [CorsConfig.java](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java) - [CrmSqlInjector.java](file://crm-base/src/main/java/com/crm/base/config/CrmSqlInjector.java) - [CustomIdGenerator.java](file://crm-base/src/main/java/com/crm/base/config/CustomIdGenerator.java) - [InsertBatchOnDuplicateKeyUpdate.java](file://crm-base/src/main/java/com/crm/base/config/InsertBatchOnDuplicateKeyUpdate.java) - [JacksonConfig.java](file://crm-base/src/main/java/com/crm/base/config/JacksonConfig.java) - [Knife4jConfig.java](file://crm-base/src/main/java/com/crm/base/config/Knife4jConfig.java) - [MetaObjectFillHandler.java](file://crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.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) - [ScheduledTaskProperties.java](file://crm-base/src/main/java/com/crm/base/config/ScheduledTaskProperties.java) - [SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java) - [SnowflakeProperties.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java) - [CommonConstants.java](file://crm-base/src/main/java/com/crm/base/constant/CommonConstants.java) - [BaseDTO.java](file://crm-base/src/main/java/com/crm/base/domain/dto/BaseDTO.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) - [HasValueEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/HasValueEnum.java) - [StatusEnum.java](file://crm-base/src/main/java/com/crm/base/domain/enums/StatusEnum.java) - [BusinessErrorException.java](file://crm-base/src/main/java/com/crm/base/domain/exception/BusinessErrorException.java) - [MissingParameterException.java](file://crm-base/src/main/java/com/crm/base/domain/exception/MissingParameterException.java) - [PermissionErrorException.java](file://crm-base/src/main/java/com/crm/base/domain/exception/PermissionErrorException.java) - [ResourceNotExistException.java](file://crm-base/src/main/java/com/crm/base/domain/exception/ResourceNotExistException.java) - [BaseParam.java](file://crm-base/src/main/java/com/crm/base/domain/param/BaseParam.java) - [PageResult.java](file://crm-base/src/main/java/com/crm/base/domain/result/PageResult.java) - [Result.java](file://crm-base/src/main/java/com/crm/base/domain/result/Result.java) - [ResultCodeEnum.java](file://crm-base/src/main/java/com/crm/base/domain/result/ResultCodeEnum.java) - [TraceIdFilter.java](file://crm-base/src/main/java/com/crm/base/filter/TraceIdFilter.java) - [CrmBaseMapper.java](file://crm-base/src/main/java/com/crm/base/mapper/CrmBaseMapper.java) - [DataOwnership.java](file://crm-base/src/main/java/com/crm/base/security/DataOwnership.java) - [DataScopeHelper.java](file://crm-base/src/main/java/com/crm/base/security/DataScopeHelper.java) - [DataScopeLevel.java](file://crm-base/src/main/java/com/crm/base/security/DataScopeLevel.java) - [DataVisibilityContext.java](file://crm-base/src/main/java/com/crm/base/security/DataVisibilityContext.java) - [LoginUser.java](file://crm-base/src/main/java/com/crm/base/security/LoginUser.java) - [SecurityUtils.java](file://crm-base/src/main/java/com/crm/base/security/SecurityUtils.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) - [AssertUtils.java](file://crm-base/src/main/java/com/crm/base/utils/AssertUtils.java) - [BeanCopyUtils.java](file://crm-base/src/main/java/com/crm/base/utils/BeanCopyUtils.java) - [EnumUtils.java](file://crm-base/src/main/java/com/crm/base/utils/EnumUtils.java) - [ExcelUtil.java](file://crm-base/src/main/java/com/crm/base/utils/ExcelUtil.java) - [PageConverter.java](file://crm-base/src/main/java/com/crm/base/utils/PageConverter.java) - [ServletUtils.java](file://crm-base/src/main/java/com/crm/base/utils/ServletUtils.java) - [TreeUtils.java](file://crm-base/src/main/java/com/crm/base/utils/TreeUtils.java) - [FileApi.java](file://crm-file/src/main/java/com/crm/file/api/FileApi.java) - [FileController.java](file://crm-file/src/main/java/com/crm/file/controller/FileController.java) - [FileProperties.java](file://crm-file/src/main/java/com/crm/file/config/FileProperties.java) - [MinioConfig.java](file://crm-file/src/main/java/com/crm/file/config/MinioConfig.java) - [SchedulingConfig.java](file://crm-file/src/main/java/com/crm/file/config/SchedulingConfig.java) - [FileConstants.java](file://crm-file/src/main/java/com/crm/file/constant/FileConstants.java) - [FileInfoDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/FileInfoDTO.java) - [FileDownloadDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/FileDownloadDTO.java) - [MultipartInitDTO.java](file://crm-file/src/main/java/com/crm/file/domain/dto/MultipartInitDTO.java) - [UploadSession.java](file://crm-file/src/main/java/com/crm/file/domain/dto/UploadSession.java) - [FileInfo.java](file://crm-file/src/main/java/com/crm/file/domain/entity/FileInfo.java) - [FileInfoMapper.java](file://crm-file/src/main/java/com/crm/file/mapper/FileInfoMapper.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) - [IFileInfoService.java](file://crm-file/src/main/java/com/crm/file/service/IFileInfoService.java) - [KkFileViewClient.java](file://crm-file/src/main/java/com/crm/file/service/KkFileViewClient.java) - [OrphanChunkCleanupTask.java](file://crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java)目录
简介
本架构设计文档面向CRM后端微服务系统,围绕认证服务(crm-auth)、基础框架(crm-base)、文件服务(crm-file)等核心模块展开。文档从分层架构、安全机制、数据访问与缓存策略、事务管理、组件交互与部署拓扑等方面给出系统化说明,帮助开发者快速理解整体设计与技术决策背景。
项目结构
本项目采用多模块Maven工程组织:
- crm-app:应用入口与统一配置聚合层
- crm-auth:认证与权限中心,提供登录鉴权、RBAC、数据权限隔离、第三方登录集成
- crm-base:通用基础能力库,包含异常体系、统一返回、分页、工具类、安全上下文、数据可见性、MyBatis-Plus与Redis配置、雪花ID生成等
- crm-file:文件服务,提供分片上传、断点续传、在线预览、元数据管理与清理任务
graph TB
subgraph "应用层"
APP["crm-app<br/>应用启动与聚合"]
end
subgraph "业务服务"
AUTH["crm-auth<br/>认证与权限"]
FILE["crm-file<br/>文件服务"]
end
subgraph "基础能力"
BASE["crm-base<br/>通用库"]
end
subgraph "外部依赖"
DB["数据库(MySQL)"]
REDIS["缓存(Redis)"]
MINIO["对象存储(MinIO)"]
KK["在线预览(KKFileView)"]
end
APP --> AUTH
APP --> FILE
AUTH --> BASE
FILE --> BASE
AUTH --> DB
AUTH --> REDIS
FILE --> MINIO
FILE --> REDIS
FILE --> KK
图表来源
- CrmAppApplication.java
- AuthApplication.java
- application.yml
- application.yml
章节来源
- CrmAppApplication.java
- AuthApplication.java
- application.yml
- application.yml
核心组件
- 认证与权限(crm-auth)
- Controller层:认证接口、系统信息接口
- Service层:认证流程、用户/角色/菜单/部门管理、第三方登录客户端工厂
- Mapper层:实体映射与SQL操作
- Security层:JWT过滤器、令牌服务、数据权限拦截器、异常处理
- 配置层:安全配置、权限配置、数据初始化、属性注入
- 基础框架(crm-base)
- 统一异常与结果封装、分页、枚举、常量
- 安全上下文与数据可见性控制、登录用户模型
- MyBatis-Plus扩展、Redis配置、雪花ID生成、全局拦截与填充
- 工具集:断言、Bean拷贝、枚举转换、Excel导出、树形结构、请求工具
- 文件服务(crm-file)
- Controller:文件上传下载、分片会话管理
- Service:文件API实现、元数据服务、KKFileView客户端
- Task:孤儿分片清理定时任务
- Config:MinIO配置、调度配置、文件属性
章节来源
- AuthController.java
- SystemController.java
- IAuthService.java
- AuthServiceImpl.java
- IAuthUserService.java
- AuthUserServiceImpl.java
- ISysDeptService.java
- SysDeptServiceImpl.java
- DeptTreeCache.java
- JwtAuthenticationFilter.java
- TokenService.java
- DataScopeInterceptor.java
- DataScopeTables.java
- SecurityExceptionHandlers.java
- GlobalExceptionHandlerAdvice.java
- FileController.java
- FileApiImpl.java
- FileInfoServiceImpl.java
- KkFileViewClient.java
- OrphanChunkCleanupTask.java
架构总览
系统采用“网关/聚合应用 + 微服务 + 基础设施”的分层模式:
- 聚合应用(crm-app)负责启动与配置聚合,按需引入各服务模块
- 认证服务(crm-auth)对外暴露认证与权限相关API,内部通过Service-Mapper分层访问数据
- 文件服务(crm-file)提供文件上传下载与预览能力,依赖对象存储与在线预览服务
- 基础能力(crm-base)被各服务复用,提供统一规范与安全、数据访问、缓存、工具等能力
sequenceDiagram
participant Client as "客户端"
participant Auth as "认证服务(Auth)"
participant Token as "令牌服务(TokenService)"
participant UserSvc as "用户服务(IAuthUserService)"
participant Dept as "部门服务(ISysDeptService)"
participant Cache as "缓存(DeptTreeCache)"
participant DB as "数据库"
Client->>Auth : "POST /auth/login"
Auth->>UserSvc : "校验用户名密码"
UserSvc->>DB : "查询用户信息"
DB-->>UserSvc : "用户实体"
UserSvc-->>Auth : "用户信息"
Auth->>Token : "签发JWT"
Token-->>Auth : "令牌"
Auth->>Dept : "获取部门树"
Dept->>Cache : "读取/构建部门树"
Cache-->>Dept : "部门树"
Dept-->>Auth : "部门树"
Auth-->>Client : "登录成功响应{token, userInfo}"
图表来源
- AuthController.java
- AuthServiceImpl.java
- IAuthUserService.java
- AuthUserServiceImpl.java
- ISysDeptService.java
- DeptTreeCache.java
- TokenService.java
详细组件分析
认证服务(crm-auth)
- 分层职责
- Controller:接收登录、登出、用户信息等请求,参数校验与响应封装
- Service:认证流程编排、用户/角色/菜单/部门CRUD、第三方登录适配
- Mapper:数据访问抽象,对应实体表映射
- Security:JWT过滤器、令牌服务、数据权限拦截器、异常处理器
- Config:安全配置、权限配置、数据初始化、属性注入
- 关键流程
- 登录:校验凭证 -> 生成JWT -> 返回用户信息与令牌
- 鉴权:JWT解析 -> 加载用户权限 -> 数据权限注入(按部门/角色)
- 第三方登录:通过工厂选择客户端(如钉钉),拉取用户信息并绑定本地账号
- 数据权限
- 基于注解@DataScope与拦截器DataScopeInterceptor动态拼接SQL条件
- 支持多种数据范围(本人、本部门、本部门及子部门、全部等)
- 结合部门树缓存提升查询性能
classDiagram
class AuthController {
+login(param) Result
+logout() Result
+getUserInfo() Result
}
class AuthService {
+login(param) LoginResultDTO
+validateToken(token) boolean
}
class IAuthUserService {
+getById(id) AuthUser
+findByUsername(username) AuthUser
}
class ISysDeptService {
+buildDeptTree() SysDept[]
}
class TokenService {
+createToken(user) String
+parseToken(token) LoginUser
+refreshToken(token) String
}
class DataScopeInterceptor {
+preHandle(request,response,handler) boolean
}
class DeptTreeCache {
+getDeptTree() SysDept[]
+refreshDeptTree() void
}
AuthController --> AuthService : "调用"
AuthService --> IAuthUserService : "使用"
AuthService --> ISysDeptService : "使用"
AuthService --> TokenService : "使用"
DataScopeInterceptor --> ISysDeptService : "数据范围注入"
ISysDeptService --> DeptTreeCache : "缓存部门树"
图表来源
- AuthController.java
- IAuthService.java
- AuthServiceImpl.java
- IAuthUserService.java
- AuthUserServiceImpl.java
- ISysDeptService.java
- DeptTreeCache.java
- TokenService.java
- DataScopeInterceptor.java
章节来源
- SecurityConfig.java
- PermissionConfig.java
- DataInitializer.java
- AuthProperties.java
- JwtAuthenticationFilter.java
- TokenService.java
- DataScopeInterceptor.java
- DataScopeTables.java
- SecurityExceptionHandlers.java
- AuthController.java
- SystemController.java
- IAuthService.java
- AuthServiceImpl.java
- IAuthUserService.java
- AuthUserServiceImpl.java
- ISysDeptService.java
- SysDeptServiceImpl.java
- DeptTreeCache.java
- AuthUser.java
- AuthIdentity.java
- SysDept.java
- SysMenu.java
- SysRole.java
- SysRoleMenu.java
- SysUserDept.java
- SysUserRole.java
- LoginParam.java
- LoginResultDTO.java
- UserInfoDTO.java
- DataScopeEnum.java
- IdentityTypeEnum.java
- MenuTypeEnum.java
- DingTalkAuthClient.java
- ThirdPartyAuthClient.java
- ThirdPartyAuthClientFactory.java
- ThirdPartyUserInfo.java
基础框架(crm-base)
- 统一异常与结果
- 全局异常处理器将业务异常转换为统一Result格式
- 定义业务异常类型(参数缺失、权限错误、资源不存在等)
- 安全上下文与数据可见性
- LoginUser承载当前登录用户信息
- DataVisibilityContext维护数据可见性上下文
- DataScope注解与DataScopeHelper配合实现数据权限过滤
- 数据访问与缓存
- MyBatis-Plus配置与扩展(自动填充、批量插入、自定义SQL注入器)
- Redis配置用于缓存(如部门树、权限缓存)
- 雪花ID生成器与自定义ID生成策略
- 工具与通用能力
- 分页转换器、Bean拷贝、枚举工具、Excel导出、树形结构工具、请求工具
flowchart TD
Start(["进入方法"]) --> CheckAnno["检查@DataScope注解"]
CheckAnno --> HasAnno{"存在注解?"}
HasAnno --> |否| Proceed["直接执行"]
HasAnso --> |是| BuildScope["根据上下文构建数据范围"]
BuildScope --> InjectSQL["注入WHERE条件"]
InjectSQL --> Proceed
Proceed --> End(["完成"])
图表来源
- DataScope.java
- DataScopeHelper.java
- DataVisibilityContext.java
- DataScopeLevel.java
章节来源
- GlobalExceptionHandlerAdvice.java
- DataScope.java
- CorsConfig.java
- CrmSqlInjector.java
- CustomIdGenerator.java
- InsertBatchOnDuplicateKeyUpdate.java
- JacksonConfig.java
- Knife4jConfig.java
- MetaObjectFillHandler.java
- MybatisPlusConfig.java
- RedisConfig.java
- ScheduledTaskProperties.java
- SnowflakeIdWorker.java
- SnowflakeProperties.java
- BaseEntity.java
- OwnedEntity.java
- Result.java
- PageResult.java
- ResultCodeEnum.java
- CrmBaseMapper.java
- LoginUser.java
- SecurityUtils.java
- BaseServiceImpl.java
- IBaseService.java
- AssertUtils.java
- BeanCopyUtils.java
- EnumUtils.java
- ExcelUtil.java
- PageConverter.java
- ServletUtils.java
- TreeUtils.java
文件服务(crm-file)
- 分层职责
- Controller:文件上传、下载、分片初始化、会话管理
- Service:文件API实现、元数据持久化、KKFileView预览链接生成
- Task:定时清理孤儿分片,避免存储膨胀
- 关键流程
- 分片上传:初始化会话 -> 分片上传 -> 合并分片 -> 生成预览链接
- 下载:根据文件ID获取元数据 -> 从对象存储流式下载
- 预览:调用KKFileView生成可预览的URL
sequenceDiagram
participant Client as "客户端"
participant FileCtrl as "文件控制器(FileController)"
participant FileApi as "文件API(FileApiImpl)"
participant FileInfoSvc as "文件信息服务(FileInfoServiceImpl)"
participant MinIO as "对象存储(MinIO)"
participant KK as "在线预览(KKFileView)"
Client->>FileCtrl : "POST /file/init"
FileCtrl->>FileApi : "initUpload()"
FileApi->>FileInfoSvc : "创建上传会话"
FileInfoSvc-->>FileApi : "会话ID"
FileApi-->>FileCtrl : "会话信息"
FileCtrl-->>Client : "返回会话ID"
loop 分片上传
Client->>FileCtrl : "POST /file/upload/{sessionId}/{chunkIndex}"
FileCtrl->>FileApi : "uploadChunk(sessionId, chunk)"
FileApi->>MinIO : "上传分片"
MinIO-->>FileApi : "分片ETag"
FileApi-->>FileCtrl : "分片成功"
FileCtrl-->>Client : "分片成功响应"
end
Client->>FileCtrl : "POST /file/complete/{sessionId}"
FileCtrl->>FileApi : "completeUpload(sessionId)"
FileApi->>MinIO : "合并分片"
FileApi->>FileInfoSvc : "保存文件元数据"
FileApi->>KK : "生成预览链接"
KK-->>FileApi : "预览URL"
FileApi-->>FileCtrl : "文件信息+预览URL"
FileCtrl-->>Client : "上传完成响应"
图表来源
- FileController.java
- FileApiImpl.java
- FileInfoServiceImpl.java
- KkFileViewClient.java
- FileInfo.java
- UploadSession.java
章节来源
- FileController.java
- FileApiImpl.java
- FileInfoServiceImpl.java
- KkFileViewClient.java
- OrphanChunkCleanupTask.java
- FileProperties.java
- MinioConfig.java
- SchedulingConfig.java
- FileConstants.java
- FileInfoDTO.java
- FileDownloadDTO.java
- MultipartInitDTO.java
- UploadSession.java
- FileInfo.java
- FileInfoMapper.java
依赖关系分析
- 模块间依赖
- crm-app依赖crm-auth与crm-file,作为聚合入口
- crm-auth与crm-file均依赖crm-base,复用通用能力
- 运行时依赖
- 数据库:MySQL(通过MyBatis-Plus访问)
- 缓存:Redis(部门树、权限缓存、会话等)
- 对象存储:MinIO(文件分片与合并)
- 在线预览:KKFileView(生成预览链接)
graph LR
APP["crm-app"] --> AUTH["crm-auth"]
APP --> FILE["crm-file"]
AUTH --> BASE["crm-base"]
FILE --> BASE
AUTH --> DB["MySQL"]
AUTH --> REDIS["Redis"]
FILE --> MINIO["MinIO"]
FILE --> REDIS
FILE --> KK["KKFileView"]
图表来源
- CrmAppApplication.java
- AuthApplication.java
- application.yml
- application.yml
章节来源
- CrmAppApplication.java
- AuthApplication.java
- application.yml
- application.yml
性能考虑
- 缓存策略
- 部门树缓存:在认证服务中通过DeptTreeCache减少频繁树构建与数据库压力
- 权限缓存:建议将用户权限集合缓存至Redis,缩短鉴权路径
- 文件会话缓存:上传会话状态可落Redis,提高并发上传稳定性
- 数据访问模式
- MyBatis-Plus分页查询,合理设置分页大小与索引优化
- 批量插入与更新:利用InsertBatchOnDuplicateKeyUpdate提升写入吞吐
- SQL注入器:CrmSqlInjector统一注入公共字段与条件,减少重复代码
- 事务管理
- 跨写操作建议使用声明式事务,确保一致性;读多写少场景可放宽隔离级别
- 外部依赖
- MinIO分片上传与合并需关注网络抖动与重试策略
- KKFileView预览为异步生成,应做好超时与降级处理
[本节为通用指导,不直接分析具体文件]
故障排查指南
- 认证失败
- 检查JWT过滤器是否生效、TokenService是否正确解析与刷新令牌
- 确认用户凭证校验逻辑与第三方登录回调是否正常
- 权限不足
- 检查权限配置与角色菜单关联是否正确
- 查看数据权限注解与拦截器是否注入正确条件
- 文件上传失败
- 核对MinIO配置与分片大小限制
- 检查会话状态与分片合并逻辑
- 查看孤儿分片清理任务是否正常运行
- 统一异常处理
- 全局异常处理器会将业务异常转为统一Result,便于前端定位问题
章节来源
- JwtAuthenticationFilter.java
- TokenService.java
- SecurityExceptionHandlers.java
- GlobalExceptionHandlerAdvice.java
- OrphanChunkCleanupTask.java
结论
本架构以分层清晰、职责明确为核心,通过crm-base提供统一基础能力,crm-auth承担认证与权限中心,crm-file提供文件能力。借助JWT、RBAC与数据权限注解,实现了细粒度的安全控制;通过缓存与MyBatis-Plus扩展提升了性能与开发效率。建议在后续迭代中完善权限缓存、监控告警与链路追踪,进一步提升系统的稳定性与可观测性。
[本节为总结性内容,不直接分析具体文件]
附录
- 安全架构要点
- JWT认证:无状态令牌,服务端校验签名与过期时间
- RBAC权限:用户-角色-菜单模型,支持按钮级权限控制
- 数据权限隔离:基于@DataScope与拦截器动态注入SQL条件,支持多级数据范围
- 部署拓扑建议
- 应用容器化部署,Nginx或API网关做统一入口
- MySQL主从或集群,Redis哨兵或集群,MinIO分布式部署
- KKFileView独立部署,负载均衡与缓存加速
[本节为概念性内容,不直接分析具体文件]