diff --git a/novalon-manage-web/src/stores/permission.ts b/novalon-manage-web/src/stores/permission.ts index 169a116..402d02e 100644 --- a/novalon-manage-web/src/stores/permission.ts +++ b/novalon-manage-web/src/stores/permission.ts @@ -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 + } } } }) diff --git a/novalon-manage-web/src/views/system/Login.vue b/novalon-manage-web/src/views/system/Login.vue index 82b62fc..14a3dde 100644 --- a/novalon-manage-web/src/views/system/Login.vue +++ b/novalon-manage-web/src/views/system/Login.vue @@ -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(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('/')