feat: 集成 Permission Store 到登录流程

This commit is contained in:
张翔
2026-04-08 07:05:30 +08:00
parent 20d12c1b94
commit b6600ad59a
2 changed files with 44 additions and 0 deletions
@@ -1,4 +1,5 @@
import { defineStore } from 'pinia'
import request from '@/utils/request'
export interface MenuItem {
id: number
@@ -86,6 +87,23 @@ export const usePermissionStore = defineStore('permission', {
console.error('从 localStorage 恢复权限数据失败:', error)
}
}
},
async fetchUserMenus() {
try {
const res: any = await request.get('/menus/user')
if (res && res.data) {
this.setPermissionData({
roles: JSON.parse(localStorage.getItem('roles') || '[]'),
permissions: res.data.permissions || [],
menus: res.data.menus || []
})
}
} catch (error) {
console.error('获取用户菜单失败:', error)
throw error
}
}
}
})
@@ -52,9 +52,12 @@ import { useRouter } from 'vue-router'
import { ElMessage } from 'element-plus'
import request from '@/utils/request'
import { onMounted } from 'vue'
import { jwtDecode } from 'jwt-decode'
import { usePermissionStore } from '@/stores/permission'
const router = useRouter()
const loading = ref(false)
const permissionStore = usePermissionStore()
const formState = reactive({
username: '',
@@ -65,6 +68,14 @@ onMounted(() => {
document.title = '登录 - Novalon 管理系统'
})
interface JwtPayload {
userId: number
username: string
roles: string[]
exp: number
iat: number
}
const onFinish = async () => {
loading.value = true
try {
@@ -83,6 +94,21 @@ const onFinish = async () => {
localStorage.setItem('username', res.username)
}
try {
const decoded = jwtDecode<JwtPayload>(res.token)
if (decoded.roles && Array.isArray(decoded.roles)) {
localStorage.setItem('roles', JSON.stringify(decoded.roles))
}
} catch (decodeError) {
console.warn('解析Token中的角色信息失败:', decodeError)
}
try {
await permissionStore.fetchUserMenus()
} catch (fetchError) {
console.warn('获取用户菜单失败:', fetchError)
}
ElMessage.success('登录成功')
await router.push('/')