merge main

This commit is contained in:
2026-08-11 10:16:38 +08:00
156 changed files with 22362 additions and 1211 deletions
+143 -6
View File
@@ -320,7 +320,7 @@ export async function verifyCaptcha(captchaId: string, x: number): Promise<strin
return res.token;
}
// ── Site Info ─────────────────────────────────────────────
export async function getSiteInfo(): Promise<{ siteName: string; siteLogo: string; userAgreementPrivacyUrl: string; siteCopyright: string; operationManual: string; loginBgVideo: string }> {
export async function getSiteInfo(): Promise<{ siteName: string; siteLogo: string; userAgreementPrivacyUrl: string; siteCopyright: string; operationManual: string; loginBgVideo: string; optimizeHoldCredits?: number; siteBanner?: string; siteBannerVersion?: number }> {
if (USE_MOCK) return { siteName: '智创', siteLogo: '', userAgreementPrivacyUrl: '', siteCopyright: '© 2026 智创 版权所有', operationManual: '', loginBgVideo: '' };
return api.get('/auth/site-info', false);
}
@@ -370,10 +370,42 @@ export async function getAdminStats(): Promise<AdminStats> {
if (USE_MOCK) return mock.mockGetAdminStats();
return api.get('/admin/stats');
}
export async function getAdminUsers(search?: string): Promise<AdminUser[]> {
if (USE_MOCK) return mock.mockGetAdminUsers(search);
const q = search ? `?search=${encodeURIComponent(search)}` : '';
return api.get(`/admin/users${q}`);
export async function getAdminUsers(page = 1, pageSize = 1000, search?: string): Promise<{ items: AdminUser[]; total: number }> {
if (USE_MOCK) {
const items = await mock.mockGetAdminUsers(search);
return { items, total: items.length };
}
const params = new URLSearchParams();
params.set('page', String(page));
params.set('page_size', String(pageSize));
if (search) params.set('search', search);
return api.get(`/admin/users?${params.toString()}`);
}
export async function getAdminNotifications(page = 1, pageSize = 20): Promise<{ items: any[]; total: number }> {
if (USE_MOCK) {
const items = await mock.mockGetAdminNotifications();
return { items, total: items.length };
}
const params = new URLSearchParams();
params.set('page', String(page));
params.set('page_size', String(pageSize));
return api.get(`/admin/notifications?${params.toString()}`);
}
export async function createAdminNotification(params: { title: string; content: string; type?: string; target_user_id?: string }): Promise<void> {
if (USE_MOCK) return;
await api.post('/admin/notifications', params);
}
export async function deleteAdminNotification(id: string): Promise<void> {
if (USE_MOCK) return;
await api.delete(`/admin/notifications/${id}`);
}
export async function getNotificationReadUsers(notificationId: string): Promise<{ items: any[] }> {
if (USE_MOCK) return { items: [] };
return api.get(`/admin/notifications/${notificationId}/read-users`);
}
export async function adjustCredits(userId: string, amount: number, description: string): Promise<void> {
if (USE_MOCK) return mock.mockAdjustCredits(userId, amount, description);
@@ -432,10 +464,18 @@ export async function createRechargeOrder(planId: string, method: string = 'wech
return api.post('/payments/recharge', { plan: planId, method });
}
export async function getPaymentOrders(page = 1, pageSize = 20): Promise<{ items: any[]; total: number }> {
export async function getPaymentOrders(
page = 1,
pageSize = 20,
options?: { statusFilter?: string; startDate?: string; endDate?: string; invoiceMode?: boolean }
): Promise<{ items: any[]; total: number }> {
const params = new URLSearchParams();
params.set('page', String(page));
params.set('page_size', String(pageSize));
if (options?.statusFilter) params.set('status_filter', options.statusFilter);
if (options?.startDate) params.set('start_date', options.startDate);
if (options?.endDate) params.set('end_date', options.endDate);
if (options?.invoiceMode) params.set('invoice_mode', 'true');
return api.get(`/payments/orders?${params.toString()}`);
}
@@ -447,6 +487,103 @@ export async function cancelPaymentOrder(orderNo: string): Promise<void> {
return api.post(`/payments/orders/${orderNo}/cancel`);
}
// ── Invoices ──────────────────────────────────────────────
export async function createInvoice(data: {
headerType: 'personal' | 'company';
headerName: string;
headerTaxNo?: string;
headerRegisterAddress?: string;
headerRegisterPhone?: string;
headerBankName?: string;
headerBankAccount?: string;
email: string;
orderIds: string[];
}): Promise<any> {
return api.post('/invoices', {
header_type: data.headerType,
header_name: data.headerName,
header_tax_no: data.headerTaxNo,
header_register_address: data.headerRegisterAddress,
header_register_phone: data.headerRegisterPhone,
header_bank_name: data.headerBankName,
header_bank_account: data.headerBankAccount,
email: data.email,
order_ids: data.orderIds,
});
}
export async function getInvoices(params?: { page?: number; pageSize?: number }): Promise<{ items: any[]; total: number }> {
const qs = new URLSearchParams();
if (params?.page) qs.set('page', String(params.page));
if (params?.pageSize) qs.set('page_size', String(params.pageSize));
return api.get(`/invoices?${qs.toString()}`);
}
export async function getInvoiceDetail(id: string): Promise<any> {
return api.get(`/invoices/${id}`);
}
// ── Invoice Headers ──────────────────────────────────────
export async function getInvoiceHeaders(): Promise<{ items: any[] }> {
return api.get('/invoice-headers');
}
export async function createInvoiceHeader(data: {
type: 'personal' | 'company';
name: string;
taxNo?: string;
registerAddress?: string;
registerPhone?: string;
bankName?: string;
bankAccount?: string;
email?: string;
isDefault?: boolean;
}): Promise<any> {
return api.post('/invoice-headers', {
type: data.type,
name: data.name,
tax_no: data.taxNo,
register_address: data.registerAddress,
register_phone: data.registerPhone,
bank_name: data.bankName,
bank_account: data.bankAccount,
email: data.email,
is_default: data.isDefault ?? false,
});
}
export async function updateInvoiceHeader(id: string, data: {
name?: string;
taxNo?: string;
registerAddress?: string;
registerPhone?: string;
bankName?: string;
bankAccount?: string;
email?: string;
isDefault?: boolean;
}): Promise<any> {
return api.put(`/invoice-headers/${id}`, {
name: data.name,
tax_no: data.taxNo,
register_address: data.registerAddress,
register_phone: data.registerPhone,
bank_name: data.bankName,
bank_account: data.bankAccount,
email: data.email,
is_default: data.isDefault,
});
}
export async function deleteInvoiceHeader(id: string): Promise<void> {
await api.delete(`/invoice-headers/${id}`);
}
export async function setDefaultInvoiceHeader(id: string): Promise<any> {
return api.put(`/invoice-headers/${id}/set-default`);
}
export async function getCreditRatios(): Promise<any[]> {
return api.get('/credits/ratios');
}