宅急送 项目第三天 货物收派标准

1. 业务模块: 基础设置模块

1.1. 分析基础设置模块需求

这里写图片描述

基础档案设置 :
数据字典 ,举例 :线路类型、保险类型、 商品分类、 取件配置要求类别 都属于 数据字典
数据字典很多情况下 是用来下拉列表项

目前需要在此设置的基础档案包括:
线路类型、取派员类型、签收类型、保险类型、受理备注说明、配载信息、返货原因、消单原因、取消签收类型、返货拒绝类型、大物流类型

基础档案信息 采用一对多 两张表存储, 在实际开发中,数据可以被缓存 !

收派标准
将承接的货物,按照重量和体积两个标准,双纬度定义货物的标准。以便将不同标准的货物分给不同收取和派送能力的人员。由运营部门制定。
指派送人员,取件时遵循的标准

班车设置
班车设置、 线路管理信息 ,对应需求文档 “路由管理”

收派人员信息管理
管理 取货和送货的人员信息

收派时间管理
收派人员,取派是有固定时间段

排班和替班
指定哪个取派员 在什么时间段进行工作,将不同取派员 进行一天排班设置, 允许取派员进行请假,替班

区域管理模块
此功能区域为行政区域列表,为价格、商务网站、工作单始发站、目的站等来源的基础数据。

管理分区
因为行政比较大,必然进行划分,成为很多小的分区

管理定区
什么是定区?
将很多分区,统一指定取派人员负责 ,成为定区 ,在定区中管理客户信息
客户可以被关联定区上, 自动获得客户对应负责取派人员

1.2. 数据库设计

针对需求分析文档,使用昨天学习 PowerDesigner 工具,绘制 PDM
文件中,下发 “bos_基础设置.pdm”

开发任务 :
收派标准
取派员信息管理
区域管理
分区管理
定区管理

系统用户登录后, 指定收派标准 (一对多)
取派员使用一个收派标准 ,一个标准被多个取派员使用 (一对多)
一个行政区域,可以被划分为多个分区 (一对多)
将分区划分给取派员负责,将几个分区组成一个定区 ,定区由分区组成 (一对多)
将定区指定给取派员负责 ,一个取派员 负责 多个定区 (一对多)

根据PDM 生成 SQL 建表语句

这里写图片描述

因为系统有很多模块,所以为每个模块数据表 定义前缀,区分数据所属模块 bc 基础档案模块 简码

    bc_standard  收派标准表
    bc_staff 取派员表
    bc_region 区域信息表
    bc_subarea 分区信息表 
    bc_decidedzone 定区信息表

重新建表,向user表插入一条数据

insert into user(id,username,password) values('xxxx','admin',md5('admin'));

新建 cn.itcast.bos.domain.bc 包,建立基础档案数据 PO类和hbm映射

这里写图片描述

这里写图片描述

2. 收派标准数据表CURD操作

2.1. 分析PO类数据模型

使用MyEclipse 动态生成PO类和 hbm映射
Standard 类 收派标准类
默认生成hbm映射,varchar类型主键,使用assigned策略,修改为 uuid

<id name="id" type="java.lang.String">
            <column name="id" length="32" />
            <generator class="uuid" />
</id>

在企业数据开发中, 删除数据大多使用逻辑删除(在数据表设置标记位 0 未删除, 1 已经删除), 而并不会使用物理删除

这里写图片描述

页面只需要输入 name 、minweight、maxweight 可以完成 标准信息录入 !

2.2. 收派标准添加

2.2.1. 对添加表单form进行校验

使用 EasyUI的 隐藏window窗口。点击添加,弹出窗口

$('#addStandardWindow').window("open"); 

添加标准,使用 EasyUI 表单校验控件
validatebox 校验框

<input type="text" class="easyui-validatebox" data-options="required:true" /> 

该输入框必须添加,否则产生警告信息
numberbox 数字输入框

<input type="text" class="easyui-numberbox"  /> 
// 点击保存按钮,提交标准form
function commitStandardForm(){
    // 先判断form 是否通过校验,如果通过 ,提交表单 
    if($('#standardForm').form('validate')){// 执行EasyUI 校验方法
        // 通过校验 
        $('#standardForm').submit();
    }else{
        // 没通过校验
        $.messager.alert('警告','表单存在非法数据,请重新输入','warning');
    }
}
2.2.2. 编写服务器代码,完成表单数据添加
public class StandardAction extends BaseAction implements ModelDriven<Standard> {
}
public interface StandardService {
}
public class StandardServiceImpl extends BaseService implements StandardService {
}

将DAO 注入 BaseService
将Service 注入 BaseAction

统一配置
struts.xml
applicationContext-action.xml
applicationContext-service.xml
applicationContext-dao.xml

3. 数据表格控件 datagrid 使用

Flex 、 ExtJS 、 EasyUI 几乎所有前端UI框架都提供 数据表格
数据表格 ,实现数据显示、分页、排序、查询

3.1. Datagrid 可以对任何HTML表格数据使用

这里写图片描述

注意点:

class=”easyui-datagrid”
    <thead> <tbody> 

为每个标题列设置 field属性

常用属性分析:
singleSelect : 单选效果
rownumbers : 显示行号
pagination : 显示分页工具条

这里写图片描述

3.2. Datagrid 加载远程数据 (json格式)

这里写图片描述

这里写图片描述

这里写图片描述

3.3. 使用JavaScript创建Datagrid (推荐)

这里写图片描述

通过 toolbar 定义工具栏按钮, columns定义表头列信息,url加载远程数据

这里写图片描述

3.4. 分页列表查询

3.4.1. 分页查询分析

数据表格控件,使用有两种方式
第一种: 对HTML Table数据 应用表格效果
第二种: 对table应用datagrid ,数据是绑定服务器返回json格式数据

数据格式 :

[
    {key:value, key:value…} ,
    {key:value, key:value…} ,
]

这里写图片描述

问题: 使用上面数据格式,可以将数据显示出来,不能够解决分页显示需要
实际显示数据记录数量 和 记录总数数量 是不同的

这里写图片描述

total 代表总记录数, rows 代表当页数据记录

3.4.2. 设计通用分页查询组件

请求参数 :

这里写图片描述

page 当前页码, rows 每页多少条

响应参数:
total 总记录数 和 rows 当页数据

新建 cn.itcast.bos.page 存放分页组件

/**
 * 封装 分页查询 请求参数
 * 
 * @author seawind
 * 
 */
public class PageRequestBean {
    private int page; // 当前页码
    private int rows; // 每页记录条数

    // 保存查询条件
    private DetachedCriteria detachedCriteria; // 面向对象条件查询
} 

备注: 如果不使用hibernate,必须要动态拼接SQL

/**
 * 封装分页查询 结果数据
 * 
 * @author seawind
 * 
 */
@SuppressWarnings("all")
public class PageResponseBean {
    private long total; // 总记录数
    private List rows; // 当前页数据记录
}
3.4.3. 实现分页列表查询

Ajax功能

开发步骤:

1、 发起请求
修改 datagrid 控件,绑定url 参数

url : "${pageContext.request.contextPath}/standard_pageQuery.action", 

(备注: datagrid数据请求,在页面加载时 自动发出)

2、 服务器处理数据,获得数据结果
在 StandardAction 中添加 pageQuery 的查询方法
问题: 如何StandardAction 接收page和rows 查询参数

// 属性驱动
private int page;
private int rows;

public void setPage(int page) {
    this.page = page;
}

public void setRows(int rows) {
    this.rows = rows;
}

将分页查询参数,封装PageRequestBean 对象中 !

这里写图片描述

查询总记录数

DetachedCriteria criteria = DetachedCriteria.forClass(Standard.class); 

生成语句 : select * from standard ; 查询所有列数据

进行投影 : criteria.setProjections(Projections.rowCount());
生成语句 : select count(*) from standard ; 查询总记录数

这里写图片描述

3、 将服务器数据结果,转换json格式 返回

// 将分页查询结果数据,转换 json格式
ActionContext.getContext().put("pageResponseBean", pageResponseBean);

在struts.xml 配置结果数据

需要定制哪些属性转换为json 返回

<!-- 分页查询标准数据 -->
<result name="pageQuerySUCCESS" type="json">
    <param name="root">pageResponseBean</param>
    <!-- 配置 属性includeProperties 指定哪些属性返回  -->
    <param name="includeProperties">
        <!-- 正则表达式 格式  -->
        total, <!-- pageResponseBean的 total 属性返回  -->
        rows\[\d+\]\.id,
        rows\[\d+\]\.name,
        rows\[\d+\]\.minweight,
        rows\[\d+\]\.maxweight,
        rows\[\d+\]\.updatetime,
        rows\[\d+\]\.user\.username,
        rows\[\d+\]\.user\.station
    </param>
</result>

4、 使用firebug 抓包调试
问题: org.apache.struts2.json.JSONException: org.apache.struts2.json.JSONException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: cn.itcast.bos.domain.bc.Standard.staffs, no session or session was closed
解决: OpenSessionInView

配置web.xml

<!-- OpenSessionInView  -->
  <filter>
    <filter-name>OpenSessionInView</filter-name>    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>OpenSessionInView</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

这里写图片描述

已经正确返回 结果数据

3.4.4. 自定义列属性formatter 控制具体显示

Jquery EASY UI 的datagrid 在指定field ,只能和返回对象之间属性匹配,不能和返回对象关联对象的属性匹配 , 关联数据复杂属性无法显示 ,可以自定义 formatter

这里写图片描述

4. 收派标准数据修改

传统的修改实现: 先根据id 查询,回显form数据,再进行修改

使用 datagrid ,所有数据 缓存到客户端浏览器,以对象方式保存 ,点击修改时,无需查询服务器,直接从datagrid 获取数据,回显到form表单中 !!!

4.1. 数据表格双击事件,点击行数据,进行修改

// 修改数据 
function doDblClickRow(rowIndex, rowData){ // rowIndex行号,rowData 双击行数据
    // form回显
    $('#name').val(rowData.name);
    $('#minweight').numberbox('setValue', rowData.minweight);  
    $('#maxweight').numberbox('setValue', rowData.maxweight);  
    $('#id').val(rowData.id) ;

    // 弹出修改窗口
    $('#addStandardWindow').window('open');
}

4.2. 新增和修改功能使用 同一个Action 的同一个方法

使用 saveOrUpdate 方法

这里写图片描述

Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 

问题原因: 新增数据,id有值 ,是空串””
空串对于 saveOrUpdate 方法,Hibernate 认为有值,执行 update 操作 !

解决方案: Hibernate 认为空串是无值
在Standard.hbm.xml 添加unsaved-value 属性

<id name="id" type="java.lang.String" unsaved-value="">
            <column name="id" length="32" />
            <generator class="uuid" />
</id>

Hibernate 认为 null 或者 空串,都是临时对象,执行save操作 !

5. 收派标准删除操作

点击删除按钮,获取所有选中行的id

这里写图片描述

function doDelete(){
        // 判断是否选择表格数据 
        var array = $('#grid').datagrid('getSelections');
        if(array.length == 0){
            // 一行也没选
            $.messager.alert('警告','删除数据要先选中!','warning');
            return ;
        }

        // 提交删除form 
        $('#delForm').submit();
}

编写服务器端, StandardAction 添加 delBatch 方法
删除时候,只需要将数据 deltag 标记位 改为 1

其它

这里写图片描述

基础档案信息(数据字典)

这里写图片描述

datagrid属性分析

这里写图片描述

datagrid分页原理

这里写图片描述

课前资料

这里写图片描述

课程视频内容

这里写图片描述

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值