baseline: Clover 独立仓库首次基线提交

将 Clover 从上层产品包旧仓库中独立出来,建立专属版本控制。
当前状态=纵切片端到端已打通(登录→选品→出文出图→审核→下载包),
M1文案质量去套路化已验收。此提交作为后续按核销清单逐条修复的基线。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
yangqianqian
2026-06-16 11:30:22 +08:00
commit 6a2632da70
253 changed files with 27467 additions and 0 deletions

View File

@@ -0,0 +1,42 @@
---
paths:
- "src/api/**"
- "src/routers/**"
- "src/services/**"
---
# API 层开发规则Clover 后端)
> 承接架构方案v0.3 基石 + API契约.md冲突以架构方案为准。
## 路由规范
- RESTful 命名:资源用名词复数(/tasks, /products, /api-keys
- 版本前缀:/api/v1/
- 控制器只做:参数校验 → 调 service → 格式化响应,**不含业务逻辑**
## 响应格式(统一包络)
- 成功:`{ "code": 0, "data": {...} }`
- 失败:`{ "code": <错误码>, "message": "用户可读信息" }`
- HTTP 状态码与业务 code 分离见契约§0七类错误码
## 安全基石B/C
- 所有用户输入必须校验(类型、长度、范围)
- SQL 查询使用参数化,禁止字符串拼接
- **API Key 绝不进 Celery 参数**,只传 task_idworker 内查库→Fernet解密→局部变量
- FERNET_KEY 走环境变量,绝不进代码库;解密不落盘、不打日志
- 敏感操作记审计日志ai_call_logs
## 多租户隔离(红线)
- 所有查询强制带 workspace_id 条件
- 写操作 + 切 workspace 必须查 workspace_members 校验权限
- workspace_id / product_id 从 JWT + 上下文自动带,前端不传(防越权)
- 所有 workspace 相关 Repo 继承 base_workspace_repo
## 错误处理官网V1坑3
- service 错误不许静默吞,至少打 error log
- AI/token站调用失败归因到个人 key错误码50002
- DB 枚举约束要有对应代码侧常量文件
## 业务参数不写死基石A
- 禁止出现品类/数量/角度任何枚举常量
- "看起来像枚举"的业务概念 → 做成数据不做成代码

View File

@@ -0,0 +1,49 @@
---
paths:
- "src/models/**"
- "alembic/**"
- "migrations/**"
---
# 数据库规则Clover · MySQL + Alembic
> 承接架构方案v0.3 第三章16表。一期建14张matrix_accounts/preference_profile 二期预留。
## 迁移
- 每次 schema 变更创建迁移文件,不手动改数据库
- 迁移文件不可修改已提交的,只能新增
- 迁移必须包含 up 和 down
- 按序001(banana搬3张) → 002(多租户基础) → 003(业务7张) → 004(飞轮)
## 查询
- 禁止 SELECT *,明确列出字段
- 大表查询必须有索引支撑,新增查询模式时同步加索引
- N+1 问题:关联查询用 JOIN 或批量加载
- 飞轮聚合走 MySQL JOINMongoDB 只存 AI debug trace业务不依赖
## 命名
- 表名snake_case 复数users, generation_tasks, preference_events
- 字段名snake_casecreated_at, workspace_id
- 索引名idx_表名_字段名
## 关键约束(架构方案)
- 任务主键:自增 BIGINT + mongo_trace_id VARCHAR(24)
- user_api_keysUNIQUE(user_id, workspace_id, provider)
- 所有业务表必须有 workspace_id多租户逻辑隔离
- preference_events 必须有 workspace_id + product_id跨公司隔离+按产品分开学)
## 状态机generation_tasks.status
pending → generating → pending_selection → pending_review → approved/rejected → archived
- 打回后回到 pending_selection
- 非法流转返错误码 40901
## 字段红线
- API Key 字段encrypted_keyFernet**不存 url 字段**token站固定自家站
- users 表:删除 banana 的 credits 字段
- eval_score留 NULL不接 banana 假评分)
- data_ownershipclient_data / platform_asset洞7分层归属
- banned_words.levelauto_fix / soft_warn / hard_block三级
## 枚举约束
- DB 枚举约束要有对应代码侧常量文件(消除三套命名打架)
- 品类products.category是纯数据字段禁止任何品类枚举常量

View File

@@ -0,0 +1,46 @@
---
paths:
- "src/components/**"
- "src/app/**"
- "src/pages/**"
- "src/stores/**"
---
# 前端开发规则Clover · Next.js
> 承接 前端交互设计.md5屏金标准+ API契约.md §3 DTO。
## 组件规范
- 单一职责:一个组件只做一件事
- Props 必须定义类型TypeScript interface
- 避免 prop drilling 超 3 层,用 Context 或状态管理
## DTO 对接堵官网V1坑4
- 所有 DTO 字段严格按 API契约§3**不许自己假设嵌套结构**
- 后端响应与契约不符立即报 Lead不私下适配
- workspace_id / product_id 不在前端传
## SSE异步生图电影
- 按 event_seq 去重,断线重连补发历史事件
- 11类事件按契约§2渲染0/N进度 + 谁好谁先冒 + 单批失败重试 + 能离开
- flywheel_injected 事件 → 显"本次已注入:最近偏好/打回原因"
## 样式
- 用 CSS Modules 或 Tailwind不用全局样式
- 响应断点统一sm(640) md(768) lg(1024) xl(1280)
- 颜色/间距用 design token不硬编码
## 可访问性
- 交互元素必须有 aria-label
- 图片必须有 alt 文本
- 键盘导航可用
## 红线CLAUDE.md
- ❌ 不展示 Token 余额、不做积分页key 去中转站后台看)
- ❌ 飞轮隐形:无"训练AI"按钮,只在生成时显注入提示
- ❌ 不做"自动发布到小红书"——只到确认预览
- ❌ 不做移动端(一期)
## 状态管理
- 4 个 Store任务 / 候选 / 审核 / 全局
- 异步态用骨架屏错误态对接契约§0错误码