buyer-api/src/main/java/cn/lili/controller/lmk/MySubscribeController.java
New file @@ -0,0 +1,46 @@ package cn.lili.controller.lmk; import cn.lili.base.Result; import cn.lili.modules.lmk.domain.query.MySubscribeQuery; import cn.lili.modules.lmk.service.MySubscribeService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; /** * 我的关注 前端控制器 * * @author xp * @since 2025-05-27 */ @Validated @RequiredArgsConstructor @Api(value = "我的关注", tags = "我的关注管理") @RestController @RequestMapping("/buyer/lmk/my-subscribe") public class MySubscribeController { private final MySubscribeService mySubscribeService; @PostMapping("/subscribe/{userId}") @ApiOperation(value = "关注", notes = "关注") public Result subscribe(@PathVariable("userId") @ApiParam("被关注的用户id") String userId) { return mySubscribeService.subscribe(userId); } @PostMapping("/unSubscribe/{userId}") @ApiOperation(value = "取消关注", notes = "取消关注") public Result unSubscribe(@PathVariable("userId") @ApiParam("被取消关注的用户id") String userId) { return mySubscribeService.unSubscribe(userId); } @GetMapping("/page") @ApiOperation(value = "分页", notes = "分页") public Result page(MySubscribeQuery query) { return mySubscribeService.page(query); } } framework/src/main/java/cn/lili/modules/lmk/domain/entity/MySubscribe.java
New file @@ -0,0 +1,30 @@ package cn.lili.modules.lmk.domain.entity; import cn.lili.mybatis.BaseEntity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import lombok.Data; /** * 我的关注 * * @author xp * @since 2025-05-27 */ @Data @TableName("lmk_my_subscribe") public class MySubscribe extends BaseEntity { private static final long serialVersionUID = 1L; @TableField("user_id") /** 用户id */ private String userId; @TableField("subscribe_user_id") /** 关注用户id */ private String subscribeUserId; } framework/src/main/java/cn/lili/modules/lmk/domain/query/MySubscribeQuery.java
New file @@ -0,0 +1,26 @@ package cn.lili.modules.lmk.domain.query; import cn.lili.base.AbsQuery; import java.util.List; import org.springframework.lang.NonNull; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * 我的关注查询 * * @author xp * @since 2025-05-27 */ @Data @ApiModel(value = "MySubscribe查询参数", description = "我的关注查询参数") public class MySubscribeQuery extends AbsQuery { @ApiModelProperty(hidden = true) private String userId; } framework/src/main/java/cn/lili/modules/lmk/domain/vo/MySubscribeVO.java
New file @@ -0,0 +1,36 @@ package cn.lili.modules.lmk.domain.vo; import cn.lili.base.AbsVo; import cn.lili.modules.lmk.domain.entity.MySubscribe; import java.util.List; import org.springframework.lang.NonNull; import org.springframework.beans.BeanUtils; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; /** * 我的关注展示 * * @author xp * @since 2025-05-27 */ @Data @ApiModel(value = "我的关注响应数据", description = "我的关注响应数据") public class MySubscribeVO extends AbsVo { /** 关注用户id */ @ApiModelProperty("关注的用户id") private String subscribeUserId; @ApiModelProperty("关注的用户昵称") private String subscribeUserNickname; @ApiModelProperty("关注的用户头像") private String subscribeUserAvatar; @ApiModelProperty("关注的用户粉丝") private Long fansNum; } framework/src/main/java/cn/lili/modules/lmk/domain/vo/WxVideoVO.java
@@ -25,8 +25,13 @@ @ApiModelProperty("作者id") private String authorId; private String authorName; @ApiModelProperty("作者头像") private String authorAvatar; @ApiModelProperty("是否关注了这个作者") private Boolean subscribeThisAuthor; /** 图片封面 */ @ApiModelProperty("图片封面") private String coverUrl; framework/src/main/java/cn/lili/modules/lmk/mapper/MySubscribeMapper.java
New file @@ -0,0 +1,41 @@ package cn.lili.modules.lmk.mapper; import cn.lili.modules.lmk.domain.entity.MySubscribe; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import cn.lili.modules.lmk.domain.vo.MySubscribeVO; import cn.lili.modules.lmk.domain.query.MySubscribeQuery; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; /** * 我的关注 Mapper 接口 * * @author xp * @since 2025-05-27 */ @Mapper public interface MySubscribeMapper extends BaseMapper<MySubscribe> { /** * id查找我的关注 * @param id * @return */ MySubscribeVO getById(String id); /** * 分页 */ IPage getPage(IPage page, @Param("query") MySubscribeQuery query); /** * 查询我关注的用户 * * @param userId * @return */ List<String> getSubscribesByUserId(@Param("userId") String userId); } framework/src/main/java/cn/lili/modules/lmk/service/MySubscribeService.java
New file @@ -0,0 +1,50 @@ package cn.lili.modules.lmk.service; import cn.lili.modules.lmk.domain.entity.MySubscribe; import cn.lili.modules.lmk.domain.vo.SimpleMyCollectVO; import com.baomidou.mybatisplus.extension.service.IService; import cn.lili.base.Result; import cn.lili.modules.lmk.domain.query.MySubscribeQuery; import java.util.List; import java.util.Map; /** * 我的关注 服务类 * * @author xp * @since 2025-05-27 */ public interface MySubscribeService extends IService<MySubscribe> { /** * 分页查询 * @param query * @return */ Result page(MySubscribeQuery query); /** * 关注 * * @param userId 被关注的人 * @return */ Result subscribe(String userId); /** * 取消关注 * * @param userId 取消谁的关注 * @return */ Result unSubscribe(String userId); /** * 获取我关注的用户ids * * @param userId * @return */ List<String> getSubscribesByUserId(String userId); } framework/src/main/java/cn/lili/modules/lmk/service/impl/MySubscribeServiceImpl.java
New file @@ -0,0 +1,73 @@ package cn.lili.modules.lmk.service.impl; import cn.lili.common.security.context.UserContext; import com.baomidou.mybatisplus.core.metadata.IPage; import cn.lili.modules.lmk.domain.entity.MySubscribe; import cn.lili.modules.lmk.mapper.MySubscribeMapper; import cn.lili.modules.lmk.service.MySubscribeService; import cn.lili.base.Result; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import cn.lili.modules.lmk.domain.vo.MySubscribeVO; import cn.lili.modules.lmk.domain.query.MySubscribeQuery; import org.springframework.stereotype.Service; import lombok.RequiredArgsConstructor; import cn.lili.utils.PageUtil; import java.util.List; /** * 我的关注 服务实现类 * * @author xp * @since 2025-05-27 */ @Service @RequiredArgsConstructor public class MySubscribeServiceImpl extends ServiceImpl<MySubscribeMapper, MySubscribe> implements MySubscribeService { private final MySubscribeMapper mySubscribeMapper; /** * 分页查询 * @param query * @return */ @Override public Result page(MySubscribeQuery query) { query.setUserId(UserContext.getCurrentUserId()); IPage<MySubscribeVO> page = PageUtil.getPage(query, MySubscribeVO.class); baseMapper.getPage(page, query); return Result.ok().data(page.getRecords()).total(page.getTotal()); } @Override public Result subscribe(String userId) { boolean exists = new LambdaQueryChainWrapper<>(baseMapper) .eq(MySubscribe::getSubscribeUserId, userId) .eq(MySubscribe::getUserId, UserContext.getCurrentUserId()) .exists(); if (!exists) { MySubscribe mySubscribe = new MySubscribe(); mySubscribe.setUserId(UserContext.getCurrentUserId()); mySubscribe.setSubscribeUserId(userId); baseMapper.insert(mySubscribe); } return Result.ok().data("关注成功"); } @Override public Result unSubscribe(String userId) { new LambdaUpdateChainWrapper<>(baseMapper) .eq(MySubscribe::getUserId, UserContext.getCurrentUserId()) .eq(MySubscribe::getSubscribeUserId, userId) .remove(); return Result.ok().data("已取消关注"); } @Override public List<String> getSubscribesByUserId(String userId) { return baseMapper.getSubscribesByUserId(userId); } } framework/src/main/java/cn/lili/modules/lmk/service/impl/VideoServiceImpl.java
@@ -54,6 +54,7 @@ private final MyCollectService myCollectService; private final COSUtil cosUtil; private final FootprintService footprintService; private final MySubscribeService mySubscribeService; /** * 添加 @@ -270,12 +271,14 @@ Map<String, List<SimpleMyCollectVO>> collectMap =myCollectService.getCollectsByVideoIds(videoIds) .stream() .collect(Collectors.groupingBy(SimpleMyCollectVO::getRefId)); // 3. 获取视频临时访问地址、设置视频标签、我是否收藏 List<String> subscribes = mySubscribeService.getSubscribesByUserId(UserContext.getCurrentUserId()); // 3. 获取视频临时访问地址、设置视频标签、我是否收藏、作者是否关注 page.getRecords().forEach(v -> { 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.setSubscribeThisAuthor(subscribes.contains(v.getAuthorId())); }); } return Result.ok().data(page.getRecords()); framework/src/main/resources/mapper/lmk/MySubscribeMapper.xml
New file @@ -0,0 +1,50 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cn.lili.modules.lmk.mapper.MySubscribeMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="cn.lili.modules.lmk.domain.vo.MySubscribeVO"> <id column="id" property="id"/> <result column="subscribe_user_id" property="subscribeUserId" /> <result column="nick_name" property="subscribeUserNickname" /> <result column="face" property="subscribeUserAvatar" /> <result column="fans_num" property="fansNum" /> </resultMap> <select id="getById" resultMap="BaseResultMap"> SELECT LMS.user_id, LMS.subscribe_user_id, LMS.id FROM lmk_my_subscribe LMS WHERE LMS.id = #{id} AND LMS.delete_flag = 0 </select> <select id="getPage" resultMap="BaseResultMap"> SELECT LMS.subscribe_user_id, LMS.id, LM.nick_name, LM.face, (SELECT COUNT(*) FROM lmk_my_subscribe WHERE subscribe_user_id = LMS.subscribe_user_id AND delete_flag = 0) as fans_num FROM lmk_my_subscribe LMS LEFT JOIN li_member LM ON LMS.subscribe_user_id = LM.id WHERE LMS.delete_flag = 0 AND LMS.user_id = #{query.userId} </select> <select id="getSubscribesByUserId" parameterType="string" resultType="string"> SELECT subscribe_user_id FROM lmk_my_subscribe WHERE user_id = #{userId} AND delete_flag = 0 </select> </mapper>