1.展示视频列表
参数:
public ResponseVO loadVideoSeries(@NotEmpty String userId)
此代码只有一行但是难度很大主要难度在于xml层中的表联查
相关表结构:user_video_series

user_video_series_video:

mapper:
List<T> selectUserAllSeries(@Param("userId") String userId);
xml:
<select id="selectUserAllSeries" resultMap="base_result_map">
SELECT t.*, v.video_cover cover
FROM (
SELECT s.*,
(
SELECT video_id
FROM user_video_series_video v
WHERE v.series_id = s.series_id
ORDER BY sort ASC
LIMIT 1
) AS video_id
FROM user_video_series s
WHERE s.user_id = #{userId}
) t
LEFT JOIN video_info v ON v.video_id = t.video_id order by t.sort asc;
</select>
这里十分难以理解 作者本人目前来说也很难理解 有见解的高手可以评论一下
1. user_video_series 表(视频系列主表)
作用:存储用户创建的视频系列的整体信息和元数据
- 记录每个视频系列的基本信息(名称、描述等)
- 关联到具体的用户(通过
user_id字段) - 管理不同视频系列之间的显示顺序(通过
sort字段) - 记录系列的更新时间(
update_time)
2. user_video_series_video 表(视频系列关联表)
作用:建立视频与视频系列之间的多对多关联关系
- 定义哪个视频属于哪个系列(
series_id+video_id) - 管理同一个系列内不同视频的播放顺序(通过
sort字段) - 确保视频与用户的归属关系(通过
user_id字段)
2.将视频保存成一个视频列表:
参数:
public ResponseVO saveVideoSeries(Integer seriesId,
@NotEmpty @Size(max=100) String seriesName,
@Size(max=200) String seriesDescription,
String videoIds)
实现层代码:
@Override
public void saveUserVideoSeries(UserVideoSeries bean, String videoIds) {
if (bean.getSeriesId()==null&&StringTools.isEmpty(videoIds)){
throw new BusinessException(ResponseCodeEnum.CODE_600);
}
if (bean.getSeriesId()==null){
checkVideoIds(bean.getUserId(),videoIds);
bean.setUpdateTime(new Date());
bean.setSort(this.userVideoSeriesMapper.selectMaxSort(bean.getUserId())+1);
this.userVideoSeriesMapper.insert(bean);
}else {
UserVideoSeriesQuery seriesVideoQuery = new UserVideoSeriesQuery();
seriesVideoQuery.setUserId(bean.getUserId());
seriesVideoQuery.setSeriesId(bean.getSeriesId());
this.userVideoSeriesMapper.updateByParam(bean,seriesVideoQuery);
}
}
private void checkVideoIds(String userId,String videoIds){
String[] videoIdArray=videoIds.split(",");
VideoInfoQuery videoInfoQuery=new VideoInfoQuery();
videoInfoQuery.setVideoIdArray(videoIdArray);
videoInfoQuery.setUserId(userId);
Integer count=videoInfoMapper.selectCount(videoInfoQuery);
if (videoIdArray.length!=count){
throw new BusinessException(ResponseCodeEnum.CODE_600);
}
}
思路不算难 若是bean没有系列id即是新增视频列表 验证视频是否隶属与自己 插入即可 若是有seriesId即为更新列表
3.下载所有视频:
@RequestMapping("/loadAllVideo")
public ResponseVO loadAllVideo(Integer seriesId) {
TokenUserInfoDto tokenUserInfoDto = getTokenUserInfo();
VideoInfoQuery infoQuery = new VideoInfoQuery();
if (seriesId != null) {
UserVideoSeriesVideoQuery videoSeriesVideoQuery = new UserVideoSeriesVideoQuery();
videoSeriesVideoQuery.setSeriesId(seriesId);
videoSeriesVideoQuery.setUserId(tokenUserInfoDto.getUserId());
List<UserVideoSeriesVideo> seriesVideoList = userVideoSeriesVideoService.findListByParam(videoSeriesVideoQuery);
List<String> videoIdList = seriesVideoList.stream()
.map(item -> item.getVideoId())
.collect(Collectors.toList());
infoQuery.setExcludeVideoIdArray(videoIdList.toArray(new String[videoIdList.size()]));
}
infoQuery.setUserId(tokenUserInfoDto.getUserId());
List<VideoInfo> videoInfoList = videoInfoService.findListByParam(infoQuery);
return getSuccessResponseVO(videoInfoList);
}
其中的逻辑为如果你提供了seriesId 则先查询系列中的视频 在跳出if前将查询到的视频排除 然后在查询一次系列外的视频 如果没提供seriesId不进入if 直接查询所有视频 这段代码必须留着 如果排除会导致:
- 会导致重复显示:已经在系列中的视频会再次出现在查询结果中
- 用户体验差:用户会看到重复的内容
- 逻辑不清晰:无法区分哪些视频已经在系列中,哪些是新视频
4.获取视频列表详情:
没有难度简单查询
5.保存视频到视频列表中:
参数:
public ResponseVO saveSeriesVideo(@NotNull Integer seriesId,@NotEmpty String videoIds)
实现方法参数:
this.userVideoSeriesService.saveSeriesVideo(tokenUserInfoDto.getUserId(),seriesId,videoIds);
方法实现:
public void saveSeriesVideo(String userId, Integer seriesId, String videoIds) {
UserVideoSeries userVideoSeries = getUserVideoSeriesBySeriesId(seriesId);
if (userVideoSeries == null || !userVideoSeries.getUserId().equals(userId)) {
throw new BusinessException(ResponseCodeEnum.CODE_600);
}
this.checkVideoIds(userId, videoIds);
String[] videoIdArray = videoIds.split(","); // 修正:添加了正确的分隔符参数
Integer sort = this.userVideoSeriesVideoMapper.selectMaxSort(seriesId);
List<UserVideoSeriesVideo> seriesVideoList = new ArrayList<>();
for (String videoId : videoIdArray) {
UserVideoSeriesVideo videoSeriesVideo = new UserVideoSeriesVideo();
videoSeriesVideo.setVideoId(videoId);
videoSeriesVideo.setSort(++sort);
videoSeriesVideo.setSeriesId(seriesId);
videoSeriesVideo.setUserId(userId);
seriesVideoList.add(videoSeriesVideo);
}
this.userVideoSeriesVideoMapper.insertOrUpdateBatch(seriesVideoList);
}
其中注意sort sort字段主要是用于排序 selectMaxSort用于找到视频列表中最大的sort便于让新增视频加入其中进行排序 insertOrUpdateBatch需要学习 后续会出专门的xml常用 是批量插入与更新
6.删除视频列表中的视频
很简单无需赘述 直接删除即可
7.获取某个用户的所有视频系列,并包含每个系列下的视频列表
参数:
public ResponseVO loadVideoSeriesWithVideo(@NotNull String userId)
使用场景:
- 用户进入"我的视频系列"页面时
- 前端调用此接口获取所有系列及其视频
- 前端按返回顺序展示系列列表
- 点击某个系列时,直接使用返回的视频列表展示内容
直接查询非常简单不再赘述

694

被折叠的 条评论
为什么被折叠?



