最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringMVC+ZTree實(shí)現(xiàn)樹(shù)形菜單權(quán)限配置的方法

 更新時(shí)間:2017年12月25日 13:56:49   作者:Javahih  
本篇文章主要介紹了SpringMVC+ZTree實(shí)現(xiàn)樹(shù)形菜單權(quán)限配置的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

計(jì)劃在開(kāi)源項(xiàng)目里加入權(quán)限配置的功能,打算加入zTree實(shí)現(xiàn)樹(shù)形結(jié)構(gòu)。

Team的Github開(kāi)源項(xiàng)目鏈接:https://github.com/u014427391/jeeplatform歡迎star(收藏)

zTree 是一個(gè)依靠 jQuery 實(shí)現(xiàn)的多功能 “樹(shù)插件”。優(yōu)異的性能、靈活的配置、多種功能的組合是 zTree 最大優(yōu)點(diǎn)。

zTree下載鏈接:http://www.treejs.cn/v3/main.php#_zTreeInfo

 

角色信息實(shí)體類:

package org.muses.jeeplatform.core.entity.admin;
import javax.persistence.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
/**
 * @description 角色信息實(shí)體類
 * @author Nicky
 * @date 2017年3月16日
 */
@Table(name="sys_role")
@Entity
public class Role implements Serializable{
  /** 角色I(xiàn)d**/
  private int roleId;
  /** 角色描述**/
  private String roleDesc;
  /** 角色名稱**/
  private String roleName;
  /** 角色標(biāo)志**/
  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策略為級(jí)聯(lián)關(guān)系
  @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);
  }
}

權(quán)限信息實(shí)體類:

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 權(quán)限操作的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)
  @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;
  }
}

實(shí)現(xiàn)菜單信息實(shí)體類,用JPA來(lái)實(shí)現(xiàn)

package org.muses.jeeplatform.core.entity.admin;
import javax.persistence.*;
import java.io.Serializable;
import java.util.List;
/**
 * @description 菜單信息實(shí)體
 * @author Nicky
 * @date 2017年3月17日
 */
@Table(name="sys_menu")
@Entity
public class Menu implements Serializable {
  /** 菜單Id**/
  private int menuId;  
  /** 上級(jí)Id**/
  private int parentId;  
  /** 菜單名稱**/
  private String menuName;  
  /** 菜單圖標(biāo)**/
  private String menuIcon;  
  /** 菜單URL**/
  private String menuUrl;  
  /** 菜單類型**/
  private String menuType;
  /** 菜單排序**/
  private String menuOrder;
  /**菜單狀態(tài)**/
  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;
  }

}

實(shí)現(xiàn)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> {

}

實(shí)現(xiàn)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 {
  @Autowired
  RolePageRepository roleRepository;

  /**
   * 構(gòu)建PageRequest對(duì)象
   * @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);
  }

  /**
   * 獲取所有的菜單信息并分頁(yè)顯示
   * @param pageNo
   *     當(dāng)前頁(yè)面數(shù)
   * @param pageSize
   *     每一頁(yè)面的頁(yè)數(shù)
   * @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;
  }

  /**
   * 根據(jù)角色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 {

  @Autowired
  MenuTreeRepository menuTreeRepository;

  /**
   * 查詢所有的菜單
   * @return
   */
  @Transactional
  //@RedisCache
  public List<Menu> findAll(){
    return menuTreeRepository.findAll();
  }
}

在Controller類里通過(guò)角色id獲取該角色可以查看的菜單:

/**
   * 跳轉(zhuǎn)到角色授權(quán)頁(yè)面
   * @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";
  }

在前端通過(guò)zTree實(shí)現(xiàn)樹(shù)形菜單展示,通過(guò)勾選然后實(shí)現(xiàn)角色授權(quán):

<%@ 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>
  <!-- 引入JQuery庫(kù) start -->
  <script type="text/javascript" src="${basePath}static/js/jquery-1.8.3.js"></script>
  <!-- 引入JQuery庫(kù) 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" 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:"隨意勾選 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('授權(quán)成功!請(qǐng)重新登錄!');
            parent.location.reload();
            doDialogClose();
          }else{
            alert("授權(quán)失敗!");
          }
        }
      });
    }

  </script>
</head>
<body >
<div class="content_wrap">
  <div class="zTreeDemoBackground left">
    <ul id="treeDemo" class="ztree"></ul>
  </div>
</div>
&nbsp;&nbsp;
<input type="button" onClick="doSave()" value="保存" class="buttonStyle" />
<input onClick="dialogClose();" class="buttonStyle" type="button" value="關(guān)閉" />
</body>
</html>

 

Team的Github開(kāi)源項(xiàng)目鏈接:https://github.com/u014427391/jeeplatform

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中seata框架的XA模式詳解

    Java中seata框架的XA模式詳解

    這篇文章主要介紹了Java中seata框架的XA模式詳解,Seata?是一款開(kāi)源的分布式事務(wù)解決方案,致力于提供高性能和簡(jiǎn)單易用的分布式事務(wù)服務(wù),Seata?將為用戶提供了?AT、TCC、SAGA?和?XA?事務(wù)模式,為用戶打造一站式的分布式解決方案,需要的朋友可以參考下
    2023-08-08
  • jdk自帶定時(shí)器使用方法詳解

    jdk自帶定時(shí)器使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了jdk自帶定時(shí)器的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Java集成presto查詢方式

    Java集成presto查詢方式

    這篇文章主要介紹了Java集成presto查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 如何修改logback.xml配置文件在resource以外的位置

    如何修改logback.xml配置文件在resource以外的位置

    這篇文章主要介紹了如何修改logback.xml配置文件在resource以外的位置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • Spring Boot集成LangChain來(lái)實(shí)現(xiàn)Rag應(yīng)用的問(wèn)題小結(jié)

    Spring Boot集成LangChain來(lái)實(shí)現(xiàn)Rag應(yīng)用的問(wèn)題小結(jié)

    檢索增強(qiáng)生成(RAG)是一種優(yōu)化大型語(yǔ)言模型(LLM)輸出的技術(shù),通過(guò)引用權(quán)威知識(shí)庫(kù)以增強(qiáng)模型的準(zhǔn)確性和相關(guān)性,RAG允許LLM在不重新訓(xùn)練的情況下訪問(wèn)特定領(lǐng)域的知識(shí),提高了其在各種應(yīng)用中的實(shí)用性和信任度,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Java零基礎(chǔ)教程之do-while循環(huán)語(yǔ)句實(shí)例

    Java零基礎(chǔ)教程之do-while循環(huán)語(yǔ)句實(shí)例

    Java中的do-while循環(huán)是一種后測(cè)試循環(huán)語(yǔ)句,它類似于while循環(huán),但它先執(zhí)行循環(huán)體中的代碼,然后再進(jìn)行條件判斷,無(wú)論條件是否滿足,至少會(huì)執(zhí)行一次循環(huán)體中的代碼,這篇文章主要給大家介紹了關(guān)于Java零基礎(chǔ)教程之do-while循環(huán)語(yǔ)句的相關(guān)資料,需要的朋友可以參考下
    2024-09-09
  • Java之String類常用操作方法舉例

    Java之String類常用操作方法舉例

    這篇文章主要介紹了Java之String類常用操作方法的相關(guān)資料,包括了Java中String類的各個(gè)方面,包括String類的聲明、內(nèi)部屬性、不可變性、實(shí)例化方式、拼接、構(gòu)造器、相互轉(zhuǎn)換方法以及常用方法,需要的朋友可以參考下
    2025-03-03
  • 關(guān)于IDEA配置Hibernate中遇到的問(wèn)題解決

    關(guān)于IDEA配置Hibernate中遇到的問(wèn)題解決

    這篇文章主要給大家介紹了關(guān)于IDEA配置Hibernate中遇到的問(wèn)題,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • springboot 如何使用jedis連接Redis數(shù)據(jù)庫(kù)

    springboot 如何使用jedis連接Redis數(shù)據(jù)庫(kù)

    這篇文章主要介紹了springboot 使用jedis連接Redis數(shù)據(jù)庫(kù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringBoot整合EasyCaptcha實(shí)現(xiàn)圖形驗(yàn)證碼功能

    SpringBoot整合EasyCaptcha實(shí)現(xiàn)圖形驗(yàn)證碼功能

    這篇文章主要介紹了SpringBoot整合EasyCaptcha實(shí)現(xiàn)圖形驗(yàn)證碼功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-02-02

最新評(píng)論

抚远县| 泽库县| 昭通市| 许昌市| 河津市| 衡山县| 小金县| 曲靖市| 锦屏县| 舟山市| 乐陵市| 原平市| 阜宁县| 宝坻区| 金寨县| 历史| 北安市| 抚顺市| 庆城县| 卓尼县| 托克逊县| 吉林省| 德令哈市| 同心县| 慈利县| 东丰县| 卓尼县| 德安县| 吐鲁番市| 永泰县| 榆林市| 永安市| 崇信县| 亚东县| 柏乡县| 汕头市| 湾仔区| 安多县| 茌平县| 乡城县| 霸州市|