diff --git a/components.d.ts b/components.d.ts index 461a595..532ad4d 100644 --- a/components.d.ts +++ b/components.d.ts @@ -23,9 +23,13 @@ declare module 'vue' { ElIcon: typeof import('element-plus/es')['ElIcon'] ElInput: typeof import('element-plus/es')['ElInput'] ElInputOtp: typeof import('element-plus/es')['ElInputOtp'] + ElMenu: typeof import('element-plus/es')['ElMenu'] + ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] ElOption: typeof import('element-plus/es')['ElOption'] ElPopover: typeof import('element-plus/es')['ElPopover'] ElSelect: typeof import('element-plus/es')['ElSelect'] + ElSubmenu: typeof import('element-plus/es')['ElSubmenu'] + ElSubMenu: typeof import('element-plus/es')['ElSubMenu'] ElSwitch: typeof import('element-plus/es')['ElSwitch'] ElTooltip: typeof import('element-plus/es')['ElTooltip'] GameList: typeof import('./src/components/baseLayouts/GameList.vue')['default'] @@ -50,9 +54,13 @@ declare global { const ElIcon: typeof import('element-plus/es')['ElIcon'] const ElInput: typeof import('element-plus/es')['ElInput'] const ElInputOtp: typeof import('element-plus/es')['ElInputOtp'] + const ElMenu: typeof import('element-plus/es')['ElMenu'] + const ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] const ElOption: typeof import('element-plus/es')['ElOption'] const ElPopover: typeof import('element-plus/es')['ElPopover'] const ElSelect: typeof import('element-plus/es')['ElSelect'] + const ElSubmenu: typeof import('element-plus/es')['ElSubmenu'] + const ElSubMenu: typeof import('element-plus/es')['ElSubMenu'] const ElSwitch: typeof import('element-plus/es')['ElSwitch'] const ElTooltip: typeof import('element-plus/es')['ElTooltip'] const GameList: typeof import('./src/components/baseLayouts/GameList.vue')['default'] diff --git a/src/api/modules/user/info.ts b/src/api/modules/user/info.ts index 0dc091c..c985df8 100644 --- a/src/api/modules/user/info.ts +++ b/src/api/modules/user/info.ts @@ -22,6 +22,17 @@ 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 @@ -37,13 +48,20 @@ export interface UserInfoResponse { 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 获取当前登录用户的详细信息, - * 包括昵称、头像、个性签名、年龄、性别、生日。 + * 根据请求头中的 saToken 获取当前登录用户的详细信息。 * 需登录认证。 * * @returns 当前登录用户的详细信息 @@ -51,3 +69,12 @@ export interface UserInfoResponse { export function getUserInfo() { return requestClient.get('/user/info') } + +/** + * 更新当前登录用户在线状态 + * + * @param data - 状态更新请求 + */ +export function updateStatus(data: UpdateStatusRequest) { + return requestClient.patch('/user/status', data) +} diff --git a/src/api/request/refreshInterceptor.ts b/src/api/request/refreshInterceptor.ts index 5f8a697..4414940 100644 --- a/src/api/request/refreshInterceptor.ts +++ b/src/api/request/refreshInterceptor.ts @@ -38,7 +38,9 @@ export function createRefreshTokenInterceptor(config: RefreshInterceptorConfig) */ async function onFulfilled(response: AxiosResponse) { const data = response.data - if (data.code !== 401) { + // 前一个拦截器在 code !== 401 时已将 AxiosResponse 解包为 ApiResponse, + // 此时 response.data 是业务数据本身,可能为 null(如 updateStatus 返回 data: null) + if (!data || data.code !== 401) { return response } diff --git a/src/components/baseLayouts/UserBar.vue b/src/components/baseLayouts/UserBar.vue index f7b765a..079c372 100644 --- a/src/components/baseLayouts/UserBar.vue +++ b/src/components/baseLayouts/UserBar.vue @@ -45,72 +45,65 @@
- -
-
+ + + 编辑个人资料 -
+ - -
-
- - 在线状态 - {{ currentStatus.label }} - - + + - - -
-
- - {{ status.label }} - - - -
-
-
-
-
+ + + + + {{ status.label }} + + + + + +
- -
-
+ + + 复制账号ID -
-
+ + 退出登录 -
-
+ +
@@ -122,83 +115,78 @@