Files
MrleeAdmin/app/stores/member.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

80 lines
2.3 KiB
TypeScript

import { defineStore } from 'pinia'
import { getMemberProfile } from '~/api/member'
import { navigateTo } from 'nuxt/app'
interface Member {
token: string | null
refreshToken: string | null
info: Record<string, any> | null,
loginPopup: boolean
}
export const useMemberStore = defineStore('member', {
state: (): Member => {
return {
token: '',
refreshToken: '',
info: null,
loginPopup: false
}
},
actions: {
async setToken(token: string, refreshToken: string) {
this.token = token
this.refreshToken = refreshToken
this.info = null
// 静默获取用户信息,不阻塞 token 设置
// 如果失败不执行 logout,保留 refreshToken 以便后续刷新
this.getMemberInfoSilent()
},
async getMemberInfo() {
if (!this.token) {
return
}
await getMemberProfile()
.then((res: any) => {
this.info = res || null
})
.catch((err) => {
console.error('[getMemberInfo] Error:', err)
// 这里不调用 logout,保留 refreshToken 以便 token 刷新机制工作
this.info = null
})
},
async getMemberInfoSilent() {
// 静默获取用户信息,不抛出错误
if (!this.token) {
return
}
try {
const res: any = await getMemberProfile()
this.info = res || null
} catch (err) {
console.error('[getMemberInfoSilent] Error:', err)
// 不执行 logout,只清除 info
this.info = null
}
},
logout() {
this.token = ''
this.refreshToken = ''
this.info = null
this.loginPopup = false
// 跳转到首页
navigateTo('/')
},
logOpen() {
this.loginPopup = true
},
logClose() {
this.loginPopup = false
}
},
persist: {
key: 'member-store',
pick: ['token', 'refreshToken', 'info', 'loginPopup']
}
})