1.数据库设计
order(订单表)
| 字段名 | 含义 | 类型 |
|---|---|---|
| id | 主键(自增) | bigint |
| order_id | 订单唯一id | varchar |
| create_time | 创建时间 | datetime |
| price | 金额 | decimal |
| schedule_id | 场次唯一id | varchar |
| seat_num | 座位数量 | int |
| seat | 具体座位 | varchar |
| user_id | 用户唯一id | varchar |
购票下单的逻辑将影⽚ 场次 座位 ⾦额等等 存入订单表中 构成⼀笔订单
加载选座购票的逻辑
1)根据场次id找到放映厅id,渲染出座位分布情况
2)再根据订单表中的场次id、卖出座位情况将卖出座位设为不可选(更新座位展示详情)
对应的实现方式有两种:
1)直接在服务端将 不售卖的座位和已卖出的座位 处理好,然后全部返回给页面
2)先将座位信息初始化返回,通过异步的方式(ajax)获取已卖出的座位,再进行渲染
注意事项:
当使⽤generator时,如果执⾏两次,且设置的是对之前的代码进⾏覆盖,BaseResultMap会⽣成两份,此时要删除重新⽣成。
当使⽤generator⽣成代码时,如果表名是关键字,如‘order’,需要⽤转义字符引起来,不然sql执⾏会报错。
当新增数据时,表的主键id不要设置,执⾏insert⽅法,主键会⾃⼰⾃增。
重要的知识点:
1、session和cookie的区别
2、分布式session的概念
解决⽅案:session复制、粘性session、session共享 
OrderController
package com.duyi.controller;import com.duyi.entity.Order;import com.duyi.service.OrderService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import java.math.BigDecimal;import java.util.List;@Controllerpublic class OrderController {@Autowiredprivate OrderService orderService;@RequestMapping("buy")@ResponseBodypublic int buyTicket(String scheduleId,int cnt,String seatStr,BigDecimal onePrice){//如果传入的参数过多,可以通过创建一个类来接收//public String buyTicket(OrderVo orderVo)return orderService.addOrder(scheduleId, cnt, seatStr,onePrice);}@RequestMapping("sold")@ResponseBodypublic List<String> sold(String scheduleId){List<String> seats= orderService.sold(scheduleId);return seats;}}
OrderService
package com.duyi.service;import com.duyi.dao.OrderMapper;import com.duyi.entity.Order;import com.duyi.util.RandomUtil;import com.google.gson.Gson;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.math.BigDecimal;import java.util.ArrayList;import java.util.List;@Servicepublic class OrderService {@Autowiredprivate OrderMapper orderMapper;public int addOrder(String scheduleId, int cnt, String seatStr, BigDecimal onePrice) {Order order = new Order();//生成id的随机算法order.setOrderId(RandomUtil.getRandomString(10));order.setScheduleId(scheduleId);order.setSeatNum(cnt);order.setPrice(new BigDecimal(cnt).multiply(onePrice));//假设每排不超过9个座位String[] seats = seatStr.split("-");String seat = seats[0];List<String> seatList = new ArrayList<>();for (int i = 1; i < seats.length - 1; i++) {seat += "-" + seats[i].substring(0, 1);seatList.add(seat);seat = seats[i].substring(1);}seat += "-" + seats[seats.length - 1];seatList.add(seat);order.setSeat(new Gson().toJson(seatList));return orderMapper.insert(order);}public List<String> sold(String scheduleId) {List<Order> orderList = orderMapper.getSeatsByScheduleId(scheduleId);List<String> seats=new ArrayList<>();for (Order order : orderList) {List<String> seatList=new Gson().fromJson(order.getSeat(),List.class);for (String seat:seatList){seats.add(seat);}}return seats;}}
OrderMapper.java(用到的)
int insert(Order record);List<Order> getSeatsByScheduleId(String scheduleId);
seat.jsp(部分)
$("#gou").click(function () {$.ajax({type: "post",url:"buy",data:{scheduleId: ${detailVo.scheduleId},cnt:cnt,seatStr:$(".seatInfo").text(),onePrice:${detailVo.price}},dataType:"json",success:function (data) {if(data==1){alert("成功购买"+cnt+"张票");}else {alert("购买失败");}//应该刷新当前选座页面window.location.reload();}});})$().ready(function () {$.ajax({type: "get",url: "sold",data: {scheduleId: ${detailVo.scheduleId}},dataType: "json",success: function (data) {$.each(data, function (index, info) {var i = 81;for (var a = 0; a < i; a++) {if ($("#font font font").eq(a).text() == info) {$("#font font font").eq(a).parent().addClass("soldTicket");}}});}});});
