yl-frontend/src/api/user.ts

135 lines
3.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import request from '@/utils/request'
import type { ApiResponse, PageResult } from './types'
// 定义接口的请求参数类型
/**
* 关键点说明:
* 类型定义:
* 使用 interface 定义接口的请求参数和响应数据类型
*
*
*
* 使用 Partial<T> 表示部分可选的类型
*
* 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> 在处理对象时非常有用,特别是当你需要处理可能不完整或部分填充的对象时。
*
*
* 使用联合类型定义枚举值,如 0 | 1
* 请求方法:
* request.get<T>() - GET请求
* request.post<T>() - POST请求
* request.put<T>() - PUT请求
* 泛型参数 T 用于定义响应数据的类型
* 错误处理:
* 使用 try/catch 捕获请求错误
* 统一的错误提示
* 文件上传:
* 使用 FormData 处理文件上传
* 设置正确的 Content-Type
* 类型推导:
* TypeScript 会自动推导 API 响应的类型
* 编辑器会提供代码提示和类型检查
*/
export interface LoginParams {
phone: string
password: string
verifyCode?: string
}
// 定义后端返回的用户信息类型
export interface UserInfo {
id: number
phone: string
nickname: string
avatar: string
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]
}
// 用户API接口
export const userApi = {
// 手机号密码登录
login(data: LoginParams) {
return request.post<ApiResponse<{ token: string }>>('/auth/login', data)
},
// 发送验证码
sendVerifyCode(phone: string) {
return request.post<ApiResponse<void>>('/user/getEmailCode', { phone })
},
// 发送验证码
sendVerifyEmailCode(email: string) {
return request.post<ApiResponse<void>>('/user/getEmailCode', { email })
},
// 获取当前登录用户信息
getCurrentUser() {
return request.get<ApiResponse<UserInfo>>('/user/current')
},
// 更新用户信息
updateUserInfo(data: Partial<UserInfo>) {
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)
}
}