It is planned to add permission configuration functions to open source projects, and plans to add zTree to implement a tree structure.
Team's Github open source project link: https://github.com/u014427391/jeepatform welcomes star (collection)
zTree is a multi-functional "tree plug-in" implemented by jQuery. Excellent performance, flexible configuration, and a combination of multiple functions are the biggest advantages of zTree.
zTree download link: http://www.treejs.cn/v3/main.php#_zTreeInfo
Role information entity class:
package org.muses.jeepatform.core.entity.admin;import javax.persistence.*;import java.io.Serializable;import java.util.HashSet;import java.util.Set;/** * @description Role information entity class* @author Nicky * @date March 16, 2017*/@Table(name="sys_role")@Entitypublic class Role implements Serializable{ /** Role Id**/ private int roleId; /** Role description**/ private String roleDesc; /** Role name**/ private String roleName; /** Role flag**/ 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; } //Modify the cascade policy to cascade relationship @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; } @Override public 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); }}Permission information entity class:
package org.muses.jeepatform.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 class for permission operation* @author Nicky * @date March 6, 2017*/@Table(name="sys_permission")@Entitypublic 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) @Id public 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; }}Implement menu information entity class, using JPA to implement it
package org.muses.jeepatform.core.entity.admin;import javax.persistence.*;import java.io.Serializable;import java.util.List;/** * @description Menu information entity* @author Nicky * @date March 17, 2017*/@Table(name="sys_menu")@Entitypublic class Menu implements Serializable { /** Menu Id**/ private int menuId; /** Superior Id**/ private int parentId; /** Menu name**/ private String menuName; /** Menu icon**/ private String menuIcon; /** Menu URL**/ private String menuUrl; /** Menu type**/ private String menuType; /** Menu sort**/ private String menuOrder; /** Menu status**/ 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; } @Transient public List<Menu> getSubMenu() { return subMenu; } public void setSubMenu(List<Menu> subMenu) { this.subMenu = subMenu; } public void setTarget(String target){ this.target = target; } @Transient public String getTarget(){ return target; } public void setHasSubMenu(boolean hasSubMenu){ this.hasSubMenu = hasSubMenu; } @Transient public boolean getHasSubMenu(){ return hasSubMenu; }}Implement the JpaRepository interface
package org.muses.jeepatform.core.dao.repository.admin;import org.muses.jeepatform.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> {}Implement the JpaRepository interface
package org.muses.jeepatform.core.dao.repository.admin;import org.muses.jeepatform.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>{}Role Service Class:
package org.muses.jeepatform.service;import com.google.common.collect.Lists;import org.muses.jeepatform.core.dao.repository.admin.RolePageRepository;import org.muses.jeepatform.core.entity.admin.Role;import org.springframework.beans.factory.annotation.Autowired;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. */@Servicepublic class RolePageService { @Autowired RolePageRepository roleRepository; /** * Build PageRequest object* @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); } /** * Get all menu information and display it on pages* @param pageNo * Current number of pages* @param pageSize * Number of pages per page* @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; } /** * Find role information based on role id* @param roleId * @return */ public Role findByRoleId(String roleId){ return roleRepository.findOne(Integer.parseInt(roleId)); } /** * Save role information* @param role */ public void doSave(Role role){ roleRepository.save(role); }}Menu Service Class:
package org.muses.jeepplatform.service;import org.muses.jeepplatform.annotation.RedisCache;import org.muses.jeepplatform.common.RedisCacheNamespace;import org.muses.jeepplatform.core.dao.repository.admin.MenuTreeRepository;import org.muses.jeepplatform.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. */@Servicepublic class MenuTreeService { @Autowired MenuTreeRepository menuTreeRepository; /** * Query all menus* @return */ @Transactional //@RedisCache public List<Menu> findAll(){ return menuTreeRepository.findAll(); }}In the Controller class, use the role id to get the menu that the role can view:
/** * Jump to role authorization page* @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"; }In the front end, the tree menu display is realized through zTree, and then role authorization is implemented by checking:
<%@ 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 %>" rel="external nofollow" > <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> <!-- Introducing JQuery library start --> <script type="text/javascript" src="${basePath}static/js/jquery-1.8.3.js"></script> <!-- Introducing JQuery library 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/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" rel="external nofollow" 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:"Check 1 at will", open:true}, { id:11, pId:1, name:"Check 1-1 at will", open:true}, { id:12, pId:1, name:"Check 1-2 at will", 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('Authorization was successful! Please log in again!'); parent.location.reload(); doDialogClose(); }else{ alert("Authorization failed!"); } } }); } </script></head><body ><div> <div> <ul id="treeDemo"></ul> </div></div><input type="button" onClick="doSave()" value="Save" /><input onClick="dialogClose();" type="button" value="Close" /></body></html>Team's Github open source project link: https://github.com/u014427391/jeepatform
The above is all the content of this article. I hope it will be helpful to everyone's learning and I hope everyone will support Wulin.com more.