美文网首页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