上线版: 产品表单统一+form嵌套修复+用户管理+部署+三套叙事

- 产品编辑入口统一走 ProductFormFull(卖点/风格/人群/品牌词全字段);
  修复开任务页 <form> 套 <form> 致"编辑产品"报错、改不了、跳回首个产品
- dashboard 入口卡片对齐实际路由: 系统管理(/config) 与 工作配置(/settings) 分开;
  settings ?tab=products 直达改用挂载后读 URL, 消除 hydration mismatch
- 新增用户管理(users API/admin service/改密页) + alembic 022/023/024
- 上线部署: Dockerfile / docker-compose.prod+https / nginx https / .env.example
- A8 三套正交叙事(痛点/场景/成分背书) + beige 调色去AI化 + 飞轮 text_import 高权重信号

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
yangqianqian
2026-06-30 18:08:13 +08:00
parent a77212781c
commit df1856d793
150 changed files with 8616 additions and 1765 deletions

View File

@@ -13,6 +13,7 @@ interface ReviewCardProps {
}
export function ReviewCard({ item, onApprove, onReject }: ReviewCardProps) {
const sets = item.selected_sets?.filter((s) => s.selected_text || s.selected_images.length) ?? [];
return (
<article
className="border border-border-default rounded-xl bg-surface-primary p-4"
@@ -26,22 +27,57 @@ export function ReviewCard({ item, onApprove, onReject }: ReviewCardProps) {
<span className="text-xs text-text-secondary">{item.operator_name}</span>
</div>
<h3 className="font-medium text-text-primary text-sm line-clamp-1">{item.theme}</h3>
{item.selected_text && (
{sets.length === 0 && item.selected_text && (
<p className="text-xs text-text-secondary mt-1 line-clamp-2">
{item.selected_text.content}
</p>
)}
{/* 质量分:审核可判断(C2)。合格线80=红线,不用组件默认85 */}
{item.selected_text?.score && (
{sets.length === 0 && item.selected_text?.score && (
<ScoreDimBars score={item.selected_text.score} passLine={80} />
)}
</div>
{item.selected_image && (
{sets.length === 0 && item.selected_image && (
<img src={item.selected_image.url} alt="已选图预览"
className="w-16 h-16 rounded-lg object-cover flex-shrink-0" />
)}
</div>
{sets.length > 0 && (
<div className="mt-4 grid gap-3">
{sets.map((set) => (
<section key={set.strategy} className="rounded-lg border border-border-default p-3">
<div className="mb-2 flex items-center justify-between gap-3">
<span className="text-xs font-semibold text-brand-orange">{set.strategy}</span>
<span className="text-xs text-text-tertiary">{set.selected_images.length} </span>
</div>
{set.selected_text && (
<>
<p className="text-xs text-text-secondary line-clamp-2">
{set.selected_text.content}
</p>
{set.selected_text.score && (
<ScoreDimBars score={set.selected_text.score} passLine={80} />
)}
</>
)}
{set.selected_images.length > 0 && (
<div className="mt-2 flex gap-2 overflow-x-auto">
{set.selected_images.filter(Boolean).map((img) => (
<img
key={img!.candidate_id}
src={img!.url}
alt={`${set.strategy}已选图`}
className="h-16 w-12 flex-shrink-0 rounded-md object-cover"
/>
))}
</div>
)}
</section>
))}
</div>
)}
{/* 操作栏 — 飞轮最强信号 */}
<div className="flex gap-3 mt-4 pt-4 border-t border-border-default">
<button onClick={onApprove}