热门标签 | 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;







推荐阅读
  • HTML:  将文件拖拽到此区域 ... [详细]
  • JavaScript 实现图片文件转Base64编码的方法
    本文详细介绍了如何使用JavaScript将用户通过文件输入控件选择的图片文件转换为Base64编码字符串,适用于Web前端开发中图片上传前的预处理。 ... [详细]
  • 本文探讨了在一个物理隔离的环境中构建数据交换平台所面临的挑战,包括但不限于数据加密、传输监控及确保文件交换的安全性和可靠性。同时,作者结合自身项目经验,分享了项目规划、实施过程中的关键决策及其背后的思考。 ... [详细]
  • Spring Boot使用AJAX从数据库读取数据异步刷新前端表格
      近期项目需要是实现一个通过筛选选取所需数据刷新表格的功能,因为表格只占页面的一小部分,不希望整个也页面都随之刷新,所以首先想到了使用AJAX来实现。  以下介绍解决方法(请忽视 ... [详细]
  • CentOS 7 默认安装了 MariaDB,作为 MySQL 的一个分支。然而,出于特定需求,我们可能仍需在系统中安装 MySQL。本文将详细介绍如何通过 Yum 包管理器在 CentOS 7 上安装 MySQL,并提供一些常用的 MySQL 命令。 ... [详细]
  • WPF项目学习.一
    WPF项目搭建版权声明:本文为博主初学经验,未经博主允许不得转载。一、前言记录在学习与制作WPF过程中遇到的解决方案。使用MVVM的优点是数据和视图分离,双向绑定,低耦合,可重用行 ... [详细]
  • Ext JS MVC系列一:环境搭建与框架概览
    本文主要介绍了如何在项目中使用Ext JS 4作为前端框架,并详细讲解了Ext JS 4的MVC开发模式。文章将从项目目录结构、相关CSS和JS文件的引用以及MVC框架的整体认识三个方面进行总结。 ... [详细]
  • 本文深入探讨了 Git 与 SVN 的高效使用技巧,旨在帮助开发者轻松应对版本控制中的各种挑战。通过详细解析两种工具的核心功能与最佳实践,读者将能够更好地掌握版本管理的精髓,提高开发效率。 ... [详细]
  • Spring框架中的面向切面编程(AOP)技术详解
    面向切面编程(AOP)是Spring框架中的关键技术之一,它通过将横切关注点从业务逻辑中分离出来,实现了代码的模块化和重用。AOP的核心思想是将程序运行过程中需要多次处理的功能(如日志记录、事务管理等)封装成独立的模块,即切面,并在特定的连接点(如方法调用)动态地应用这些切面。这种方式不仅提高了代码的可维护性和可读性,还简化了业务逻辑的实现。Spring AOP利用代理机制,在不修改原有代码的基础上,实现了对目标对象的增强。 ... [详细]
  • publicclassBindActionextendsActionSupport{privateStringproString;privateStringcitString; ... [详细]
  • 在处理大规模数据数组时,优化分页组件对于提高页面加载速度和用户体验至关重要。本文探讨了如何通过高效的分页策略,减少数据渲染的负担,提升应用性能。具体方法包括懒加载、虚拟滚动和数据预取等技术,这些技术能够显著降低内存占用和提升响应速度。通过实际案例分析,展示了这些优化措施的有效性和可行性。 ... [详细]
  • Python 序列图分割与可视化编程入门教程
    本文介绍了如何使用 Python 进行序列图的快速分割与可视化。通过一个实际案例,详细展示了从需求分析到代码实现的全过程。具体包括如何读取序列图数据、应用分割算法以及利用可视化库生成直观的图表,帮助非编程背景的用户也能轻松上手。 ... [详细]
  • 近日,我在处理一个复杂的前端问题时遇到了极大困扰。具体来说,我之前开发了一个功能丰富的纯jQuery代码的前端GridView控件,实现了多种功能和视觉效果,并在多个项目中表现良好。然而,最近在尝试应用 `border-box` 布局模式时,却遇到了意想不到的兼容性和性能问题。这提醒我们在条件尚未完全成熟的情况下,应谨慎使用 `border-box` 布局模式,以免引入不必要的复杂性和潜在的bug。 ... [详细]
  • 在Ubuntu系统中安装Android SDK的详细步骤及解决“Failed to fetch URL https://dlssl.google.com/”错误的方法
    在Ubuntu 11.10 x64系统中安装Android SDK的详细步骤,包括配置环境变量和解决“Failed to fetch URL https://dlssl.google.com/”错误的方法。本文详细介绍了如何在该系统上顺利安装并配置Android SDK,确保开发环境的稳定性和高效性。此外,还提供了解决网络连接问题的实用技巧,帮助用户克服常见的安装障碍。 ... [详细]
  • 在GitHub上克隆vue-element-admin项目时遇到依赖安装错误
    在 GitHub 上克隆 vue-element-admin 项目后,使用 `npm install` 安装依赖时遇到了未知的 Git 错误。具体错误信息为 `npm ERR! code 128`,提示命令执行失败。这可能是由于网络问题、Git 配置不正确或某些依赖包的仓库地址无效导致的。建议检查网络连接、更新 Git 版本并确保所有依赖项的 URL 正确无误。 ... [详细]
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社区 版权所有