feat(canvas): 画布工作区 - 整合侧栏与风格预设并修复提示词回填

选择性整合 #547,保留主分支节点与工具条设计。新增默认折叠的节点、资产、任务和历史面板,风格与预设保留在节点内,移除重复入口。

补齐工具权限、提示词解析、资源引用保护及数据库迁移,修复提示词清空和连续编辑后的生成配置同步。

验证:前端全量 1925 项测试、构建、类型检查及 lint 通过;后端 go test ./... 通过。真实模型、PostgreSQL 实库与登录态页面验收仍待进行。

Refs #547

Co-authored-by: bensharp <bensharp@qq.com>
This commit is contained in:
ddCat
2026-09-20 16:40:08 +08:00
parent be5f2733b6
commit e93bf3ca39
66 changed files with 6127 additions and 97 deletions

View File

@@ -254,3 +254,13 @@ schema v27 为 `channel_model_price_tiers` 和 `billing_orders` 添加 `cost_con
账号文件容量只统计 `ready` 资源,并按 Provider、Endpoint、Bucket、ObjectKey 对同一物理对象去重。上传中或失败记录不占用已存储容量。后台每小时检查资源生命周期:超过 1 小时的 `pending/failed` 记录,以及超过 24 小时仍没有任何素材、画布、任务或其他业务引用的 `ready` 记录,会在再次校验引用后删除数据库记录并写入 `resource_deletion_jobs`,由幂等 Worker 清理物理对象。
素材状态为 `archived` 时进入回收站。后台按“资源与请求策略”中的 `recycleBinRetentionDays` 定期扫描过期项;`0` 表示永久保留。自动清理与用户手动彻底删除复用同一 service 引用校验和 `resource_deletion_jobs` Outbox,仍被画布、项目、任务或其他业务记录引用的素材不会被删除。
## 画布生成工具
Schema 30 新增 `tools`,31 新增 `tool_favorites`;主分支已有 28(Agent 执行日志)、29(资源租约)编号和 checksum 不变。
- `tools`:自增 `id`、类型 `type`、名称 `label/label_en`、描述/标签、`prompt`、预览 `cover/media_url/extra_info_json`、比例、`owner_id`、`source`、`enabled`、`visibility`、排序权重和时间。
- `tool_favorites`:`id`、`user_id`、`tool_id`、收藏时间;用户和工具联合唯一。删除自己的自定义工具时事务清理收藏,不删除预览文件。
- 启动幂等装载 87 个预设(风格 45、运镜 33、九宫格 9),不下载第三方媒体。显式 ID 与用户工具冲突时启动报错,不覆盖用户数据;PostgreSQL 同步自增序列。
- 工具预览纳入资源引用检查;自定义预览必须是当前用户已上传完成的资源。公开工具暂不接受私人预览资源。
- SQLite → PostgreSQL 迁移包含上述两表。首次启动前备份测试数据;回退旧代码不能视为数据库降级,应使用备份恢复,不手工重写迁移记录。

View File

@@ -133,3 +133,11 @@ HTTP 请求 -> handler -> service(稳定导入面 / 别名)-> app(组合
- HTTP 参数与响应只在 handler 处理,业务规则进入 service。
- 页面保留流程协调;可独立理解和测试的算法进入同业务域的 `lib`。
- 新增功能时只更新本页的主要入口,不增加逐文件清单。
## 画布工具链路
- `backend/internal/handler/tools.go`:登录态工具列表、详情、收藏、创建与删除。
- `internal/service` 别名 → `internal/app/tools_bridge.go`(资源归属校验)→ `internal/tools`(可见性策略、输入合同、token 展开和内置种子)→ `internal/repository/tools.go`。
- 任务入队 `internal/app/task_creation.go` 与生成执行 `internal/app/provider.go` 共用严格 token 解析。
- 前端 `canvas-tool-presentation.ts` 共享轻量展示配置,`canvas-resource-references.ts` 统一 token;节点提示词与工具面板共用同一持久状态,不复制到 metadata 风格字段。
- `canvas-workspace-panel.tsx` 提供常驻左侧菜单,按需挂载节点、资产、工具、任务和历史面板;资产面板复用素材分页服务与画布插入合同;主分支项目章节侧栏与工作区互斥。

View File

@@ -243,3 +243,17 @@ CSV 使用中文表头、UTF-8 BOM、CRLF;金额按整数分精确转换为两
模型错误把已有字符串码放进 `reason`(如 `model_capability_not_supported`),`code` 仍为 400。
常量:后端 `service/error_codes.go`,前端 `web/src/services/api/error-codes.ts`。
## 画布工具 API
以下接口均要求登录,使用标准业务信封:
| 方法 | 路径 | 行为 |
| --- | --- | --- |
| GET | `/api/tools` | 分页列表;`scope=public/favorites/custom`,默认 public;可按 `type=style/motion/nine_grid/effect`、tag、search 筛选。page 从 1 开始,pageSize 默认 20、最大 80;返回 tools、totalCount、page、pageSize、hasMore |
| GET | `/api/tools/:id` | 可见且启用的工具详情,包含 prompt 和 extraInfo;列表不含这两个大字段 |
| POST | `/api/tools` | 新建自己的工具;type、label、prompt 必填,visibility 默认 private;预览仅支持本人已上传完成的资源,公开工具暂不接受私人预览 |
| POST / DELETE | `/api/tools/:id/favorite` | 幂等收藏 / 取消收藏,仅允许操作可见且启用工具 |
| DELETE | `/api/tools/:id` | 仅删除自己的用户工具,不能删除内置或他人工具 |
生成提示词工具引用格式为 `@[tool:type:ID:label:icon]`,label 使用 URI 编码。名称和图标只用于展示,不作为授权依据。服务端在任务入队及执行前检查用户可见性、启用状态、工具类型和生成模式;无效、越权、嵌套工具或数据库错误必须失败,不能把未解析 token 发送给模型。风格和九宫格仅用于图片,运镜和特效仅用于视频。入队校验不冻结工具快照:排队期间删除工具将导致执行失败。