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