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

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动画之磁性吸附效果篇

    对于“javascript动画之磁性吸附效果篇”的完整攻略,我将从以下几个方面进行讲解: 磁性吸附效果的概述 实现方法 示例说明 注意事项 1. 磁性吸附效果的概述 磁性吸附效果是常用于网页设计的动画效果之一,它可以使鼠标在网页上的元素上移动时,元素就像被一个磁铁吸附一样,会跟随鼠标的移动而移动。 2. 实现方法 磁性吸附效果的实现方法有多种,这里介绍一种基…

    JavaScript 2023年6月10日
    00
  • javascript的基础交互详解

    JavaScript的基础交互详解 JavaScript是一种用于在网页中实现交互效果的编程语言。它的主要应用领域之一是Web开发,可以实现动态效果和交互逻辑。 给HTML元素绑定事件 当用户对网页进行操作时(例如点击按钮、移动鼠标等),我们可以通过绑定事件来触发JavaScript代码的执行。在HTML中,我们可以通过on开头的属性来绑定事件。 例如,我们…

    JavaScript 2023年5月17日
    00
  • jQuery加密密码到cookie的实现代码

    要实现将加密密码存储到cookie的过程,需要进行以下步骤: 1. 引入jQuery插件 提供加密解密功能的jQuery插件有很多种,这里选择一个比较常用的插件:jquery.cookie。此插件可以方便地创建、读取和删除cookie。 <head> <script src="https://code.jquery.com/jqu…

    JavaScript 2023年6月11日
    00
  • js尾调用优化的实现

    JS尾调用优化(Tail call optimization)是指在一个函数的最后一个操作是一个函数调用的情况下,JS引擎可以优化成不需要开辟新的堆栈帧,从而减少内存占用,提升性能。本文将详细介绍JS尾调用优化的实现方法。 什么是尾调用 首先讲解一下什么是尾调用(Tail Call)。简单来说,尾调用是指一个函数在返回时调用其他函数。示例代码如下: func…

    JavaScript 2023年6月10日
    00
  • 基于JS实现快速读取TXT文件

    基于JS实现快速读取TXT文件 要实现在网页中快速读取TXT文件,可以使用JavaScript提供的File API来完成。 步骤 以下是实现该功能的步骤: 使用input元素创建一个文件选择器,让用户可以选择要读取的TXT文件。 使用JavaScript的FileReader对象读取选择的文件。 使用回调函数读取文件内容。 在网页上显示文件内容或者执行其他…

    JavaScript 2023年5月27日
    00
  • 结合 ES6 类编写JavaScript 创建型模式

    结合 ES6 类编写JavaScript 创建型模式的步骤: 定义一个类,这个类代表要创建的对象类型。 在类中定义一个静态方法,这个静态方法将使用类的构造函数来创建一个对象。 定义一个方法,用于对类的实例进行初始化。这个方法通常是一个构造函数或者一个工厂方法。 对类进行扩展,以便可以创建新的对象类型。 实例化新的对象。 下面简单介绍两种在 ES6 中创建 J…

    JavaScript 2023年6月10日
    00
  • javascript中json对象json数组json字符串互转及取值方法

    下面是“JavaScript中JSON对象、JSON数组、JSON字符串互转及取值方法”的完整攻略: 1. JSON对象 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,其数据格式和JavaScript对象的格式类似。在JavaScript中,可以通过JSON对象来解析JSON字符串,也可以将JavaScript对…

    JavaScript 2023年5月27日
    00
  • 在react中使用mockjs的方法你知道吗

    当我们需要模拟一个后端API接口,来测试前端代码的时候,可以使用mockjs这个库进行模拟数据。下面是在React中使用mockjs的方法: 1. 安装mockjs npm install mockjs –save-dev 2. 创建mock数据 我们可以在src目录下新建一个mock目录,然后在这个目录下再新建一个data.js文件。在这个文件中,就可以…

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