Vue 权限管理(角色的增删改查)

1. 所有权限列表

请求路径:rights/:type
请求方法:get

在这里插入图片描述

在这里插入图片描述
响应数据 type=list
说明:如果type是list类型,那么不管是一级权限二级或者三级都会显示出来,它们都是平级的,单纯的在页面上展示所有权限

  {
    "data": [
        {
            "id": 101,
            "authName": "商品管理",
            "level": "0",
            "pid": 0,
            "path": null
        },
        {
            "id": 102,
            "authName": "订单管理",
            "level": "0",
            "pid": 0,
            "path": null
        }
    ],
    "meta": {
        "msg": "获取权限列表成功",
        "status": 200
    }
}

type=tree
如果类型是tree,会以树状展示,一级下面有二级,二级包含三级

 {
    data: [
      {
        id: 101,
        authName: '商品管理',
        path: null,
        pid: 0,
        children: [
          {
            id: 104,
            authName: '商品列表',
            path: null,
            pid: 101,
            children: [
              {
                id: 105,
                authName: '添加商品',
                path: null,
                pid: '104,101'
              }
            ]
          }
        ]
      }
    ],
    meta: {
      msg: '获取权限列表成功',
      status: 200
    }
  }

创建组件
components下新建文件夹power,power下新建rights组件
在这里插入图片描述
index 配置路径
home路径下

{
path: '/rights',
component: () =>import ('../components/power/Rights.vue')},

在这里插入图片描述
elementui 里面有个Tag标签组件可以实现该功能

 <!-- 卡片视图-->
    <el-card>
      <el-table :data="rightsList" border stripe>
          <el-table-column type="index" label="索引"> </el-table-column>
          <el-table-column label="权限名称" prop="authName"> </el-table-column>
          <el-table-column label="路径" prop="path"> </el-table-column>
          <el-table-column label="权限等级" >
            <template slot-scope="scope">
              <el-tag v-if="scope.row.level==='0'">一级</el-tag>
                <el-tag type="success" v-else-if="scope.row.level==='1'">二级</el-tag>
                <el-tag type="waring" v-else>三级</el-tag>
          </template>  
              
            </el-table-column>
          
      </el-table>

    </el-card>

在这里插入图片描述

获取角色列表数据

components/power 新建Role.vue

index.js 配置路由 home下

{
path: '/roles',
component: () =>
import ('../components/power/Roles.vue')},
<template>
    <div>
        <!-- 面包屑导航-->
    <el-breadcrumb separator-class="el-icon-arrow-right">
      <el-breadcrumb-item :to="{ path: '/home' }">首页</el-breadcrumb-item>
      <el-breadcrumb-item>权限管理</el-breadcrumb-item>
      <el-breadcrumb-item>角色列表</el-breadcrumb-item>
    </el-breadcrumb>

    <!-- 卡片视图-->
    <el-card>
        <!-- 添加按钮-->
        <el-row>
            <el-col>
                <el-button type="primary">添加角色</el-button>
            </el-col>
        </el-row>
        <!--角色列表-->
        <el-table :data="rolesList" border stripe>
            <el-table-column type="index" label="序号"> </el-table-column>
          <el-table-column label="角色名称" prop="roleName"> </el-table-column>
          <el-table-column label="角色描述" prop="roleDesc"> </el-table-column>
          <el-table-column label="操作" > 
              <template>
                  <el-button size="mini" type="primary" icon="el-icon-edit">编辑</el-button>
                  <el-button size="mini" type="danger" icon="el-icon-delete">编辑</el-button>
                  <el-button size="mini" type="warning" icon="el-icon-setting">分配权限</el-button>
              </template>
          </el-table-column>
        </el-table>
    </el-card>
    </div>
</template>

<script>
export default {
    data(){
        return{
            rolesList:[]
        }
    },
    created(){
        this.getRolesList()
    },
    methods:{
        async getRolesList(){
            const {data:res} = await this.$http.get('roles')
            if(res.meta.status !== 200){
                return this.$message.error('获取角色列表失败')
            }
            this.rolesList = res.data
        }
    }
}
</script>

添加角色对话框

<!-- 添加按钮-->
      <el-row>
        <el-col>
          <el-button type="primary" @click="addDialogVisible=true">添加角色</el-button>
        </el-col>
      </el-row>
<!-- 添加角色对话框-->
    <el-dialog title="添加角色" :visible.sync="addDialogVisible" width="50%">
      <el-form :model="addForm" :rules="addFormRules" ref="addFormRef" label-width="80px">
        <el-form-item label="角色名称" prop="roleName">
          <el-input v-model="addForm.roleName"></el-input>
        </el-form-item>
        <el-form-item label="角色描述" prop="roleDesc">
          <el-input v-model="addForm.roleDesc"></el-input>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="addDialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="addRole">确 定</el-button>
      </span>
    </el-dialog>
data() {
    return {
      rolesList: [],
      // 控制角色对话框显示和隐藏
      addDialogVisible:false,
      addForm:{
          roleName:'',
          roleDesc:''
      },
      addFormRef:{
          roleName: [
            { required: true, message: '请输入角色名称', trigger: 'blur' },
          ],
          roleName: [
            { required: true, message: '请输入角色描述', trigger: 'blur' },
          ],
      }
    }
  },

<script>
export default {
  data() {
    return {
      rolesList: [],
      // 控制角色对话框显示和隐藏
      addDialogVisible:false,
      addForm:{
          roleName:'',
          roleDesc:''
      },
      addFormRules:{
          roleName: [
            { required: true, message: '请输入角色名称', trigger: 'blur' },
          ],
          roleDesc: [
            { required: true, message: '请输入角色描述', trigger: 'blur' },
          ],
      }
    }
  },
  created() {
    this.getRolesList()
  },
  methods: {
      // 获取角色列表
    async getRolesList() {
      const { data: res } = await this.$http.get('roles')
      if (res.meta.status !== 200) {
        return this.$message.error('获取角色列表失败')
      }
      this.rolesList = res.data
    },
    //添加角色
    addRole(){
        this.$refs.addFormRef.validate(async valid=>{
            if(!valid){
                return
            }
            const {data:res} = await this.$http.post('roles',this.addForm)
            if(res.meta.status !== 201){
                return this.$message.error('添加角色失败')
            }
            this.addDialogVisible = false
            // 刷新角色列表
            this.getRolesList()
            this.$message.success('添加角色成功')
        })
    }
  },
}
</script>

当我们在添加角色的时候添加信息后没有确定,关闭弹窗再打开,刚输入的信息还会在上面显示,所以需要表单重置

<!-- 添加角色对话框-->
    <el-dialog title="添加角色" :visible.sync="addDialogVisible" width="50%" @close="addRoleClosed">
// 对话框的表单重置
    addRoleClosed(){
        this.$refs.addFormRef.resetFields()
    }

实现编辑角色功能

 <!--角色列表-->
      <el-table :data="rolesList" border stripe>
        <el-table-column type="index" label="序号"> </el-table-column>
        <el-table-column label="角色名称" prop="roleName"> </el-table-column>
        <el-table-column label="角色描述" prop="roleDesc"> </el-table-column>
        <el-table-column label="操作">
          <template slot-scope="scope">
            <el-button size="mini" type="primary" icon="el-icon-edit" @click="showEditDialog(scope.row.id)">编辑</el-button>
            <el-button size="mini" type="danger" icon="el-icon-delete">删除</el-button>
            <el-button size="mini" type="warning" icon="el-icon-setting">分配权限</el-button>
          </template>
        </el-table-column>
      </el-table>
    </el-card>
<!-- 编辑角色对话框-->
    <el-dialog title="编辑角色" :visible.sync="editDialogVisible" width="50%" @close="editRoleClosed">
      <el-form :model="editForm" :rules="editFormRules" ref="editFormRef" label-width="80px">
        <el-form-item label="角色名称" prop="roleName">
          <el-input v-model="editForm.roleName"></el-input>
        </el-form-item>
        <el-form-item label="角色描述" prop="roleDesc">
          <el-input v-model="editForm.roleDesc"></el-input>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="editDialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="editRole">确 定</el-button>
      </span>
    </el-dialog>
  </div>
//控制编辑对话框
      editDialogVisible:false,
      editForm:{},
      editFormRules:{
          roleName: [
            { required: true, message: '请输入角色名称', trigger: 'blur' },
          ],
          roleDesc: [
            { required: true, message: '请输入角色描述', trigger: 'blur' },
          ],
      },
//显示编辑角色的对话框
    async showEditDialog(id){
        const {data:res} = await this.$http.get(`roles/${id}`)
        if(res.meta.status !== 200){
            return this.$message.error('查询角色信息失败')
        }
        this.editForm = res.data
        this.editDialogVisible=true
    }

编剧角色对话框点击确定触发

// 修改角色
    editRole(){
        this.$refs.editFormRef.validate(async valid=>{
            if(!valid){
                return
            }
            const {data:res} = await this.$http.put(`roles/${this.editForm.roleId}`,{
                roleName:this.editForm.roleName,
                roleDesc:this.editForm.roleDesc
            })
            if(res.meta.status !== 200){
                return this.$message.error('修改角色失败')
            }
            this.editDialogVisible=false
            this.getRolesList()
            this.$message.success('修改角色成功!')

        })
    },
    // 监听编辑角色对话框的关闭时间
    editRoleClosed(){
        this.$refs.editFormRef.resetFields()
    }

实现删除角色功能

elementui MessageBox弹框

this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          this.$message({
            type: 'success',
            message: '删除成功!'
          });
        }).catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          });          
        });
<el-button size="mini" type="danger" icon="el-icon-delete" @click="removeRoleById(scope.row.id)">删除</el-button>
// 删除角色
    removeRoleById(id){
        this.$confirm('确定要删除该角色吗?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(async () => {
          const {data:res} = await this.$http.delete(`roles/${id}`)
          if(res.meta.status !== 200){
              return this.$message.error('删除角色失败')
          }
          this.getRolesList()
          this.$message.success('删除角色成功!')
        }).catch(() => {
           this.$message.info('已取消删除!')        
        });
    }

全部代码

<template>
  <div>
    <!-- 面包屑导航-->
    <el-breadcrumb separator-class="el-icon-arrow-right">
      <el-breadcrumb-item :to="{ path: '/home' }">首页</el-breadcrumb-item>
      <el-breadcrumb-item>权限管理</el-breadcrumb-item>
      <el-breadcrumb-item>角色列表</el-breadcrumb-item>
    </el-breadcrumb>

    <!-- 卡片视图-->
    <el-card>
      <!-- 添加按钮-->
      <el-row>
        <el-col>
          <el-button type="primary" @click="addDialogVisible=true">添加角色</el-button>
        </el-col>
      </el-row>
      <!--角色列表-->
      <el-table :data="rolesList" border stripe>
        <el-table-column type="index" label="序号"> </el-table-column>
        <el-table-column label="角色名称" prop="roleName"> </el-table-column>
        <el-table-column label="角色描述" prop="roleDesc"> </el-table-column>
        <el-table-column label="操作">
          <template slot-scope="scope">
            <el-button size="mini" type="primary" icon="el-icon-edit" @click="showEditDialog(scope.row.id)">编辑</el-button>
            <el-button size="mini" type="danger" icon="el-icon-delete" @click="removeRoleById(scope.row.id)">删除</el-button>
            <el-button size="mini" type="warning" icon="el-icon-setting">分配权限</el-button>
          </template>
        </el-table-column>
      </el-table>
    </el-card>

    <!-- 添加角色对话框-->
    <el-dialog title="添加角色" :visible.sync="addDialogVisible" width="50%" @close="addRoleClosed">
      <el-form :model="addForm" :rules="addFormRules" ref="addFormRef" label-width="80px">
        <el-form-item label="角色名称" prop="roleName">
          <el-input v-model="addForm.roleName"></el-input>
        </el-form-item>
        <el-form-item label="角色描述" prop="roleDesc">
          <el-input v-model="addForm.roleDesc"></el-input>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="addDialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="addRole">确 定</el-button>
      </span>
    </el-dialog>
    <!-- 编辑角色对话框-->
    <el-dialog title="编辑角色" :visible.sync="editDialogVisible" width="50%" @close="editRoleClosed">
      <el-form :model="editForm" :rules="editFormRules" ref="editFormRef" label-width="80px">
        <el-form-item label="角色名称" prop="roleName">
          <el-input v-model="editForm.roleName"></el-input>
        </el-form-item>
        <el-form-item label="角色描述" prop="roleDesc">
          <el-input v-model="editForm.roleDesc"></el-input>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="editDialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="editRole">确 定</el-button>
      </span>
    </el-dialog>
  </div>
</template>

<script>
export default {
  data() {
    return {
      rolesList: [],
      // 控制角色对话框显示和隐藏
      addDialogVisible:false,
      addForm:{
          roleName:'',
          roleDesc:''
      },
      addFormRules:{
          roleName: [
            { required: true, message: '请输入角色名称', trigger: 'blur' },
          ],
          roleDesc: [
            { required: true, message: '请输入角色描述', trigger: 'blur' },
          ],
      },
      //控制编辑对话框
      editDialogVisible:false,
      editForm:{},
      editFormRules:{
          roleName: [
            { required: true, message: '请输入角色名称', trigger: 'blur' },
          ],
          roleDesc: [
            { required: true, message: '请输入角色描述', trigger: 'blur' },
          ],
      },
    }
  },
  created() {
    this.getRolesList()
  },
  methods: {
      // 获取角色列表
    async getRolesList() {
      const { data: res } = await this.$http.get('roles')
      if (res.meta.status !== 200) {
        return this.$message.error('获取角色列表失败')
      }
      this.rolesList = res.data
    },
    //添加角色
    addRole(){
        this.$refs.addFormRef.validate(async valid=>{
            if(!valid){
                return
            }
            const {data:res} = await this.$http.post('roles',this.addForm)
            if(res.meta.status !== 201){
                return this.$message.error('添加角色失败')
            }
            this.addDialogVisible = false
            // 刷新角色列表
            this.getRolesList()
            this.$message.success('添加角色成功')
        })
    },
    // 对话框的表单重置
    addRoleClosed(){
        this.$refs.addFormRef.resetFields()
    },
    //显示编辑角色的对话框
    async showEditDialog(id){
        const {data:res} = await this.$http.get(`roles/${id}`)
        if(res.meta.status !== 200){
            return this.$message.error('查询角色信息失败')
        }
        this.editForm = res.data
        this.editDialogVisible=true
    },
    // 修改角色
    editRole(){
        this.$refs.editFormRef.validate(async valid=>{
            if(!valid){
                return
            }
            const {data:res} = await this.$http.put(`roles/${this.editForm.roleId}`,{
                roleName:this.editForm.roleName,
                roleDesc:this.editForm.roleDesc
            })
            if(res.meta.status !== 200){
                return this.$message.error('修改角色失败')
            }
            this.editDialogVisible=false
            this.getRolesList()
            this.$message.success('修改角色成功!')

        })
    },
    // 监听编辑角色对话框的关闭时间
    editRoleClosed(){
        this.$refs.editFormRef.resetFields()
    },
    // 删除角色
    removeRoleById(id){
        this.$confirm('确定要删除该角色吗?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(async () => {
          const {data:res} = await this.$http.delete(`roles/${id}`)
          if(res.meta.status !== 200){
              return this.$message.error('删除角色失败')
          }
          this.getRolesList()
          this.$message.success('删除角色成功!')
        }).catch(() => {
           this.$message.info('已取消删除!')        
        });
    }
    
  },
}
</script>
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 为了在 Vue 中设计角色权限页面,你可以使用 Vue 插件或者手写代码来实现。 1. 使用 Vue 插件:有很多现成的 Vue 插件可以用来实现角色权限管理,例如 vue-acl。 2. 手写代码:你可以手写代码来实现角色权限管理。你可以定义角色和权限,并通过 Vue 路由守卫来控制页面访问权限。 不管使用哪种方式,你都需要先明确角色和权限的定义,然后根据定义实现相应的代码逻辑。 ### 回答2: 基于Vue设计角色权限页面的目标是实现一个灵活可扩展的权限管理系统,用于管理不同角色对于系统功能和页面的访问权限。以下是一种可能的实现方案。 首先,我们需要设计一个角色模型,包括角色名称、角色描述和角色权限三个字段。这些角色数据可以从后端API获取,或者在前端存在一个可编辑的角色权限配置页面。 在前端页面中,我们可以使用Vue Router来管理页面路由,并通过导航守卫(Navigation Guard)来控制页面的访问权限。在导航守卫中,我们可以根据当前用户角色角色权限配置,实现对页面的权限控制。 一种简单的方案是,在每个需要权限控制的页面组件中,我们可以在创建前调用一个权限验证的方法,该方法接受当前用户角色和需要的权限作为参数。根据当前角色对应的权限配置,判断用户是否具有访问该页面的权限。如果没有权限,可以跳转到一个错误页面或者显示一个提示信息。 另外,我们可以在应用的全局状态管理(例如使用Vuex)中存储当前用户的角色信息,并在页面组件中通过计算属性或者监听器来实时更新页面的权限状态。 除了页面的访问权限控制,我们还可以设计一些可视化的界面组件,用于动态显示和编辑角色权限配置。例如,可以创建一个权限树组件,用于展示和编辑不同角色对于系统各个功能模块和页面的权限。用户可以通过该组件进行权限的增删改查操作,从而实现角色权限的灵活管理。 总的来说,基于Vue设计角色权限页面可以通过设计角色模型、使用导航守卫控制访问权限、使用全局状态管理来实现页面权限的控制和灵活管理。 ### 回答3: 基于Vue设计角色权限页面可以采用以下步骤: 首先,我们需要定义不同的用户角色和对应的权限。根据实际需求,可以将用户分为不同的角色,如普通用户、管理员、超级管理员等,并为每个角色分配不同的权限。 接下来,我们可以使用Vue框架来实现角色权限页面。Vue提供了许多便捷的工具和组件,使得前端开发更加高效。我们可以使用Vue Router来管理页面的路由,Vuex来进行状态管理,同时结合Element UI等UI库来实现界面的快速开发。 在设计角色权限页面时,首先需要登录到系统。登录成功后,后台会返回当前用户所拥有的角色和对应的权限信息。前端可以将这些权限信息保存在Vuex中,以便全局访问。 在前端页面中,根据用户的角色和权限信息,可以动态生成菜单和路由。不同的角色可能拥有不同的菜单和页面访问权限,因此需要根据用户的角色来展示相应的页面。在Vue中,我们可以通过遍历权限信息来生成对应的菜单和路由,同时可以通过v-if指令来控制页面元素的显示与隐藏。 此外,我们可以使用Vue Router的导航守卫来进行权限验证,确保用户只能访问其拥有权限的页面。在导航守卫中,可以根据用户的角色和权限信息进行判断,如果用户没有访问权限,则将其重定向到其他页面或显示提示信息。 综上所述,基于Vue设计角色权限页面需要定义角色和权限信息,使用Vue框架进行页面开发,动态生成菜单和路由,并结合导航守卫进行权限验证,以实现对不同用户角色的权限控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

季布,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值