easylive项目学习---个人中心视频列表

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 直接查询所有视频 这段代码必须留着 如果排除会导致:

  1. 会导致重复显示:已经在系列中的视频会再次出现在查询结果中
  2. 用户体验差:用户会看到重复的内容
  3. 逻辑不清晰:无法区分哪些视频已经在系列中,哪些是新视频

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)

使用场景:
 

  1. 用户进入"我的视频系列"页面时
  2. 前端调用此接口获取所有系列及其视频
  3. 前端按返回顺序展示系列列表
  4. 点击某个系列时,直接使用返回的视频列表展示内容

直接查询非常简单不再赘述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值