feat: 实现多站点数据隔离和管理功能

- 新增站点管理功能,替换原有的域名管理
- 添加数据库迁移工具,为现有表增加 site_id 字段
- 创建 useSite 组合式 API 统一管理站点状态
- 修改前后端 API 以支持站点筛选参数
- 更新管理界面,将域名筛选改为站点筛选
- 优化数据导出功能,支持按站点筛选导出
- 更新文档,调整站点 ID 默认值为空字符串
- 升级 wrangler 依赖至最新版本
This commit is contained in:
anghunk
2026-02-09 15:31:47 +08:00
parent 3b429bf82c
commit 098d668a15
22 changed files with 431 additions and 412 deletions

View File

@@ -224,6 +224,7 @@ import {
fetchLikeStats,
type LikeStatsItem,
} from "../../api/admin";
import { useSite } from "../../composables/useSite";
const loading = ref(false);
const listLoading = ref(false);
@@ -240,6 +241,8 @@ const overview = ref<VisitOverviewResponse>({
last30Days: [],
});
const { currentSiteId } = useSite();
function calculateChange(current: number, previous: number) {
if (previous === 0) {
return current > 0 ? 100 : 0;
@@ -271,8 +274,6 @@ const visitTab = ref<"pv" | "latest">("pv");
const visitTabStorageKey = "cwd-analytics-visit-tab";
const chartRangeStorageKey = "cwd-analytics-visit-chart-range";
const injectedDomainFilter = inject<Ref<string> | null>("domainFilter", null);
const domainFilter = injectedDomainFilter ?? ref("");
const last30Days = ref<{ date: string; total: number }[]>([]);
const likeStatsItems = ref<LikeStatsItem[]>([]);
const chartRange = ref<"7" | "30">("7");
@@ -424,7 +425,7 @@ async function loadData() {
listLoading.value = true;
error.value = "";
try {
const domain = domainFilter.value || undefined;
const domain = currentSiteId.value;
const order = getVisitOrderParam();
const [overviewRes, pagesRes, likeStatsRes] = await Promise.all([
fetchVisitOverview(domain),
@@ -589,7 +590,7 @@ onBeforeUnmount(() => {
}
});
watch(domainFilter, () => {
watch(currentSiteId, () => {
loadData();
});
</script>