vue-admin-template 新手學習(四) 頁面權限控制

vue-admin-template 启用准备工作 vue-admin-template是基于vue-element-admin的一套后台管理系统基础模板(最少精简版),可作为模板进行二次开发。你可以在的基础上进行二次开发,把当做工具箱,想要什么功能或者组件就去那里复制过来。 阅读详情

1.創建vue實例的時候  掛載vue-router

2.用戶登錄後獲取role  將role和路由美國頁面權限比較 生成最終用戶可訪問的路由表

3.調用router.addRoutes 添加可訪問路由

4.使用vuex管理路由 根據vuex中可訪問路由渲染側邊欄組件

 

在router文件夾下有一個index.js文件 就是用來控制頁面權限的   template模板已經有了靜態路由在index.js文件裡邊

需要在此文件添加動態路由  怎麼menu沒有出現這個動態的側邊欄呢😭  繼續找找看為啥

ps:靜態路由 :代表不需要動態判斷權限的路由

       動態路由:代表需要動態判斷權限並通過個的頁面

  1.  在router文件夾下面的index.js增加動態路由
export const asyncRoutes = [
  {
    path:'/inquiry',
    component: Layout,
    alwaysShow: true,
    meta: {
      title: 'Inquiry',
      icon: 'lock',
      roles: ['admin']
    },
    children: [
      {
        path: 'create',
        component: () => import('@/views/inquiry/form'),
        name: 'CreateInquiry',
        meta: {
          title: 'CreateInquiry',
          icon: 'lock',
          roles: ['admin']
        }
      }
    ]
  }
]

  2. 因為是mock數據,所以要在mock下添加routes.js

export const constantRoutes = [
  {
    path: '/login',
    component: () => import('@/views/login/index'),
    hidden: true
  },

  {
    path: '/404',
    component: () => import('@/views/404'),
    hidden: true
  },

  {
    path: '/',
    component: Layout,
    redirect: '/dashboard',
    children: [{
      path: 'dashboard',
      name: 'Dashboard',
      component: () => import('@/views/dashboard/index'),
      meta: { title: 'Dashboard', icon: 'dashboard' }
    }]
  },

  {
    path: '/example',
    component: Layout,
    redirect: '/example/table',
    name: 'Example',
    meta: { title: 'Example', icon: 'example' },
    children: [
      {
        path: 'table',
        name: 'Table',
        component: () => import('@/views/table/index'),
        meta: { title: 'Table', icon: 'table' }
      },
      {
        path: 'tree',
        name: 'Tree',
        component: () => import('@/views/tree/index'),
        meta: { title: 'Tree', icon: 'tree' }
      }
    ]
  },

  {
    path: '/form',
    component: Layout,
    children: [
      {
        path: 'index',
        name: 'Form',
        component: () => import('@/views/form/index'),
        meta: { title: 'Form', icon: 'form' }
      }
    ]
  },

  {
    path: '/nested',
    component: Layout,
    redirect: '/nested/menu1',
    name: 'Nested',
    meta: {
      title: 'Nested',
      icon: 'nested'
    },
    children: [
      {
        path: 'menu1',
        component: () => import('@/views/nested/menu1/index'), // Parent router-view
        name: 'Menu1',
        meta: { title: 'Menu1' },
        children: [
          {
            path: 'menu1-1',
            component: () => import('@/views/nested/menu1/menu1-1'),
            name: 'Menu1-1',
            meta: { title: 'Menu1-1' }
          },
          {
            path: 'menu1-2',
            component: () => import('@/views/nested/menu1/menu1-2'),
            name: 'Menu1-2',
            meta: { title: 'Menu1-2' },
            children: [
              {
                path: 'menu1-2-1',
                component: () => import('@/views/nested/menu1/menu1-2/menu1-2-1'),
                name: 'Menu1-2-1',
                meta: { title: 'Menu1-2-1' }
              },
              {
                path: 'menu1-2-2',
                component: () => import('@/views/nested/menu1/menu1-2/menu1-2-2'),
                name: 'Menu1-2-2',
                meta: { title: 'Menu1-2-2' }
              }
            ]
          },
          {
            path: 'menu1-3',
            component: () => import('@/views/nested/menu1/menu1-3'),
            name: 'Menu1-3',
            meta: { title: 'Menu1-3' }
          }
        ]
      },
      {
        path: 'menu2',
        component: () => import('@/views/nested/menu2/index'),
        meta: { title: 'menu2' }
      }
    ]
  },

  {
    path: 'external-link',
    component: Layout,
    children: [
      {
        path: 'https://panjiachen.github.io/vue-element-admin-site/#/',
        meta: { title: 'External Link', icon: 'link' }
      }
    ]
  },

  // 404 page must be placed at the end !!!
  { path: '*', redirect: '/404', hidden: true }
]

export const asyncRoutes = [
  {
    path: '/inquiry',
    component: Layout,
    redirect: '/inquiry/list',
    name: 'Inquiry',
    meta: { title: '詢價', icon: 'example' },
    children: [
      {
        path: 'create',
        name: 'Inquiry',
        component: () => import('@/views/inquiry/form'),
        meta: { title: '創建詢價單', icon: 'table', roles: ['admin'] }
      },
      {
        path: 'list',
        name: 'List',
        component: () => import('@/views/inquiry/list'),
        meta: { title: '詢價列表', icon: 'tree', roles: ['admin'] }
      }
    ]
  }
]

3.這個時候 發現store下的getters.js沒有把獲取路由的方法  好了  添加進去  😭  怎麼回事  

const getters = {
  sidebar: state => state.app.sidebar,
  device: state => state.app.device,
  token: state => state.user.token,
  avatar: state => state.user.avatar,
  name: state => state.user.name,
  roles: state => state.user.roles,
  promission_routes: state => state.promission_routes
}

4.因為沒有permission 許可啊  啊啊啊

import { asyncRoutes, constantRoutes } from '@/router'


function hasPermission(roles, route) {
  if (route.meta && route.meta.roles) {
    return roles.some(role => route.meta.roles.includes(role))
  } else {
    return true
  }
}


export function filterAsyncRoutes(routes, roles) {
  const res = []

  routes.forEach(route => {
    const tmp = { ...route }
    if (hasPermission(roles, tmp)) {
      if (tmp.children) {
        tmp.children = filterAsyncRoutes(tmp.children, roles)
      }
      res.push(tmp)
    }
  })

  return res
}

const state = {
  routes: [],
  addRoutes: []
}

const mutations = {
  SET_ROUTES: (state, routes) => {
    state.addRoutes = routes
    state.routes = constantRoutes.concat(routes)
  }
}

const actions = {
  generateRoutes({ commit }, roles) {
    return new Promise(resolve => {
      let accessedRoutes
      if (roles.includes('admin')) {
        accessedRoutes = asyncRoutes || []
      } else {
        accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
      }
      commit('SET_ROUTES', accessedRoutes)
      resolve(accessedRoutes)
    })
  }
}

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

5.api文件耶應該響應的增加請求頁面權限的api

import request from '@/utils/request'
 
export function getRoutes() {
  return request({
    url: '/routes',
    method: 'get'
  })
}
 
export function getRoles() {
  return request({
    url: '/roles',
    method: 'get'
  })
}
 
export function addRole(data) {
  return request({
    url: '/role',
    method: 'post',
    data
  })
}
 
export function updateRole(id, data) {
  return request({
    url: `/role/${id}`,
    method: 'put',
    data
  })
}
 
export function deleteRole(id) {
  return request({
    url: `/role/${id}`,
    method: 'delete'
  })
}

 

5.喔  no  還有需要路由列表和權限比較啊(在utils文件夾下增加 permission.js)

import store from '@/store'


export default function checkPermission(value) {
  if (value && value instanceof Array && value.length > 0) {
    const roles = store.getters && store.getters.roles
    const permissionRoles = value

    const hasPermission = roles.some(role => {
      return permissionRoles.includes(role)
    })

    if (!hasPermission) {
      return false
    }
    return true
  } else {
    console.error(`need roles! Like v-permission="['admin','editor']"`)
    return false
  }
}

 

 

6.然後還需要在組件下面sidebar的index加入計算屬性 

 computed: {
    ...mapGetters([
      'premission_routes',
      'sidebar'
    ]),

然後 然後 發現頁面登錄成功無法跳轉了😭

7.  最後需要在src下permission添加權限控制邏輯

if (hasToken) {
    if (to.path === '/login') {
      // if is logged in, redirect to the home page
      next({ path: '/' })
      NProgress.done()
    } else {
      const hasRoles = store.getters.roles && store.getters.roles.length > 0
      if (hasRoles) {
        next()
      } else {
        try {
          // get user info
          const { roles } = await store.dispatch('user/getInfo')
          const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
          router.addRoutes(accessRoutes)
          next({ ...to, replace: true })
        } catch (error) {
          // remove token and go to login page to re-login
          await store.dispatch('user/resetToken')
          Message.error(error || 'Has Error')
          next(`/login?redirect=${to.path}`)
          NProgress.done()
        }
      }
    }
  } 

 大功告成

 

代碼會同步到github上  大家有空可以去看看 

https://github.com/null2014/shopsmanagement

vue-element-admin-template 權限控制整理 vue-element-admin是個強大的管理後台框架 https://github.com/PanJiaChen/vue-element-admin/tree/master/src/directive 經過了一些琢磨,終於知道vue-element-admin-template如何增加權限控制 首先,先把邏輯關係理清楚: 登錄後通過token獲取用戶對應的角色rol... 阅读详情

相关推荐

ADS交叉耦合振荡器VCO仿真

本文主要参考视频中如何使用进行ADS交叉耦合振荡器仿真和分析,由于视频中有诸多错误和视频清晰度较低,虽然视频博主及时改正,为了节省学习时间,可以直接参考本文。

qq_32589131的博客 5425

vue export default和export function区别

第一种 export default{ login(data){ return request({ url:'/login', method:'post', data:data, }) }, reg(data){ return request({ url:'/reg', method:'post', data:data, }) } } 第二种 export function login (params) { .

qq_40238532的博客 5866

MAX30102心率血样模块在STM32F103芯片的程序说明

我希望你已经安装好了Keil MDK5这个软件,也安装了M3内核,可以编译一些STM32F103的一些项目下载程序后步骤: 1-按照下图找到IIC.uvprojx并打开(途中唯一绿色那个图标) 2-编译一次 3-确保0错误,0警告,下图所示 4-点击目标选项,然后找到STM32F103C8,再点debug–CMSIS****(我实际用的JTAG,用不了,选择这个CMSIS****即可)下图所示 5-下图所示,看看你的串口找到了没,找到了就点左下角的OK 6-按图上传到开发板 7-MAX30102接线方法

weixin_51357422的博客 5801

vue3.0+Ant Design Vue后台crm管理系统admin

使用了Vue3.0全家桶、ant-design-vue2.0,实践vue3.0的新特性以及玩法,vue3.0的Composition API相比于vue2.0的Options API 灵活很多,让我们可以灵活地组合组件逻辑,目前后端admin大部分还是vue2.6;但是未来被vue3取代是大势所趋,望早上岸!

修改Avaya IP-Office电话交换机出厂自带的提示语音内容

1,本文的应用场景是在使用Avaya IP-office 500 v2电话交换机时,来电振铃超时后,会转入语音信箱,呼叫者会听到一条语音信箱留言的欢迎辞(…请留言…)。但我们单位情况比较特殊,首先是的IPO配置很精简,内嵌的语音信箱只能保留3天,用处不大;其次是用户没有收听语音信箱的习惯;第三是我们单位使用数字中继和DID,每人一个直拨号码,不通过总机转接。很多业务是单线联系,所以一旦来电无法接通,来电者可能完全无法联系到我们单位的其他同事。出于这三点原因,我们希望将语音信箱的欢迎辞,增加告知我们的总机电话

qlin4cn的博客 4919

python编程实现制作网络流量监控动画

c,实时显示网络带宽使用情况,用柱状图或折线图表示不同时间段的流量变化。通过 Python编程实现图形库(如 Pygame、Tkinter、Matplotlib 等)来实现计算机网络基础概念的可视化动画。global bars # 声明 bars 为全局变量。# 获取当前网络流量。# 创建图形和坐标轴。

qq_42788199的博客 718

最好用的 7 款 Vue admin 后台管理系统测评

Vue admin 后台管理系统作为每个项目必备的管理后台,对大家来说十分重要。选不好,配不好,不仅现在用着抓狂,未来迭代升级也困难重重,步步是坑。所以在技术选型阶段,就要对市面上主流的 Vue admin 做到全面了解,知道他们的优缺点,再根据自己项目的需求,有针对性的选择。 我试用了市面上所有主流 Vue admin 都 npm 到本地测了一遍,筛掉长期不更新,bug 明显,社区活跃度低,功能单一的 admin 后台,把最好、最有特点的 7 款 Vue admin 挑出来,分享给大家。这些后台各有各的

蒋川@卡拉云 1万+

HTTPS接口测试翻车实录:为什么浏览器能访问而curl报证书错误?

本文深入分析了HTTPS接口测试中浏览器访问正常而curl报证书错误的典型问题。通过对比浏览器、Postman和curl的工具行为差异,结合Nginx日志与Wireshark抓包,揭示了问题根源在于网络架构中HTTPS请求被意外“降级”为HTTP传输,导致SSL握手失败。文章重点探讨了curl工具严格验证机制暴露的`Peer's Certificate issuer is not recognized`错误,并提供了网络配置修正方案与标准化测试流程。

u9v0w的博客 279

3. Vue入门实战教程之vue-element-admin初体验

基于Vue2.x 最强大的后台管理框架解决方案

极客星云-优快云博客 3万+

YOLOv11改进缝合FasterBlock | 一种新型轻量化卷积结构C3k2的设计与实证:兼顾精度与速度的改进方法(附代码)

YOLO系列一直是目标检测领域的明星算法,凭借其实时性和准确性在众多应用中占据一席之地。随着YOLO版本的不断迭代,网络架构逐渐变得更为复杂,尤其是在卷积模块的设计上。本文将介绍如何利用FasterNet的FasterBlock创新,并通过二次创新C3k2提出一种全新的卷积结构。该结构旨在提高YOLOv11的计算效率和准确性,特别是在视觉任务中的表现。我们的创新在保证高精度的前提下,有效降低了计算量和内存需求,特别适合在资源受限的设备上运行。

一键难忘的博客 906

QGis软件 —— 9、QGis - 由点绘制热力图来模拟人流量(绘制点方式、excel导入数据方式)

QGis软件 —— 9、QGis - 由点绘制热力图来模拟人流量(绘制点方式、excel导入数据方式)

1470

vue-admin-template框架搭建及应用

并且执行 login 方法, 把返回的token , 保存到 vuex、cookie 中(在路由守卫中 / login 是白名单会直接放行、axios 的请求拦截中 添加的是一个空值)style=>页面的css样式。配合路由使用的, 对于vue router 而言它还附带了一些其他的信息, 比如路由守卫, 在路由守卫中我们可以在路由跳转之前来做一些事情的。它只会包装Store中保存的数据,并不会修改Store中保存的数据,当Store中的数据发生变化时,Getter生成的内容也会随之变化;

SKY_PLA的博客 1万+

LPDDR5 学习笔记01:功能概述

LPDDR5/LPDDR5X SDRAM设备采用8/16DQ通道架构,支持2Gb-32Gb容量。通过CK命令时钟和更快的WCK数据时钟协同工作,7个CA引脚传输控制信息,支持2:1或4:1的WCK:CK比例。设备提供BG/8B/16B三种存储模式选择,分别支持不同数据速率(最高8.533Gbps)和突发长度。采用0.5V VDDQ电源电压,实现高速双倍数据速率传输,并通过差分WCK时钟完成数据采样。读写采用突发访问机制,需先激活命令再执行读写操作。新型LPDDR5X仅支持BG和16B模式,优化了高速性能。

一只豌豆象的博客 2203

第13章 vue-admin-template

这是一套简单的vue基础课程,主要介绍vue,vue-router,axios,vuex,element-ui等等

richieandndsc的博客 6960

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

vue-admin-template 添加权限控制路由功能

vue-element-template添加权限控制路由功能vue-element-template添加权限控制路由功能1、 变更@/router/index.js2、添加@/store/modules/permission.js3、改造数据库与实体4、@/store/modules/user.js5、更新 getter.js 和 index.js6、变更 @/permission.js vue-element-template添加权限控制路由功能 vue-element-template 是没有实现路由权

fiskeryang的专栏 3095

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

vue-admin-template 修改登录接口

准备工作 修改 vue.config.js proxy: { // change xxx-api/login => mock/login // detail: https://cli.vuejs.org/config/#devserver-proxy // 为了不影响其他请求的使用,可以将这里注释掉 /* [process.env.VUE_APP_BASE_API]: { target: `http://localhost:9000`,

Yuudachi的博客 9863

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

vue-admin-template后台管理之权限管理,动态路由的实现

###前言: 在开发后台管理项目时,多用户多角色不同权限的场景可以说是非常普遍的。从零开始手写一个后台,要考虑的东西很多,这里直接拿网上大家比较熟悉的vue-admin-template后台模版来进行改造。v:1115009958 也可以看比较完整的前端开发https://www.jianshu.com/p/12ef029e3ab2 对应视频教程 先来看下vue-admin-template这个模版的代码目录结构 ├── build # 构建相关 ├── moc

weixin_43638800的博客 3503

vue-admin-template模板添加tagsview

vue-admin-template模板添加tagsview

xiaohuli_hyr的博客 6661

vue-admin-template学习(四)

vue-admin-template角色的权限判断 后端 实现获取用户角色的方法挺多的,比如: 可以单独写一个通过用户标识获取用户的roles接口 可以在用户登录成功后,返回用户的信息中加入用户的roles信息,我的项目目前用的是这个,所以会以这个写一下记录 实现: // 设置角色 Set<String> rolesSet = roleService.getUserRolesSet(user.getUsername()); return Result.success(MapUtil

qq_32015565的博客 1210

vue学习笔记-vue-admin-template框架学习

vue-admin-template English | 简体中文 使用[vue-admin-template]进行学习前台整合以及vue相关技术,本项目作为学习记录 A minimal vue admin template with Element UI & axios & iconfont & permission control & lint 项目代码: ...

半度微凉 1449

vue-admin-template 常见问题解决方案

vue-admin-template 常见问题解决方案 项目基础介绍和主要编程语言 vue-admin-template 是一个基于 Vue 2.0 的极简后台管理模板,集成了 Element UI、axios、iconfont、权限控制和代码规范检查等功能。该项目的主要编程语言是 JavaScript,同时也使用了 Vue.js 框架和 SCSS 进行样式编写。 新手使用注意事项及解决方案 1....

gitblog_09048的博客 802

vue-admin-template登录以及权限使用

vue-admin-template是vue-element-admin的一个基础方案,很适合入门使用。 vue-element-admin官网 首先下载下来之后, npm install 在项目主目录运行该命令完成项目依赖的下载 npn run dev 运行这个命令即可完成项目的运行。 下面介绍关于登录部分 自定义登录接口 该项目是通过login进行登录且每一次请求通过info请求进行验证用户身份,以及logout退出登录。 找到登录页面代码(src/views/login/index.vue) h

ruofanwei的博客 9032

Vue Admin Template 快速开发指南:从入门到实战的后台框架搭建手册

Vue Admin Template 作为一款轻量级 Vue 后台框架,集成了路由管理、权限控制、网络请求等核心功能,特别适合快速构建中小型管理系统。本文将通过「基础架构解析」「核心流程拆解」「个性化配置指南」三大模块,帮助开发者5分钟上手,避开90%的常见坑点,掌握前端权限管理与工程化配置的实战技巧。 ## 一、基础架构解析:认识模板的"五脏六腑" 🔍 **核心要点**:掌握目录结构与关键

gitblog_00780的博客 830

Vue-admin-template笔记(一)

Vue-admin-template项目 一、关于Vue-admin-template 1.1 介绍 vue-element-admin 是一个后台前端解决方案,它基于 vue 和 element-ui实现。 可以把 vue-element-admin当做工具箱或者集成方案仓库,在 vue-admin-template 的基础上进行二次开发,想要什么功能或者组件就去 vue-element-admin 那里复制过来。 vue-element-admin官方 首先前端目录结构 ├── build

zczdc的博客 3728

vue-admin-template 权限控制改造中访问不到页面资源的问题

小白踩坑!!!!!!! 路径没配正确,斜杠没有配置正确!!!!!!! 以下两个图是route文件夹下配置的两个导入组件的js文件 下面这个图是模拟后台传入的菜单表 照着写的时候莫有注意,所以忽略了斜杠的存在, 前面有,后面就没有的斜杠,反之,有我没他,有他没我的坏斜杠 参考文章: vue-admin-template后台管理之权限篇 关于vue-admin-template的权限控制改造 ...

qq_45631419的博客 555

vue-admin-template 学习笔记 汇总

Vue ps 一个后端闲来无事的瞎折腾,vue的学习过程 Vue基础学习 vue.js 菜鸟编程 vue-admin-template 框架基础学习 手摸手,带你用vue撸后台 系列 2020-12-15 02:01:19 快速一刷 似懂非懂(其实就是什么也看不懂) 直接上手 调试加百度 手撕源码 前端结构 ├── build // 构建相关 ├── bin // 执行脚本 ├── public

zhoumi_ 829
上一篇: vue-admin-template 新手學習(一) 啟動項目
下一篇: vue-admin-template 新手學習(二) 添加左側邊欄
低調的D吖
博客等级 码龄14年 9粉丝 52原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值