# 工作日志服务平台 - 后端模块详细设计文档 **版本号**:V1.0 **编写日期**:2026-02-24 **文档状态**:初稿 **适用范围**:后端核心业务模块详细设计 --- ## 1. 文档说明 本文档在总体架构的基础上,对核心业务模块进行更细粒度的设计,包括职责划分、主要流程、类结构与接口协作方式。各模块均遵循《架构设计规范》中关于目录结构、命名规范和分层规则。 ### 1.1 基础模块说明 **当前项目架构**: 本项目采用单体应用架构,所有模块(Controller、Service、DataService、Mapper等)均在同一个应用 `worklog-api` 中。 **基础模块使用规范**: 按照架构设计规范,如果项目抽取公共能力到独立的 `common` 模块或其他基础模块,必须遵循以下规范: 1. **强制要求**:基础模块必须采用 Maven/Gradle 项目依赖方式引入 ```xml com.wjbl.worklog worklog-common ${project.version} ``` 2. **禁止方式**: - ❌ 禁止拷贝代码到项目中 - ❌ 禁止直接引入 JAR 包 3. **优势说明**: - 统一版本管理,避免基础代码不一致 - 便于基础能力的统一升级和维护 - 支持 Maven 的传递依赖管理 --- ## 2. 人员管理模块(User Module) ### 2.1 模块职责 - 维护系统使用者的基础档案(账号、姓名、联系方式、职位等)。 - 提供账号启用/禁用能力,支撑权限控制与登录拦截。 - 为日志模块提供用户基础信息(用于展示、统计等)。 ### 2.2 主要用例 | 用例编号 | 用例名称 | 发起方 | 说明 | |----------|----------|--------|------| | U01 | 查看人员列表 | 管理员 | 按姓名、职位、状态筛选人员列表 | | U02 | 新增人员 | 管理员 | 创建新账号,设置初始密码及角色 | | U03 | 编辑人员 | 管理员/本人 | 管理员可修改全字段,本人可修改联系方式、邮箱、描述 | | U04 | 启用/禁用人员 | 管理员 | 控制账号登录权限 | | U05 | 删除人员 | 管理员 | 建议逻辑删除,保留日志关联 | ### 2.3 分层设计 - **Controller 层**:`UserController` - `/api/v1/user/page`:分页查询人员列表 - `/api/v1/user`:创建人员 - `/api/v1/user/{id}`:修改人员信息 - `/api/v1/user/{id}/status`:启用/禁用人员 - `/api/v1/user/{id}`:删除人员 - **Service 层**:`UserService` / `UserServiceImpl` - 负责业务规则,例如: - 校验账号唯一性 - 控制本人 vs 管理员的可编辑字段 - 调用密码加密组件生成密码摘要 - **DataService 层**:`UserDataService` / `UserDataServiceImpl` - 继承 `IService` 和 `ServiceImpl` - 封装用户的 CRUD 与常用查询(如按状态统计)。 - **Mapper 层**:`UserMapper` - 继承 `BaseMapper`,可定义复杂查询 SQL。 ### 2.4 类与DTO/VO设计 - **实体类**:`User` - 对应表:`sys_user` - 主键:`id`,`String` 类型,存储雪花算法生成的 ID - 字段:`username`、`password`、`name`、`phone`、`email`、`position`、`description`、`status`、`role` 等 - **DTO**: - `UserCreateDTO`:用于新增用户 - `UserUpdateDTO`:用于更新用户可编辑字段 - **VO**: - `UserVO`:用于列表/详情返回,隐藏敏感字段(如密码摘要)。 ### 2.5 关键业务规则 1. **账号唯一性**:`username` 必须全局唯一。 2. **密码存储**:使用 BCrypt 加密,业务层不返回密码明文。 3. **状态控制**:当 `status=0` 时,登录拦截器拒绝所有业务请求。 4. **软删除**:`deleted=1` 时用户不再出现在列表中,但保留日志关联数据。 ### 2.6 重复数据检测 - **唯一性依据**:`username`(登录账号)字段在系统内必须唯一。 - **后端实现约定**: - 数据库层对 `username` 建立唯一索引; - Service 层在创建用户前先查询是否已存在相同 `username`; - 在修改用户时,如修改了 `username`,也需进行相同的唯一性校验; - 若重复,返回 `code = 400`,`message` 类似"账号已存在,请更换后再试"。 --- ## 3. 日志模板管理模块(Template Module) ### 3.1 模块职责 - 管理日志模板的创建、修改、启用/禁用和删除。 - 为日志编写界面提供可选模板列表,提高日志填写效率和一致性。 ### 3.2 主要用例 | 用例编号 | 用例名称 | 发起方 | 说明 | |----------|----------|--------|------| | T01 | 查看模板列表 | 管理员/普通用户 | 管理员查看全部,普通用户仅查看启用模板 | | T02 | 新增模板 | 管理员 | 创建新的日志模板(名称+内容+说明) | | T03 | 编辑模板 | 管理员 | 修改模板内容和说明,新建日志使用最新版本 | | T04 | 启用/禁用模板 | 管理员 | 控制模板在前端是否可选 | | T05 | 删除模板 | 管理员 | 若已被使用,建议仅禁用,不物理删除 | ### 3.3 分层设计 - **Controller 层**:`TemplateController` - `/api/v1/template/list`:按状态查询模板列表 - `/api/v1/template`:创建模板 - `/api/v1/template/{id}`:更新/删除模板(REST 风格拆分接口) - **Service 层**:`TemplateService` / `TemplateServiceImpl` - 业务规则: - 模板名称唯一性校验 - 禁用模板时不影响历史日志展示,仅影响新建时是否可选 - **DataService 层**:`LogTemplateDataService` / `LogTemplateDataServiceImpl` - 继承 `IService`,封装模板数据访问逻辑。 - **Mapper 层**:`LogTemplateMapper` ### 3.4 实体与字段约束 - **实体类**:`LogTemplate` - 对应表:`log_template` - `templateName`:唯一,非空 - `templateContent`:文本型,存储 Markdown 内容 - `instruction`:选填,文本 - `status`:0-禁用,1-启用 ### 3.5 缓存策略 - 启用中的模板列表可缓存到 Redis:`template:enabled:list`,TTL 30分钟。 - 在模板增删改后,主动失效缓存,保持数据一致。 ### 3.6 重复数据检测 - **唯一性依据**:`templateName`(模板名称)在系统内必须唯一。 - **后端实现约定**: - 数据库层对 `template_name` 建立唯一索引; - Service 层在创建模板前校验名称是否已存在; - 在修改模板时,如变更了 `templateName`,也需进行相同的唯一性校验; - 若重复,返回 `code = 400`,`message` 类似"模板名称已存在"。 --- ## 4. 工作日志管理模块(WorkLog Module) ### 4.1 模块职责 - 提供员工日常工作日志的创建、编辑、删除、查看能力。 - 支持按日期范围、关键字等条件查询日志列表。 - 支持与模板的关联使用,保留历史日志内容快照。 ### 4.2 主要用例 | 用例编号 | 用例名称 | 发起方 | 说明 | |----------|----------|--------|------| | L01 | 日志列表查询 | 管理员/普通用户 | 普通用户仅查看本人日志,管理员可查看全部 | | L02 | 新建日志 | 普通用户 | 支持选择模板并编辑内容,限制 2000 汉字 | | L03 | 编辑日志 | 普通用户 | 仅允许修改自己的日志,规则可配置(如只允许当日) | | L04 | 删除日志 | 普通用户/管理员 | 普通用户删除自己的日志,管理员可删除任意日志 | | L05 | 查看日志详情 | 管理员/普通用户 | 渲染 Markdown 内容,展示模板名称 | ### 4.3 分层设计 - **Controller 层**:`LogController` - `/api/v1/log/page`:分页查询日志 - `/api/v1/log`:创建日志 - `/api/v1/log/{id}`:查看、更新、删除日志 - **Service 层**:`LogService` / `LogServiceImpl` - 负责业务规则: - 校验操作人是否为日志所有者(或管理员) - 校验字数限制(<= 2000 汉字) - 控制可编辑时间范围(如仅当日或未锁定日志) - **DataService 层**:`WorkLogDataService` / `WorkLogDataServiceImpl` - 提供按用户、日期范围、关键字等条件的封装查询方法。 - **Mapper 层**:`WorkLogMapper` ### 4.4 字段与约束 - `logDate`:日期字段,允许补填过去日期 - `recordTime`:日志记录时间,必须为服务器当前时间 - `content`:文本字段,业务上限制为 2000 汉字(前后端双重校验) - `templateId`:可空,引用 `log_template.id` ### 4.5 日志编写流程概述 1. 用户发起"新建日志"请求,前端可选模板(可选)。 2. 前端加载模板内容填入编辑器,用户编辑并提交。 3. 后端校验:登录态、字数限制、日期格式等。 4. 持久化日志数据,记录 `recordTime` 为当前服务器时间。 5. 返回成功结果,前端跳转至列表或详情页。 ### 4.6 重复数据检测 - **当前版本说明**:不对日志内容或日期做"重复日志"判定; - 允许同一用户在同一天写多条日志; - 如后续需要增加"同一天仅一条日志"或"内容完全相同视为重复"的规则,将在 PRD/SRS 中补充后,再同步更新本设计。 --- ## 5. 认证与授权模块(Auth Module) ### 5.1 模块职责 - 提供用户登录、登出能力,并下发/校验 Token。 - 对业务接口进行权限拦截,确保普通用户与管理员权限边界清晰。 ### 5.2 组件设计 - `AuthController`:登录/登出接口 - `TokenService`: - 生成 Token(UUID) - 存储 Token 到 Redis - 解析 Token 并还原用户上下文 - `AuthFilter` / `AuthInterceptor`: - 拦截所有受保护的 `/api/v1/**` 请求 - 从 `Authorization: Bearer {token}` 中读取 Token - 校验 Token 是否存在、是否过期 - 将用户信息放入上下文(如 `UserContextHolder`) ### 5.3 登录流程 1. 用户调用 `/api/v1/auth/login`,提交账号与密码。 2. 系统根据用户名查询用户记录,验证状态是否启用。 3. 使用 BCrypt 对比密码。 4. 生成 Token,写入 Redis:`auth:token:{token}`。 5. 返回 Token 和用户基础信息。 ### 5.4 授权规则 - 普通用户只能操作自己的日志和个人信息。 - 管理员可操作所有用户和日志、模板。 - 授权逻辑在 Service 层统一校验(如检查当前用户角色和操作对象归属)。 ### 5.5 Token 存储结构 ```java // Token 存储结构 Key: auth:token:{token} Value: { "userId": "string", "username": "string", "role": "USER|ADMIN", "expireTime": timestamp } TTL: 24小时 ``` --- ## 6. 公共组件模块(Common Module) ### 6.1 统一返回结构 - `Result`:统一接口返回格式,包含:`code`、`message`、`data`、`success`。 - `PageResult`:分页返回结构,包含:`pageNum`、`pageSize`、`total`、`list`。 **Result 示例**: ```json { "code": 200, "message": "success", "data": { ... }, "success": true } ``` **PageResult 示例**: ```json { "code": 200, "message": "success", "data": { "pageNum": 1, "pageSize": 10, "total": 100, "list": [ ... ] }, "success": true } ``` ### 6.2 异常处理 - `BusinessException`:用于表达可预期的业务错误。 - `GlobalExceptionHandler`: - 捕获 `BusinessException`,返回明确的业务错误码与提示文案。 - 捕获全局 `Exception`,记录错误日志并返回通用错误信息。 **异常处理流程**: ```java @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(BusinessException.class) public Result handleBusinessException(BusinessException e) { return Result.error(e.getCode(), e.getMessage()); } @ExceptionHandler(Exception.class) public Result handleException(Exception e) { log.error("系统异常", e); return Result.error(500, "系统异常,请稍后重试"); } } ``` ### 6.3 AOP 日志 - 通过 AOP 切面统一记录 API 请求日志(方法、参数、耗时、结果)。 - 日志输出到 `aop.log` 或通过 MDC 注入到统一日志格式中。 - **所有日志必须包含 traceId 和 spanId**,便于进行日志跟踪。 **日志格式**: ```text %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n ``` **日志示例**: ```text 2026-02-24 10:15:30.123 [http-nio-8080-exec-1] [a1b2c3d4...][1234abcd] INFO c.c.w.controller.LogController - 创建日志成功 ``` --- ## 7. 附录 ### 7.1 相关文档 - [架构设计文档](./架构设计文档.md) - [前端详细设计文档](./前端详细设计文档.md) - [架构设计规范](./规范/架构设计规范.md) - [产品需求文档 PRD](./产品需求文档PRD.md) - [需求规格说明书 SRS](./需求规格说明书SRS.md) ### 7.2 目录结构参考 ```text worklog-api/ ├── src/main/java/com/company/worklog/ │ ├── controller/ # 控制器层 │ │ ├── UserController.java │ │ ├── LogController.java │ │ └── TemplateController.java │ ├── service/ # 业务服务层 │ │ ├── UserService.java │ │ ├── LogService.java │ │ ├── TemplateService.java │ │ └── impl/ │ ├── data/ # 数据访问层 │ │ ├── entity/ │ │ ├── mapper/ │ │ └── service/ # DataService层 │ │ ├── UserDataService.java │ │ ├── WorkLogDataService.java │ │ └── LogTemplateDataService.java │ ├── dto/ # 数据传输对象 │ ├── vo/ # 视图对象 │ └── common/ # 公共类 │ ├── Result.java │ ├── PageResult.java │ └── exception/ ``` --- **文档审批** | 角色 | 姓名 | 签字 | 日期 | |------|------|------|------| | 架构师 | ______ | ______ | ______ | | 技术负责人 | ______ | ______ | ______ | **变更记录** | 版本 | 日期 | 变更内容 | 变更人 | |------|------|----------|--------| | V1.0 | 2026-02-24 | 从架构设计文档中独立模块详细设计 | ______ |