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共享
    image.png

    OrderController

    1. package com.duyi.controller;
    2. import com.duyi.entity.Order;
    3. import com.duyi.service.OrderService;
    4. import org.springframework.beans.factory.annotation.Autowired;
    5. import org.springframework.stereotype.Controller;
    6. import org.springframework.web.bind.annotation.RequestMapping;
    7. import org.springframework.web.bind.annotation.ResponseBody;
    8. import java.math.BigDecimal;
    9. import java.util.List;
    10. @Controller
    11. public class OrderController {
    12. @Autowired
    13. private OrderService orderService;
    14. @RequestMapping("buy")
    15. @ResponseBody
    16. public int buyTicket(String scheduleId,int cnt,String seatStr,BigDecimal onePrice){
    17. //如果传入的参数过多,可以通过创建一个类来接收
    18. //public String buyTicket(OrderVo orderVo)
    19. return orderService.addOrder(scheduleId, cnt, seatStr,onePrice);
    20. }
    21. @RequestMapping("sold")
    22. @ResponseBody
    23. public List<String> sold(String scheduleId){
    24. List<String> seats= orderService.sold(scheduleId);
    25. return seats;
    26. }
    27. }

    OrderService

    1. package com.duyi.service;
    2. import com.duyi.dao.OrderMapper;
    3. import com.duyi.entity.Order;
    4. import com.duyi.util.RandomUtil;
    5. import com.google.gson.Gson;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.stereotype.Service;
    8. import java.math.BigDecimal;
    9. import java.util.ArrayList;
    10. import java.util.List;
    11. @Service
    12. public class OrderService {
    13. @Autowired
    14. private OrderMapper orderMapper;
    15. public int addOrder(String scheduleId, int cnt, String seatStr, BigDecimal onePrice) {
    16. Order order = new Order();
    17. //生成id的随机算法
    18. order.setOrderId(RandomUtil.getRandomString(10));
    19. order.setScheduleId(scheduleId);
    20. order.setSeatNum(cnt);
    21. order.setPrice(new BigDecimal(cnt).multiply(onePrice));
    22. //假设每排不超过9个座位
    23. String[] seats = seatStr.split("-");
    24. String seat = seats[0];
    25. List<String> seatList = new ArrayList<>();
    26. for (int i = 1; i < seats.length - 1; i++) {
    27. seat += "-" + seats[i].substring(0, 1);
    28. seatList.add(seat);
    29. seat = seats[i].substring(1);
    30. }
    31. seat += "-" + seats[seats.length - 1];
    32. seatList.add(seat);
    33. order.setSeat(new Gson().toJson(seatList));
    34. return orderMapper.insert(order);
    35. }
    36. public List<String> sold(String scheduleId) {
    37. List<Order> orderList = orderMapper.getSeatsByScheduleId(scheduleId);
    38. List<String> seats=new ArrayList<>();
    39. for (Order order : orderList) {
    40. List<String> seatList=new Gson().fromJson(order.getSeat(),List.class);
    41. for (String seat:seatList){
    42. seats.add(seat);
    43. }
    44. }
    45. return seats;
    46. }
    47. }

    OrderMapper.java(用到的)

    1. int insert(Order record);
    2. List<Order> getSeatsByScheduleId(String scheduleId);

    seat.jsp(部分)

    1. $("#gou").click(function () {
    2. $.ajax({
    3. type: "post",
    4. url:"buy",
    5. data:{
    6. scheduleId: ${detailVo.scheduleId},
    7. cnt:cnt,
    8. seatStr:$(".seatInfo").text(),
    9. onePrice:${detailVo.price}
    10. },
    11. dataType:"json",
    12. success:function (data) {
    13. if(data==1){
    14. alert("成功购买"+cnt+"张票");
    15. }else {
    16. alert("购买失败");
    17. }
    18. //应该刷新当前选座页面
    19. window.location.reload();
    20. }
    21. });
    22. })
    23. $().ready(function () {
    24. $.ajax({
    25. type: "get",
    26. url: "sold",
    27. data: {
    28. scheduleId: ${detailVo.scheduleId}
    29. },
    30. dataType: "json",
    31. success: function (data) {
    32. $.each(data, function (index, info) {
    33. var i = 81;
    34. for (var a = 0; a < i; a++) {
    35. if ($("#font font font").eq(a).text() == info) {
    36. $("#font font font").eq(a).parent().addClass("soldTicket");
    37. }
    38. }
    39. });
    40. }
    41. });
    42. });