权限系统设计-day01

数据库表的设计:

 

关键流程思考:

权限在SSH系统中应该表现为什么东西?

小胖这个用户登陆:
1,检查用户名和密码;
2,检查通过;
  1),得到小胖这个用户的对应的所有的角色:R1
  2),根据所有的角色,得到小胖所有的权限信息:P5,P6,P7,P8
  3),把小胖所有的权限的expression放到一个set中;
  [com.ssh.mvc.RoleAction:execute,com.ssh.mvc.RoleAction:edit,com.ssh.mvc.RoleAction:delete,com.ssh.mvc.RoleAction:save]
3,把小胖这个对象和他的权限列表放到session中;

小胖操作系统:
1,点角色管理;
2,请求被权限检查拦截器拦截到了(PermissionCheckInterceptor.intercepte);
  1),得到当次请求的action和方法;
  2),判断,当前的这个方法是否是需要一个权限的;
  3),如果当前方法不需要权限,直接放行;
  4),如果当前方法需要权限,
    1),把当前请求的method变成com.ssh.mvc.RoleAction:execute一个表达式;
    2),在当前用户的permissionset中去看是否有这个表达式;
    3),如果有,放行;
    4),如果没有,直接导向到没有权限那个页面;

怎么标记一个权限?
1,我们创建一个annotation
@RequiredPermission{
String value();//这个权限的名称;
}
2,自动加载系统权限(PermissionServiceImpl);
  1),让PermissionServiceImpl注入ApplicationContext;
  2),调用ApplicationContext.getBeansOfType(BaseAction.class) 得到所有的Action实例;
  3),遍历这些Action实例,得到类型和所有的方法;
    1),判断如果方法上有@RequiredPermission标签;
    2),得到标签,Permission p=new Permission();
    3),permission.setName(RequiredPermission.value());
    4),permission.setExpresssion(通过方法拼出来);
    5),保存这个permission;

RoleAction{
    @RequiredPermission("角色列表")
    String execute(){
    //com.ssh.mvc.RoleAction:execute
    }
    @RequiredPermission("编辑角色")
    String edit(){
    //com.ssh.mvc.RoleAction:edit
    }
    @RequiredPermission("删除角色")
    String delete(){
    //com.ssh.mvc.RoleAction:delete
    }
    @RequiredPermission("添加角色")
    String save(){
    //com.ssh.mvc.RoleAction:save
    }
}

高级查询+分页:

PageResult:给前台显示的;

1,总的条数;
2,当前页的数据;
3,当前是第几页;
4,每页多少条;

效果:共有 X条记录 当前第X/X页 首页 上一页 下一页 尾页

共有多少页?
Math.max((totalCount+pageSize-1)/pageSize,1);

首页?
1
上一页?
Math.max(currentPage-1,1);
下一页?
Math.min(currentPage+1,totalPage());
尾页?
totalPage();

 QueryObject:用来包装查询和分页信息;

pageSize
currentPage
List<String> conditions;
List<Object> parmas;
private boolean isInit;

abstract void customerQuery();
void addCondition(String condition,Object..params){
     this.conditions.add(condition);
     this.parmas.addAll(Arrays.asList(parmas));
}

private void init(){
    if(!isInit){
       customerQuery();
       isInit=true;
    }
}

String getQuery(){
    init();
    //把所有的condition拼成WHERE语句;
}

List<Object> getParams(){
    init();
    //返回所有的参数值;
}

分页查询:
在我们的dao里面;

PageResult query(QueryObject qo){
     //首先查询总共的条数;
      String totalCountHQL="SELECT e FROM Employee e"+qo.getQuery();
      Query query=session.createQuery(totalCountHQL);
      //设置查询查询
      qo.getParams();//遍历参数,设置值;
     //如果条数>0
     //查询当前页的数据;
        qo.getParams();//遍历参数,设置值;
        qo.setFirstResult();
        qo.setMaxResult();
       //用当前页的数据和QO中相关信息包装成一个PageResult对象;
     //如果条数==0,返回一个空的PageResult对象
}
原文地址:https://www.cnblogs.com/Java0120/p/10013666.html