更新website后端

This commit is contained in:
2026-09-15 00:08:36 +08:00
parent 7e6a3e969f
commit 9875832019
30 changed files with 1428 additions and 38 deletions
+84 -8
View File
@@ -1,7 +1,20 @@
/**
* 站点级公共配置:品牌、导航、页脚
* 后续接入后端 CMS 时,只需替换此处的数据来源即可。
*
* 站点信息的数据来源已切换为后端「官网管理 - 站点设置」(应用启动时由 loadSiteInfo 拉取),
* 与官网模板 themes/ 中使用的标签同源,括号内为对应标签:
* sitename 站点名称 {yz:sitename}
* logoDark 深色 Logo {yz:logo}
* logoLight 浅色 Logo {yz:logow}
* icp ICP 备案号 {yz:icp}
* policeIcp 公安备案号 {yz:policeicp}
* copyright 版权信息 {yz:copyright}
* privacy 隐私政策链接 {yz:privacy}
* terms 使用条款链接 {yz:terms}
* 后端未返回的字段保留文件内默认值。
*/
import { computed, reactive } from "vue";
import { fetchSiteSetting } from "@/api/site";
export interface NavItem {
label: string;
@@ -13,7 +26,7 @@ export interface FooterColumn {
links: NavItem[];
}
export const siteInfo = {
export const siteInfo = reactive({
brandMark: "YZ",
brandName: "云泽科技",
brandSub: "YUNZER TECH",
@@ -25,7 +38,63 @@ export const siteInfo = {
postalCode: "100193",
copyright:
"COPYRIGHT (C) 2026 YUNZER TECHNOLOGY CO., LTD. ALL RIGHTS RESERVED.",
};
// ↓↓↓ 以下字段由「官网管理 - 站点设置」下发(对应官网模板标签) ↓↓↓
/** {yz:sitename} 站点名称 */
sitename: "",
/** {yz:subtitle} 副标题 */
subtitle: "",
/** {yz:logo} 深色 Logo,用于浅色背景(页头) */
logoDark: "",
/** {yz:logow} 浅色 Logo,用于深色背景(页脚) */
logoLight: "",
/** {yz:icp} ICP 备案号 */
icp: "",
/** {yz:policeicp} 公安备案号 */
policeIcp: "",
/** {yz:privacy} 隐私政策链接 */
privacy: "",
/** {yz:terms} 使用条款链接 */
terms: "",
});
/**
* 站点设置标签值:key 就是模板标签名,与后端 {yz:xxx} 完全一致
* 供 v-yz 指令解析(<p v-yz>{yz:icp}</p>),未配置或后端未返回时输出空字符串
*/
export const siteTags = reactive<Record<string, string>>({});
/**
* 拉取站点设置并回填 siteInfo(应用启动时调用一次)。
* 接口异常时静默处理,页面继续使用默认配置。
*/
export async function loadSiteInfo(): Promise<void> {
const data = await fetchSiteSetting();
if (!data) return;
// {yz:sitename} → 页头品牌名
if (data.sitename) {
siteInfo.sitename = data.sitename;
siteInfo.brandName = data.sitename;
}
if (data.subtitle) siteInfo.subtitle = data.subtitle;
if (data.logo) siteInfo.logoDark = data.logo;
if (data.logow) siteInfo.logoLight = data.logow;
// 公司信息:站点设置里有值就覆盖本地默认(页脚联系栏、页脚品牌全称),没填则保留默认
if (data.companyname) siteInfo.fullName = data.companyname;
if (data.phone) siteInfo.phone = data.phone;
if (data.email) siteInfo.email = data.email;
if (data.address) siteInfo.address = data.address;
if (data.icp) siteInfo.icp = data.icp;
if (data.policeicp) siteInfo.policeIcp = data.policeicp;
if (data.copyright) siteInfo.copyright = data.copyright;
if (data.privacy) siteInfo.privacy = data.privacy;
if (data.terms) siteInfo.terms = data.terms;
// 标签值:直接以接口返回的「标签名 -> 值」为准(v-yz 指令解析用)。
// 数据驱动:表里新增的设置项会自动进入 siteTags,模板里写 {yz:新tag} 即可,无需改代码。
Object.assign(siteTags, data);
}
/** 顶部工具条链接 */
export const utilityLinks: NavItem[] = [
@@ -65,9 +134,16 @@ export const footerColumns: FooterColumn[] = [
},
];
/** 页脚底部合规链接 */
export const policyLinks: NavItem[] = [
{ label: "隐私政策", path: "/policy/privacy" },
{ label: "使用条款", path: "/policy/terms" },
/**
* 页脚底部合规链接
* 隐私政策 {yz:privacy} / 使用条款 {yz:terms} 取自站点设置,未配置时回退站内默认页面
*/
export const policyLinks = computed<NavItem[]>(() => [
{ label: "隐私政策", path: siteInfo.privacy || "/policy/privacy" },
{ label: "使用条款", path: siteInfo.terms || "/policy/terms" },
{ label: "网站地图", path: "/policy/sitemap" },
];
]);
/** 是否为站外链接(站点设置里可能填完整 URL) */
export const isExternalLink = (path: string): boolean =>
/^https?:\/\//i.test(path);