From 79927fb17d7cc66b9fe7d6fc6763b85f7fb33fc0 Mon Sep 17 00:00:00 2001 From: 77 <77@77.com> Date: Mon, 18 Mar 2024 20:42:53 +0800 Subject: [PATCH] init --- .../app/UserVisitorAppController.java | 43 +++++++++++++++ .../dto/app/uservisitor/UserVisitorQuery.java | 10 ++++ .../app/uservisitor/vo/UserVisitorListVo.java | 30 +++++++++++ .../main/java/com/ruoyi/xq/lock/LockKey.java | 5 ++ .../ruoyi/xq/mapper/UserVisitorMapper.java | 8 +++ .../ruoyi/xq/service/UserVisitorService.java | 7 +++ .../service/impl/UserVisitorServiceImpl.java | 52 +++++++++++++++++++ .../resources/mapper/xq/UserVisitorMapper.xml | 22 ++++---- 8 files changed, 167 insertions(+), 10 deletions(-) create mode 100644 ruoyi-xq/src/main/java/com/ruoyi/xq/controller/app/UserVisitorAppController.java create mode 100644 ruoyi-xq/src/main/java/com/ruoyi/xq/dto/app/uservisitor/UserVisitorQuery.java create mode 100644 ruoyi-xq/src/main/java/com/ruoyi/xq/dto/app/uservisitor/vo/UserVisitorListVo.java diff --git a/ruoyi-xq/src/main/java/com/ruoyi/xq/controller/app/UserVisitorAppController.java b/ruoyi-xq/src/main/java/com/ruoyi/xq/controller/app/UserVisitorAppController.java new file mode 100644 index 0000000..38532a9 --- /dev/null +++ b/ruoyi-xq/src/main/java/com/ruoyi/xq/controller/app/UserVisitorAppController.java @@ -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 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> page(PageQuery pageQuery, UserVisitorQuery query){ + query.setUserId(LoginHelper.getUserId()); + Page app = userVisitorService.pageApp(pageQuery, query); + return R.ok(PageModel.build(app)); + } +} diff --git a/ruoyi-xq/src/main/java/com/ruoyi/xq/dto/app/uservisitor/UserVisitorQuery.java b/ruoyi-xq/src/main/java/com/ruoyi/xq/dto/app/uservisitor/UserVisitorQuery.java new file mode 100644 index 0000000..a2dd55f --- /dev/null +++ b/ruoyi-xq/src/main/java/com/ruoyi/xq/dto/app/uservisitor/UserVisitorQuery.java @@ -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; +} diff --git a/ruoyi-xq/src/main/java/com/ruoyi/xq/dto/app/uservisitor/vo/UserVisitorListVo.java b/ruoyi-xq/src/main/java/com/ruoyi/xq/dto/app/uservisitor/vo/UserVisitorListVo.java new file mode 100644 index 0000000..0fd0da8 --- /dev/null +++ b/ruoyi-xq/src/main/java/com/ruoyi/xq/dto/app/uservisitor/vo/UserVisitorListVo.java @@ -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; +} diff --git a/ruoyi-xq/src/main/java/com/ruoyi/xq/lock/LockKey.java b/ruoyi-xq/src/main/java/com/ruoyi/xq/lock/LockKey.java index 819cab5..2e4ba26 100644 --- a/ruoyi-xq/src/main/java/com/ruoyi/xq/lock/LockKey.java +++ b/ruoyi-xq/src/main/java/com/ruoyi/xq/lock/LockKey.java @@ -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); } diff --git a/ruoyi-xq/src/main/java/com/ruoyi/xq/mapper/UserVisitorMapper.java b/ruoyi-xq/src/main/java/com/ruoyi/xq/mapper/UserVisitorMapper.java index 95127b4..bd95a48 100644 --- a/ruoyi-xq/src/main/java/com/ruoyi/xq/mapper/UserVisitorMapper.java +++ b/ruoyi-xq/src/main/java/com/ruoyi/xq/mapper/UserVisitorMapper.java @@ -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 { + void incsVisitorCount(@Param("id") Long id); + + Page pageApp(@Param("build") Page build, @Param("query") UserVisitorQuery query); + } diff --git a/ruoyi-xq/src/main/java/com/ruoyi/xq/service/UserVisitorService.java b/ruoyi-xq/src/main/java/com/ruoyi/xq/service/UserVisitorService.java index abada30..07ddc08 100644 --- a/ruoyi-xq/src/main/java/com/ruoyi/xq/service/UserVisitorService.java +++ b/ruoyi-xq/src/main/java/com/ruoyi/xq/service/UserVisitorService.java @@ -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 { + void visitor(Long userId, Long tarUserId); + + Page pageApp(PageQuery pageQuery, UserVisitorQuery query); } diff --git a/ruoyi-xq/src/main/java/com/ruoyi/xq/service/impl/UserVisitorServiceImpl.java b/ruoyi-xq/src/main/java/com/ruoyi/xq/service/impl/UserVisitorServiceImpl.java index 7912b7c..453e23b 100644 --- a/ruoyi-xq/src/main/java/com/ruoyi/xq/service/impl/UserVisitorServiceImpl.java +++ b/ruoyi-xq/src/main/java/com/ruoyi/xq/service/impl/UserVisitorServiceImpl.java @@ -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 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 pageApp(PageQuery pageQuery, UserVisitorQuery query) { + return baseMapper.pageApp(pageQuery.build(), query); + } } diff --git a/ruoyi-xq/src/main/resources/mapper/xq/UserVisitorMapper.xml b/ruoyi-xq/src/main/resources/mapper/xq/UserVisitorMapper.xml index f77e5a2..258a631 100644 --- a/ruoyi-xq/src/main/resources/mapper/xq/UserVisitorMapper.xml +++ b/ruoyi-xq/src/main/resources/mapper/xq/UserVisitorMapper.xml @@ -4,16 +4,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - + + update xq_user_visitor + set visitor_num = visitor_num + 1 + where id = #{id} + +