热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

18版本新增权限菜单管理功能(第三部分)

1、完成图标功能要实现图标功能,首先是后端建表建dict表DROPTABLEIFEXISTSdict;CREATETABLEdict(namevarchar(2


1、完成图标功能

要实现图标功能,首先是后端建表


  1. 建dict表

DROP TABLE IF EXISTS `dict`;
CREATE TABLE `dict` (
`name` varchar(255) DEFAULT NULL COMMENT '名称',
`value` varchar(255) DEFAULT NULL COMMENT '内容',
`type` varchar(255) DEFAULT NULL COMMENT '类型'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `dict`(`name`,`value`,`type`) values
('user','el-icon-user','icon'),
('house','el-icon-house','icon'),
('menu','el-icon-menu','icon'),
('s-custom','el-icon-s-custom','icon'),
('s-menu','el-icon-s-grid','icon'),
('file','el-icon-document','icon');

  1. Dict实体类

Dict.java

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("dict")
public class Dict {
private String name;
private String value;
private String type;
}

  1. DictMapper.java

@Repository
public interface DictMapper extends BaseMapper<Dict> {
}

  1. DictService.java

&#64;Service
public class DictService extends ServiceImpl<DictMapper, Dict> {
}

  1. 图标功能是在菜单管理里面显示&#xff0c;所以实现功能写在MenuController中

MenuController.java

//查找图标信息
&#64;GetMapping("/icons")
public Result getIcons(){
QueryWrapper<Dict> queryWrapper &#61; new QueryWrapper<>();
//查询type为icon的数据
queryWrapper.eq("type", Constants.DICT_TYPE_ICON);
return Result.success(dictService.list(queryWrapper));
}

  1. 前端实现菜单管理里编辑&#xff0c;可以下拉选择图标&#xff0c;如

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GJscqE2B-1673355144545)(D:\桌面\Java学习\项目\管理系统–前后端分离\项目截图\46.jpg)]


  1. 前端实现角色管理页面&#xff0c;分配菜单的时候&#xff0c;同样显示图标出来

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XbCYwnVm-1673355144546)(D:\桌面\Java学习\项目\管理系统–前后端分离\项目截图\47.jpg)]


{{ data.name }}


  1. 完整代码

Menu.vue




Role.vue





2、实现菜单管理和角色管理关系

实现&#xff1a;角色管理中&#xff0c;分配菜单后&#xff0c;会出现一个role_id对应一个或者多个menu_id &#xff0c;两者id之间的关系可以储存到数据库中&#xff0c;然后下次点开该角色的分配菜单时默认回显出来


  1. 建表Role_Menu表

USE &#96;management&#96;;
/*Table structure for table &#96;role_menu&#96; */
DROP TABLE IF EXISTS &#96;role_menu&#96;;
CREATE TABLE &#96;role_menu&#96; (
&#96;role_id&#96; int(11) NOT NULL COMMENT &#39;角色id&#39;,
&#96;menu_id&#96; int(11) NOT NULL COMMENT &#39;菜单id&#39;,
PRIMARY KEY (&#96;role_id&#96;,&#96;menu_id&#96;)
) ENGINE&#61;InnoDB DEFAULT CHARSET&#61;utf8 COMMENT&#61;&#39;角色菜单关系表&#39;;

  • 注意&#xff0c;roleId和menuId都应该设置为主键

  1. 实体类RoleMenu.java

&#64;Data
&#64;TableName("role_menu")
public class RoleMenu {
private Integer roleId;
private Integer menuId;
}

和之前一样&#xff0c;把RoleMenuMapper和RoleMenuService建好&#xff0c;这里就省略


  1. 实现功能&#xff1a;不需要新建一个controller&#xff0c;因为这也算是role中的功能。

RoleController.java

//绑定角色和菜单的关系。一个角色id可以对应多个菜单id&#xff08;一个角色可以有权限管理多个菜单&#xff09;
//参数&#xff1a; roleId &#xff0c;menuIds
&#64;PostMapping("/roleMenu/{roleId}")
public Result roleMenu(&#64;PathVariable Integer roleId, &#64;RequestBody List<Integer> menuIds){
//复杂的sql操作&#xff0c;需要去service层写业务
roleService.setRoleMenu(roleId,menuIds);
return Result.success();
}
//从数据库中根据roleId查询出与这个角色关联的menuId
&#64;GetMapping("/roleMenu/{roleId}")
public Result getRoleMenu(&#64;PathVariable Integer roleId){
return Result.success(roleService.getRoleMenu(roleId));
}

  1. 在service层中实现业务

RoleService.java

&#64;Service
public class RoleService extends ServiceImpl<RoleMapper, Role> {
&#64;Autowired
private RoleMenuService roleMenuService;
&#64;Autowired
private RoleMenuMapper roleMenuMapper;
//加上事务注解&#xff0c;两个操作同时成功才行
&#64;Transactional
public void setRoleMenu(Integer roleId, List<Integer> menuIds) {
QueryWrapper<RoleMenu> queryWrapper &#61; new QueryWrapper<>();
//先删除当前角色id所有的绑定关系
queryWrapper.eq("role_id",roleId);
roleMenuService.remove(queryWrapper);
//再把前端传过来的菜单id数组绑定到当前这个角色id上去
for (Integer menuId:menuIds){
RoleMenu roleMenu &#61; new RoleMenu();
roleMenu.setRoleId(roleId);
roleMenu.setMenuId(menuId);
roleMenuService.save(roleMenu);
}
}
//查询
public List<Integer> getRoleMenu(Integer roleId) {
return roleMenuMapper.selectByRoleId(roleId);
}
}

  1. RoleMenuMapper.java

&#64;Repository
public interface RoleMenuMapper extends BaseMapper<RoleMenu> {
&#64;Select("select menu_id from role_menu where role_id &#61; #{roleId}")
List<Integer> selectByRoleId(&#64;Param("roleId") Integer roleId);
}

  1. 在前端中实现

  • 将前端勾选后的数据传给后端存入数据库

saveRoleMenu(){
this.request.post("/role/roleMenu/" &#43; this.roleId,this.$refs.tree.getCheckedKeys()).then(res &#61;> {
if(res.code &#61;&#61;&#61; &#39;200&#39;) {
this.$message.success("绑定成功")
this.menuDialogVisable &#61; false
}else{
this.$message.error(res.msg)
}
})
},

  • 请求后端查询出存储的关系然后回显到前端&#xff08;就是在再一次打开该角色的分配菜单时&#xff0c;要默认显示出之前已经勾选的&#xff09;

this.request.get("/role/roleMenu/" &#43; roleId).then(res &#61;> {
this.checks &#61; res.data
})

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YXBNwzKL-1673355144547)(D:\桌面\Java学习\项目\管理系统–前后端分离\项目截图\48.jpg)]

这次改动的前端代码就是Role.vue和Menu.vue两个页面&#xff0c;完整代码在前面已经给出了&#xff01;

通过实现&#xff0c;完成这两个功能&#xff0c;就成功了&#xff01;







推荐阅读
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 树莓派Linux基础(一):查看文件系统的命令行操作
    本文介绍了在树莓派上通过SSH服务使用命令行查看文件系统的操作,包括cd命令用于变更目录、pwd命令用于显示当前目录位置、ls命令用于显示文件和目录列表。详细讲解了这些命令的使用方法和注意事项。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
author-avatar
炫彩十字绣I_775
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有