feat(数据分析): 添加域名过滤功能并持久化存储

- 在评论、统计和访问分析页面添加域名过滤功能
- 使用localStorage持久化存储用户选择的域名过滤条件
- 新增30天访问趋势图表展示
- 优化API接口支持按域名过滤数据
- 添加每日访问统计记录功能
This commit is contained in:
anghunk
2026-01-21 22:35:59 +08:00
parent 73eaa975fe
commit 5d2cf49d96
7 changed files with 574 additions and 81 deletions

View File

@@ -86,6 +86,10 @@ export type CommentStatsResponse = {
export type VisitOverviewResponse = {
totalPv: number;
totalPages: number;
last30Days?: {
date: string;
total: number;
}[];
};
export type VisitPageItem = {
@@ -226,14 +230,32 @@ export function importComments(data: any[]): Promise<{ message: string }> {
return post<{ message: string }>('/admin/comments/import', data);
}
export function fetchCommentStats(): Promise<CommentStatsResponse> {
return get<CommentStatsResponse>('/admin/stats/comments');
export function fetchCommentStats(domain?: string): Promise<CommentStatsResponse> {
const searchParams = new URLSearchParams();
if (domain) {
searchParams.set('domain', domain);
}
const query = searchParams.toString();
const url = query ? `/admin/stats/comments?${query}` : '/admin/stats/comments';
return get<CommentStatsResponse>(url);
}
export function fetchVisitOverview(): Promise<VisitOverviewResponse> {
return get<VisitOverviewResponse>('/admin/analytics/overview');
export function fetchVisitOverview(domain?: string): Promise<VisitOverviewResponse> {
const searchParams = new URLSearchParams();
if (domain) {
searchParams.set('domain', domain);
}
const query = searchParams.toString();
const url = query ? `/admin/analytics/overview?${query}` : '/admin/analytics/overview';
return get<VisitOverviewResponse>(url);
}
export function fetchVisitPages(): Promise<VisitPagesResponse> {
return get<VisitPagesResponse>('/admin/analytics/pages');
export function fetchVisitPages(domain?: string): Promise<VisitPagesResponse> {
const searchParams = new URLSearchParams();
if (domain) {
searchParams.set('domain', domain);
}
const query = searchParams.toString();
const url = query ? `/admin/analytics/pages?${query}` : '/admin/analytics/pages';
return get<VisitPagesResponse>(url);
}