Files
cwd/cwd-admin/src/api/admin.ts
anghunk 0c327864d7 feat(评论管理): 添加评论地址字段并改进状态选择方式
在评论管理功能中新增postSlug字段,用于存储评论所属文章的地址
将状态切换按钮改为下拉选择框,提升用户体验
同时调整了相关字体大小和样式
2026-01-21 17:38:36 +08:00

212 lines
5.0 KiB
TypeScript

import { get, post, put, del } from './http';
export type AdminLoginResponse = {
data: {
key: string;
};
};
export type CommentItem = {
id: number;
created: number;
name: string;
email: string;
avatar: string;
postSlug: string;
url: string | null;
ipAddress: string | null;
contentText: string;
contentHtml: string;
status: string;
ua?: string | null;
};
export type CommentListResponse = {
data: CommentItem[];
pagination: {
page: number;
limit: number;
total: number;
};
};
export type AdminEmailResponse = {
email: string | null;
};
export type CommentSettingsResponse = {
adminEmail: string | null;
adminBadge: string | null;
avatarPrefix: string | null;
adminEnabled: boolean;
allowedDomains?: string[];
adminKey?: string | null;
adminKeySet?: boolean;
requireReview?: boolean;
blockedIps?: string[];
blockedEmails?: string[];
};
export type EmailNotifySettingsResponse = {
globalEnabled: boolean;
smtp?: {
host: string;
port: number;
user: string;
pass: string;
secure: boolean;
};
templates?: {
reply?: string;
admin?: string;
};
};
export type CommentStatsResponse = {
summary: {
total: number;
approved: number;
pending: number;
rejected: number;
};
domains: {
domain: string;
total: number;
approved: number;
pending: number;
rejected: number;
}[];
last7Days: {
date: string;
total: number;
}[];
};
export async function loginAdmin(name: string, password: string): Promise<string> {
const res = await post<AdminLoginResponse>('/admin/login', { name, password });
const key = res.data.key;
localStorage.setItem('cwd_admin_token', key);
return key;
}
export function logoutAdmin(): void {
localStorage.removeItem('cwd_admin_token');
}
export function fetchComments(page: number, domain?: string): Promise<CommentListResponse> {
const searchParams = new URLSearchParams();
searchParams.set('page', String(page));
if (domain) {
searchParams.set('domain', domain);
}
return get<CommentListResponse>(`/admin/comments/list?${searchParams.toString()}`);
}
export function deleteComment(id: number): Promise<{ message: string }> {
return del<{ message: string }>(`/admin/comments/delete?id=${id}`);
}
export function updateCommentStatus(id: number, status: string): Promise<{ message: string }> {
return put<{ message: string }>(`/admin/comments/status?id=${id}&status=${encodeURIComponent(status)}`);
}
export function updateComment(data: {
id: number;
name: string;
email: string;
url?: string | null;
postSlug?: string;
contentText: string;
status?: string;
}): Promise<{ message: string }> {
return put<{ message: string }>('/admin/comments/update', {
id: data.id,
name: data.name,
email: data.email,
url: data.url ?? null,
postSlug: data.postSlug,
content: data.contentText,
status: data.status
});
}
export function fetchAdminEmail(): Promise<AdminEmailResponse> {
return get<AdminEmailResponse>('/admin/settings/email');
}
export function saveAdminEmail(email: string): Promise<{ message: string }> {
return put<{ message: string }>('/admin/settings/email', { email });
}
export function fetchEmailNotifySettings(): Promise<EmailNotifySettingsResponse> {
return get<EmailNotifySettingsResponse>('/admin/settings/email-notify');
}
export function saveEmailNotifySettings(data: {
globalEnabled?: boolean;
smtp?: {
host?: string;
port?: number;
user?: string;
pass?: string;
secure?: boolean;
};
templates?: {
reply?: string;
admin?: string;
};
}): Promise<{ message: string }> {
return put<{ message: string }>('/admin/settings/email-notify', data);
}
export function sendTestEmail(data: {
toEmail: string;
smtp?: {
host?: string;
port?: number;
user?: string;
pass?: string;
secure?: boolean;
};
}): Promise<{ message: string }> {
return post<{ message: string }>('/admin/settings/email-test', data);
}
export function fetchCommentSettings(): Promise<CommentSettingsResponse> {
return get<CommentSettingsResponse>('/admin/settings/comments');
}
export function saveCommentSettings(data: {
adminEmail?: string;
adminBadge?: string;
avatarPrefix?: string;
adminEnabled?: boolean;
allowedDomains?: string[];
adminKey?: string;
requireReview?: boolean;
blockedIps?: string[];
blockedEmails?: string[];
}): Promise<{ message: string }> {
return put<{ message: string }>('/admin/settings/comments', data);
}
export function blockIp(ip: string): Promise<{ message: string }> {
return post<{ message: string }>('/admin/comments/block-ip', { ip });
}
export function blockEmail(email: string): Promise<{ message: string }> {
return post<{ message: string }>('/admin/comments/block-email', { email });
}
export function exportComments(): Promise<any[]> {
return get<any[]>('/admin/comments/export');
}
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');
}