权限管理

权限管理业务分析

通过权限管理模块控制不同的用户可以进行哪些操作,具体可以通过角色的方式进行控制,即每个用户分配一个特定的角色,角色包括不同的功能权限

权限列表展示

创建对应规格
  • 在components文件夹下创建power文件夹,在此文件夹下创建Rights.vue(此vue用于开发权限管理的权限列表内容)

  • index.js文件下导入

import Rights from "../components/power/Rights";
{path: '/rights',component: Rights
}
基本布局
  • 添加面包屑导航
<!-- 面包屑导航区域 -->
<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-card>
  • 请求数据
export default {data() {return {// 权限列表rightsList: []}},created() {// 获取所有的权限this.getRightsList()},methods: {// 获取权限列表async getRightsList() {const {data: res} = await this.$http.get('rights/list')if (res.meta.status !== 200) {return this.$message.error('获取权限列表失败!')}this.rightsList = res.dataconsole.log(this.rightsList)}}
}
  • 渲染
<!-- 卡片视图 -->
<el-card><el-table :data="rightsList" border stripe><el-table-column type="index"></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="权限等级" prop="level"><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="warning" v-else>三级权限</el-tag></template></el-table-column></el-table>
</el-card>

角色列表展示

  • 在power文件夹下创建Roles.vue(此vue用于开发权限管理的角色列表内容)

  • index.js文件下导入

import Roles from "../components/power/Roles"
{path: '/roles',component: Roles
}
创建对应规格
  • 添加面包屑导航
<!-- 面包屑导航区域 -->
<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></el-table>
</el-card>
  • 请求数据
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.rolelist = res.dataconsole.log(this.rolelist)}}
}
  • 渲染
<!-- 角色列表区域 -->
<el-table :data="rolelist" border stripe><!-- 索引列 --><el-table-column type="index"></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="操作" width="300px"><template slot-scope="scope"><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" @click="showSetRightDialog(scope.row)">分配权限</el-button></template></el-table-column>
</el-table>

角色分配权限

表格行展开效果
<!-- 展开列 -->
<el-table-column type="expand">
</el-table-column>
渲染一级权限菜单
<el-row v-for="(item1, i1) in scope.row.children" :key="item1.id" class="centerRow"><!-- 这一列,专门渲染 一级权限 --><el-col :span="5"><el-tag closable>{{item1.authName}}</el-tag><i class="el-icon-caret-right"></i></el-col><!-- 还剩余 19 列,分配给二三级权限 --><el-col :span="19"><!-- 这里显示二三级权限 --></el-col>
</el-row>
.el-tag {margin: 7px;
}
.bdtop {border-top: 1px solid #eee;
}.bdbottom {border-bottom: 1px solid #eee;
}
渲染二三级权限菜单
<el-row v-for="(item2, i2) in item1.children" :key="item2.id" class="centerRow"><!-- 放二级权限 --><el-col :span="6"><el-tag closable type="success">{{item2.authName}}</el-tag><i class="el-icon-caret-right"></i></el-col><!-- 放三级权限 --><el-col :span="18"><el-tag closable type="warning" v-for="item3 in item2.children" :key="item3.id"> {{item3.authName}}</el-tag></el-col>
</el-row>
.vcenter {display: flex;align-items: center;
}
删除角色下的权限
  • 绑定点击事件,利用标签中的close
<el-row :class="['bdbottom', i1 === 0 ? 'bdtop' : '', 'vcenter']" v-for="(item1, i1) in scope.row.children" :key="item1.id"><!-- 渲染一级权限 --><el-col :span="5"><el-tag closable @close="removeRightById(scope.row, item1.id)">{{item1.authName}}</el-tag><i class="el-icon-caret-right"></i></el-col><!-- 渲染二级和三级权限 --><el-col :span="19"><!-- 通过 for 循环 嵌套渲染二级权限 --><el-row :class="[i2 === 0 ? '' : 'bdtop', 'vcenter']" v-for="(item2, i2) in item1.children" :key="item2.id"><el-col :span="6"><el-tag type="success" closable @close="removeRightById(scope.row, item2.id)">{{item2.authName}}</el-tag><i class="el-icon-caret-right"></i></el-col><el-col :span="18"><el-tag type="warning" v-for="item3 in item2.children" :key="item3.id" closable @close="removeRightById(scope.row, item3.id)">{{item3.authName}}</el-tag></el-col></el-row></el-col>
</el-row>
  • 根据id删除相对应的权限
// 根据Id删除对应的权限
async removeRightById(role, rightId) {// 弹框提示用户是否要删除const confirmResult = await this.$confirm('此操作将永久删除该文件, 是否继续?','提示',{confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).catch(err => err)if (confirmResult !== 'confirm') {return this.$message.info('取消了删除!')}const { data: res } = await this.$http.delete(`roles/${role.id}/rights/${rightId}`)if (res.meta.status !== 200) {return this.$message.error('删除权限失败!')}// this.getRolesList()role.children = res.data
}
给角色分配权限流程
  • 实现角色分配权限对话框布局

  • 控制对话框的显示和隐藏

  • 对话框显示时调用后台接口加载权限列表数据

  • 完成树形权限菜单的展示

  • 选中默认的权限

  • 保存选中的权限,调用后台接口完成角色权限的分配

实现权限分配对话框布局
  • 实现对话框布局效果
<!-- 分配权限的对话框 -->
<el-dialog title="分配权限" :visible.sync="setRightDialogVisible" width="50%" @close="resetSetRightDialog"><!-- 权限菜单 --><span slot="footer" class="dialog-footer"><el-button @click="setRightDialogVisible = false">取 消</el-button><el-button type="primary" @click="saveRight">确 定</el-button></span>
</el-dialog>
  • 展示分配权限的对话框
async showSetRightDialog(role) {this.setRightDialogVisible = true
}
  • 控制分配对话框的显示与隐藏
setRightDialogVisible: false,
渲染权限的树形结构
async showSetRightDialog(role) {this.roleId = role.id// 获取所有权限的数据const { data: res } = await this.$http.get('rights/tree')if (res.meta.status !== 200) {return this.$message.error('获取权限数据失败!')}// 把获取到的权限数据保存到 data 中this.rightslist = res.dataconsole.log(this.rightslist)// 递归获取三级节点的Idthis.getLeafKeys(role, this.defKeys)this.setRightDialogVisible = true
},
显示分配对话框
  • 官网找到tree并导入
import Tree from 'element-ui'
Vue.use(Tree)
  • 分配权限的对话框
<!-- 分配权限的对话框 -->
<el-dialog title="分配权限" :visible.sync="setRightDialogVisible" width="50%" @close="setRightDialogClosed"><!-- 树形控件 --><el-tree :data="rightslist" :props="treeProps" show-checkbox node-key="id" default-expand-all :default-checked-keys="defKeys" ref="treeRef"></el-tree><span slot="footer" class="dialog-footer"><el-button @click="setRightDialogVisible = false">取 消</el-button><el-button type="primary" @click="allotRights">确 定</el-button></span>
</el-dialog>
  • 树形控件的属性绑定对象
// 树形控件的属性绑定对象
treeProps: {label: 'authName',children: 'children'
}
  • 显示当前分配权限的id
// 默认选中的节点Id值数组
defKeys: [],
// 当前即将分配权限的角色id
roleId: ''
  • 通过递归的形式,获取角色下所有三级权限的id,并保存到 defKeys 数组中
// 通过递归的形式,获取角色下所有三级权限的id,并保存到 defKeys 数组中
getLeafKeys(node, arr) {// 如果当前 node 节点不包含 children 属性,则是三级节点if (!node.children) {return arr.push(node.id)}node.children.forEach(item => this.getLeafKeys(item, arr))
},
  • 监听分配权限对话框的关闭事件
// 监听分配权限对话框的关闭事件
setRightDialogClosed() {this.defKeys = []
},
实现分配权限
  • 点击为角色分配权限
// 点击为角色分配权限
async allotRights() {const keys = [// 展开运算符...this.$refs.treeRef.getCheckedKeys(),...this.$refs.treeRef.getHalfCheckedKeys()]const idStr = keys.join(',')const {data: res} = await this.$http.post(`roles/${this.roleId}/rights`,{rids: idStr})if (res.meta.status !== 200) {return this.$message.error('分配权限失败!')}this.$message.success('分配权限成功!')this.getRolesList()this.setRightDialogVisible = false
}

实现添加、编辑、删除功能(剩余)

因为都是前面实现的基本功能,所以表述较为简单

添加角色
  • 实现页面效果
<!-- 添加角色对话框 -->
<el-dialogtitle="添加角色":visible.sync="addRoleDialogVisible"width="50%"@close="addRoleDialogClosed"><el-form:model="addRoleForm"ref="addRoleFormRef":rules="addRoleRules"label-width="80px"><el-form-item label="角色名称" prop="roleName"><el-input v-model="addRoleForm.roleName"></el-input></el-form-item><el-form-item label="角色描述" prop="roleDesc"><el-input v-model="addRoleForm.roleDesc"></el-input></el-form-item></el-form><span slot="footer" class="dialog-footer"><el-button @click="addRoleDialogVisible = false">取 消</el-button><el-button type="primary" @click="addRoleInfo">确 定</el-button></span>
</el-dialog>
  • 添加角色
addRoleInfo() {// 预校验this.$refs.addRoleFormRef.validate(async (valid) => {if (!valid) {return}const { data: res } = await this.$http.post('roles', {roleName: this.addRoleForm.roleName,roleDesc: this.addRoleForm.roleDesc,})if (res.meta.status !== 201) {return this.$message.error('添加角色失败')}// 重新获取角色列表this.getRolesList()this.addRoleDialogVisible = falsethis.$message.success('添加角色成功')})
},
  • 添加角色表单信息
// 添加角色表单信息
addRoleForm: {// 角色名称roleName: '',// 角色描述roleDesc: '',
},
  • 添加角色表单效验规则
// 添加角色表单校验规则
addRoleRules: {roleName: [{ required: true, message: '角色名称不能为空', trigger: 'blur' },],
},
  • 添加角色对话框是否可见
// 添加角色对话框是否可见
addRoleDialogVisible: false,
  • 添加角色对话框关闭效果
// 添加角色对话框关闭
addRoleDialogClosed() {// 重置表单this.$refs.addRoleFormRef.resetFields()
},
编辑角色
  • 实现页面效果
<!-- 编辑角色对话框 -->
<el-dialogtitle="编辑角色":visible.sync="editRoleDialogVisible"width="50%"@close="editRoleDialogClosed"><el-form:model="addRoleForm"ref="editRoleFormRef":rules="editRoleRules"label-width="80px"><el-form-item label="角色名称" prop="roleName"><el-input v-model="editRoleForm.roleName"></el-input></el-form-item><el-form-item label="角色描述" prop="roleDesc"><el-input v-model="editRoleForm.roleDesc"></el-input></el-form-item></el-form><span slot="footer" class="dialog-footer"><el-button @click="editRoleDialogVisible = false">取 消</el-button><el-button type="primary" @click="editRoleInfo">确 定</el-button></span>
</el-dialog>
  • 编辑角色
// 编辑角色
async editRoleInfo() {const { data: res } = await this.$http.put('roles/' + this.editRoleId, {roleName: this.editRoleForm.roleName,roleDesc: this.editRoleForm.roleDesc,})if (res.meta.status !== 200) {return this.$message.error('编辑提交角色失败')}// 重新获取角色列表this.getRolesList()// 关闭编辑角色对话框this.editRoleDialogVisible = false// 成功提示this.$message.success('编辑提交角色成功')
},
  • 编辑角色表单信息
// 添加角色表单信息
addRoleForm: {// 角色名称roleName: '',// 角色描述roleDesc: '',
},
  • 打开编辑角色对话框,根据id获取角色数据
// 打开编辑角色对话框,根据id获取角色数据
async editRole(id) {// 保存当前编辑角色的idthis.editRoleId = id// 获取角色数据const { data: res } = await this.$http.get('roles/' + id)if (res.meta.status !== 200) {return this.$message.error('获取当前角色信息失败')}this.editRoleForm = res.datathis.editRoleDialogVisible = true
},
  • 编辑角色表单效验规则
// 添加角色表单校验规则
addRoleRules: {roleName: [{ required: true, message: '角色名称不能为空', trigger: 'blur' },],
},
  • 编辑角色表单信息
// 编辑角色表单信息
editRoleForm: {},
  • 当前编辑角色的id
// 当前编辑角色的id
editRoleId: 0,
  • 编辑角色对话框是否可见
// 编辑角色对话框是否可见editRoleDialogVisible: false,
  • 编辑角色对话框关闭效果
// 编辑角色对话框关闭
editRoleDialogClosed() {// 重置表单this.$refs.editRoleFormRef.resetFields()
},
删除角色
  • 删除角色
// 删除角色
async deleteRole(role) {// 弹出确认删除对话框const deleteResult = await this.$confirm(`此操作将永久删除角色${role.roleName}, 是否继续?`,'提示',{confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning',}).catch((err) => err)// 如果用户点击了确认 删除,则返回字符串 confimr// 如果用户点击了取消,则返回字符串 cancelif (deleteResult !== 'confirm') {return this.$message.info('已取消删除')}const { data: res } = await this.$http.delete('roles/' + role.id)if (res.meta.status !== 200) {return this.$message.error('删除角色失败')}// 重新获取角色列表this.getRolesList()// 提示成功删除this.$message.success(`删除角色${role.roleName}成功`)
},
  • 根据id删除对应的权限
// 根据id删除对应的权限
async removeRightById(role, rightId) {const confirmResult = await this.$confirm('此操作将永久删除该权限, 是否继续?','提示',{confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning',}).catch((err) => err)if (confirmResult !== 'confirm') {return this.$message.info('取消了删除')}const { data: res } = await this.$http.delete(`roles/${role.id}/rights/${rightId}`)if (res.meta.status !== 200) {return this.$message.error('删除权限失败')}// 更新角色权限role.children = res.data
},

[Vue.js]实战 -- 电商项目(三)相关推荐

  1. [Vue.js]实战 -- 电商项目(一)

    项目目录 项目概述 项目初始化 登录/退出功能 主页布局 用户管理模块 权限管理模块 分类管理模块 参数管理模块 商品管理模块 订单管理模块 数据统计模块 项目概述 电商项目基本业务概述 电商后台管理 ...

  2. [Vue.js]实战 -- 电商项目(四)

    分类管理 商品分类概述 商品分类用于在购物时,快速找到所要购买的商品,可以通过电商平台主页直观的看到 商品分类列表 基本布局与数据获取 基本布局 面包屑导航区域 <!-- 面包屑导航区域 --& ...

  3. [Vue.js]实战 -- 电商项目(二)

    主页布局 整体布局 主页布局开始 引入官网的框架时,首先要在element.js中添加 import { Container,Header,Aside,Main } from 'element-ui' ...

  4. [Vue.js]实战 -- 电商项目(六)

    商品管理 商品管理概述 用于维护电商平台的商品信息 包括商品的类型.参数.图片.详情等信息.通过商品管理模块可以实现商品的添加.修改.展示和删除等功能 商品列表 实现商品列表布局效果 调用后台接口获取 ...

  5. [Vue.js]实战 -- 电商项目(八)

    数据统计 数据统计概述 用于统计电商平台运营过程的中的各种统计数据 通过直观的可视化方式展示出来,方便相关运营和管理人员查看 用户来源数据统计报表 Echarts 第三方可视化库的基本使用 安装ech ...

  6. [Vue.js]实战 -- 电商项目(五)

    参数管理 参数管理概述 商品参数用于显示商品的固定的特征信息,可以通过电商平台商品详情页面直观的看到 商品分类选择 选择商品分类 页面布局 <div><!-- 面包屑导航区域 --& ...

  7. [Vue.js]实战 -- 电商项目(七)

    订单管理 订单管理概述 用于维护商品的订单信息 可以查看订单的商品信息.物流信息,并且可以根据实际的运营情况对订单做适当的调整. 订单列表 订单列表展示 订单数据加载 订单列表布局 const { d ...

  8. JS任务机制 - springboot实战电商项目mall4j

    springboot实战电商项目mall4j (https://gitee.com/gz-yami/mall4j) java商城系统源码 1.介绍 工作一段时间了,今天在这总结一下浏览器执行JS任务机 ...

  9. [Vue]实战---电商项目(项目的概述及初始化)【一】

    项目实战 项目目录 项目概述 项目初始化 登录/退出功能 主页布局 用户管理模块 权限管理模块 分类管理模块 参数管理模块 商品管理模块 订单管理模块 数据统计模块 项目概述 电商项目基本业务概述 电 ...

最新文章

  1. 大陆唯一7nm光刻机被抵押!武汉千亿投资、台积电大牛掌舵的芯片项目官宣停摆...
  2. UVA - 673 (括号的匹配)
  3. 多径信道理论的直观感受与MATLAB仿真
  4. 一种常见的关于率指标的错误分析思路
  5. ArcGIS实验教程——实验二十一:DEM分析
  6. 解决Sql Server服务远程过程调用失败
  7. Linux环境下安装单实例MySQL 5.7
  8. 【杂】poj2482 Stars in Your Windows 题面的翻译
  9. 一个SQL SERVER查询分析器非常好用的工具
  10. xlsx.js导出表格设置批注框根据内容自动全部显示的解决办法
  11. 自己动手写 Docker 系列文章总览
  12. 【DX12】DirectX Math库 Vector和Matrix类型 XMVECTOR、XMMATRIX
  13. 2022年江西省建筑三类人员(企业主要负责人A证)练习题及答案
  14. php 正则 零宽断言,正则表达式之零宽断言实例详解_正则表达式
  15. 邮件中的CC和BCC
  16. Banner信息收集和美杜莎使用(9.26 第十二天)
  17. Unity3D显示中文
  18. 什么是适用的?Java开发人员的基础理论
  19. 使用 亿通行的可以领取抵扣券
  20. 基于Vue+springboot+websocket实现的简短仿微信web聊天室(私聊和群聊功能)(可在线预览)

热门文章

  1. 笔记本卡顿不流畅是什么原因_为什么越来越多的笔记本电池不可拆卸
  2. c查看变量类型_C语言的变量、常量及运算
  3. django mysql filter_Django filter中用contains 在mysql中的问题
  4. filezilla 共享多个目录_filezilla设置中文,3步搞定filezilla中文设置
  5. Centos7 安装 Rabbitmq、Erlang
  6. html5仿腾讯,高仿腾讯QQ Xplan(X计划)的H5页面(1):threejs创建地球
  7. oracle12cr2发布时间,Oracle 12cR2 发布在即
  8. mysqldatareader对象有多少个方法_血压的正常范围是多少?牢记这6个降压方法,有效地预防高血压...
  9. VIO Estimator::processIMU 函数
  10. 连接linux的几款工具 简介