feat: 集成 Permission Store 到登录流程
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
import { defineStore } from 'pinia'
|
import { defineStore } from 'pinia'
|
||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
export interface MenuItem {
|
export interface MenuItem {
|
||||||
id: number
|
id: number
|
||||||
@@ -86,6 +87,23 @@ export const usePermissionStore = defineStore('permission', {
|
|||||||
console.error('从 localStorage 恢复权限数据失败:', error)
|
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 { ElMessage } from 'element-plus'
|
||||||
import request from '@/utils/request'
|
import request from '@/utils/request'
|
||||||
import { onMounted } from 'vue'
|
import { onMounted } from 'vue'
|
||||||
|
import { jwtDecode } from 'jwt-decode'
|
||||||
|
import { usePermissionStore } from '@/stores/permission'
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const loading = ref(false)
|
const loading = ref(false)
|
||||||
|
const permissionStore = usePermissionStore()
|
||||||
|
|
||||||
const formState = reactive({
|
const formState = reactive({
|
||||||
username: '',
|
username: '',
|
||||||
@@ -65,6 +68,14 @@ onMounted(() => {
|
|||||||
document.title = '登录 - Novalon 管理系统'
|
document.title = '登录 - Novalon 管理系统'
|
||||||
})
|
})
|
||||||
|
|
||||||
|
interface JwtPayload {
|
||||||
|
userId: number
|
||||||
|
username: string
|
||||||
|
roles: string[]
|
||||||
|
exp: number
|
||||||
|
iat: number
|
||||||
|
}
|
||||||
|
|
||||||
const onFinish = async () => {
|
const onFinish = async () => {
|
||||||
loading.value = true
|
loading.value = true
|
||||||
try {
|
try {
|
||||||
@@ -83,6 +94,21 @@ const onFinish = async () => {
|
|||||||
localStorage.setItem('username', res.username)
|
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('登录成功')
|
ElMessage.success('登录成功')
|
||||||
|
|
||||||
await router.push('/')
|
await router.push('/')
|
||||||
|
|||||||
Reference in New Issue
Block a user