Refactor backend and frontend modules for architecture alignment

This commit is contained in:
yoyuzh
2026-04-12 00:32:21 +08:00
parent f59515f5dd
commit 30a9bbc1e7
253 changed files with 25462 additions and 4786 deletions

View File

@@ -0,0 +1,583 @@
# 2026-04-11 企业级目标架构重构计划
## 1. 计划目标
本计划用于把当前仓库从“围绕现有功能堆叠的全栈实现”重构到 [architecture.md](C:/Users/yoyuz/Documents/code/my_site/docs/architecture.md) 定义的目标态企业架构。
目标不是做一次大爆炸式重写,而是按阶段把当前代码收敛到以下稳定形态:
1. 统一身份与授权模型
2. 工作空间与内容资产彻底分离
3. 分享与快传成为两个独立业务域
4. 上传成为内容接入机制,不再直接等同于文件业务
5. 后台任务成为统一异步处理底座
6. 存储策略成为系统级治理能力
7. 管理端成为治理入口,不再夹杂业务规则事实源
## 2. 当前基线
### 2.1 后端当前包结构
- `auth`
- `files.core`
- `files.upload`
- `files.share`
- `files.search`
- `files.events`
- `files.tasks`
- `files.storage`
- `files.policy`
- `transfer`
- `admin`
- `common`
- `config`
- `api.v2`
### 2.2 前端当前结构
- `pages`
- `admin`
- `lib`
- `components`
- `hooks`
- `mobile-pages`
- `mobile-components`
### 2.3 已完成的重构基础
根据 `memory.md`,以下基础性工作已经完成,可以作为本计划起点:
1. `BackgroundTaskRetryPolicy``BackgroundTaskStateManager``BackgroundTaskStateKeys` 已从 `BackgroundTaskService` 中抽离
2. `UploadPolicyResolver``UploadSessionStateMachine` 已从上传会话主服务中抽离
3. `AuthSessionPolicy` 已从 `AuthService` 中抽离
4. 文件事件链路已拆出:
- `FileEventService`
- `FileEventDispatcher`
- `FileEventPayloadCodec`
5. 自动媒体元数据任务的 `correlationId` 幂等已经具备数据库级唯一约束
这说明当前代码已经有了第一批“规则抽离”的基础,但还没有进入真正的领域边界重组阶段。
## 3. 重构范围
本计划覆盖:
- 后端领域重组
- 后端 API 收口
- 权限模型统一
- 内容资产模型统一
- 管理端权限和设置边界统一
- 前端按业务域重组
本计划不覆盖:
- UI 视觉重设计
- Android 原生壳单独重写
- 全量 API 一次性废弃
- 数据库从零重建
## 4. 目标态模块映射
### 4.1 后端目标模块
目标态后端按业务域划分为:
- `identity-access`
- `workspace`
- `content-asset`
- `sharing`
- `transfer`
- `async-job`
- `storage-governance`
- `operations-admin`
- `common-kernel`
### 4.2 当前到目标的主要映射
| 当前模块 | 目标模块 | 说明 |
| --- | --- | --- |
| `auth` | `identity-access` | 保留认证能力,但要升级成统一账号、会话、角色、授权模型 |
| `files.core` | `workspace` + `content-asset` | 当前最需要拆分的模块 |
| `files.upload` | `content-asset` + `storage-governance` | 上传接入和存储策略不应继续混在文件业务里 |
| `files.share` | `sharing` | 需要收口旧分享与 v2 分享语义 |
| `transfer` | `transfer` | 保留域名,但拆分在线/离线子域和导入边界 |
| `files.tasks` | `async-job` | 升级为统一异步底座 |
| `files.events` | `workspace` + `async-job` 支撑层 | 事件不是独立业务域,应下沉为基础能力 |
| `files.policy` + `files.storage` | `storage-governance` | 统一存储策略、能力、迁移和对象落点 |
| `admin` | `operations-admin` | 从“全能 service”重构成治理入口 |
| `api.v2` | 各域 `api` 层 | 最终应按领域归属,而不是平行于领域存在 |
### 4.3 前端目标模块
目标态前端按业务域收口为:
- `account`
- `workspace`
- `sharing`
- `transfer`
- `admin`
- `common`
当前的 `pages``mobile-pages``lib` 需要逐步按领域拆解,而不是继续按“页面+工具库”累计。
## 5. 重构总策略
### 5.1 先抽规则,再拆边界
先把高价值业务规则从胖 Service 中抽成稳定规则对象,再移动目录和模块边界。
这样可以避免“边拆边改语义”。
### 5.2 先统一模型,再收口接口
先统一后端领域模型,再决定哪些旧接口保留、哪些 v2 接口成为唯一主线。
不要先删接口,再倒逼领域重构。
### 5.3 先后端领域,后前端跟随
这轮重构必须以后端领域边界为主。
前端模块化重组应跟随后端稳定领域,而不是反过来。
### 5.4 每阶段都要可回归验证
每个阶段必须能在当前仓库命令范围内验证:
- `cd backend && mvn test`
- `cd front && npm run lint`
- `cd front && npm run build`
前端当前没有稳定的测试执行链路,因此阶段验收主要依赖类型检查、构建和关键后端回归。
## 6. 阶段计划
## 阶段 0冻结目标语义和兼容边界
### 目标
在开始大规模结构调整前,先冻结必须保持一致的业务语义和兼容边界。
### 产出
1. 唯一的角色模型:`VISITOR / MEMBER / OPERATOR / ADMIN`
2. 唯一的资源模型:`WorkspaceNode``ContentAsset` 分离
3. 唯一的管理权限事实源
4. 分享与快传的边界定义
5. 旧接口与新接口的兼容期说明
### 当前代码关注点
- `auth/*`
- `admin/AdminAccessEvaluator.java`
- `config/SecurityConfig.java`
- `files/core/FileService.java`
- `files/share/ShareV2Service.java`
- `transfer/TransferService.java`
### 必须先确认的决策
1. 是否废弃“管理员用户名白名单决定权限”这条规则
2. 是否保留旧 `/api/files/share-links/**`
3. 是否保留旧 `/api/files/upload/**`
4. `maxDownloads` 是否继续同时约束导入和下载
5. `MODERATOR` 是否升级为 `OPERATOR`,还是直接移除
### 验收标准
- 目标语义形成一份可执行的决策基线
- 所有后续代码改动都不再重新定义这些问题
## 阶段 1统一身份与授权域
### 目标
把当前 `auth + admin 权限入口 + session 规则` 重构为独立的 `identity-access` 域。
### 需要解决的问题
1. `User.role` 与 admin 白名单的双事实源
2. access token 吊销、refresh token 旋转、活跃会话切换分散在不同位置
3. 管理权限和资源权限没有统一授权模型
### 主要动作
1. 引入统一授权上下文
2. 抽出角色判断和资源授权入口
3.`AuthSessionPolicy` 成为唯一会话规则入口
4. 让 admin 鉴权走角色/权限模型,而不是用户名白名单
5.`DevAuthController` 对正式授权模型的影响限制在开发环境边界内
### 涉及文件
- `backend/src/main/java/com/yoyuzh/auth/*`
- `backend/src/main/java/com/yoyuzh/admin/AdminAccessEvaluator.java`
- `backend/src/main/java/com/yoyuzh/config/SecurityConfig.java`
### 阶段结果
- 管理台权限不再依赖用户名硬编码
- 登录态失效和客户端会话规则由统一策略控制
### 验收标准
- 所有受保护接口都能通过统一授权入口判断
- 改密、封禁、重登、刷新不再各写一套会话切换逻辑
- `cd backend && mvn test` 通过
## 阶段 2拆分工作空间域与内容资产域
### 目标
把当前 `files.core` 这个胖模块拆成两个稳定业务域:
- `workspace`
- `content-asset`
### 需要解决的问题
1. `StoredFile` 同时承担路径、逻辑生命周期、物理内容引用
2. `FileBlob` / `FileEntity` / `StoredFile` 三层模型没有清晰主从边界
3. 删除、复制、导入、恢复同时跨逻辑层和物理层
### 目标模型
- `WorkspaceNode` 负责:
- 层级
- 名称
- 所有权
- 回收站生命周期
- `ContentAsset / ContentVersion` 负责:
- 物理对象
- 版本
- 派生资产
- 内容不可变性
### 主要动作
1.`files.core` 划清“逻辑节点操作”和“内容对象操作”
2. 让复制、导入、恢复优先操作逻辑节点绑定,而不是直接操作底层对象
3. 把目录树逻辑从内容对象读写中剥离
4. 让最终清理只依赖内容引用与保留策略
### 涉及文件
- `backend/src/main/java/com/yoyuzh/files/core/*`
- `backend/src/main/java/com/yoyuzh/files/storage/*`
- `backend/src/main/java/com/yoyuzh/files/policy/*`
### 阶段结果
- 路径、目录、回收站归工作空间域
- 内容对象、版本、派生产物归内容资产域
### 验收标准
- 普通文件操作不再直接驱动物理对象行为
- 内容版本成为稳定对象,逻辑节点只是引用它
- `cd backend && mvn test` 通过
## 阶段 3收口上传与存储治理
### 目标
把上传从“文件业务的一部分”收敛为“内容接入机制”,并把存储策略升级为系统级治理域。
### 需要解决的问题
1. 旧上传和 v2 上传双轨并存
2. 上传规则在 `FileService``UploadSessionService` 中重复
3. 上传模式由实现细节驱动,而不是标准化能力模型驱动
### 主要动作
1.`UploadPolicyResolver` 成为唯一上传规则入口
2. 让上传完成只产生 `ContentVersion`
3. 工作空间节点创建放到上传完成后的业务编排层
4. 收口旧 `/api/files/upload/**` 到兼容层,新的正式能力只保留 v2 上传会话
5. 统一 `StoragePolicy`、能力矩阵、对象大小限制和迁移约束
### 涉及文件
- `backend/src/main/java/com/yoyuzh/files/upload/*`
- `backend/src/main/java/com/yoyuzh/files/policy/*`
- `backend/src/main/java/com/yoyuzh/files/storage/*`
- `backend/src/main/java/com/yoyuzh/files/core/FileService.java`
- `backend/src/main/java/com/yoyuzh/api/v2/files/UploadSessionV2Controller.java`
### 阶段结果
- 上传成为统一接入层
- 存储治理成为独立域
### 验收标准
- 上传规则只有一套事实源
- v2 上传成为正式主线
- `cd backend && mvn test` 通过
## 阶段 4收口分享域
### 目标
把分享从当前“旧接口 + v2 接口并存”收敛为统一的 `sharing` 域。
### 需要解决的问题
1. 分享存在旧接口和 v2 接口双轨
2. 分享额度、密码、导入和下载权限没有形成统一策略模型
3. 分享导入逻辑过于依赖底层文件实现
### 主要动作
1. 定义统一的 `ShareGrant` 模型
2. 把分享的访问、下载、导入权限归到同一个策略对象
3. 明确“分享对外公开的是逻辑节点,不是底层内容对象”
4. 旧分享接口保留兼容包装层,内部转发到统一分享域
### 涉及文件
- `backend/src/main/java/com/yoyuzh/files/share/*`
- `backend/src/main/java/com/yoyuzh/api/v2/shares/*`
- `backend/src/main/java/com/yoyuzh/files/core/FileController.java`
- `backend/src/main/java/com/yoyuzh/files/core/FileService.java`
### 阶段结果
- 分享只有一套规则和一套内部模型
### 验收标准
- 分享创建、访问、下载、导入都通过统一服务入口
- 旧接口只剩兼容职责
- `cd backend && mvn test` 通过
## 阶段 5拆分快传域
### 目标
把当前 `transfer` 模块拆成真正的传输域,而不是继续由 `TransferService` 统管在线、离线、上传、导入、容量判断。
### 需要解决的问题
1. 在线快传和离线快传当前共用一个胖 Service
2. 离线快传 ready、上传、容量、导入耦合严重
3. 快传与分享的边界仍然容易混淆
### 主要动作
1. 拆出:
- `OnlineTransferService`
- `OfflineTransferService`
- `OfflineTransferQuotaService`
- `TransferImportService`
2. 在线快传只保留临时连接语义
3. 离线快传只保留临时托管语义
4. 导入动作通过工作空间/内容资产编排层完成
### 涉及文件
- `backend/src/main/java/com/yoyuzh/transfer/*`
- `front/src/lib/transfer.ts`
- `front/src/pages/Transfer.tsx`
### 阶段结果
- 在线和离线快传成为两个清晰子域
- 快传导入不再直接绑死旧文件实现
### 验收标准
- 在线和离线业务规则拆分完成
- 离线容量和 ready 条件成为独立规则入口
- `cd backend && mvn test` 通过
## 阶段 6统一异步任务域
### 目标
把当前 `files.tasks` 从“文件附属模块”升级为平台级 `async-job` 域。
### 需要解决的问题
1. 任务模型仍然偏文件中心
2. 任务状态 JSON 和运行机制还没有完全 typed 化
3. 任务类型与业务域之间的边界仍不清晰
### 主要动作
1. 把任务分成:
- 命令入口
- 执行入口
- 重试策略
- 状态表示
- 幂等入口
2. 用 typed state 逐步替代广泛的 JSON merge
3. 把任务从文件附属实现提升为可服务多个业务域的统一底座
### 涉及文件
- `backend/src/main/java/com/yoyuzh/files/tasks/*`
- `backend/src/main/java/com/yoyuzh/common/broker/*`
- `backend/src/main/java/com/yoyuzh/api/v2/tasks/*`
### 阶段结果
- 异步任务成为独立业务底座
### 验收标准
- 新任务类型不再需要复制粘贴状态处理逻辑
- 任务状态推进和重试规则有唯一实现
- `cd backend && mvn test` 通过
## 阶段 7重构管理域
### 目标
把当前 `admin` 从“聚合各种系统能力的大 Service”重构成真正的 `operations-admin` 治理入口。
### 需要解决的问题
1. 可写设置与运行时快照混在一起
2. 管理能力和业务领域对象之间缺少稳定的边界
3. 权限、审计和治理动作没有形成一致模型
### 主要动作
1. 拆出:
- `AdminConfigSnapshotService`
- `AdminMutableSettingsService`
- `AdminUserGovernanceService`
- `AdminStorageGovernanceService`
- `AdminAuditService`
2. 让管理端只调用各领域的治理接口,而不是直接承载业务规则
3. 把审计作为显式能力引入
### 涉及文件
- `backend/src/main/java/com/yoyuzh/admin/*`
### 阶段结果
- 管理域从“胖 service”变成治理编排层
### 验收标准
- 设置、治理、审计分离
- 管理端不再承担业务事实源
- `cd backend && mvn test` 通过
## 阶段 8前端按业务域重组
### 目标
让前端结构跟随后端领域,而不是继续沿 `pages + lib + mobile-pages` 演进。
### 主要动作
1.`pages``mobile-pages` 按域拆成:
- `account`
- `workspace`
- `sharing`
- `transfer`
- `admin`
- `common`
2.`lib` 中的接口调用和状态逻辑迁移到领域内部
3. 统一桌面端和移动端页面的业务入口,只保留展示层差异
### 涉及文件
- `front/src/pages/*`
- `front/src/mobile-pages/*`
- `front/src/lib/*`
- `front/src/admin/*`
- `front/src/App.tsx`
### 阶段结果
- 前端与后端都围绕同一领域模型组织
### 验收标准
- `cd front && npm run lint` 通过
- `cd front && npm run build` 通过
## 7. 先后顺序与依赖
严格顺序建议如下:
1. 阶段 0冻结语义
2. 阶段 1身份与授权
3. 阶段 2工作空间 / 内容资产拆分
4. 阶段 3上传 / 存储治理收口
5. 阶段 4分享域收口
6. 阶段 5快传域拆分
7. 阶段 6异步任务域统一
8. 阶段 7管理域重构
9. 阶段 8前端域化重组
依赖关系:
- 身份与授权必须先于管理域重构
- 工作空间 / 内容资产拆分必须先于分享和快传彻底收口
- 上传 / 存储治理必须先于内容资产域稳定
- 前端域化必须放在后端领域边界稳定之后
## 8. 每阶段的兼容要求
### 后端兼容要求
- 每个阶段优先保持现有 API 对外行为稳定
- 旧接口可以保留兼容层,但内部必须逐步转发到目标域模型
- 不在同一阶段同时做“领域重组 + 外部 API 大改”
### 数据兼容要求
- 不允许把现有数据迁移风险和领域重构耦合在同一批次
- 引入新模型时,优先通过双写、映射或兼容读过渡
### 前端兼容要求
- 路由和核心页面入口在后端领域稳定前尽量保持
- 先迁移数据访问层,再迁移页面结构
## 9. 验收与验证命令
每个后端阶段完成后至少执行:
```powershell
cd backend
mvn test
```
每个前端阶段完成后至少执行:
```powershell
cd front
npm run lint
npm run build
```
如果阶段只改后端,不额外要求前端构建。
如果阶段只改前端,也应确认依赖的 API 契约没有被破坏。
## 10. 本轮建议先开做的具体批次
如果从当前代码直接开工,建议先做下面三个批次:
### 批次 A身份与授权统一
- 去掉 admin 白名单作为最终权限事实源
- 统一 `AuthSessionPolicy` 的会话失效入口
-`/api/admin/**` 接入统一授权判断
### 批次 B工作空间与内容资产拆分第一刀
- 先在 `files.core` 内部分出“工作空间节点规则”和“内容资产规则”
- 不急着改数据库表名,先改代码归属
### 批次 C上传与分享收口
- 让上传只产生内容接入结果
- 让分享只依赖逻辑节点授权
- 旧上传和旧分享接口退化为兼容层
这三个批次完成后,整套系统才真正具备继续深度重构的稳定底盘。