buyer-api/src/main/java/cn/lili/controller/lmk/VideoController.java
@@ -103,4 +103,10 @@ public Result homePageInfoEdit(@RequestBody @Validated VideoHomePageInfoForm form) { return videoService.homePageInfoEdit(form); } @GetMapping("/wx/detail/{id}") @ApiOperation(value = "小程序-获取视频详情", notes = "小程序-获取视频详情") public Result wxDetail(@PathVariable("id") String id) { return videoService.wxDetail(id); } } framework/src/main/java/cn/lili/modules/lmk/domain/query/AuthorVideoQuery.java
@@ -18,5 +18,11 @@ @ApiModelProperty("作者id") private String authorId; /** * 是否是本人查询 */ @ApiModelProperty(hidden = true) private Boolean authorSelf; } framework/src/main/java/cn/lili/modules/lmk/domain/vo/VideoOption.java
New file @@ -0,0 +1,27 @@ package cn.lili.modules.lmk.domain.vo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.RequiredArgsConstructor; /** * @author:xp * @date:2025/6/4 14:23 */ @Data @AllArgsConstructor public class VideoOption { /** * 命令标识 * */ private String command; /** * 展示值 * */ private String label; } framework/src/main/java/cn/lili/modules/lmk/domain/vo/WxEditVideoVO.java
New file @@ -0,0 +1,62 @@ package cn.lili.modules.lmk.domain.vo; import cn.lili.base.AbsVo; import cn.lili.modules.lmk.domain.entity.Video; import cn.lili.modules.lmk.domain.form.WxVideoTagForm; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.beans.BeanUtils; import org.springframework.lang.NonNull; import java.util.List; /** * 视频内容展示 * * @author xp * @since 2025-05-16 */ @Data @ApiModel(value = "视频内容响应数据", description = "视频内容响应数据") public class WxEditVideoVO extends AbsVo { /** 图片封面 */ @ApiModelProperty("图片封面") private String coverUrl; private String coverFileKey; /** 视频地址 */ @ApiModelProperty("视频地址") private String videoFileKey; private String videoUrl; @ApiModelProperty("视频标签") private List<WxVideoTagForm> tags; /** 视频填充模式 */ @ApiModelProperty("视频填充模式") private String videoFit; /** 视频标题 */ @ApiModelProperty("视频标题") private String title; /** 商品信息 */ @ApiModelProperty("商品信息") private String goodsId; @ApiModelProperty("视频长度:秒") private Long videoDuration; public static WxEditVideoVO getVoByEntity(@NonNull Video entity, WxEditVideoVO vo) { if(vo == null) { vo = new WxEditVideoVO(); } BeanUtils.copyProperties(entity, vo); return vo; } } framework/src/main/java/cn/lili/modules/lmk/domain/vo/WxVideoVO.java
@@ -68,6 +68,13 @@ @ApiModelProperty("评论数") private Long commentNum; /** 视频拥有的操作 */ @ApiModelProperty("视频支持的操作") private List<VideoOption> options; @ApiModelProperty("视频状态") private String status; public static WxVideoVO getVoByEntity(@NonNull Video entity, WxVideoVO vo) { if(vo == null) { framework/src/main/java/cn/lili/modules/lmk/enums/general/VideoSupportOpEnum.java
New file @@ -0,0 +1,72 @@ package cn.lili.modules.lmk.enums.general; import cn.lili.modules.lmk.domain.vo.VideoOption; import lombok.Getter; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * 视频支持的操作 * * @author:xp * @date:2025/5/14 10:30 */ @Getter public enum VideoSupportOpEnum { UP("UP", "发布"), DOWN("DOWN", "下架"), DELETE("DELETE", "删除"), EDIT("EDIT", "编辑"), ; private final String value; private final String desc; VideoSupportOpEnum(String value, String desc) { this.value = value; this.desc = desc; } /** * 根据视频状态获取到对应的操作 * * @param status * @return */ public static List<VideoOption> getVideoOpByStatus(String status) { if (VideoStatusEnum.AUDITING.getValue().equals(status)) { return Arrays.asList(new VideoOption(EDIT.value, EDIT.desc), new VideoOption(DELETE.value, DELETE.desc)); } else if (VideoStatusEnum.DISABLE.getValue().equals(status)) { return Arrays.asList(new VideoOption(EDIT.value, EDIT.desc), new VideoOption(UP.value, UP.desc), new VideoOption(DELETE.value, DELETE.desc)); } else if (VideoStatusEnum.PUBLISHED.getValue().equals(status)) { return Arrays.asList(new VideoOption(EDIT.value, EDIT.desc), new VideoOption(DOWN.value, DOWN.desc), new VideoOption(DELETE.value, DELETE.desc)); } else if (VideoStatusEnum.REJECT.getValue().equals(status)) { return Arrays.asList(new VideoOption(EDIT.value, EDIT.desc), new VideoOption(DELETE.value, DELETE.desc)); } return new ArrayList<>(); } /** * 获取含义 * * @param value * @return */ public static String getDescByValue(String value) { if (StringUtils.isBlank(value)) { return null; } for (VideoSupportOpEnum e : VideoSupportOpEnum.values()){ if (value.equals(e.getValue())) { return e.getDesc(); } } return null; } } framework/src/main/java/cn/lili/modules/lmk/mapper/VideoMapper.java
@@ -3,17 +3,17 @@ import cn.lili.modules.lmk.domain.entity.Video; import cn.lili.modules.lmk.domain.query.AuthorVideoQuery; import cn.lili.modules.lmk.domain.query.ManagerVideoQuery; import cn.lili.modules.lmk.domain.query.VideoQuery; import cn.lili.modules.lmk.domain.vo.CollectTypeNumVO; import cn.lili.modules.lmk.domain.vo.VideoAccountVO; import cn.lili.modules.lmk.domain.vo.WxVideoVO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import cn.lili.modules.lmk.domain.vo.VideoVO; import cn.lili.modules.lmk.domain.form.VideoForm; import cn.lili.modules.lmk.domain.query.VideoQuery; import java.util.List; import cn.lili.modules.lmk.domain.vo.WxEditVideoVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; /** * 视频内容 Mapper 接口 @@ -104,4 +104,12 @@ * @param query */ IPage getAuthorCollectVideoPage(IPage page, @Param("query") AuthorVideoQuery query); /** * 小程序-视频详情 * * @param id * @return */ WxEditVideoVO wxDetail(@Param("id") String id); } framework/src/main/java/cn/lili/modules/lmk/service/VideoService.java
@@ -175,4 +175,12 @@ * @return */ Result homePageInfoEdit(VideoHomePageInfoForm form); /** * 小程序-视频详情 * * @param id * @return */ Result wxDetail(String id); } framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoServiceImpl.java
@@ -8,6 +8,7 @@ import cn.lili.modules.lmk.domain.vo.*; import cn.lili.modules.lmk.enums.general.TagCreateTypeEnum; import cn.lili.modules.lmk.enums.general.VideoStatusEnum; import cn.lili.modules.lmk.enums.general.VideoSupportOpEnum; import cn.lili.modules.lmk.enums.general.ViewTypeEnum; import cn.lili.modules.lmk.service.*; import cn.lili.modules.member.entity.dos.FootPrint; @@ -56,6 +57,7 @@ private final MySubscribeService mySubscribeService; private final MemberService memberService; private final VideoAccountService videoAccountService; /** * 添加 @@ -130,7 +132,7 @@ Assert.notNull(vo, "记录不存在"); List<SimpleVideoTagVO> tags = videoTagRefService.getTagsByVideoIds(Arrays.asList(id)); vo.setTagList(tags); vo.setVideoUrl(cosUtil.getPreviewUrl(vo.getVideoFileKey())); // vo.setVideoUrl(cosUtil.getPreviewUrl(vo.getVideoFileKey())); return Result.ok().data(vo); } @@ -276,7 +278,7 @@ case "collect": AuthorVideoQuery query2 = new AuthorVideoQuery(); query2.setAuthorId(query.getAuthorId()); baseMapper.getAuthorVideoPage(page, query2); baseMapper.getAuthorCollectVideoPage(page, query2); break; default: break; @@ -295,7 +297,8 @@ v.setGoods(new VideoGoodsVO()); v.setTagList(tagMap.get(v.getId())); v.setCollected(CollectionUtils.isNotEmpty(collectMap.get(v.getId()))); v.setVideoUrl(cosUtil.getPreviewUrl(v.getVideoFileKey())); // v.setVideoUrl(cosUtil.getPreviewUrl(v.getVideoFileKey())); v.setVideoUrl("https://videos.pexels.com/video-files/13602965/13602965-hd_1920_1080_30fps.mp4"); v.setCoverUrl(cosUtil.getPreviewUrl(v.getCoverFileKey())); v.setSubscribeThisAuthor(subscribes.contains(v.getAuthorId())); }); @@ -352,10 +355,13 @@ @Override public Result getAuthorVideoPage(AuthorVideoQuery query) { IPage<WxVideoVO> page = PageUtil.getPage(query, WxVideoVO.class); query.setAuthorSelf(UserContext.getCurrentUserId().equals(query.getAuthorId())); baseMapper.getAuthorVideoPage(page, query); for (WxVideoVO vo : page.getRecords()) { vo.setCoverUrl(cosUtil.getPreviewUrl(vo.getCoverFileKey())); vo.setVideoUrl(cosUtil.getPreviewUrl(vo.getVideoUrl())); // vo.setVideoUrl(cosUtil.getPreviewUrl(vo.getVideoFileKey())); vo.setVideoUrl("https://videos.pexels.com/video-files/13602965/13602965-hd_1920_1080_30fps.mp4"); vo.setOptions(VideoSupportOpEnum.getVideoOpByStatus(vo.getStatus())); } return Result.ok().data(page.getRecords()).total(page.getTotal()); } @@ -366,7 +372,8 @@ baseMapper.getAuthorCollectVideoPage(page, query); for (WxVideoVO vo : page.getRecords()) { vo.setCoverUrl(cosUtil.getPreviewUrl(vo.getCoverFileKey())); vo.setVideoUrl(cosUtil.getPreviewUrl(vo.getVideoUrl())); // vo.setVideoUrl(cosUtil.getPreviewUrl(vo.getVideoFileKey())); vo.setVideoUrl("https://videos.pexels.com/video-files/13602965/13602965-hd_1920_1080_30fps.mp4"); vo.setCollected(Boolean.TRUE); } return Result.ok().data(page.getRecords()).total(page.getTotal()); @@ -386,4 +393,26 @@ .update(); return Result.ok("保存成功"); } @Override public Result wxDetail(String id) { WxEditVideoVO vo = baseMapper.wxDetail(id); if (Objects.isNull(vo)) { return Result.error("视频不存在"); } vo.setCoverUrl(cosUtil.getPreviewUrl(vo.getCoverFileKey())); // vo.setVideoUrl(cosUtil.getPreviewUrl(vo.getVideoFileKey())); vo.setVideoUrl("https://videos.pexels.com/video-files/13602965/13602965-hd_1920_1080_30fps.mp4"); List<WxVideoTagForm> tags = videoTagRefService.getTagsByVideoIds(Arrays.asList(vo.getId())) .stream() .map(i -> { WxVideoTagForm tag = new WxVideoTagForm(); tag.setTagName(i.getTagName()); tag.setId(i.getId()); return tag; }) .collect(Collectors.toList()); vo.setTags(tags); return Result.ok().data(vo); } } framework/src/main/resources/mapper/lmk/VideoMapper.xml
@@ -37,6 +37,7 @@ <result column="title" property="title" /> <result column="collect_num" property="collectNum" /> <result column="comment_num" property="commentNum" /> <result column="status" property="status" /> </resultMap> @@ -253,7 +254,11 @@ lmk_video LV LEFT JOIN li_member LM ON LV.author_id = LM.id WHERE LV.delete_flag = 0 AND LV.status = '1' AND LV.author_id = #{query.authorId} LV.delete_flag = 0 <if test="!query.authorSelf"> AND LV.status = '1' </if> AND LV.author_id = #{query.authorId} ORDER BY LV.collect_num DESC </select> @@ -290,4 +295,42 @@ LMC.create_time DESC </select> <!-- 微信视频编辑详情 --> <resultMap id="WxEditResultMap" type="cn.lili.modules.lmk.domain.vo.WxEditVideoVO"> <id column="id" property="id"/> <result column="cover_url" property="coverFileKey" /> <result column="video_file_key" property="videoFileKey" /> <result column="video_fit" property="videoFit" /> <result column="title" property="title" /> <result column="video_duration" property="videoDuration" /> <result column="goods_id" property="goodsId" /> </resultMap> <select id="wxDetail" resultMap="WxEditResultMap"> SELECT LV.author_id, LV.cover_url, LV.video_fit, LV.video_duration, LV.video_file_key, LV.title, LV.goods_id, LV.goods_view_num, LV.goods_order_num, LV.recommend, LV.status, LV.play_num, LV.comment_num, LV.collect_num, LV.weight, LV.audit_pass_time, LV.update_time, LV.id FROM lmk_video LV WHERE LV.delete_flag = 0 AND LV.id = #{id} </select> </mapper>