// 认证模式类型 export type AuthMode = 'single' | 'double' // 单Token响应类型 export interface ISingleTokenRes { token: string expiresIn: number // 有效期(秒) } // 双Token响应类型 export interface IDoubleTokenRes { accessToken: string refreshToken: string accessExpiresIn: number // 访问令牌有效期(秒) refreshExpiresIn: number // 刷新令牌有效期(秒) } /** * 登录返回的信息,其实就是 token 信息 */ export type IAuthLoginRes = ISingleTokenRes | IDoubleTokenRes /** * 用户信息 */ export interface IUserInfoRes { userId: number username: string nickname: string avatar?: string [key: string]: any // 允许其他扩展字段 } // 认证存储数据结构 export interface AuthStorage { mode: AuthMode tokens: ISingleTokenRes | IDoubleTokenRes userInfo?: IUserInfoRes loginTime: number // 登录时间戳 } /** * 获取验证码 */ export interface ICaptcha { captchaEnabled: boolean uuid: string img: string } /** * 上传成功的信息 */ export interface IUploadSuccessInfo { fileId: number originalName: string fileName: string storagePath: string fileHash: string fileType: string fileBusinessType: string fileSize: number } /** * 更新用户信息 */ export interface IUpdateInfo { id: number name: string sex: string } /** * 更新用户信息 */ export interface IUpdatePassword { id: number oldPassword: string newPassword: string confirmPassword: string } /** * 判断是否为单Token响应 * @param tokenRes 登录响应数据 * @returns 是否为单Token响应 */ export function isSingleTokenRes(tokenRes: IAuthLoginRes | string): tokenRes is ISingleTokenRes { // 如果是字符串,不是单token对象 if (typeof tokenRes === 'string') { return false } return 'token' in tokenRes && !('refreshToken' in tokenRes) } /** * 判断是否为双Token响应 * @param tokenRes 登录响应数据 * @returns 是否为双Token响应 */ export function isDoubleTokenRes(tokenRes: IAuthLoginRes | string): tokenRes is IDoubleTokenRes { // 如果是字符串,不是双token对象 if (typeof tokenRes === 'string') { return false } return 'accessToken' in tokenRes && 'refreshToken' in tokenRes }