From c5a76deab0d49383aa8d431eac4912b3085cccdd Mon Sep 17 00:00:00 2001 From: chengkun <2500338766@qq.com> Date: Thu, 21 Apr 2022 18:29:32 +0800 Subject: [PATCH] =?UTF-8?q?feature1.0.0:img=E6=9C=8D=E5=8A=A1=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E7=99=BB=E5=BD=95=E7=9B=B8=E5=85=B3=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/redis/service/RedisService.java | 29 +++- .../com/bnyer/img/config/TiktokConfig.java | 34 +++++ .../bnyer/img/constants/RedisKeyConstant.java | 12 +- .../bnyer/img/constants/TiktokConstant.java | 13 ++ .../TiktokCollectionController.java | 17 --- .../img/controller/TiktokMiniController.java | 57 ++++++- .../java/com/bnyer/img/domain/TiktokLike.java | 57 +++++++ .../java/com/bnyer/img/dto/CollectionDto.java | 2 - .../com/bnyer/img/dto/CollectionUserDto.java | 20 +++ .../java/com/bnyer/img/feign/TiktokFeign.java | 24 +++ .../img/mapper/TiktokCollectionMapper.java | 11 ++ .../bnyer/img/mapper/TiktokLikeMapper.java | 13 ++ .../img/service/TiktokCollectionService.java | 30 +++- .../bnyer/img/service/TiktokUserService.java | 10 +- .../impl/TiktokCollectionServiceImpl.java | 99 +++++++----- .../service/impl/TiktokImgServiceImpl.java | 31 +++- .../img/service/impl/TiktokLikeService.java | 46 ++++++ .../service/impl/TiktokLikeServiceImpl.java | 141 ++++++++++++++++++ .../service/impl/TiktokUserServiceImpl.java | 37 ++++- .../com/bnyer/img/vo/TiktokCollectionVo.java | 44 ++++++ .../com/bnyer/img/vo/TiktokSessionInfoVo.java | 29 ++++ .../img/mapper/TiktokCollectionMapper.xml | 14 ++ .../com/bnyer/img/mapper/TiktokLikeMapper.xml | 19 +++ 23 files changed, 712 insertions(+), 77 deletions(-) create mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/TiktokConfig.java create mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/TiktokConstant.java delete mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/TiktokCollectionController.java create mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/domain/TiktokLike.java create mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CollectionUserDto.java create mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/feign/TiktokFeign.java create mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/mapper/TiktokLikeMapper.java create mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/TiktokLikeService.java create mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/TiktokLikeServiceImpl.java create mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/TiktokCollectionVo.java create mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/TiktokSessionInfoVo.java create mode 100644 bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/TiktokLikeMapper.xml diff --git a/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisService.java b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisService.java index 69d5b3f..46e3515 100644 --- a/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisService.java +++ b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisService.java @@ -1,13 +1,12 @@ package com.bnyer.common.redis.service; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.time.Duration; +import java.util.*; import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.*; +import org.springframework.data.redis.core.script.DefaultRedisScript; +import org.springframework.data.redis.core.script.RedisScript; import org.springframework.stereotype.Component; /** @@ -295,7 +294,7 @@ public class RedisService * @param key 键值 * @param hashKey hash键值 */ - public boolean hasHashKey(final,String key,final String hashKey) + public boolean hasHashKey(final String key,final String hashKey) { return redisTemplate.opsForHash().hasKey(key,hashKey); } @@ -310,4 +309,22 @@ public class RedisService public Long hashIncr(final String key,final String hashKey,final long delta){ return redisTemplate.opsForHash().increment(key, hashKey,delta); } + + /** + * 加锁 + **/ + public Boolean lock(String key,String value,Long duration){ + Boolean lockStatus = this.redisTemplate.opsForValue().setIfAbsent(key,value, Duration.ofSeconds(duration)); + return lockStatus; + } + + /** + * 释放锁 + **/ + public Long releaseLock(String key,String value){ + String luaScript = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; + RedisScript redisScript = new DefaultRedisScript<>(luaScript,Long.class); + Long releaseStatus = (Long)this.redisTemplate.execute(redisScript, Collections.singletonList(key),value); + return releaseStatus; + } } diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/TiktokConfig.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/TiktokConfig.java new file mode 100644 index 0000000..5ac8bdd --- /dev/null +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/TiktokConfig.java @@ -0,0 +1,34 @@ +package com.bnyer.img.config; + +import lombok.Getter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * @author chengkun + * @date 2022/4/21 17:43 + */ +@Configuration +@ConfigurationProperties(prefix = "bnyer.img.tiktok") +@Getter +public class TiktokConfig { + + @Value("${bnyer.img.tiktok.appId}") + private String appId; + + @Value("${bnyer.img.tiktok.secret}") + public String secret; + + @Value("${bnyer.img.tiktok.sessionInfoUrl}") + public String sessionInfoUrl; + + @Value("${bnyer.img.tiktok.tokenUrl}") + public String tokenUrl; + + + + + + +} diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/RedisKeyConstant.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/RedisKeyConstant.java index faff7d8..8ad29b8 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/RedisKeyConstant.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/RedisKeyConstant.java @@ -10,10 +10,20 @@ public class RedisKeyConstant { /** * 抖音小程序用户收藏图片键 */ - public static final String TIKTOK_USER_COLLECT_KEY = "bnyer.tiktok.collect"; + public static final String TIKTOK_USER_COLLECT_KEY = "bnyer.tiktok.collect:"; /** * 抖音小程序图片收藏数量键 */ public static final String TIKTOK_IMG_COLLECT_NUM_KEY = "bnyer.tiktok.collectNum"; + + /** + * 抖音小程序用户点赞图片键 + */ + public static final String TIKTOK_USER_LIKE_KEY = "bnyer.tiktok.like"; + + /** + * 抖音小程序图片点赞数量键 + */ + public static final String TIKTOK_IMG_LIKE_NUM_KEY = "bnyer.tiktok.likeNum"; } diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/TiktokConstant.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/TiktokConstant.java new file mode 100644 index 0000000..fa3a452 --- /dev/null +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/TiktokConstant.java @@ -0,0 +1,13 @@ +package com.bnyer.img.constants; + +/** + * @author chengkun + * @date 2022/4/21 18:12 + */ +public class TiktokConstant { + + /** + * 抖音接口成功响应码 + */ + public static final String SUCCESS = "0"; +} diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/TiktokCollectionController.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/TiktokCollectionController.java deleted file mode 100644 index 0b0d459..0000000 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/TiktokCollectionController.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.bnyer.img.controller; - -import com.bnyer.common.core.web.controller.BaseController; -import com.bnyer.img.service.TiktokCollectionService; -import io.swagger.annotations.Api; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@Api("img-tiktokCollection-【后端】接口") -@RestController -@RequestMapping("/tiktokCollection") -public class TiktokCollectionController extends BaseController { - - @Autowired - private TiktokCollectionService tiktokCollectionService; -} diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/TiktokMiniController.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/TiktokMiniController.java index 65a60c9..a12decc 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/TiktokMiniController.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/TiktokMiniController.java @@ -7,6 +7,7 @@ import com.bnyer.img.domain.Feedback; import com.bnyer.img.domain.TiktokImg; import com.bnyer.img.dto.*; import com.bnyer.img.service.*; +import com.bnyer.img.service.impl.TiktokLikeService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; @@ -41,6 +42,9 @@ public class TiktokMiniController extends BaseController { @Autowired private TiktokCollectionService tiktokCollectionService; + @Autowired + private TiktokLikeService tiktokLikeService; + @ApiOperation(value="查询banner列表") @GetMapping(value = "/listBanner") public AjaxResult listBanner(){ @@ -111,11 +115,56 @@ public class TiktokMiniController extends BaseController { return AjaxResult.success(tiktokUserService.queryUserImgList()); } - @ApiOperation(value="添加收藏/取消收藏") - @PostMapping(value = "/collect") - public AjaxResult insert(@Validated @RequestBody @ApiParam("收藏对象") CollectionDto dto){ - log.debug("添加收藏/取消收藏参数为:{}", JSON.toJSONString(dto)); + @ApiOperation(value="收藏") + @PostMapping(value = "/tiktokCollect") + public AjaxResult tiktokCollect(@Validated @RequestBody @ApiParam("收藏对象") CollectionDto dto){ + log.debug("收藏参数为:{}", JSON.toJSONString(dto)); tiktokCollectionService.collect(dto.getUserId(),dto.getImgId()); return AjaxResult.success(); } + + @ApiOperation(value="取消收藏") + @PostMapping(value = "/tiktokUnCollect") + public AjaxResult tiktokUnCollect(@Validated @RequestBody @ApiParam("收藏对象") CollectionDto dto){ + log.debug("取消收藏参数为:{}", JSON.toJSONString(dto)); + tiktokCollectionService.unCollect(dto.getUserId(),dto.getImgId()); + return AjaxResult.success(); + } + + @ApiOperation(value="查询是否收藏过") + @PostMapping(value = "/judgeTiktokCollect") + public AjaxResult judgeTiktokCollect(@Validated @RequestBody @ApiParam("收藏对象") CollectionDto dto){ + log.debug("查询是否收藏过参数为:{}", JSON.toJSONString(dto)); + return AjaxResult.success(tiktokCollectionService.judgeCollect(dto.getUserId(),dto.getImgId())); + } + + @ApiOperation(value="查看用户收藏列表") + @PostMapping(value = "/listTiktokCollection") + public AjaxResult listTiktokCollection(@Validated @RequestBody @ApiParam("用户收藏对象") CollectionUserDto dto){ + log.debug("查看用户收藏列表参数为:{}", JSON.toJSONString(dto)); + return AjaxResult.success(tiktokCollectionService.getCollectionByUserId(dto.getUserId())); + } + + @ApiOperation(value="点赞") + @PostMapping(value = "/tiktokLike") + public AjaxResult tiktokLike(@Validated @RequestBody @ApiParam("点赞对象") CollectionDto dto){ + log.debug("点赞参数为:{}", JSON.toJSONString(dto)); + tiktokLikeService.like(dto.getUserId(),dto.getImgId()); + return AjaxResult.success(); + } + + @ApiOperation(value="取消点赞") + @PostMapping(value = "/tiktokUnLike") + public AjaxResult tiktokUnLike(@Validated @RequestBody @ApiParam("点赞对象") CollectionDto dto){ + log.debug("取消点赞参数为:{}", JSON.toJSONString(dto)); + tiktokLikeService.unLike(dto.getUserId(),dto.getImgId()); + return AjaxResult.success(); + } + + @ApiOperation(value="查询是否点赞过") + @PostMapping(value = "/judgeTiktokLike") + public AjaxResult judgeTiktokLike(@Validated @RequestBody @ApiParam("点赞对象") CollectionDto dto){ + log.debug("查询是否点赞过参数为:{}", JSON.toJSONString(dto)); + return AjaxResult.success(tiktokLikeService.judgeLike(dto.getUserId(),dto.getImgId())); + } } diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/domain/TiktokLike.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/domain/TiktokLike.java new file mode 100644 index 0000000..34a0a34 --- /dev/null +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/domain/TiktokLike.java @@ -0,0 +1,57 @@ +package com.bnyer.img.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import java.io.Serializable; + +/** + * @author chengkun + * @date 2022/4/21 9:50 + */ +/** + * img平台点赞表 + */ +@ApiModel(value="com-bnyer-img-domain-TiktokLike") +@Getter +@Setter +@ToString +@AllArgsConstructor +@NoArgsConstructor +@TableName(value = "img_tiktok_like") +public class TiktokLike extends BaseDomain { + /** + * 主键 + */ + @TableId(value = "id", type = IdType.AUTO) + @ApiModelProperty(value="主键") + private Long id; + + /** + * 用户id + */ + @TableField(value = "user_id") + @ApiModelProperty(value="用户id") + private Long userId; + + /** + * 图片id + */ + @TableField(value = "img_id") + @ApiModelProperty(value="图片id") + private Long imgId; + + /** + * 是否显示 (0->隐藏;1->显示) + */ + @TableField(value = "is_show") + @ApiModelProperty(value="是否显示 (0->隐藏;1->显示)") + private String isShow; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CollectionDto.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CollectionDto.java index 0f53257..f0499ec 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CollectionDto.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CollectionDto.java @@ -1,7 +1,5 @@ package com.bnyer.img.dto; -import com.bnyer.common.core.utils.bean.BeanUtils; -import com.bnyer.img.domain.Banner; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CollectionUserDto.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CollectionUserDto.java new file mode 100644 index 0000000..54b13b1 --- /dev/null +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CollectionUserDto.java @@ -0,0 +1,20 @@ +package com.bnyer.img.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + + +@Getter +@Setter +@ApiModel("用户收藏接收类") +public class CollectionUserDto implements Serializable { + + @NotNull(message = "用户id不能为空!") + @ApiModelProperty(value="用户id") + private Long userId; +} diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/feign/TiktokFeign.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/feign/TiktokFeign.java new file mode 100644 index 0000000..d58a43c --- /dev/null +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/feign/TiktokFeign.java @@ -0,0 +1,24 @@ +package com.bnyer.img.feign; + +import com.alibaba.fastjson.JSONObject; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.Map; + +/** + * @author chengkun + * @date 2022/4/21 18:04 + */ +@FeignClient(name = "tiktok-service", url = "${bnyer.img.tiktok.sessionInfoUrl}") +public interface TiktokFeign { + + /** + * 获取抖音sessionInfo + * @param params 授权参数 + * @return - + */ + @GetMapping("/cash_account/total") + JSONObject getSessionInfo(@RequestParam Map params); +} diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/mapper/TiktokCollectionMapper.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/mapper/TiktokCollectionMapper.java index 27fdc98..14119b3 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/mapper/TiktokCollectionMapper.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/mapper/TiktokCollectionMapper.java @@ -2,8 +2,19 @@ package com.bnyer.img.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.bnyer.img.domain.TiktokCollection; +import com.bnyer.img.vo.TiktokCollectionVo; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; @Mapper public interface TiktokCollectionMapper extends BaseMapper { + + /** + * 查询用户收藏列表 + * @param userId 用户Id + * @return - + */ + List getCollectionByUserId(@Param("userId") Long userId); } \ No newline at end of file diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/mapper/TiktokLikeMapper.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/mapper/TiktokLikeMapper.java new file mode 100644 index 0000000..f7b28f3 --- /dev/null +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/mapper/TiktokLikeMapper.java @@ -0,0 +1,13 @@ +package com.bnyer.img.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bnyer.img.domain.TiktokLike; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author chengkun + * @date 2022/4/21 9:50 + */ +@Mapper +public interface TiktokLikeMapper extends BaseMapper { +} \ No newline at end of file diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/TiktokCollectionService.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/TiktokCollectionService.java index c57deeb..22fbc6f 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/TiktokCollectionService.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/TiktokCollectionService.java @@ -1,15 +1,15 @@ package com.bnyer.img.service; -import com.bnyer.img.domain.TiktokCollection; +import com.bnyer.img.vo.TiktokCollectionVo; import java.util.List; public interface TiktokCollectionService { /** - * 同步redis收藏到db中 + * 同步redis收藏数量到db中 */ - void insert(); + void insertNum(); /** * 批量删除收藏 @@ -26,10 +26,32 @@ public interface TiktokCollectionService { Integer getCollectionCount(Long imgId); /** - * 收藏/取消收藏 + * 收藏 * @param userId 用户Id * @param imgId 图片Id */ void collect(Long userId, Long imgId); + /** + * 取消收藏 + * @param userId 用户Id + * @param imgId 图片Id + */ + void unCollect(Long userId, Long imgId); + + /** + * 判断是否收藏 + * @param userId 用户Id + * @param imgId 图片Id + * @return - + */ + boolean judgeCollect(Long userId, Long imgId); + + /** + * 查询用户收藏列表 + * @param userId 用户Id + * @return - + */ + List getCollectionByUserId(Long userId); + } diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/TiktokUserService.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/TiktokUserService.java index 25bc506..89e79bd 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/TiktokUserService.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/TiktokUserService.java @@ -2,6 +2,7 @@ package com.bnyer.img.service; import com.bnyer.img.domain.TiktokUser; import com.bnyer.img.dto.TiktokUserPageDto; +import com.bnyer.img.vo.TiktokSessionInfoVo; import com.bnyer.img.vo.TiktokUserVo; import java.util.List; @@ -23,7 +24,7 @@ public interface TiktokUserService { int update(TiktokUser tiktokUser); /** - * 【批量删除抖音用户 + * 批量删除抖音用户 * @param ids 主键Ids * @return - */ @@ -48,4 +49,11 @@ public interface TiktokUserService { * @return - */ List queryUserImgList(); + + /** + * 查询tiktok小程序sessionInfo + * @param code 登录凭证code + * @return - + */ + TiktokSessionInfoVo getSessionInfo(String code); } diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/TiktokCollectionServiceImpl.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/TiktokCollectionServiceImpl.java index bcf5a5d..de733a9 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/TiktokCollectionServiceImpl.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/TiktokCollectionServiceImpl.java @@ -1,12 +1,18 @@ package com.bnyer.img.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.bnyer.common.redis.service.RedisService; import com.bnyer.img.constants.RedisKeyConstant; import com.bnyer.img.domain.TiktokCollection; +import com.bnyer.img.domain.TiktokImg; +import com.bnyer.img.domain.TiktokLike; import com.bnyer.img.enums.TiktokCollectionEnum; +import com.bnyer.img.enums.TiktokLikeEnum; import com.bnyer.img.mapper.TiktokCollectionMapper; +import com.bnyer.img.mapper.TiktokImgMapper; import com.bnyer.img.service.TiktokCollectionService; +import com.bnyer.img.vo.TiktokCollectionVo; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.Cursor; @@ -15,6 +21,7 @@ import org.springframework.stereotype.Service; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; @Service @Slf4j @@ -23,6 +30,9 @@ public class TiktokCollectionServiceImpl implements TiktokCollectionService { @Autowired private TiktokCollectionMapper tiktokCollectionMapper; + @Autowired + private TiktokImgMapper tiktokImgMapper; + @Autowired private RedisService redisService; @@ -31,30 +41,25 @@ public class TiktokCollectionServiceImpl implements TiktokCollectionService { } @Override - public void insert() { - log.info("==============redis同步收藏记录到db数据开始!==============="); - //拿缓存 - String redisKey = RedisKeyConstant.TIKTOK_USER_COLLECT_KEY; - Cursor> collection = redisService.getHashScan(redisKey); - while (collection.hasNext()){ - Map.Entry next = collection.next(); - String key = (String) next.getKey(); - //分离出 userId,imgId - String[] split = key.split(":"); - String userId = split[0]; - Long userLongId = Long.parseLong(userId); - String imgId = split[1]; + public void insertNum() { + log.info("==============redis同步图片收藏数量到db数据开始!==============="); + long startTime = System.currentTimeMillis(); + String imgCollectNumKey = RedisKeyConstant.TIKTOK_IMG_COLLECT_NUM_KEY; + Cursor> collectionNum = redisService.getHashScan(imgCollectNumKey); + while (collectionNum.hasNext()){ + Map.Entry next = collectionNum.next(); + String imgId = (String) next.getKey(); Long imgLongId = Long.parseLong(imgId); - TiktokCollection tiktokCollection = new TiktokCollection(); - tiktokCollection.setUserId(userLongId); - tiktokCollection.setImgId(imgLongId); - tiktokCollection.setCreateTime(new Date()); - tiktokCollection.setUpdateTime(new Date()); - tiktokCollectionMapper.insert(tiktokCollection); + Integer collectNum = (Integer) next.getValue(); + TiktokImg tiktokImg = new TiktokImg(); + tiktokImg.setId(imgLongId); + tiktokImg.setUpdateTime(new Date()); + tiktokImg.setCollectionNum(collectNum); + tiktokImgMapper.updateById(tiktokImg); //保存后从 Redis 中删除 - redisService.deleteHashKey(redisKey,key); + redisService.deleteHashKey(imgCollectNumKey,imgId); } - log.info("==============redis同步收藏记录到db数据完成!==============="); + log.info("==============redis同步图片收藏数量到db数据完成,耗时【{}】毫秒!===============",System.currentTimeMillis() - startTime); } @Override @@ -73,26 +78,42 @@ public class TiktokCollectionServiceImpl implements TiktokCollectionService { @Override public void collect(Long userId, Long imgId) { - //查询缓存中是否存在该用户和图片组装成的结果 - String hashKey = getHashKey(userId,imgId); - String redisKey = RedisKeyConstant.TIKTOK_USER_COLLECT_KEY; String imgCollectNumKey = RedisKeyConstant.TIKTOK_IMG_COLLECT_NUM_KEY; - if(!redisService.hasKey(redisKey)){ - //无则插入redis,状态置为1,图片数量+1 - redisService.setCacheMapValue(redisKey,hashKey, TiktokCollectionEnum.COLLECTE.getCode()); - redisService.hashIncr(imgCollectNumKey,String.valueOf(imgId), 1); - log.info("用户【{}】收藏了图片【{}】,收藏量增加1",userId,imgId); + TiktokCollection tiktokCollection = new TiktokCollection(); + tiktokCollection.setImgId(imgId); + tiktokCollection.setUserId(userId); + tiktokCollection.setCreateTime(new Date()); + tiktokCollection.setUpdateTime(new Date()); + tiktokCollectionMapper.insert(tiktokCollection); + redisService.hashIncr(imgCollectNumKey,String.valueOf(imgId), 1); + log.info("用户【{}】收藏了图片【{}】,收藏量增加1",userId,imgId); + } + + @Override + public void unCollect(Long userId, Long imgId) { + String imgCollectNumKey = RedisKeyConstant.TIKTOK_IMG_COLLECT_NUM_KEY; + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(TiktokCollection::getUserId,userId).eq(TiktokCollection::getImgId,imgId); + tiktokCollectionMapper.delete(wrapper); + redisService.hashIncr(imgCollectNumKey,String.valueOf(imgId), -1); + log.info("用户【{}】取消收藏了图片【{}】,收藏量减少1",userId,imgId); + } + + @Override + public boolean judgeCollect(Long userId, Long imgId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(TiktokCollection::getUserId, userId).eq(TiktokCollection::getImgId, imgId); + TiktokCollection tiktokCollection = tiktokCollectionMapper.selectOne(wrapper); + if(tiktokCollection != null){ + //存在则收藏过 + return true; }else{ - //有则删除,图片数量-1 - if(redisService.hasHashKey(redisKey,hashKey)){ - redisService.deleteHashKey(redisKey,hashKey); - redisService.hashIncr(imgCollectNumKey,String.valueOf(imgId), -1); - log.info("用户【{}】取消收藏了图片【{}】,收藏量减少1",userId,imgId); - }else{ - //不存在 - log.error("用户【{}】取消收藏图片【{}】失败,hashKey【{}】不存在!",userId,imgId,hashKey); - } + //否则未收藏过 + return false; } - + } + @Override + public List getCollectionByUserId(Long userId) { + return tiktokCollectionMapper.getCollectionByUserId(userId); } } diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/TiktokImgServiceImpl.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/TiktokImgServiceImpl.java index 27e63ec..36491df 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/TiktokImgServiceImpl.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/TiktokImgServiceImpl.java @@ -2,17 +2,26 @@ package com.bnyer.img.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.bnyer.common.core.utils.StringUtils; +import com.bnyer.common.redis.service.RedisService; +import com.bnyer.img.constants.RedisKeyConstant; +import com.bnyer.img.domain.TiktokCollection; import com.bnyer.img.domain.TiktokImg; +import com.bnyer.img.domain.TiktokLike; import com.bnyer.img.dto.TiktokImgPageDto; +import com.bnyer.img.mapper.TiktokCollectionMapper; import com.bnyer.img.mapper.TiktokImgMapper; +import com.bnyer.img.mapper.TiktokLikeMapper; import com.bnyer.img.service.TiktokImgService; import com.bnyer.img.vo.TiktokImgVo; import lombok.extern.slf4j.Slf4j; +import org.checkerframework.checker.units.qual.A; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.Cursor; import org.springframework.stereotype.Service; import java.util.Date; import java.util.List; +import java.util.Map; @Service @Slf4j @@ -21,6 +30,15 @@ public class TiktokImgServiceImpl implements TiktokImgService { @Autowired private TiktokImgMapper tiktokImgMapper; + @Autowired + private TiktokCollectionMapper tiktokCollectionMapper; + + @Autowired + private TiktokLikeMapper tiktokLikeMapper; + + @Autowired + private RedisService redisService; + @Override public int insert(TiktokImg tiktokImg) { tiktokImg.setCreateTime(new Date()); @@ -36,7 +54,18 @@ public class TiktokImgServiceImpl implements TiktokImgService { @Override public int delete(List ids) { - return tiktokImgMapper.deleteBatchIds(ids); + int delete = tiktokImgMapper.deleteBatchIds(ids); + LambdaQueryWrapper likeWrapper = new LambdaQueryWrapper<>(); + LambdaQueryWrapper collectionWrapper = new LambdaQueryWrapper<>(); + for (Long id : ids) { + likeWrapper.in(TiktokLike::getImgId, id); + collectionWrapper.in(TiktokCollection::getImgId, id); + } + //删除点赞关联 + tiktokLikeMapper.delete(likeWrapper); + //删除收藏关联 + tiktokCollectionMapper.delete(collectionWrapper); + return delete; } @Override diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/TiktokLikeService.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/TiktokLikeService.java new file mode 100644 index 0000000..80a1086 --- /dev/null +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/TiktokLikeService.java @@ -0,0 +1,46 @@ +package com.bnyer.img.service.impl; + +import java.util.List; + +public interface TiktokLikeService { + + /** + * 同步redis点赞到db中 + */ + void insertRecord(); + + /** + * 同步redis点赞数量到db中 + */ + void insertNum(); + + /** + * 批量删除点赞 + * @param ids 主键ids + * @return - + */ + int delete(List ids); + + + /** + * 点赞 + * @param userId 用户Id + * @param imgId 图片Id + */ + void like(Long userId, Long imgId); + + /** + * 取消点赞 + * @param userId 用户Id + * @param imgId 图片Id + */ + void unLike(Long userId, Long imgId); + + /** + * 判断是否进行过点赞 + * @param userId 用户id + * @param imgId 图片id + * @return - + */ + boolean judgeLike(Long userId, Long imgId); +} diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/TiktokLikeServiceImpl.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/TiktokLikeServiceImpl.java new file mode 100644 index 0000000..3570126 --- /dev/null +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/TiktokLikeServiceImpl.java @@ -0,0 +1,141 @@ +package com.bnyer.img.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bnyer.common.redis.service.RedisService; +import com.bnyer.img.constants.RedisKeyConstant; +import com.bnyer.img.domain.TiktokImg; +import com.bnyer.img.domain.TiktokLike; +import com.bnyer.img.enums.TiktokLikeEnum; +import com.bnyer.img.mapper.TiktokImgMapper; +import com.bnyer.img.mapper.TiktokLikeMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.Cursor; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +@Service +@Slf4j +public class TiktokLikeServiceImpl implements TiktokLikeService { + + @Autowired + private TiktokLikeMapper tiktokLikeMapper; + + @Autowired + private RedisService redisService; + + @Autowired + private TiktokImgMapper tiktokImgMapper; + + private String getHashKey(Long userId, Long imgId){ + return userId+":"+imgId; + } + + @Override + public void insertRecord() { + log.info("==============redis同步点赞记录到db数据开始!==============="); + long startTime = System.currentTimeMillis(); + //拿缓存 + String redisKey = RedisKeyConstant.TIKTOK_USER_LIKE_KEY; + Cursor> like = redisService.getHashScan(redisKey); + while (like.hasNext()){ + Map.Entry next = like.next(); + String key = (String) next.getKey(); + //分离出 userId,imgId + String[] split = key.split(":"); + String userId = split[0]; + Long userLongId = Long.parseLong(userId); + String imgId = split[1]; + Long imgLongId = Long.parseLong(imgId); + TiktokLike tiktokLike = new TiktokLike(); + tiktokLike.setUserId(userLongId); + tiktokLike.setImgId(imgLongId); + tiktokLike.setCreateTime(new Date()); + tiktokLike.setUpdateTime(new Date()); + tiktokLikeMapper.insert(tiktokLike); + //保存后从 Redis 中删除 + redisService.deleteHashKey(redisKey,key); + } + log.info("==============redis同步点赞记录到db数据完成,耗时【{}】毫秒!===============",System.currentTimeMillis() - startTime); + } + + @Override + public void insertNum() { + log.info("==============redis同步图片点赞数量到db数据开始!==============="); + long startTime = System.currentTimeMillis(); + String imgLikeNumKey = RedisKeyConstant.TIKTOK_IMG_LIKE_NUM_KEY; + Cursor> likeNum = redisService.getHashScan(imgLikeNumKey); + while (likeNum.hasNext()){ + Map.Entry next = likeNum.next(); + String imgId = (String) next.getKey(); + Long imgLongId = Long.parseLong(imgId); + Integer greatNum = (Integer) next.getValue(); + TiktokImg tiktokImg = new TiktokImg(); + tiktokImg.setId(imgLongId); + tiktokImg.setUpdateTime(new Date()); + tiktokImg.setGreatNum(greatNum); + tiktokImgMapper.updateById(tiktokImg); + //保存后从 Redis 中删除 + redisService.deleteHashKey(imgLikeNumKey,imgId); + } + log.info("==============redis同步图片点赞数量到db数据完成,耗时【{}】毫秒!===============",System.currentTimeMillis() - startTime); + } + + @Override + public int delete(List ids) { + return tiktokLikeMapper.deleteBatchIds(ids); + } + + @Override + public void like(Long userId, Long imgId) { + String hashKey = getHashKey(userId,imgId); + String redisKey = RedisKeyConstant.TIKTOK_USER_LIKE_KEY; + String imgLikeNumKey = RedisKeyConstant.TIKTOK_IMG_LIKE_NUM_KEY; + //插入redis,状态置为1,图片数量+1 + redisService.setCacheMapValue(redisKey,hashKey, TiktokLikeEnum.LIKE.getCode()); + redisService.hashIncr(imgLikeNumKey,String.valueOf(imgId), 1); + log.info("用户【{}】点赞了图片【{}】,点赞量增加1",userId,imgId); + } + + @Override + public void unLike(Long userId, Long imgId) { + String hashKey = getHashKey(userId,imgId); + String redisKey = RedisKeyConstant.TIKTOK_USER_LIKE_KEY; + String imgLikeNumKey = RedisKeyConstant.TIKTOK_IMG_LIKE_NUM_KEY; + redisService.deleteHashKey(redisKey,hashKey); + redisService.hashIncr(imgLikeNumKey,String.valueOf(imgId), -1); + log.info("用户【{}】取消点赞了图片【{}】,点赞量减少1",userId,imgId); + } + + @Override + public boolean judgeLike(Long userId, Long imgId) { + //判断redis中是否存在点赞记录 + String hashKey = getHashKey(userId,imgId); + String redisKey = RedisKeyConstant.TIKTOK_USER_LIKE_KEY; + Integer value = (Integer) redisService.getCacheMapValue(redisKey, hashKey); + //缓存存在的情况下 + if(value != null){ + if(TiktokLikeEnum.LIKE.getCode().equals(value)){ + //redis中存在该记录 + return true; + }else if(TiktokLikeEnum.UN_LIKE.getCode().equals(value)){ + //redis中不存在该记录 + return false; + } + } + //缓存不存在,同时解决重复点赞情况,此时查询数据库 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(TiktokLike::getUserId, userId).eq(TiktokLike::getImgId, imgId); + TiktokLike tiktokLike = tiktokLikeMapper.selectOne(wrapper); + if(tiktokLike != null){ + //存在则点赞过 + return true; + }else{ + //否则未点赞过 + return false; + } + } +} diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/TiktokUserServiceImpl.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/TiktokUserServiceImpl.java index 34a1477..daa68ab 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/TiktokUserServiceImpl.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/TiktokUserServiceImpl.java @@ -1,24 +1,30 @@ package com.bnyer.img.service.impl; -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; -import com.alibaba.fastjson.TypeReference; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bnyer.common.core.exception.ServiceException; import com.bnyer.common.core.utils.StringUtils; import com.bnyer.common.redis.service.RedisService; +import com.bnyer.img.config.TiktokConfig; import com.bnyer.img.constants.RedisKeyConstant; +import com.bnyer.img.constants.TiktokConstant; import com.bnyer.img.domain.TiktokImg; import com.bnyer.img.domain.TiktokUser; import com.bnyer.img.dto.TiktokUserPageDto; +import com.bnyer.img.feign.TiktokFeign; import com.bnyer.img.mapper.TiktokImgMapper; import com.bnyer.img.mapper.TiktokUserMapper; import com.bnyer.img.service.TiktokUserService; +import com.bnyer.img.vo.TiktokSessionInfoVo; import com.bnyer.img.vo.TiktokUserVo; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.TimeUnit; @Service @@ -34,6 +40,12 @@ public class TiktokUserServiceImpl implements TiktokUserService { @Autowired private TiktokImgMapper tiktokImgMapper; + @Resource + private TiktokConfig tiktokConfig; + + @Autowired + private TiktokFeign tiktokFeign; + @Override public int insert(TiktokUser tiktokUser) { return 0; @@ -85,4 +97,25 @@ public class TiktokUserServiceImpl implements TiktokUserService { redisService.setCacheObject(redisKey,tiktokUserVo,3600L, TimeUnit.SECONDS); return tiktokUserVo; } + + @Override + public TiktokSessionInfoVo getSessionInfo(String code) { + Map params = new HashMap(8); + params.put("appid", tiktokConfig.getAppId()); + params.put("secret", tiktokConfig.getSecret()); + params.put("code", code); + params.put("grant_type", "client_credential"); + JSONObject sessionInfo = tiktokFeign.getSessionInfo(params); + if(!sessionInfo.getString("err_no").equals(TiktokConstant.SUCCESS)){ + log.error("抖音授权session接口调用失败,错误状态码为:【{}】,错误信息为:【{}】",sessionInfo.getString("err_no"),sessionInfo.getString("err_tips")); + throw new ServiceException("抖音授权session接口调用失败!"); + } + //调用成功,组装返回数据 + JSONObject data = sessionInfo.getJSONObject("data"); + TiktokSessionInfoVo result = new TiktokSessionInfoVo(); + result.setSessionKey(data.getString("session_key")); + result.setOpenId(data.getString("openid")); + result.setUnionId(data.getString("unionid")); + return result; + } } diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/TiktokCollectionVo.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/TiktokCollectionVo.java new file mode 100644 index 0000000..4d7880c --- /dev/null +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/TiktokCollectionVo.java @@ -0,0 +1,44 @@ +package com.bnyer.img.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; + + +@Getter +@Setter +@ApiModel("抖音收藏响应类") +public class TiktokCollectionVo implements Serializable { + + @ApiModelProperty(value="id") + private Long id; + + @ApiModelProperty(value="图片id") + private Long imgId; + + @ApiModelProperty(value="图片地址") + private String imgUrl; + + @ApiModelProperty(value="用户id") + private Long userId; + + @ApiModelProperty(value="分类id") + private Long typeId; + + @ApiModelProperty(value="分类名称") + private String typeName; + + @ApiModelProperty(value="下载量") + private Integer downloadNum; + + @ApiModelProperty(value="点赞量") + private Integer greatNum; + + @ApiModelProperty(value="收藏量") + private Integer collectionNum; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/TiktokSessionInfoVo.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/TiktokSessionInfoVo.java new file mode 100644 index 0000000..72e3520 --- /dev/null +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/TiktokSessionInfoVo.java @@ -0,0 +1,29 @@ +package com.bnyer.img.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; + + +@Getter +@Setter +@ApiModel("抖音sessionInfo响应类") +public class TiktokSessionInfoVo implements Serializable { + + @ApiModelProperty(value="sessionKey") + private String sessionKey; + + @ApiModelProperty(value="openId") + private String openId; + + @ApiModelProperty(value="unionId") + private String unionId; + + @ApiModelProperty(value="anonymousOpenid") + private String anonymousOpenid; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/TiktokCollectionMapper.xml b/bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/TiktokCollectionMapper.xml index ac48d07..1316dd5 100644 --- a/bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/TiktokCollectionMapper.xml +++ b/bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/TiktokCollectionMapper.xml @@ -16,4 +16,18 @@ id, user_id, img_id, is_show, create_time, update_time, sort + + \ No newline at end of file diff --git a/bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/TiktokLikeMapper.xml b/bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/TiktokLikeMapper.xml new file mode 100644 index 0000000..4417816 --- /dev/null +++ b/bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/TiktokLikeMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + id, user_id, img_id, is_show, create_time, update_time, sort + + \ No newline at end of file