主要变更: 1. 重构API目录结构,采用模块化设计,适配5.x后端接口规范 2. 优化布局组件,提升用户界面体验 3. 增强国际化支持,完善多语言配置 4. 新增权限控制功能,支持前端路由权限管理 5. 优化认证流程,支持JWT认证机制 6. 新增中间件和插件,提升系统扩展性 7. 优化状态管理,采用更清晰的模块化设计 8. 新增搜索框、广告等组件,丰富页面功能 9. 更改包管理工具从npm到pnpm,提升依赖管理效率 10. 完善配置系统,支持多环境配置 适配5.x后端特性: - 采用新的API接口规范 - 支持JWT认证机制 - 适配后端权限控制体系 - 支持后端国际化接口 - 优化数据交互方式
80 lines
2.3 KiB
TypeScript
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']
|
|
}
|
|
})
|