refactor: 彻底移除 Sora 视频生成模块(全栈清理)
## 后端变更 - 删除 21 个 sora_*.go 服务文件(service/handler/repository/routes) - 删除 Sora 相关 migration 文件(046/047/063/090) - 清理 config 中的 sora_* 配置项和平台常量 - 清理 wire 依赖注入中的 Sora 组件 - 修复 wire_gen.go 语法错误(缺少逗号和闭合括号) - 移除 go.mod 中的 go-sora2api 依赖 - 更新 ent schema usage_log.go 注释 ## 前端变更 - 删除 SoraView、SoraAdminView 及 8 个 Sora 子组件 - 删除 sora API 层和路由配置 - 清理 UserEditModal 中的 Sora 存储配额 UI - 清理 types/index.ts 中 Sora 相关类型定义 - 清理 stores/app.ts 默认配置 - 清理 i18n 翻译文件 en.ts/zh.ts (~110 行) - 更新相关测试文件 ## 文档更新 - README.md / README_CN.md / README_JA.md: 移除 Sora 状态说明和配置段落 - PROJECT_DIFF.md: 移除 Sora 相关差异描述 ## 验证结果 - ✅ Go 编译通过 (go build ./...) - ✅ TypeScript 类型检查通过 (vue-tsc --noEmit) - ✅ 后端测试全通过 (0 failures) - ✅ 前端测试全通过 (59 files, 329 tests, 0 failures) - ✅ 前端生产构建成功 (23.81s)
This commit is contained in:
188
review_tmp/architecture_review_report.md
Normal file
188
review_tmp/architecture_review_report.md
Normal file
@@ -0,0 +1,188 @@
|
||||
# Sub2API 架构评审报告
|
||||
|
||||
**评审人**: 高见远(架构师)
|
||||
**评审日期**: 2026-05-08
|
||||
**工作目录**: `d:/project/sub2api-merge`
|
||||
**评审范围**: 模型支持链路、新增模块代码质量、安全审计、合并一致性、上线风险评估
|
||||
|
||||
---
|
||||
|
||||
## 一、模型支持矩阵
|
||||
|
||||
| 模型/平台 | 端点 | 路由文件 | 转发服务 | 账号选择器 | 粘性会话 | 模型映射 | 状态 |
|
||||
|-----------|------|----------|----------|------------|----------|----------|------|
|
||||
| **Claude (Anthropic)** | `/v1/messages` | `routes/gateway.go:44` | `GatewayService.Messages` | `SelectAccountWithLoadAwareness` | Redis (`sessionHash`+`groupID`) | 账号级 `model_mapping` + 通配符 | 正常 |
|
||||
| **Claude (Anthropic)** | `/v1/messages/count_tokens` | `routes/gateway.go:52` | `GatewayService.CountTokens` | 同上 | 同上 | 同上 | 正常 |
|
||||
| **Claude (Anthropic)** | `/v1/models` | `routes/gateway.go:65` | `GatewayService.Models` | N/A | N/A | 缓存 15s | 正常 |
|
||||
| **OpenAI GPT/Codex** | `/v1/chat/completions` | `routes/gateway.go:84` | `OpenAIGatewayService.ChatCompletions` | `OpenAIGatewayService.selectAccount` | Redis (`openai:`+`sessionHash`) | `resolveOpenAIForwardModel` | 正常 |
|
||||
| **OpenAI GPT/Codex** | `/v1/responses` | `routes/gateway.go:68` | `OpenAIGatewayService.Responses` | 同上 | 同上 | `codexModelMap` 硬编码映射 | 正常 |
|
||||
| **OpenAI GPT/Codex** | `/responses` (无v1) | `routes/gateway.go:116` | `OpenAIGatewayService.Responses` | 同上 | 同上 | 同上 | 正常 |
|
||||
| **Gemini (Google)** | `/v1beta/models/*` | `routes/gateway.go:102` | `GeminiMessagesCompatService` | `SelectAccountWithLoadAwareness` | Redis (`gemini:`+`sessionHash`) | 账号级映射 | 正常 |
|
||||
| **Gemini (Google)** | `/v1beta/models/:model` | `routes/gateway.go:103` | `GeminiV1BetaGetModel` | N/A | N/A | fallback list | 正常 |
|
||||
| **Antigravity** | `/antigravity/v1/messages` | `routes/gateway.go:141` | `GatewayService.Messages` | `SelectAccountWithLoadAwareness` | 同上 | `DefaultAntigravityModelMapping` | 正常 |
|
||||
| **Antigravity** | `/antigravity/v1beta/models/*` | `routes/gateway.go:156` | `GeminiV1BetaModels` | 同上 | 同上 | 同上 | 正常 |
|
||||
| **Antigravity** | `/antigravity/models` | `routes/gateway.go:129` | `GatewayService.AntigravityModels` | N/A | N/A | 动态 fetch | 正常 |
|
||||
| **Sora** | `/v1/sora/*` | `routes/sora_client.go` | `SoraGatewayService` | `SoraAccountService` | N/A | N/A | 正常 |
|
||||
|
||||
### 关键发现
|
||||
- **Claude 4.6 模型已支持**:`pkg/claude/constants.go:81` 已新增 `claude-opus-4-6` 和 `claude-sonnet-4-6`。
|
||||
- **Codex 映射完整**:`service/openai_codex_transform.go:8` 的 `codexModelMap` 覆盖 `gpt-5.3-codex` 全系,包含 `spark` 变体。
|
||||
- **Antigravity 默认映射完整**:`domain/constants.go:73` 的 `DefaultAntigravityModelMapping` 覆盖 Claude 和 Gemini 白名单,并自动透传 `gemini-3-flash`、`gemini-3.1-pro-high/low`。
|
||||
- **Sticky Session 双写兼容**:OpenAI 粘性会话同时写入新格式 (`xxhash`) 和旧格式 (`sha256`),避免升级后会话丢失。
|
||||
- **平台隔离正确**:`/antigravity/*` 路由强制使用 `middleware.ForcePlatform(PlatformAntigravity)`,不会混入其他平台账号。
|
||||
|
||||
---
|
||||
|
||||
## 二、阻塞问题清单(必须修复才能上线)
|
||||
|
||||
### 🔴 B1. 前端国际化翻译缺失 — 影响所有新管理页面
|
||||
|
||||
**位置**: `frontend/src/i18n/locales/zh.ts`, `en.ts`
|
||||
**问题**: 运维监控 (`admin.ops.*`) 和 Sora 管理 (`admin.sora.*`) 的翻译键在前端 Vue 组件中被大量使用,但**完全不存在**于 zh.ts 和 en.ts 中。用户访问 `/admin/ops` 和 `/admin/sora` 时,页面将显示原始键名或空白文本。
|
||||
|
||||
**证据**:
|
||||
```bash
|
||||
# 组件大量使用 admin.ops 键
|
||||
grep -rn "t('admin.ops" frontend/src/views/admin/ops/ | wc -l # > 200 处
|
||||
|
||||
# 但翻译文件中完全没有
|
||||
grep "admin.ops" frontend/src/i18n/locales/zh.ts # 无输出
|
||||
grep "admin.sora" frontend/src/i18n/locales/zh.ts # 无输出
|
||||
```
|
||||
|
||||
**建议**: 立即补全 `admin.ops.*`、`admin.sora.*` 的中英文翻译。data-management 路由已废弃(`deprecatedAdminFeatures.spec.ts`),无需补全。
|
||||
|
||||
### 🔴 B2. 批量修改账号存在跨平台模型映射覆盖风险(DEV_GUIDE.md 坑点 #10)
|
||||
|
||||
**位置**: `backend/internal/service/admin_service.go:1726` (`BulkUpdateAccounts`)
|
||||
**问题**: 批量更新接口的 `Credentials` 字段会**直接合并**到所有选中账号的 credentials JSONB 中。如果批量选中了 OpenAI + Antigravity 账号,并传入包含 `model_mapping` 的 Credentials,将导致所有账号的映射被统一覆盖。
|
||||
|
||||
**代码**:
|
||||
```go
|
||||
repoUpdates := AccountBulkUpdate{
|
||||
Credentials: input.Credentials, // 直接合并,无平台过滤
|
||||
Extra: input.Extra,
|
||||
}
|
||||
```
|
||||
|
||||
当前代码仅有**混合渠道检查**(`checkMixedChannelRisk`),但**未对 `model_mapping` 内容进行平台隔离校验**。这与 DEV_GUIDE.md 坑点 #10 描述的现象完全吻合。
|
||||
|
||||
**建议**: 在 `BulkUpdateAccounts` 中,当 `input.Credentials` 包含 `model_mapping` 且选中账号跨平台时,拒绝操作或按平台分组执行。
|
||||
|
||||
---
|
||||
|
||||
## 三、高风险问题清单(强烈建议修复)
|
||||
|
||||
### 🟡 H1. JWT Secret 强度校验过于宽松
|
||||
|
||||
**位置**: `backend/internal/config/config_helpers.go:28`
|
||||
**问题**: `isWeakJWTSecret` 仅检查 8 个硬编码弱密码(如 `secret`、`password`、`123456`)。一个 32 位全 `a` 字符串(`aaaaaaaa...`)会通过校验,但熵为 0,极易被暴力破解。
|
||||
|
||||
**建议**: 增加最小长度校验(>=32 字符)和字符多样性校验(至少包含大写、小写、数字中的两种)。
|
||||
|
||||
### 🟡 H2. Sora S3 存储存在 SSRF 风险(上游 URL 未校验)
|
||||
|
||||
**位置**: `backend/internal/service/sora_s3_storage.go:216` (`UploadFromURL`)
|
||||
**问题**: 该方法从 `sourceURL` 下载文件并上传到 S3。`sourceURL` 来自上游 Sora API 的响应,但**未经过 URL Allowlist 校验**。如果上游被劫持或返回内网地址,可能导致 SSRF。
|
||||
|
||||
**建议**: 在 `http.NewRequestWithContext` 之前,使用 `urlvalidator` 或 `config.Security.URLAllowlist` 对 `sourceURL` 进行校验,禁止内网 IP 和非 https 协议。
|
||||
|
||||
### 🟡 H3. 前端 `confirm()` 调用(DEV_GUIDE.md 坑点 #10 提及)
|
||||
|
||||
**位置**: `frontend/src/views/admin/SoraAdminView.vue:100`
|
||||
**问题**: 使用原生 `confirm()` 弹窗,与整体 UI 风格不一致,且无法国际化。
|
||||
|
||||
**建议**: 替换为项目内置的 `ConfirmDialog` 组件。
|
||||
|
||||
### 🟡 H4. `/admin/data-management` 路由已废弃但后端测试仍存在
|
||||
|
||||
**位置**: `backend/internal/server/routes/admin_routes_test.go:42`
|
||||
**问题**: 前端路由测试(`deprecatedAdminFeatures.spec.ts`)明确断言 `/admin/data-management` 路由不存在,但后端路由测试仍引用该路径。虽然主路由文件 `admin.go` 中确实已移除,但测试残留说明清理不彻底。
|
||||
|
||||
**建议**: 清理后端 `admin_routes_test.go` 中的废弃路径引用,避免测试误导。
|
||||
|
||||
---
|
||||
|
||||
## 四、代码质量评分
|
||||
|
||||
| 模块 | 评分 | 说明 |
|
||||
|------|------|------|
|
||||
| `backend/internal/prommetrics/` | 9/10 | 结构清晰,独立包避免循环依赖,指标命名规范。建议补充 `metrics_test.go` 的覆盖率。 |
|
||||
| `backend/internal/service/ops_*.go` | 8/10 | 错误处理完善(fail-open 不阻塞网关),批量插入有 fallback,内存限制合理。部分函数过长(>200 行)。 |
|
||||
| `backend/internal/service/sora_*.go` | 7/10 | 流式上传、panic recovery、S3 客户端缓存均正确。SSRF 风险扣 2 分;`DeleteObjects` 未使用 S3 BatchDelete API 扣 1 分。 |
|
||||
| `backend/internal/handler/admin/` | 8/10 | 路由注册完整,handler 职责分离清晰。部分 handler 缺少边界值校验(如 `pageSize > 100` 仅在部分接口实现)。 |
|
||||
| `frontend/src/views/admin/ops/` | 6/10 | 组件拆分合理,但**i18n 翻译完全缺失**,导致上线后用户可见部分不可用。扣 4 分。 |
|
||||
| `backend/internal/server/routes/` | 9/10 | 路由注册完整,无合并冲突标记。中间件顺序正确(auth -> platform -> handler)。 |
|
||||
| `backend/internal/service/wire.go` | 9/10 | 新增 Sora、Ops 服务均已正确注入 `ProviderSet`。依赖关系无循环。 |
|
||||
|
||||
---
|
||||
|
||||
## 五、合并一致性检查
|
||||
|
||||
| 检查项 | 结果 | 说明 |
|
||||
|--------|------|------|
|
||||
| Go 文件合并冲突标记 | 通过 | `grep '<<<<<<<'` 仅命中注释分隔符,无实际冲突 |
|
||||
| 后端路由注册 | 通过 | `admin.go` 中 `registerSoraRoutes`、`registerOpsRoutes` 均已注册 |
|
||||
| 前端路由注册 | 部分通过 | `/admin/ops`、`/admin/sora` 已注册;`/admin/data-management` 已按预期废弃 |
|
||||
| 国际化翻译 | **不通过** | `zh.ts` / `en.ts` 缺少 `admin.ops.*`、`admin.sora.*` 键 |
|
||||
| Wire 依赖注入 | 通过 | `wire.go` 中 Sora 和 Ops 服务均已注入 |
|
||||
| 健康检查端点 | 通过 | `/health`、`/ready`、`/live`、`/metrics` 均已在 `common.go` 注册 |
|
||||
| Prometheus 指标暴露 | 通过 | `/metrics` 使用 `prommetrics.Registry`,指标定义完整 |
|
||||
|
||||
---
|
||||
|
||||
## 六、安全审计摘要
|
||||
|
||||
| 风险点 | 严重程度 | 状态 | 说明 |
|
||||
|--------|----------|------|------|
|
||||
| SQL 注入(ORDER BY) | 低 | 安全 | `channel_repo.go:249` 使用白名单模式,有安全回退 |
|
||||
| SQL 注入(动态 SQL) | 低 | 安全 | 所有 `ops_repo*.go` 使用参数化查询 |
|
||||
| JWT Secret 管理 | 中 | 需改进 | 弱密码校验列表太短,未校验熵 |
|
||||
| CORS 配置 | 低 | 安全 | 配置化,默认不允许任意 origin |
|
||||
| URL Allowlist | 低 | 安全 | 可关闭,但关闭时日志告警 |
|
||||
| 文件上传/SSRF | 中 | 需改进 | `sora_s3_storage.go:216` 未校验 sourceURL |
|
||||
| 批量更新跨平台覆盖 | 高 | **阻塞** | `BulkUpdateAccounts` 的 Credentials 合并无平台隔离 |
|
||||
|
||||
---
|
||||
|
||||
## 七、上线建议
|
||||
|
||||
### 综合结论: **CONDITIONAL(有条件上线)**
|
||||
|
||||
必须在修复以下阻塞项后方可上线:
|
||||
|
||||
1. **补全前端 i18n 翻译**(`admin.ops.*`、`admin.sora.*` 中英文)
|
||||
2. **批量更新增加 model_mapping 跨平台保护**(或禁止批量修改跨平台账号的 Credentials)
|
||||
|
||||
### 上线前检查清单
|
||||
|
||||
- [ ] 补全 `frontend/src/i18n/locales/zh.ts` 中 `admin.ops`、`admin.sora` 翻译键
|
||||
- [ ] 补全 `frontend/src/i18n/locales/en.ts` 中 `admin.ops`、`admin.sora` 翻译键
|
||||
- [ ] 修复 `BulkUpdateAccounts` 跨平台 model_mapping 覆盖风险
|
||||
- [ ] 为 `sora_s3_storage.UploadFromURL` 增加 URL 校验
|
||||
- [ ] 考虑增强 `isWeakJWTSecret` 校验逻辑(最小长度 + 字符多样性)
|
||||
- [ ] 运行 `go test -tags=unit ./...` 和 `go test -tags=integration ./...` 验证
|
||||
- [ ] 运行 `golangci-lint run ./...` 确认无新增问题
|
||||
- [ ] 前端 `pnpm build` 验证通过
|
||||
|
||||
---
|
||||
|
||||
## 附录:关键文件索引
|
||||
|
||||
| 文件 | 说明 |
|
||||
|------|------|
|
||||
| `backend/internal/server/routes/gateway.go` | 网关路由注册(Claude/OpenAI/Gemini/Antigravity) |
|
||||
| `backend/internal/service/gateway_service.go` | 核心网关服务(账号选择、粘性会话、转发) |
|
||||
| `backend/internal/service/openai_gateway_service.go` | OpenAI 专用网关服务 |
|
||||
| `backend/internal/service/openai_sticky_compat.go` | OpenAI 粘性会话双写兼容 |
|
||||
| `backend/internal/service/openai_model_mapping.go` | OpenAI 模型映射解析 |
|
||||
| `backend/internal/service/admin_service.go:1726` | 批量更新账号(风险点) |
|
||||
| `backend/internal/service/account.go:392` | 账号级模型映射缓存与解析 |
|
||||
| `backend/internal/domain/constants.go:73` | Antigravity 默认模型映射 |
|
||||
| `backend/internal/pkg/claude/constants.go` | Claude 模型与 Beta Header 常量 |
|
||||
| `backend/internal/pkg/openai/constants.go` | OpenAI 模型列表 |
|
||||
| `backend/internal/pkg/gemini/models.go` | Gemini fallback 模型列表 |
|
||||
| `backend/internal/service/sora_s3_storage.go:216` | Sora S3 流式上传(SSRF 风险) |
|
||||
| `backend/internal/config/config_helpers.go:28` | JWT Secret 强度校验 |
|
||||
| `frontend/src/router/index.ts` | 前端路由配置 |
|
||||
| `frontend/src/i18n/locales/zh.ts` / `en.ts` | 国际化翻译文件(缺失键) |
|
||||
249
review_tmp/sub2api-launch-readiness-review-2026-05-08.md
Normal file
249
review_tmp/sub2api-launch-readiness-review-2026-05-08.md
Normal file
@@ -0,0 +1,249 @@
|
||||
# Sub2API 全面上线评审报告
|
||||
|
||||
> **评审日期**: 2026-05-08
|
||||
> **评审范围**: sub2api-merge 项目(Go + Vue3 + PostgreSQL + Redis)
|
||||
> **评审目标**: 判定项目是否具备上线条件,核心 AI 模型是否正常支持
|
||||
|
||||
---
|
||||
|
||||
## 执行摘要
|
||||
|
||||
| 维度 | 评分 | 状态 |
|
||||
|------|------|------|
|
||||
| 核心模型支持 | ★★★★★ | 全部主流模型链路完整 |
|
||||
| 构建稳定性 | ★★★★★ | 前后端构建均成功 |
|
||||
| 测试质量 | ★★★★★ | 后端单元+集成全通过,前端 364 测试全通过 |
|
||||
| 代码质量 | ★★★★☆ | 架构清晰,有少量残留代码 |
|
||||
| 文档一致性 | ★★★☆☆ | 版本号不一致,Sora 状态说明已到位 |
|
||||
|
||||
**综合判定: CONDITIONAL GO(有条件通过)**
|
||||
|
||||
项目在核心功能(AI 模型转发网关)上完全具备上线能力。唯一需要在上线前处理的是 **Sora 模块残留代码与已删除数据库表的不一致问题**。
|
||||
|
||||
---
|
||||
|
||||
## 一、模型支持矩阵(核心关切验证)
|
||||
|
||||
以下对每种 AI 模型的端到端转发链路进行了深度代码审查和架构验证:
|
||||
|
||||
| # | 模型/平台 | 网关端点 | 路由文件 | 账号类型 | 模型映射 | 计费支持 | 状态 |
|
||||
|---|-----------|---------|---------|---------|---------|---------|------|
|
||||
| 1 | **Claude (Anthropic)** | `/v1/messages` | `gateway.go:44` | OAuth / API Key / Setup Token / Bedrock | 默认+自定义映射 | ✅ 完整 | **🟢 正常** |
|
||||
| 2 | **Claude (OpenAI group)** | `/v1/messages` | `gateway.go:44-50` | OpenAI OAuth | 自动路由到 OpenAIGateway | ✅ 完整 | **🟢 正常** |
|
||||
| 3 | **OpenAI Chat Completions** | `/v1/chat/completions`, `/chat/completions` | `gateway.go:84-90`, `gateway.go:120-126` | OAuth / API Key | 透传+映射 | ✅ 完整 | **🟢 正常** |
|
||||
| 4 | **OpenAI Responses** | `/v1/responses`, `/responses` | `gateway.go:68-81`, `gateway.go:109-118` | OAuth / API Key | 透传+映射 | ✅ 完整 | **🟢 正常** |
|
||||
| 5 | **Gemini** | `/v1beta/models/*` | `gateway.go:94-106` | OAuth | 完整(2.5/3/3.1 系列) | ✅ 完整 | **🟢 正常** |
|
||||
| 6 | **Antigravity Claude** | `/antigravity/v1/messages` | `gateway.go:141-145` | OAuth | `DefaultAntigravityModelMapping` | ✅ 完整 | **🟢 正常** |
|
||||
| 7 | **Antigravity Gemini** | `/antigravity/v1beta/*` | `gateway.go:147-159` | OAuth | `DefaultAntigravityModelMapping` | ✅ 完整 | **🟢 正常** |
|
||||
| 8 | **Codex** | `gpt-5.1-codex`, `gpt-5.3-codex` | `billing_service.go:252-272` | OpenAI OAuth | `codex_cli_only` 模式 | ✅ 专用探测+计费 | **🟢 正常** |
|
||||
| 9 | **Bedrock** | `/v1/messages` | `account.go:827` | SigV4 / API Key | `DefaultBedrockModelMapping`(区域自适应) | ✅ 完整 | **🟢 正常** |
|
||||
| 10 | **Sora** | — | — | — | — | — | **🔴 不可用** |
|
||||
|
||||
### 关键发现
|
||||
|
||||
1. **自动路由逻辑完善**:`gateway.go` 中 `/v1/messages`、`/v1/responses`、`/v1/chat/completions` 均实现了根据 `getGroupPlatform()` 自动路由到对应 handler(Anthropic vs OpenAI)的逻辑,确保同一 API Key 在不同 group 下正确转发。
|
||||
|
||||
2. **Antigravity 隔离正确**:`/antigravity/*` 路由使用 `ForcePlatform(PlatformAntigravity)` 中间件强制锁定账号平台,不会与其他平台混合调度。
|
||||
|
||||
3. **Codex 支持完善**:`billing_service.go` 中已为 `gpt-5.1-codex`、`gpt-5.3-codex`、`gpt-5.1-codex-max`、`gpt-5.1-codex-mini`、`codex-mini-latest` 等模型配置计费;`account_usage_service.go` 实现了 Codex 专用用量探测和 rate limit 监控。
|
||||
|
||||
4. **模型映射覆盖全面**:`domain/constants.go` 中的 `DefaultAntigravityModelMapping` 和 `DefaultBedrockModelMapping` 覆盖了当前主流模型版本(Claude Opus/Sonnet/Haiku 4-5/4-6 系列,Gemini 2.5/3/3.1 系列)。
|
||||
|
||||
---
|
||||
|
||||
## 二、构建与测试验证(实际执行)
|
||||
|
||||
### 2.1 后端
|
||||
|
||||
| 验证项 | 命令 | 结果 | 耗时 |
|
||||
|--------|------|------|------|
|
||||
| 编译构建 | `go build -tags embed -o sub2api ./cmd/server` | ✅ 成功 | ~30s |
|
||||
| 单元测试 | `go test -tags=unit ./...` | ✅ 全部通过 | ~86s |
|
||||
| 集成测试 | `go test -tags=integration ./...` | ✅ 全部通过 | ~36s |
|
||||
| golangci-lint | `golangci-lint run ./...` | ⚠️ 未安装(环境限制) | — |
|
||||
|
||||
**测试通过详情**:
|
||||
- `internal/handler` ✅(含 admin handler)
|
||||
- `internal/handler/admin` ✅(含 Sora handler 测试)
|
||||
- `internal/prommetrics` ✅(12 个测试用例全部通过)
|
||||
- `internal/service` ✅(含 ops 16 个测试文件全部通过)
|
||||
- `internal/server/routes` ✅(含健康检查端点测试)
|
||||
- `internal/pkg/*` ✅(antigravity、gemini、openai 等)
|
||||
|
||||
### 2.2 前端
|
||||
|
||||
| 验证项 | 命令 | 结果 | 说明 |
|
||||
|--------|------|------|------|
|
||||
| 依赖安装 | `pnpm install --frozen-lockfile` | ⚠️ 部分失败 | npmmirror 网络问题(环境限制) |
|
||||
| 构建 | `pnpm run build` | ✅ 成功 | ~29s,产出在 `backend/internal/web/dist/` |
|
||||
| vitest 测试 | `pnpm test --run` | ✅ 全部通过 | 62 文件 / 364 测试 / 0 失败 |
|
||||
|
||||
**构建产物确认**:新增模块均正常编译:
|
||||
- `OpsDashboard-BPDgd74J.js` (235KB gzip: 51KB) ✅
|
||||
- `SoraView-DYa5Tfy5.js` (33KB gzip: 11KB) ✅
|
||||
- `DataManagementView` ✅
|
||||
|
||||
---
|
||||
|
||||
## 三、新增模块代码质量评估
|
||||
|
||||
| 模块 | 文件数 | 测试文件数 | 测试通过率 | 质量评分 | 备注 |
|
||||
|------|--------|-----------|-----------|---------|------|
|
||||
| `prommetrics/` | 2 | 1 | 12/12 ✅ | ★★★★★ | 独立包,无循环依赖 |
|
||||
| `service/ops_*.go` | 52 | 16 | 全部通过 ✅ | ★★★★☆ | 功能完善,告警/聚合/清理全覆盖 |
|
||||
| `service/sora_*.go` | 21 | 0(sora 表已删除) | — | 🔴 风险 | 见下方阻塞问题 #1 |
|
||||
| `handler/admin/ops_*.go` | 8 | 部分 | — | ★★★★☆ | 路由注册完整 |
|
||||
| `handler/admin/sora_*.go` | 1 | 1 | 通过 ✅ | — | 依赖已删除的表 |
|
||||
| `repository/ops_repo*.go` | 9 | 0 | — | ★★★☆☆ | 建议补充单元测试 |
|
||||
| `frontend/views/admin/ops/` | 19 | 3 | — | ★★★★☆ | 组件化良好 |
|
||||
|
||||
---
|
||||
|
||||
## 四、阻塞问题清单
|
||||
|
||||
### 🔴 阻塞级 #1:Sora 模块代码残留与数据库状态不一致
|
||||
|
||||
**问题描述**:
|
||||
- 数据库迁移 `090_drop_sora.sql` 已删除所有 Sora 表(sora_tasks、sora_generations、sora_accounts)及相关字段
|
||||
- 但后端仍保留 21 个 `sora_*.go` service 文件、Sora admin handler、前端 SoraView 页面
|
||||
- Admin 路由 `/admin/sora` 仍在 `admin.go:97-101` 注册
|
||||
- 访问该路由将导致数据库查询失败(表不存在)
|
||||
|
||||
**影响**:管理员访问 Sora 管理页面时会遇到 500 错误
|
||||
|
||||
**修复方案**(二选一):
|
||||
1. **方案 A(推荐)**:在 `admin.go` 中注释掉 Sora 路由注册,待 Sora 功能恢复后重新启用
|
||||
2. **方案 B**:回滚 `090_drop_sora.sql` 迁移,恢复 Sora 数据库表
|
||||
|
||||
### 🟡 中风险 #2:文档 Go 版本不一致
|
||||
|
||||
**问题描述**:
|
||||
- `README.md`、`DEV_GUIDE.md` 写需要 Go 1.25.7
|
||||
- 实际 `go.mod` 为 `go 1.26.2`
|
||||
- CI 配置 `backend-ci.yml` 也校验 `go1.26.2`
|
||||
|
||||
**影响**:误导新开发者,可能导致本地环境配置错误
|
||||
|
||||
**修复方案**:将 README/DEV_GUIDE 中的 Go 版本统一更新为 1.26.2
|
||||
|
||||
### 🟡 中风险 #3:前端 Chunk 体积过大
|
||||
|
||||
**问题描述**:
|
||||
- `AccountsView-kd8fcLKO.js` 544KB(超过 500KB 警告线)
|
||||
- `vendor-ui-BHFCCYkz.js` 430KB
|
||||
|
||||
**影响**:首次加载 Admin 面板时可能出现明显延迟
|
||||
|
||||
**修复方案**:使用动态 import 拆分 AccountsView 等超大 chunk
|
||||
|
||||
### 🟢 低风险 #4:README 中 Sora 状态声明
|
||||
|
||||
**问题描述**:README.md 第 434 行已声明 "Sora-related features are temporarily unavailable",但项目中 Sora 代码仍大量存在。
|
||||
|
||||
**影响**:认知不一致,开发者可能误以为 Sora 可用
|
||||
|
||||
---
|
||||
|
||||
## 五、安全审计
|
||||
|
||||
| 检查项 | 状态 | 说明 |
|
||||
|--------|------|------|
|
||||
| SQL 注入(ORDER BY) | ✅ 安全 | 白名单校验模式 |
|
||||
| SQL 注入(CREATE DATABASE) | ⚠️ 需注意 | 有前置校验,建议加引号包裹 |
|
||||
| JWT Secret 管理 | ✅ 已完善 | 有轮换告警机制 |
|
||||
| URL Allowlist | ✅ 配置完善 | 支持 CORS、私网地址控制 |
|
||||
| 密码复杂度 | ⚠️ 不一致 | 各模块要求不统一 |
|
||||
| 响应头过滤 | ✅ 可配置 | `security.response_headers.enabled` |
|
||||
|
||||
---
|
||||
|
||||
## 六、CI/CD 评估
|
||||
|
||||
| Workflow | 存在 | 配置 | 评价 |
|
||||
|----------|------|------|------|
|
||||
| `backend-ci.yml` | ✅ | 单元测试 + 集成测试 + golangci-lint v2.9 | 完善 |
|
||||
| `security-scan.yml` | ✅ | govulncheck + gosec + pnpm audit | 完善 |
|
||||
| `release.yml` | ✅ | tag `v*` 触发构建 | 完善 |
|
||||
|
||||
---
|
||||
|
||||
## 七、数据库迁移评估
|
||||
|
||||
- 总迁移文件数:122 个 SQL 文件
|
||||
- 最新迁移:`102_add_out_trade_no_to_payment_orders.sql`
|
||||
- Ops 相关迁移:完整(026、033、034、036、037、038、039、042b、054、079)
|
||||
- Sora 迁移:`046_add_sora_accounts.sql`、`047_add_sora_pricing_and_media_type.sql`、`063_add_sora_client_tables.sql` → **已被 090_drop_sora.sql 删除**
|
||||
|
||||
**风险**:Sora 相关代码依赖的表已被删除,但代码未清理。
|
||||
|
||||
---
|
||||
|
||||
## 八、上线建议
|
||||
|
||||
### 立即执行(上线前必做)
|
||||
|
||||
1. **禁用 Sora Admin 路由**(`backend/internal/server/routes/admin.go:97-101`)
|
||||
```go
|
||||
// 暂时注释掉 Sora 路由,避免访问已删除的表
|
||||
// sora := admin.Group("/sora")
|
||||
// sora.GET("/stats", h.Admin.Sora.GetSystemStats)
|
||||
// ...
|
||||
```
|
||||
|
||||
2. **同步文档版本号**
|
||||
- 更新 `README.md` 中的 Go 版本徽章
|
||||
- 更新 `DEV_GUIDE.md` 中的 Go 版本说明
|
||||
|
||||
### 近期执行(上线后 1-2 周)
|
||||
|
||||
3. **清理 Sora 残留代码**
|
||||
- 决定:彻底移除 Sora 代码,还是恢复数据库表支持
|
||||
- 如果移除:删除 `service/sora_*.go`、`handler/admin/sora_*.go`、`frontend/src/views/admin/SoraAdminView.vue`
|
||||
|
||||
4. **前端代码分割优化**
|
||||
- 对 AccountsView、OpsDashboard 等大 chunk 使用 `defineAsyncComponent` 懒加载
|
||||
|
||||
5. **统一密码复杂度要求**
|
||||
- 检查各 handler 中的密码验证逻辑,统一最小长度和字符要求
|
||||
|
||||
### 持续监控
|
||||
|
||||
6. **部署后验证各模型连通性**
|
||||
- Claude `/v1/messages`
|
||||
- Gemini `/v1beta/models`
|
||||
- OpenAI `/v1/chat/completions`
|
||||
- Codex 用量探测是否正常
|
||||
|
||||
7. **观察新增 Ops 监控性能**
|
||||
- 数据聚合任务对数据库负载的影响
|
||||
- Prometheus 指标端点 `/metrics` 的响应时间
|
||||
|
||||
---
|
||||
|
||||
## 九、最终判定
|
||||
|
||||
| 检查项 | 结果 |
|
||||
|--------|------|
|
||||
| 核心模型支持 | ✅ 完整(除 Sora) |
|
||||
| 构建成功 | ✅ 前后端均通过 |
|
||||
| 测试通过 | ✅ 单元+集成全部通过 |
|
||||
| 新增模块质量 | ✅ 代码结构良好,有配套测试 |
|
||||
| 数据库迁移 | ⚠️ Sora 表已删但代码残留 |
|
||||
| 安全审计 | ✅ 无高风险漏洞 |
|
||||
| CI/CD 配置 | ✅ 完整 |
|
||||
|
||||
**最终结论:CONDITIONAL GO(有条件通过)**
|
||||
|
||||
项目在核心 AI 模型网关功能上完全具备上线能力。唯一阻碍上线的因素是 Sora 模块的残留代码可能触发数据库错误。建议在上线前执行以下最小改动:
|
||||
|
||||
> **最小改动清单**:
|
||||
> 1. 注释掉 `backend/internal/server/routes/admin.go` 中的 Sora 路由组(4 行代码)
|
||||
> 2. 更新 README/DEV_GUIDE 中的 Go 版本说明
|
||||
> 3. 重新构建验证
|
||||
> 4. 即可上线
|
||||
|
||||
---
|
||||
|
||||
*报告生成时间: 2026-05-08 15:30*
|
||||
*评审执行人: 齐活林 (Qi) - 交付总监*
|
||||
*协作团队: 高见远 (架构师), 严过关 (QA 工程师)*
|
||||
Reference in New Issue
Block a user