欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Layout之权限分配可见】

程序员文章站 2022-05-17 08:55:44
...

前言

在昨天我们做了一个简单的布局。
【Layout之权限分配可见】
可以知道,我们在遍历一个树形目录的时候是非常困难的。即使是这样,这种效果还远远不能达到我们的要求:

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

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

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


权限思路

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

【Layout之权限分配可见】
第二种:
当然,还有难一点的:给每个人分配一个角色,也就是多一个角色表

【Layout之权限分配可见】
第三种
如果想搞得好一点,再细一点的话,还可以往下深究,比如一个人可以有多个角色;
那不就又有一个表:用户角色表
【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;
	}
	
}

这样就大功告成了
效果图:
【Layout之权限分配可见】
【Layout之权限分配可见】

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


总结

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

♧希望对大家有所帮助

相关标签: Layout