zoukankan      html  css  js  c++  java
  • 权限系统设计-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对象
    }
  • 相关阅读:
    党务
    平台 大赛 公司
    音乐
    有趣的博主
    C++获取命令行参数命令
    360读全景
    3 海康网络相机官方例程(3)OpenCv + ffmpeg + rtmp 实现摄像头采集数据直播功能(不带cuda加速)
    使用opencv4进行分类器训练
    经典环境(2)OpenCV412+OpenCV-Contrib +vs2015+cuda10.1编译
    经典环境(1)OpenCV3.4.9+OpenCV-Contrib +vs2015+cuda10.1编译
  • 原文地址:https://www.cnblogs.com/Java0120/p/10013666.html
Copyright © 2011-2022 走看看