Files
label_backend/docs/superpowers/specs/2026-04-14-label-backend-directory-flattening-design.md

245 lines
7.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 会同时失效。
控制策略:
- 按阶段迁移并同步修复引用
- 每个阶段结束后至少执行一次编译检查
### 风险 2Spring 扫描路径异常
若配置类、切面、监听器或 Mapper 的扫描路径与旧包结构耦合,迁移后可能导致 Bean 缺失。
控制策略:
- 显式检查启动类与配置类中的扫描配置
- 将路径校正作为独立阶段处理
### 风险 3事件监听失效
监听器从 `service` 拆到 `listener` 后,若注解或组件扫描不正确,会导致事件未被消费。
控制策略:
- 迁移时同步校验事件类与监听器依赖关系
- 通过现有集成测试覆盖事件链路
### 风险 4测试回归失败
测试代码同样引用旧包名,若只改主代码,会造成测试集整体失效。
控制策略:
- 测试代码与主代码同步迁移
-`mvn test` 作为最终验收门槛
---
## 8. 验收标准
本次结构调整完成后,应满足以下标准:
1. `src/main/java/com/label/module` 目录被完全移除
2. 主代码包结构符合标准扁平目录规范
3. 项目能够成功编译
4. 现有测试能够通过,至少覆盖当前可运行的启动测试、单元测试和集成测试
5. 调整范围内不存在残留旧包引用
---
## 9. 实现原则
执行本设计时应遵循以下原则:
- 先保证结构归位,再追求风格统一
- 先保证行为不变,再做命名优化
- 所有改动以“目录标准化”为中心,不引入额外架构决策
- 每次修改都要让工程更接近规范,而不是制造新的混合结构
---
## 10. 结论
本次改造将 `label_backend` 从“按业务域分层 + 公共包混合”的现状,统一整理为规范文档定义的扁平标准目录结构。该调整不会改变系统能力边界,但会显著提升代码组织一致性、后续开发可预测性以及新成员理解成本。
实施时采用“目标结构一次确定、操作按阶段推进”的方式,以降低大规模包迁移带来的编译与装配风险。