播放记录设计与开发
表设计
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>