136 lines
3.3 KiB
TypeScript
136 lines
3.3 KiB
TypeScript
import { requestClient } from '@/api/request'
|
||
|
||
/**
|
||
* 性别枚举
|
||
*
|
||
* 对应 OpenAPI: Sex (x-enums)
|
||
* 1 = 男,2 = 女
|
||
*/
|
||
export const Sex = {
|
||
/** 男 */
|
||
MALE: 1,
|
||
/** 女 */
|
||
FEMALE: 2
|
||
} as const
|
||
|
||
/** 性别类型 */
|
||
export type SexType = (typeof Sex)[keyof typeof Sex]
|
||
|
||
/**
|
||
* 用户信息响应
|
||
*
|
||
* 对应 OpenAPI: UserInfoResponse
|
||
* 所有字段均为可选,部分字段可能为 null
|
||
*/
|
||
/** 在线状态枚举 */
|
||
export const UserStatus = {
|
||
ONLINE: 'ONLINE',
|
||
AWAY: 'AWAY',
|
||
DND: 'DND',
|
||
INVISIBLE: 'INVISIBLE'
|
||
} as const
|
||
|
||
/** 在线状态类型 */
|
||
export type UserStatusType = (typeof UserStatus)[keyof typeof UserStatus]
|
||
|
||
export interface UserInfoResponse {
|
||
/** 用户唯一标识(UUID) */
|
||
userId?: string
|
||
/** 用户昵称,最长 16 位 */
|
||
nickName?: string
|
||
/** 头像图片 URL 地址,可能为 null */
|
||
avatar?: string | null
|
||
/** 个性签名,最长 64 位,可能为 null */
|
||
signature?: string | null
|
||
/** 年龄,可能为 null */
|
||
age?: number | null
|
||
/** 性别:1=男,2=女,可能为 null */
|
||
sex?: SexType | null
|
||
/** 生日(ISO 8601 日期格式),可能为 null */
|
||
birthday?: string | null
|
||
/** 在线状态:ONLINE / AWAY / DND / INVISIBLE */
|
||
status?: UserStatusType
|
||
}
|
||
|
||
/** 更新在线状态请求 */
|
||
export interface UpdateStatusRequest {
|
||
/** 状态值:ONLINE、AWAY、DND、INVISIBLE */
|
||
status: UserStatusType
|
||
}
|
||
|
||
/**
|
||
* 获取当前登录用户信息
|
||
*
|
||
* 根据请求头中的 saToken 获取当前登录用户的详细信息。
|
||
* 需登录认证。
|
||
*
|
||
* @returns 当前登录用户的详细信息
|
||
*/
|
||
export function getUserInfo() {
|
||
return requestClient.get<UserInfoResponse>('/user/info')
|
||
}
|
||
|
||
/** 更新用户信息请求(所有字段可选,传什么更新什么) */
|
||
export interface UpdateUserInfoRequest {
|
||
/** 用户昵称,最长 16 位 */
|
||
nickName?: string
|
||
/** 头像图片 URL 地址 */
|
||
avatar?: string
|
||
/** 个性签名,最长 64 位 */
|
||
signature?: string
|
||
/** 年龄 */
|
||
age?: number
|
||
/** 性别:1=男,2=女 */
|
||
sex?: number
|
||
/** 生日(ISO 8601 日期格式,如 "1998-06-15") */
|
||
birthday?: string
|
||
}
|
||
|
||
/**
|
||
* 更新当前登录用户信息
|
||
*
|
||
* 所有字段可选,传什么更新什么。
|
||
*
|
||
* @param data - 更新请求
|
||
* @returns 更新后的用户信息
|
||
*/
|
||
export function updateUserInfo(data: UpdateUserInfoRequest) {
|
||
return requestClient.put<UserInfoResponse>('/user/info', data)
|
||
}
|
||
|
||
/**
|
||
* 上传用户头像
|
||
*
|
||
* 接收裁剪后的图片文件,保存后返回更新后的用户信息。
|
||
*
|
||
* @param file - 头像文件(JPEG/PNG/WebP/GIF,≤2MB)
|
||
* @returns 更新后的用户信息
|
||
*/
|
||
export function uploadAvatar(file: File) {
|
||
const formData = new FormData()
|
||
formData.append('file', file)
|
||
return requestClient.post<UserInfoResponse>('/user/avatar', formData, {
|
||
headers: { 'Content-Type': 'multipart/form-data' }
|
||
} as any)
|
||
}
|
||
|
||
/**
|
||
* 删除用户头像
|
||
*
|
||
* 删除磁盘文件并将 DB 中 avatar 置空。
|
||
*
|
||
* @returns 更新后的用户信息(avatar 为 null)
|
||
*/
|
||
export function deleteAvatar() {
|
||
return requestClient.delete<UserInfoResponse>('/user/avatar')
|
||
}
|
||
|
||
/**
|
||
* 更新当前登录用户在线状态
|
||
*
|
||
* @param data - 状态更新请求
|
||
*/
|
||
export function updateStatus(data: UpdateStatusRequest) {
|
||
return requestClient.patch<void>('/user/status', data)
|
||
}
|