# QuyUn v2 代码审查与优化建议(backend + frontend/portal) > 审查范围:`backend/`、`frontend/portal/`、`specs/`、`docs/`、`frontend/superadmin/SUPERADMIN_PAGES.md`。 ## 一、关键问题(按严重程度) ### P0 / 安全与数据隔离 1) (暂时不需要管,后续统一优化)多租户路由与上下文缺失,无法满足 `/t/:tenant_code/v1` 规范,存在跨租户数据泄漏风险。 - 后端路由基座仍为 `/v1`:`backend/app/http/v1/routes.manual.go`。 - 前端路由与 API 基座未含 tenant_code:`frontend/portal/src/router/index.js`、`frontend/portal/src/utils/request.js`。 - 多数服务查询未强制带 `tenant_id` 条件(仅依赖 query 传参):如 `backend/app/services/content.go`、`backend/app/services/order.go`、`backend/app/services/common.go`。 2) 鉴权为“可选”,导致受保护接口可能被匿名访问;超级管理员接口无角色校验。 - `Auth` 中间件未携带 Authorization 时直接放行:`backend/app/middlewares/middlewares.go`。 - `/super/v1/*` 复用普通 `Auth`,无 `super_admin` 权限检查:`backend/app/http/super/v1/routes.manual.go`。 3) 超级管理员登录与鉴权核心逻辑为空实现,接口可用性与安全性均不足。 - `services.Super.Login / CheckToken` 返回空结构:`backend/app/services/super.go`。 ### P1 / 功能缺失与接口不一致 4) 后端多个关键接口未实现或返回空结果,前端调用会失败或表现异常。 - `services.Order.Status` 返回 `nil`:`backend/app/services/order.go`。 - 超管统计/订单详情/退款等均为空:`backend/app/services/super.go`。 - 超管内容/订单列表 DTO 映射 TODO:`backend/app/services/super.go`。 5) 认证方式与规格偏离:现实现 OTP 登录 + JWT;规格为 WeChat OAuth + Cookie(已经移除,仅使用jwt认证)。 - 认证流程:`backend/app/http/v1/auth/auth.go`、`backend/app/services/user.go`。 - 前端调用 OTP 登录:`frontend/portal/src/api/auth.js`。 6) API 调用参数与后端 `@Bind` 约定不一致,导致请求失效。 - `contentId` 参数期望为 `contentId`,前端用 `content_id`:`frontend/portal/src/api/user.js` ↔ `backend/app/http/v1/user.go`。 ### P2 / 代码规范与可维护性 7) ID 类型全链路使用 `string`,与 DB `BIGINT` 不一致,导致重复转换与潜在路由冲突。 - controller/service/DTO 使用 `string`:`backend/app/http/v1/*`、`backend/app/http/v1/dto/*`、`backend/app/services/*`。 - 路由注解未使用 `:id`:`backend/app/http/**`。 8) DTO 结构缺少字段级中文注释,业务注释大量为英文,违反 `backend/llm.txt` 规范。 - DTO 示例:`backend/app/http/v1/dto/user.go`、`backend/app/http/v1/dto/content.go`。 9) Service 读取 `ctx` 获取用户信息,违反“上下文提取必须在 Controller 层”的规则。 - `services.audit.Log` 直接读 `ctx.Value`:`backend/app/services/audit.go`。 10) 数据库迁移与规格不一致,初始迁移为空,实际表结构仅在 `specs/DB.sql`(此文件仅做迁移参考,根据业务需求进行优化)。 - `backend/database/migrations/20251227112605_init.sql` 为空。 11) N+1 查询与聚合性能风险。 - 订单列表逐条查询租户/内容/订单项:`backend/app/services/order.go`。 - 租户列表逐条统计 followers/contents:`backend/app/services/tenant.go`。 12) 代码残留调试输出。 - `fmt.Printf` 直接打印配置:`backend/app/services/tenant.go`。 ## 二、架构与实现优化建议 ### 1) 多租户“强隔离”落地 - 路由:将 `/v1` 全部改为 `/t/:tenantCode/v1`(注意 `@Router` 的 `:tenantCode` 与 `` 规则)。 - 中间件:新增 `TenantResolver`(解析 tenant_code → tenant_id → ctx locals)。 - 服务层:所有查询必须带 `tenant_id`(禁止依赖 query 传参)。 - 前端:Router base + API base 统一从 URL 中解析 tenant_code。 ### 2) 鉴权与权限体系补全 - 拆分 `AuthOptional` 与 `AuthRequired` 两种中间件,受保护接口必须硬校验。 - 超管接口增加 `super_admin` 角色校验(JWT claims 中带 roles)。 - 完成 `Super.Login` / `CheckToken` 逻辑,支持 token 续期与失效。 ### 3) ID 类型统一(int64 / model 注入) - 统一所有 path/query/body 里的 ID 为 `int64`。 - 控制器签名支持 `@Bind id path` + `int64` 或 `@Bind tenant model(id)` 进行 model 注入。 - swagger `@Router` 必须使用 `:id` / `:tenantID`。 ### 4) 规格一致性修复 (仅使用JWT - 统一认证模型(OTP vs WeChat):要么按规格实现 WeChat OAuth,要么更新规格文档。 - 统一存储方案(OSS + tenant_uuid + md5 命名);当前本地存储仅作开发 fallback。 - 将 `specs/DB.sql` 迁入真实迁移文件并补齐中文字段注释。 ### 5) 性能与稳定性 - 列表场景引入预加载或批量查询,规避 N+1。 - 订单/租户统计使用聚合 SQL 一次性获取。 - 关键写操作增加幂等与重试策略。 ### 6) 规范化与可维护性 - DTO 增加字段级中文注释(含业务语义/约束)。 - Service 层中文注释补齐业务意图与边界条件。 - `Audit` 改为显式传入 operatorID 参数。 ## 三、ID 类型统一与 Model 注入的推荐步骤(遵循 backend/llm.txt) 1) **定义目标规范** - 所有业务 ID 使用 `int64`(JSON 输出为数值)。 - 路由中数字 ID 使用 `:id`。 2) **先改 Controller/DTO** - `backend/app/http/v1/**` 和 `backend/app/http/super/v1/**` 中 path/query 的 `string` 改为 `int64`。 - DTO 中 `ID` 字段统一改为 `int64`;所有 DTO 增加中文字段注释。 - `@Router` 的路径参数补全 `` 约束。 3) **再改 Service** - 将 `id string` 改为 `id int64`,移除 `cast.ToInt64`。 - 依赖 model 的场景改为 `@Bind xxx model(id)` + `*models.Xxx` 直接注入。 4) **同步前端调用** - URL/query 参数统一为 `contentId` / `userId` / `tenantId`(与 `@Bind` 的 key 对齐)。 - 处理 ID 显示与输入时的类型转换(数值 ↔ 字符串)。 5) **生成与验证** - 运行 `atomctl gen route`、`atomctl gen provider`、`atomctl swag init`。 - 回归测试:关键列表、详情、操作接口。 ## 四、建议的修复优先级 1) 多租户路由 + tenant_id 强隔离 2) 超管鉴权/角色校验 + Login/Token 实现 3) ID 类型统一与 `:id` 路由规范 4) 规格一致性(认证/存储/迁移) 5) 性能优化(N+1/聚合)与可维护性补齐