A8多套打包+M4归档+R5多图:存量功能备份

A8 多套交付包(packaging_task.py):
- 修复交付包只打第1条混乱note的bug,按ImageCandidate.strategy分A/B/C组
- 每组生独立note_0N夹(6图+文案.txt),同seq留最新去重,老数据兼容
- task74端到端验:3套各6图,独立agent7项交叉验证全过

M4 归档(tasks.py/exports.py/前端):
- list_tasks加date_from/date_to/product_id筛选+product_name批量填(防N+1)
- 新增exports.py:产品JSON导出+标杆CSV导出(UTF-8 BOM)
- 前端HistoryFilters日期/产品筛选+产品列+打回原因红banner
- response.py加raise_param_error;独立agent验A1/A2/A9通过

R5 产品多图(product_images.py/020迁移/前端):
- product_images表+5端点(上传/列/改场景/设主图/删图)
- 生图按ROLE_SCENE_PREFERENCE选对应场景图,回落primary
- 前端ProductImageManager多图画廊

R6 账号config拆页(settings/):
- 配置页按角色拆/settings(运营+组长+admin)+/config(仅admin)
- Key只显末4位不显余额(守红线)

核销表对齐真实代码状态:D1改稿框/M7裂变/E12评图分纠偏为已完成(曾漏回写)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
yangqianqian
2026-06-18 17:32:49 +08:00
parent 285791c12f
commit 4bed7425a8
41 changed files with 1211 additions and 236 deletions

View File

@@ -1,30 +1,26 @@
'use client';
/**
* 屏1 配置台(管理 /config
* 产品库 / 标杆笔记 / 违禁词 / API Key 录入
* 🔴 红线key 只录不显余额(不做 Token 用量展示)
* 系统管理 /config(仅管理员
* 标杆笔记 / 违禁词库 —— 平台级配置,写操作后端锁 admin
* 拆分自原 /configB方案运营日常用的 API Key/产品档案已移到 /settings「工作配置」
*/
import { useState } from 'react';
import { ProductsTab } from '@/components/config/ProductsTab';
import { BenchmarksTab } from '@/components/config/BenchmarksTab';
import { BannedWordsTab } from '@/components/config/BannedWordsTab';
import { ApiKeysTab } from '@/components/config/ApiKeysTab';
type TabKey = 'products' | 'benchmarks' | 'banned_words' | 'api_keys';
type TabKey = 'benchmarks' | 'banned_words';
const TABS: { key: TabKey; label: string }[] = [
{ key: 'products', label: '产品档案' },
{ key: 'benchmarks', label: '标杆笔记' },
{ key: 'banned_words', label: '违禁词库' },
{ key: 'api_keys', label: 'API Key' },
];
export default function ConfigPage() {
const [activeTab, setActiveTab] = useState<TabKey>('products');
const [activeTab, setActiveTab] = useState<TabKey>('benchmarks');
return (
<div className="p-6 max-w-5xl">
<h2 className="text-xl font-bold text-text-primary mb-6"></h2>
<h2 className="text-xl font-bold text-text-primary mb-6"></h2>
{/* Tab 导航 */}
<div className="flex gap-1 border-b border-border-default mb-6" role="tablist">
@@ -48,10 +44,8 @@ export default function ConfigPage() {
{/* Tab 内容 */}
<div id={`panel-${activeTab}`} role="tabpanel">
{activeTab === 'products' && <ProductsTab />}
{activeTab === 'benchmarks' && <BenchmarksTab />}
{activeTab === 'banned_words' && <BannedWordsTab />}
{activeTab === 'api_keys' && <ApiKeysTab />}
</div>
</div>
);