Skip to content

Commit 6bdad5b

Browse files
Merge pull request #11 from github-learning/dev
Dev
2 parents b30ad36 + 5d767a3 commit 6bdad5b

File tree

17 files changed

+431
-62
lines changed

17 files changed

+431
-62
lines changed

README1.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@
1818
项目功能 业务流程
1919
最有成就感的事,或解决的难题
2020

21-
前后流程 角色 /
22-
是否踩过坑
21+
TODO
22+
23+
1. 根据用户信息,获取当前路由
24+
2. 动态路由匹配
2325

2426
zrh test
25-
test2
27+
test2

src/apis/user.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export interface Profile {
1212
avatar: string
1313
description: string
1414
// roles: IRole[]
15+
// roleIds?: string[] // 修改用户的时候,后端接受只要id
1516
roleIds?: number[] // 修改用户的时候,后端接受只要id
1617
}
1718

src/layout/components/layout-menu/index.vue

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,25 @@
88
text-color="#333"
99
active-text-color="#2469f0"
1010
>
11-
<menu-tree :menu-data="layoutsRoutes"> </menu-tree>
11+
<menu-tree :menu-data="menuRoutes"> </menu-tree>
12+
<!-- <menu-tree :menu-data="layoutsRoutes"> </menu-tree> -->
1213
</el-menu>
1314
</div>
1415
</template>
1516

1617
<script setup>
17-
import { layoutsRoutes } from '@/router'
18+
// import { layoutsRoutes } from '@/router'
19+
import { useMenuStore } from '@/stores/menu'
20+
21+
const meuStore = useMenuStore()
22+
23+
const menuRoutes = computed(() => meuStore.state.authMenuTreeData)
24+
25+
console.log(
26+
'%c [ ]-25',
27+
'font-size:13px; background:pink; color:#bf2c9f;',
28+
menuRoutes.value
29+
)
1830
</script>
1931

2032
<style scoped>

src/layout/components/layout-menu/menu-tree.vue

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<template>
22
<template v-for="(item, index) in menuData">
3-
<el-sub-menu v-if="item.children" :key="index" :index="item.path">
3+
<el-sub-menu v-if="item.children?.length" :key="index" :index="item.path">
44
<template #title>
55
<span class="menu-item-title"> {{ item.meta?.title }}</span>
66
</template>
@@ -15,10 +15,16 @@
1515
</template>
1616
<script setup lang="ts">
1717
import { RouteRecordRaw } from 'vue-router'
18-
defineProps<{
18+
const props = defineProps<{
1919
menuData: RouteRecordRaw[]
2020
}>()
2121
22+
console.log(
23+
'%c [ props ]-23',
24+
'font-size:13px; background:pink; color:#bf2c9f;',
25+
props.menuData
26+
)
27+
2228
defineOptions({
2329
name: 'MenuTree'
2430
})

src/main.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import element from './plugins/element'
77
import directives from './directives/index'
88
// 注册持久化插件
99
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
10+
import router from './router'
1011
import './style.css'
1112
import './permission'
1213
import './style/index.css'
@@ -20,7 +21,7 @@ for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
2021
app.component(key, component)
2122
}
2223
import 'virtual:uno.css'
23-
import { router } from './router'
24+
2425
pinia.use(piniaPluginPersistedstate)
2526
window.document.documentElement.setAttribute('data-theme', 'light')
2627
app.use(router)

src/permission.ts

Lines changed: 114 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,143 @@
1-
import { router } from '@/router'
1+
import router from '@/router'
22
import NProgress from 'nprogress'
33
import 'nprogress/nprogress.css'
44
import { getToken } from '@/utils'
5+
import { useUserStore } from './stores'
6+
import { usePermissionStore } from './stores/permission'
57
NProgress.configure({ showSpinner: false })
6-
const whiteList = ['/login', '/register']
8+
// const whiteList = ['/login', '/register']
9+
10+
// router.beforeEach(async (to) => {
11+
// // 获取用户信息
12+
// NProgress.start()
13+
// const userStore = useUserStore()
14+
// const permissionStore = usePermissionStore()
15+
// const hasToken = getToken()
16+
// console.log('hasToken', hasToken)
17+
18+
// if (hasToken) {
19+
// if (to.path === '/login') {
20+
// NProgress.done()
21+
// return {
22+
// path: '/',
23+
// replace: true
24+
// }
25+
// } else {
26+
// // 用token 换取用户信息
27+
// try {
28+
// const hasRoles = userStore.state.roles.length > 0
29+
// if (hasRoles) {
30+
// NProgress.done()
31+
// return true
32+
// }
33+
// await userStore.getUserInfo()
34+
// // const roleIds = userStore.state.roleIds
35+
// // console.log('roleIds', roleIds)
36+
// // 用角色生成菜单树
37+
// const routes = await permissionStore.generateRoutes()
38+
39+
// console.log(
40+
// '%c [routes ]-39',
41+
// 'font-size:13px; background:pink; color:#bf2c9f;',
42+
// routes
43+
// )
44+
45+
// routes.forEach(router.addRoute) // 内部添加到映射表中
46+
// console.log('to.path', to.path)
47+
// // 确保动态路由加载完成后跳转
48+
// // 避免重复跳转检查
49+
// // if (to.matched.length === 0) {
50+
// // return {
51+
// // path: to.path, // 重定向到原目标路径
52+
// // replace: true // 避免重复历史记录
53+
// // }
54+
// // }
55+
// // return router.push(to.path)
56+
// NProgress.done()
57+
// return true
58+
// } catch {
59+
// userStore.logout()
60+
// NProgress.done()
61+
// return `login?redirect=${to.path}`
62+
// }
63+
// }
64+
// NProgress.done()
65+
// } else {
66+
// if (whiteList.includes(to.path)) {
67+
// NProgress.done()
68+
// return true
69+
// }
70+
// return {
71+
// path: '/login',
72+
// // 给予跳转后重定向参数
73+
// query: {
74+
// redirect: to.path,
75+
// ...to.query
76+
// }
77+
// }
78+
// }
79+
// })
80+
// const whiteList = ['/login']
81+
// 远程路由是否加载
82+
83+
const whiteList = ['/login']
784
router.beforeEach(async (to) => {
8-
// 获取用户信息
985
NProgress.start()
1086
const hasToken = getToken()
11-
console.log('hasToken', hasToken)
12-
87+
const userStore = useUserStore()
88+
const permissionStore = usePermissionStore()
1389
if (hasToken) {
90+
// 用token换用户信息
1491
if (to.path === '/login') {
1592
NProgress.done()
1693
return {
1794
path: '/',
1895
replace: true
1996
}
97+
} else {
98+
// 用token 换取 用户信息, 也有可能token是伪造的
99+
try {
100+
const hasRoles = userStore.state.roles.length > 0
101+
if (hasRoles) {
102+
NProgress.done()
103+
return true
104+
}
105+
await userStore.getUserInfo()
106+
// const roles = userStore.state.roles // 稍后用角色来生成菜单树
107+
const routes = await permissionStore.generateRoutes()
108+
routes.forEach(router.addRoute) // 内部添加到映射表中
109+
// 如果目标路由未匹配,则重新导航
110+
if (to.matched.length === 0) {
111+
return { path: to.fullPath, replace: true }
112+
}
113+
114+
NProgress.done()
115+
return true
116+
} catch (e) {
117+
console.log(
118+
'%c [ ]-112',
119+
'font-size:13px; background:pink; color:#bf2c9f;',
120+
e
121+
)
122+
userStore.logout()
123+
NProgress.done()
124+
return '/login?redirect=' + to.path
125+
}
20126
}
21-
NProgress.done()
22127
} else {
23128
if (whiteList.includes(to.path)) {
24129
NProgress.done()
25130
return true
26131
}
27132
return {
28133
path: '/login',
29-
// 给予跳转后重定向参数
30134
query: {
31135
redirect: to.path,
32136
...to.query
33137
}
138+
// 给与跳转后的重定向参数,还有其他参数
34139
}
35140
}
36141
})
142+
143+
// return router.push(to.path)

0 commit comments

Comments
 (0)