init
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -4,16 +4,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.ruoyi.xq.mapper.UserVisitorMapper">
|
||||
|
||||
<resultMap type="com.ruoyi.xq.domain.UserVisitor" id="UserVisitorResult">
|
||||
<result property="id" column="id"/>
|
||||
<result property="userId" column="user_id"/>
|
||||
<result property="usercode" column="usercode"/>
|
||||
<result property="tarId" column="tar_id"/>
|
||||
<result property="tarUsercode" column="tar_usercode"/>
|
||||
<result property="visitorNum" column="visitor_num"/>
|
||||
<result property="createTime" column="create_time"/>
|
||||
<result property="updateTime" column="update_time"/>
|
||||
</resultMap>
|
||||
<update id="incsVisitorCount">
|
||||
update xq_user_visitor
|
||||
set visitor_num = visitor_num + 1
|
||||
where id = #{id}
|
||||
</update>
|
||||
<select id="pageApp" resultType="com.ruoyi.xq.dto.app.uservisitor.vo.UserVisitorListVo">
|
||||
select t2.id as user_id, t2.avatar, t2.gender, t2.nickname, t2.birthday, t2.residence_city,
|
||||
t2.education, t2.profession, t1.visitor_num
|
||||
from xq_user_visitor t1
|
||||
join xq_user t2 on t1.user_id = t2.id
|
||||
where tar_id = #{query.userId}
|
||||
</select>
|
||||
|
||||
|
||||
</mapper>
|
||||
|
||||
Reference in New Issue
Block a user