diff --git a/platform/frontend/admin.html b/platform/frontend/admin.html
index 33ce0fc..1937f6e 100644
--- a/platform/frontend/admin.html
+++ b/platform/frontend/admin.html
@@ -33,6 +33,7 @@
AI 助手
搜索API
搜索排名
+ GEO 就绪度
配置管理
@@ -655,6 +656,70 @@
+
🔒 敏感词
@@ -1332,6 +1397,30 @@ const llmConfigs = ref([]);
finally { rankingsLoading.value = false; }
};
+ const geoOverview = ref({ total_geo_checks: 0, total_cited: 0, citation_rate: 0, avg_geo_readiness: 0, engine_breakdown: {} });
+ const geoReadinessScores = ref([]);
+ const geoLoading = ref(false);
+ const geoTracking = ref(false);
+ const loadGeoData = async () => {
+ geoLoading.value = true;
+ try {
+ const overview = await api.get('/api/seo/geo/overview');
+ geoOverview.value = overview.data || { total_geo_checks: 0, total_cited: 0, citation_rate: 0, avg_geo_readiness: 0, engine_breakdown: {} };
+ const scores = await api.get('/api/seo/geo/readiness?limit=50');
+ geoReadinessScores.value = scores.data || [];
+ } catch (e) { console.error('加载 GEO 数据失败:', e); }
+ finally { geoLoading.value = false; }
+ };
+ const triggerGeoTrack = async () => {
+ geoTracking.value = true;
+ try {
+ const r = await api.post('/api/seo/geo/track');
+ ElMessage.success('GEO 追踪完成');
+ await loadGeoData();
+ } catch (e) { ElMessage.error('GEO 追踪失败: ' + e.message); }
+ finally { geoTracking.value = false; }
+ };
+
const contentCleanRules = ref([]);
const ccrLoading = ref(false);
const ccrDialogVisible = ref(false);
@@ -1382,6 +1471,7 @@ const llmConfigs = ref([]);
logs: loadLogTypes, orgs: loadOrgs, roles: loadRoles, menus: loadMenus, assistant: loadAssistantConfig,
searchproviders: loadSearchProviders,
searchrankings: loadRankings,
+ geo: loadGeoData,
configitems: () => { loadSensitiveWords(); loadContentCleanRules(); },
};
const loadedTabs = new Set([]);
@@ -1442,6 +1532,7 @@ const llmConfigs = ref([]);
contentCleanRules, ccrLoading, ccrDialogVisible, ccrDialogTitle, ccrSaving, ccrForm, editingCcrId,
loadContentCleanRules, showAddCleanRule, editCleanRule, saveCleanRule, deleteCleanRule,
rankings, rankingStats, rankingsLoading, loadRankings,
+ geoOverview, geoReadinessScores, geoLoading, geoTracking, loadGeoData, triggerGeoTrack,
};
}
});