Files
MrleeAdmin/app/plugins/auth-init.ts
T
Mr.April d84d972e73 feat: 适配5.x后端,重构前端架构
主要变更:
1. 重构API目录结构,采用模块化设计,适配5.x后端接口规范
2. 优化布局组件,提升用户界面体验
3. 增强国际化支持,完善多语言配置
4. 新增权限控制功能,支持前端路由权限管理
5. 优化认证流程,支持JWT认证机制
6. 新增中间件和插件,提升系统扩展性
7. 优化状态管理,采用更清晰的模块化设计
8. 新增搜索框、广告等组件,丰富页面功能
9. 更改包管理工具从npm到pnpm,提升依赖管理效率
10. 完善配置系统,支持多环境配置

适配5.x后端特性:
- 采用新的API接口规范
- 支持JWT认证机制
- 适配后端权限控制体系
- 支持后端国际化接口
- 优化数据交互方式
2026-04-07 11:01:11 +08:00

65 lines
2.4 KiB
TypeScript

import { useMemberStore } from '~/stores/member'
import { getMemberProfile } from '~/api/member'
import { refreshToken } from '~/api/auth'
export default defineNuxtPlugin(async () => {
// 仅在客户端执行
if (!import.meta.client) return
// 等待一下让 pinia 持久化插件完成初始化
await new Promise(resolve => setTimeout(resolve, 100))
const memberStore = useMemberStore()
// 如果没有 token 但有 refreshToken,尝试刷新
if (memberStore.refreshToken && !memberStore.token) {
try {
const response: any = await refreshToken(memberStore.refreshToken)
if (response.code === 0 && response.data) {
memberStore.token = response.data.access_token
memberStore.refreshToken = response.data.refresh_token
} else {
memberStore.logout()
}
} catch (error) {
memberStore.logout()
}
} else if (memberStore.token && memberStore.refreshToken) {
// 如果有 token 和 refreshToken,尝试获取用户信息
try {
const data: any = await getMemberProfile()
if (data && data.id) {
memberStore.info = data
} else {
memberStore.info = null
}
} catch (error: any) {
// 如果是 401 错误,尝试刷新 token
if (error?.message?.includes('401') || error?.response?.status === 401) {
try {
const refreshResponse: any = await refreshToken(memberStore.refreshToken)
if (refreshResponse.code === 0 && refreshResponse.data) {
memberStore.token = refreshResponse.data.access_token
memberStore.refreshToken = refreshResponse.data.refresh_token
// 刷新成功后重新获取用户信息
const userInfo: any = await getMemberProfile()
if (userInfo && userInfo.id) {
memberStore.info = userInfo
}
} else {
memberStore.logout()
}
} catch (refreshError) {
memberStore.logout()
}
} else {
memberStore.info = null
}
}
}
})