feat(imitation): add article imitation create flow

Introduce 仿写创作: new list and create views, backend imitation service
and prompt templates, worker task routing for imitation jobs, and one-click
rewrite triggers from question citation sources. Surface source article
URL/title on article list/detail, and restrict failed articles to delete-only.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-25 21:36:44 +08:00
parent 46d0a7aea0
commit 40d9a6cc63
29 changed files with 2678 additions and 120 deletions
@@ -3,6 +3,7 @@ import {
AppstoreOutlined,
CalendarOutlined,
ClockCircleOutlined,
CopyOutlined,
EditOutlined,
TeamOutlined,
ThunderboltOutlined,
@@ -24,7 +25,7 @@ const sourceLabel = computed(() =>
const createdAtLabel = computed(() => formatDateTime(props.createdAt));
const sourceVariant = computed<
"template" | "custom" | "instant" | "schedule" | "free-create" | "kol" | "default"
"template" | "custom" | "instant" | "schedule" | "free-create" | "imitation" | "kol" | "default"
>(() => {
if (props.sourceType === "template") {
return "template";
@@ -32,6 +33,9 @@ const sourceVariant = computed<
if (props.sourceType === "free_create") {
return "free-create";
}
if (props.sourceType === "imitation") {
return "imitation";
}
if (props.sourceType === "kol") {
return "kol";
}
@@ -59,6 +63,8 @@ const badgeIcon = computed<Component>(() => {
return ThunderboltOutlined;
case "free-create":
return EditOutlined;
case "imitation":
return CopyOutlined;
case "kol":
return TeamOutlined;
default:
@@ -133,6 +139,12 @@ const badgeIcon = computed<Component>(() => {
color: #18794e;
}
.article-source-meta__badge--imitation {
border: 1px solid #bfdbfe;
background: linear-gradient(180deg, #f8fbff 0%, #e6f0ff 100%);
color: #1d4ed8;
}
.article-source-meta__badge--kol {
border: 1px solid #d6e4ff;
background: linear-gradient(180deg, #f5f8ff 0%, #eaf1ff 100%);