Skip to content

Commit 6a06894

Browse files
committed
页面跳转,路由守卫实现
1 parent f4a4630 commit 6a06894

File tree

10 files changed

+3319
-8
lines changed

10 files changed

+3319
-8
lines changed

package-lock.json

+3,244
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"axios": "^1.5.1",
1414
"echarts": "^5.4.3",
1515
"element-plus": "^2.4.0",
16+
"js-cookie": "^3.0.5",
1617
"mockjs": "^1.1.0",
1718
"unplugin-element-plus": "^0.8.0",
1819
"vue": "^3.3.4",

src/components/CommonAside.vue

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export default {
4242
setup() {
4343
const store = useStore()
4444
const router = useRouter();
45+
// 数组对象结构
4546
const list = [
4647
{
4748
path: '/user',

src/components/CommonHeader.vue

+15-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
</el-icon>
1010
</el-button>
1111
<el-breadcrumb separator="/" class="breadcrumb">
12-
<!-- -->
12+
<!-- 点击左侧commonAside 显示commonHeader -->
1313
<el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
1414
<el-breadcrumb-item :to="current.path" v-if="current">{{ current.lable }}</el-breadcrumb-item>
1515

@@ -23,7 +23,7 @@
2323
<template #dropdown>
2424
<el-dropdown-menu>
2525
<el-dropdown-item>个人中心</el-dropdown-item>
26-
<el-dropdown-item>退出</el-dropdown-item>
26+
<el-dropdown-item @click="handleLoginOut">退出</el-dropdown-item>
2727
</el-dropdown-menu>
2828
</template>
2929
</el-dropdown>
@@ -34,7 +34,8 @@
3434
<script>
3535
// import { DefineComponent } from 'vue-demi';
3636
import { computed, defineComponent } from 'vue';
37-
import { useStore } from 'vuex'
37+
import { useStore } from 'vuex';
38+
import { useRouter } from 'vue-router';
3839
export default {
3940
setup() {
4041
let store = useStore()
@@ -49,12 +50,23 @@ export default {
4950
// 计算属性 取到currentMenu
5051
const current = computed(() => {
5152
return store.state.currentMenu;
53+
5254
})
55+
const router = useRouter();
56+
// 退出 需要清除菜单 在store index.js
57+
const handleLoginOut = () => {
58+
store.commit('cleanMenu');
59+
router.push({
60+
name: 'login',
61+
});
62+
63+
}
5364
return {
5465
// imgSrc,
5566
getImagSrc,
5667
handleCollapse,
5768
current,
69+
handleLoginOut,
5870
5971
}
6072
}

src/components/CommonTab.vue

+1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ export default {
5656
padding-top: 10px;
5757
padding-left: 10px;
5858
// padding: 20px;
59+
width: 100%;
5960
.el-tag {
6061
margin-right: 15px;
6162
cursor: pointer;

src/main.js

+25
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,30 @@ for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
1414
// 全局挂在api
1515
app.config.globalProperties.$api = api
1616
store.commit("addMenu", router)
17+
// 页面跳转-检查一个给定的路径是否存在于路由列表中
18+
function checkRouter(path) {
19+
// 获取路由
20+
let hasCheck = router.getRoutes().filter(route => route.path == path).length
21+
if (hasCheck) {
22+
return true
23+
} else {
24+
return false
25+
}
26+
// console.log(router.getRoutes(), 'router.getRoutes');
27+
}
28+
checkRouter()
29+
// 路由守卫 它是在每个路由导航之前执行的一个钩子函数
30+
router.beforeEach((to, from, next) => {
31+
store.commit('getToken')
32+
const token = store.state.token
33+
// 检查token是否存在,如果不存在且用户尝试访问的不是登录页面,就会重定向到登录页面。
34+
if (!token && to.name !== 'login') {
35+
next({ name: 'login' })
36+
} else if (!checkRouter(to.path)) {
37+
next({ name: 'home' })
38+
} else {
39+
next()
40+
}
41+
})
1742
app.use(router).use(store)
1843
app.mount('#app')

src/router/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ const routes = [
3232
},
3333
{
3434
path: '/login',
35+
name: 'login',
3536
component: () => import('../views/Login.vue')
3637
},
3738
]

src/store/index.js

+26-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// vuex 侧边栏折叠展开
22
import { createStore } from 'vuex';
3+
import Cookie from 'js-cookie';
4+
35
import router from '../router';
46
export default createStore({
57
state: {
@@ -13,21 +15,23 @@ export default createStore({
1315
icon: 'home'
1416
}
1517
],
16-
menu: []
18+
menu: [],
19+
token: '',
1720
},
1821
mutations: {
1922
updateIsCollapse(state, payload) {
2023
state.isCollapse = !state.isCollapse
2124
},
25+
// 面包屑实现
2226
selectMenu(state, val) {
2327
// 判断
2428
// val.name == 'home' ? (state.currentMenu = null) : (state.currentMenu = val)
2529
if (val.name == 'home') {
2630
state.currentMenu = null
2731
} else {
2832
state.currentMenu = val
29-
let result = state.tabsList.findIndex(item => item.name === val.name)
30-
result == -1 ? state.tabsList.push(val) : ''
33+
let result = state.tabsList.findIndex(item => item.name === val.name);
34+
result === -1 ? state.tabsList.push(val) : ''
3135
}
3236
},
3337
closeTab(state, val) {
@@ -68,7 +72,25 @@ export default createStore({
6872
menuArray.forEach(item => {
6973
router.addRoute('home1', item)
7074
})
71-
}
75+
},
76+
77+
// 退出 清除数据
78+
cleanMenu(state) {
79+
state.menu = []
80+
localStorage.removeItem('menu')
81+
},
7282

83+
// 路由守卫
84+
setToken(state, val) {
85+
state.token = val
86+
Cookie.set('token', val)
87+
},
88+
clearToken(state) {
89+
state.token = ''
90+
Cookie.remove('token')
91+
},
92+
getToken(state) {
93+
state.token = state.token || Cookie.get('token')
94+
}
7395
}
7496
})

src/views/Login.vue

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export default {
3131
// console.log(res, 'loginForm')
3232
store.commit("setMenu", res.menu);
3333
store.commit("addMenu", router);
34+
store.commit("setToken", res.token);
3435
// 路由跳转
3536
router.push({
3637
name: 'home',

src/views/Main.vue

+4-1
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,14 @@ export default defineComponent({
4040
}
4141

4242
.common-layout {
43+
4344
.lay-container {
4445
flex-wrap: nowrap;
4546

4647
.right-main {
47-
height: calc(100% -124px) !important;
48+
height: 100%;
49+
height: calc(100% -120px) !important;
50+
4851
}
4952

5053
}

0 commit comments

Comments
 (0)