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.
420 lines
29 KiB
420 lines
29 KiB
|
1 month ago
|
# 快速开始
|
||
|
|
|
||
|
|
<cite>
|
||
|
|
**本文引用的文件**
|
||
|
|
- [pom.xml](file://pom.xml)
|
||
|
|
- [crm-app/pom.xml](file://crm-app/pom.xml)
|
||
|
|
- [crm-auth/pom.xml](file://crm-auth/pom.xml)
|
||
|
|
- [crm-base/pom.xml](file://crm-base/pom.xml)
|
||
|
|
- [crm-file/pom.xml](file://crm-file/pom.xml)
|
||
|
|
- [crm-app/src/main/java/com/crm/app/CrmAppApplication.java](file://crm-app/src/main/java/com/crm/app/CrmAppApplication.java)
|
||
|
|
- [crm-app/src/main/resources/application.yml](file://crm-app/src/main/resources/application.yml)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/AuthApplication.java](file://crm-auth/src/main/java/com/crm/auth/AuthApplication.java)
|
||
|
|
- [crm-auth/src/main/resources/application.yml](file://crm-auth/src/main/resources/application.yml)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/RedisConfig.java](file://crm-base/src/main/java/com/crm/base/config/RedisConfig.java)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/JacksonConfig.java](file://crm-base/src/main/java/com/crm/base/config/JacksonConfig.java)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/Knife4jConfig.java](file://crm-base/src/main/java/com/crm/base/config/Knife4jConfig.java)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/CorsConfig.java](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.java](file://crm-base/src/main/java/com/crm/base/config/MetaObjectFillHandler.java)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/CustomIdGenerator.java](file://crm-base/src/main/java/com/crm/base/config/CustomIdGenerator.java)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/InsertBatchOnDuplicateKeyUpdate.java](file://crm-base/src/main/java/com/crm/base/config/InsertBatchOnDuplicateKeyUpdate.java)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/CrmSqlInjector.java](file://crm-base/src/main/java/com/crm/base/config/CrmSqlInjector.java)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/ScheduledTaskProperties.java](file://crm-base/src/main/java/com/crm/base/config/ScheduledTaskProperties.java)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/filter/TraceIdFilter.java](file://crm-base/src/main/java/com/crm/base/filter/TraceIdFilter.java)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/security/DataScopeHelper.java](file://crm-base/src/main/java/com/crm/base/security/DataScopeHelper.java)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/security/LoginUser.java](file://crm-base/src/main/java/com/crm/base/security/LoginUser.java)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/service/impl/BaseServiceImpl.java](file://crm-base/src/main/java/com/crm/base/service/impl/BaseServiceImpl.java)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/mapper/CrmBaseMapper.java](file://crm-base/src/main/java/com/crm/base/mapper/CrmBaseMapper.java)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/config/AuthProperties.java](file://crm-auth/src/main/java/com/crm/auth/config/AuthProperties.java)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java](file://crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/config/PermissionConfig.java](file://crm-auth/src/main/java/com/crm/auth/config/PermissionConfig.java)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/security/TokenService.java](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/controller/AuthController.java](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/service/IAuthService.java](file://crm-auth/src/main/java/com/crm/auth/service/IAuthService.java)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/mapper/AuthUserMapper.java](file://crm-auth/src/main/java/com/crm/auth/mapper/AuthUserMapper.java)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java)
|
||
|
|
- [crm-file/src/main/java/com/crm/file/config/FileProperties.java](file://crm-file/src/main/java/com/crm/file/config/FileProperties.java)
|
||
|
|
- [crm-file/src/main/java/com/crm/file/config/MinioConfig.java](file://crm-file/src/main/java/com/crm/file/config/MinioConfig.java)
|
||
|
|
- [crm-file/src/main/java/com/crm/file/config/SchedulingConfig.java](file://crm-file/src/main/java/com/crm/file/config/SchedulingConfig.java)
|
||
|
|
- [crm-file/src/main/java/com/crm/file/controller/FileController.java](file://crm-file/src/main/java/com/crm/file/controller/FileController.java)
|
||
|
|
- [crm-file/src/main/java/com/crm/file/service/impl/FileApiImpl.java](file://crm-file/src/main/java/com/crm/file/service/impl/FileApiImpl.java)
|
||
|
|
- [crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java](file://crm-file/src/main/java/com/crm/file/task/OrphanChunk清理任务.java)
|
||
|
|
</cite>
|
||
|
|
|
||
|
|
## 目录
|
||
|
|
1. [简介](#简介)
|
||
|
|
2. [项目结构](#项目结构)
|
||
|
|
3. [核心组件](#核心组件)
|
||
|
|
4. [架构总览](#架构总览)
|
||
|
|
5. [详细组件分析](#详细组件分析)
|
||
|
|
6. [依赖分析](#依赖分析)
|
||
|
|
7. [性能考虑](#性能考虑)
|
||
|
|
8. [故障排除指南](#故障排除指南)
|
||
|
|
9. [结论](#结论)
|
||
|
|
10. [附录](#附录)
|
||
|
|
|
||
|
|
## 简介
|
||
|
|
本快速开始指南面向首次接触该 CRM 系统的开发者,目标是帮助你在最短时间内完成环境准备、克隆与构建、配置初始化、数据库初始化与服务启动,并掌握基本开发流程。系统采用多模块 Maven 工程,包含认证授权(crm-auth)、基础能力(crm-base)、文件服务(crm-file)与应用入口(crm-app)。
|
||
|
|
|
||
|
|
## 项目结构
|
||
|
|
- 多模块 Maven 工程,根 pom.xml 聚合各子模块:
|
||
|
|
- crm-app:应用启动入口与全局配置
|
||
|
|
- crm-auth:认证授权、权限控制、用户角色菜单等
|
||
|
|
- crm-base:通用配置、异常处理、安全上下文、工具类、基础实体与 MyBatis-Plus 集成
|
||
|
|
- crm-file:文件上传下载、分片、预览与清理任务
|
||
|
|
- 关键配置文件位于各模块 resources/application.yml;Spring Boot 启动类位于各模块的 Application 类中。
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
graph TB
|
||
|
|
subgraph "Maven 多模块"
|
||
|
|
Root["根 POM"] --> App["crm-app"]
|
||
|
|
Root --> Auth["crm-auth"]
|
||
|
|
Root --> Base["crm-base"]
|
||
|
|
Root --> File["crm-file"]
|
||
|
|
end
|
||
|
|
subgraph "运行时"
|
||
|
|
App --> Auth
|
||
|
|
App --> File
|
||
|
|
Auth --> Base
|
||
|
|
File --> Base
|
||
|
|
end
|
||
|
|
```
|
||
|
|
|
||
|
|
图表来源
|
||
|
|
- [pom.xml:1-200](file://pom.xml#L1-L200)
|
||
|
|
- [crm-app/pom.xml:1-100](file://crm-app/pom.xml#L1-L100)
|
||
|
|
- [crm-auth/pom.xml:1-100](file://crm-auth/pom.xml#L1-L100)
|
||
|
|
- [crm-base/pom.xml:1-100](file://crm-base/pom.xml#L1-L100)
|
||
|
|
- [crm-file/pom.xml:1-100](file://crm-file/pom.xml#L1-L100)
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [pom.xml:1-200](file://pom.xml#L1-L200)
|
||
|
|
|
||
|
|
## 核心组件
|
||
|
|
- 应用入口
|
||
|
|
- CrmAppApplication:Spring Boot 主启动类,负责加载应用配置与模块扫描
|
||
|
|
- 认证授权
|
||
|
|
- SecurityConfig:Spring Security 配置,注册 JWT 过滤器与访问控制规则
|
||
|
|
- JwtAuthenticationFilter:请求级 JWT 校验与上下文注入
|
||
|
|
- TokenService:令牌签发、刷新与解析
|
||
|
|
- DataInitializer:启动时数据初始化(如默认租户、角色、菜单等)
|
||
|
|
- 基础能力
|
||
|
|
- RedisConfig:Redis 连接与序列化配置
|
||
|
|
- MybatisPlusConfig:分页、自动填充、SQL 注入器、雪花 ID 生成器
|
||
|
|
- JacksonConfig:JSON 序列化策略
|
||
|
|
- Knife4jConfig:API 文档与调试界面
|
||
|
|
- CorsConfig:跨域配置
|
||
|
|
- GlobalExceptionHandlerAdvice:统一异常处理
|
||
|
|
- TraceIdFilter:链路追踪 ID 注入
|
||
|
|
- 文件服务
|
||
|
|
- MinioConfig:对象存储客户端配置
|
||
|
|
- FileController:文件上传、下载、分片接口
|
||
|
|
- FileApiImpl:文件业务实现
|
||
|
|
- OrphanChunkCleanupTask:分片残留清理定时任务
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [crm-app/src/main/java/com/crm/app/CrmAppApplication.java:1-200](file://crm-app/src/main/java/com/crm/app/CrmAppApplication.java#L1-L200)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java:1-200](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java#L1-L200)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java#L1-L200)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/security/TokenService.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java#L1-L200)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java:1-200](file://crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/RedisConfig.java:1-200](file://crm-base/src/main/java/com/crm/base/config/RedisConfig.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java:1-200](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/JacksonConfig.java:1-200](file://crm-base/src/main/java/com/crm/base/config/JacksonConfig.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/Knife4jConfig.java:1-200](file://crm-base/src/main/java/com/crm/base/config/Knife4jConfig.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/CorsConfig.java:1-200](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java:1-200](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/filter/TraceIdFilter.java:1-200](file://crm-base/src/main/java/com/crm/base/filter/TraceIdFilter.java#L1-L200)
|
||
|
|
- [crm-file/src/main/java/com/crm/file/config/MinioConfig.java:1-200](file://crm-file/src/main/java/com/crm/file/config/MinioConfig.java#L1-L200)
|
||
|
|
- [crm-file/src/main/java/com/crm/file/controller/FileController.java:1-200](file://crm-file/src/main/java/com/crm/file/controller/FileController.java#L1-L200)
|
||
|
|
- [crm-file/src/main/java/com/crm/file/service/impl/FileApiImpl.java:1-200](file://crm-file/src/main/java/com/crm/file/service/impl/FileApiImpl.java#L1-L200)
|
||
|
|
- [crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java:1-200](file://crm-file/src/main/java/com/crm/file/task/OrphanChunk清理任务.java#L1-L200)
|
||
|
|
|
||
|
|
## 架构总览
|
||
|
|
下图展示了应用启动后,HTTP 请求进入认证过滤器的典型调用链,以及后续的业务服务与数据层交互。
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
sequenceDiagram
|
||
|
|
participant Client as "客户端"
|
||
|
|
participant App as "CrmAppApplication"
|
||
|
|
participant Auth as "AuthController"
|
||
|
|
participant Sec as "JwtAuthenticationFilter"
|
||
|
|
participant Tok as "TokenService"
|
||
|
|
participant Svc as "IAuthService"
|
||
|
|
participant DB as "AuthUserMapper"
|
||
|
|
Client->>App : "启动应用"
|
||
|
|
App-->>Client : "服务就绪"
|
||
|
|
Client->>Sec : "携带JWT访问受保护接口"
|
||
|
|
Sec->>Tok : "解析并校验令牌"
|
||
|
|
Tok-->>Sec : "返回用户上下文"
|
||
|
|
Sec->>Auth : "放行至控制器"
|
||
|
|
Auth->>Svc : "调用认证/鉴权服务"
|
||
|
|
Svc->>DB : "查询用户/权限信息"
|
||
|
|
DB-->>Svc : "返回数据"
|
||
|
|
Svc-->>Auth : "返回结果"
|
||
|
|
Auth-->>Client : "响应数据"
|
||
|
|
```
|
||
|
|
|
||
|
|
图表来源
|
||
|
|
- [crm-app/src/main/java/com/crm/app/CrmAppApplication.java:1-200](file://crm-app/src/main/java/com/crm/app/CrmAppApplication.java#L1-L200)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java#L1-L200)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/security/TokenService.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java#L1-L200)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/controller/AuthController.java:1-200](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java#L1-L200)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/service/IAuthService.java:1-200](file://crm-auth/src/main/java/com/crm/auth/service/IAuthService.java#L1-L200)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/mapper/AuthUserMapper.java:1-200](file://crm-auth/src/main/java/com/crm/auth/mapper/AuthUserMapper.java#L1-L200)
|
||
|
|
|
||
|
|
## 详细组件分析
|
||
|
|
|
||
|
|
### 应用启动与模块装配
|
||
|
|
- 启动类:CrmAppApplication 作为 Spring Boot 入口,加载 application.yml 配置并启用模块包扫描
|
||
|
|
- 全局配置:application.yml 定义端口、日志、外部依赖(数据库、Redis、对象存储等)
|
||
|
|
- 模块装配:通过 Maven 聚合与 Spring 包扫描,将 auth、base、file 模块组件装配到应用上下文
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [crm-app/src/main/java/com/crm/app/CrmAppApplication.java:1-200](file://crm-app/src/main/java/com/crm/app/CrmAppApplication.java#L1-L200)
|
||
|
|
- [crm-app/src/main/resources/application.yml:1-200](file://crm-app/src/main/resources/application.yml#L1-L200)
|
||
|
|
|
||
|
|
### 认证与授权(crm-auth)
|
||
|
|
- 安全配置:SecurityConfig 定义白名单、拦截器与角色权限策略
|
||
|
|
- 认证流程:AuthController 提供登录接口,TokenService 负责令牌签发与校验,JwtAuthenticationFilter 在请求链路中解析令牌并注入上下文
|
||
|
|
- 数据初始化:DataInitializer 在启动时创建默认组织、角色、菜单等基础数据
|
||
|
|
- 权限控制:PermissionConfig 与数据范围(DataScope)配合实现细粒度访问控制
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
flowchart TD
|
||
|
|
Start(["登录请求"]) --> Validate["参数校验"]
|
||
|
|
Validate --> CheckUser["查询用户"]
|
||
|
|
CheckUser --> UserFound{"用户存在?"}
|
||
|
|
UserFound --> |否| Error["返回错误"]
|
||
|
|
UserFound --> |是| VerifyPwd["密码校验"]
|
||
|
|
VerifyPwd --> PwdOk{"密码正确?"}
|
||
|
|
PwdOk --> |否| Error
|
||
|
|
PwdOk --> |是| GenToken["生成JWT令牌"]
|
||
|
|
GenToken --> SaveCache["写入缓存(可选)"]
|
||
|
|
SaveCache --> Return["返回令牌与用户信息"]
|
||
|
|
```
|
||
|
|
|
||
|
|
图表来源
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/controller/AuthController.java:1-200](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java#L1-L200)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/security/TokenService.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java#L1-L200)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java:1-200](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java#L1-L200)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/mapper/AuthUserMapper.java:1-200](file://crm-auth/src/main/java/com/crm/auth/mapper/AuthUserMapper.java#L1-L200)
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java:1-200](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java#L1-L200)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/config/AuthProperties.java:1-200](file://crm-auth/src/main/java/com/crm/auth/config/AuthProperties.java#L1-L200)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java:1-200](file://crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java#L1-L200)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/config/PermissionConfig.java:1-200](file://crm-auth/src/main/java/com/crm/auth/config/PermissionConfig.java#L1-L200)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/JwtAuthenticationFilter.java#L1-L200)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/security/TokenService.java:1-200](file://crm-auth/src/main/java/com/crm/auth/security/TokenService.java#L1-L200)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/controller/AuthController.java:1-200](file://crm-auth/src/main/java/com/crm/auth/controller/AuthController.java#L1-L200)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/service/IAuthService.java:1-200](file://crm-auth/src/main/java/com/crm/auth/service/IAuthService.java#L1-L200)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java:1-200](file://crm-auth/src/main/java/com/crm/auth/service/impl/AuthServiceImpl.java#L1-L200)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/mapper/AuthUserMapper.java:1-200](file://crm-auth/src/main/java/com/crm/auth/mapper/AuthUserMapper.java#L1-L200)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java:1-200](file://crm-auth/src/main/java/com/crm/auth/domain/entity/AuthUser.java#L1-L200)
|
||
|
|
|
||
|
|
### 基础能力(crm-base)
|
||
|
|
- 数据访问:MybatisPlusConfig 配置分页、自动填充、SQL 注入器与自定义 ID 生成器(雪花算法)
|
||
|
|
- 缓存:RedisConfig 配置连接池、序列化策略与过期策略
|
||
|
|
- JSON:JacksonConfig 统一时间格式、空值处理等
|
||
|
|
- API 文档:Knife4jConfig 暴露 Swagger/Knife4j 界面
|
||
|
|
- 跨域:CorsConfig 允许前端跨域访问
|
||
|
|
- 异常:GlobalExceptionHandlerAdvice 统一捕获并返回标准错误码
|
||
|
|
- 追踪:TraceIdFilter 为每个请求注入唯一追踪 ID
|
||
|
|
- 安全上下文:LoginUser、DataScopeHelper 提供当前用户与数据范围能力
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java:1-200](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/RedisConfig.java:1-200](file://crm-base/src/main/java/com/crm/base/config/RedisConfig.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/JacksonConfig.java:1-200](file://crm-base/src/main/java/com/crm/base/config/JacksonConfig.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/Knife4jConfig.java:1-200](file://crm-base/src/main/java/com/crm/base/config/Knife4jConfig.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/CorsConfig.java:1-200](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java:1-200](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/filter/TraceIdFilter.java:1-200](file://crm-base/src/main/java/com/crm/base/filter/TraceIdFilter.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/security/LoginUser.java:1-200](file://crm-base/src/main/java/com/crm/base/security/LoginUser.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/security/DataScopeHelper.java:1-200](file://crm-base/src/main/java/com/crm/base/security/DataScopeHelper.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java:1-200](file://crm-base/src/main/java/com/crm/base/config/SnowflakeIdWorker.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java:1-200](file://crm-base/src/main/java/com/crm/base/config/SnowflakeProperties.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/CustomIdGenerator.java:1-200](file://crm-base/src/main/java/com/crm/base/config/CustomIdGenerator.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/InsertBatchOnDuplicateKeyUpdate.java:1-200](file://crm-base/src/main/java/com/crm/base/config/InsertBatchOnDuplicateKeyUpdate.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/CrmSqlInjector.java:1-200](file://crm-base/src/main/java/com/crm/base/config/CrmSqlInjector.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/ScheduledTaskProperties.java:1-200](file://crm-base/src/main/java/com/crm/base/config/ScheduledTaskProperties.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java:1-200](file://crm-base/src/main/java/com/crm/base/domain/entity/BaseEntity.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/service/impl/BaseServiceImpl.java:1-200](file://crm-base/src/main/java/com/crm/base/service/impl/BaseServiceImpl.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/mapper/CrmBaseMapper.java:1-200](file://crm-base/src/main/java/com/crm/base/mapper/CrmBaseMapper.java#L1-L200)
|
||
|
|
|
||
|
|
### 文件服务(crm-file)
|
||
|
|
- 对象存储:MinioConfig 配置端点、密钥桶名等
|
||
|
|
- 接口:FileController 提供上传、下载、分片断点续传、预览等接口
|
||
|
|
- 业务:FileApiImpl 封装文件元数据管理与分片合并逻辑
|
||
|
|
- 任务:OrphanChunkCleanupTask 定期清理未完成的分片文件
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [crm-file/src/main/java/com/crm/file/config/MinioConfig.java:1-200](file://crm-file/src/main/java/com/crm/file/config/MinioConfig.java#L1-L200)
|
||
|
|
- [crm-file/src/main/java/com/crm/file/controller/FileController.java:1-200](file://crm-file/src/main/java/com/crm/file/controller/FileController.java#L1-L200)
|
||
|
|
- [crm-file/src/main/java/com/crm/file/service/impl/FileApiImpl.java:1-200](file://crm-file/src/main/java/com/crm/file/service/impl/FileApiImpl.java#L1-L200)
|
||
|
|
- [crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java:1-200](file://crm-file/src/main/java/com/crm/file/task/OrphanChunk清理任务.java#L1-L200)
|
||
|
|
- [crm-file/src/main/java/com/crm/file/config/FileProperties.java:1-200](file://crm-file/src/main/java/com/crm/file/config/FileProperties.java#L1-L200)
|
||
|
|
- [crm-file/src/main/java/com/crm/file/config/SchedulingConfig.java:1-200](file://crm-file/src/main/java/com/crm/file/config/SchedulingConfig.java#L1-L200)
|
||
|
|
|
||
|
|
## 依赖分析
|
||
|
|
- Maven 依赖关系
|
||
|
|
- 根 pom.xml 管理版本与聚合模块
|
||
|
|
- crm-app 依赖 crm-auth、crm-file、crm-base
|
||
|
|
- crm-auth 依赖 crm-base
|
||
|
|
- crm-file 依赖 crm-base
|
||
|
|
- 运行时依赖
|
||
|
|
- 数据库:MySQL(通过 MyBatis-Plus)
|
||
|
|
- 缓存:Redis(会话、令牌、字典缓存等)
|
||
|
|
- 对象存储:MinIO(文件存储)
|
||
|
|
- API 文档:Knife4j(Swagger)
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
graph LR
|
||
|
|
App["crm-app"] --> Auth["crm-auth"]
|
||
|
|
App --> File["crm-file"]
|
||
|
|
Auth --> Base["crm-base"]
|
||
|
|
File --> Base
|
||
|
|
Base --> DB["MySQL"]
|
||
|
|
Base --> Redis["Redis"]
|
||
|
|
File --> Minio["MinIO"]
|
||
|
|
```
|
||
|
|
|
||
|
|
图表来源
|
||
|
|
- [pom.xml:1-200](file://pom.xml#L1-L200)
|
||
|
|
- [crm-app/pom.xml:1-100](file://crm-app/pom.xml#L1-L100)
|
||
|
|
- [crm-auth/pom.xml:1-100](file://crm-auth/pom.xml#L1-L100)
|
||
|
|
- [crm-base/pom.xml:1-100](file://crm-base/pom.xml#L1-L100)
|
||
|
|
- [crm-file/pom.xml:1-100](file://crm-file/pom.xml#L1-L100)
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [pom.xml:1-200](file://pom.xml#L1-L200)
|
||
|
|
|
||
|
|
## 性能考虑
|
||
|
|
- 数据库
|
||
|
|
- 使用 MyBatis-Plus 分页插件,避免全表扫描
|
||
|
|
- 合理索引设计,关注高频查询字段
|
||
|
|
- 批量操作使用 InsertBatchOnDuplicateKeyUpdate 提升写入效率
|
||
|
|
- 缓存
|
||
|
|
- 热点数据(如字典、权限树)放入 Redis,降低数据库压力
|
||
|
|
- 设置合理的过期策略与缓存穿透防护
|
||
|
|
- 文件服务
|
||
|
|
- 大文件分片上传,减少内存占用与网络失败影响
|
||
|
|
- 清理任务定期回收未完成分片,释放存储空间
|
||
|
|
- 序列化
|
||
|
|
- Jackson 统一时间与时区处理,避免反序列化开销
|
||
|
|
- 监控与追踪
|
||
|
|
- TraceIdFilter 为全链路添加追踪 ID,便于问题定位
|
||
|
|
|
||
|
|
[本节为通用指导,不直接分析具体文件]
|
||
|
|
|
||
|
|
## 故障排除指南
|
||
|
|
- 启动失败
|
||
|
|
- 检查 JDK 版本是否满足要求(建议 11+),Maven 版本 3.6+
|
||
|
|
- 确认 application.yml 中数据库、Redis、MinIO 地址、账号、密码正确
|
||
|
|
- 查看控制台日志中的 Bean 冲突或包扫描路径错误
|
||
|
|
- 数据库连接失败
|
||
|
|
- 验证 MySQL 服务状态、端口、用户名、密码与字符集
|
||
|
|
- 确保已执行数据库初始化脚本(若项目提供)
|
||
|
|
- 检查防火墙与安全组策略
|
||
|
|
- Redis 连接失败
|
||
|
|
- 检查 Redis 服务状态、端口、密码与网络连通性
|
||
|
|
- 确认 RedisConfig 序列化与超时配置合理
|
||
|
|
- 文件上传失败
|
||
|
|
- 检查 MinIO 服务可达性与桶是否存在
|
||
|
|
- 确认 FileProperties 与 MinioConfig 配置一致
|
||
|
|
- 观察分片清理任务是否正常运行
|
||
|
|
- 权限或登录异常
|
||
|
|
- 确认 DataInitializer 是否成功执行,基础数据是否完整
|
||
|
|
- 检查 JWT 密钥与过期时间配置
|
||
|
|
- 查看 SecurityConfig 白名单与拦截规则是否符合预期
|
||
|
|
- 常见问题排查步骤
|
||
|
|
- 开启 DEBUG 日志,定位具体异常堆栈
|
||
|
|
- 使用 Knife4j 调试接口,验证入参与返回值
|
||
|
|
- 通过 TraceId 在日志系统中检索全链路日志
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java:1-200](file://crm-base/src/main/java/com/crm/base/advice/GlobalExceptionHandlerAdvice.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/filter/TraceIdFilter.java:1-200](file://crm-base/src/main/java/com/crm/base/filter/TraceIdFilter.java#L1-L200)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java:1-200](file://crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java#L1-L200)
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java:1-200](file://crm-auth/src/main/java/com/crm/auth/config/SecurityConfig.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/RedisConfig.java:1-200](file://crm-base/src/main/java/com/crm/base/config/RedisConfig.java#L1-L200)
|
||
|
|
- [crm-file/src/main/java/com/crm/file/config/MinioConfig.java:1-200](file://crm-file/src/main/java/com/crm/file/config/MinioConfig.java#L1-L200)
|
||
|
|
- [crm-file/src/main/java/com/crm/file/task/OrphanChunkCleanupTask.java:1-200](file://crm-file/src/main/java/com/crm/file/task/OrphanChunk清理任务.java#L1-L200)
|
||
|
|
|
||
|
|
## 结论
|
||
|
|
通过以上步骤,你可以在本地快速搭建并运行 CRM 系统。建议在熟悉基础流程后,逐步扩展业务模块,结合 Knife4j 进行接口调试,利用 TraceId 与日志系统进行问题定位,并根据实际场景优化数据库与缓存策略。
|
||
|
|
|
||
|
|
[本节为总结性内容,不直接分析具体文件]
|
||
|
|
|
||
|
|
## 附录
|
||
|
|
|
||
|
|
### 环境要求
|
||
|
|
- JDK:建议使用 11 或以上版本
|
||
|
|
- Maven:3.6 或以上版本
|
||
|
|
- 数据库:MySQL 5.7 或 8.0(根据驱动与方言选择)
|
||
|
|
- 缓存:Redis 5.0 或以上版本
|
||
|
|
- 对象存储:MinIO(用于文件存储)
|
||
|
|
|
||
|
|
[本节为通用指导,不直接分析具体文件]
|
||
|
|
|
||
|
|
### 项目克隆与构建
|
||
|
|
- 克隆仓库到本地
|
||
|
|
- 在根目录执行 Maven 构建命令,编译所有模块
|
||
|
|
- 若遇到依赖下载失败,检查网络与镜像源配置
|
||
|
|
|
||
|
|
[本节为通用指导,不直接分析具体文件]
|
||
|
|
|
||
|
|
### 配置文件设置
|
||
|
|
- 修改各模块 application.yml 中的数据库、Redis、MinIO 等连接信息
|
||
|
|
- 如需调整端口、日志级别、跨域策略,请在对应配置文件中更新
|
||
|
|
- 认证相关参数(如 JWT 密钥、过期时间)在认证模块配置中设置
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [crm-app/src/main/resources/application.yml:1-200](file://crm-app/src/main/resources/application.yml#L1-L200)
|
||
|
|
- [crm-auth/src/main/resources/application.yml:1-200](file://crm-auth/src/main/resources/application.yml#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/RedisConfig.java:1-200](file://crm-base/src/main/java/com/crm/base/config/RedisConfig.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java:1-200](file://crm-base/src/main/java/com/crm/base/config/MybatisPlusConfig.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/JacksonConfig.java:1-200](file://crm-base/src/main/java/com/crm/base/config/JacksonConfig.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/Knife4jConfig.java:1-200](file://crm-base/src/main/java/com/crm/base/config/Knife4jConfig.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/CorsConfig.java:1-200](file://crm-base/src/main/java/com/crm/base/config/CorsConfig.java#L1-L200)
|
||
|
|
- [crm-file/src/main/java/com/crm/file/config/FileProperties.java:1-200](file://crm-file/src/main/java/com/crm/file/config/FileProperties.java#L1-L200)
|
||
|
|
- [crm-file/src/main/java/com/crm/file/config/MinioConfig.java:1-200](file://crm-file/src/main/java/com/crm/file/config/MinioConfig.java#L1-L200)
|
||
|
|
|
||
|
|
### 数据库初始化
|
||
|
|
- 若项目提供 SQL 脚本,请先在 MySQL 中执行以创建表结构与基础数据
|
||
|
|
- 若无脚本,可参考 DataInitializer 的逻辑,在启动时由应用创建必要的基础数据(如角色、菜单、部门等)
|
||
|
|
- 确认数据库字符集与排序规则符合中文支持要求
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java:1-200](file://crm-auth/src/main/java/com/crm/auth/config/DataInitializer.java#L1-L200)
|
||
|
|
|
||
|
|
### 服务启动流程
|
||
|
|
- 启动 crm-app 模块的主类 CrmAppApplication
|
||
|
|
- 应用加载配置并装配各模块组件
|
||
|
|
- 等待数据库、Redis、MinIO 就绪后,服务对外暴露接口
|
||
|
|
- 可通过 Knife4j 页面验证接口可用性
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [crm-app/src/main/java/com/crm/app/CrmAppApplication.java:1-200](file://crm-app/src/main/java/com/crm/app/CrmAppApplication.java#L1-L200)
|
||
|
|
- [crm-app/src/main/resources/application.yml:1-200](file://crm-app/src/main/resources/application.yml#L1-L200)
|
||
|
|
|
||
|
|
### 基本开发工作流程
|
||
|
|
- 新增业务模块:在相应模块下创建 Controller、Service、Mapper 与 Entity
|
||
|
|
- 使用 BaseServiceImpl 与 CrmBaseMapper 简化 CRUD 操作
|
||
|
|
- 通过 Knife4j 调试接口,结合 TraceId 定位问题
|
||
|
|
- 提交前执行单元测试与静态检查,保证代码质量
|
||
|
|
|
||
|
|
章节来源
|
||
|
|
- [crm-base/src/main/java/com/crm/base/service/impl/BaseServiceImpl.java:1-200](file://crm-base/src/main/java/com/crm/base/service/impl/BaseServiceImpl.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/mapper/CrmBaseMapper.java:1-200](file://crm-base/src/main/java/com/crm/base/mapper/CrmBaseMapper.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/config/Knife4jConfig.java:1-200](file://crm-base/src/main/java/com/crm/base/config/Knife4jConfig.java#L1-L200)
|
||
|
|
- [crm-base/src/main/java/com/crm/base/filter/TraceIdFilter.java:1-200](file://crm-base/src/main/java/com/crm/base/filter/TraceIdFilter.java#L1-L200)
|