Bean对象
<pre class="java" name="code">/**
* 系统菜单
* @author june
*/
@SuppressWarnings("serial")
public class Menu extends CommonBean{
/** 菜单id */
private String id = IDUtil.RANDOM128();
/** 菜单名 */
private String name;
/** 模板地址 */
private String tpl;
/** 图标 */
private String icon;
/** 是否为根节点 */
private boolean root;
/** 是否为叶子节点 */
private boolean leaf;
/** 是否为普通菜单 */
private boolean normal;
/** 父节点id */
private String parentId;
/** 排序值 */
private String orderValue;
/** css样式 */
private String css;
/** js */
private String js;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public String getIcon() {
return icon;
}
public void setIcon(String icon) {
this.icon = icon;
}
public String getTpl() {
return tpl;
}
public void setTpl(String tpl) {
this.tpl = tpl;
}
public boolean isRoot() {
return root;
}
public void setRoot(boolean root) {
this.root = root;
}
public boolean isLeaf() {
return leaf;
}
public void setLeaf(boolean leaf) {
this.leaf = leaf;
}
public boolean isNormal() {
return normal;
}
public void setNormal(boolean normal) {
this.normal = normal;
}
public String getOrderValue() {
return orderValue;
}
public void setOrderValue(String orderValue) {
this.orderValue = orderValue;
}
public String getCss() {
return css;
}
public void setCss(String css) {
this.css = css;
}
public String getJs() {
return js;
}
public void setJs(String js) {
this.js = js;
}
}
VO
<pre class="java" name="code">/**
* 菜单
* @author june
*/
@SuppressWarnings("serial")
public class MenuVO implements Serializable{
/** 菜单id */
private String id;
/** 菜单名 */
private String name;
/** css样式 */
private String css;
/** js */
private String js;
/** 模板地址 */
private String tpl;
/** 图标 */
private String icon;
/** 是否为根节点 */
private boolean root;
/** 是否为叶子节点 */
private boolean leaf;
/** 是否为普通菜单 */
private boolean normal;
/** 父节点id */
private String parentId;
/** 子节点 */
private List<MenuVO> children;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTpl() {
return tpl;
}
public void setTpl(String tpl) {
this.tpl = tpl;
}
public String getIcon() {
return icon;
}
public void setIcon(String icon) {
this.icon = icon;
}
public boolean isRoot() {
return root;
}
public void setRoot(boolean root) {
this.root = root;
}
public boolean isLeaf() {
return leaf;
}
public void setLeaf(boolean leaf) {
this.leaf = leaf;
}
public boolean isNormal() {
return normal;
}
public void setNormal(boolean normal) {
this.normal = normal;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public List<MenuVO> getChildren() {
return children;
}
public void setChildren(List<MenuVO> children) {
this.children = children;
}
public String getCss() {
return css;
}
public void setCss(String css) {
this.css = css;
}
public String getJs() {
return js;
}
public void setJs(String js) {
this.js = js;
}
}
工具类
<pre class="java" name="code">/**
* 菜单工具类
* @author june
*
*/
public class PowerMenuTree {
/**
* 构建菜单树
* @param nodes 权限内的菜单
*/
public static void bulid(List<MenuVO> powerList, Map<String,String> powerNode){
if((null != powerList && !powerList.isEmpty())){
if(null != powerNode && !powerNode.isEmpty()){
//保存权限内的菜单结果
List<MenuVO> menuTree = new ArrayList<MenuVO>();
for (MenuVO menu : powerList) {
//遍历根节点
if (menu.isRoot()) {
buildNode(menu, powerList, powerNode);
List<MenuVO> children = menu.getChildren();
//去除空的没有叶子节点
if(null != children && !children.isEmpty()){
menuTree.add(menu);
}
}
}
powerList.clear();
powerList.addAll(menuTree);
}else{
powerList.clear();
}
}
}
/**
* 构建下级菜单
* @param node
*/
private static void buildNode(MenuVO node, List<MenuVO> powerList, Map<String,String> powerNode){
//获取下级菜单
List<MenuVO> children = buildChildren(node, powerList, powerNode);
if (null != children && !children.isEmpty()) {
node.setChildren(children);
for (MenuVO child : children) {
buildNode(child, powerList, powerNode);
}
}
}
/***
* 构建子节点
* @param node
* @return
*/
private static List<MenuVO> buildChildren(MenuVO node, List<MenuVO> powerList, Map<String,String> powerNode){
List<MenuVO> children = null;
String id = node.getId();
for (MenuVO child : powerList) {
//获取子节点
if (id.equals(child.getParentId())) {
if(null == children){
children = new ArrayList<MenuVO>();
}
if(child.isLeaf() || null != powerNode.get(child.getId())){
children.add(child);
}
}
}
return children;
}
/**
* 转换为VO
* @param menu
* @return
*/
public static List<MenuVO> parse(List<Menu> nodes){
List<MenuVO> nodeVOs = null;
if(null != nodes && !nodes.isEmpty()){
nodeVOs = new ArrayList<MenuVO>();
for(Menu menu : nodes){
MenuVO menuVO = parse(menu);
if(null != menuVO){
nodeVOs.add(menuVO);
}
}
}
return nodeVOs;
}
/**
* 把Menu转换为MenuVO
* @param menu
* @return
*/
public static MenuVO parse(Menu menu){
if(null != menu){
MenuVO menuVO = new MenuVO();
menuVO.setId(menu.getId());
menuVO.setName(menu.getName());
menuVO.setIcon(menu.getIcon());
menuVO.setTpl(menu.getTpl());
menuVO.setParentId(menu.getParentId());
menuVO.setRoot(menu.isRoot());
menuVO.setLeaf(menu.isLeaf());
menuVO.setNormal(menu.isNormal());
menuVO.setJs(menu.getJs());
menuVO.setCss(menu.getCss());
menuVO.setChildren(null);
return menuVO;
}
return null;
}
}
关键性代码
<pre class="java" name="code">/**
* 构建角色的权限模块
* @param roleId 角色id
* @param menuList 模块列表
* @param roleMenus 角色对应的菜单
* @param functionMap 角色对应的权限
*/
private void buildPower( String roleId,
List<Menu> menuList,
Map<String, String> roleMenu,
Map<String, PowerVO> powerMap,
List<MenuCodeVO> codeVOList) {
//权限菜单结构
List<MenuVO> menuVOList = new ArrayList<MenuVO>();
//不是普通菜单
List<MenuVO> normalList = new ArrayList<MenuVO>();
//权限节点
Map<String,String> powerNode = new HashMap<String, String>();
//权限菜单
Map<String,MenuVO> powerMenu = new HashMap<String, MenuVO>();
//过滤权限菜单
for(Menu menu : menuList){
if(menu.isLeaf()){
//不是权限内的菜单
if(null == roleMenu.get(menu.getId())){
continue;
}
}
//转换VO
MenuVO menuVO = PowerMenuTree.parse(menu);
//不是普通菜单
if(!menu.isNormal()){
normalList.add(menuVO);
continue;
}
menuVOList.add(menuVO);
powerMenu.put(menu.getId(), menuVO);
}
//获取叶子节点的父节点列表,用于过滤空节点
for(String menuId : roleMenu.keySet()) {
if(StringUtils.isEmpty(menuId)) continue;
MenuVO menuVO = powerMenu.get(menuId);
while (menuVO != null) {
String parentId = menuVO.getParentId();
if(!StringUtils.isEmpty(parentId)){
powerNode.put(parentId, parentId);
}
powerNode.put(menuVO.getId(), menuVO.getId());
menuVO = powerMenu.get(parentId);
}
}
//构建菜单结构
PowerMenuTree.bulid(menuVOList, powerNode);
PowerVO powerVO = new PowerVO();
powerVO.setMenuVOList(menuVOList);
powerVO.setNormalList(normalList);
powerVO.setCodeVOList(codeVOList);
powerMap.put(roleId, powerVO);
powerVO = null;
roleMenu = null;
powerMenu = null;
powerNode = null;
menuVOList = null;
normalList = null;
codeVOList = null;
}