vue权限管理——菜单权限设置

1.前提:后端提供菜单对应数据

此处用mockjs模拟

javascript 复制代码
const menuList = [
    {'id': 1, path:'/uploadSpec','authName': "上传spec", icon: 'User', children:[], rights:['view','add','edit','delete']},
    {'id': 2, path:'/showSpec', 'authName': "Spec预览", icon: 'DataAnalysis',children:[], rights:['view','add','edit','delete']},
    {'id': 3, path:'/generateTxt', 'authName': "生成测试数据", icon: 'DataAnalysis',children:[], rights:['view','add','edit','delete']},
    {'id': 4, path:'/generateCronjob', 'authName': "生成转码程序", icon: 'Promotion',children:[], rights:['view','add','edit','delete']},
    {'id': 5, path:'/pdfCompare', 'authName': "PDF文档对比", icon: 'DocumentCopy',children:[], rights:['view','add','edit','delete']},
    {'id': 6, path:'/resourceUpdate', 'authName': "资源更新管理", icon: 'Management',children:[], rights:['view','add','edit','delete']},
    {'id': 7, path:'/generateTestCase', 'authName': "自动生成ST/SIT案例", icon: 'Files',children:[], rights:['view','add','edit','delete']},
    {'id': 8, path:'/userManagement', 'authName': "用户管理", icon: 'User', rights:['view']},
    {'id': 9, path:'/roleManagement', 'authName': "角色管理", icon: 'Stamp', rights:['view']},
]

2.登录后将获取的菜单信息同时设置到vuex和sessionStorage中

javascript 复制代码
import * as api from '@/api/api'
import { ElMessage } from 'element-plus'

const state = () => {
    return {
        user:JSON.parse(sessionStorage.getItem("user") || '{}'),
        menuList: JSON.parse(sessionStorage.getItem("menuList") || '[]'),
    }
}

const getters = () => {}

const actions = {
    // 注意async位置和箭头函数写法
    login: async({ commit }, user) => {

        // 调用登录接口
        try {
            let result = await api.login(user);
            if (result.data.code === 200) {
                sessionStorage.setItem("token", result.data.data.token);
                // 调用获取user信息接口
                let loginUser = await api.getLoginUser();
                
                // 调用mutations的login方法
                if (loginUser.data.code === 200) {
                    commit('login', loginUser.data.data);
                } else {
                    ElMessage.error("登录失败:用户信息获取失败");
                }
            } else {
                ElMessage.error("登录失败:" + result.data.errorMsg);
            }
        } catch (error) {
            throw error;
        }
    },

    register: async({ commit, state }, user) => {
        // 调用注册接口,注册不需要更新vuex,所以不需要调用mutations
        try {
            let registerUser = await api.register(user);
            if (registerUser) return registerUser;
        } catch (error) {
            throw error;
        }
    },
}

const mutations = {
    initUser: (state) => {
        // 从localStorage中获取数据设置进user中,否则通过刷新页面时,获取不到state中的user信息
        state.user = JSON.parse(sessionStorage.getItem("loginUser"));
    },

    login: (state, user) => {
        // 登录成功后将user信息存到state中,且缓存到localStorage中        
        state.user = user;
        state.menuList = user.menuList;
        sessionStorage.setItem("loginUser", JSON.stringify(user));
        sessionStorage.setItem("menuList", JSON.stringify(user.menuList));
    },
}

export default {
    namespaced: true,
    state,
    getters,
    actions,
    mutations
}

3. TAside.vue侧边栏中引入vuex的菜单信息

html 复制代码
        <el-menu
          :default-active="$route.path"
          router
          active-text-color="#ffd04b"
          background-color="#545c64"
          text-color="#fff"
        >
          <template #title>
            <el-icon>
              <i-ep-message />
            </el-icon>导航菜单
          </template>
          <!-- 根据后端返回rights数据渲染菜单 -->
          <el-menu-item :index="menu.path" v-for="menu in menuList" :key="menu.id">
            {{menu.authName}}
          </el-menu-item>
        </el-menu>
...
import { computed } from "vue";
import { useStore } from "vuex";

const store = useStore();
const menuList = computed(() => store.state.user.menuList);
...

4.问题:如果刷新后菜单栏消失

就是菜单数据没有设置到本地sessionStorage中

5.退出登录后需要清空sessionStorage

javascript 复制代码
sessionStorage.clear();
相关推荐
用户1257585243637 分钟前
写了三年定时任务还在手改 Cron 表达式?这个 GoFrame 后台框架帮你全闭环了
vue.js
前端那点事1 小时前
Vue3自定义Hooks保姆级教程!从原理到企业级实战,告别混乱代码
前端·vue.js
前端那点事1 小时前
别再乱用Vue3响应式!ref、reactive、toRef、toRefs完整区别+企业级落地实战
前端·vue.js
閞杺哋笨小孩1 小时前
从脚手架到构建注入:Vue 多租户「入驻」工程实践
vue.js·vite
卤蛋fg63 小时前
VxeTable 实现表尾合计行并支持数据实时统计
vue.js
杨大厨wd3 小时前
Vue3 业务组件封装别只会传 props:如何设计一个真正好用的组件
vue.js
前端那点事3 小时前
Vue3 script setup 语法糖最全教程!零基础吃透+项目落地+面试满分
前端·vue.js
卷帘依旧4 小时前
Vue 响应式原理:Object.defineProperty vs Proxy 深度对比
前端·vue.js
布局呆星4 小时前
Vue3 路由守卫详解:全局守卫、路由独享守卫、组件内守卫
前端·javascript·vue.js
小李子呢02114 小时前
前端八股Vue---ref操作 DOM 元素或组件,调用子组件方法
前端·javascript·vue.js