根据登录的userID查询出角色绑定的menucode,再查出所有菜单List<Module>
去除List<Module>中没有绑定的菜单
再将List<Module>建立成树形机构
在将list转为json格式字符串返回到前端
SysModule.java
public class SysModule { private String moduleCode; private String moduleName; private String modulePath; private String parentCode; private String isLeaf; private String sortNumber; private Listchildren = new ArrayList (); //子菜单 public String getModuleCode() { return moduleCode; } public void setModuleCode(String moduleCode) { this.moduleCode = moduleCode; } public String getModuleName() { return moduleName; } public void setModuleName(String moduleName) { this.moduleName = moduleName; } public String getModulePath() { return modulePath; } public void setModulePath(String modulePath) { this.modulePath = modulePath; } public String getParentCode() { return parentCode; } public void setParentCode(String parentCode) { this.parentCode = parentCode; } public String getIsLeaf() { return isLeaf; } public void setIsLeaf(String isLeaf) { this.isLeaf = isLeaf; } public String getSortNumber() { return sortNumber; } public void setSortNumber(String sortNumber) { this.sortNumber = sortNumber; }}
逻辑层
/** * 根据用户id获取module列表 * @param userId * @return * List*/ public List selectModuleByUserId(String userId){ //最终的List 集合 List result=new ArrayList (); //查询所有的List List modules=dao.queryForObjectList("select * from sys_module order by sortNumber asc", null,SysModule.class); if(modules==null){ modules=new ArrayList (); } //查询用户可以操作的模块编号String集合 List mids=dao.queryOneColumnForMoreRows("select distinct moduleCode from sys_role_module where roleCode in (select roleCode from sys_user_role where userCode=?)", new Object[]{userId}, String.class); if(mids==null){ mids=new ArrayList (); } //去除没有权限的叶子节点 clear(modules,mids); //建立模块层次结构 for(int i=0;i modules,List mids){ for(int i=0;i ms){ for(int i=0;i 0){ //如果module的子菜单大于0时 m.getChildren().add(c); //把这个二级菜单c加入到m中 } }else if(c.getModulePath()!=null&&!c.getModulePath().trim().equals("")){ //当路径不为空时,即是m的子菜单. m.getChildren().add(c); //直接加入到m } } } } }
前端
//递归菜单 function RecMenu(m){ var result = ''; result +="
2018-07-17更新
SysModule.java
public class SysModule { private String moduleCode; private String moduleName; private String modulePath; private String parentCode; private String isLeaf; private String sortNumber; private Listchildren = new ArrayList (); //子菜单 /*Getter & Setter方法*/}
Mybatis层
接口层
/** * 根据用户id获取菜单权限(包括所有一级菜单) * @param uid 用户id * @return */ ListgetModuleByUid(String uid);
xml配置
数据库中初始化数据
Service层
@Autowired public UsersMapper usersMapper; /** * 根据用户id获取菜单权限(包括所有一级菜单) * @param uid 用户id * @return */ public ListgetModuleByUid(String uid){ List modules = usersMapper.getModuleByUid(uid); return modules; }
Controller层
/** * 根据用户id获取菜单权限 * @return */ @RequestMapping("/loadpermissions") @ResponseBody ListgetModuleByUid(String uid, HttpServletRequest request, HttpServletResponse response){ //所有绑定的菜单,以及包括 List modules = loginService.getModuleByUid(uid); //最终的List 集合,存储一级菜单 List result=new ArrayList (); //建立模块层次结构 for(int i=0;i 0){ //当一级目录中存在子菜单时 result.add(m); //将一级目录添加到list中 } }else if(m.getParentCode()!=null&&m.getParentCode().equals("0")&&m.getModulePath()!=null&&!m.getModulePath().isEmpty()){ //当一级为菜单,不是目录时,直接添加 result.add(m); } } return result; }
调用接口返回结果
前端
静态样式示例
动态添加菜单
//递归菜单function RecMenu(m){var result = '';result +="