停止追踪specs,docs等目录文件
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -1,244 +0,0 @@
|
||||
# label_backend 标准目录扁平化设计
|
||||
|
||||
**日期**: 2026-04-14
|
||||
**范围**: `label_backend` 主工程 Java 包结构调整
|
||||
**目标**: 将当前按业务域分层的 `com.label.module.*` 结构重组为符合《微服务开发规范文档》的扁平标准目录结构,同时保持现有业务行为不变。
|
||||
|
||||
---
|
||||
|
||||
## 1. 背景与现状
|
||||
|
||||
当前项目主代码位于 `src/main/java/com/label`,整体结构分为两部分:
|
||||
|
||||
- `com.label.common.*`:放置公共能力,如配置、异常、AOP、鉴权、Redis、状态机、存储与 AI 客户端
|
||||
- `com.label.module.*`:按业务域划分的模块目录,如 `user`、`task`、`source`、`annotation`、`export`、`config`、`video`
|
||||
|
||||
现有结构具备一定领域边界,但与《微服务开发规范文档》中规定的标准扁平目录结构不一致。后续如果继续沿用两套组织方式,会增加新代码接入成本,也会让公共能力与业务层级的归属变得不稳定。
|
||||
|
||||
---
|
||||
|
||||
## 2. 设计目标
|
||||
|
||||
本次调整目标如下:
|
||||
|
||||
- 将主代码目录统一调整为规范文档中的扁平结构
|
||||
- 保持包职责清晰,按“层级职责”而不是“业务模块”组织类
|
||||
- 在不改变业务逻辑和接口行为的前提下完成迁移
|
||||
- 规范包归属与少量命名,不引入新的技术分层
|
||||
- 为后续新增功能提供统一、可预测的目录组织方式
|
||||
|
||||
---
|
||||
|
||||
## 3. 明确不做的事情
|
||||
|
||||
为控制改造范围,本次不包含以下内容:
|
||||
|
||||
- 不新增 `service.impl`
|
||||
- 不将 `dto` 拆分为 `request`、`response`、`common`
|
||||
- 不主动修改接口 URL、接口契约或返回结构
|
||||
- 不进行与目录调整无关的业务重构
|
||||
- 不改造数据库结构、SQL 文件或资源文件布局
|
||||
|
||||
---
|
||||
|
||||
## 4. 目标目录结构
|
||||
|
||||
目标结构定义如下:
|
||||
|
||||
```text
|
||||
src/main/java/com/label/
|
||||
├── annotation/
|
||||
├── aspect/
|
||||
├── common/
|
||||
│ ├── ai/
|
||||
│ ├── context/
|
||||
│ ├── exception/
|
||||
│ ├── redis/
|
||||
│ ├── result/
|
||||
│ ├── shiro/
|
||||
│ ├── statemachine/
|
||||
│ └── storage/
|
||||
├── config/
|
||||
├── constant/
|
||||
├── controller/
|
||||
├── dto/
|
||||
├── entity/
|
||||
├── event/
|
||||
├── feign/
|
||||
├── listener/
|
||||
├── mapper/
|
||||
├── scheduled/
|
||||
├── service/
|
||||
├── typehandler/
|
||||
├── util/
|
||||
└── LabelBackendApplication.java
|
||||
```
|
||||
|
||||
说明:
|
||||
|
||||
- `common` 只保留真正跨业务复用的基础能力
|
||||
- `config` 从原 `common.config` 提升到顶层
|
||||
- `annotation` 与 `aspect` 从原 `common.aop` 中拆分
|
||||
- `event` 与 `listener` 分离,避免事件定义与监听逻辑混放
|
||||
- `controller`、`service`、`mapper`、`entity`、`dto` 全部收敛为顶层扁平结构
|
||||
|
||||
---
|
||||
|
||||
## 5. 包迁移规则
|
||||
|
||||
### 5.1 顶层迁移规则
|
||||
|
||||
- `com.label.module.*.controller` -> `com.label.controller`
|
||||
- `com.label.module.*.service` -> `com.label.service`
|
||||
- `com.label.module.*.mapper` -> `com.label.mapper`
|
||||
- `com.label.module.*.entity` -> `com.label.entity`
|
||||
- `com.label.module.*.dto` -> `com.label.dto`
|
||||
- `com.label.module.annotation.event` -> `com.label.event`
|
||||
- 事件监听类 -> `com.label.listener`
|
||||
- `com.label.common.config` -> `com.label.config`
|
||||
- `com.label.common.aop` 中注解类 -> `com.label.annotation`
|
||||
- `com.label.common.aop` 中切面类 -> `com.label.aspect`
|
||||
|
||||
### 5.2 典型映射示例
|
||||
|
||||
- `com.label.module.user.controller.AuthController` -> `com.label.controller.AuthController`
|
||||
- `com.label.module.user.service.UserService` -> `com.label.service.UserService`
|
||||
- `com.label.module.task.mapper.AnnotationTaskMapper` -> `com.label.mapper.AnnotationTaskMapper`
|
||||
- `com.label.module.source.entity.SourceData` -> `com.label.entity.SourceData`
|
||||
- `com.label.module.user.dto.LoginRequest` -> `com.label.dto.LoginRequest`
|
||||
- `com.label.common.aop.OperationLog` -> `com.label.annotation.OperationLog`
|
||||
- `com.label.common.aop.AuditAspect` -> `com.label.aspect.AuditAspect`
|
||||
- `com.label.module.annotation.event.ExtractionApprovedEvent` -> `com.label.event.ExtractionApprovedEvent`
|
||||
- `com.label.module.annotation.service.ExtractionApprovedEventListener` -> `com.label.listener.ExtractionApprovedEventListener`
|
||||
- `com.label.common.config.RedisConfig` -> `com.label.config.RedisConfig`
|
||||
|
||||
### 5.3 命名策略
|
||||
|
||||
- 以“最小必要变更”为原则,优先迁移包路径,不主动重命名类
|
||||
- 仅在类职责与包语义明显不匹配时做必要归位
|
||||
- 现阶段主代码类名不存在重名冲突,因此不需要为扁平化提前引入前缀或后缀
|
||||
|
||||
---
|
||||
|
||||
## 6. 实施顺序
|
||||
|
||||
为降低迁移风险,实际执行采用“目标一次性扁平化,操作分阶段迁移”的方式。
|
||||
|
||||
### 阶段 1:基础公共层归位
|
||||
|
||||
先迁移以下内容,建立新骨架:
|
||||
|
||||
- `annotation`
|
||||
- `aspect`
|
||||
- `config`
|
||||
- `event`
|
||||
- `listener`
|
||||
|
||||
目标是先完成最基础的结构纠偏,并尽早暴露切面、配置和事件扫描问题。
|
||||
|
||||
### 阶段 2:数据承载层迁移
|
||||
|
||||
再迁移下列包:
|
||||
|
||||
- `entity`
|
||||
- `dto`
|
||||
- `mapper`
|
||||
|
||||
这些类依赖通常较窄,适合优先扁平化,也能及早验证 MyBatis 相关扫描与引用是否正常。
|
||||
|
||||
### 阶段 3:业务服务层迁移
|
||||
|
||||
迁移所有业务服务类到 `service`,原则如下:
|
||||
|
||||
- 不新增实现层
|
||||
- 不调整现有业务编排
|
||||
- 只修正导包、注解引用和必要的包路径依赖
|
||||
|
||||
### 阶段 4:控制层迁移
|
||||
|
||||
最后迁移全部控制器到 `controller`。控制层依赖最广,放在后面可以减少中间态反复修改。
|
||||
|
||||
### 阶段 5:启动与扫描校正
|
||||
|
||||
统一检查并修正以下内容:
|
||||
|
||||
- `@MapperScan`
|
||||
- 组件扫描隐式路径
|
||||
- OpenAPI 相关配置
|
||||
- 事件监听与切面装配
|
||||
- 测试代码中的旧包引用
|
||||
|
||||
### 阶段 6:编译与回归验证
|
||||
|
||||
迁移完成后进行全量编译与测试回归,确认结构调整没有引入行为回归。
|
||||
|
||||
---
|
||||
|
||||
## 7. 风险与控制策略
|
||||
|
||||
### 风险 1:导包失效
|
||||
|
||||
大量类迁移后,主代码和测试代码中的 import 会同时失效。
|
||||
|
||||
控制策略:
|
||||
|
||||
- 按阶段迁移并同步修复引用
|
||||
- 每个阶段结束后至少执行一次编译检查
|
||||
|
||||
### 风险 2:Spring 扫描路径异常
|
||||
|
||||
若配置类、切面、监听器或 Mapper 的扫描路径与旧包结构耦合,迁移后可能导致 Bean 缺失。
|
||||
|
||||
控制策略:
|
||||
|
||||
- 显式检查启动类与配置类中的扫描配置
|
||||
- 将路径校正作为独立阶段处理
|
||||
|
||||
### 风险 3:事件监听失效
|
||||
|
||||
监听器从 `service` 拆到 `listener` 后,若注解或组件扫描不正确,会导致事件未被消费。
|
||||
|
||||
控制策略:
|
||||
|
||||
- 迁移时同步校验事件类与监听器依赖关系
|
||||
- 通过现有集成测试覆盖事件链路
|
||||
|
||||
### 风险 4:测试回归失败
|
||||
|
||||
测试代码同样引用旧包名,若只改主代码,会造成测试集整体失效。
|
||||
|
||||
控制策略:
|
||||
|
||||
- 测试代码与主代码同步迁移
|
||||
- 将 `mvn test` 作为最终验收门槛
|
||||
|
||||
---
|
||||
|
||||
## 8. 验收标准
|
||||
|
||||
本次结构调整完成后,应满足以下标准:
|
||||
|
||||
1. `src/main/java/com/label/module` 目录被完全移除
|
||||
2. 主代码包结构符合标准扁平目录规范
|
||||
3. 项目能够成功编译
|
||||
4. 现有测试能够通过,至少覆盖当前可运行的启动测试、单元测试和集成测试
|
||||
5. 调整范围内不存在残留旧包引用
|
||||
|
||||
---
|
||||
|
||||
## 9. 实现原则
|
||||
|
||||
执行本设计时应遵循以下原则:
|
||||
|
||||
- 先保证结构归位,再追求风格统一
|
||||
- 先保证行为不变,再做命名优化
|
||||
- 所有改动以“目录标准化”为中心,不引入额外架构决策
|
||||
- 每次修改都要让工程更接近规范,而不是制造新的混合结构
|
||||
|
||||
---
|
||||
|
||||
## 10. 结论
|
||||
|
||||
本次改造将 `label_backend` 从“按业务域分层 + 公共包混合”的现状,统一整理为规范文档定义的扁平标准目录结构。该调整不会改变系统能力边界,但会显著提升代码组织一致性、后续开发可预测性以及新成员理解成本。
|
||||
|
||||
实施时采用“目标结构一次确定、操作按阶段推进”的方式,以降低大规模包迁移带来的编译与装配风险。
|
||||
Reference in New Issue
Block a user