5.8 KiB
Implementation Plan: 多租户隔离优先 + 契约对齐
Branch: N/A | Date: 2026-01-23 | Spec: docs/review_report.md
Input: 生产评估与当前系统缺口确认
Note: 本计划遵循 docs/templates/plan-template.md。
Summary
本阶段聚焦多租户强隔离、鉴权与权限完善、超管接口补齐,并同步前后端契约(路由前缀、参数命名、ID 类型)以形成最小可运行闭环。
Technical Context
Language/Version: Go 1.22, Node 20+ (Vite), Vue 3
Primary Dependencies: Fiber, GORM-Gen, PrimeVue
Storage: PostgreSQL + Redis
Testing: go test ./..., npm -C frontend/superadmin run build && npm -C frontend/superadmin run lint
Target Platform: Linux server (Docker ready)
Project Type: Web application (backend + frontend)
Performance Goals: N/A (遵循现有服务要求)
Constraints: 多租户隔离、鉴权强制、生成文件不可手改
Scale/Scope: 现有核心业务与超管链路可跑通
Constitution Check
- 必须遵循
backend/llm.txt:DTO 注释、路由规范、服务层约束、生成流程。 *.gen.go、backend/docs/docs.go禁止手改,必须通过atomctl生成。- Controller 仅做绑定与调用,
tenantID/userID从 Controller 传入 Service。
Project Structure
Documentation (this feature)
docs/
├── plan.md
└── templates/
└── plan-template.md
Source Code (repository root)
backend/
├── app/
│ ├── http/
│ ├── middlewares/
│ └── services/
├── database/
└── docs/
frontend/
├── portal/
└── superadmin/
Structure Decision: 采用现有 backend/ + frontend/ 双端结构。
Plan Phases
Phase 1: 影响面确认与现有能力盘点
- 明确
/t/:tenantCode/v1作为统一路由前缀。 - 盘点必须补齐的超管接口与核心业务链路。
Phase 2: 多租户强隔离(后端)
- 新增 tenant 解析中间件,注入
tenantID到上下文。 - 所有业务路由切换为
/t/:tenantCode/v1前缀。 - Service 层所有查询显式带
tenantID条件。
Phase 3: 鉴权与权限(后端)
- 拆分
AuthOptional/AuthRequired。 - 超管路由增加
super_admin角色校验。 - 完成
Super.Login/CheckToken。
Phase 4: 超管接口实现(后端)
- 补齐超管统计、列表、详情接口实现与 DTO 映射。
- 分页接口统一使用
requests.Pager。
Phase 5: 契约对齐(前后端)
- API 前缀与路由基座统一。
- 统一参数命名与 ID 类型。
- 更新前端调用与路由配置。
Phase 6: 生成与回归
atomctl gen route/atomctl gen provider/atomctl swag init。- 关键流程自测与最小回归。
Tasks
Format: [ID] [P?] [Story] Description
Phase 1: Foundational
- T001 [US0] 盘点现有路由与接口空实现(
backend/app/http/*,backend/app/services/*) - T002 [US0] 确认多租户前缀与 tenant 解析策略(
/t/:tenantCode/v1)
Phase 2: User Story 1 - 多租户强隔离 (P1)
Goal: 路由前缀与服务查询强制 tenant 隔离。
- T010 [US1] 新增 tenant 解析中间件(
backend/app/middlewares/tenant_resolver.go) - T011 [US1] 调整 HTTP 模块路由前缀与注解(
backend/app/http/**/routes.manual.go+ controller 注解) - T012 [US1] Controller 中提取
tenantID并显式传入 Service(backend/app/http/**) - T013 [US1] Service 查询统一加
tenantID条件(backend/app/services/*)
Checkpoint: 所有业务路由在 /t/:tenantCode/v1 下可访问,查询带租户隔离。
Phase 3: User Story 2 - 鉴权与权限 (P1)
Goal: 受保护接口强制鉴权,超管角色校验。
- T020 [US2] 拆分并实现
AuthOptional/AuthRequired(backend/app/middlewares/*) - T021 [US2] 超管路由注入角色校验中间件(
backend/app/http/super/v1/routes.manual.go) - T022 [US2] 完成
Super.Login/CheckToken(backend/app/services/super.go)
Checkpoint: 受保护接口必须授权;超管接口角色有效。
Phase 4: User Story 3 - 超管接口补齐 (P1)
Goal: 超管核心页面可用,不再空实现。
- T030 [US3] 统计/列表/详情接口实现与 DTO 映射(
backend/app/services/super.go) - T031 [US3] 统一分页返回
requests.Pager(backend/app/http/super/v1/*)
Checkpoint: 超管关键接口返回有效数据。
Phase 5: User Story 4 - 契约对齐 (P1)
Goal: 前后端路由、参数、ID 类型一致。
- T040 [US4] 统一后端路由前缀与
@Router参数(backend/app/http/**) - T041 [US4] 统一 API 参数命名(后端
@Bind与前端调用匹配) - T042 [US4] ID 类型调整与前端适配(
backend/app/http/**,frontend/portal/*,frontend/superadmin/*)
Checkpoint: 前后端关键链路可跑通。
Phase 6: Generation & Regression
- T050 [US5] 生成路由与 provider(
atomctl gen route,atomctl gen provider) - T051 [US5] 生成 swagger(
atomctl swag init) - T052 [US5] 回归测试(
go test ./...,必要时前端 build/lint)
Dependencies
- Phase 1 → Phase 2 → Phase 3 → Phase 4 → Phase 5 → Phase 6。
- Phase 2 完成后,Phase 3/4 可并行推进,但路由前缀需先统一。
Acceptance Criteria
- 多租户路由与解析生效,查询强制带
tenantID。 - 受保护接口必须鉴权通过;超管接口具备角色校验。
- 超管核心页面可调用对应接口获取数据。
- 前后端接口路径与参数命名一致。
- 生成文件已更新且未手改。
Risks
- 路由前缀变更影响全部前端调用。
- ID 类型调整涉及 DTO/前端展示与校验,需要逐模块推进。
Complexity Tracking
无。