权限管理
分析表设计
树形结构的权限设计。
关于编号,除了根节点,其他的节点编号都是三位数
根
Id:0 根节点 pId:null –根节点
Id:101 基础数据 pId:0 –一级节点,三位数,但要求是101开始
Id:101001 -从二级节点开始,三位数,从001开始
Id:101001001
三位数,可以容纳很多节点菜单
父点是0,一定是一个根
1开头的id或者0的pid,认为一定是一级菜单节点
001的规则,可以自动推算出下一个节点的编号101001+1=101002>tostring
列表查询
略
添加保存
FunctionAction:
//保存功能权限
@Action(value="function_save",results={@Result(name=SUCCESS,location="/WEB-INF/pages/admin/function.jsp")})
public String save(){
//调用业务层
functionService.saveFunction(model);
return SUCCESS;
}
FunctionService:
/**
* 保存功能权限
* @param function
*/
public void saveFunction(Function function);
FunctionServiceImpl
@Override
public void saveFunction(Function function) {
//-----页面的下拉的值需要处理easyui-combobox,不选,会返回"";
//不选意味着是一级菜单,根节点是0
if(function.getFunction()!=null && StringUtils.isBlank(function.getFunction().getId()) ){
function.getFunction().setId("0");
}
//----编号主键:手动生成
//父id
Function parentFunction = function.getFunction();
String pId =parentFunction.getId();
//不管父id是多少,查询出父id下面的所有的子项,取所有子项id的最大值+1
//调用dao,查询父节点的所有子节点的最大id值
String maxId=functionDAO.findMaxIdByPId (parentFunction);
//当前id
String id=null;
if(StringUtils.isBlank(maxId)){
//处理一级节点
if(pId.equals("0")){
id="101";
}else{
//还没有子节点
id=pId+"001";
}
//一般的系统,对于一些基础数据,一般是要求有的,初始化数据。
//所以根一般是有的
}else{
//返回值:一级节点104,二级101004
//计算id
//只需要加1
//当前id
id=String.valueOf(Integer.valueOf(maxId)+1);
}
//设置id
function.setId(id);
functionDAO.save(function);
}
FunctionDAO:
/**
* 根据父编号,获取最大id编号
* @param pId
* @return
*/
@Query(value="select max(id) from t_auth_function where pid = ? ",nativeQuery=true)
public String findMaxIdByPId(String pId);
角色管理
列表查询
略
添加角色并关联权限
查zTree的API
//加载权限树形列表
$.post("${pageContext.request.contextPath}/function_list.action",function(data){
$.fn.zTree.init($("#functionTree"), setting, data);
},"json");
通过js获取选中的节点,手动拼接为id字符串(逗号分割),并将其放入form表单的隐藏域中。
// 点击保存
$('#save').click(function(){
//表单校验
if($("#roleForm").form("validate")){
//处理获取所有选中节点,将其拼接为逗号分割字符串,放入隐藏域
var treeObj = $.fn.zTree.getZTreeObj("functionTree");
var nodes = treeObj.getCheckedNodes(true);
var array = new Array();
$(nodes).each(function(){
array.push(this.id);
});
var functionIds = array.join(",");
$("#functionIds").val(functionIds);
//提交表单
$("#roleForm").submit();
}
});
RoleAction
//保存角色(关联权限)
@Action(value="role_save" ,results={@Result(name=SUCCESS,location="/WEB-INF/pages/admin/role.jsp")})
public String save(){
//调用业务层
roleService.saveRole(model,functionIds);
return SUCCESS;
}
//属性驱动
private String functionIds;
public void setFunctionIds(String functionIds) {
this.functionIds = functionIds;
}
RoleServiceImpl
@Override
public void saveRole(Role role, String functionIds) {
//---保存角色
roleDAO.save(role);
//---授权
//权限不为空
if(StringUtils.isNotBlank(functionIds)){
String[] functionIdArray = functionIds.split(",");
for (String functionId : functionIdArray) {
//快照更新:建立多表关系-自动向中间表插入数据(必须持久态关联持久态)
Function function = functionDAO.findOne(functionId);
//角色关联权限
role.getFunctions().add(function);
}
}
}
用户管理
UserAction
//保存用户,同时关联角色
@Action(value="user_save",results={@Result(name=SUCCESS,location="/WEB-INF/pages/admin/userlist.jsp")})
public String save(){
//调用业务层保存
userService.saveUser(model,roleIds);
return SUCCESS;
}
//属性驱动获取角色列表
private String roleIds;
public void setRoleIds(String roleIds) {
this.roleIds = roleIds;
}
UserServiceImpl
@Autowired
private RoleDAO roleDAO;
@Override
public void saveUser(User user, String roleIds) {
//----保存用户
//加密密码
user.setPassword(MD5Utils.md5(user.getPassword()));
userDAO.save(user);
//----关联角色
if(StringUtils.isNotBlank(roleIds)){
String[] roleIdArray = roleIds.split(",");
for (String roleId : roleIdArray) {
//持久态
Role role = roleDAO.findOne(roleId);
//快照:用户关联角色
user.getRoles().add(role);
}
}
}
列表查询
略
根据用户权限动态生成系统菜单 ##
FunctionAction
/**
* 菜单显示
* @return
*/
@Action("function_showmenu")
public String showmenu(){
//从shiro中获取当前登录用户
Subject subject = SecurityUtils.getSubject();
User loginUser = (User) subject.getPrincipal();
//根据用户获取权限
List<Function> functionList = functionService.findFunctionByUser(loginUser);
//将结果压入栈顶
pushToValueStack(functionList);
return JSON;
}
FunctionServiceImpl
/**
* 获取用户权限
*/
@Override
public List<Function> findFunctionByUser(User user) {
//判断用户性质
if (user.getUsername().equals("admin")) {
//超级管理员,获取所有权限
return functionDao.findMenuForAdmin();
} else {
//普通用户
List<Function> functionList = functionDao.findMenuForUser(user);
return functionList;
}
}
FunctionDAO
/**
* 查询普通用户的菜单
* @param user
* @return
*/
@Query("from Function f inner join fetch f.roles r inner join fetch r.users u where u= ? and f.generatemenu ='1' order by f.zindex")
public List<Function> findMenuForUser(User user);
/**
* 查询超级管理员的菜单
* @return
*/
@Query("from Function f where f.generatemenu = '1' order by f.zindex asc")
public List<Function> findMenuForAdmin();
查询菜单时,有个隐藏条件就是generatemenu =’1’,而且还要排序。