Scert/frontend/src/views/DNSAccounts/DNSAccounts.js
xuans 07f86f1413 权限整改:完善 DNS 项目归属展示与进度清单
补充 DNS 账户管理页面的项目归属展示和权限拒绝回归测试,更新四份中文整改进度清单,保持总体验收位置为 P0-03 完成待复审。
2026-09-29 19:27:24 +08:00

66 lines
2.4 KiB
JavaScript

import { computed, onBeforeUnmount, onMounted, ref } from "vue";
export function dnsVerificationLabel(item) {
if (item.credential_state === "unavailable") return "凭据不可读取";
if (item.credential_state === "invalid") return "凭据配置不完整";
return item.verification_state === "verified" ? "已验证" : "待验证";
}
export function dnsProjectLabel(item) {
const projectID = typeof item?.project_id === "string" ? item.project_id.trim() : "";
return projectID === "" || projectID === "default" ? "默认项目" : projectID;
}
export function useDNSAccounts() {
const accounts = ref([]);
const loading = ref(false);
const error = ref("");
const pageSize = ref(10);
const page = ref(1);
const pageCount = computed(() => Math.max(1, Math.ceil(accounts.value.length / pageSize.value)));
const visibleAccounts = computed(() => accounts.value.slice((page.value - 1) * pageSize.value, page.value * pageSize.value));
let requestVersion = 0;
let controller;
async function loadAccounts() {
const version = ++requestVersion;
controller?.abort();
controller = new AbortController();
loading.value = true;
error.value = "";
accounts.value = [];
page.value = 1;
try {
const response = await fetch("/api/v1/dns/accounts", {
credentials: "include",
cache: "no-store",
signal: controller.signal,
});
if (response.status === 401) throw new Error("登录会话已过期,请重新登录");
if (response.status === 403) throw new Error("当前账号没有查看 DNS 账户的权限");
if (!response.ok) throw new Error("DNS 账户加载失败,请稍后重试");
const data = await response.json();
if (!Array.isArray(data.items) || !data.items.every((item) => item && typeof item.id === "string")) {
throw new Error("DNS 账户响应格式不正确,请刷新重试");
}
if (version === requestVersion) accounts.value = data.items;
} catch (reason) {
if (version === requestVersion) error.value = reason.message || "DNS 账户加载失败,请稍后重试";
} finally {
if (version === requestVersion) loading.value = false;
}
}
function changePageSize() {
page.value = 1;
}
onMounted(loadAccounts);
onBeforeUnmount(() => {
requestVersion += 1;
controller?.abort();
});
return { accounts, loading, error, pageSize, page, pageCount, visibleAccounts, loadAccounts, changePageSize };
}