vue 后台管理系统菜单权限管理

来自:https://www.cnblogs.com/fqh123/p/11094296.html 侵删

login登录方法

login() {
      if (!this.username) {
        return this.$message.error("请输入用户名");
      }
      if (!this.password) {
        return this.$message.error("请输入密码");
      }
      if (this.checked) {
        localStorage.setItem("username", this.username);
        localStorage.setItem("password", this.password);
        localStorage.setItem("checked", 1);
      } else {
        localStorage.removeItem("username");
        localStorage.removeItem("password");
        localStorage.removeItem("token");
      }
      let data = {
        username: this.username,
        password: this.password
      };

      this.$store
        .dispatch("login", data)
        .then(() => {
          this.$message.success("登录成功");
          this.$router.push({ path: "/" });
        })
        .catch(() => {
          console.log(222);
          this.$message.error("登陆失败");
          //   this.loading = false;
        });
    },

store中

import Vue from "vue";
import Vuex from "vuex";
import { getToken, setToken, removeToken, deepClone } from '@/utils/auth'
import { formatDate } from "@/utils/index.js";
import { login, getUserInfo } from "@/api/mine.js";
import { asyncRouterMap, constantRoutes } from '@/router';

Vue.use(Vuex);

function hasPermission(menuMap, route) {
    if (route.meta && route.meta.menu_code) {
        for (const item of menuMap) {
            if (item === route.meta.menu_code) {
                return true
            }
        }
        return false
    } else {
        return true
    }
}
function filterAsyncRouter(asyncRouterMap, menuMap) {
    const accessedRouters = asyncRouterMap.filter(route => {
        if (hasPermission(menuMap, route)) {
            if (route.children && route.children.length) {
                route.children = filterAsyncRouter(route.children, menuMap)
            }
            return true
        }
        return false
    })
    return accessedRouters
}

const store = new Vuex.Store({
    state: {
        userId: '',
        mapcontrols: '', //地图的集合
        carlist: '', //行车的集合
        attachment: '', //附近的集合
        menulist: null,//一级导航
        lnglat: {},//经纬度
        actionUrl: process.env.VUE_APP_BASE_API + "/couplet-admin/file/uploadImage", //上传图片的url
        tokenObj: { "author-token-key": localStorage.getItem("token") },  //上传的请求头token
        token: getToken(),
        routers: constantRoutes,
        addRouters: []
    },
    getters: {
        userId_: state => state.userId,
        mapcontrols_: state => state.mapcontrols,
        carlist_: state => state.carlist,
        attachment_: state => state.attachment,
        menulist_: state => state.menulist,
        lnglat_: state => state.lnglat,
        actionUrl_: state => state.actionUrl,
        tokenObj_: state => state.tokenObj,
        token_: state => state.token,
        routers_: state => state.routers,
        addRouters_: state => state.addRouters
    },
    mutations: {
        changemapcontrols: function (state, payload) {
            state.mapcontrols = payload
        },
        changecarlist: function (state, payload) {
            state.carlist = payload
        },
        changeMenulist: function (state, payload) {
            state.menulist = payload
        },
        changecheckAttachment: function (state, payload) {
            state.attachment = payload
        },
        changelnglat: function (state, payload) {
            state.lnglat = payload
        },
        changecheckUserId: function (state, payload) {
            state.userId = payload
        },
        SET_TOKEN: (state, token) => {
            state.token = token
        },
        SET_ROUTERS: (state, routers) => {
            state.addRouters = deepClone(routers)
            state.routers = deepClone(constantRoutes.concat(routers))
        }
    },
    actions: {
        changeformDatas({ commit }, datatime) {
            return new Promise((resolve, reject) => {
                let time = formatDate(Number(datatime), "yyyy-MM-dd")
                resolve(time)
            })
        },
        login({ commit }, userInfo) {
            const { username, password } = userInfo
            return new Promise((resolve, reject) => {
                login({ username: username.trim(), password: password }).then(response => {
                    commit('SET_TOKEN', response.body)
                    setToken(response.body)
                    resolve()
                }).catch(error => {
                    reject(error)
                })
            })
        },
        getInfo({ dispatch, commit, state }) {
            return new Promise((resolve, reject) => {
                getUserInfo().then(response => {
                    // if (!data) {
                    //     reject('Verification failed, please Login again.')
                    // }
                    // const menus = data.menuCodes
                    commit('changecheckUserId', response.body.userId)
                    var data = response.body
                    console.log('response', data)
                    // localStorage.setItem('MENU_CODE', menus)
                    const menus = ['/equipmentManagement', '/camera']
                    dispatch('GenerateRoutes', menus).then(res => {
                        resolve(data)
                    })
                }).catch(error => {
                    reject(error)
                })
            })
        },
        resetToken({ commit }) {
            return new Promise(resolve => {
                commit('SET_TOKEN', '')
                removeToken()
                resolve()
            })
        },
        GenerateRoutes({ commit }, data) {
            return new Promise(resolve => {
                const accessRouters = filterAsyncRouter(asyncRouterMap, data)
                accessRouters.push({ path: '*', redirect: '/404', hidden: true })
                commit('SET_ROUTERS', accessRouters)
                resolve()
            })
        }
    }
});
export default store
@/utils/auth 中
// import Cookies from 'js-cookie'

const TokenKey = 'Authorization'

export function getToken() {
  // return Cookies.get(TokenKey)
  return localStorage.getItem(TokenKey)
}

export function setToken(token) {
  // return Cookies.set(TokenKey, token)
  return localStorage.setItem(TokenKey, token)
}

export function removeToken() {
  // return Cookies.remove(TokenKey)
  return localStorage.removeItem(TokenKey)
}

export function deepClone(source) {
  if (!source && typeof source !== 'object') {
    throw new Error('error arguments', 'shallowClone')
  }
  const targetObj = source.constructor === Array ? [] : {}
  for (const keys in source) {
    if (source.hasOwnProperty(keys)) {
      if (source[keys] && typeof source[keys] === 'object') {
        targetObj[keys] = source[keys].constructor === Array ? [] : {}
        targetObj[keys] = deepClone(source[keys])
      } else {
        targetObj[keys] = source[keys]
      }
    }
  }
  return targetObj
}
@/router 中
import Vue from "vue"
import Router from "vue-router"
import store from "./store";

Vue.use(Router)

// console.log("store.getters",store.getters)
// console.log("store.getters.menulist_",store.getters.menulist_)

const notFound = () => import('@/views/404.vue') //404
//登录相关
const login = () => import('@/views/mine/login.vue') //用户登录
const phoneLogin = () => import('@/views/mine/phoneLogin.vue') //手机登录
const retrievePassword = () => import('@/views/mine/retrievePassword.vue') //找回密码
const modifyPassword = () => import('@/views/mine/modifyPassword.vue') //修改密码

const layout = () => import('@/views/layout/index.vue') //导航
const Index = () => import('@/views/index/index.vue') //首页

//管控中心菜单
const mapControls = () => import('@/views/controlsMenu/mapControls/index.vue') //管控地图
const security = () => import('@/views/controlsMenu/security/index.vue') //安防管理
const fire = () => import('@/views/controlsMenu/fire/index.vue') //消防管理
const car = () => import('@/views/controlsMenu/car/index.vue') //车行管理
const lighting = () => import('@/views/controlsMenu/lighting/index.vue') //智慧照明
const checkAttachment = () => import('@/views/controlsMenu/checkAttachment/index.vue') //附近设备

//设备管理菜单
const equipmentManagement = () => import('@/views/equimentMenu/equipmentManagement/index.vue') //设备管理
const camera = () => import('@/views/equimentMenu/camera/index.vue') //摄像头
const wifismoke = () => import('@/views/equimentMenu/wifismoke/index.vue') //路灯控制
const lightAll = () => import('@/views/equimentMenu/lightAll/index.vue') //智慧灯杆
const postScreen = () => import('@/views/equimentMenu/postScreen/index.vue') //发布屏
//告警管理菜单
const alarmManagement = () => import('@/views/alarmMenu/alarmManagement/index.vue') //告警管理
const alarmManagementHoistory = () => import('@/views/alarmMenu/alarmManagementHoistory/index.vue') //告警管理历史

//事件工单菜单
const eventOrder = () => import('@/views/orderMenu/eventOrder/index.vue') //事件工单
const eventOrderHistory = () => import('@/views/orderMenu/eventOrderHistory/index.vue') //事件工单历史

//巡检菜单
const inspectionTrajectory = () => import('@/views/inspectionMenu/inspectionTrajectory/index.vue') //巡检轨迹
const InspectionTask = () => import('@/views/inspectionMenu/InspectionTask/index.vue') //巡检任务单
const InspectionProject = () => import('@/views/inspectionMenu/InspectionProject/index.vue') //巡检项目组
const InspectionConfig = () => import('@/views/inspectionMenu/InspectionConfig/index.vue') //巡检配置

//预案菜单
const emergencyPlan = () => import('@/views/planMenu/emergencyPlan/index.vue') //应急预案

//系统配置菜单
const user = () => import('@/views/systemMenu/user/index.vue') //用户管理
const org = () => import('@/views/systemMenu/org/index.vue') //组织管理
const area = () => import('@/views/systemMenu/area/index.vue') //区域管理
const role = () => import('@/views/systemMenu/role/index.vue') //角色管理
const menu = () => import('@/views/systemMenu/menu/index.vue') //菜单管理
const log = () => import('@/views/systemMenu/log/index.vue') //操作日志
const partition = () => import('@/views/systemMenu/partition/index.vue') //系统项目管理
const dictionary = () => import('@/views/systemMenu/dictionary/index.vue') //数据字典管理
const appPlat = () => import('@/views/systemMenu/platform/appPlat/index.vue') //平台服务管理  -- 应用平台
const provider = () => import('@/views/systemMenu/platform/provider/index.vue') //平台服务管理  -- 供应商平台
const configManage = () => import('@/views/systemMenu/platform/provider/configManage/index.vue') //平台服务管理  -- 供应商平台--园区配置管理
const apiManage = () => import('@/views/systemMenu/platform/provider/apiManage/index.vue') //平台服务管理  -- 供应商平台--接口管理


//-----------------------------
/**
 * constantRoutes
 * a base page that does not have permission requirements
 * all roles can be accessed
 */
export const constantRoutes = [
    { path: "/404", name: '404', component: notFound, hidden: true },
    { path: "/login", name: "login", component: login, hidden: true },
    { path: "/phoneLogin", name: "phoneLogin", component: phoneLogin, hidden: true },
    { path: "/retrievePassword", name: "retrievePassword", component: retrievePassword, hidden: true },
    { path: "/modifyPassword", name: "modifyPassword", component: modifyPassword, hidden: true },
    {
        path: '/',
        component: layout,
        redirect: '/mapControls',
        children: [{
            path: 'mapControls',
            name: 'mapControls',
            component: mapControls,
        },
        ]
    },
]
//动态加载路由
export const asyncRouterMap = [
    {
        path: '/equipmentManagement',
        component: layout,
        meta: { title: 'equipmentManagement', menu_code: '/equipmentManagement' },
        redirect: '/equipmentManagement',
        children: [{
            path: '/equipmentManagement',
            name: 'equipmentManagement',
            component: equipmentManagement,
            meta: { title: 'equipmentManagement', menu_code: '/equipmentManagement' },
            hidden: true
        },
        {
            path: '/camera',
            name: 'camera',
            component: camera,
            meta: { title: 'camera', menu_code: '/camera' },
            hidden: true
        }
        ]
    },
]

const createRouter = () => new Router({
    // mode: 'history', // require service support
    // mode: 'hash', // require service support
    scrollBehavior: () => ({ y: 0 }),
    routes: constantRoutes
})

const router = createRouter()

// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465
export function resetRouter() {
    const newRouter = createRouter()
    router.matcher = newRouter.matcher // reset router
}

export default router

permission.js 中

import router from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
import { getToken } from '@/utils/auth' // get token from cookie

NProgress.configure({ showSpinner: false }) // NProgress Configuration  是否有转圈效果
const whiteList = ['/login'] // 没有重定向白名单

router.beforeEach(async (to, from, next) => {
  // 开始进度条
  NProgress.start()
  // 确定用户是否已登录
  const hasToken = getToken()
  if (hasToken) {
    if (to.path === '/login') {
      // 如果已登录,则重定向到主页
      next({ path: '/' })
      NProgress.done()
    } else {
      const hasGetUserInfo = store.getters.userId_;
      if (hasGetUserInfo) {
        // console.log("有用户信息");
        next();
      } else {
        // console.log("没用户信息");
        try {
          // 获得用户信息
          await store.dispatch('getInfo');
          router.addRoutes(store.getters.addRouters_)//动态路由
          next({ ...to })
        } catch (error) {
          // 删除token,进入登录页面重新登录
          await store.dispatch('resetToken');
          Message.error(error || 'Has Error');
          next(`/login?redirect=${to.path}`);
          NProgress.done();
        }
      }

    }
  } else {
    /* has no token*/
    if (whiteList.indexOf(to.path) !== -1) {
      // 在免费登录白名单,直接去
      next()
    } else {
      // 没有访问权限的其他页面被重定向到登录页面。
      next(`/login?redirect=${to.path}`)
      NProgress.done()
    }
  }
})

router.afterEach(() => {
  // 完成进度条
  NProgress.done()
})

基本剩下的雷同文章来源了

posted @ 2019-09-10 15:31  abcByme  阅读(3882)  评论(0编辑  收藏  举报