zoukankan      html  css  js  c++  java
  • 项目一:第十一天 2、运单waybill快速录入 3、权限demo演示-了解 5、权限模块数据模型 6、基于shiro实现用户认证-登录(重点)

    1、 easyui DataGrid行编辑功能

    2、 运单waybill快速录入

    3、 权限demo演示-了解

    4、 Apache shiro安全框架概述

    5、 权限模块数据模型

    6、 基于shiro实现用户认证-登录(重点)

     

     

     

    jQuery EasyUI datagrid行编辑功能使用方式

     

    datagrid的行编辑功能是以为单位,通过列属性指定哪列可以编辑,哪列不能编辑。

     

     

     

    第一步:通过列属性 editor指定哪列可以编辑 。指定编辑类型(普通,数字,下拉,日期),必填项

     

    第二步:调用数据表格方法

     

    **修改:beginEdit endEdit;当调用结束编辑触发结束编辑事件,在事件中完成操作

     

    **新增:insertRow

     

    **删除:deleteRow

     

     

     

     

     

    数据表格的列属性:

     

     

     

     

     

    数据表格的方法:开始编辑数据

     

     

     

     

     

     

     

     

     

     

     

    在调用结束编辑后,datagrid触发事件。数据表格的结束编辑事件, 删除操作需要单独处理:

     

     

     

    <table id="dg"></table>

     

    <script type="text/javascript">

     

    var editIdx = -1;  //编辑行记录索引

     

    //创建数据表格

     

    $('#dg').datagrid({

     

    url:'../data/user.json',   //数据来源ajax请求, 响应json数据

     

    columns:[[                 //展示数据

     

    {field:'id',title:'编号',100},

     

    {field:'name',title:'姓名',100,editor:{

     

    type:"validatebox",  //validatebox普通输入框    numberbox:数字框

     

    options:{required:true}   //指定编辑后数据-必填

     

    }},

     

    {field:'age',title:'年龄',100,align:'right',editor:{

     

    type:"numberbox",

     

    options:{required:true}   

     

    }}

     

    ]],

     

    pagination:true,  

     

    /* 分页栏, 提交两个参数:page(当前页)  rows(每页显示记录数)

     

         响应数据格式:json对象

     

         {

     

    total:100,  //总记录数

     

        rows:[{},{}]  //当前页记录

     

         }

     

    */

     

    toolbar: [{   //工具栏

     

      iconCls: 'icon-add',  

     

      text:'增加',             

     

      handler: function(){    

     

      //在数据表格中新增一条记录

     

    //插入新的一行在第一排的位置

     

      $('#dg').datagrid('insertRow',{

     

         index: 0, // index start with 0

     

         row: {  //行记录

     

         }

     

        });

     

      $('#dg').datagrid("beginEdit", 0);

     

      

     

      editIdx = 0;

     

       }

     

      },{   //工具栏

     

      iconCls: 'icon-edit',   //显示图标样式

     

      text:'修改',              //显示文本

     

      handler: function(){     //点击事件

     

      var rows = $("#dg").datagrid("getSelections");

     

      //获取编辑行索引

     

     var idx =  $("#dg").datagrid("getRowIndex", rows[0]);

     

      //调用开始编辑数据 beginEdit

     

      $("#dg").datagrid("beginEdit", idx);

     

      editIdx = idx;

     

      }  

     

      },{  

     

      iconCls: 'icon-save',   //显示图标样式

     

      text:'保存',              //显示文本

     

      handler: function(){     //点击事件

     

      //调用结束编辑数据 beginEdit  触发结束编辑事件,在结束编辑事件中发送请求,请求服务器

     

      $("#dg").datagrid("endEdit", editIdx);

     

      }  

     

      },{  

     

      iconCls: 'icon-remove',

     

      text:'删除',

     

      handler: function(){

     

       var rows = $("#dg").datagrid("getSelections");

     

      for(var i =0;i<rows.length;i++){

     

      //获取删除行索引

     

     var idx =  $("#dg").datagrid("getRowIndex", rows[i]);

     

           $("#dg").datagrid("deleteRow", idx);

     

      }

     

      $.post("userAction_delea.action",{},function(data){

     

      

     

      })

     

      }  

     

      }] ,

     

      striped:true,

     

      rownumbers:true,

     

      pageSize:2,

     

      pageList:[2,5,6],

     

      //仅仅调用结束编辑方法后自动触发

     

      onAfterEdit:function(rowIndex, rowData, changes){

     

    //   rowIndex: 编辑行索引,0

     

    //   rowData: 对应的记录编辑行

     

    //   changes: 更改的字段/值对

     

      console.info(rowData);

     

      $.post("userAction_save.action",rowData,function(data){

     

      //

     

      })

     

      }

     

    });

     

    </script>

     

    运单快速录入

     

    第一步:修改waybill_quick.html页面中数据表格onAfterEdit事件

     

     

    查看发送ajax请求信息:

     

    第二步:创建运单相关的ActionServiceDao实现数据库操作

     

     

     

     

    验证权限:验证用户是否有权限。

    演示权限demo(了解)

    项目使用ssh实现。

     

    1、 导入项目

    2、 创建数据库

     

    3、 启动项目完成自动建表

     

    4、 手动向用户表中添加一条用户记录

    INSERT INTO itcast_user(id,loginName,PASSWORD) VALUES(1,'admin',MD5('admin'));

    5、 执行资料中权限数据脚本:

    INSERT INTO `itcast_privilege` VALUES ('1', '系统管理', null, null);

    INSERT INTO `itcast_privilege` VALUES ('2', '角色管理', '/roleAction_list', '1');

    INSERT INTO `itcast_privilege` VALUES ('3', '部门管理', '/departmentAction_list', '1');

    INSERT INTO `itcast_privilege` VALUES ('4', '用户管理', '/userAction_list', '1');

    INSERT INTO `itcast_privilege` VALUES ('5', '角色列表', '/roleAction_list', '2');

    INSERT INTO `itcast_privilege` VALUES ('6', '角色删除', '/roleAction_delete', '2');

    INSERT INTO `itcast_privilege` VALUES ('7', '角色添加', '/roleAction_save', '2');

    INSERT INTO `itcast_privilege` VALUES ('8', '角色修改', '/roleAction_update', '2');

    INSERT INTO `itcast_privilege` VALUES ('9', '部门列表', '/departmentAction_list', '3');

    INSERT INTO `itcast_privilege` VALUES ('10', '部门删除', '/departmentAction_delete', '3');

    INSERT INTO `itcast_privilege` VALUES ('11', '部门添加', '/departmentAction_save', '3');

    INSERT INTO `itcast_privilege` VALUES ('12', '部门修改', '/departmentAction_update', '3');

    INSERT INTO `itcast_privilege` VALUES ('13', '用户列表', '/userAction_list', '4');

    INSERT INTO `itcast_privilege` VALUES ('14', '用户删除', '/userAction_delete', '4');

    INSERT INTO `itcast_privilege` VALUES ('15', '用户添加', '/userAction_save', '4');

    INSERT INTO `itcast_privilege` VALUES ('16', '用户修改', '/userAction_update', '4');

    INSERT INTO `itcast_privilege` VALUES ('17', '用户初始化密码', '/userAction_reSetPassword', '4');

    INSERT INTO `itcast_privilege` VALUES ('21', '设置权限', '/roleAction_setPrivilege', '2');

    6、 重新启动项目-系统会将权限的数据加载

    权限概述

    认证:系统提供给用户识别身份功能 ,登陆功能就是认证 ----知道你是谁?

    授权:系统提供用户分配权限功能让系统知道你能干什么?

     

    验权:验证用户是否有权限

    Shiro 4大核心功能

    认证

    授权

    加密

    会话管理

     

     

     

    shiro认证流程执行图:

     

    Application Code:应用代码,比如(登陆页面,服务器端登陆方法)-程序员自己编写

    Subject:  shiro框架提供接口;代表当前“用户”有认证状态,包含权限信息-通过工具类获取

    Security Manage: shiro框架提供接口;shiro框架核心;管理所有登陆用户(Subject

    Realm:   shiro框架有提供,一般自己编写。访问安全数据(调用service或者dao)查询数据库中用户密码,用户权限,角色。

    权限模块数据模型

    权限demo中数据模型:

     

    Demo中权限表中:有权限数据,有菜单数据,混合到一起。

     

     

     

     

    基于Apache shiro实现认证(登陆)

    手动增加一条用户记录:密码进行加密   admin-------21232f297a57a5a743894a0e4a801fc3

    2.1 登陆页面处理(应用代码)

    页面:login.jsp

    1、 input增加相关的name

    2、 提交表单,发送登陆请求

     

     

    服务端新建三层对象。。。。

    3、 服务端创建三层对象,完成注入

     

    2.2 搭建shiro环境

    1、 web.xml中配置代理spring提供过滤器。注意:一定放在struts2核心过滤器之前

    <!-- spring提供过滤器 -->

    <filter>

    <filter-name>shiroFilter</filter-name>

    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>

    </filter>

     

    <filter-mapping>

    <filter-name>shiroFilter</filter-name>

    <url-pattern>/*</url-pattern>

    </filter-mapping>

    2、 问题:找不到bean对象

     

    3、 解决:在spring配置文件中配置对象,对象名称跟上面过滤器名称一致

     

     

    基于shiro实现认证(登陆)

    完善userAction中登陆:applicationCode --->Subject----->securityManager------->自定义realm

     

    创建realm完善realm中认证方法:

     

     

    /**

      * @Description: 基于shiro框架实现登陆

     */

    @Action("userAction_login")

    public String login() throws Exception {

    if(StringUtils.isNotBlank(checkcode)){

    String  realChecode = (String) ServletActionContext.getRequest().getSession().getAttribute("key");

    if(checkcode.equals(realChecode)){

    //获取当前登陆用户

    Subject subject = SecurityUtils.getSubject();

    //判断当前用户登陆状态

    if(subject.isAuthenticated()){

    return "index";

    }else{

    //开始认证  认证状态:未认证

    //创建认证令牌-用户名密码令牌

    AuthenticationToken token = new UsernamePasswordToken(model.getUsername(), Md5Util.encode(model.getPassword()));

    try {

    subject.login(token);

    //用户认证通过 subject对象变为 认证通过

    //将用户登陆信息存在session

    User user = (User) subject.getPrincipal();

    ServletActionContext.getRequest().getSession().setAttribute("loginUser", user);

    return "index";

     

    } catch (Exception e) {

    if(e instanceof UnknownAccountException){

    this.addActionError("用户名输入错误");   //login.jsp中 通过struts2标签展示错误信息  <s:actionerror>

    }

    if(e instanceof IncorrectCredentialsException){

     

    }

    //用户名密码有误

    e.printStackTrace();

    }

    }

    }

    }

    return "login";

    }

    注意:在spring配置文件中将realm对象注入安全管理器:

    <!-- 配置realm对象 -->

    <bean id="bosRealm" class="com.itheima.bos.realm.BosRealm"></bean>

     

    <!-- 配置安全管理器对象:shiro框架核心 -->

    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">

    <!-- 注入realm -->

    <property name="realm" ref="bosRealm"></property>

    </bean>

  • 相关阅读:
    实验室网络管理记
    mondrian schema一个简单的例子
    powerdesigner数据库设计导入oracle9i
    linux 的mount命令
    [转]moto面试题
    Oracle数据库服务解释
    数据聚集技术在mondrian中的实现
    发现台湾的mondrian资料 + pentaho截图
    一个封装比较完整的FTP类(转载)
    oracle 网页管理工具登录接口
  • 原文地址:https://www.cnblogs.com/shan1393/p/9250702.html
Copyright © 2011-2022 走看看