vue-element-admin 登陆及目录权限控制的实现

下面为你详细讲解“vue-element-admin 登陆及目录权限控制的实现”的完整攻略。

1. 登陆流程

要实现登陆流程,首先需要安装相关依赖包:

npm install axios js-cookie

其中,axios 是一个基于 Promise 的 HTTP 库,可用于浏览器和 Node.js,同时也是 Vue 官方推荐的 HTTP 请求库;js-cookie 则是操作 cookie 的一个简单 js 库。

接下来,依据 vue-element-admin 的代码示例,在 src/utils/request.js 中添加如下代码:

import axios from 'axios'
import { getToken } from '@/utils/auth'
import { Message } from 'element-ui'

// create an axios instance
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  timeout: 5000 // request timeout
})

// request interceptor
service.interceptors.request.use(
  config => {
    // do something before request is sent
    if (getToken()) {
      // set request header
      config.headers['Authorization'] = 'Bearer ' + getToken()
    }
    return config
  },
  error => {
    // do something with request error
    console.log(error) // for debug
    return Promise.reject(error)
  }
)

// response interceptor
service.interceptors.response.use(
  /**
   * If you want to get http information such as headers or status
   * Please return  response => response
  */
  response => {
    const res = response.data

    // if the custom code is not 20000, it is judged as an error.
    if (res.code !== 20000) {
      Message({
        message: res.msg || 'Error',
        type: 'error',
        duration: 5 * 1000
      })

      // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
      if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
        // to re-login
        MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', {
          confirmButtonText: 'Re-Login',
          cancelButtonText: 'Cancel',
          type: 'warning'
        }).then(() => {
          store.dispatch('user/resetToken').then(() => {
            location.reload()
          })
        })
      }
      return Promise.reject(new Error(res.msg || 'Error'))
    } else {
      return res
    }
  },
  error => {
    console.log('err' + error) // for debug
    Message({
      message: error.msg || 'Error',
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

export default service

以上代码完成了 http 请求拦截器的实现,可将 token 添加到 header 中,同时,还对 http 响应增加了异常处理,如 token 过期等。

然后在 src/utils/auth.js 文件中,实现对 token 的存储和获取:

import Cookies from 'js-cookie'

const TokenKey = 'Admin-Token'

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

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

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

以上代码即实现了对 cookie 的存取操作。

最后在 src/api/user.js 文件中添加如下代码:

import request from '@/utils/request'

export function login(data) {
  return request({
    url: '/login',
    method: 'post',
    data
  })
}

export function getInfo(token) {
  return request({
    url: '/user/info',
    method: 'get',
    params: { token }
  })
}

export function logout() {
  return request({
    url: '/user/logout',
    method: 'post'
  })
}

完整的登陆流程代码实现请移步vue-element-admin 官方文档的“登陆”一章节。

2. 目录权限控制

实现菜单目录的权限控制,主要有两个步骤:

  1. 在动态路由筛选中,将路由标记为 hidden: true,表明该路由不会在菜单栏中显示。
export const asyncRoutes = [
  {
    path: '/permission',
    component: Layout,
    redirect: '/permission/index',
    name: 'Permission',
    meta: {
      title: 'Permission',
      icon: 'lock',
      roles: ['admin', 'editor']
    },
    children: [
      {
        path: 'page',
        component: () => import('@/views/permission/page'),
        name: 'PagePermission',
        meta: {
          title: 'Page Permission',
          roles: ['admin']
        }
      },
      {
        path: 'directive',
        component: () => import('@/views/permission/directive'),
        name: 'DirectivePermission',
        meta: {
          title: 'Directive Permission'
        }
      },
      {
        path: 'role',
        component: () => import('@/views/permission/role'),
        name: 'RolePermission',
        meta: {
          title: 'Role Permission',
          roles: ['admin']
        }
      }
      {
        path: 'hidden-example',
        component: () => import('@/views/example/hidden'),
        name: 'HiddenExample',
        meta: {
          title: 'Hidden Example',
          roles: ['admin']
          hidden: true
        }
      },
    ]
  },

  { path: '*', redirect: '/404', hidden: true }
]
  1. 以角色为基础,在后端接口校验该角色是否有权限访问该路由,若有,则返回该路由进行显示。

完整的前端菜单权限控制代码实现请移步vue-element-admin 官方文档的“菜单和路由权限控制”一章节。

示例

下面提供两个关于该过程的代码示例。一个是添加路由菜单中的隐藏示例,另一个是后端接口校验中的角色权限示例。

添加路由菜单隐藏示例

在添加路由菜单时传入参数 hidden: true,表示此菜单路由不显示。此处举例的路由路径为 /hidden-example。

import Layout from '@/layout'

export const asyncRoutes = [
  {
    path: '/permission',
    component: Layout,
    redirect: '/permission/index',
    name: 'Permission',
    meta: {
      title: 'Permission',
      icon: 'lock',
      roles: ['admin', 'editor']
    },
    children: [
      {
        path: 'page',
        component: () => import('@/views/permission/page'),
        name: 'PagePermission',
        meta: {
          title: 'Page Permission',
          roles: ['admin']
        }
      },
      {
        path: 'directive',
        component: () => import('@/views/permission/directive'),
        name: 'DirectivePermission',
        meta: {
          title: 'Directive Permission'
        }
      },
      {
        path: 'role',
        component: () => import('@/views/permission/role'),
        name: 'RolePermission',
        meta: {
          title: 'Role Permission',
          roles: ['admin']
        }
      }
      {
        path: 'hidden-example',
        component: () => import('@/views/example/hidden'),
        name: 'HiddenExample',
        meta: {
          title: 'Hidden Example',
          roles: ['admin']
          hidden: true
        }
      },
    ]
  },

  { path: '*', redirect: '/404', hidden: true }
]

在 src/views/example 目录下新建 hidden.vue 文件,并添加以下代码:

<template>
  <div class="hidden-example">
    <h1>This is a Hidden Example</h1>
    <p>If you can see this, it means you have permission for this hidden example.</p>
  </div>
</template>

后端接口角色权限示例

在前端调用后端接口时,根据后端传回的数据,判断当前用户是否有权限进行操作。此处以 axios 为例,展示一个角色权限的请求示例。

在 src/api/example.js 文件中,添加以下代码:

import request from '@/utils/request'

export function exampleAPI() {
  return request({
    url: '/example',
    method: 'get'
  })
}

export function adminOnlyAPI() {
  return request({
    url: '/admin-only',
    method: 'get',
    params: {
      role: 'admin'
    }
  })
}

export function editorOnlyAPI() {
  return request({
    url: '/editor-only',
    method: 'get',
    params: {
      role: 'editor'
    }
  })
}

以上代码定义了三个请求 API,其中 exampleAPI 可不做权限判断;adminOnlyAPI 可以被 admin 角色访问,而 editorOnlyAPI 可以被 editor 角色访问。访问后端接口时,在请求成功后,根据返回数据判断当前用户是否有权限进行操作。

以上就是“vue-element-admin 登陆及目录权限控制的实现”的完整攻略,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue-element-admin 登陆及目录权限控制的实现 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Vue.use与Vue.prototype的区别及说明

    Vue.use与Vue.prototype的区别及说明 Vue.use Vue.use 是 Vue.js 的一个全局API,用于安装Vue.js插件。其作用就是将一个插件安装到Vue.js应用程序中。 Vue.use 的基本语法为: Vue.use(plugin) 其中,plugin 是指需要安装的插件。插件本质上就是一个具有install方法的对象或者函数…

    Vue 2023年5月27日
    00
  • 前端vue中文件下载的三种方式汇总

    下面我会详细讲解“前端vue中文件下载的三种方式汇总”的完整攻略,其中也会包含两条示例说明。 前言 在开发前端应用时,文件下载是常见的需求。Vue作为一种流行的前端框架,我们在 Vue 中实现文件下载也相对比较容易。本文将介绍在 Vue 中实现文件下载的三种方式,并提供相关的示例。 方式一:通过a标签实现文件下载 通过a标签实现文件下载是最简单的方法。我们可…

    Vue 2023年5月28日
    00
  • Vue组件的计算属性和普通属性的区别说明

    Vue组件中常用的属性有两类,一类是普通属性,另一类是计算属性。两者有什么区别呢?在这里详细讲解一下。 普通属性 普通属性是指直接定义在 Vue 组件实例中的属性,它的值可以是静态的也可以是动态的。普通属性的值是可以直接访问的,一旦指定了初始值,它的值不会再发生变化,直到组件实例被销毁。 以下是一个示例代码: <template> <h1&…

    Vue 2023年5月27日
    00
  • vue请求本地自己编写的json文件的方法

    介绍如下: 一、准备JSON文件 首先,需要准备好本地的JSON文件,示例文件可以参考以下结构: { "data": [ { "id": 1, "title": "文章1", "content": "这是文章1的内容" }, { &quot…

    Vue 2023年5月28日
    00
  • vue3中组件传值的多种方法总结

    下面是详细讲解“vue3中组件传值的多种方法总结”的完整攻略。 1. 组件传值概述 在vue3中,组件传值是非常常见的场景,通常包括父组件向子组件传值和子组件向父组件传值两种类型。 在vue3中,组件传值的方式主要包括如下几种: 父组件向子组件传值(prop) 子组件向父组件传值($emit) 祖先组件向后代组件传值(provide/inject) 跨级组件…

    Vue 2023年5月29日
    00
  • vue中v-text / v-html使用实例代码详解

    当我们使用Vue.js开发Web应用程序时,我们常常需要在模板中显示动态生成的内容。Vue.js为我们提供了两个指令 v-text 和 v-html,可以方便地将动态生成的内容渲染到HTML浏览器中,并避免XSS攻击。下面详细介绍这两个指令的使用方法。 v-text指令 v-text指令用于将数据绑定到元素的文本内容中。它会将Vue实例中对应的数据对象的值动…

    Vue 2023年5月27日
    00
  • 老生常谈vue的生命周期

    下面我就来详细讲解一下“老生常谈Vue的生命周期”的完整攻略。 什么是Vue的生命周期? Vue的生命周期简单来说,是指Vue实例从创建、更新到销毁的整个过程中,会发生一系列的钩子函数。这些钩子函数被称为“生命周期钩子”,它们可以在特定的时刻进行特定的操作。 Vue的生命周期包含哪些钩子函数? Vue的生命周期包含以下钩子函数: beforeCreate:在…

    Vue 2023年5月28日
    00
  • vue中的proxyTable反向代理(亲测有用)

    下面我将为你详细讲解“vue中的proxyTable反向代理(亲测有用)”的攻略。 什么是proxyTable? proxyTable是vue-cli中用于开发环境的devServer选项的一个配置,可以进行反向代理,实现跨域请求的功能。它可以将本地请求转发到后端API接口进行处理,避免跨域问题和处理复杂的跨域请求头。 proxyTable的配置方式 在vu…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部