158 lines
5.7 KiB
TypeScript
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);
|
|
}
|