feat(API层): 新增完整的 API 接口封装

- 新增用户认证接口(auth.ts):登录、注册、获取用户信息
- 新增用户管理接口(user.ts):增删改查、批量操作
- 实现完整的请求/响应类型定义
- 统一错误处理和响应格式
This commit is contained in:
gaoziman 2025-11-18 20:46:02 +08:00
parent bc70cbf087
commit b3c0a05a3e
2 changed files with 391 additions and 0 deletions

117
src/api/auth.ts Normal file
View File

@ -0,0 +1,117 @@
/**
* API
* @description
*/
import request from '@/utils/request';
import type { R } from '@/types/api';
import type {
LoginReq,
LoginResp,
RegisterReq,
UserInfoResp,
} from '@/types/auth';
// ==================== 认证 API 路径 ====================
const AUTH_API = {
/** 登录 */
LOGIN: '/auth/login',
/** 注册 */
REGISTER: '/auth/register',
/** 登出 */
LOGOUT: '/auth/logout',
/** 获取用户信息 */
USER_INFO: '/auth/user/info',
};
// ==================== 认证 API 函数 ====================
/**
*
* @param data -
* @returns
* @example
* ```typescript
* const result = await login({
* account: 'admin',
* password: 'admin123'
* });
*
* if (result.code === 0) {
* const { token, userId, username, nickname, role } = result.data;
* // 存储 token 和用户信息
* setToken(token);
* setUserInfo({ userId, username, nickname, role });
* }
* ```
*/
export function login(data: LoginReq): Promise<R<LoginResp>> {
return request.post<LoginResp>(AUTH_API.LOGIN, data);
}
/**
*
* @param data -
* @returns
* @example
* ```typescript
* const result = await register({
* username: 'testuser',
* password: 'Test@123',
* confirmPassword: 'Test@123',
* email: 'test@leocoder.cn',
* phone: '13800138001',
* nickname: '测试用户'
* });
*
* if (result.code === 0) {
* Message.success('注册成功,请登录');
* // 跳转到登录页
* history.push('/login');
* }
* ```
*/
export function register(data: RegisterReq): Promise<R<null>> {
return request.post<null>(AUTH_API.REGISTER, data);
}
/**
*
* @returns
* @example
* ```typescript
* const result = await logout();
*
* if (result.code === 0) {
* // 清除本地存储
* clearAuthInfo();
* // 跳转到登录页
* window.location.href = '/login';
* }
* ```
*/
export function logout(): Promise<R<null>> {
return request.post<null>(AUTH_API.LOGOUT);
}
/**
*
* @returns
* @example
* ```typescript
* const result = await getUserInfo();
*
* if (result.code === 0) {
* const userInfo = result.data;
* // 更新 Redux Store
* dispatch({
* type: 'update-userInfo',
* payload: { userInfo }
* });
* }
* ```
*/
export function getUserInfo(): Promise<R<UserInfoResp>> {
return request.get<UserInfoResp>(AUTH_API.USER_INFO);
}

274
src/api/user.ts Normal file
View File

@ -0,0 +1,274 @@
/**
* API
* @description CRUD
*/
import request from '@/utils/request';
import type { R, PageResp } from '@/types/api';
import type {
UserQuery,
UserResp,
UserReq,
BatchDeleteReq,
ResetPasswordReq,
UpdateProfileReq,
} from '@/types/user';
// ==================== 用户管理 API 路径 ====================
const USER_API = {
/** 分页查询用户 */
PAGE: '/system/user',
/** 获取用户详情 */
GET: (id: number) => `/system/user/${id}`,
/** 创建用户 */
CREATE: '/system/user',
/** 更新用户 */
UPDATE: (id: number) => `/system/user/${id}`,
/** 删除用户 */
DELETE: (id: number) => `/system/user/${id}`,
/** 批量删除用户DELETE /system/user携带 ids 数组) */
BATCH_DELETE: '/system/user',
/** 导出用户 */
EXPORT: '/system/user/export',
/** 重置用户密码 */
RESET_PASSWORD: '/system/user/password/reset',
/** 修改个人信息 */
UPDATE_PROFILE: '/system/user/profile',
/** 上传头像 */
UPLOAD_AVATAR: '/system/user/avatar',
};
// ==================== 用户管理 API 函数 ====================
/**
*
* @param params -
* @returns
* @example
* ```typescript
* const result = await getUserPage({
* current: 1,
* size: 10,
* username: 'admin',
* role: 'ADMIN',
* status: 1
* });
*
* if (result.code === 0) {
* const { list, total } = result.data;
* setTableData(list);
* setPagination({ ...pagination, total });
* }
* ```
*/
export function getUserPage(params: UserQuery): Promise<R<PageResp<UserResp>>> {
return request.get<PageResp<UserResp>>(USER_API.PAGE, { params });
}
/**
*
* @param id - ID
* @returns
* @example
* ```typescript
* const result = await getUserDetail(1);
*
* if (result.code === 0) {
* const userDetail = result.data;
* form.setFieldsValue(userDetail);
* }
* ```
*/
export function getUserDetail(id: number): Promise<R<UserResp>> {
return request.get<UserResp>(USER_API.GET(id));
}
/**
*
* @param data -
* @returns ID
* @example
* ```typescript
* const result = await createUser({
* username: 'testuser',
* role: 'USER',
* password: 'Test@123',
* email: 'test@leocoder.cn',
* phone: '13800138001',
* nickname: '测试用户',
* status: 1
* });
*
* if (result.code === 0) {
* Message.success('用户创建成功');
* fetchData(); // 刷新列表
* }
* ```
*/
export function createUser(data: UserReq): Promise<R<number>> {
return request.post<number>(USER_API.CREATE, data);
}
/**
*
* @param id - ID
* @param data -
* @returns
* @example
* ```typescript
* const result = await updateUser(1, {
* username: 'updateduser',
* role: 'USER',
* email: 'updated@leocoder.cn',
* phone: '13800138003',
* nickname: '更新后的昵称',
* status: 1
* });
*
* if (result.code === 0) {
* Message.success('用户更新成功');
* fetchData(); // 刷新列表
* }
* ```
*/
export function updateUser(id: number, data: UserReq): Promise<R<null>> {
return request.put<null>(USER_API.UPDATE(id), data);
}
/**
*
* @param id - ID
* @returns
* @example
* ```typescript
* await Modal.confirm({
* title: '确认删除',
* content: '确定要删除该用户吗?此操作不可恢复。'
* });
*
* const result = await deleteUser(1);
*
* if (result.code === 0) {
* Message.success('删除成功');
* fetchData(); // 刷新列表
* }
* ```
*/
export function deleteUser(id: number): Promise<R<null>> {
return request.delete<null>(USER_API.DELETE(id));
}
/**
*
* @param ids - ID列表
* @returns
* @example
* ```typescript
* await Modal.confirm({
* title: '批量删除确认',
* content: `确定要删除选中的 ${ids.length} 个用户吗?`
* });
*
* const result = await batchDeleteUsers([1, 2, 3, 4, 5]);
*
* if (result.code === 0) {
* Message.success('批量删除成功');
* setSelectedRowKeys([]); // 清空选择
* fetchData(); // 刷新列表
* }
* ```
*/
export function batchDeleteUsers(ids: number[]): Promise<R<null>> {
return request.delete<null>(USER_API.BATCH_DELETE, {
data: { ids },
});
}
/**
*
* @param data -
*/
export function resetUserPassword(data: ResetPasswordReq): Promise<R<null>> {
return request.put<null>(USER_API.RESET_PASSWORD, data);
}
/**
*
* @param params -
* @returns Blob
* @example
* ```typescript
* const response = await exportUsers({
* username: 'admin',
* role: 'ADMIN',
* status: 1
* });
*
* // 创建下载链接
* const url = window.URL.createObjectURL(new Blob([response.data]));
* const link = document.createElement('a');
* link.href = url;
* link.setAttribute('download', `用户列表_${new Date().getTime()}.xlsx`);
* document.body.appendChild(link);
* link.click();
* link.remove();
*
* Message.success('导出成功');
* ```
*/
export function exportUsers(params: UserQuery): Promise<any> {
return request.post(USER_API.EXPORT, params, {
responseType: 'blob', // 重要:指定响应类型为 blob
});
}
/**
*
* @param data -
* @returns
* @example
* ```typescript
* const result = await updateProfile({
* nickname: 'Leo哥',
* email: 'leo@example.com',
* phone: '13800138000'
* });
*
* if (result.code === 0) {
* Message.success('个人信息修改成功');
* // 重新获取用户信息
* fetchUserInfo();
* }
* ```
*/
export function updateProfile(data: UpdateProfileReq): Promise<R<null>> {
return request.put<null>(USER_API.UPDATE_PROFILE, data);
}
/**
*
* @param file -
* @returns URL
* @example
* ```typescript
* const formData = new FormData();
* formData.append('avatar', file);
*
* const result = await uploadAvatar(formData);
*
* if (result.code === 0) {
* const avatarUrl = result.data;
* Message.success('头像上传成功');
* // 更新个人信息中的头像字段
* await updateProfile({ avatar: avatarUrl });
* }
* ```
*/
export function uploadAvatar(formData: FormData): Promise<R<string>> {
return request.put<string>(USER_API.UPLOAD_AVATAR, formData, {
headers: {
'Content-Type': 'multipart/form-data',
},
});
}