企业权限系统_2订单操作

SSM 订单操作

1. 表结构分析

1.1.订单表信息描述 orders

序号 字段名称 字段类型 字段描述
1 id varchar2(32) 无意义、主键uuid
2 orderNum varchar2(50) 订单编号 不为空 唯一
3 orderTime timestamp 下单时间
4 peopleCount int 出行人数
5 orderDesc varchar2(500) 订单描述(其它信息)
6 payType int 支付方式(0 支付宝 1 微信 2其它)
7 orderStatus int 订单状态(0 未支付 1 已支付)
8 productId int 产品id 外键
9 memberid int 会员(联系人)id 外键

productId描述了订单与产品之间的关系。
memberid描述了订单与会员之间的关系。
创建表sql

CREATE TABLE orders(
id varchar2(32) default SYS_GUID() PRIMARY KEY,
orderNum VARCHAR2(20) NOT NULL UNIQUE,
orderTime timestamp,
peopleCount INT,
orderDesc VARCHAR2(500),
payType INT,
orderStatus INT,
productId varchar2(32),
memberId varchar2(32),
FOREIGN KEY (productId) REFERENCES product(id),
FOREIGN KEY (memberId) REFERENCES member(id)
)

实体类

public class Orders {    
    private String id;
    private String orderNum;//订单编号 不为空 唯一
    private Date orderTime;//下单时间
    private String orderTimeStr;//方便显示时间
    private int orderStatus;//订单状态(0 未支付 1 已支付)
    private String orderStatusStr;//方便显示订单状态
    private int peopleCount;//出行人数
    private Product product;//产品id 外键
    private List<Traveller> travellers;//订单表里的旅客
    private Member member;//会员(联系人)id 外键
    private Integer payType;//支付方式(0 支付宝 1 微信 2其它)
    private String payTypeStr;//方便显示支付方式
    private String orderDesc;//订单描述(其它信息)

1.2 会员表信息描述member

订单与会员之间是多对一关系,我们在订单表中创建一个外键来进行关联

序号 字段名称 字段类型 字段描述
1 id varchar2(32) 无意义、主键uuid
2 name varchar2(20) 姓名
3 nickName varchar2(20) 昵称
4 phoneNum varchar2(20) 电话号码
5 email varchar2(50) 邮箱

创建表sql

CREATE TABLE member(
id varchar2(32) default SYS_GUID() PRIMARY KEY,
NAME VARCHAR2(20),
nickname VARCHAR2(20),
phoneNum VARCHAR2(20),
email VARCHAR2(20)
)

实体类

public class Member {  
    private String id;
    private String name;//姓名
    private String nickname;//昵称
    private String phoneNum;//电话号码
    private String email;//邮箱

1.3.旅客表信息描述 traveller

序号 字段名称 字段类型 字段描述
1 id varchar2(32) 无意义、主键uuid
2 name varchar2(20) 姓名
3 sex varchar2(20) 性别
4 phoneNum varchar2(20) 电话号码
5 credentialsType int 证件类型 0身份证 1护照 2军官证
6 credentialsNum varchar2(50) 证件号码
7 travellerType int 旅客类型(人群) 0 成人 1 儿童

创建表sql

CREATE TABLE traveller(
id varchar2(32) default SYS_GUID() PRIMARY KEY,
NAME VARCHAR2(20),
sex VARCHAR2(20),
phoneNum VARCHAR2(20),
credentialsType INT,
credentialsNum VARCHAR2(50),
travellerType INT
)

实体类

public class Traveller {
private String id;
private String name;//姓名
private String sex;//性别
private String phoneNum;//电话号码
private Integer credentialsType;//证件类型 0身份证 1护照 2军官证
private String credentialsTypeStr;//
private String credentialsNum;//证件号码
private Integer travellerType;//旅客类型(人群) 0 成人 1 儿童
private String travellerTypeStr;//
//省略getter/setter
}

旅客与订单之间是多对多关系,所以我们需要一张中间表(order_traveller)来描述

序号 字段名称 字段类型 字段描述
1 orderId varchar2(32) 订单id
2 travellerId varchar2(32) 旅客id

创建表sql

CREATE TABLE order_traveller(
orderId varchar2(32),
travellerId varchar2(32),
PRIMARY KEY (orderId,travellerId),
FOREIGN KEY (orderId) REFERENCES orders(id),
FOREIGN KEY (travellerId) REFERENCES traveller(id)
)

2. 订单查询

2.1 订单查询页面 order-list.jsp


aside.jsp页面跳转

<li id="system-setting">
  <a href="${pageContext.request.contextPath}/orders/findAll.do?"> 
    <i class="fa fa-circle-o"></i> 订单管理</a>
</li>

2.2 Controller

//查询全部订单---未分页
@RequestMapping("/findAll.do")
public ModelAndView findAll() throws Exception {
  ModelAndView mv = new ModelAndView();
  List<Orders> ordersList = ordersService.findAll();
  mv.addObject("ordersList", ordersList);
  mv.setViewName("orders-list");
  return mv;
}

2.3 Dao

@Select("select * from orders")
@Results({
  @Result(id = true, property = "id", column = "id"),
  @Result(property = "orderNum", column = "orderNum"),
  @Result(property = "orderTime", column = "orderTime"),
  @Result(property = "orderStatus", column = "orderStatus"),
  @Result(property = "peopleCount", column = "peopleCount"),
  @Result(property = "peopleCount", column = "peopleCount"),
  @Result(property = "payType", column = "payType"),
  @Result(property = "orderDesc", column = "orderDesc"),
  @Result(property = "product", column = "productId", javaType = Product.class, one = @One(select = "com.rgh.ssm.dao.IProductDao.findById")),
})
public List<Orders> findAll() throws Exception;

一个订单里有一个产品,按照这样的需求来做

需要IProductDao有findById方法

    //根据id查询产品
    @Select("select * from product where id=#{id}")
    public Product findById(String id) throws Exception;

2.4 在orders-list.jsp的显示

<tbody>


  <c:forEach items="${ordersList}" var="orders">

    <tr>
      <td><input name="ids" type="checkbox"></td>
      <td>${orders.id }</td>
      <td>${orders.orderNum }</td>
      <td>${orders.product.productName }</td>
      <td>${orders.product.productPrice }</td>
      <td>${orders.orderTimeStr }</td>
      <td class="text-center">${orders.orderStatusStr }</td>
      <td class="text-center">
        <button type="button" class="btn bg-olive btn-xs">订单</button>
        <button type="button" class="btn bg-olive btn-xs" onclick="location.href='${pageContext.request.contextPath}/orders/findById.do?id=${orders.id}'">详情</button>
        <button type="button" class="btn bg-olive btn-xs">编辑</button>
      </td>
    </tr>
  </c:forEach>
</tbody>

3. 订单分页查询

3.1 PageHelper介绍

PageHelper是国内非常优秀的一款开源的mybatis分页插件,它支持基本主流与常用的数据库,例如mysql、
oracle、mariaDB、DB2、SQLite、Hsqldb等

本项目在 github 的项目地址

本项目在 gitosc 的项目地址

3.2 PageHelper使用

3.2.1.集成

引入分页插件有下面2种方式,推荐使用 Maven 方式。

3.2.1.1. 引入 Jar 包

你可以从下面的地址中下载最新版本的 jar 包

地址1
地址2

由于使用了sql 解析工具,你还需要下载 jsqlparser.jar

jar包地址

3.2.1.2. 使用 Maven

在 pom.xml 中添加如下依赖

<dependency>
  <groupId>com.github.pagehelper</groupId>
  <artifactId>pagehelper</artifactId>
  <version>最新版本</version><!--本项目这里是5.1.2-->
</dependency>

3.2. 2.配置

特别注意,新版拦截器是 com.github.pagehelper.PageInterceptorcom.github.pagehelper.PageHelper
在是一个特殊的 dialect 实现类,是分页插件的默认实现类,提供了和以前相同的用法。

3.2.2.1. 在 MyBatis 配置 xml 中配置拦截器插件
<!--
plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
properties?, settings?,
typeAliases?, typeHandlers?,
objectFactory?,objectWrapperFactory?,
plugins?,
environments?, databaseIdProvider?, mappers?
-->
<plugins>
  <!-- com.github.pagehelper为PageHelper类所在包名 -->
  <plugin interceptor="com.github.pagehelper.PageInterceptor">
    <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
    <property name="param1" value="value1"/>
  </plugin>
</plugins>
3.2.2.2. 在 Spring 配置文件中配置拦截器插件

使用 spring 的属性配置方式,可以使用 plugins 属性像下面这样配置:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource"/>
  <!-- 传入PageHelper的插件 -->
  <property name="plugins">
    <array>
      <!-- 传入插件的对象 -->
      <bean class="com.github.pagehelper.PageInterceptor">
        <property name="properties">
          <props>
            <prop key="helperDialect">oracle</prop>
            <prop key="reasonable">true</prop>
          </props>
        </property>
      </bean>
    </array>
  </property>
</bean>

3.2.3 分页插件参数介绍

  1. helperDialect :分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置
    helperDialect 属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值:
    oracle , mysql , mariadb , sqlite , hsqldb , postgresql , db2 , sqlserver , informix , h2 , sqlserver201
    2 , derby
    特别注意:使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012 ,否则会使用 SqlServer2005
    方式进行分页。
  2. reasonable :分页合理化参数,默认值为 false 。当该参数设置为 true 时, pageNum<=0 时会查询第一
    页, pageNum>pages (超过总数时),会查询最后一页。默认 false 时,直接根据参数进行查询。

本项目只用到了这两个参数,其他参数可以查看具体文档

3.2.4.基本使用

3.2.4.1. PageHelper.startPage 静态方法调用

这种方式是我们要掌握的 在你需要进行分页的 MyBatis 查询方法前调用PageHelper.startPage 静态方法即可,紧
跟在这个方法后的第一个MyBatis 查询方法会被进行分页。

//获取第1页,10条内容,默认查询总数count
PageHelper.startPage(1, 10);
//紧跟着的第一个select方法会被分页
List<Country> list = countryMapper.selectIf(1);

3.3 订单分页查询

3.3.1 Service

@Service
@Transactional
public class OrdersServiceImpl implements IOrdersService {

    @Autowired
    private IOrdersDao ordersDao;

    @Override
    public List<Orders> findAll(int page, int size) throws Exception {
        //参数pageNum 是页码值   参数pageSize 代表是每页显示条数
        PageHelper.startPage(page, size);
        return ordersDao.findAll();
    }
}

3.3.2 Controller

页面请求默认显示第一页,每页4条数据

<li id="system-setting">
  <a href="${pageContext.request.contextPath}/orders/findAll.do?page=1&size=4"> 
    <i class="fa fa-circle-o"></i> 订单管理</a>
</li>

Controller类

@RequestMapping("/findAll.do")
public ModelAndView findAll(@RequestParam(name = "page", required = true, defaultValue = "1") int page, @RequestParam(name = "size", required = true, defaultValue = "4") int size) throws Exception {
  ModelAndView mv = new ModelAndView();
  List<Orders> ordersList = ordersService.findAll(page, size);
  //PageInfo就是一个分页Bean
  PageInfo pageInfo = new PageInfo(ordersList);
  mv.addObject("pageInfo", pageInfo);
  mv.setViewName("orders-page-list");
  return mv;
}

3.3.3 orders-page-list.jsp页面

<tbody>
  <c:forEach items="${pageInfo.list}" var="orders">
    <tr>
      <td><input name="ids" type="checkbox"></td>
      <td>${orders.id }</td>
      <td>${orders.orderNum }</td>
      <td>${orders.product.productName }</td>
      <td>${orders.product.productPrice }</td>
      <td>${orders.orderTimeStr }</td>
      <td class="text-center">${orders.orderStatusStr }</td>
      <td class="text-center">
        <button type="button" class="btn bg-olive btn-xs">订单</button>
        <button type="button" class="btn bg-olive btn-xs" onclick="location.href='${pageContext.request.contextPath}/orders/findById.do?id=${orders.id}'">详情</button>
        <button type="button" class="btn bg-olive btn-xs">编辑</button>
      </td>
    </tr>
  </c:forEach>
</tbody>

页面展示


页面下方可以选择每页显示个数

<div class="form-group form-inline">
  总共2 页,共14 条数据。 每页
  <select class="form-control" id="changePageSize" onchange="changePageSize()">
    <option>1</option>
    <option>2</option>
    <option>3</option>
    <option>4</option>
    <option>5</option>
  </select> 条
</div>

用js代码实现

function changePageSize() {
  //获取下拉框的值
  var pageSize = $("#changePageSize").val();

  //向服务器发送请求,改变没页显示条数
  location.href = "${pageContext.request.contextPath}/orders/findAll.do?page=1&size="
    + pageSize;
}

选择页码

查到的pageInfo里这里需要知道几个参数

  • pageSize-------每页显示数据
  • pageNum--------当前页码
  • pages----------总页数
<ul class="pagination">
  <li>
    <a href="${pageContext.request.contextPath}/orders/findAll.do?page=1&size=${pageInfo.pageSize}" aria-label="Previous">首页</a>
  </li>
  <li><a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageInfo.pageNum-1}&size=${pageInfo.pageSize}">上一页</a></li>
  <c:forEach begin="1" end="${pageInfo.pages}" var="pageNum">
    <li><a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageNum}&size=${pageInfo.pageSize}">${pageNum}</a></li>
  </c:forEach>
  <li><a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageInfo.pageNum+1}&size=${pageInfo.pageSize}">下一页</a></li>
  <li>
    <a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageInfo.pages}&size=${pageInfo.pageSize}" aria-label="Next">尾页</a>
  </li>
</ul>

4.订单详情

在order-list.jsp页面上对"详情"添加链接

<button type="button" class="btn bg-olive btn-xs" onclick="location.href='${pageContext.request.contextPath}/orders/findById.do?id=${orders.id}'">详情</button>

4.1 订单详情 order-show.jsp

详情页面需要订单信息,产品信息,会员信息,游客信息

订单表与产品表是一对一,与会员表是一对一,与游客表是多对多通过中间表来查询

4.2 Controller

@RequestMapping("/findById.do")
public ModelAndView findById(@RequestParam(name = "id", required = true) String ordersId) throws Exception {
  ModelAndView mv = new ModelAndView();
  Orders orders = ordersService.findById(ordersId);
  System.out.println(orders.getMember());
  mv.addObject("orders",orders);
  mv.setViewName("orders-show");
  return mv;
}

4.3 Dao

//多表操作
@Select("select * from orders where id=#{ordersId}")
@Results({
  @Result(id = true, property = "id", column = "id"),
  @Result(property = "orderNum", column = "orderNum"),
  @Result(property = "orderTime", column = "orderTime"),
  @Result(property = "orderStatus", column = "orderStatus"),
  @Result(property = "peopleCount", column = "peopleCount"),
  @Result(property = "peopleCount", column = "peopleCount"),
  @Result(property = "payType", column = "payType"),
  @Result(property = "orderDesc", column = "orderDesc"),
  @Result(property = "product", column = "productId", javaType = Product.class, one = @One(select = "com.rgh.ssm.dao.IProductDao.findById")),
  @Result(property = "member",column = "memberId",javaType = Member.class,one = @One(select = "com.rgh.ssm.dao.IMemberDao.findById")),
  @Result(property = "travellers",column = "id",javaType =java.util.List.class,many = @Many(select = "com.rgh.ssm.dao.ITravellerDao.findByOrdersId"))
})
    public Orders findById(String ordersId) throws Exception;

这里需要在IMemberDao,ITravellerDao,IProductDao中加上findById方法

public interface IMemberDao {
    @Select("select * from member where id=#{id}")
    public Member findById(String id) throws Exception;
}
public interface IProductDao {
  //根据id查询产品
  @Select("select * from product where id=#{id}")
  public Product findById(String id) throws Exception;
}
public interface ITravellerDao {
    @Select("select * from traveller where id in (select travellerId from order_traveller where orderId=#{ordersId})")
    public List<Traveller> findByOrdersId(String ordersId) throws Exception;
}

4.4 orders-show.jsp的展示

游客信息

<thead>
  <tr>
    <th class="">人群</th>
    <th class="">姓名</th>
    <th class="">性别</th>
    <th class="">手机号码</th>
    <th class="">证件类型</th>
    <th class="">证件号码</th>
  </tr>
</thead>
<tbody>
  <c:forEach var="traveller" items="${orders.travellers}">

    <tr>
      <td>${traveller.travellerTypeStr}</td>
      <td><input type="text" size="10" value="${traveller.name }"
                 readonly="readonly"></td>
      <td><input type="text" size="10" value="${traveller.sex }"
                 readonly="readonly"></td>
      <td><input type="text" size="20"
                 value="${traveller.phoneNum }" readonly="readonly"></td>
      <td><input type="text" size="15"
                 value="${traveller.credentialsTypeStr}" readonly="readonly"></td>
      <td><input type="text" size="28"
                 value="${traveller.credentialsNum }" readonly="readonly"></td>
    </tr>
  </c:forEach>
</tbody>

订单信息

<div class="panel panel-default">
  <div class="panel-heading">订单信息</div>
  <div class="row data-type">

    <div class="col-md-2 title">订单编号</div>
    <div class="col-md-4 data">
      <input type="text" class="form-control" placeholder="订单编号"
             value="${orders.orderNum }" readonly="readonly">
    </div>

    <div class="col-md-2 title">下单时间</div>
    <div class="col-md-4 data">
      <div class="input-group date">
        <div class="input-group-addon">
          <i class="fa fa-calendar"></i>
        </div>
        <input type="text" class="form-control pull-right"
               id="datepicker-a3" readonly="readonly"
               value="${orders.orderTimeStr}">
      </div>
    </div>
    <div class="col-md-2 title">路线名称</div>
    <div class="col-md-4 data">
      <input type="text" class="form-control" placeholder="路线名称"
             value="${orders.product.productName }" readonly="readonly">
    </div>

    <div class="col-md-2 title">出发城市</div>
    <div class="col-md-4 data">
      <input type="text" class="form-control" placeholder="出发城市"
             value="${orders.product.cityName }" readonly="readonly">
    </div>

    <div class="col-md-2 title">出发时间</div>
    <div class="col-md-4 data">
      <div class="input-group date">
        <div class="input-group-addon">
          <i class="fa fa-calendar"></i>
        </div>
        <input type="text" class="form-control pull-right"
               id="datepicker-a6" value="${orders.product.departureTimeStr}"
               readonly="readonly">
      </div>
    </div>
    <div class="col-md-2 title">出游人数</div>
    <div class="col-md-4 data">
      <input type="text" class="form-control" placeholder="出游人数"
             value="${orders.peopleCount}" readonly="readonly">
    </div>

    <div class="col-md-2 title rowHeight2x">其他信息</div>
    <div class="col-md-10 data rowHeight2x">
      <textarea class="form-control" rows="3" placeholder="其他信息">
        ${orders.orderDesc }
      </textarea>
    </div>

  </div>
</div>

联系人信息/费用信息

<!--联系人信息/--> <!--费用信息-->
<c:if test="${orders.orderStatus==1}">
  <div class="panel panel-default">
    <div class="panel-heading">费用信息</div>
    <div class="row data-type">

      <div class="col-md-2 title">支付方式</div>
      <div class="col-md-4 data text">在线支付-${orders.payTypeStr}</div>

      <div class="col-md-2 title">金额</div>
      <div class="col-md-4 data text">¥${orders.product.productPrice}</div>

    </div>
  </div>
</c:if>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容

  • 一. Java基础部分.................................................
    wy_sure阅读 3,807评论 0 11
  • 人总是在真正直面死亡的时候才会深刻的体会到生命大概会是多么可贵。 2019年1月14号晚上11点,2019年才过去...
    柠檬树上结苹果阅读 430评论 0 2
  • 开学在即,学校发来的采购清单,让人看着眼晕,打印出来拿去文具店,直接请店员过目,凑齐所需种种,店员微微一笑不在话下...
    半山桃源阅读 510评论 0 2
  • 1、面向对象程序设计简介 面向对象是一种程序设计方法,或者是程序设计规范,其基本思想是使用对象、类、继承、封装、多...
    Brian512阅读 369评论 0 4