- ErrorBoundary 组件:全局错误捕获与优雅降级 - 提取 5 个自定义 hooks:useCountUp, useDarkMode, useDebouncedValue, usePaginatedData, useApiRequest - 从 11 个 API 文件提取 PaginatedResponse 共享类型到 api/types.ts - 统一 API 错误处理(api/errors.ts) - client.ts 迁移到 axios adapter 模式(替代废弃的 CancelToken) - 添加 react-i18next 国际化基础设施 + zh-CN 语言包
51 lines
1.4 KiB
TypeScript
51 lines
1.4 KiB
TypeScript
import client from './client';
|
|
import type { UserInfo } from './auth';
|
|
import type { PaginatedResponse } from './types';
|
|
|
|
export interface CreateUserRequest {
|
|
username: string;
|
|
password: string;
|
|
email?: string;
|
|
phone?: string;
|
|
display_name?: string;
|
|
}
|
|
|
|
export interface UpdateUserRequest {
|
|
email?: string;
|
|
phone?: string;
|
|
display_name?: string;
|
|
status?: string;
|
|
version: number;
|
|
}
|
|
|
|
export async function listUsers(page = 1, pageSize = 20, search = '') {
|
|
const { data } = await client.get<{ success: boolean; data: PaginatedResponse<UserInfo> }>(
|
|
'/users',
|
|
{ params: { page, page_size: pageSize, search: search || undefined } }
|
|
);
|
|
return data.data;
|
|
}
|
|
|
|
export async function getUser(id: string) {
|
|
const { data } = await client.get<{ success: boolean; data: UserInfo }>(`/users/${id}`);
|
|
return data.data;
|
|
}
|
|
|
|
export async function createUser(req: CreateUserRequest) {
|
|
const { data } = await client.post<{ success: boolean; data: UserInfo }>('/users', req);
|
|
return data.data;
|
|
}
|
|
|
|
export async function updateUser(id: string, req: UpdateUserRequest) {
|
|
const { data } = await client.put<{ success: boolean; data: UserInfo }>(`/users/${id}`, req);
|
|
return data.data;
|
|
}
|
|
|
|
export async function deleteUser(id: string) {
|
|
await client.delete(`/users/${id}`);
|
|
}
|
|
|
|
export async function assignRoles(userId: string, roleIds: string[]) {
|
|
await client.post(`/users/${userId}/roles`, { role_ids: roleIds });
|
|
}
|