src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java
@@ -1,6 +1,7 @@ package cc.mrbird.febs.common.configure; import cc.mrbird.febs.common.interceptor.LoginInterceptor; import cc.mrbird.febs.common.interceptor.VideoInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; @@ -16,5 +17,8 @@ registration.excludePathPatterns("/api/video/**"); registration.excludePathPatterns("/api/member/vipCostInfo"); registration.excludePathPatterns("/api/member/appVersion"); InterceptorRegistration registration1 = registry.addInterceptor(new VideoInterceptor()); registration1.addPathPatterns("/api/video/**"); } } src/main/java/cc/mrbird/febs/common/interceptor/VideoInterceptor.java
New file @@ -0,0 +1,51 @@ package cc.mrbird.febs.common.interceptor; import cc.mrbird.febs.common.utils.AppContants; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.common.utils.SpringContextUtil; import cc.mrbird.febs.video.entity.VideoMemberEntity; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.asymmetric.KeyType; import cn.hutool.crypto.asymmetric.RSA; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Slf4j public class VideoInterceptor implements HandlerInterceptor { private final RedisUtils redisUtils = SpringContextUtil.getBean(RedisUtils.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String headerToken = request.getHeader("token"); if (StrUtil.isNotBlank(headerToken)) { RSA rsa = new RSA(AppContants.PRIVATE_KEY, null); String[] tokens = StrUtil.split(rsa.decryptStr(headerToken, KeyType.PrivateKey), "_"); String token = tokens[0]; String userJsonStr = redisUtils.getString(token); if (StrUtil.isNotBlank(userJsonStr)) { VideoMemberEntity member = JSON.parseObject(userJsonStr, VideoMemberEntity.class); request.getSession().setAttribute("member", member); } } return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { HandlerInterceptor.super.afterCompletion(request, response, handler, ex); } } src/main/java/cc/mrbird/febs/video/controller/ApiVideoController.java
@@ -3,6 +3,7 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.video.dto.VideoListDto; import cc.mrbird.febs.video.service.IVideoMasterInfoService; import cc.mrbird.febs.video.vo.VideoInfoVo; import cc.mrbird.febs.video.vo.VideoListVo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -10,10 +11,7 @@ import io.swagger.annotations.ApiResponses; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.*; /** * @author wzy @@ -36,4 +34,13 @@ public FebsResponse videoInPage(@RequestBody VideoListDto videoListDto) { return new FebsResponse().success().data(this.videoMasterInfoService.findVideoList(videoListDto)); } @ApiOperation(value = "根据ID获取视频信息", notes = "根据ID获取视频信息") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = VideoInfoVo.class) }) @GetMapping(value = "/info/{videoId}") public FebsResponse videoInfo(@PathVariable("videoId") Long videoId, @RequestParam(value = "itemId", required = false) Long itemId) { return new FebsResponse().success().data(this.videoMasterInfoService.findVideoInfo(videoId, itemId)); } } src/main/java/cc/mrbird/febs/video/conversion/VideoConversion.java
New file @@ -0,0 +1,25 @@ package cc.mrbird.febs.video.conversion; import cc.mrbird.febs.video.entity.VideoMasterInfoEntity; import cc.mrbird.febs.video.entity.VideoMasterItemsEntity; import cc.mrbird.febs.video.vo.VideoInfoItemVo; import cc.mrbird.febs.video.vo.VideoInfoVo; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; import java.util.List; /** * @author wzy * @date 2021-12-16 **/ @Mapper public abstract class VideoConversion { public static final VideoConversion INSTANCE = Mappers.getMapper(VideoConversion.class); public abstract VideoInfoVo videoInfoEntityToInfoVo(VideoMasterInfoEntity videoMasterInfoEntity); public abstract VideoInfoItemVo videoItemEntityToItemVo(VideoMasterItemsEntity item); public abstract List<VideoInfoItemVo> videoItemEntitiesToItemVoes(List<VideoMasterItemsEntity> items); } src/main/java/cc/mrbird/febs/video/entity/VideoMasterItemsEntity.java
@@ -23,6 +23,8 @@ private Integer seq; private String timeLength; private Long sourceId; @TableField(exist = false) src/main/java/cc/mrbird/febs/video/mapper/VideoMasterDataMapper.java
@@ -2,6 +2,9 @@ import cc.mrbird.febs.video.entity.VideoMasterDataEntity; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; public interface VideoMasterDataMapper extends BaseMapper<VideoMasterDataEntity> { VideoMasterDataEntity selectDataByMasterId(@Param("masterId") Long masterId); } src/main/java/cc/mrbird/febs/video/mapper/VideoMasterItemsMapper.java
@@ -15,4 +15,6 @@ int deleteNotInIds(@Param("list") List<Long> list, @Param("masterId") Long masterId); // int batchInsert(@Param("list") List<VideoMasterItemsEntity> list); VideoMasterItemsEntity selectItemByVideoIdAndItemId(@Param("videoId") Long videoId, @Param("itemId") Long itemId); } src/main/java/cc/mrbird/febs/video/service/IVideoMasterInfoService.java
@@ -3,6 +3,7 @@ import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.video.dto.VideoListDto; import cc.mrbird.febs.video.entity.VideoMasterInfoEntity; import cc.mrbird.febs.video.vo.VideoInfoVo; import cc.mrbird.febs.video.vo.VideoListVo; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; @@ -22,5 +23,7 @@ void changeIsUp(Long id); List<VideoListVo> findVideoList(VideoListDto videoListDto); VideoInfoVo findVideoInfo(Long videoId, Long itemId); } src/main/java/cc/mrbird/febs/video/service/impl/VideoMasterInfoServiceImpl.java
@@ -3,16 +3,15 @@ import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.AppContants; import cc.mrbird.febs.common.utils.LoginUserUtil; import cc.mrbird.febs.video.conversion.VideoConversion; import cc.mrbird.febs.video.conversion.VideoMemberConversion; import cc.mrbird.febs.video.dto.VideoListDto; import cc.mrbird.febs.video.entity.VideoMasterDataEntity; import cc.mrbird.febs.video.entity.VideoMasterInfoEntity; import cc.mrbird.febs.video.entity.VideoMasterItemsEntity; import cc.mrbird.febs.video.entity.VideoMasterSourceEntity; import cc.mrbird.febs.video.mapper.VideoMasterDataMapper; import cc.mrbird.febs.video.mapper.VideoMasterInfoMapper; import cc.mrbird.febs.video.mapper.VideoMasterItemsMapper; import cc.mrbird.febs.video.mapper.VideoMasterSourceMapper; import cc.mrbird.febs.video.entity.*; import cc.mrbird.febs.video.mapper.*; import cc.mrbird.febs.video.service.IVideoMasterInfoService; import cc.mrbird.febs.video.vo.VideoInfoItemVo; import cc.mrbird.febs.video.vo.VideoInfoVo; import cc.mrbird.febs.video.vo.VideoListVo; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; @@ -39,6 +38,7 @@ private final VideoMasterItemsMapper videoMasterItemsMapper; private final VideoMasterSourceMapper videoMasterSourceMapper; private final VideoMasterDataMapper videoMasterDataMapper; private final VideoMemberMapper videoMemberMapper; @Override public IPage<VideoMasterInfoEntity> findInPage(VideoMasterInfoEntity info, QueryRequest request) { @@ -152,4 +152,49 @@ IPage<VideoListVo> data = this.baseMapper.selectVideoListInPage(videoListDto, page); return data.getRecords(); } @Override public VideoInfoVo findVideoInfo(Long videoId, Long itemId) { VideoMasterInfoEntity videoInfoEntity = this.baseMapper.selectEntityById(videoId); if (videoInfoEntity == null) { throw new FebsException("视频不存在"); } VideoInfoVo videoInfoVo = VideoConversion.INSTANCE.videoInfoEntityToInfoVo(videoInfoEntity); List<VideoInfoItemVo> items = VideoConversion.INSTANCE.videoItemEntitiesToItemVoes(videoInfoEntity.getItems()); videoInfoVo.setItems(items); VideoMasterDataEntity data = this.videoMasterDataMapper.selectDataByMasterId(videoInfoEntity.getId()); videoInfoVo.setPlayCnt(data.getPlayCnt()); videoInfoVo.setCollectCnt(data.getCollectCnt()); videoInfoVo.setStarCnt(data.getStarCnt()); VideoMemberEntity loginUser = LoginUserUtil.getLoginUser(); if (loginUser == null) { videoInfoVo.setNotLogin(AppContants.FLAG_INT_N); return videoInfoVo; } if (AppContants.FLAG_INT_N.equals(videoInfoEntity.getIsFree())) { VideoMemberEntity member = this.videoMemberMapper.selectById(loginUser.getId()); if (AppContants.FLAG_INT_N.equals(member.getIsVip())) { videoInfoVo.setNotVip(AppContants.FLAG_INT_N); return videoInfoVo; } } VideoMasterItemsEntity currentItem = this.videoMasterItemsMapper.selectItemByVideoIdAndItemId(videoId, itemId); if (currentItem == null) { throw new FebsException("视频不存在"); } videoInfoVo.setNotLogin(AppContants.FLAG_INT_Y); videoInfoVo.setNotVip(AppContants.FLAG_INT_Y); videoInfoVo.setSubTitle(currentItem.getName()); videoInfoVo.setVideoUrl(currentItem.getVideoUrl()); videoInfoVo.setThumb(currentItem.getThumb()); videoInfoVo.setItemId(currentItem.getId()); videoInfoVo.setTimeLength(currentItem.getTimeLength()); return videoInfoVo; } } src/main/java/cc/mrbird/febs/video/vo/VideoInfoItemVo.java
New file @@ -0,0 +1,29 @@ package cc.mrbird.febs.video.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * @author wzy * @date 2021-12-16 **/ @Data @ApiModel(value = "VideoInfoItemVo", description = "视频item返回参数类") public class VideoInfoItemVo { @ApiModelProperty(value = "itemId") private Long id; @ApiModelProperty(value = "缩略图") private String thumb; @ApiModelProperty(value = "标题") private String name; @ApiModelProperty(value = "序号") private Integer seq; @ApiModelProperty(value = "时长") private String timeLength; } src/main/java/cc/mrbird/febs/video/vo/VideoInfoVo.java
New file @@ -0,0 +1,55 @@ package cc.mrbird.febs.video.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; /** * @author wzy * @date 2021-12-16 **/ @Data @ApiModel(value = "VideoInfoVo", description = "视频信息返回参数类") public class VideoInfoVo { @ApiModelProperty(value = "标题") private String title; @ApiModelProperty(value = "简介") private String intro; @ApiModelProperty(value = "当前播放视频标题") private String subTitle; @ApiModelProperty(value = "当前播放视频链接") private String videoUrl; @ApiModelProperty(value = "当前播放视频缩略图") private String thumb; @ApiModelProperty(value = "当前播放视频时长") private String timeLength; @ApiModelProperty(value = "当前播放itemid") private Long itemId; @ApiModelProperty(value = "1-已登录 2-未登录") private Integer notLogin; @ApiModelProperty(value = "1-是vip 2-非vip") private Integer notVip; @ApiModelProperty(value = "点赞数量") private int starCnt; @ApiModelProperty(value = "收藏量") private int collectCnt; @ApiModelProperty(value = "播放量") private int playCnt; @ApiModelProperty(value = "视频剧集") private List<VideoInfoItemVo> items; } src/main/resources/mapper/video/VideoMasterDataMapper.xml
@@ -2,4 +2,8 @@ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cc.mrbird.febs.video.mapper.VideoMasterDataMapper"> <select id="selectDataByMasterId" resultType="cc.mrbird.febs.video.entity.VideoMasterDataEntity"> select * from video_master_data where master_id=#{masterId} </select> </mapper> src/main/resources/mapper/video/VideoMasterInfoMapper.xml
@@ -32,6 +32,8 @@ <result property="thumb" column="item_thumb" /> <result property="sourceId" column="source_id" /> <result property="sourceName" column="sourceName" /> <result property="timeLength" column="item_time_length" /> <result property="seq" column="seq" /> </collection> </resultMap> @@ -42,6 +44,8 @@ b.name, b.thumb item_thumb, b.source_id, b.time_length item_time_length, b.seq, c.name sourceName from video_master_info a, video_master_items b, video_master_source c where a.id=b.master_id and a.id=#{id} and b.source_id=c.id src/main/resources/mapper/video/VideoMasterItemsMapper.xml
@@ -43,4 +43,14 @@ <!-- )--> <!-- </foreach>--> <!-- </insert>--> <select id="selectItemByVideoIdAndItemId" resultType="cc.mrbird.febs.video.entity.VideoMasterItemsEntity"> select * from video_master_items where master_id=#{videoId} <if test="itemId != null"> and id = #{itemId} </if> order by seq asc limit 1 </select> </mapper>