diff --git a/src/pages/user/component/UserAgreement.vue b/src/pages/user/component/UserAgreement.vue index 6bc6dd1..4c17d8c 100644 --- a/src/pages/user/component/UserAgreement.vue +++ b/src/pages/user/component/UserAgreement.vue @@ -23,18 +23,18 @@ >
@@ -64,30 +64,14 @@ import { ArticleAPI, AttachmentAPI, SettingAPI, type Article } from "timi-web-ap import { ArticleView } from "timi-tdesign-mobile"; import { getErrorMessage } from "@/utils/error"; -type AgreementCode = "SERVICE_LICENSE" | "PRIVACY_LICENSE" | "OPEN_SOURCE_LICENSE"; type AgreementItem = { - code: AgreementCode; + id: string; title: string; article?: Article; errorMessage?: string; loading: boolean; }; -const baseAgreementList: Array> = [ - { - code: "SERVICE_LICENSE", - title: "服务协议" - }, - { - code: "PRIVACY_LICENSE", - title: "隐私协议" - }, - { - code: "OPEN_SOURCE_LICENSE", - title: "开源软件协议" - } -]; - defineOptions({ name: "UserAgreement" }); @@ -103,17 +87,47 @@ const emit = defineEmits<{ }>(); const dialogVisible = ref(false); -const agreementList = ref(createAgreementList()); -const activeAgreementCode = ref("SERVICE_LICENSE"); +const agreementList = ref([]); +const activeAgreementId = ref(""); -function createAgreementList(): AgreementItem[] { - return baseAgreementList.map(item => ({ +function normalizeAgreementItem(value: unknown): Pick | undefined { + if (!value || typeof value !== "object") { + return undefined; + } + const source = value as Record; + const id = typeof source.id === "string" ? source.id.trim() : ""; + const title = typeof source.title === "string" ? source.title.trim() : ""; + if (!id || !title) { + return undefined; + } + return { id, title }; +} + +function parseAgreementList(value?: string): Array> { + if (!value?.trim()) { + return []; + } + try { + const sourceList: unknown = JSON.parse(value); + if (!Array.isArray(sourceList)) { + return []; + } + return sourceList + .map(item => normalizeAgreementItem(item)) + .filter((item): item is Pick => !!item); + } catch { + return []; + } +} + +function createAgreementList(list: Array>): AgreementItem[] { + return list.map(item => ({ ...item, loading: false })); } -function handleCheckboxChange(checked: boolean): void { +async function handleCheckboxChange(checked: boolean): Promise { if (!checked) { emit("update:modelValue", false); return; @@ -121,19 +135,21 @@ function handleCheckboxChange(checked: boolean): void { emit("update:modelValue", false); dialogVisible.value = true; - activeAgreementCode.value = "SERVICE_LICENSE"; - void loadAgreements(); + activeAgreementId.value = ""; + await loadAgreements(); } async function loadAgreements(): Promise { - agreementList.value = createAgreementList().map(item => ({ - ...item, - loading: true - })); try { - const settingMap = await SettingAPI.map("GAO_SYSTEM"); + const settingMap = await SettingAPI.map("GAO_SYSTEM", undefined, ["AGREEMENT"]); + const configuredAgreementList = parseAgreementList(settingMap.AGREEMENT?.value); + agreementList.value = createAgreementList(configuredAgreementList).map(item => ({ + ...item, + loading: true + })); + activeAgreementId.value = configuredAgreementList[0]?.id || ""; agreementList.value = await Promise.all(agreementList.value.map(async item => { - const articleId = settingMap[item.code]?.value?.trim(); + const articleId = item.id; if (!articleId) { return { ...item, @@ -158,11 +174,13 @@ async function loadAgreements(): Promise { })); } catch (error) { const errorMessage = getErrorMessage(error, "协议配置加载失败"); - agreementList.value = createAgreementList().map(item => ({ - ...item, + agreementList.value = [{ + id: "AGREEMENT_ERROR", + title: "用户协议", loading: false, errorMessage - })); + }]; + activeAgreementId.value = "AGREEMENT_ERROR"; } } @@ -247,12 +265,8 @@ function agreeAgreement(): void { overflow-y: auto; } - :deep(.t-tabs__scroll) { - overflow-x: hidden; - } - :deep(.t-tabs__item) { - padding: 0; + padding: 0 .5rem; font-size: .75rem; } }