美文网首页Java育儿园约架专栏
智能销售系统(七)小问题填坑/权限判断

智能销售系统(七)小问题填坑/权限判断

作者: 磨陀货_ | 来源:发表于2019-09-30 09:06 被阅读0次

    一、功能填坑(一)

     1.1 开发的时候小便利

    在login.jsp中填上,这样我们再次测试时,到登陆页面时账号和密码就是在上面的直接登录就可以,会节约很多时间。记得上线前删掉

     1.2 【角色添加】----在(六)中我们做到了权限添加from表单做出来了,现在我们来完成这个半成品,做到保存

    • 在jQueryEasyUI文档中有传递额外参数的 代码 搞过来先参考一下
    SpringMVC会自动帮我们解析。以后只要是传List数据,都按这种写法
        1.2.1 拿到选中的所有权限
        1.2.2 遍历成咋门想要的格式(上面图片)
        1.2.3 整体和在一起就是这样,几句而已
                    //提交表单前的方法
                    onSubmit: function (param) {
                        //1.拿到选中的所有权限
                        var rows = myPermissionDatagrid.datagrid("getRows");
                        //2.遍历这些权限,拼接成想要格式
                        for (var i = 0; i < rows.length; i++){
                            //3。拿到每一个数据的值
                            var row = rows[i];
                            //4,拼接相应的结构
                            param[`permissions[${i}].id`] = row.id;
                        }
                        return $(this).form('validate');
                    },
    

     1.3 我们role权限添加完之后再点添加 ,from并未清空

    • easyuiAPI中有 在js-add中填上这一句就是清空
      myPermissionDatagrid.datagrid("loadData",[]);

     1.4 权限修改回显

    • js-edit中添上一句 【位置要放到最下面 好一些--有时候渲染会没跟上】
      回显grid中响应的数据 myPermissionDatagrid.datagrid("loadData",row.permissions);

     1.5 BUG现在我们权限修改回显的问题

    当你从左边添加到右边时,并不保存,直接关掉,再点开的时候却一起回显了
    • 出现原因
      复制一个permission(解决修改是原来哪一个行数据的问题
      复制一个permission:var parms = [...row.permissions];添加到js修改里

     1.6 BUG权限修改解决

    • 错误问题:
         当我们在权限页面,点击修的时候,这个时候回显已经搞定了,当我们添加两个权限并保存之后,关闭,再次打开时,我们删除掉刚刚加的权限保存后,并未删除点,我们删除原始的两个权限。直接报错n-to-n

    • 原因:
         现在只会出现覆盖,并不是删除。所以删除新加的,因为是覆盖 ,所以并未删除。我们删除原始权限时,也是覆盖,修改持久化id等 就会出n-to-n

    在Controller中有一个永远执行在前面的代码,填上这一句就解决
        //在任何方法前执行
        @ModelAttribute("editRole")
        public Role beforeEdit(Long id,String cmd){
            //cmd就是让他可以准确的找到update  不要所有都找影响性能
            if (id != null && "update".equals(cmd)){
                Role editRole = roleService.getOne(id);
                editRole.getPermissions().clear();
                return editRole;
            }
            return null;
        }
    

    二、主页面

     2.1 main.jsp

    
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
        <%@include file="head.jsp"%>
    </head>
    
        <body class="easyui-layout" >
            <%--表头。名称。尾部注销功能--%>
            <div data-options="region:'north'" style="height:100px;">
                <%--split:true --- 是否可拖动--%>
                <h1>浪里个张的智能销售系统</h1>
                <div style="text-align: right; margin-right: 20px">
                    欢迎${employee.username}您老大驾光临!!
                    <img src="${employee.headImage}" height="4px" width="4px"/>
                    <a href="/logout">滚吧</a>
                    <a href="center">修改密码</a>
                </div>
            </div>
    
            <div data-options="region:'west',title:'菜单'" style="width:135px;">
                <ul id = "menuTree"></ul>
            </div>
    
            <%--title:'center title'  加名字--%>
            <div id="mainTab" class="easyui-tabs"  data-options="region:'center'" style="background:#eee;">
                <div title="首页" style="padding: 20px;display:none;">
                    <%--<h1>来啦老弟</h1>--%>
                    <div><img src="images/head/7.jpg" width="100%" height="100%"></div>
                </div>
            </div>
    
            <%--菜单栏--%>
            <script>
                $(function () {
                    $('#menuTree').tree({
                        url:'/json/menu.json',
    
                        //node:点击的那个节点所有信息
                        onClick:function (node) {
                            var titleName = node.text;//定义标题名称
                            var url = node.url;//跳转路径
    
                            //父菜单没有地址url。有地址就是子菜单,才需要进行面板的打开  判断一下
                            //有路径才可以打开选项卡
                            if(url){
                                //根据名称判断这个页面是否存在,已经打开的选项卡不可再打开。
                                if($('#mainTab').tabs("getTab",titleName)){
                                    //如果存在就选中相应面板--- 选中已出现的
                                    $("#mainTab").tabs("select",titleName)
                                }else{
                                    //如果没有直接打卡一个选项卡
                                    $('#mainTab').tabs('add',{
                                        title:titleName,    //标题名称
                                        //iframe --- 可以嵌入任何页面
                                        content: '<iframe scrolling="auto" frameborder="0" width="100%" height="100%" src="'+url+'"></iframe>',
                                        closable: true//是否可以关闭
                                    });
                                }
                            }
                        }
                    })
                })
            </script>
        </body>
    </html>
    
    

     2.2 MainController

    package cn.zx.aisell.web.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class MainController {
    
        @RequestMapping("/main")
        public String index(){
            return "/main";
        }
    }
    
    • 注:记住登录之后调到新建的main主页面。修改路径

    三、菜单栏

    • 这里先不搞了 ,在(八)里面在搞,现在先写死

    四、主页面当前用户显示、注销功能

     4.1 显示用户

        1.2.1 在LoginController最后在返回前添加
            //现在要做的就是返回JSON
            Employee employee = (Employee)subject.getPrincipal();//获取当前登录用户
            Session session = subject.getSession();//拿到Seesion对象
            session.setAttribute("employee",employee );//把用户方法放session中
            return new JsonResult();
    
        1.2.1 使用shiro标签实现同样功能
    image.png

     4.2 注销

        4.2.1 在main.jsp主页面添加
    <%--在你想要放的地方加a标签,搞上路径--%>
    <a href="/logout">滚吧</a>
    
        4.2.2 在LoginCtroller添加方法
        //注销
        @RequestMapping("/logout")
        public String logout(){
            Subject currentUser = SecurityUtils.getSubject();
            currentUser.logout();
            return "redirect:/login";//跳回登录页面
        }
    

    五、权限判断

    目前Shiro权限框架中,密码学、身份认证还有会话管理 都已经搞定了,但是授权还没有做,还是写死的状态。

     5.1 需要对应权限才可访问设置----【PermissionMapFactory】

    //注入一下
        @Autowired
        private IPermissionService permissionService;
    
            //1.拿到对应的权限才可以访问(的地方修改)
            List<Permission> all = permissionService.getAll();
            //2,遍历然后把值放进去
            for (Permission permission : all){
                //perms 这个会自动判断找一个过滤器
                permissionMap.put(permission.getUrl(),"aisellPerms["+permission.getSn()+"]" );
            }
    

     5.2 自定义Realm中,把权限改成从数据库中获取

    权限关系连接草图
       5.2.1 五表关联查sn权限

    SELECT DISTINCT p.sn FROM employee e JOIN employee_role er ON er.employee_id = e.id JOIN role r ON r.id = er.role_id JOIN role_permission rp ON rp.role_id = r.id JOIN permission p ON p.id = rp.permission_id WHERE e.id = 1

       5.2.2 连接数据库 --- 【PermissionRepository】
    /*
                     根据用户的id去拿权限
           1.不要手动去迪卡尔积2.关联对象 别名.属性
     */
     @Query("select distinct p.sn from Employee o join o.roles r join r.permissions p where o.id=?1")
     Set<String> findPermsByUserId(Long userId);
    
       5.2.1 IPermissionService--- 加---Set<String> findPermsByUserId(Long userId);
       5.2.1 PermissionServiceImpl
        @Autowired
        private PermissionRepository permissionRepository;
        
        @Override
        public Set<String> findPermsByUserId(Long userId) {
            return permissionRepository.findPermsByUserId(userId);
        }
    
       5.2.1 自定义realm---【AisellRealm】
    //注入
    @Autowired
    private IPermissionService permissionService;
    

    在授权中修改死代码

    //2.根据主体拿到数据库的角色和权限  。(现在在下面拿  因为源码是要返回Set)
     Set<String> perms = permissionService.findPermsByUserId(loginUser.getId());
    

     5.3 当你有员工权限的时候,并没有增删改的权限时会报错。

    当你点击删除时,出现报错
       5.3.1 报错原因
    • 添加和修改的时候不会出这种问题,但是删除的时候就会出现原因如下---【Ajax请求和普通请求不一样】
    正常增修--普通请求 删除流程图----Ajax请求
       5.3.1 解决方案

    判断是否是Ajax请求
      1.如果不是:直接跳转(代码不需要改)
      2.如果是:返回JSON数据!!
    我们怎么知道请求是什么请求?

    普通请求 Ajax请求

    我们应该怎么取修改?

    • 我们需要自定义权限拦截器了---可百度


     5.4 在Shiro中新写PermissionsAuthorizationFilter ----当没有权限的收会进到这里来,这里写没有权限的处理方案

     5.5 配置自定义权限拦截器----【applicationController-shiro.xml】修改一下过滤器

        <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
            <property name="securityManager" ref="securityManager"/>
            <!--如果没有登录,就会调到这个路径(一般放登录页面)login[登录]-->
            <property name="loginUrl" value="/login"/>
            <!--登录成功进入的路径(一般放主页面)-->
            <property name="successUrl" value="/main.jsp"/>
            <!--没有权限的时候进入的页面(一般专门写一个提示没有权限的页面)-->
            <property name="unauthorizedUrl" value="/login/unauthorized.jsp"/>
            
            <property name="filters">
                <map>
                    <entry value-ref="aisellPermsFiter" key="aisellPerms"/>
                </map>
            </property>
            
            <!--这里需要Map-->
            <property name="filterChainDefinitionMap" ref="filterChainDefinitionMap"/>
        </bean>
        
        <!--配置自定义权限拦截器-->
        <bean class="cn.zx.aisell.web.shiro.AisellPermissionsAuthorizationFilter" id="aisellPermsFiter"/>
    

     5.7 PermissionsMapFactory

            //1.拿到对应的权限才可以访问
            List<Permission> all = permissionService.getAll();
            //2,遍历然后把值放进去
            for (Permission permission : all){
                //perms 这个会自动判断找一个过滤器
                permissionMap.put(permission.getUrl(),"aisellPerms["+permission.getSn()+"]" );
            }
    

    六、你没有权限就直接看不见增删改的按钮!!!啊---直接快速解决上面问题【但是自定义拦截器还是很重要的。要学会啊~~~】因为现在使用的jsp。万一以后不用呢?所以上面也要会比这个重要

    在js中加shiro标签

    <style type="text/css">
            td[field="permissions"]>div{
                overflow: hidden;
                text-overflow: ellipsis;
            }
            td[field="permissions"]>div:hover{
                overflow: visible;
            }
    </style>
    

    在加一句

    七、知识点

    JPQL关联

      1.不需要手动消除迪卡尔积
      2.关联的是前面的对象的别名.属性
         比如现在关联员工和部门select o from Employee o join o.department

    报错401

    就是你没有填权限

    相关文章

      网友评论

        本文标题:智能销售系统(七)小问题填坑/权限判断

        本文链接:https://www.haomeiwen.com/subject/opluyctx.html