Browse Source

feature1.0.0:img服务添加登录相关方法

master
chengkun 4 years ago
parent
commit
c5a76deab0
  1. 29
      bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisService.java
  2. 34
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/TiktokConfig.java
  3. 12
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/RedisKeyConstant.java
  4. 13
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/TiktokConstant.java
  5. 17
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/TiktokCollectionController.java
  6. 57
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/TiktokMiniController.java
  7. 57
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/domain/TiktokLike.java
  8. 2
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CollectionDto.java
  9. 20
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CollectionUserDto.java
  10. 24
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/feign/TiktokFeign.java
  11. 11
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/mapper/TiktokCollectionMapper.java
  12. 13
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/mapper/TiktokLikeMapper.java
  13. 30
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/TiktokCollectionService.java
  14. 10
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/TiktokUserService.java
  15. 99
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/TiktokCollectionServiceImpl.java
  16. 31
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/TiktokImgServiceImpl.java
  17. 46
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/TiktokLikeService.java
  18. 141
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/TiktokLikeServiceImpl.java
  19. 37
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/TiktokUserServiceImpl.java
  20. 44
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/TiktokCollectionVo.java
  21. 29
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/TiktokSessionInfoVo.java
  22. 14
      bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/TiktokCollectionMapper.xml
  23. 19
      bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/TiktokLikeMapper.xml

29
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<Long> redisScript = new DefaultRedisScript<>(luaScript,Long.class);
Long releaseStatus = (Long)this.redisTemplate.execute(redisScript, Collections.singletonList(key),value);
return releaseStatus;
}
}

34
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;
}

12
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";
}

13
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";
}

17
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/TiktokCollectionController.java

@ -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;
}

57
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()));
}
}

57
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;
}

2
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;

20
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;
}

24
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<String, String> params);
}

11
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<TiktokCollection> {
/**
* 查询用户收藏列表
* @param userId 用户Id
* @return -
*/
List<TiktokCollectionVo> getCollectionByUserId(@Param("userId") Long userId);
}

13
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<TiktokLike> {
}

30
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<TiktokCollectionVo> getCollectionByUserId(Long userId);
}

10
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<TiktokUserVo> queryUserImgList();
/**
* 查询tiktok小程序sessionInfo
* @param code 登录凭证code
* @return -
*/
TiktokSessionInfoVo getSessionInfo(String code);
}

99
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<Map.Entry<Object, Object>> collection = redisService.getHashScan(redisKey);
while (collection.hasNext()){
Map.Entry<Object, Object> 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<Map.Entry<Object, Object>> collectionNum = redisService.getHashScan(imgCollectNumKey);
while (collectionNum.hasNext()){
Map.Entry<Object, Object> 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<TiktokCollection> 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<TiktokCollection> 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<TiktokCollectionVo> getCollectionByUserId(Long userId) {
return tiktokCollectionMapper.getCollectionByUserId(userId);
}
}

31
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<Long> ids) {
return tiktokImgMapper.deleteBatchIds(ids);
int delete = tiktokImgMapper.deleteBatchIds(ids);
LambdaQueryWrapper<TiktokLike> likeWrapper = new LambdaQueryWrapper<>();
LambdaQueryWrapper<TiktokCollection> 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

46
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<Long> 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);
}

141
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<Map.Entry<Object, Object>> like = redisService.getHashScan(redisKey);
while (like.hasNext()){
Map.Entry<Object, Object> 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<Map.Entry<Object, Object>> likeNum = redisService.getHashScan(imgLikeNumKey);
while (likeNum.hasNext()){
Map.Entry<Object, Object> 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<Long> 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<TiktokLike> 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;
}
}
}

37
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<String, String> 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;
}
}

44
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;
}

29
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;
}

14
bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/TiktokCollectionMapper.xml

@ -16,4 +16,18 @@
<!--@mbg.generated-->
id, user_id, img_id, is_show, create_time, update_time, sort
</sql>
<select id="getCollectionByUserId" resultType="com.bnyer.img.vo.TiktokCollectionVo">
select
itc.id as id,itc.img_id as imgId,itc.user_id as userId,
iti.img_url as imgUrl,iti.type_id as typeId,iti.download_num as downloadNum,
iti.great_num as greatNum,iti.collection_num as collectionNum,
it.type_name as typeName
from img_tiktok_collection itc
join img_tiktok_img iti on itc.img_id = iti.id
join img_type it on iti.type_id = it.id
where iti.is_show = '1' and it.is_show = '1' and iti.status = '1' and itc.is_show = '1'
and itc.user_id = #{userId}
order by sort desc
</select>
</mapper>

19
bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/TiktokLikeMapper.xml

@ -0,0 +1,19 @@
<?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="com.bnyer.img.mapper.TiktokLikeMapper">
<resultMap id="BaseResultMap" type="com.bnyer.img.domain.TiktokLike">
<!--@mbg.generated-->
<!--@Table img_tiktok_like-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="user_id" jdbcType="BIGINT" property="userId" />
<result column="img_id" jdbcType="BIGINT" property="imgId" />
<result column="is_show" jdbcType="CHAR" property="isShow" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
<result column="sort" jdbcType="INTEGER" property="sort" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
id, user_id, img_id, is_show, create_time, update_time, sort
</sql>
</mapper>
Loading…
Cancel
Save