feat: 添加 token 刷新功能及相关类型定义

- 在 typings.d.ts 中新增 IUserToken 接口
- 在 login.ts 中添加 refreshToken 函数以支持 token 刷新
- 在 types/login.ts 中新增 IUserTokenVo 接口
- 更新 http.ts 以处理 token 刷新逻辑
- 修改 interceptor.ts 以使用新的 token 类型
- 在 user.ts 中整合 token 状态管理
This commit is contained in:
Hygge
2025-08-21 15:49:14 +08:00
parent 6900afa253
commit d9e16baca9
7 changed files with 136 additions and 12 deletions

View File

@@ -1,10 +1,11 @@
import type { IUserInfoVo } from '@/api/types/login'
import type { IUserInfoVo, IUserLogin, IUserTokenVo } from '@/api/types/login'
import { defineStore } from 'pinia'
import { ref } from 'vue'
import {
getUserInfo as _getUserInfo,
login as _login,
logout as _logout,
refreshToken as _refreshToken,
wxLogin as _wxLogin,
getWxCode,
} from '@/api/login'
@@ -15,7 +16,12 @@ const userInfoState: IUserInfoVo = {
id: 0,
username: '',
avatar: '/static/images/default-avatar.png',
}
const userTokenState: IUserTokenVo = {
token: '',
refreshToken: '',
refreshExpire: 0,
}
export const useUserStore = defineStore(
@@ -23,6 +29,8 @@ export const useUserStore = defineStore(
() => {
// 定义用户信息
const userInfo = ref<IUserInfoVo>({ ...userInfoState })
const userToken = ref<IUserTokenVo>({ ...userTokenState })
// 设置用户信息
const setUserInfo = (val: IUserInfoVo) => {
console.log('设置用户信息', val)
@@ -43,9 +51,23 @@ export const useUserStore = defineStore(
// 删除用户信息
const removeUserInfo = () => {
userInfo.value = { ...userInfoState }
userToken.value = { ...userTokenState }
uni.removeStorageSync('userInfo')
uni.removeStorageSync('token')
uni.removeStorageSync('refreshToken')
}
/**
* 存储token,非导出
*/
const setToken = (tokenBody: IUserLogin) => {
userToken.value.token = tokenBody.token
userToken.value.refreshToken = tokenBody.refreshToken
userToken.value.refreshExpire = tokenBody.refreshExpire
uni.setStorageSync('token', tokenBody.token)
uni.setStorageSync('refreshToken', tokenBody.refreshToken)
}
/**
* 获取用户信息
*/
@@ -54,7 +76,6 @@ export const useUserStore = defineStore(
const userInfo = res.data
setUserInfo(userInfo)
uni.setStorageSync('userInfo', userInfo)
uni.setStorageSync('token', userInfo.token)
// TODO 这里可以增加获取用户路由的方法 根据用户的角色动态生成路由
return res
}
@@ -72,6 +93,18 @@ export const useUserStore = defineStore(
const res = await _login(credentials)
console.log('登录信息', res)
toast.success('登录成功')
// 这里设置token 和 refreshToken
setToken(res.data)
await getUserInfo()
return res
}
/**
* 刷新token
*/
const refreshToken = async () => {
const res = await _refreshToken(userToken.value.refreshToken)
setToken(res.data)
await getUserInfo()
return res
}
@@ -98,11 +131,13 @@ export const useUserStore = defineStore(
return {
userInfo,
userToken,
login,
wxLogin,
getUserInfo,
setUserAvatar,
logout,
refreshToken,
}
},
{