用户角色权限系统

一:角色权限

1.一个标准的权限系统需要五张表:用户、角色、权限,用户与角色的关系是多对多的中间表,角色与权限的中间表;

2.tree控件

$(function(){

  $('#tree').treee({

url:'tree.json',//数据来源

animate:true,//是否为动画效果

checkbox:true//是否显示复选框

})   }

3.构建实体tree

        private String id;//菜单编号
private String text;//菜单名称
private boolean checked;//是否被选中
private List children;   //子菜单

4.读取菜单业务逻辑

public List readRoleMenus(Long uuid) {
//获取角色信息
Role role = roleDao.get(uuid);
// 角色所拥有的权限, 此时,角色下所有的menu都进入持久化状态
List

roleMenus = role.getMenus();

// 获取所有的菜单
Menu root = menuDao.get("0");
//返回的结果集
List result = new ArrayList();
// 循环一级菜单, 此时也进入持久化状态
for(Menu lv1 : root.getMenus()){
Tree t1 = createTree(lv1);
//循环二级菜单, 此时也进入持久化状态
for(Menu lv2 : lv1.getMenus()){
Tree t2 = createTree(lv2);
//hibernate中,进入持久化状态的对象,同一类型同一ID,只有一个对象
if(roleMenus.contains(lv2)){
//角色的权限集合中,包含有这个菜单,让它选中
t2.setChecked(true);
}
t1.getChildren().add(t2);
}
result.add(t1);
}
return result;
}

--------------------------------------------------------------------------------------
把菜单转成树的结构
 private Tree createTree(Menu menu){
Tree t1 = new Tree();
t1.setText(menu.getMenuname());
t1.setId(menu.getMenuid());
t1.setChildren(new ArrayList());
return t1;
}

5.根据前端传过来的权限更新角色权限

public void updateRoleMenus(Long uuid, String ids) {
//获取角色,进入持久化状态
Role role = roleDao.get(uuid);
//删除角色下的所有菜单权限 delete from role_menu where roleuuid=uuid
// 删除旧的关系 
role.setMenus(new ArrayList

());
//加上新的关系
String[] idArr = ids.split(",");
for(String id : idArr){
//先取出菜单,再设置
role.getMenus().add(menuDao.get(id));
}
     }

二:用户角色

一个用户可以指定多个角色,实现思路与角色权限设置相同

1.业务层

@Override
public List readEmpRoles(Long uuid) {
Emp emp = empDao.get(uuid);//获取员工信息
// 获取用户下的角色列表
List empRoles = emp.getRoles();
//所有的角色信息
List roles = roleDao.getList(null, null, null);
List result = new ArrayList();
//把角色信息转树的结构
for(Role role : roles){
Tree t1 = createTree(role);
//判断用户的拥有的角色中,是否包含这个角色
if(empRoles.contains(role)){
//有这个角色时,让它选中
t1.setChecked(true);
}
result.add(t1);
}
return result;
}

      //更新用户角色
        public void updateEmpRoles(Long uuid, String ids) {
// 获取员工信息,进行入持久化
Emp emp = empDao.get(uuid);
// 删除旧关系
emp.setRoles(new ArrayList());
String[] roleUuids = ids.split(",");
for(String roleUuid : roleUuids){
//添加新的关系
emp.getRoles().add(roleDao.get(Long.valueOf(roleUuid)));
}
}

三:显示用户菜单

根据用户ID查询该用户所拥有的菜单,

菜单clone,只复制该用户下所拥有的菜单,如果有二级菜单的话必须复制其上一级菜单

public Menu readMenusByEmpuuid(Long empuuid) {
// 模板 所有的菜单
Menu root = menuDao.get("0");
// 用户所拥有的菜单
List

empMenus = menuDao.getMenusByEmpuuid(empuuid);
Menu result = cloneMenu(root); //返回的菜单
//循环复制
List l1_menus = root.getMenus();//取出所有的一级菜单
//循环一级菜单
for(Menu l1 : l1_menus){
//复制中
Menu _m1 = cloneMenu(l1);
//取出一级菜单下的二级菜单
List l2_menus = l1.getMenus();
//循环二级菜单
for(Menu l2 : l2_menus){
//如果用户的菜单中,包含这个菜单,就应该复制过来
if(empMenus.contains(l2)){
Menu _m2 = cloneMenu(l2);
//加到复制的一级菜单中
_m1.getMenus().add(_m2);
}}
if(_m1.getMenus().size() > 0){
//一级菜单下有二级菜单,才要放进来
result.getMenus().add(_m1);
}}
return result;}

// 复制菜单
 private Menu cloneMenu(Menu src){
Menu _m1 = new Menu();
_m1.setIcon(src.getIcon());
_m1.setMenuid(src.getMenuid());
_m1.setMenuname(src.getMenuname());
_m1.setUrl(src.getUrl());
_m1.setMenus(new ArrayList());
return _m1;
}


































你可能感兴趣的:(权限系统)