目录

Life in Flow

知不知,尚矣;不知知,病矣。
不知不知,殆矣。

X

播放记录设计与开发

表设计

play_record

1CREATE TABLE `play_record` (
2  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
3  `user_id` int(11) DEFAULT NULL,
4  `video_id` int(11) DEFAULT NULL,
5  `current_num` int(11) DEFAULT NULL COMMENT '当前播放第几集',
6  `episode_id` int(11) DEFAULT NULL COMMENT '当前播放第几集视频id',
7  `create_time` datetime DEFAULT NULL,
8  PRIMARY KEY (`id`)
9) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

Model

 1package net.xdclass.online_xdclass.model.entity;
 2
 3import java.util.Date;
 4
 5/**
 6 * 小滴课堂  播放记录
 7 *
 8 *  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 9 *   `user_id` int(11) DEFAULT NULL,
10 *   `video_id` int(11) DEFAULT NULL,
11 *   `current_num` int(11) DEFAULT NULL COMMENT '当前播放第几集',
12 *   `episode_id` int(11) DEFAULT NULL COMMENT '当前播放第几集视频id',
13 *   `create_time` datetime DEFAULT NULL,
14 */
15public class PlayRecord {
16
17
18    private Integer id;
19
20    private Integer userId;
21
22    private Integer videoId;
23
24    private Integer currentNum;
25
26
27    private Integer episodeId;
28
29    private Date createTime;
30
31    public Integer getId() {
32        return id;
33    }
34
35    public void setId(Integer id) {
36        this.id = id;
37    }
38
39    public Integer getUserId() {
40        return userId;
41    }
42
43    public void setUserId(Integer userId) {
44        this.userId = userId;
45    }
46
47    public Integer getVideoId() {
48        return videoId;
49    }
50
51    public void setVideoId(Integer videoId) {
52        this.videoId = videoId;
53    }
54
55    public Integer getCurrentNum() {
56        return currentNum;
57    }
58
59    public void setCurrentNum(Integer currentNum) {
60        this.currentNum = currentNum;
61    }
62
63    public Integer getEpisodeId() {
64        return episodeId;
65    }
66
67    public void setEpisodeId(Integer episodeId) {
68        this.episodeId = episodeId;
69    }
70
71    public Date getCreateTime() {
72        return createTime;
73    }
74
75    public void setCreateTime(Date createTime) {
76        this.createTime = createTime;
77    }
78}
79

Mapper

查找指定 video 的第一集

interface

 1package net.xdclass.online_xdclass.mapper;
 2
 3import net.xdclass.online_xdclass.model.entity.Episode;
 4import org.apache.ibatis.annotations.Param;
 5
 6public interface EpisodeMapper {
 7
 8
 9    Episode findFirstEpisodeByVideoId(@Param("video_id") int videoId);
10
11}
12

Mapper.xml

 1<?xml version="1.0" encoding="UTF-8" ?>
 2<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 3<mapper namespace="net.xdclass.online_xdclass.mapper.EpisodeMapper">
 4
 5
 6  
 7    <select id="findFirstEpisodeByVideoId" resultType="Episode">
 8
 9        select  * from episode where video_id = #{video_id} and num = 1
10
11    </select>
12
13</mapper>

interface

 1package net.xdclass.online_xdclass.mapper;
 2
 3import net.xdclass.online_xdclass.model.entity.Episode;
 4import net.xdclass.online_xdclass.model.entity.PlayRecord;
 5import org.apache.ibatis.annotations.Param;
 6
 7public interface PlayRecordMapper {
 8
 9
10    int saveRecord(PlayRecord playRecord);
11
12}
13
14

Mapper.xml

 1<?xml version="1.0" encoding="UTF-8" ?>
 2<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 3<mapper namespace="net.xdclass.online_xdclass.mapper.PlayRecordMapper">
 4
 5
 6
 7    <insert id="saveRecord" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
 8
 9
10          INSERT INTO `play_record` ( `user_id`, `video_id`, `current_num`, `episode_id`, `create_time`)
11          VALUES (#{userId},#{videoId},#{currentNum},#{episodeId},#{createTime});
12
13    </insert>
14
15</mapper>

整合用户下单接口

 1package net.xdclass.online_xdclass.service.impl;
 2
 3import net.xdclass.online_xdclass.exception.XDException;
 4import net.xdclass.online_xdclass.mapper.*;
 5import net.xdclass.online_xdclass.model.entity.Episode;
 6import net.xdclass.online_xdclass.model.entity.PlayRecord;
 7import net.xdclass.online_xdclass.model.entity.Video;
 8import net.xdclass.online_xdclass.model.entity.VideoOrder;
 9import net.xdclass.online_xdclass.model.request.VideoOrderRequest;
10import net.xdclass.online_xdclass.service.VideoOrderService;
11import net.xdclass.online_xdclass.service.VideoService;
12import org.springframework.beans.factory.annotation.Autowired;
13import org.springframework.stereotype.Service;
14
15import java.util.Date;
16import java.util.UUID;
17
18
19@Service
20public class VideoOrderServiceImpl implements VideoOrderService {
21
22
23    @Autowired
24    private VideoOrderMapper videoOrderMapper;
25
26
27
28    @Autowired
29    private VideoMapper videoMapper;
30
31
32    @Autowired
33    private EpisodeMapper episodeMapper;
34
35
36    @Autowired
37    private PlayRecordMapper playRecordMapper;
38
39
40    /**
41     * 下单操作
42     * 未来版本:优惠券抵扣,风控用户检查,生成订单基础信息,生成支付信息
43     * @param userId
44     * @param videoId
45     * @return
46     */
47    @Override
48    public int save(int userId, int videoId) {
49
50        //判断是否已经购买
51        VideoOrder videoOrder = videoOrderMapper.findByUserIdAndVideoIdAndState(userId,videoId,1);
52
53        if(videoOrder!=null){return  0;}
54
55        Video video = videoMapper.findById(videoId);
56
57        VideoOrder newVideoOrder = new VideoOrder();
58        newVideoOrder.setCreateTime(new Date());
59        newVideoOrder.setOutTradeNo(UUID.randomUUID().toString());
60        newVideoOrder.setState(1);
61        newVideoOrder.setTotalFee(video.getPrice());
62        newVideoOrder.setUserId(userId);
63
64        newVideoOrder.setVideoId(videoId);
65        newVideoOrder.setVideoImg(video.getCoverImg());
66        newVideoOrder.setVideoTitle(video.getTitle());
67
68        int rows = videoOrderMapper.saveOrder(newVideoOrder);
69
70
71
72        //生成播放记录
73        if(rows == 1){
74            Episode episode = episodeMapper.findFirstEpisodeByVideoId(videoId);
75            if(episode == null){
76                throw  new XDException(-1,"视频没有集信息,请运营人员检查");
77            }
78            PlayRecord playRecord = new PlayRecord();
79            playRecord.setCreateTime(new Date());
80            playRecord.setEpisodeId(episode.getId());
81            playRecord.setCurrentNum(episode.getNum());
82            playRecord.setUserId(userId);
83            playRecord.setVideoId(videoId);
84            playRecordMapper.saveRecord(playRecord);
85        }
86
87        return rows;
88    }
89}
90

测试

 1http://localhost:8081/api/v1/pri/order/save
 2
 3POST  Body-raw-JSON
 4
 5{
 6    "video_id":40
 7}
 8
 9Headers
10
11token
12xdclasseyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ4ZGNsYXNzIiwiaGVhZF9pbWciOiJodHRwczovL3hkLXZpZGVvLXBjLWltZy5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20veGRjbGFzc19wcm8vZGVmYXVsdC9oZWFkX2ltZy8xNS5qcGVnIiwiaWQiOjgsIm5hbWUiOiJhbGljZSIsImlhdCI6MTYxMDUwMzM5NSwiZXhwIjoxNjExMTA4MTk1fQ.Hru8k9bwXd32t2iQX-6br_30M-HwiYKVerfChv_Recw

播放记录和下单整合,开启事务控制

启动类 @EnableTransactionManagement

 1@SpringBootApplication
 2@MapperScan("net.xdclass.online_xdclass.mapper")
 3@EnableTransactionManagement
 4public class OnlineXdclassApplication {
 5
 6	public static void main(String[] args) {
 7		SpringApplication.run(OnlineXdclassApplication.class, args);
 8	}
 9
10}

业务类,或者业务方法 @Transactional

 1package net.xdclass.online_xdclass.service.impl;
 2
 3import net.xdclass.online_xdclass.exception.XDException;
 4import net.xdclass.online_xdclass.mapper.*;
 5import net.xdclass.online_xdclass.model.entity.Episode;
 6import net.xdclass.online_xdclass.model.entity.PlayRecord;
 7import net.xdclass.online_xdclass.model.entity.Video;
 8import net.xdclass.online_xdclass.model.entity.VideoOrder;
 9import net.xdclass.online_xdclass.model.request.VideoOrderRequest;
10import net.xdclass.online_xdclass.service.VideoOrderService;
11import net.xdclass.online_xdclass.service.VideoService;
12import org.springframework.beans.factory.annotation.Autowired;
13import org.springframework.stereotype.Service;
14import org.springframework.transaction.annotation.Transactional;
15
16import java.util.Date;
17import java.util.UUID;
18
19
20@Service
21
22public class VideoOrderServiceImpl implements VideoOrderService {
23
24
25    @Autowired
26    private VideoOrderMapper videoOrderMapper;
27
28
29
30    @Autowired
31    private VideoMapper videoMapper;
32
33
34    @Autowired
35    private EpisodeMapper episodeMapper;
36
37
38    @Autowired
39    private PlayRecordMapper playRecordMapper;
40
41
42    /**
43     * 下单操作
44     * 未来版本:优惠券抵扣,风控用户检查,生成订单基础信息,生成支付信息
45     * @param userId
46     * @param videoId
47     * @return
48     */
49    @Override
50    @Transactional
51    public int save(int userId, int videoId) {
52
53        //判断是否已经购买
54        VideoOrder videoOrder = videoOrderMapper.findByUserIdAndVideoIdAndState(userId,videoId,1);
55
56        if(videoOrder!=null){return  0;}
57
58        Video video = videoMapper.findById(videoId);
59
60        VideoOrder newVideoOrder = new VideoOrder();
61        newVideoOrder.setCreateTime(new Date());
62        newVideoOrder.setOutTradeNo(UUID.randomUUID().toString());
63        newVideoOrder.setState(1);
64        newVideoOrder.setTotalFee(video.getPrice());
65        newVideoOrder.setUserId(userId);
66
67        newVideoOrder.setVideoId(videoId);
68        newVideoOrder.setVideoImg(video.getCoverImg());
69        newVideoOrder.setVideoTitle(video.getTitle());
70
71        int rows = videoOrderMapper.saveOrder(newVideoOrder);
72
73
74
75        //生成播放记录
76        if(rows == 1){
77            Episode episode = episodeMapper.findFirstEpisodeByVideoId(videoId);
78            if(episode == null){
79                throw  new XDException(-1,"视频没有集信息,请运营人员检查");
80            }
81            PlayRecord playRecord = new PlayRecord();
82            playRecord.setCreateTime(new Date());
83            playRecord.setEpisodeId(episode.getId());
84            playRecord.setCurrentNum(episode.getNum());
85            playRecord.setUserId(userId);
86            playRecord.setVideoId(videoId);
87            playRecordMapper.saveRecord(playRecord);
88        }
89
90        return rows;
91    }
92}
93

订单列表接口

 1   /**
 2     * 订单列表
 3     * @param request
 4     * @return
 5     */
 6    @GetMapping("list")
 7    public JsonData listOrder(HttpServletRequest request){
 8        Integer userId = (Integer) request.getAttribute("user_id");
 9
10        List<VideoOrder> videoOrderList = videoOrderService.listOrderByUserId(userId);
11
12        return JsonData.buildSuccess(videoOrderList);
13
14    }
15  
16  
17  
18    <select id="listOrderByUserId" resultType="VideoOrder">
19
20        select * from video_order where user_id=#{user_id} order by create_time desc
21
22    </select>

作者:Soulboy