refactor: 移除域名列表接口并统一为站点列表接口
- 移除独立的 `/admin/stats/domains` 接口及相关文档 - 将原 `fetchDomainList` 重命名为 `fetchSiteList`,统一站点获取逻辑 - 优化后台界面中的站点显示,为空站点显示“默认站点 (Default)” - 移除设置页面中的“站点管理”选项卡,简化后台功能结构 - 保持 `/admin/stats/sites` 接口功能不变,作为统一的站点数据源
This commit is contained in:
@@ -13,9 +13,13 @@
|
||||
<div class="layout-actions-wrapper">
|
||||
<div class="layout-domain-filter layout-domain-filter-header">
|
||||
<select v-model="currentSiteId" class="layout-domain-select">
|
||||
<option value="default">所有站点</option>
|
||||
<option v-for="item in siteOptions" :key="item.value" :value="item.value">
|
||||
{{ item.label }}
|
||||
<option :value="defaultSiteId">{{ getSiteLabel(defaultSiteId) }}</option>
|
||||
<option
|
||||
v-for="item in siteOptions"
|
||||
:key="item.value"
|
||||
:value="item.value"
|
||||
>
|
||||
{{ getSiteLabel(item.value) }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
@@ -71,9 +75,13 @@
|
||||
>
|
||||
<div class="layout-sider-domain-filter">
|
||||
<select v-model="currentSiteId" class="layout-domain-select">
|
||||
<option value="default">所有站点</option>
|
||||
<option v-for="item in siteOptions" :key="item.value" :value="item.value">
|
||||
{{ item.label }}
|
||||
<option :value="defaultSiteId">{{ getSiteLabel(defaultSiteId) }}</option>
|
||||
<option
|
||||
v-for="item in siteOptions"
|
||||
:key="item.value"
|
||||
:value="item.value"
|
||||
>
|
||||
{{ getSiteLabel(item.value) }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
@@ -173,7 +181,7 @@
|
||||
<script setup lang="ts">
|
||||
import { ref, onMounted, provide, computed } from "vue";
|
||||
import { useRouter, useRoute } from "vue-router";
|
||||
import { logoutAdmin, fetchSiteList, fetchAdminDisplaySettings } from "../../api/admin";
|
||||
import { logoutAdmin, fetchAdminDisplaySettings, fetchSiteList } from "../../api/admin";
|
||||
import { useTheme } from "../../composables/useTheme";
|
||||
import { useSite } from "../../composables/useSite";
|
||||
import packageJson from "../../../package.json";
|
||||
@@ -209,15 +217,23 @@ function cycleTheme() {
|
||||
|
||||
type SiteOption = { label: string; value: string };
|
||||
const siteOptions = ref<SiteOption[]>([]);
|
||||
const defaultSiteId = "";
|
||||
|
||||
function getSiteLabel(value: string) {
|
||||
if (!value) {
|
||||
return "默认站点 (Default)";
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
async function loadSites() {
|
||||
try {
|
||||
const res = await fetchSiteList();
|
||||
const sites = Array.isArray(res.sites) ? res.sites : [];
|
||||
|
||||
siteOptions.value = sites.map(s => ({
|
||||
label: s === '' ? '默认站点 (Default)' : s,
|
||||
value: s
|
||||
const unique = Array.from(new Set(sites));
|
||||
siteOptions.value = unique.filter((s) => s !== "").map((s) => ({
|
||||
label: s,
|
||||
value: s,
|
||||
}));
|
||||
} catch {
|
||||
siteOptions.value = [];
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
@dragstart="onDragStart($event, domain, 'visible')"
|
||||
@dblclick="moveToHidden(domain)"
|
||||
>
|
||||
<span class="domain-text">{{ domain }}</span>
|
||||
<span class="domain-text">{{ getSiteLabel(domain) }}</span>
|
||||
<button class="move-btn" @click="moveToHidden(domain)" title="移出">
|
||||
<PhArrowRight :size="16" />
|
||||
</button>
|
||||
@@ -74,7 +74,7 @@
|
||||
<button class="move-btn" @click="moveToVisible(domain)" title="移入">
|
||||
<PhArrowLeft :size="16" />
|
||||
</button>
|
||||
<span class="domain-text">{{ domain }}</span>
|
||||
<span class="domain-text">{{ getSiteLabel(domain) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -90,7 +90,7 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, onMounted, computed } from 'vue';
|
||||
import { fetchDomainList, fetchFeatureSettings, saveFeatureSettings } from '../../../api/admin';
|
||||
import { fetchSiteList, fetchFeatureSettings, saveFeatureSettings } from '../../../api/admin';
|
||||
|
||||
const loading = ref(false);
|
||||
const allDomains = ref<string[]>([]);
|
||||
@@ -101,14 +101,21 @@ const hiddenList = computed(() => {
|
||||
return allDomains.value.filter(d => !visibleSet.has(d));
|
||||
});
|
||||
|
||||
function getSiteLabel(value: string) {
|
||||
if (!value) {
|
||||
return '默认站点 (Default)';
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
async function loadData() {
|
||||
try {
|
||||
const [domainRes, settingsRes] = await Promise.all([
|
||||
fetchDomainList(),
|
||||
const [siteRes, settingsRes] = await Promise.all([
|
||||
fetchSiteList(),
|
||||
fetchFeatureSettings()
|
||||
]);
|
||||
|
||||
allDomains.value = domainRes.domains || [];
|
||||
allDomains.value = siteRes.sites || [];
|
||||
if (settingsRes.visibleDomains) {
|
||||
visibleList.value = settingsRes.visibleDomains;
|
||||
} else {
|
||||
|
||||
@@ -35,14 +35,6 @@
|
||||
>
|
||||
后台显示
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
class="settings-tab"
|
||||
:class="{ 'settings-tab-active': activeTab === 'site' }"
|
||||
@click="activeTab = 'site'"
|
||||
>
|
||||
站点管理
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
class="settings-tab"
|
||||
@@ -238,16 +230,6 @@
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-else-if="activeTab === 'site'">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<div class="card-title">站点列表管理</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<SiteManager />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-else-if="activeTab === 'emailNotify'">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
@@ -487,17 +469,15 @@ import {
|
||||
fetchEmailNotifySettings,
|
||||
saveEmailNotifySettings,
|
||||
sendTestEmail,
|
||||
fetchFeatureSettings,
|
||||
saveFeatureSettings,
|
||||
fetchAdminDisplaySettings,
|
||||
saveAdminDisplaySettings,
|
||||
fetchFeatureSettings,
|
||||
saveFeatureSettings,
|
||||
fetchAdminDisplaySettings,
|
||||
saveAdminDisplaySettings,
|
||||
fetchTelegramSettings,
|
||||
saveTelegramSettings,
|
||||
setupTelegramWebhook,
|
||||
sendTelegramTestMessage,
|
||||
} from "../../api/admin";
|
||||
|
||||
import SiteManager from "./components/SiteManager.vue";
|
||||
import TagInput from "../../components/TagInput.vue";
|
||||
|
||||
const DEFAULT_REPLY_TEMPLATE = `<div style="background-color:#f4f4f5;padding:24px 0;">
|
||||
@@ -606,15 +586,13 @@ type TabKey =
|
||||
| "feature"
|
||||
| "display"
|
||||
| "emailNotify"
|
||||
| "telegramNotify"
|
||||
| "site";
|
||||
| "telegramNotify";
|
||||
const validTabs: TabKey[] = [
|
||||
"comment",
|
||||
"feature",
|
||||
"display",
|
||||
"emailNotify",
|
||||
"telegramNotify",
|
||||
"site",
|
||||
];
|
||||
|
||||
const activeTab = ref<TabKey>(
|
||||
|
||||
Reference in New Issue
Block a user