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;
}
}