This commit is contained in:
77
2024-03-18 20:42:53 +08:00
parent a75e7b3257
commit 79927fb17d
8 changed files with 167 additions and 10 deletions

View File

@@ -0,0 +1,43 @@
package com.ruoyi.xq.controller.app;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.PageModel;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.xq.dto.app.common.IdReq;
import com.ruoyi.xq.dto.app.uservisitor.UserVisitorQuery;
import com.ruoyi.xq.dto.app.uservisitor.vo.UserVisitorListVo;
import com.ruoyi.xq.service.UserVisitorService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/visitor")
@Tag(name = "用户访问接口")
public class UserVisitorAppController {
@Autowired
private UserVisitorService userVisitorService;
@PostMapping("/visitor")
@Operation(summary = "访问用户")
@Log(title = "访问用户", businessType = BusinessType.OTHER, isSaveDb = false)
public R<Void> starUpdate(@RequestBody IdReq req){
userVisitorService.visitor(LoginHelper.getUserId(),req.getId());
return R.ok();
}
@GetMapping("/me/page")
@Operation(summary = "查询谁看过我-分页")
@Log(title = "查询谁看过我-分页", businessType = BusinessType.OTHER, isSaveDb = false)
public R<PageModel<UserVisitorListVo>> page(PageQuery pageQuery, UserVisitorQuery query){
query.setUserId(LoginHelper.getUserId());
Page<UserVisitorListVo> app = userVisitorService.pageApp(pageQuery, query);
return R.ok(PageModel.build(app));
}
}

View File

@@ -0,0 +1,10 @@
package com.ruoyi.xq.dto.app.uservisitor;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class UserVisitorQuery {
@Schema(hidden = true)
private Long userId;
}

View File

@@ -0,0 +1,30 @@
package com.ruoyi.xq.dto.app.uservisitor.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDate;
@Data
public class UserVisitorListVo {
@Schema(description = "用户ID")
private Long userId;
@Schema(description = "用户头像")
private String avatar;
@Schema(description = "性别 0-未知 1-女 2-男")
private Integer gender;
@Schema(description = "昵称")
private String nickname;
@Schema(description = "生日")
private LocalDate birthday;
@Schema(description = "生日-缩减显示")
private String birthdayStr;
@Schema(description = "居住城市")
private String residenceCity;
@Schema(description = "学历")
private Integer education;
@Schema(description = "职业")
private String profession;
@Schema(description = "访问次数")
private Integer visitorNum;
}

View File

@@ -14,11 +14,16 @@ public class LockKey {
public static final String LOCK_VIDEO_SETTLE_REDIS = RedisHttpConstant.REDIS_P + "lock:videoSettle:%s";
public static final String LOCK_ONLINE_LOGIN_NOTICE_REDIS = RedisHttpConstant.REDIS_P + "lockHand:loginFansNotice:%s";
public static final String LOCK_USER_INFO_AUDIT_REDIS = RedisHttpConstant.REDIS_P + "lock:userInfoAudit:%s";
public static final String LOCK_USER_VISITOR_ADD_REDIS = RedisHttpConstant.REDIS_P + "lock:userVisitorAdd:%s-%s";
public static String getRegisterLockKey(String mobile){
return String.format(LOCK_REGISTER_REDIS,mobile);
}
public static String getUserVisitorAddLockKey(Long userId,Long tarUserId){
return String.format(LOCK_USER_VISITOR_ADD_REDIS,userId,tarUserId);
}
public static String getDealInviteLockKey(Long userId){
return String.format(LOCK_DEAL_INVITE_REDIS,userId);
}

View File

@@ -1,7 +1,11 @@
package com.ruoyi.xq.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.xq.domain.UserVisitor;
import com.ruoyi.xq.dto.app.uservisitor.UserVisitorQuery;
import com.ruoyi.xq.dto.app.uservisitor.vo.UserVisitorListVo;
import org.apache.ibatis.annotations.Param;
/**
* 用户来访记录Mapper接口
@@ -11,4 +15,8 @@ import com.ruoyi.xq.domain.UserVisitor;
*/
public interface UserVisitorMapper extends BaseMapper<UserVisitor> {
void incsVisitorCount(@Param("id") Long id);
Page<UserVisitorListVo> pageApp(@Param("build") Page<Object> build, @Param("query") UserVisitorQuery query);
}

View File

@@ -1,7 +1,11 @@
package com.ruoyi.xq.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.xq.domain.UserVisitor;
import com.ruoyi.xq.dto.app.uservisitor.UserVisitorQuery;
import com.ruoyi.xq.dto.app.uservisitor.vo.UserVisitorListVo;
/**
* 用户来访记录Service接口
@@ -11,4 +15,7 @@ import com.ruoyi.xq.domain.UserVisitor;
*/
public interface UserVisitorService extends IService<UserVisitor> {
void visitor(Long userId, Long tarUserId);
Page<UserVisitorListVo> pageApp(PageQuery pageQuery, UserVisitorQuery query);
}

View File

@@ -1,9 +1,20 @@
package com.ruoyi.xq.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.xq.domain.User;
import com.ruoyi.xq.domain.UserVisitor;
import com.ruoyi.xq.dto.app.uservisitor.UserVisitorQuery;
import com.ruoyi.xq.dto.app.uservisitor.vo.UserVisitorListVo;
import com.ruoyi.xq.lock.LockKey;
import com.ruoyi.xq.mapper.UserVisitorMapper;
import com.ruoyi.xq.service.UserService;
import com.ruoyi.xq.service.UserVisitorService;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
@@ -14,5 +25,46 @@ import org.springframework.stereotype.Service;
*/
@Service
public class UserVisitorServiceImpl extends ServiceImpl<UserVisitorMapper,UserVisitor> implements UserVisitorService {
@Autowired
private RedissonClient redissonClient;
@Autowired
private UserService userService;
@Override
public void visitor(Long userId, Long tarUserId) {
User user = userService.getById(userId);
User tarUser = userService.getById(tarUserId);
if(user == null || tarUser == null){
return;
}
UserVisitor one = this.getOne(Wrappers.lambdaQuery(UserVisitor.class).eq(UserVisitor::getUserId, userId)
.eq(UserVisitor::getTarId, tarUserId).last("limit 1"));
if(one != null){
baseMapper.incsVisitorCount(one.getId());
return;
}
RLock lock = redissonClient.getLock(LockKey.getUserVisitorAddLockKey(userId, tarUserId));
try {
lock.lock();
one = this.getOne(Wrappers.lambdaQuery(UserVisitor.class).eq(UserVisitor::getUserId, userId)
.eq(UserVisitor::getTarId, tarUserId).last("limit 1"));
if(one != null){
return;
}
UserVisitor userVisitor = new UserVisitor();
userVisitor.setUserId(user.getId());
userVisitor.setUsercode(user.getUsercode());
userVisitor.setTarId(tarUser.getId());
userVisitor.setTarUsercode(tarUser.getUsercode());
userVisitor.setVisitorNum(1);
this.save(userVisitor);
}finally {
lock.unlock();
}
}
@Override
public Page<UserVisitorListVo> pageApp(PageQuery pageQuery, UserVisitorQuery query) {
return baseMapper.pageApp(pageQuery.build(), query);
}
}