【Layout之权限分配可见】

前言

在昨天我们做了一个简单的布局。
在这里插入图片描述
可以知道,我们在遍历一个树形目录的时候是非常困难的。即使是这样,这种效果还远远不能达到我们的要求:

因为这只是对一个表进行一个无条件的查询而已,

那么问题来了:
我们如何才能根据自己的权限来查相应的数据???

欧克,所以今天是对权限的划分给一个清楚的界限。


权限思路

第一种:
其实目前最简单的思路就是在用户菜单的中间加一个中间表

在这里插入图片描述
第二种:
当然,还有难一点的:给每个人分配一个角色,也就是多一个角色表

在这里插入图片描述
第三种
如果想搞得好一点,再细一点的话,还可以往下深究,比如一个人可以有多个角色;
那不就又有一个表:用户角色表
在这里插入图片描述

反正只要你想的细,多大的权限你也可以有。

但是今天只用简单的第一种给大家观看。
方便理解。


登陆状态的获取

登陆状态的获取,前端

要用到权限的地方无非也就是登陆。
所以一个简单的jsp :

<body>
<form action="userAction.action?methodName=login" method="post">
	uid:<input type="text" name="uid"  ><br>
	upwd:<input type="text" name="upwd" ><br>
	<input type="submit"  >
</form>
</body>

配置mvc.xml:

<config>
	<action path="/menuAction" type="com.liwangwang.web.MenuAction">
		<forward name="index" path="/index.jsp" redirect="false" />
	</action>
	<action path="/userAction" type="com.liwangwang.web.UserAction">
		<forward name="login" path="/login.jsp" redirect="true" />
		<forward name="index" path="/index.jsp" redirect="false" />
	</action>
</config>

简单前端搞好


登陆状态的获取,后端

写好登陆的两个方法,
一个登陆是否有这个人,
一个返回这个人的权限

public class UserDao extends JsonBaseDao{
	
	public List<Map<String,Object>> list(Map<String, String[]> pamap ,PageBean pageBean) throws InstantiationException, IllegalAccessException, SQLException{
		String sql = "select * from t_easyui_user_version2 where true ";
		String uid = JsonUtils.getParamVal(pamap, "uid");//获取参数值uid
		String upwd = JsonUtils.getParamVal(pamap, "upwd");//获取参数值upwd
		if(StringUtils.isNotBlank(uid)) {
			sql += " and uid = "+uid;
		}
		if(StringUtils.isNotBlank(upwd)) {
			sql +=" and upwd = "+upwd;
		}
		
		return super.executeQuery(sql, pageBean);
	}
	
	public List<Map<String,Object>> listmenu(Map<String, String[]> pamap ,PageBean pageBean) throws InstantiationException, IllegalAccessException, SQLException{
		String sql = "select * from t_easyui_usermenu where true ";
		String uid = JsonUtils.getParamVal(pamap, "uid");
		if(StringUtils.isNotBlank(uid)) {
			sql += " and uid = "+uid;
		}
		return super.executeQuery(sql, pageBean);
	}
	
	
}

如果方法写好了,就可以开始执行了

public class UserAction extends ActionSupport{
	
	private UserDao ud = new UserDao();
	
	public String login(HttpServletRequest req,HttpServletResponse resp) {
			try {
				List<Map<String, Object>> list = ud.list(req.getParameterMap(), null);//获取数据库中有无这个人
				
				if(list!=null&&list.size()>0) {//如果有,则进入下一步
					List<Map<String, Object>> listmenu = ud.listmenu(req.getParameterMap(), null);//获取这个人的权限
					StringBuilder sb = new StringBuilder();
					for (Map<String, Object> map : listmenu) {//将权限已字符串的形式打包
						sb.append(","+map.get("menuId"));
					}
					req.setAttribute("menuHid", sb.substring(1));//设置到request中
					
				}else {
					return "login";//如果没有就到login.jsp中
				}
				
			} catch (Exception e) {
				e.printStackTrace();
			}
		return "index";//如果有这个人就到index.jsp中
	}
	
}

获取权限信息后的菜单查询

菜单查询,前端

在获取到登陆后的权限信息后就可以传到Index.jsp了

<body class="easyui-layout">
<input type="hidden" id="menuHid" value="${menuHid }" >
	<div data-options="region:'north',border:false" style="height:60px;background:#B3DFDA;padding:10px">north region</div>
	<div data-options="region:'west',split:true,title:'West'" style="width:150px;padding:10px;">
		欢迎使用本系统
		<ul id="tt"></ul>
	</div>
	<div data-options="region:'east',split:true,collapsed:true,title:'East'" style="width:100px;padding:10px;">east region</div>
	<div data-options="region:'south',border:false" style="height:50px;background:#A9FACD;padding:10px;">south region</div>
	<div data-options="region:'center',title:'Center'">
	<div id="menuTabs" class="easyui-tabs" style="width:500px;height:250px;">   
    <div title="Tab1" style="padding:20px;display:none;">   
        欢迎使用    
    </div>   
</div>  
	</div>
</body>

重点在于:
<input type="hidden" id="menuHid" value="${menuHid }" >这个就是获取信息

然后在咱们之前的菜单查询的基础上加:

$(function(){
	$('#tt').tree({    
	    url:'menuAction.action?methodName=treeMenu&menuHid='+$("#menuHid").val(), 
	    onClick :function(node){
	    	var content = '<iframe scrolling="no" frameborder="0" src="'+node.attributes.menuURL+'" width="99%" height="99%"></iframe>';
	    	if($('#menuTabs').tabs('exists',node.text)){
	    		$('#menuTabs').tabs('select',node.text)
	    	}else{
	    		$('#menuTabs').tabs('add',{    
		    	    title:node.text,    
		    	    content:content,    
		    	    closable:true,    
		    	    tools:[{    
		    	        iconCls:'icon-mini-refresh',    
		    	        handler:function(){    
		    	            alert('refresh');    
		    	        }    
		    	    }]    
		    	}); 
	    	}
	    	
	    }	
	   
	}); 

})

大家可以看到这个:
url:'menuAction.action?methodName=treeMenu&menuHid='+$("#menuHid").val(),

就是获取到信息,然后进行路径的跳转。

$("#menuHid").val()

菜单查询,后端

后端处理,跟之前差不多但是多加了一个方法

public class MenuDao extends JsonBaseDao{
	
	/*格式:menu:			类型				意思			
	 * 			menuid     String			表id
	 * 			menuname   String			名字
	 * 			menuURL    String			路径
	 * 			parentid   String			上一级的id
	 * 		treeNode:
	 * 			id         String			节点的id
	 * 			text	   String			节点的名字
	 * 			children   List<treeNode>	该节点下的子节点
	 * 			attributes map<String,Object>节点的对应路径
	 * 
	 	*/	
	
	//流程:第一步
	public List<TreeNode> list(Map<String, String[]> map,PageBean pageBean) throws InstantiationException, IllegalAccessException, SQLException{
		List<Map<String, Object>> listMenu = this.listMenuSef(map, pageBean);//调用查询数据库的方法来获取数据
		List<TreeNode> treeNodesList = new ArrayList<>();//先搞一个容器准备装着
		menuList2TreeNodeList(listMenu, treeNodesList);//调用来将查询过来的menu数据转换为treeNode数据
		
		return treeNodesList;
	}
	
	//流程之外
		public List<Map<String, Object>> listMenuSef(Map<String, String[]> map,PageBean pageBean) throws InstantiationException, IllegalAccessException, SQLException{
			String sql = "select * from t_easyui_menu where true ";
			String id = JsonUtils.getParamVal(map, "menuHid");//这个是从jsp界面传过来的
			if(StringUtils.isNotBlank(id)) {
				sql = sql + " and menuid in ("+id+") ";
			}else {
				sql = sql + " and menuid = -1";
			}
			
			return super.executeQuery(sql, pageBean);
		}
	
	
	/**
	 * 查询menu表的数据
	 * @param map
	 * @param pageBean
	 * @return
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @throws SQLException
	 */
	//流程:第二步
	public List<Map<String, Object>> listMenu(Map<String, String[]> map,PageBean pageBean) throws InstantiationException, IllegalAccessException, SQLException{
		String sql = "select * from t_easyui_menu where true ";
		String id = JsonUtils.getParamVal(map, "id");//第一次为空
		if(StringUtils.isNotBlank(id)) {
			sql = sql + " and parentid = "+id;
		}else {
			sql = sql + " and parentid = -1";//在第一次的时候执行
		}
		
		return super.executeQuery(sql, pageBean);
	}

	/**转换的单个转换
	 * 
	 * menu表的数据不符合easyui树形展示的数据格式
	 * 需要转化成easyui所能识别的数据格式
	 * 
	 * @param map
	 * @param treeNode
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @throws SQLException
	 */
	//流程:第四步
	private void menu2TreeNode(Map<String, Object> map,TreeNode treeNode) throws InstantiationException, IllegalAccessException, SQLException{
			treeNode.setId(map.get("Menuid").toString() ); //单个的赋值
			treeNode.setText(map.get("Menuname").toString());
			treeNode.setAttributes(map);
			
			//treeNode.setChildren(children);
			Map<String, String[]> jspMap = new HashMap<>();//给参数集合实例化
			jspMap.put("id", new String[] {treeNode.getId()});//给参数中加入一个id的参数
			List<Map<String, Object>> listMenu = this.listMenu(jspMap, null); // 重点!!! 如果第二次查询没有这个id的话就结束,否则 二,三,四流程继续
			List<TreeNode> treeNodeList = new ArrayList<>();  //用一个List<TreeNode>集合准备装着子节点的所有东西
			menuList2TreeNodeList(listMenu, treeNodeList); //如果有的话就继续运行,否则不运行
			treeNode.setChildren(treeNodeList); //将treeNode的children属性赋值
	}
	
	//流程:第三步
	private void menuList2TreeNodeList(List<Map<String, Object>> mapList,List<TreeNode> treeNodeList) throws InstantiationException, IllegalAccessException, SQLException{
			TreeNode treeNode = null;		//准备最后放入集合内部TreeNode
			for (Map<String, Object> map : mapList) {//遍历List<Menu>中然后两者相互转换。因为最后的结果就是List<TreeNode>
				treeNode = new TreeNode();
				menu2TreeNode(map, treeNode);//调用到第一流程中的最后一步:为TreeNode设值
				treeNodeList.add(treeNode);//将转换完成的加入到treeNode
			}
	}
	
	
	
	
}

其实就多加了这个

//流程之外
		public List<Map<String, Object>> listMenuSef(Map<String, String[]> map,PageBean pageBean) throws InstantiationException, IllegalAccessException, SQLException{
			String sql = "select * from t_easyui_menu where true ";
			String id = JsonUtils.getParamVal(map, "menuHid");//这个是从jsp界面传过来的
			if(StringUtils.isNotBlank(id)) {
				sql = sql + " and menuid in ("+id+") ";
			}else {
				sql = sql + " and menuid = -1";
			}
			
			return super.executeQuery(sql, pageBean);
		}

然后也是一样的web文件

public class MenuAction extends ActionSupport {
	private MenuDao  menuDao = new MenuDao();
	
	
	public String treeMenu(HttpServletRequest req, HttpServletResponse resp) {
		
		try {
			List<TreeNode> list = this.menuDao.list(req.getParameterMap(), null);
			ObjectMapper om = new ObjectMapper();
			//将list集合转换成json串
			String jsonStr = om.writeValueAsString(list);
			
			ResponseUtil.write(resp, jsonStr);
		} catch (InstantiationException | IllegalAccessException | SQLException e) {
			e.printStackTrace();
		} catch (JsonProcessingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
		return null;
	}
	
}

这样就大功告成了
效果图:
在这里插入图片描述
在这里插入图片描述

这个学生也就一个学生管理的权限。


总结

这次感觉没什么很大的问题了。

♧希望对大家有所帮助

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值