树形结构的形成和提交
形成树形结构的数据1用sql组织(后台),2java组织(前台权限),最终都是在前的有结构的基础上转化为字符串菜单样式
权限的提交:
1,前台设计之初就把素有的checkbox name一样,之后用数组接收,接收到的就是选中的
2,以系统的菜单为样本,通过request获取checkbox传入的选中的菜单(用系统的菜单值),可以得到说明选中了
下一次的递归对象集总会比前一次的递归集小(每次递归集用的是上一次的子作为基础的树去递归)
后台的权限菜单的展现,和提交
后台(只依赖sql组织)OpmRoleController.java
//加载所有权限,本角色用的菜单用checked展现(只依赖sql组织)
@SuppressWarnings("rawtypes")
@RequestMapping(value="/system/opmRole/Auths")
@ResponseBody
public JSONArray treeRead(@RequestHeader(value="fg") String fg,@RequestHeader(value="id",required=false) String id,@RequestHeader(value="leave") String leave,@RequestHeader(value="roleId") String roleId,@RequestHeader(value="pId") String pId,@RequestHeader(value="groupId",required=false) String groupId1,@RequestBody(required=false) List<OpmRolelimit> o){
List<String> strl= new ArrayList<String>();
String str="";
JSONArray JsonArray = new JSONArray(); ///用这个作为菜单的承接
Map<String,Object> param = new HashMap<String,Object>();
param.put("pId", pId);
List<Map> map= opmMenufolderService.getfordMenuLimt(param);////查询以当前为父节点的所有菜单权限(sql树形顺序,不是实体树形结构),每迭代深入一次迭代树减少一次(每次都是以子为迭代树,递进,然后回归父的迭代数)
if("1".equals(fg)&&id!=null&&!"".equals(id)){
//查询角色权限表
System.out.println("==========查询角色权限表=======");
OpmRolelimit oo =new OpmRolelimit();
oo.setRoleid(id);
o=opmRolelimitService.getRoleLimt(oo);//查出本用户角色拥有的菜单(没有树形的结果集,普通)
fg="0";
}
Map<String,Object> param1 = new HashMap<String,Object>();
String groupId=groupId1;
for(Map p: map){
param1.put("pId", p.get("ID"));
String l= (String) p.get("LEAVE");
if("1".equals(l)){//分级别渲染菜单
if("100000".equals(p.get("PARENTID")+"")){//顶级菜单根
groupId=(String)p.get("ID");
str+="<label style=\"float:left\"><input type=\"checkbox\" class=\"checkboxCtrl\" value="+p.get("ID")+" group="+groupId+" selectType=\"invert\" />"+p.get("NAME")+"</label>"+"\n";
strl.add(str);
JSONObject Json = new JSONObject();
Json.put("ID", p.get("ID")+"");
Json.put("NAME", p.get("NAME")+"");
Json.put("groupId", groupId);
Json.put("parentId", p.get("PARENTID"));
Json.put("leave", l);
Json.put("str", "<label style=\"float:left;width:150px;\"><input type=\"checkbox\" class=\"checkboxCtrl\" value="+p.get("ID")+" onclick=\"checkedAllBox(this);\" group="+groupId+" //>"+p.get("NAME")+"</label>"+"\n");
JsonArray.add(Json);
}else{//一级菜单
str+="<label><input type=\"checkbox\" value="+p.get("ID")+" name="+groupId+"/>"+p.get("NAME")+"</label>"+"\n";
strl.add(str);
JSONObject Json = new JSONObject();
Json.put("ID", p.get("ID")+"");
Json.put("NAME", p.get("NAME")+"");
Json.put("groupId",groupId);
Json.put("parentId", p.get("PARENTID"));
Json.put("leave", l);
Json.put("str","<label style=\"width:150px;\"> "+p.get("NAME")+"</label>"+"\n");
JsonArray.add(Json);
}
}
if("2".equals(l)){//二级菜单
if(Integer.valueOf(leave)<0){
if(Integer.valueOf(p.get("LEAVE1")+"") >=Integer.valueOf(leave)){
str+="<label><input type=\"checkbox\" value="+p.get("ID")+" name="+groupId+"/>"+p.get("NAME")+"</label>"+"\n";
strl.add(str);
JSONObject Json = new JSONObject();
Json.put("ID", p.get("ID")+"");
Json.put("NAME", p.get("NAME")+"");
Json.put("groupId", groupId);
Json.put("parentId", p.get("PARENTID"));
Json.put("leave", l);
String bs ="<label style=\"width:150px;\"> <input type=\"checkbox\" value="+p.get("ID")+" name='"+groupId+"'/>"+p.get("NAME")+"</label>"+"\n";
if(o!=null){
for(OpmRolelimit k : o){///////当前用户角色菜单
if( (p.get("ID")+"").equals(k.getMenuitemid())){///////如果当前遍历到的全部系统菜单中在此角色的菜单中,则挑出
bs ="<label style=\"width:150px;\"> <input type=\"checkbox\" value="+p.get("ID")+" checked=\"checked\" name='"+groupId+"'/>"+p.get("NAME")+"</label>"+"\n";
break;
}
}
}
Json.put("str",bs);
JsonArray.add(Json);
}
}else{
//TODO
Map<String,Object> param2 = new HashMap<String,Object>();
param2.put("menuItemId", p.get("ID"));
param2.put("menuItemLimitId", null);
param2.put("roleId", roleId);
param2.put("displayOrder", Integer.valueOf(-1));
List<OpmRolelimit> rl= opmRolelimitService.getRoleLimitByTJ(param2);
if(rl!=null&&rl.size()>0&&Integer.valueOf(p.get("LEAVE1")+"") >=Integer.valueOf(leave)){
str+="<label><input type=\"checkbox\" value="+p.get("ID")+" name="+groupId+"/>"+p.get("NAME")+"</label>"+"\n";
strl.add(str);
JSONObject Json = new JSONObject();
Json.put("ID", p.get("ID")+"");
Json.put("NAME", p.get("NAME")+"");
Json.put("groupId", groupId);
Json.put("parentId", p.get("PARENTID"));
Json.put("leave", l);
// Json.put("str","<label style=\"width:150px;\"> <input type=\"checkbox\" value="+p.get("ID")+" name='"+groupId+"'/>"+p.get("NAME")+"</label>"+"\n");
String bs ="<label style=\"width:150px;\"> <input type=\"checkbox\" value="+p.get("ID")+" name='"+groupId+"'/>"+p.get("NAME")+"</label>"+"\n";
if(o!=null){
for(OpmRolelimit k : o){
if( (p.get("ID")+"").equals(k.getMenuitemid())){
bs ="<label style=\"width:150px;\"> <input type=\"checkbox\" value="+p.get("ID")+" checked=\"checked\" name='"+groupId+"'/>"+p.get("NAME")+"</label>"+"\n";
break;
}
}
}
Json.put("str",bs);
JsonArray.add(Json);
}
}
}
if("3".equals(l)){//三级菜单
Map<String,Object> param2 = new HashMap<String,Object>();
param2.put("menuItemId", p.get("PARENTID"));
param2.put("menuItemLimitId", p.get("ID"));
param2.put("roleId", roleId);//当前登录用户角色Id
param2.put("displayOrder", null);
List<OpmRolelimit> rl2= opmRolelimitService.getRoleLimitByTJ(param2);
String tempg=groupId;
if(rl2!=null&&rl2.size()>0){
str+="<label><input type=\"checkbox\" value="+p.get("ID")+" name="+groupId+"/>"+p.get("NAME")+"</label>"+"\n";
strl.add(str);
JSONObject Json = new JSONObject();
Json.put("ID", p.get("ID")+"");
Json.put("NAME", p.get("NAME")+"");
Json.put("groupId", groupId);
Json.put("parentId", p.get("PARENTID"));
Json.put("leave", l);
// Json.put("str","<label style=\"width:150px;\"><input type=\"checkbox\" value="+p.get("ID")+" name='"+groupId+"'/>"+p.get("NAME")+"</label>"+"\n");
String bs ="<label style=\"width:150px;\"><input type=\"checkbox\" value="+p.get("ID")+" name='"+groupId+"'/>"+p.get("NAME")+"</label>"+"\n";
if(o!=null){
for(OpmRolelimit k : o){
if( (p.get("ID")+"").equals(k.getMenuitemlimitid())){
bs ="<label style=\"width:150px;\"><input type=\"checkbox\" value="+p.get("ID")+" checked=\"checked\" name='"+groupId+"'/>"+p.get("NAME")+"</label>"+"\n";
break;
}
}
}
Json.put("str",bs);
JsonArray.add(Json);
}
}
//str+=treeRead(leave,roleId,p.get("ID")+"",groupId);
JsonArray.addAll(treeRead(fg,id,leave,roleId,p.get("ID")+"",groupId,o));
}
return JsonArray;
}
//加载把有的菜单展现,本角色用的菜单用checked展现
@SuppressWarnings("rawtypes")
@RequestMapping(value="/system/opmRole/AuthsInfo")
@ResponseBody
public JSONArray treeReadInfo(@RequestHeader(value="fg") String fg,@RequestHeader(value="id") String id,@RequestHeader(value="leave") String leave,@RequestHeader(value="roleId") String roleId,@RequestHeader(value="pId") String pId,@RequestHeader(value="groupId",required=false) String groupId1,@RequestBody(required=false) List<OpmRolelimit> o){
List<String> strl= new ArrayList<String>();
String str="";
JSONArray JsonArray = new JSONArray();
Map<String,Object> param = new HashMap<String,Object>();
param.put("pId", pId);
List<Map> map= opmMenufolderService.getfordMenuLimt(param);
if("1".equals(fg)&&id!=null&&!"".equals(id)){
System.out.println("==========查询角色权限表=======");
OpmRolelimit oo =new OpmRolelimit();
oo.setRoleid(id);
o=opmRolelimitService.getRoleLimt(oo);
fg="0";
}
Map<String,Object> param1 = new HashMap<String,Object>();
String groupId=groupId1;
for(Map p: map){
param1.put("pId", p.get("ID"));
String l= (String) p.get("LEAVE");
if("1".equals(l)){
if("100000".equals(p.get("PARENTID")+"")){
groupId=(String)p.get("ID");
str+="<label style=\"float:left\"><input type=\"checkbox\" class=\"checkboxCtrl\" value="+p.get("ID")+" group="+groupId+" selectType=\"invert\" />"+p.get("NAME")+"</label>"+"\n";
strl.add(str);
JSONObject Json = new JSONObject();
Json.put("ID", p.get("ID")+"");
Json.put("NAME", p.get("NAME")+"");
Json.put("groupId", groupId);
Json.put("parentId", p.get("PARENTID"));
Json.put("leave", l);
OpmMenuitem m= new OpmMenuitem();
m.setMenufolderid(p.get("ID")+"");
List<OpmMenuitem> ms= opmMenuitemService.getMenuItems(m);
boolean flag=false;
if(ms!=null&&o!=null){
for(OpmMenuitem mm :ms){/////////所有菜单
for(OpmRolelimit oo :o){///////////本角色用户拥有的菜单
if(oo.getMenuitemid().equals(mm.getId())){//////////////////////////负责挑出本角色的菜单显示
Json.put("str", "<label style=\"float:left;width:150px;\">"+p.get("NAME")+"</label>"+"\n");
JsonArray.add(Json);
flag=true;
break;
}
}
if(flag){
break;
}
}
}
if(!flag){
OpmMenufolder folder= new OpmMenufolder();
folder.setParentid(p.get("ID")+"");
List<OpmMenufolder> folder2= opmMenufolderService.getOpmMenufolder(folder);
if(folder2!=null&&folder2.size()>0&&o!=null){
for(OpmMenufolder f: folder2){
OpmMenuitem fm= new OpmMenuitem();
fm.setMenufolderid(f.getId());
List<OpmMenuitem> fms= opmMenuitemService.getMenuItems(fm);
if(fms!=null&&fms.size()>0){
for(OpmMenuitem ffm: fms){
for(OpmRolelimit oo :o){
if(oo.getMenuitemid().equals(ffm.getId())){
Json.put("str", "<label style=\"float:left;width:150px;\">"+p.get("NAME")+"</label>"+"\n");
JsonArray.add(Json);
flag=true;
break;
}
}
if(flag){
break;
}
}
}
if(flag){
break;
}
}
}
}
}else{
str+="<label><input type=\"checkbox\" value="+p.get("ID")+" name="+groupId+"/>"+p.get("NAME")+"</label>"+"\n";
strl.add(str);
JSONObject Json = new JSONObject();
Json.put("ID", p.get("ID")+"");
Json.put("NAME", p.get("NAME")+"");
Json.put("groupId",groupId);
Json.put("parentId", p.get("PARENTID"));
Json.put("leave", l);
OpmMenuitem m= new OpmMenuitem();
m.setMenufolderid(p.get("ID")+"");
List<OpmMenuitem> ms= opmMenuitemService.getMenuItems(m);
boolean flag=false;
if(ms!=null&&o!=null){
for(OpmMenuitem mm :ms){
for(OpmRolelimit oo :o){
if(oo.getMenuitemid().equals(mm.getId())){
Json.put("str","<label style=\"width:150px;\"> "+p.get("NAME")+"</label>"+"\n");
JsonArray.add(Json);
flag=true;
break;
}
}
if(flag){
break;
}
}
}
}
}
if("2".equals(l)){
if(Integer.valueOf(leave)<0){
if(Integer.valueOf(p.get("LEAVE1")+"") >=Integer.valueOf(leave)){
str+="<label><input type=\"checkbox\" value="+p.get("ID")+" name="+groupId+"/>"+p.get("NAME")+"</label>"+"\n";
strl.add(str);
JSONObject Json = new JSONObject();
Json.put("ID", p.get("ID")+"");
Json.put("NAME", p.get("NAME")+"");
Json.put("groupId", groupId);
Json.put("parentId", p.get("PARENTID"));
Json.put("leave", l);
String bs ="";
if(o!=null){
for(OpmRolelimit k : o){
if( (p.get("ID")+"").equals(k.getMenuitemid())){
bs ="<label style=\"width:150px;\"> "+p.get("NAME")+"</label>"+"\n";
Json.put("str",bs);
JsonArray.add(Json);
break;
}
}
}
}
}else{
Map<String,Object> param2 = new HashMap<String,Object>();
param2.put("menuItemId", p.get("ID"));
param2.put("menuItemLimitId", null);
param2.put("roleId", roleId);
param2.put("displayOrder", Integer.valueOf(-1));
List<OpmRolelimit> rl= opmRolelimitService.getRoleLimitByTJ(param2);
if(rl!=null&&rl.size()>0&&Integer.valueOf(p.get("LEAVE1")+"") >=Integer.valueOf(leave)){
str+="<label><input type=\"checkbox\" value="+p.get("ID")+" name="+groupId+"/>"+p.get("NAME")+"</label>"+"\n";
strl.add(str);
JSONObject Json = new JSONObject();
Json.put("ID", p.get("ID")+"");
Json.put("NAME", p.get("NAME")+"");
Json.put("groupId", groupId);
Json.put("parentId", p.get("PARENTID"));
Json.put("leave", l);
String bs ="<label style=\"width:150px;\"> <input type=\"checkbox\" value="+p.get("ID")+" name='"+groupId+"'/>"+p.get("NAME")+"</label>"+"\n";
if(o!=null){
for(OpmRolelimit k : o){
if( (p.get("ID")+"").equals(k.getMenuitemid())){
bs ="<label style=\"width:150px;\"> "+p.get("NAME")+"</label>"+"\n";
Json.put("str",bs);
JsonArray.add(Json);
break;
}
}
}
}
}
}
if("3".equals(l)){
Map<String,Object> param2 = new HashMap<String,Object>();
param2.put("menuItemId", p.get("PARENTID"));
param2.put("menuItemLimitId", p.get("ID"));
param2.put("roleId", roleId);//当前登录用户角色Id
param2.put("displayOrder", null);
List<OpmRolelimit> rl2= opmRolelimitService.getRoleLimitByTJ(param2);
String tempg=groupId;
if(rl2!=null&&rl2.size()>0){
str+="<label><input type=\"checkbox\" value="+p.get("ID")+" name="+groupId+"/>"+p.get("NAME")+"</label>"+"\n";
strl.add(str);
JSONObject Json = new JSONObject();
Json.put("ID", p.get("ID")+"");
Json.put("NAME", p.get("NAME")+"");
Json.put("groupId", groupId);
Json.put("parentId", p.get("PARENTID"));
Json.put("leave", l);
String bs ="<label style=\"width:150px;\"><input type=\"checkbox\" value="+p.get("ID")+" name='"+groupId+"'/>"+p.get("NAME")+"</label>"+"\n";
if(o!=null){
for(OpmRolelimit k : o){
if( (p.get("ID")+"").equals(k.getMenuitemlimitid())){
bs ="<label style=\"width:150px;\">"+p.get("NAME")+"</label>"+"\n";
Json.put("str",bs);
JsonArray.add(Json);
break;
}
}
}
}
}
JsonArray.addAll(treeReadInfo(fg,id,leave,roleId,p.get("ID")+"",groupId,o));
}
return JsonArray;
}
提交权限的时候同一个页面的权限的checkbox name相同
@SuppressWarnings("unused")
@RequestMapping(value = "/system/opmRole/update", method = RequestMethod.POST)
public ModelAndView opmUpdate(OpmRole opmRole,HttpServletRequest request,Model modle) throws Exception {
int flag=0;
OpmMenufolder folder = new OpmMenufolder();
folder.setParentid("100000");
List<OpmMenufolder> opmMenufolders= opmMenufolderService.getOpmMenufolder(folder);///查出所有的系统权限
String[] a=new String[]{};
List<String> list = new ArrayList<String>();
try{
for(OpmMenufolder o: opmMenufolders){
a=request.getParameterValues(o.getId());//////通过request获取checkbox传入的选中的菜单,可以得到说明选中了
if(a==null||"".equals(a)){
continue;
}
list.addAll(Arrays.asList(a));//选中的在系统菜单中就记录下,后面跟据这个选中的记录一个一个更新
}
Map<String,Object> param = new HashMap<String,Object>();
OpmRolelimit opmLimt = new OpmRolelimit();
String org= opmRole.getOrganid();
flag = opmRoleService.updateRole(opmRole, list);
//
myShiroFilterFactory.reloadChainDefinitions();
return ajaxDoneOpm("/commonuntil/ajaxDone",200,"操作成功!","opmRoleNavUi","/system/opmRole/editUi","closeCurrent");
}catch (Exception e){
return ajaxDoneOpm("/commonuntil/ajaxDone",300,"添加失败!","opmRoleNavUi","/system/opmRole/editUi","closeCurrent");
//throw new Exception("操作失败!");
}
}
@Override
@Transactional(rollbackFor=Exception.class)
@CacheEvict(value="getRoleLimt", allEntries = true)
public int updateRole(OpmRole opmRole,List<String> list) throws Exception {
// TODO Auto-generated method stub
System.out.println("==========================213213213===================");
if("".equals(opmRole.getOrganid())||null==opmRole.getOrganid()){
throw new Exception("传入参数为空!");
}
TbCusMark tbCusMark = new TbCusMark();
tbCusMark.setMarketKey(BigDecimal.valueOf(Long.valueOf(opmRole.getOrganid())));
TbCusMark mark= tbCusMarkMapper.selectOne(tbCusMark);
if(mark==null){
throw new Exception("交易市场找不到!");
}
OpmRole role =new OpmRole();
if(opmRole.getId()==null||"".equals(opmRole.getId())){
role.setOrganid(opmRole.getOrganid());
role.setLevel1(Short.valueOf("0"));
role.setName(opmRole.getName());
role.setMemo(opmRole.getMemo());
opmRoleMapper.insert(role);
}else{
OpmRolelimit opmRolelimit = new OpmRolelimit();
opmRolelimit.setRoleid(opmRole.getId());
opmRolelimitMapper.delete(opmRolelimit);
opmRoleMapper.updateByPrimaryKeySelective(opmRole);
}
OpmMenuitemlimit opmMenuitemlimit = new OpmMenuitemlimit();
List<OpmMenuitemlimit> opmLimits= opmMenuitemlimitMapper.select(opmMenuitemlimit);
OpmMenuitem item = new OpmMenuitem();
List<OpmMenuitem> items= opmMenuitemMapper.select(item);
try{
for(String l :list){
OpmRolelimit opmLimt = new OpmRolelimit();
int up=0;
for(OpmMenuitem i: items){
if(i.getId().equals(l)){
opmLimt.setMenuitemid(i.getId());
opmLimt.setDisplayorder(-1L);
opmLimt.setName("查看");
if(opmRole.getId()==null||"".equals(opmRole.getId())){
opmLimt.setRoleid(role.getId());
up= opmRolelimitMapper.insert(opmLimt);
}else{
opmLimt.setRoleid(opmRole.getId());
up= opmRolelimitMapper.insert(opmLimt);
}
break;
}
}
if(up==0){
for(OpmMenuitemlimit lm : opmLimits){
if(lm.getId().equals(l)){
opmLimt.setMenuitemid(lm.getMenuitemid());
opmLimt.setDisplayorder(lm.getDisplayorder());
opmLimt.setName(lm.getName());
opmLimt.setMenuitemlimitid(lm.getId());
opmLimt.setDisplayorder(lm.getDisplayorder());
opmLimt.setName(lm.getName());
String org= opmRole.getOrganid();
if(opmRole.getId()==null||"".equals(opmRole.getId())){
opmLimt.setRoleid(role.getId());
up= opmRolelimitMapper.insert(opmLimt);
}else{
opmLimt.setRoleid(opmRole.getId());
opmRolelimitMapper.insert(opmLimt);
}
break;
}
}
}
}
}catch(Exception e){
throw new Exception("保存角色异常!");
}
return 1;
}
前台
http://10.0.1.222:8080/esteelds/account/tradPerm/edit?customerKey=399&_=1497234247857
//组织前台的权限是用树形实体结构(不依赖sql形成树)
@Override
public String getSimpleOfTree(String customerKey) {
// TODO Auto-generated method stub
//getCusPowerGroupList(customerKey);
Map<String,Object> param = new HashMap<String,Object>();
param.put("customerKey", customerKey);
List<TbCusFirmVo> permList= tbCusFirmMapper.findCustomerTradePermiList(param);
TbCusFirmVo perm = new TbCusFirmVo();
if(permList!=null&&permList.size()>0){
perm=permList.get(0);
}
String cusTradeKind= perm.getCusTradeKind();
String simpleOfTree = encapMenuTreeJs(createMenuTree(cusTradeKind,0));
return simpleOfTree;
}
private String encapMenuTreeJs(Tree tree)///遍历树形实体
{
StringBuffer scriptOfMenu = new StringBuffer();
if (null != tree) {
scriptOfMenu.append(initTreeJs(tree, 0));
}
return scriptOfMenu.toString();
}
private Tree createMenuTree(String cusTradeKind,int i)///生成树形实体
{
Example example = new Example(TbPowerGroup.class);
example.createCriteria().andLike("flag", "%"+cusTradeKind+"%");
example.setOrderByClause("levelCode asc");
List<TbPowerGroup> list= tbPowerGroupMapper.selectByExample(example);////这里不是树形结构,这里是按照级别归类排序
Map mr= new HashMap();
mr.put("NodeName", "会员中心");
Tree tree = new Tree("-1", 0, mr, 0);
createMenuTreeNow(tree,list);///生成树形实体,递归
// return this.permServ.findMenuTree(this.CusTradeKind, 0);
return tree;
}
private void createMenuTreeNow(Tree tree,List<TbPowerGroup> list ){///生成树形实体,用递归的方式
if (tree.getType() == 1) {
return;
}
List<TbPowerGroup> temp = new ArrayList<TbPowerGroup>();
temp.addAll(list);
for(TbPowerGroup l : list){
Map mr = new HashMap();
mr.put("NodeName", l.getGroupName());
Tree t = new Tree( l.getGroupKey().toString(), l.getGroupLevel().intValue() == 2 ? 1 : 0, mr, Integer.valueOf(l.getLevelCode()));
if ( l.getParentKey().toString().equals(tree.getId()))///通过遍历按级别分类的结果,按照pid遍历比较组织树,组织好一个移除一个
{
tree.getSonList().add(t);
temp.remove(l);
createMenuTreeNow(t, temp);
}
}
}
///将树形实体转化为字符串,递归,类似转化树形sql
private Object initTreeJs(Tree tree, int level)
{
if (null == tree) {
return "";
}
StringBuffer scriptOfMenu = new StringBuffer();
Map m = (Map)tree.getMyInfo();
StringBuffer strBuff = new StringBuffer("");
if (null != m)
{
Iterator<String> it = m.keySet().iterator();
int iMarketIdx = 0;
while (it.hasNext())
{
String key = (String)it.next();
strBuff.append(key + "=\"");
String value =getNull4Empty(m.get(key), false);
strBuff.append(value + "\" ");
}
}
else
{
return "";
}
if (tree.getType() == 1)
{//叶子
scriptOfMenu.append("<li><a tname='name1' tvalue='" + tree.getId() +"'>");
scriptOfMenu.append("<span>" + m.get("NodeName").toString() + "</span>");
scriptOfMenu.append("</a></li>");
}
else if (tree.getType() == 0)
{//文件夹
scriptOfMenu.append("<li><a tname='name1' tvalue='" + tree.getId() + "'");
scriptOfMenu.append("<span>" + m.get("NodeName").toString() + "</span></a>");
scriptOfMenu.append("<ul>");
List<Tree> sonList = tree.getSonList();
if ((null != sonList) && (!sonList.isEmpty()))
{
level++;
for (int j = 0; (null != sonList) && (j < sonList.size()); j++) {
scriptOfMenu.append(initTreeJs((Tree)sonList.get(j), level));
}
}
scriptOfMenu.append("</ul>");
scriptOfMenu.append("</li>");
}
return scriptOfMenu.toString();
}
前台的提交;
设计之初就把素有的checkbox name一样,之后用数组接收,接收到的就是选中的
@RequestMapping(value = "/account/tradPerm/tradPermModify")
public ModelAndView tradPermModify(@RequestParam(value="id") String id,@RequestParam(value="name1") String[] groupKey,Model model, HttpSession session, HttpServletRequest request) throws Exception {
System.out.println("==============id"+id+"===========name1"+groupKey);
if(id==null||"".equals(id)){
throw new Exception("会员主键没有带入!");
}
tbCusFirmService.updateCustomerPowerGroup(Long.valueOf(id), groupKey);
return ajaxDoneBasBed1(200,"SUCCESS","/account/tradPerm/list","closeCurrent");
}
菜单sql参考:
后台
http://localhost:8083/esteelds/system/opmRole/menuInfo
查出三级菜单(左侧) 跨表的树形,先用一个结果集承接
<select id="getfordMenuLimt" resultType="map" parameterType="map">
select * from (select * from
(
select t.name name,t.id id,t.parentid parentid ,0 leave1,'1' leave ,null uri from opm_menufolder t
union all select o.name name,o.id id,o.menufolderid,o.level1 leave1,'2' leave, o.uri uri from opm_menuitem o
union all select l.name name,l.id id,l.menuitemid ,l.level1 leave1,'3' leave , l.uri uri from opm_menuitemlimit l
)
start with parentid is null connect by prior id=parentid ORDER SIBLINGS BY parentid) where parentid=#{pId}
</select>
前台:
左侧
http://localhost:8080/web/tbPowerGroup/createMenuTree
cus_trade_kind = "HA"
顶端菜单:
http://localhost:8080/web/tbPowerGroup/createTopMenuTree
cus_trade_kind = "TA";
<select id="getBigPowerMenu" parameterType="map" resultType="map">
SELECT DISTINCT D.*, C.URL_ADDRESS
FROM TB_POWER_GROUP D LEFT JOIN (SELECT A.GROUP_KEY, B.URL_ADDRESS
FROM TB_POWER_GROUPRELURL A,
TB_POWER_URL B
WHERE A.URL_KEY = B.URL_KEY) C ON D.GROUP_KEY = C.GROUP_KEY
WHERE FLAG =#{current_trade_kind} START WITH D.GROUP_KEY IN
(SELECT GROUP_KEY FROM TB_CUS_FIRMRELGROUP WHERE CUSTOMER_KEY = #{CUSTOMER_KEY})
CONNECT BY PRIOR PARENT_KEY = D.GROUP_KEY ORDER BY D.SORT_NUM
</select>
<select id="getSmallPowerMenu" parameterType="map" resultType="map">
SELECT DISTINCT A.*, C.URL_ADDRESS
FROM TB_POWER_GROUP A LEFT JOIN (SELECT A.GROUP_KEY, B.URL_ADDRESS
FROM TB_POWER_GROUPRELURL A,
TB_POWER_URL B
WHERE A.URL_KEY = B.URL_KEY) C ON A.GROUP_KEY = C.GROUP_KEY
START WITH A.GROUP_KEY IN
(SELECT DISTINCT T2.GROUP_KEY
FROM TB_POWER_GROUP T2,
TB_POWER_ROLESRELGROUP T4,
TB_POWER_USERRELROLES T5
WHERE T4.ROLES_KEY = T5.ROLES_KEY AND
T5.CUS_USER_KEY =#{CUS_USER_KEY} AND
T2.GROUP_KEY = T4.GROUP_KEY AND
T2.FLAG = #{current_trade_kind})
CONNECT BY A.PARENT_KEY = PRIOR A.GROUP_KEY and
a.FLAG = #{current_trade_kind}
ORDER BY A.SORT_NUM
</select>
子账户
http://localhost:8080/web/myaccount/getAccountData
<select id="getOperateUserByCustomerKey" parameterType="map" resultMap="account1Map">
SELECT t.*,t1.ROLES_KEY from TB_CUS_USER t,TB_POWER_USERRELROLES t1 where t.CUS_USER_KEY=t1.CUS_USER_KEY
<if test="CUSTOMER_KEY!=null and CUSTOMER_KEY!=''">
and t.CUSTOMER_KEY=#{CUSTOMER_KEY}
</if>
<if test="CUS_USER_ID!=null and CUS_USER_ID!=''">
and t.CUS_USER_ID like '%${CUS_USER_ID}%'
</if>
<if test="CUS_USER_STATUS!=null and CUS_USER_STATUS!=''">
and t.CUS_USER_STATUS=#{CUS_USER_STATUS}
</if>
<if test="MAN!=null and MAN!=''">
and t.MAN like '%${MAN}%'
</if>
order by t.cus_user_id desc
</select>
会员中心小菜单:根据CUSTOMER_KEY查询
<select id="findMenuTree" parameterType="map" resultMap="tbPowerGroupBeanMap">
SELECT DISTINCT *
FROM TB_POWER_GROUP
WHERE GROUP_KEY NOT IN
(161, 162, 164, 152, 136, 153, 154, 155, 156, 157, 121, 122, 123, 124, 120, 137, 138, 139, 150, 151, 133, 141, 142, 143, 144, 145, 146, 158, 159, 165, 166, 167, 168, 169, 170, 171, 172, 173, 175, 176, 177, 178, 179, 180, 186, 185)
START WITH GROUP_KEY IN (SELECT GROUP_KEY
FROM TB_CUS_FIRMRELGROUP
WHERE CUSTOMER_KEY = #{CUSTOMER_KEY})
CONNECT BY PRIOR PARENT_KEY = GROUP_KEY
ORDER BY SORT_NUM
</select>
相关推荐
- **根节点(Root Node)**:树形结构的起始点,没有父节点。 - **父节点(Parent Node)**:拥有子节点的节点。 - **子节点(Child Node)**:属于某个父节点的节点,可以有多个。 - **叶子节点(Leaf Node)**...
在软件开发中,这种数据结构结合了树形结构的层次展示和复选框的功能,允许用户以视觉友好的方式对节点进行批量选择、筛选或操作。 一、带选择框树的基本结构 带选择框树由一系列节点组成,每个节点包含一个可勾选...
要创建一个动态的树形结构,可以通过绑定数据源(如数据库或XML文件)来实现。在Asp.net中,可以通过代码后台生成节点,或者在页面声明式地定义节点,通过JavaScript或jQuery来实现交互效果,例如展开、折叠节点,...
3. 数据结构:理解树形结构和层次码的概念,能根据层次码构建树。 4. 客户端-服务器通信:了解如何在JavaScript中发送HTTP请求,以及服务器如何接收和处理这些请求。 5. 后台处理:使用Java处理接收到的参数,更新...
在本例中,"jsp生成的树结构列表"指的是利用JSP来实现一种用户界面元素——树形结构,这种结构常用于展示层次化数据,如目录、组织架构或数据库中的分类信息。 树结构是一种常见的UI设计模式,由节点组成,每个节点...
- JSP页面上,我们可以使用HTML和CSS来构建树形结构的基本样式,然后利用JavaScript(例如jQuery)或者JSP的内置标签库(如JSTL)来动态渲染树形结构。 - 通常会使用迭代器遍历后台返回的分类数据,根据层级关系...
课程的考核方式分为形成性考核和终结性考试两部分,形成性考核占比30%,主要通过4次形考作业来评估,每次作业涵盖教材的不同章节,同时包含实验内容,学生需要完成并提交实验报告。终结性考试占比70%,为闭卷考试,...
二叉树是每个节点最多有两个子节点的树形结构,分为左子树和右子树。二叉树的常见类型有满二叉树、完全二叉树和平衡二叉树(如AVL树和红黑树),它们在搜索、排序等领域有着广泛的应用。 树是一般化的二叉树,每个...
2. 锦标赛问题:可能涉及树形结构的操作,如二分查找或者构建锦标赛树来高效地安排比赛。 3. Kruskal算法:是一种用于找到图中最小生成树的算法,涉及到图论和排序。 4. 哈夫曼编码:是数据压缩的一种方法,涉及到...
在“U201214852_何鲁丽”这个文件中,很可能是实验者何鲁丽提交的源代码和报告。这样的资料对于其他学习者来说是一份宝贵的资源,可以参考和学习其代码结构、优化技巧以及解决问题的方法。 总的来说,这个实验涵盖...
它包含一系列的`TreeNode`对象,每个`TreeNode`可以有子节点,形成一个可展开和折叠的树形结构。 2. **隐藏节点**: 在`TreeViewDemo`中,可能涉及到根据某些条件隐藏特定的`TreeNode`。这可以通过编程方式实现,...
- **B+tree格式介绍**:B+tree是一种特殊的树形数据结构,其中所有的键值都存储在叶子节点上,非叶子节点仅用于导航。这种结构使得每次查询操作都能在相同的层次完成,提高了查询效率。 - **B+tree内部页格式分析**...
TreeView控件允许用户以树形结构展示数据,这种结构通常包含节点(Nodes),节点可以有子节点,形成层次化的视图。在考试系统中,它可能用于表示各个科目、章节或者试题分类,用户可以通过点击节点来展开或收起相关...
最小生成树Kruskal算法是一种在加权无向图中寻找代价最小的树形子集的算法,这个子集包含了图中的所有顶点且没有形成环路。在本课程设计中,学生需要实现一个程序,该程序能创建带权重的图,并应用Kruskal算法找出该...
在ASP中,通过自调用的函数可以实现这种递归,遍历数据库中所有相关的菜单项,并根据它们的父子关系构建树形结构。 2. **数据存储**:通常,菜单项的数据存储在数据库中,每个菜单项包括ID、父ID、名称等属性。使用...
2. 线性结构中元素间关系是一对一,但在树形结构中,元素关系通常是一对多,根节点对应一个元素,而每个节点可以有零个或多个子节点。 3. 进程定义为一个具有独立运行功能的程序在某个数据集合上的动态执行过程,是...
树形结构是一种层次化的数据表示方式,适用于组织和导航复杂的数据。在员工信息系统中,树形导航通常体现在以下几个方面: 1. 部门结构:部门按照层级关系展示,如公司-部门-小组,便于用户理解组织架构并快速定位...
最小生成树是由原图的所有顶点组成的树形子图,且包含的边的权重之和最小。Kruskal算法是解决这个问题的一种有效方法。 1. **课程设计内容** 课程设计的目标是实现一个程序,该程序能处理带权图,并通过Kruskal...
这些事件按照因果关系组织,形成一个逻辑结构的树状图。中间事件是直接导致顶上事件的事件,而基本事件是构成中间事件的最底层、不可分割的原因。表中列出了多个这样的事件,如“缺水警报器失灵”、“给水故障”等。...
系统需要能够随机生成或根据预设规则组合试题,这可能需要运用到如随机数生成、字符串操作、树形结构(如题目模板)等编程技术。同时,系统还需要支持多种题型,如选择题、填空题、问答题等,这需要设计灵活的数据...