【Layout之权限分配可见】
程序员文章站
2022-05-17 08:55:44
...
前言
在昨天我们做了一个简单的布局。
可以知道,我们在遍历一个树形目录的时候是非常困难的。即使是这样,这种效果还远远不能达到我们的要求:
因为这只是对一个表进行一个无条件的查询而已,
那么问题来了:
我们如何才能根据自己的权限来查相应的数据???
欧克,所以今天是对权限的划分给一个清楚的界限。
权限思路
第一种:
其实目前最简单的思路就是在用户和菜单的中间加一个中间表:
第二种:
当然,还有难一点的:给每个人分配一个角色,也就是多一个角色表
第三种
如果想搞得好一点,再细一点的话,还可以往下深究,比如一个人可以有多个角色;
那不就又有一个表:用户角色表
反正只要你想的细,多大的权限你也可以有。
但是今天只用简单的第一种给大家观看。
方便理解。
登陆状态的获取
登陆状态的获取,前端
要用到权限的地方无非也就是登陆。
所以一个简单的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;
}
}
这样就大功告成了
效果图:
这个学生也就一个学生管理的权限。
总结
这次感觉没什么很大的问题了。
♧希望对大家有所帮助
推荐阅读