diff --git a/cwd-admin/src/api/admin.ts b/cwd-admin/src/api/admin.ts index 5d86a8c..826f8ac 100644 --- a/cwd-admin/src/api/admin.ts +++ b/cwd-admin/src/api/admin.ts @@ -93,8 +93,13 @@ export function logoutAdmin(): void { localStorage.removeItem('cwd_admin_token'); } -export function fetchComments(page: number): Promise { - return get(`/admin/comments/list?page=${page}`); +export function fetchComments(page: number, domain?: string): Promise { + const searchParams = new URLSearchParams(); + searchParams.set('page', String(page)); + if (domain) { + searchParams.set('domain', domain); + } + return get(`/admin/comments/list?${searchParams.toString()}`); } export function deleteComment(id: number): Promise<{ message: string }> { diff --git a/cwd-admin/src/views/CommentsView.vue b/cwd-admin/src/views/CommentsView.vue index 273b0a2..05f6255 100644 --- a/cwd-admin/src/views/CommentsView.vue +++ b/cwd-admin/src/views/CommentsView.vue @@ -9,6 +9,12 @@ +
@@ -191,6 +197,7 @@ import { CommentItem, CommentListResponse, fetchComments, + fetchCommentStats, deleteComment, updateCommentStatus, blockIp, @@ -205,8 +212,11 @@ const pagination = ref<{ page: number; total: number }>({ page: 1, total: 1 }); const loading = ref(false); const error = ref(""); const statusFilter = ref(""); +const domainFilter = ref(""); const jumpPageInput = ref(""); +const domainOptions = ref([]); + const filteredComments = computed(() => { if (!statusFilter.value) { return comments.value; @@ -263,7 +273,7 @@ async function loadComments(page?: number) { loading.value = true; error.value = ""; try { - const res = await fetchComments(targetPage); + const res = await fetchComments(targetPage, domainFilter.value || undefined); comments.value = res.data; pagination.value = { page: res.pagination.page, total: res.pagination.total }; } catch (e: any) { @@ -280,6 +290,11 @@ function updateRoutePage(page: number) { } else { query.p = String(page); } + if (domainFilter.value) { + query.domain = domainFilter.value; + } else { + delete query.domain; + } router.push({ query }); } @@ -370,6 +385,20 @@ onMounted(() => { initialPage = Math.floor(value); } } + const d = route.query.domain; + if (typeof d === "string" && d.trim()) { + domainFilter.value = d.trim(); + } + + fetchCommentStats() + .then((res: CommentListResponse | any) => { + const domains = Array.isArray(res.domains) ? res.domains.map((item: any) => item.domain) : []; + domainOptions.value = Array.from(new Set(domains)); + }) + .catch(() => { + domainOptions.value = []; + }); + loadComments(initialPage); }); diff --git a/cwd-admin/src/views/StatsView.vue b/cwd-admin/src/views/StatsView.vue index fdc076a..b09eb16 100644 --- a/cwd-admin/src/views/StatsView.vue +++ b/cwd-admin/src/views/StatsView.vue @@ -9,15 +9,6 @@ {{ toastMessage }}
-
-

最近 7 天评论数趋势

-
加载中...
-
{{ statsError }}
-
-
-
-
-

整体概览

加载中...
@@ -30,7 +21,9 @@
已通过
-
{{ statsSummary.approved }}
+
+ {{ statsSummary.approved }} +
待审核
@@ -38,12 +31,23 @@
已拒绝
-
{{ statsSummary.rejected }}
+
+ {{ statsSummary.rejected }} +
+
+

最近 7 天评论数趋势

+
加载中...
+
{{ statsError }}
+
+
+
+
+

按域名统计

加载中...
diff --git a/cwd-api/src/api/admin/listComments.ts b/cwd-api/src/api/admin/listComments.ts index 53b3a35..1186477 100644 --- a/cwd-api/src/api/admin/listComments.ts +++ b/cwd-api/src/api/admin/listComments.ts @@ -9,14 +9,27 @@ export const listComments = async (c: Context<{ Bindings: Bindings }>) => { const limit = 10; const offset = (page - 1) * limit; + const rawDomain = c.req.query('domain') || ''; + const domain = rawDomain.trim(); + + let whereSql = ''; + const params: (string | number)[] = []; + if (domain) { + const pattern = `%://${domain}/%`; + whereSql = 'WHERE post_slug LIKE ? OR url LIKE ?'; + params.push(pattern, pattern); + } + const totalCount = await c.env.CWD_DB.prepare( - 'SELECT COUNT(*) as count FROM Comment' - ).first<{ count: number }>(); + `SELECT COUNT(*) as count FROM Comment ${whereSql}` + ) + .bind(...params) + .first<{ count: number }>(); const { results } = await c.env.CWD_DB.prepare( - 'SELECT * FROM Comment ORDER BY created DESC LIMIT ? OFFSET ?' + `SELECT * FROM Comment ${whereSql} ORDER BY created DESC LIMIT ? OFFSET ?` ) - .bind(limit, offset) + .bind(...params, limit, offset) .all(); await c.env.CWD_DB.prepare( diff --git a/docs/guide/update-version.md b/docs/guide/update-version.md index 2729ae6..5dc9427 100644 --- a/docs/guide/update-version.md +++ b/docs/guide/update-version.md @@ -20,6 +20,9 @@ npm run deploy 如果使用官方后台不需要更新。 +> [!WARNING] +> 存在一个弊端,如果官方后台版本有了大更新,而你部署的 api 端没有及时更新部署,可能会导致管理后台无法正常使用(无法获取到最新的接口),正常情况下无需担心。 + ``` cd cwd-admin npm install