vue2模拟vue-element-admin手写角色权限的实现

yizhihongxing

Vue2模拟Vue-element-admin手写角色权限的实现,可以通过以下步骤完成:

1. 安装依赖

首先需要安装以下依赖:Vue-Router(用于控制路由)、Axios(用于发送http请求),可使用如下命令:

npm install vue-router axios

2. 构建基本页面布局

在Vue项目中创建相应的组件并进行基本页面布局,如Header、Sidebar、Main和Footer等组件,实现页面骨架。其中Sidebar组件应该是动态的,具体需要渲染什么样的内容应该根据用户登录后的角色来进行动态判断。

3. 实现登录功能

登录页面可以使用表单组件做到简单易用,实现用户输入账号、密码的过程,并通过Axios向后端发送http请求进行验证。服务器返回成功则将用户信息和Token等基本信息保存到本地存储中(localStorage),并跳转到主页面。如果验证失败则需要提示用户输入错误信息。

4. 实现角色控制

主页面应该实现菜单、路由、页面权限的控制,其中菜单应该是动态生成的,具体内容取决于用户的角色。用户登录成功后,从本地存储中获取用户信息,把用户拥有的菜单和路由等权限信息渲染到页面上。如果用户没有相应的权限,应该隐藏或禁用对应的菜单和路由。

5. 后端接口实现

当我们控制好了前端的权限时,还需要在后端进行相应的控制,防止恶意输入、越权操作等。

两个示例说明:

示例一:实现角色控制

  1. 安装Vue-Router和Axios
npm install vue-router axios
  1. 创建路由配置文件router.js
import Vue from 'vue'
import Router from 'vue-router'
import store from './store'

Vue.use(Router)

// 根据用户角色控制路由
const router = new Router({
  routes: [
    {
      path: '/',
      name: 'home',
      component: Home
    },
    {
      path: '/about',
      name: 'about',
      component: About,
      meta: {
        requiresAuth: true,
        roles: ['admin']
      }
    },
    {
      path: '/login',
      name: 'login',
      component: Login
    }
  ]
})

// 全局路由拦截器
router.beforeEach((to, from, next) => {
  if (to.meta.requiresAuth) {
    // 用户未登录,跳转到登录页面
    if (!store.getters.isLoggedIn) {
      next('/login')
    } else {
      // 用户没有权限,跳转到主页面
      if (to.meta.roles.indexOf(store.getters.getUserRole) === -1) {
        next('/')
      } else {
        next()
      }
    }
  } else {
    next()
  }
})

export default router
  1. 创建Store文件夹,并添加user.js文件
import axios from 'axios'

const state = {
  token: localStorage.getItem('token') || '',
  user: {},
  role: ''
}

const getters = {
  isLoggedIn: state => !!state.token,
  getUser: state => state.user,
  getUserRole: state => state.role
}

const actions = {
  login ({ commit }, user) {
    return new Promise((resolve, reject) => {
      axios.post('/api/login', user)
        .then(res => {
          const token = res.data.token
          const user = res.data.user
          localStorage.setItem('token', token)
          axios.defaults.headers.common['Authorization'] = token
          commit('auth_success', { token, user })
          resolve(res)
        })
        .catch(err => {
          commit('auth_error')
          localStorage.removeItem('token')
          reject(err)
        })
    })
  },
  logout ({ commit }) {
    return new Promise((resolve, reject) => {
      commit('logout')
      localStorage.removeItem('token')
      delete axios.defaults.headers.common['Authorization']
      resolve()
    })
  }
}

const mutations = {
  auth_success (state, payload) {
    state.token = payload.token
    state.user = payload.user
    state.role = payload.user.role
  },
  auth_error (state) {
    state.token = ''
    state.user = {}
    state.role = ''
  },
  logout (state) {
    state.token = ''
    state.user = {}
    state.role = ''
  }
}

export default {
  state,
  getters,
  actions,
  mutations
}
  1. 创建登录页面
<template>
  <div>
    <h2>Login</h2>
    <form>
      <div>
        <label for="username">Username:</label>
        <input type="text" id="username" v-model="username">
      </div>
      <div>
        <label for="password">Password:</label>
        <input type="password" id="password" v-model="password">
      </div>
      <button type="button" @click="login">Login</button>
    </form>
  </div>
</template>

<script>
import { mapActions } from 'vuex'

export default {
  data () {
    return {
      username: '',
      password: ''
    }
  },
  methods: {
    ...mapActions(['login']),
    async login () {
      try {
        await this.login({
          username: this.username,
          password: this.password
        })
        this.$router.push('/')
      } catch (err) {
        console.log(err)
      }
    }
  }
}
</script>

示例二:实现菜单控制

  1. 在Menu组件中使用v-if判断是否有对应权限
<template>
  <div>
    <ul>
      <li v-if="hasAccessRole('admin')"><router-link to="/dashboard">Dashboard</router-link></li>
      <li v-if="hasAccessRole('user')"><router-link to="/profile">My Profile</router-link></li>
    </ul>
  </div>
</template>

<script>
export default {
  methods: {
    hasAccessRole (role) {
      return this.$store.getters.getUserRole === role
    }
  }
}
</script>
  1. 后端需要提供接口供前端调用校验用户权限
app.get('/checkAccessRole', (req, res) => {
  if (req.headers.authorization === 'admin_token') {
    res.json({
      success: true,
      role: 'admin'
    })
  } else if (req.headers.authorization === 'user_token') {
    res.json({
      success: true,
      role: 'user'
    })
  } else {
    res.status(401).json({
      success: false,
      message: 'Unauthorized'
    })
  }
})

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue2模拟vue-element-admin手写角色权限的实现 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • Javascript标准DOM Range操作全集第3/3页

    首先,我们需要了解DOM Range是什么。DOM Range是一种表示文档中某个区域的对象。它可以用来选择某个范围内的文本、节点或元素,并进行相关操作。 接下来,我们来详细讲解Javascript标准DOM Range操作全集第3/3页的完整攻略。 一、创建Range并进行文本操作 我们可以通过如下代码创建一个Range: var range = docu…

    JavaScript 2023年6月10日
    00
  • JS阻止事件冒泡行为和闭包的方法

    JS阻止事件冒泡行为 在JavaScript中,事件冒泡指的是当子元素触发一个事件时,这个事件将沿着DOM树向它的祖先元素传播,直到被处理或到达文档根。有时候,我们需要阻止事件的冒泡传递,这时可以使用以下两种方法: stopPropagation()方法 stopPropagation()是用来停止事件在DOM层次中进一步传播的方法。当调用stopPropa…

    JavaScript 2023年6月10日
    00
  • vue中的attribute和property的具体使用及区别

    Vue中Attribute和Property的使用及区别 在Vue中,我们经常使用Attribute和Property来设置或获取元素的属性值,这两者是有区别的。在本文中,我们将会详细讲解它们的用法及区别。 Attribute和Property的区别 首先,我们需要明确Attribute和Property的区别。简单来说,Attribute是在HTML中定义…

    JavaScript 2023年6月10日
    00
  • js前端实现word excel pdf ppt mp4图片文本等文件预览

    实现Word、Excel、PDF、PPT、MP4、图片等文件预览,可以通过前端技术结合第三方库来实现。 使用第三方库Viewer.js实现文件预览 Viewer.js是一个基于JavaScript的图像和文档查看器,它可以让你轻松地查看各种文件类型,包括图片、PDF、SVG、Microsoft Word、Microsoft Excel、Microsoft P…

    JavaScript 2023年5月27日
    00
  • JFinal使用ajaxfileupload实现图片上传及预览

    以下是使用 JFinal 和 ajaxfileupload 实现图片上传及预览的完整攻略。 准备工作 首先,你需要在你的项目中引入 JFinal 和 ajaxfileupload,具体引入方式可以参考官方文档。 接着,你需要准备一个接口用于接收上传的图片,并返回图片的路径或其他信息,可以在你的 JFinal Controller 中编写一个如下的示例方法: …

    JavaScript 2023年6月11日
    00
  • 动态JavaScript所造成一些你不知道的危害

    当涉及到使用JavaScript编写具有动态性的应用程序时,可能会有一些与安全相关的问题,因为动态JavaScript代码可能会被攻击者利用以进行欺诈、窃听或入侵。以下是一些动态JavaScript会带来的危害和如何防止它们的方法: XSS 攻击 跨站点脚本攻击(XSS)是一种攻击,攻击者利用动态JavaScript来执行恶意代码并跨越不同的域。这可以导致攻…

    JavaScript 2023年5月18日
    00
  • JS异步代码单元测试之神奇的Promise

    JS异步代码单元测试一直是开发人员要面对的挑战。为了解决这个问题,Promise异步编程模式被引入到JavaScript中,因其简单、灵活和可重用性而受到广泛认可。在本攻略中,我们将深入探讨如何在单元测试中使用Promise,以及如何跟踪异步代码逻辑和处理可能的异步回调。 异步单元测试面临的问题 在传统的单元测试中,我们可以通过直接调用函数、对函数输出结果进…

    JavaScript 2023年5月28日
    00
  • vscode下vue项目中eslint的使用方法

    下面将详细讲解”VSCode下Vue项目中ESLint的使用方法”。 1. 确认环境安装及配置 在使用 ESLint 前,首先确保环境已经安装: Node.js 安装:前往 Node.js 官网 下载对应版本进行安装。 Vue CLI 安装:使用 npm 全局安装。 npm install -g vue-cli ESLint 安装:使用 npm 全局安装。 …

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部