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;
@Controller
public class OrderController {
@Autowired
private OrderService orderService;
@RequestMapping("buy")
@ResponseBody
public int buyTicket(String scheduleId,int cnt,String seatStr,BigDecimal onePrice){
//如果传入的参数过多,可以通过创建一个类来接收
//public String buyTicket(OrderVo orderVo)
return orderService.addOrder(scheduleId, cnt, seatStr,onePrice);
}
@RequestMapping("sold")
@ResponseBody
public 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;
@Service
public class OrderService {
@Autowired
private 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");
}
}
});
}
});
});