Files
my_site/docs/superpowers/plans/2026-04-11-enterprise-target-refactor-plan.md

584 lines
16 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.
# 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上传与分享收口
- 让上传只产生内容接入结果
- 让分享只依赖逻辑节点授权
- 旧上传和旧分享接口退化为兼容层
这三个批次完成后,整套系统才真正具备继续深度重构的稳定底盘。