kra-oa/docs/audit/structure-optimization-plan.md

5.7 KiB
Raw Blame History

Kra 分层与结构优化计划

1. 目标与约束

本轮优化以现有 Kratos 分层契约为准,不改变 GVA 兼容接口的请求、响应、 事务和错误语义。目标是收紧 DTO/DO/PO 边界、降低单文件职责密度,并删除 确认未接入的代码;不按业务资源重建整套子包,也不创建泛化 utils

结构决策遵循以下规则:

  1. DTO 及 JSON/form/binding tag 只放在 internal/service/dto
  2. DO、usecase、repo interface 和领域上下文保留在 internal/biz
  3. PO、GORM/Casbin/缓存/文件存储等实现保留在 internal/data
  4. HTTP 绑定、路由和中间件保留在 internal/serverDTO -> DO 转换交给 service。
  5. 只有无业务状态、至少有两个稳定消费者的能力才建立专用 internal/<name> 包。
  6. 同包拆文件优先于新建 Go 子包,避免扩大导出面和破坏 Wire/事务协作。

2. 总体结论

静态依赖扫描未发现四层之间的硬性反向 importbiz 不依赖 data/service/server data 不依赖 service/server/DTOservice 不依赖 data/serverserver 不依赖 data。当前架构无需推倒重建重点应放在文件职责和边界收紧。

不建议新增 pkg/utils。现有 pkg/adminauthpkg/logging 已有清晰复用价值; 其他应用专属能力应留在 internal,防止把内部实现误扩成公共 API。

3. 按模块审查与执行计划

模块 当前判断 本轮动作 后续动作
登录与会话 LoginResult 是传输响应,却位于 service 根包 移入 service/dto TokenAuthentication/AuthClaims 仍跨到 middleware待专门设计 service 视图后再收口
用户 handler 构造导出的 service.UserInput,边界不够明确 将输入模型私有化,新增 DTO request 方法 data/user.go 按 read/write/relations 同包拆分
API/Casbin data/api.go 混合目录 CRUD、策略和同步 同包拆为 api.goapi_policy.goapi_sync.go 继续保留 casbin.go 作为共享持久化辅助,不建 data 子包
初始化 DatabaseInit 带 binding tag却位于 service 根包 移入 service/dto 初始化事务和 seed 保持在 data不拆独立 package
路由目录/Swagger 路由分组表由 service 和 server 共同使用 抽到无状态的 internal/routeinfo 后续评估与 operation-audit 路由目录合并,避免一次性大改
字典 handler 直接构造 biz.DictionaryDetailFilter 增加 service request 转换入口 DTO 文件可在自然增长时再按资源拆分
媒体 handler 直接构造 biz.MediaFilter 增加 service request 转换入口 MediaConfig 的 biz 类型暴露可在配置 DTO 整理时一并处理
审计/导出 pageIDsFromQuery 放在 audit.go,但被多个 handler 使用 移到 handler/query.go,删除未引用 queryUintValue 审计错误映射保留在 handler它属于 HTTP 展示语义
权限/组织 data 文件较大,但 PO、事务和权限检查高度协作 本轮保持行为不动 authority.go 同包拆 CRUD/relations/data-scopesystem.go 改为更明确的 identity model/constructor 文件
配置/热更新 compat、merge、store、watch、bootstrap 已形成职责组 保持现状 仅在单文件继续增长时同包拆分,不创建 internal/data/config 子包
系统指标 service 直接调用 gopsutil属于基础设施实现 本轮不动,避免扩大改动面 建立 biz provider interface由 data 实现指标采集service 只转 DTO
定时任务 biz 中存在全局可变 registryworker 负责具体注册 本轮不动 中期改为向 TaskUsecase 注入方法目录;仍不放入 pkg
公共包 pkg/validate 无任何调用,未接入 Gin/Kratos 链路 删除 pkg/validate biz/pagination.go 按仓库分层契约保留,不因当前调用少而删除

4. data 层拆分边界

已执行API/Casbin

  • api.gorepo 构造、PO、转换、API CRUD 与列表。
  • api_policy.go角色关联、授权判断、policy path 查询与替换。
  • api_sync.goignore API 与 API registry 同步。
  • casbin.go:继续保存跨 repo 使用的 Casbin rule 和数据库辅助函数。

这些文件仍为同一个 package dataPO 和事务辅助无需导出。

后续:身份与权限

建议在后续单独变更中完成,避免与接口兼容整改混在一起:

  • user.go 拆为读取/装载、写入、用户关系三个文件;
  • authority.go 拆为角色 CRUD/用户关系和 strict-auth/data-scope
  • system.go 中共享 PO 与 repo 构造器改用能表达 identity 职责的文件名;
  • 不把 user/authority/menu PO 移到公共 model 包。

5. 测试文件处理

本轮不按文件数量删除测试。现有测试主要保护 GVA 兼容语义、事务原子性、 Casbin/数据权限、安全、迁移、路由契约、日志路径和调度器行为,删除收益小于 回归风险。

可以在后续纯测试整理中做两类无损合并:

  • 将少量 service 转换测试合并为按资源命名的 conversion 测试文件;
  • 先用覆盖率确认部门树重复断言,再删除真正被更完整用例覆盖的函数。

transactions_test.gogin_test.go、认证/安全、策略/数据权限、日志文件、 任务执行器和初始化 ignore 测试必须保留。

6. 验收

  1. gofmt 覆盖全部修改的 Go 文件。
  2. go test ./... 使用仓库内可写 GOCACHE 执行。
  3. 结构调整后重新扫描层间 import 和已删除符号引用。
  4. 任何全量测试失败都区分为本轮回归或已有环境/资源清理问题。
  5. 不修改生成文件,不改变 Wire provider、路由数量或外部 JSON 字段。