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