75 lines
2.2 KiB
Java
75 lines
2.2 KiB
Java
package com.bao.dating.service.impl;
|
|
|
|
import com.bao.dating.mapper.UserBanMapper;
|
|
import com.bao.dating.pojo.dto.UserBanDTO;
|
|
import com.bao.dating.pojo.entity.UserBan;
|
|
import com.bao.dating.service.UserBanService;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.data.redis.core.RedisTemplate;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
import java.time.LocalDateTime;
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
@Service
|
|
public class UserBanServiceImpl implements UserBanService {
|
|
|
|
@Autowired
|
|
private UserBanMapper userBanMapper;
|
|
|
|
@Autowired
|
|
private RedisTemplate<String, Object> redisTemplate;
|
|
|
|
@Override
|
|
public void banUser(UserBanDTO userBanDTO) {
|
|
|
|
// 已被封禁,直接拒绝
|
|
if (userBanMapper.existsActiveBan(userBanDTO.getUserId()) > 0) {
|
|
throw new RuntimeException("用户已处于封禁状态");
|
|
}
|
|
|
|
LocalDateTime now = LocalDateTime.now();
|
|
LocalDateTime endTime = userBanDTO.getBanDays() == null ? null : now.plusDays(userBanDTO.getBanDays());
|
|
|
|
// 1. 写数据库
|
|
UserBan ban = new UserBan();
|
|
ban.setUserId(userBanDTO.getUserId());
|
|
ban.setReason(userBanDTO.getReason());
|
|
ban.setBanStartTime(now);
|
|
ban.setBanEndTime(endTime);
|
|
ban.setStatus(1);
|
|
userBanMapper.insertBan(ban);
|
|
|
|
// 2. 写 Redis
|
|
String key = "user:ban:" + userBanDTO.getUserId();
|
|
if (userBanDTO.getBanDays() == null) {
|
|
redisTemplate.opsForValue().set(key, userBanDTO.getReason());
|
|
} else {
|
|
redisTemplate.opsForValue().set(key, userBanDTO.getReason(), userBanDTO.getBanDays(), TimeUnit.DAYS);
|
|
}
|
|
|
|
// 3. 踢下线
|
|
redisTemplate.delete("login:token:" + userBanDTO.getUserId());
|
|
}
|
|
|
|
/**
|
|
* 解封用户
|
|
*/
|
|
@Override
|
|
public void unbanUser(Long userId) {
|
|
// 更新数据库
|
|
userBanMapper.unbanUser(userId);
|
|
|
|
// 删除 Redis
|
|
redisTemplate.delete("user:ban:" + userId);
|
|
}
|
|
|
|
/**
|
|
* 获取用户封禁信息
|
|
*/
|
|
@Override
|
|
public UserBan getActiveBan(Long userId) {
|
|
return userBanMapper.selectActiveBan(userId);
|
|
}
|
|
}
|