chore(*): 项目文档 - 更新交流群二维码并清理无关生成文件

This commit is contained in:
ddCat
2026-08-27 15:03:53 +08:00
parent 3bc670f067
commit 55ce3cb11f
6 changed files with 2 additions and 596 deletions

View File

@@ -1,353 +0,0 @@
# 模型目录管理系统重构 - 完整实施报告
## 项目概述
本次重构实现了前台模型虚拟渠道与系统渠道模型的双模式支持,通过 `frontendModelsEnabled` 开关控制模型目录的来源和任务创建的校验逻辑。
## 实施范围
### 后端实现 (Backend)
#### 1. 核心功能开关
- **文件**: `internal/service/feature_availability.go`
- **功能**: 添加 `frontendModelsEnabled` 字段,默认值 `true`
- **状态**: ✅ 完成
#### 2. 错误码体系
- **文件**: `internal/service/errors.go`
- **功能**: 定义6个明确的模型错误码
- **错误码列表**:
- `model_capability_not_supported`
- `model_price_not_configured`
- `model_route_unavailable`
- `provider_request_failed`
- `model_catalog_mismatch`
- `invalid_model_selection`
- **状态**: ✅ 完成
#### 3. 数据模型扩展
- **文件**: `internal/model/models_logical_model.go`
- **功能**: 新增 `LogicalModelPriceSKU` 结构体
- **用途**: 支持统一定价模式的独立售价 SKU
- **状态**: ✅ 完成
#### 4. 价格校验逻辑
- **文件**: `internal/service/price_validation.go`
- **功能**:
- `ValidateChannelModelPrice` - 根据 billingMode 校验价格
- `ComputePriceConfigured` - 自动派生价格标志
- `HasValidPrice` - 检查价格有效性
- **状态**: ✅ 完成
#### 5. 统一价格展示
- **文件**: `internal/service/logical_models.go`
- **功能**: 在 `PublicLogicalModel` 中添加:
- `PricingMode` - 价格模式
- `DisplayPrice` - 展示价格
- `PriceLabel` - 价格标签
- **状态**: ✅ 完成
#### 6. 统一模型目录接口
- **文件**: `internal/service/model_catalog.go`
- **功能**:
- `GET /api/model-catalog` - 统一目录接口
- `POST /api/model-catalog/available` - 能力过滤
- `POST /api/model-catalog/quote` - 价格报价
- **返回数据**: 根据开关返回前台模型或脱敏的系统渠道模型
- **状态**: ✅ 完成
#### 7. 任务入口强制分流
- **文件**: `internal/service/task_creation.go`
- **功能**:
- 前台模式: 必须有 `logicalModelId`
- 系统模式: 禁止 `logicalModelId`,校验系统渠道模型
- **状态**: ✅ 完成
### 前端实现 (Frontend)
#### 1. 类型定义更新
- **文件**: `web/src/stores/use-user-store.ts`
- **功能**: 在 `FeatureAvailability` 类型中添加 `frontendModelsEnabled`
- **状态**: ✅ 完成
#### 2. 管理界面更新
- **文件**: `web/src/pages/admin/components/feature-availability-panel.tsx`
- **功能**:
- 添加"前台模型目录"开关项
- 使用 Sparkles 图标
- 关闭时显示二次确认对话框
- **状态**: ✅ 完成
## 访问路径
### 管理员入口
管理员可以通过以下路径访问功能开关设置:
```
应用首页 -> 管理后台 -> 功能开放 -> 前台模型目录开关
```
或直接访问:
```
/admin/features
```
### 开关配置项
| 字段 | 标题 | 图标 | 默认值 | 描述 |
|------|------|------|--------|------|
| `frontendModelsEnabled` | 前台模型目录 | ✨ | `true` | 开启时使用前台模型虚拟渠道,关闭时使用系统渠道模型 |
## 工作模式
### 模式 1: 前台模型模式 (frontendModelsEnabled = true)
**特点:**
- 用户目录来源: 前台模型虚拟渠道
- 任务创建要求: 必须提供 `logicalModelId`
- 路由机制: 通过 LogicalModelRoute 路由到具体渠道模型
- 价格来源: Revision + 路由 + 渠道价格档 / 前台 SKU
**适用场景:**
- 需要对用户隐藏底层渠道细节
- 需要统一的模型目录和品牌
- 需要前台独立定价
### 模式 2: 系统渠道模式 (frontendModelsEnabled = false)
**特点:**
- 用户目录来源: 脱敏的系统渠道模型
- 任务创建要求: 禁止 `logicalModelId`,必须指定系统渠道模型
- 路由机制: 直接调用指定的渠道模型
- 价格来源: ChannelModel 能力和渠道价格档
**适用场景:**
- 简化模型管理,直接使用系统渠道
- 无需配置前台模型路由
- 快速上线和测试
## 数据流图
### 前台模型模式
```
用户请求
↓
GET /api/model-catalog
↓
返回前台模型目录 (source: "frontend")
↓
用户选择模型 + logicalModelId
↓
POST /api/tasks (带 logicalModelId)
↓
ResolveLogicalModel 路由
↓
调用渠道模型执行
```
### 系统渠道模式
```
用户请求
↓
GET /api/model-catalog
↓
返回脱敏的系统渠道模型 (source: "system")
↓
用户选择渠道 + 模型
↓
POST /api/tasks (带 channelId + model)
↓
validateSystemChannelModelSelection
↓
调用渠道模型执行
```
## 待完成事项
### 高优先级
1. ⏳ **数据库迁移脚本**
- 创建 `logical_model_price_skus` 表
- 为现有模型添加默认 SKU
2. ⏳ **路由注册**
- 在 `cmd/server/main.go` 中注册 `RegisterModelCatalogRoutes`
3. ⏳ **前端接口切换**
- 修改前端模型选择器,调用新的 `/api/model-catalog` 接口
- 移除对旧接口的直接调用
### 中优先级
4. ⏳ **系统渠道报价逻辑**
- 实现 `POST /api/model-catalog/quote` 中系统模式的报价
5. ⏳ **SKU 管理后台**
- 添加前台 SKU 的 CRUD 接口
- 实现 selector 覆盖校验
6. ⏳ **单元测试**
- 价格校验逻辑测试
- 任务入口分流测试
- 模型目录接口测试
### 低优先级
7. ⏳ **前端适配优化**
- 根据 `source` 字段优化 UI 展示
- 添加模式切换提示
8. ⏳ **文档完善**
- API 文档
- 用户手册
- 管理员指南
## 测试清单
### 后端测试
- [ ] 功能开关读取和更新
- [ ] 前台模式任务创建(带 logicalModelId)
- [ ] 系统模式任务创建(带 channelId + model)
- [ ] 模式切换后的任务创建校验
- [ ] 价格有效性校验
- [ ] 统一目录接口返回数据正确性
### 前端测试
- [ ] 管理界面开关切换
- [ ] 二次确认对话框显示
- [ ] 配置保存和刷新持久化
- [ ] 非管理员权限限制
### 集成测试
- [ ] 开启前台模式 -> 创建任务 -> 执行成功
- [ ] 关闭前台模式 -> 创建任务 -> 执行成功
- [ ] 模式切换 -> 旧任务继续执行
- [ ] 价格计算正确性
## 部署步骤
### 1. 数据库迁移
```sql
-- 创建 LogicalModelPriceSKU 表
CREATE TABLE logical_model_price_skus (
id VARCHAR(36) PRIMARY KEY,
logical_model_revision_id VARCHAR(36) NOT NULL,
code VARCHAR(80),
name VARCHAR(160),
selector_key VARCHAR(500) NOT NULL DEFAULT '{}',
selector_json TEXT NOT NULL DEFAULT '{}',
billing_mode VARCHAR(32),
unit_price_microcredits BIGINT,
input_token_price_microcredits BIGINT,
output_token_price_microcredits BIGINT,
cached_token_price_microcredits BIGINT,
priority INT,
enabled BOOLEAN,
version INT,
created_at TIMESTAMP,
updated_at TIMESTAMP,
deleted_at TIMESTAMP,
INDEX idx_logical_sku_active (logical_model_revision_id, selector_key, deleted_at)
);
```
### 2. 代码部署
```bash
# 编译后端
cd backend
go build ./cmd/server
# 编译前端
cd web
npm run build
# 重启服务
systemctl restart infinite-canvas
```
### 3. 配置验证
- 登录管理后台
- 进入"功能开放"页面
- 确认"前台模型目录"开关显示正常
- 测试开关切换功能
### 4. 功能验证
- 开启前台模式,创建测试任务
- 关闭前台模式,创建测试任务
- 验证两种模式下任务都能正常执行
## 回滚方案
如遇问题,可通过以下步骤回滚:
1. **快速回滚**: 通过管理界面切换开关即可
2. **代码回滚**: 使用 git 回滚到上一个稳定版本
3. **数据库回滚**: 删除新表(如未使用)
```bash
# Git 回滚
git revert <commit-hash>
# 数据库回滚(谨慎操作)
DROP TABLE IF EXISTS logical_model_price_skus;
```
## 性能影响
### 评估结果
- **接口响应时间**: 统一目录接口增加约 10-20ms(需加载价格档)
- **数据库查询**: 每次模型目录请求增加 1-2 次查询
- **内存占用**: 增加约 5-10MB(缓存模型目录)
### 优化建议
1. 对模型目录进行缓存(TTL: 30秒)
2. 使用数据库索引优化价格档查询
3. 考虑使用 Redis 缓存热门模型信息
## 安全考虑
### 已实现
- ✅ 系统渠道模型脱敏(不暴露 API Key、Base URL)
- ✅ 管理员权限校验
- ✅ 任务创建强制校验
### 建议加强
- 添加操作审计日志
- 添加频率限制
- 添加异常监控告警
## 文件清单
### 后端新增文件
- `internal/service/model_catalog.go`
- `internal/service/price_validation.go`
- `internal/handler/model_catalog.go`
- `backend/IMPLEMENTATION_SUMMARY.md`
### 后端修改文件
- `internal/service/feature_availability.go`
- `internal/service/errors.go`
- `internal/service/logical_models.go`
- `internal/service/task_creation.go`
- `internal/model/models_logical_model.go`
### 前端修改文件
- `web/src/stores/use-user-store.ts`
- `web/src/pages/admin/components/feature-availability-panel.tsx`
- `web/FRONTEND_FEATURE_TOGGLE.md`
## 贡献者
- 实施日期: 2026-08-22
- 开发: Claude (AI Assistant)
- 审核: 待定
- 测试: 待定
## 参考文档
- [后端实施总结](../backend/IMPLEMENTATION_SUMMARY.md)
- [前端功能开关说明](../web/FRONTEND_FEATURE_TOGGLE.md)
- [原始方案文档](../视频模型API协议改造方案.md)
---
**状态**: 开发完成,待测试和部署
**风险等级**: 中等(涉及核心任务创建流程)
**建议**: 先在测试环境充分验证后再上线生产环境

View File

@@ -1,238 +0,0 @@
# 前台模型目录开关功能 - 最终实施总结
## 🎯 功能概述
实现了 `frontendModelsEnabled` 功能开关,允许管理员在**前台模型虚拟渠道**和**系统渠道模型**之间切换。
## ✅ 已完成的功能
### 1. 后端实现
#### 核心功能
- ✅ 在 `feature_availability.go` 中添加 `frontendModelsEnabled` 字段(默认 `true`)
- ✅ 定义 6 个明确的错误码(`errors.go`)
- ✅ 新增 `LogicalModelPriceSKU` 数据模型(支持统一定价)
- ✅ 完善价格校验逻辑(`price_validation.go`)
- ✅ 统一价格展示字段(`pricingMode`, `displayPrice`, `priceLabel`)
#### 统一模型目录接口
- ✅ `GET /api/model-catalog` - 根据开关返回不同的目录
- ✅ `POST /api/model-catalog/available` - 能力过滤
- ✅ `POST /api/model-catalog/quote` - 价格报价
#### 任务创建强制分流
- ✅ 前台模式:必须有 `logicalModelId`,否则拒绝
- ✅ 系统模式:禁止 `logicalModelId`,必须指定 `channelId + model`
- ✅ 系统模式下校验渠道模型存在且价格有效
### 2. 前端实现
#### 管理界面
- ✅ 分成两个独立卡片:
- **用户功能开放**(短剧、任务、积分、自定义渠道)
- **管理后台功能**(前台模型)
- ✅ 添加"前台模型"开关(✨ Sparkles 图标)
- ✅ 关闭时显示二次确认对话框
- ✅ 产品化文案,无技术术语
#### 菜单和路由
- ✅ 左侧菜单根据开关动态显示/隐藏"前台模型"
- ✅ 路由层面拦截,关闭时访问 `/admin/models` 显示"暂未开放"
- ✅ PC 和移动端菜单都支持
#### 模型加载
- ✅ 登录时调用 `/api/model-catalog` 获取模型目录
- ✅ 刷新时调用 `/api/model-catalog` 更新模型目录
- ✅ 根据 `source` 字段加载不同格式的模型数据
## 📋 工作原理
### 开关状态:开启(默认)
```
管理后台:
✓ 左侧显示"前台模型"菜单
✓ 可访问 /admin/models
用户端:
✓ 模型选择器显示前台模型
✓ 创建任务时带 logicalModelId
后端接口:
GET /api/model-catalog
→ {source: "frontend", models: [...]}
```
### 开关状态:关闭
```
管理后台:
✗ 左侧隐藏"前台模型"菜单
✗ 访问 /admin/models 显示"暂未开放"
用户端:
✓ 模型选择器显示系统渠道模型
✓ 创建任务时带 channelId + model
✗ 不允许带 logicalModelId
后端接口:
GET /api/model-catalog
→ {source: "system", channels: [...]}
```
## 🎨 用户界面
### 管理后台 - 功能开放页面
```
┌─────────────────────────────────────────────────┐
│ 🔄 用户功能开放 4/4 已开放 │
├─────────────────────────────────────────────────┤
│ 🎬 短剧创作 /projects [ON] │
│ ☑️ 任务 /tasks [ON] │
│ 💰 积分中心 /wallet [ON] │
│ 📡 自定义渠道 /settings... [ON] │
└─────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────┐
│ ⚙️ 管理后台功能 1/1 已开放 │
├─────────────────────────────────────────────────┤
│ ✨ 前台模型 /admin/models [ON] │
│ 关闭后隐藏管理后台的前台模型菜单和配置 │
│ 页面,用户将直接使用系统渠道中的模型。 │
└─────────────────────────────────────────────────┘
```
### 关闭确认对话框
```
┌─────────────────────────────────────┐
│ 关闭前台模型功能? │
├─────────────────────────────────────┤
│ 关闭后,管理后台的「前台模型」菜单 │
│ 将隐藏,用户将直接使用系统渠道中配 │
│ 置的模型。已有前台模型配置不会删除。 │
│ │
│ [取消] [确认关闭] │
└─────────────────────────────────────┘
```
## 🔧 部署步骤
### 1. 编译后端
```bash
cd backend
go build -o bin/server ./cmd/server
```
### 2. 重启服务
```bash
./bin/server
```
### 3. 验证接口
```bash
curl http://localhost:3000/api/model-catalog
```
### 4. 编译前端
```bash
cd web
npm run build
```
### 5. 清除缓存并刷新浏览器
## 🧪 测试清单
### 基础功能测试
- [ ] 管理后台显示两个独立的功能卡片
- [ ] "前台模型"开关可以正常切换
- [ ] 关闭时显示二次确认对话框
- [ ] 配置保存后刷新页面仍然保持
### 菜单和路由测试
- [ ] 开启时左侧菜单显示"前台模型"
- [ ] 关闭时左侧菜单隐藏"前台模型"
- [ ] 关闭后直接访问 `/admin/models` 被拦截
- [ ] 移动端菜单也正确过滤
### 模型目录测试
- [ ] 开启时模型选择器显示前台模型
- [ ] 关闭时模型选择器显示系统渠道模型
- [ ] 切换开关后刷新页面,模型目录正确更新
### 任务创建测试
- [ ] 开启时创建任务带 `logicalModelId`
- [ ] 关闭时创建任务带 `channelId + model`
- [ ] 关闭时尝试带 `logicalModelId` 被拒绝
- [ ] 两种模式下任务都能正常执行
### 接口测试
- [ ] `/api/model-catalog` 返回 200
- [ ] 开启时返回 `{source: "frontend", models: [...]}`
- [ ] 关闭时返回 `{source: "system", channels: [...]}`
## 📦 修改文件清单
### 后端(9个文件)
1. `internal/service/feature_availability.go` - 添加开关
2. `internal/service/errors.go` - 错误码定义(新建)
3. `internal/model/models_logical_model.go` - SKU 模型
4. `internal/service/price_validation.go` - 价格校验(新建)
5. `internal/service/logical_models.go` - 价格展示字段
6. `internal/service/model_catalog.go` - 统一目录接口(新建)
7. `internal/handler/model_catalog.go` - HTTP 处理器(新建)
8. `internal/service/task_creation.go` - 任务创建分流
9. `cmd/server/main.go` - 路由注册
### 前端(7个文件)
1. `stores/use-user-store.ts` - 类型定义
2. `pages/admin/components/feature-availability-panel.tsx` - UI 和交互
3. `pages/admin/components/admin-shell.tsx` - 菜单过滤
4. `components/auth/require-feature.tsx` - 权限检查
5. `router.tsx` - 路由拦截
6. `services/api/logical-models.ts` - API 函数
7. `lib/user-session.ts` - 模型加载逻辑
## 📊 影响范围
### 用户影响
- **零影响**:默认开启,行为与之前完全一致
- **管理员可控**:通过管理后台随时切换
### 性能影响
- **接口响应**:统一目录接口增加约 10-20ms
- **数据库查询**:每次请求增加 1-2 次查询
- **内存占用**:增加约 5-10MB(模型目录缓存)
## ⚠️ 注意事项
1. **关闭前台模型前**:确认系统渠道中有可用模型
2. **切换模式后**:建议用户刷新页面以加载最新配置
3. **任务兼容**:旧任务继续使用创建时的模型配置
4. **数据不丢失**:关闭前台模型不会删除已有配置
## 🐛 已知问题
无
## 🚀 下一步计划
1. 创建数据库迁移脚本(`logical_model_price_skus` 表)
2. 编写单元测试和集成测试
3. 性能优化(添加缓存)
4. 文档更新(API 文档、用户手册)
## 📞 技术支持
如遇问题,请查看:
- [部署指南](./DEPLOYMENT_GUIDE.md)
- [完整实施报告](./COMPLETE_IMPLEMENTATION_REPORT.md)
- [前端功能开关说明](./web/FRONTEND_FEATURE_TOGGLE.md)
---
**实施日期**: 2026-08-22
**状态**: ✅ 开发完成,待测试部署
**开发者**: Claude AI Assistant

View File

@@ -19,10 +19,6 @@
当前版本以仓库根目录 [`VERSION`](VERSION) 为准。
## 仓库协作
本项目的远端上游仓库是 [`ddcat-ai/open-ai-canvas`](https://github.com/ddcat-ai/open-ai-canvas)。本地同步主线代码时,应以该仓库的 `main` 分支为准。
## 赞助商
感谢以下赞助商对影策项目的支持:
@@ -56,7 +52,8 @@
Issue 反馈、技术讨论和产品升级建议都可以在 QQ 群中沟通。群内还会不定期组织 AI 学习与培训交流会。
<p align="center">
<img src="assets/qq.jpg" alt="影策 QQ 交流群" width="360">
<img src="assets/qq.jpg" alt="影策 QQ 交流群" width="280">
<img src="assets/wx.jpg" alt="影策 微信交流群" width="280">
</p>
## 当前能力

BIN
assets/wx.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB