基础平台项目之树形菜单权限配置实现
计划在开源项目里加入权限配置的功能,打算加入zTree实现树形结构。
Team的Github开源项目链接:https://github.com/u014427391/jeeplatform
欢迎star(收藏)
zTree 是一个依靠 jQuery 实现的多功能 “树插件”。优异的性能、灵活的配置、多种功能的组合是 zTree 最大优点。
zTree下载链接:http://www.treejs.cn/v3/main.php#_zTreeInfo
角色信息实体类:
package org.muses.jeeplatform.core.entity.admin;import javax.persistence.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;/*** @description 角色信息实体类* @author Nicky* @date 2017年3月16日*/
@Table(name="sys_role")
@Entity
public class Role implements Serializable{/** 角色Id**/private int roleId;/** 角色描述**/private String roleDesc;/** 角色名称**/private String roleName;/** 角色标志**/private String role;private Set<Permission> permissions = new HashSet<Permission>();@Id@GeneratedValue(strategy=GenerationType.IDENTITY)public int getRoleId() {return roleId;}public void setRoleId(int roleId) {this.roleId = roleId;}@Column(length=100)public String getRoleDesc() {return roleDesc;}public void setRoleDesc(String roleDesc) {this.roleDesc = roleDesc;}@Column(length=100)public String getRoleName() {return roleName;}public void setRoleName(String roleName) {this.roleName = roleName;}@Column(length=100)public String getRole() {return role;}public void setRole(String role) {this.role = role;}//修改cascade策略为级联关系@OneToMany(targetEntity=Permission.class,cascade=CascadeType.MERGE,fetch=FetchType.EAGER)@JoinTable(name="sys_role_permission", joinColumns=@JoinColumn(name="roleId",referencedColumnName="roleId"), inverseJoinColumns=@JoinColumn(name="permissionId",referencedColumnName="id",unique=true))public Set<Permission> getPermissions() {return permissions;}public void setPermissions(Set<Permission> permissions) {this.permissions = permissions;}@Overridepublic boolean equals(Object obj) {if (obj instanceof Role) {Role role = (Role) obj;return this.roleId==(role.getRoleId())&& this.roleName.equals(role.getRoleName())&& this.roleDesc.equals(role.getRoleDesc())&& this.role.equals(role.getRole());}return super.equals(obj);}
}
权限信息实体类:
package org.muses.jeeplatform.core.entity.admin;import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;/*** @description 权限操作的Vo类* @author Nicky* @date 2017年3月6日*/
@Table(name="sys_permission")
@Entity
public class Permission implements Serializable {private int id;private String pdesc;private String name;private static final long serialVersionUID = 1L;private Menu menu;private Set<Operation> operations = new HashSet<Operation>();public Permission() {super();}@GeneratedValue(strategy = GenerationType.IDENTITY)@Idpublic int getId() {return this.id;}public void setId(int id) {this.id = id;}@Column(length=100)public String getPdesc() {return this.pdesc;}public void setPdesc(String pdesc) {this.pdesc = pdesc;}@Column(length=100)public String getName() {return this.name;}public void setName(String name) {this.name = name;}@OneToOne(targetEntity=Menu.class,cascade=CascadeType.REFRESH,fetch=FetchType.EAGER)@JoinColumn(name="menuId",referencedColumnName="menuId")public Menu getMenu() {return menu;}public void setMenu(Menu menu) {this.menu = menu;}@ManyToMany(targetEntity=Operation.class,cascade=CascadeType.MERGE,fetch=FetchType.EAGER)@JoinTable(name="sys_permission_operation",joinColumns=@JoinColumn(name="permissionId",referencedColumnName="id"),inverseJoinColumns=@JoinColumn(name="operationId",referencedColumnName="id"))public Set<Operation> getOperations() {return operations;}public void setOperations(Set<Operation> operations) {this.operations = operations;}
}
实现菜单信息实体类,用JPA来实现
package org.muses.jeeplatform.core.entity.admin;import javax.persistence.*;
import java.io.Serializable;
import java.util.List;/*** @description 菜单信息实体* @author Nicky* @date 2017年3月17日*/
@Table(name="sys_menu")
@Entity
public class Menu implements Serializable {/** 菜单Id**/private int menuId;/** 上级Id**/private int parentId;/** 菜单名称**/private String menuName;/** 菜单图标**/private String menuIcon;/** 菜单URL**/private String menuUrl;/** 菜单类型**/private String menuType;/** 菜单排序**/private String menuOrder;/**菜单状态**/private String menuStatus;private List<Menu> subMenu;private String target;private boolean hasSubMenu = false;public Menu() {super();} @Id@GeneratedValue(strategy=GenerationType.IDENTITY)public int getMenuId() {return this.menuId;}public void setMenuId(int menuId) {this.menuId = menuId;}@Column(length=100)public int getParentId() {return parentId;}public void setParentId(int parentId) {this.parentId = parentId;}@Column(length=100)public String getMenuName() {return this.menuName;}public void setMenuName(String menuName) {this.menuName = menuName;} @Column(length=30)public String getMenuIcon() {return this.menuIcon;}public void setMenuIcon(String menuIcon) {this.menuIcon = menuIcon;} @Column(length=100)public String getMenuUrl() {return this.menuUrl;}public void setMenuUrl(String menuUrl) {this.menuUrl = menuUrl;} @Column(length=100)public String getMenuType() {return this.menuType;}public void setMenuType(String menuType) {this.menuType = menuType;}@Column(length=10)public String getMenuOrder() {return menuOrder;}public void setMenuOrder(String menuOrder) {this.menuOrder = menuOrder;}@Column(length=10)public String getMenuStatus(){return menuStatus;}public void setMenuStatus(String menuStatus){this.menuStatus = menuStatus;}@Transientpublic List<Menu> getSubMenu() {return subMenu;}public void setSubMenu(List<Menu> subMenu) {this.subMenu = subMenu;}public void setTarget(String target){this.target = target;}@Transientpublic String getTarget(){return target;}public void setHasSubMenu(boolean hasSubMenu){this.hasSubMenu = hasSubMenu;}@Transientpublic boolean getHasSubMenu(){return hasSubMenu;}}
实现JpaRepository接口
package org.muses.jeeplatform.core.dao.repository.admin;import org.muses.jeeplatform.core.entity.admin.Role;
import org.springframework.data.jpa.repository.JpaRepository;/*** Created by Nicky on 2017/12/2.*/
public interface RoleRepository extends JpaRepository<Role,Integer> {}
实现JpaRepository接口
package org.muses.jeeplatform.core.dao.repository.admin;import org.muses.jeeplatform.core.entity.admin.Menu;
import org.springframework.data.jpa.repository.JpaRepository;/*** Created by Nicky on 2017/6/17.*/
public interface MenuTreeRepository extends JpaRepository<Menu,Integer>{}
角色Service类:
package org.muses.jeeplatform.service;import com.google.common.collect.Lists;
import org.muses.jeeplatform.core.dao.repository.admin.RolePageRepository;
import org.muses.jeeplatform.core.entity.admin.Role;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;import java.util.List;/*** Created by Nicky on 2017/7/30.*/
@Service
public class RolePageService {@AutowiredRolePageRepository roleRepository;/*** 构建PageRequest对象* @param num* @param size* @param asc* @param string* @return*/private PageRequest buildPageRequest(int num, int size, Sort.Direction asc,String string) {return new PageRequest(num-1, size,null,string);}/*** 获取所有的菜单信息并分页显示* @param pageNo* 当前页面数* @param pageSize* 每一页面的页数* @return*/public Page<Role> findAll(int pageNo, int pageSize, Sort.Direction dir, String str){PageRequest pageRequest = buildPageRequest(pageNo, pageSize, dir, str);Page<Role> roles = roleRepository.findAll(pageRequest);return roles;}public List<Role> findAllRole(){Iterable<Role> roles = roleRepository.findAll();List<Role> myList = Lists.newArrayList(roles);return myList;}/*** 根据角色id查找角色信息* @param roleId* @return*/public Role findByRoleId(String roleId){return roleRepository.findOne(Integer.parseInt(roleId));}/*** 保存角色信息* @param role*/public void doSave(Role role){roleRepository.save(role);}}
菜单Service类:
package org.muses.jeeplatform.service;import org.muses.jeeplatform.annotation.RedisCache;
import org.muses.jeeplatform.common.RedisCacheNamespace;
import org.muses.jeeplatform.core.dao.repository.admin.MenuTreeRepository;
import org.muses.jeeplatform.core.entity.admin.Menu;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.util.List;/*** Created by Nicky on 2017/6/17.*/
@Service
public class MenuTreeService {@AutowiredMenuTreeRepository menuTreeRepository;/*** 查询所有的菜单* @return*/@Transactional//@RedisCachepublic List<Menu> findAll(){return menuTreeRepository.findAll();}}
在Controller类里通过角色id获取该角色可以查看的菜单:
/*** 跳转到角色授权页面* @param roleId* @param model* @return*/@RequestMapping(value = "/goAuthorise" )public String goAuth(@RequestParam String roleId, Model model){List<Menu> menuList = menuTreeService.findAll();Role role = roleService.findByRoleId(roleId);Set<Permission> hasPermissions = null;if(role != null){hasPermissions = role.getPermissions();}for (Menu m : menuList) {for(Permission p : hasPermissions){if(p.getMenu().getMenuId()==m.getMenuId()){m.setHasSubMenu(true);}}}model.addAttribute("roleId" , roleId);JSONArray jsonArray = JSONArray.fromObject(menuList);String json = jsonArray.toString();json = json.replaceAll("menuId","id").replaceAll("parentId","pId").replaceAll("menuName","name").replaceAll("hasSubMenu","checked");model.addAttribute("menus",json);return "admin/role/role_auth";}
在前端通过zTree实现树形菜单展示,通过勾选然后实现角色授权:
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html>
<html lang="zh-CN">
<head><base href="<%=basePath %>"><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Insert title here</title><!-- 引入JQuery库 start --><script type="text/javascript" src="${basePath}static/js/jquery-1.8.3.js"></script><!-- 引入JQuery库 end --><script type="text/javascript" src="<%=basePath%>plugins/zDialog/zDialog.js"></script><script type="text/javascript" src="<%=basePath%>plugins/zDialog/zDrag.js"></script><script type="text/javascript" src="<%=basePath%>plugins/zDialog/zProgress.js"></script><link rel="stylesheet" href="<%=basePath%>plugins/zTree/3.5/zTreeStyle.css" type="text/css"><script type="text/javascript" src="<%=basePath%>plugins/zTree/3.5/jquery-1.4.4.min.js"></script><script type="text/javascript" src="<%=basePath%>plugins/zTree/3.5/jquery.ztree.core.js"></script><script type="text/javascript" src="<%=basePath%>plugins/zTree/3.5/jquery.ztree.excheck.js"></script><script type="text/javascript"><!--var setting = {check: {enable: true},data: {simpleData: {enable: true}},callback:{onClick: {}}};/*[{ id:1, pId:0, name:"随意勾选 1", open:true},{ id:11, pId:1, name:"随意勾选 1-1", open:true},{ id:12, pId:1, name:"随意勾选 1-2", open:true}];*/var json = ${menus};var zNodes = eval(json);var code;function setCheck() {var zTree = $.fn.zTree.getZTreeObj("treeDemo"),py = $("#py").attr("checked")? "p":"",sy = $("#sy").attr("checked")? "s":"",pn = $("#pn").attr("checked")? "p":"",sn = $("#sn").attr("checked")? "s":"",type = { "Y":py + sy, "N":pn + sn};zTree.setting.check.chkboxType = type;showCode('setting.check.chkboxType = { "Y" : "' + type.Y + '", "N" : "' + type.N + '" };');}function showCode(str) {if (!code) code = $("#code");code.empty();code.append("<li>"+str+"</li>");}$(document).ready(function(){$.fn.zTree.init($("#treeDemo"), setting, zNodes);setCheck();$("#py").bind("change", setCheck);$("#sy").bind("change", setCheck);$("#pn").bind("change", setCheck);$("#sn").bind("change", setCheck);});//-->function dialogClose(){parentDialog.close();}function doSave() {var zTree = $.fn.zTree.getZTreeObj("treeDemo");var nodes = zTree.getCheckedNodes();var tmpNode;var ids = "";for(var i=0; i<nodes.length; i++){tmpNode = nodes[i];if(i!=nodes.length-1){ids += tmpNode.id+",";}else{ids += tmpNode.id;}}var roleId = ${roleId};var params = roleId +";"+ids;alert(ids);$.ajax({type: "POST",url: 'role/authorise.do',data: {params:params,tm:new Date().getTime()},dataType:'json',cache: false,success: function(data){if("success" == data.result){alert('授权成功!请重新登录!');parent.location.reload();doDialogClose();}else{alert("授权失败!");}}});}</script>
</head>
<body >
<div class="content_wrap"><div class="zTreeDemoBackground left"><ul id="treeDemo" class="ztree"></ul></div>
</div>
<input type="button" onClick="doSave()" value="保存" class="buttonStyle" />
<input onClick="dialogClose();" class="buttonStyle" type="button" value="关闭" />
</body>
</html>
Team的Github开源项目链接:https://github.com/u014427391/jeeplatform
欢迎star(收藏)
基础平台项目之树形菜单权限配置实现相关推荐
- SpringMVC+ZTree实现树形菜单权限配置
计划在开源项目里加入权限配置的功能,打算加入zTree实现树形结构. Team的Github开源项目链接:https://github.com/u014427391/jeeplatform 欢迎sta ...
- 基础平台项目之设计方案
JEEPlatform 一款企业信息化开发基础平台,可以用于快速构建企业后台管理系统,集成了OA(办公自动化).SCM(供应链系统).ERP(企业资源管理系统).CMS(内容管理系统).CRM(客户关 ...
- mvc登录注册及树形菜单权限管理
一,登录注册 1.根据MySQL中的表写实体类 package com.zking.entity;public class User {private long id;private String n ...
- 基础平台项目之集成Jquery.pagination.js实现分页
本博客介绍基于Spring Data这款orm框架加上 Jquery.pagination插件实现的分页功能. 本博客是基于一款正在开发中的github开源项目的,项目代码地址:https://git ...
- 校园商铺平台项目(3)- spring 配置
1 添加目录 2 添加依赖 <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEn ...
- 支持自定义权限及项目级别权限配置,MeterSphere开源持续测试平台v1.10.0发布|Release Notes
5月27日,MeterSphere一站式开源持续测试平台正式发布v1.10.0版本. 在这一版本中,我们重点优化了平台的相关管理功能,包括提供全局的操作.变更记录功能,重构了用户权限体系,支持自定义用 ...
- SpringBoot开源项目(企业信息化基础平台)
JEEPlatform 一款企业信息化开发基础平台,可以用于快速构建企业后台管理系统,集成了OA(办公自动化).SCM(供应链系统).ERP(企业资源管理系统).CMS(内容管理系统).CRM(客户关 ...
- 如何利用极致业务基础平台主界面容器工具配置出漂亮的业务系统
1.经过前面的大致设计,我们进销存基础资料就做好了.如下图: 因为中间太空洞了,所以我们可以将右边一些功能,放在中间空白区域,这只要在该界面上设置界面显示方式为ShowBoth即可,这样中间右边都可以 ...
- vue树形权限菜单_Vue.js 递归组件实现树形菜单(实例分享)
最近看了 Vue.js 的递归组件,实现了一个最基本的树形菜单. 项目结构: main.js 作为入口,很简单: import Vue from 'vue' Vue.config.debug = tr ...
- linux mysql 实战_Linux平台MySQL多实例项目实施_MySQL数据库基础与项目实战06
Linux平台MySQL多实例项目实施_MySQL数据库基础与项目实战06 视频教程学习地址 Oracle/MySQL数据库学习专用QQ群:336282998.189070296 学完风哥本课程能熟悉 ...
最新文章
- Python编程4道练习题
- xgboost算法 c语言,xgboost与sklearn的接口
- Qt中ui文件的使用
- dos 一行两条命令
- 青岛智能院助力智慧城市 打造智能产业“黄埔军校”
- .net MVC在服务端代码输出html字符串
- 快捷方便的对js文件进行语法检查。
- ArrayBlockingQueue源码分析
- 老机器上安装了kubuntu先尝试安装Manjaro但是鼠标按键无法使用彻底解决办法
- “哥”不信“神马浮云”
- 请问一下Android Studio如何配置JAVACV 0.8Javacv+2.4.9Opencv 万分感谢
- 贝塞尔曲线-曲线拟合
- 罗杨美慧 20190912-1 每周例行报告
- 计算机教学能力提升体会,学习《信息技术助力教学能力提高》感悟
- ANSYS——查看剖面图的应力分布云图以及工作平面的相关设置
- 三人抢答器逻辑电路图_数字电子技术实验(3三人抢答器电路设计).ppt
- 丹东市住房公积金管理中心信息异地备份系统设备竞争性谈判公告
- 学而不思则罔,思而不学则殆。
- pll制作分频器_教你如何制作一个音响分频器,让你的音响重获新生,发挥最佳效果...
- 被花粉质疑Mate40系列品控 华为这张情怀牌还耐打吗?
热门文章
- 数据预处理_缺失值处理
- 基于Wiki的知识共享平台模型架构
- python计算圆的周长_Python计算圆周长和面积
- 电脑ps4,Windows电脑玩PS4游戏,索尼:先来升级Win10吧
- excel怎么合并同类项数据并求和(去除重复项)
- python bottle session-使用beaker让Facebook的Bottle框架支持session功能
- 相机参数(焦距)初始化对三维重建过程的影响
- 北大计算机专业考研难不难,北京大学考研有多难 难考的原因是什么
- c语言switch猜拳游戏,js回顾,用if语句,和switch语句来编写猜拳小游戏。
- TILDE: A Temporally Invariant Learned DEtector学习笔记