2024-12-06 21:54:32 +08:00
|
|
|
|
import request from '@/utils/request'
|
2024-12-06 22:01:17 +08:00
|
|
|
|
import type { ApiResponse, PageResult } from './types'
|
2024-12-06 21:54:32 +08:00
|
|
|
|
|
2024-12-06 22:01:17 +08:00
|
|
|
|
// 定义接口的请求参数类型
|
2024-12-06 22:01:50 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 关键点说明:
|
|
|
|
|
* 类型定义:
|
|
|
|
|
* 使用 interface 定义接口的请求参数和响应数据类型
|
2024-12-07 13:03:57 +08:00
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
*
|
2024-12-06 22:01:50 +08:00
|
|
|
|
* 使用 Partial<T> 表示部分可选的类型
|
2024-12-07 13:03:57 +08:00
|
|
|
|
*
|
|
|
|
|
* Partial<T> 是 TypeScript 中的一个实用工具类型,它用于将一个类型的所有属性标记为可选的。在 TypeScript 中,当你有一个类型 T,并且你想要创建一个新的类型,其中 T 的所有属性都是可选的,你可以使用 Partial<T>。
|
|
|
|
|
*
|
|
|
|
|
* 例如,如果你有一个类型 Person:
|
|
|
|
|
*
|
|
|
|
|
* typescript
|
|
|
|
|
* type Person = {
|
|
|
|
|
* name: string;
|
|
|
|
|
* age: number;
|
|
|
|
|
* };
|
|
|
|
|
* 你可以使用 Partial<T> 创建一个新的类型 PartialPerson,其中 name 和 age 都是可选属性:
|
|
|
|
|
*
|
|
|
|
|
* typescript
|
|
|
|
|
* type PartialPerson = Partial<Person>;
|
|
|
|
|
* 这意味着 PartialPerson 类型的对象可以有 name 和 age 属性,也可以没有,或者只有一个:
|
|
|
|
|
*
|
|
|
|
|
* typescript
|
|
|
|
|
* let person1: PartialPerson = { name: "Alice" }; // 正确
|
|
|
|
|
* let person2: PartialPerson = { age: 30 }; // 正确
|
|
|
|
|
* let person3: PartialPerson = {}; // 正确
|
|
|
|
|
* Partial<T> 在处理对象时非常有用,特别是当你需要处理可能不完整或部分填充的对象时。
|
|
|
|
|
*
|
|
|
|
|
*
|
2024-12-06 22:01:50 +08:00
|
|
|
|
* 使用联合类型定义枚举值,如 0 | 1
|
|
|
|
|
* 请求方法:
|
|
|
|
|
* request.get<T>() - GET请求
|
|
|
|
|
* request.post<T>() - POST请求
|
|
|
|
|
* request.put<T>() - PUT请求
|
|
|
|
|
* 泛型参数 T 用于定义响应数据的类型
|
|
|
|
|
* 错误处理:
|
|
|
|
|
* 使用 try/catch 捕获请求错误
|
|
|
|
|
* 统一的错误提示
|
|
|
|
|
* 文件上传:
|
|
|
|
|
* 使用 FormData 处理文件上传
|
|
|
|
|
* 设置正确的 Content-Type
|
|
|
|
|
* 类型推导:
|
|
|
|
|
* TypeScript 会自动推导 API 响应的类型
|
|
|
|
|
* 编辑器会提供代码提示和类型检查
|
|
|
|
|
*/
|
|
|
|
|
|
2024-12-06 21:54:32 +08:00
|
|
|
|
export interface LoginParams {
|
2024-12-06 22:01:17 +08:00
|
|
|
|
phone: string
|
2024-12-06 21:54:32 +08:00
|
|
|
|
password: string
|
2024-12-06 22:01:17 +08:00
|
|
|
|
verifyCode?: string
|
2024-12-06 21:54:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-12-06 22:01:17 +08:00
|
|
|
|
// 定义后端返回的用户信息类型
|
2024-12-06 21:54:32 +08:00
|
|
|
|
export interface UserInfo {
|
|
|
|
|
id: number
|
2024-12-06 22:01:17 +08:00
|
|
|
|
phone: string
|
2024-12-06 21:54:32 +08:00
|
|
|
|
nickname: string
|
|
|
|
|
avatar: string
|
2024-12-06 22:01:17 +08:00
|
|
|
|
gender: 0 | 1 // 0-女 1-男
|
|
|
|
|
age: number
|
|
|
|
|
address: string
|
|
|
|
|
emergencyContact: {
|
|
|
|
|
name: string
|
|
|
|
|
phone: string
|
|
|
|
|
relation: string
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 定义用户列表查询参数
|
|
|
|
|
export interface UserQueryParams {
|
|
|
|
|
page: number
|
|
|
|
|
pageSize: number
|
|
|
|
|
nickname?: string
|
|
|
|
|
phone?: string
|
|
|
|
|
gender?: 0 | 1
|
|
|
|
|
ageRange?: [number, number]
|
2024-12-06 21:54:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-12-06 22:01:17 +08:00
|
|
|
|
// 用户API接口
|
2024-12-06 21:54:32 +08:00
|
|
|
|
export const userApi = {
|
2024-12-06 22:01:17 +08:00
|
|
|
|
// 手机号密码登录
|
2024-12-06 21:54:32 +08:00
|
|
|
|
login(data: LoginParams) {
|
|
|
|
|
return request.post<ApiResponse<{ token: string }>>('/auth/login', data)
|
|
|
|
|
},
|
|
|
|
|
|
2024-12-06 22:01:17 +08:00
|
|
|
|
// 发送验证码
|
|
|
|
|
sendVerifyCode(phone: string) {
|
2024-12-06 22:25:40 +08:00
|
|
|
|
return request.post<ApiResponse<void>>('/user/getEmailCode', { phone })
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// 发送验证码
|
|
|
|
|
sendVerifyEmailCode(email: string) {
|
|
|
|
|
return request.post<ApiResponse<void>>('/user/getEmailCode', { email })
|
2024-12-06 21:54:32 +08:00
|
|
|
|
},
|
|
|
|
|
|
2024-12-06 22:01:17 +08:00
|
|
|
|
// 获取当前登录用户信息
|
|
|
|
|
getCurrentUser() {
|
|
|
|
|
return request.get<ApiResponse<UserInfo>>('/user/current')
|
2024-12-06 21:54:32 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// 更新用户信息
|
|
|
|
|
updateUserInfo(data: Partial<UserInfo>) {
|
2024-12-06 22:01:17 +08:00
|
|
|
|
return request.put<ApiResponse<UserInfo>>('/user/info', data)
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// 更新用户头像
|
|
|
|
|
updateAvatar(file: File) {
|
|
|
|
|
const formData = new FormData()
|
|
|
|
|
formData.append('avatar', file)
|
|
|
|
|
return request.post<ApiResponse<{ avatarUrl: string }>>('/user/avatar', formData, {
|
|
|
|
|
headers: {
|
|
|
|
|
'Content-Type': 'multipart/form-data'
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// 分页获取用户列表(管理员接口)
|
|
|
|
|
getUserList(params: UserQueryParams) {
|
|
|
|
|
return request.get<ApiResponse<PageResult<UserInfo>>>('/admin/users', { params })
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// 修改密码
|
|
|
|
|
changePassword(data: { oldPassword: string; newPassword: string }) {
|
|
|
|
|
return request.post<ApiResponse<void>>('/user/change-password', data)
|
2024-12-06 21:54:32 +08:00
|
|
|
|
}
|
2024-12-06 22:01:50 +08:00
|
|
|
|
}
|