Files
anxinyan/admin-web/src/pages/content/shared.ts
wushumin edd1a02157 first
2026-05-11 15:28:27 +08:00

158 lines
5.7 KiB
TypeScript

import type { AdminContentHomeConfig, AdminContentMetaConfig, AdminContentPolicyConfig, AdminContentPolicyItem, AdminHelpArticleItem, AdminHelpArticlePayload } from "../../api/admin";
export type HomeSectionKey = "service_entries" | "quick_entries" | "trust_metrics" | "trust_points" | "faqs";
export type PolicySectionKey = "legal_entries" | "appraisal_agreements";
export type MetaSectionKey = "help_categories" | "report_risk_defaults" | "ticket_types" | "ticket_statuses" | "message_events";
export type ContentTabKey = "home" | "policy" | "meta" | "articles";
export type ArticleFormState = {
id?: number;
category: AdminHelpArticlePayload["category"];
title: string;
summary: string;
keywordsText: string;
contentBlocksText: string;
is_recommended: boolean;
is_enabled: boolean;
sort_order: number;
};
export const contentTabs: Array<{ key: ContentTabKey; label: string; desc: string; routeName: string }> = [
{ key: "home", label: "首页与主页面", desc: "Banner、主页面背景、服务入口和信任信息。", routeName: "content-home" },
{ key: "policy", label: "协议与说明", desc: "设置页说明入口和下单确认协议。", routeName: "content-policy" },
{ key: "meta", label: "分类与文案", desc: "帮助分类、消息事件、工单文案和风险提示。", routeName: "content-meta" },
{ key: "articles", label: "帮助文章", desc: "帮助中心文章正文、推荐状态和排序。", routeName: "content-articles" },
];
export const serviceProviderOptions = [
{ label: "实物鉴定", value: "anxinyan" },
{ label: "中检鉴定", value: "zhongjian" },
];
export const quickCodeOptions = [
{ label: "发起鉴定", value: "start" },
{ label: "我的订单", value: "orders" },
{ label: "我的报告", value: "reports" },
{ label: "消息中心", value: "messages" },
];
export const articleCategoryOptions = [
{ label: "服务流程", value: "service" },
{ label: "报告验真", value: "report" },
{ label: "寄送物流", value: "shipping" },
{ label: "售后支持", value: "support" },
];
export function createHomeConfig(): AdminContentHomeConfig {
return {
banners: [{ title: "", subtitle: "", description: "", background_image_url: "" }],
page_visuals: {
order_background_image_url: "",
report_background_image_url: "",
},
service_entries: [],
category_visuals: [],
quick_entries: [],
trust_metrics: [],
trust_points: [],
faqs: [],
};
}
export function normalizeHomeConfig(config?: Partial<AdminContentHomeConfig>): AdminContentHomeConfig {
const banners = config?.banners?.length ? config.banners : [{ title: "", subtitle: "", description: "", background_image_url: "" }];
const pageVisuals: Partial<AdminContentHomeConfig["page_visuals"]> = config?.page_visuals || {};
return {
banners: banners.map((item) => ({
title: item.title || "",
subtitle: item.subtitle || "",
description: item.description || "",
background_image_url: item.background_image_url || "",
})),
page_visuals: {
order_background_image_url: pageVisuals.order_background_image_url || "",
report_background_image_url: pageVisuals.report_background_image_url || "",
},
service_entries: config?.service_entries || [],
category_visuals: (config?.category_visuals || []).map((item) => ({
category_name: item.category_name || "",
category_code: item.category_code || "",
image_url: item.image_url || "",
})),
quick_entries: config?.quick_entries || [],
trust_metrics: config?.trust_metrics || [],
trust_points: config?.trust_points || [],
faqs: config?.faqs || [],
};
}
export function createPolicyItem(): AdminContentPolicyItem {
return {
code: "",
title: "",
desc: "",
target_url: "",
article_id: 0,
};
}
export function parseHelpArticleId(targetUrl?: string) {
if (!targetUrl) {
return 0;
}
const matched = targetUrl.match(/\/pages\/help\/detail\?id=(\d+)/);
return matched ? Number(matched[1] || 0) : 0;
}
export function normalizePolicyItems(items?: Partial<AdminContentPolicyItem>[]) {
return (items || []).map((item) => ({
code: item.code || "",
title: item.title || "",
desc: item.desc || "",
target_url: item.target_url || "",
article_id: Number(item.article_id || parseHelpArticleId(item.target_url) || 0),
}));
}
export function normalizePolicyConfig(config?: Partial<AdminContentPolicyConfig>): AdminContentPolicyConfig {
return {
legal_entries: normalizePolicyItems(config?.legal_entries),
appraisal_agreements: normalizePolicyItems(config?.appraisal_agreements),
};
}
export function normalizeMetaConfig(config?: Partial<AdminContentMetaConfig>): AdminContentMetaConfig {
return {
help_categories: config?.help_categories || [],
report_risk_defaults: config?.report_risk_defaults || [],
ticket_types: config?.ticket_types || [],
ticket_statuses: config?.ticket_statuses || [],
message_events: config?.message_events || [],
message_page_copy: config?.message_page_copy || {
title: "",
desc: "",
},
};
}
export function resetArticleForm(target: ArticleFormState, row?: AdminHelpArticleItem) {
target.id = row?.id;
target.category = row?.category || "service";
target.title = row?.title || "";
target.summary = row?.summary || "";
target.keywordsText = row?.keywords?.join("\n") || "";
target.contentBlocksText = row?.content_blocks?.join("\n") || "";
target.is_recommended = row?.is_recommended || false;
target.is_enabled = row ? row.is_enabled : true;
target.sort_order = row?.sort_order || 0;
}
export function parseLines(value: string) {
return value
.split("\n")
.map((item) => item.trim())
.filter(Boolean);
}