router.beforeEach((to, from, next) => { if (store.getters.getRouters == null) { // 获取菜单和路由 getMenusApi(params).then((res) => { if (res.data.length === 0) { window.location.href = process.env.VUE_APP_API_BASE_CONSOLE || '' } const { data } = res const menuNav = [] const childrenNav = [] // 后端数据, 根级树数组, 根级 PID listToTree(data, childrenNav, 0) menuNav.push(...childrenNav) const routers = generator(menuNav, null) routers.forEach((r) => { router.addRoute(r) }) router.addRoute(page404) store.commit('SET_ROUTERS', routers[0].children) // 请求带有 redirect 重定向时,登录自动重定向到该地址 const redirect = decodeURIComponent(from.query.redirect || to.path) if (to.path === redirect) { // set the replace: true so the navigation will not leave a history record next({ ...to, replace: true }) } else { // 跳转到目的路由 next({ path: redirect }) } }).catch((error) => { console.log(error,'error') if (error.data.code !== 200 || error.data.data.length === 0) { setTimeout(function () { window.location.href = process.env.VUE_APP_API_BASE_CONSOLE || '' }, 5) } }) // // 获取按钮权限 // getPermissionApi(params).then((res: any) => { // if (res.data.code !== 200) return ElMessage.error(res.data.message) // store.commit('SET_PERMISSION', res.data.data) // }) // // 获取数据权限 // getRolesApi(params).then((res: any) => { // if (res.data.code !== 200) return ElMessage.error(res.data.message) // store.commit('SET_ROLES', res.data.data) // }) // // 获取用户信息 // getUserInfoApi().then((res: any) => { // if (res.data.code !== 200) return ElMessage.error(res.data.message) // store.commit('SET_USERS', res.data.data) // }) } else { next() } })
时间: 2024-02-14 21:20:15 浏览: 169
这是一个 Vue 路由守卫的代码片段,用于在路由切换前进行一些操作。其中包含了以下主要逻辑:
1. 判断 store 中的路由信息是否为空,如果为空则向后端发起请求获取菜单和路由信息。
2. 通过 getMenusApi 函数向后端发起请求,获取菜单和路由信息。如果请求成功,则将获取到的菜单和路由信息转换为前端路由,并添加到 Vue Router 中。
3. 如果请求带有 redirect 重定向参数,则自动跳转到该地址。
4. 如果 store 中已经有路由信息,则直接跳转到目的路由。
5. 如果获取菜单和路由信息失败,则跳转到 404 页面或者登录页面。
注释中的代码是一些额外的逻辑,用于获取用户信息、按钮权限、数据权限等。
相关问题
// 导航守卫 router.beforeEach((to, from, next) => { const isAuthenticated = // 判断用户是否已登录,可以根据实际情况使用登录状态管理插件或其他方式进行判断 if (to.meta.requiresAuth && !isAuthenticated) { // 需要登录权限但用户未登录,跳转到登录页 next({ name: 'Home' }); } else if (to.meta.requiresAuth && to.meta.role && to.meta.role !== userRole) { // 需要特定角色权限但用户角色不匹配,跳转到无权限页面 next({ name: 'NotFound' }); } else { next(); } }); 在const isAuthenticated = 填写
判断用户是否已经登录的代码,可以根据实际情况来写,以下是一些常见的方式:
1. 使用 Vuex 管理登录状态,判断用户是否登录
```
import store from '@/store';
const isAuthenticated = store.getters['auth/isLoggedIn'];
```
2. 判断本地存储中是否存在登录信息
```
const isAuthenticated = localStorage.getItem('authToken') !== null;
```
3. 判断 cookie 中是否存在登录信息
```
const isAuthenticated = document.cookie.indexOf('authToken=') !== -1;
```
根据实际情况进行选择,需要注意的是,在用户登录之后,需要将登录状态保存下来,以便在导航守卫中进行判断。
已知后端为springboot + security 在数据库在存在user表 表结构为: [ userid authority role username password 1 管理者 admin admins 123456 2 高级管理 user User 654321 3 普通管理 manag Manag 567890 ] 后端登录路径为"/login"; 前端请求封装文件 axios.js为: import axios from "axios"; const system = axios.create({ baseURL:'http://localhost:8088', changeOriging:true, }); export default system; 在vue3中如何利用router store 实现权限登录 不同的账号访问不同的路径 ( 如 账号admin 密码:123456; 账号user 密码abcdef ) 组件内script使用<script setup>
在组件内的`<script setup>`中,可以利用router和store来实现权限登录和不同账号访问不同路径的需求。具体实现步骤如下:
1. 在store中定义一个state,用于存储当前登录用户的信息,例如:
```
const state = {
currentUser: null
};
```
2. 在store中定义一个action,用于处理登录逻辑,例如:
```
const actions = {
login({ commit }, { username, password }) {
return system.post('/login', { username, password }).then(response => {
const { userid, authority, role } = response.data;
commit('setCurrentUser', { userid, authority, role });
});
}
};
```
其中,`system`是前面封装好的axios实例,用于发送登录请求。登录成功后,将响应数据中的`userid`、`authority`和`role`存储到state中的`currentUser`中。
3. 在store中定义一个getter,用于获取当前登录用户的角色信息,例如:
```
const getters = {
currentUserRole(state) {
return state.currentUser ? state.currentUser.role : null;
}
};
```
4. 在路由配置中,定义需要进行权限控制的路由和对应的角色信息,例如:
```
const routes = [
{
path: '/admin',
component: AdminComponent,
meta: { roles: ['admin'] }
},
{
path: '/user',
component: UserComponent,
meta: { roles: ['user', 'admin'] }
},
{
path: '/manag',
component: ManagComponent,
meta: { roles: ['manag', 'user', 'admin'] }
}
];
```
其中,`meta`属性用于存储路由的元数据信息,这里存储了需要访问该路由需要的角色信息。
5. 在路由配置中,定义一个全局前置守卫,用于进行权限校验,例如:
```
router.beforeEach((to, from, next) => {
const requiredRoles = to.meta.roles;
const currentUserRole = store.getters.currentUserRole;
if (requiredRoles && requiredRoles.indexOf(currentUserRole) === -1) {
next('/login');
} else {
next();
}
});
```
该守卫会在每个路由跳转前进行校验,如果当前用户的角色信息不满足路由的要求,就跳转到登录页面。
6. 在组件中,调用store中的登录action进行登录,例如:
```
<script setup>
import { reactive } from 'vue';
import { useRouter } from 'vue-router';
import { useStore } from 'vuex';
const state = reactive({
username: '',
password: ''
});
const router = useRouter();
const store = useStore();
const handleSubmit = () => {
store.dispatch('login', { username: state.username, password: state.password }).then(() => {
router.push('/');
});
};
</script>
```
这里使用了`reactive`来定义响应式数据,`useRouter`来获取路由实例,`useStore`来获取store实例。当用户提交登录表单时,调用store中的登录action进行登录,并在登录成功后跳转到首页。
以上就是利用router和store实现权限登录和不同账号访问不同路径的步骤,希望能对你有所帮助。
阅读全文