32.用户冻结、解冻
用户冻结、解冻
一、用户冻结
用户冻结/解冻使用管理员在后台系统对用户的惩罚措施。对于发布不当言论或者违法违规内容的用户,可以暂时、永久禁止其登录,评论,发布动态、
后台中解冻/冻结,就是将用户状态写入数据库中
APP端用户在进行登录,评论,发布动态时检测Redis中冻结状态
1.ManageController
/**
* 用户冻结操作:
* 请求路径:/manage/users/freeze
* 请求方式:post
* 请求参数: Integer userId(要冻结的用户id),
* String freezingTime (冻结时间,1为冻结3天,2为冻结7天,3为永久冻结)
* Integer freezingRange(冻结范围,1为冻结登录,2为冻结发言,3为冻结发布动态)
* String reasonsForFreezing(冻结原因)
* String frozenRemarks(冻结备注)
* 以上这些参数使用map集合接收
* 响应数据:String message(操作结果);也是使用map集合封装返回
*
*/
@PostMapping("/users/freeze")
public ResponseEntity freezeUser(@RequestBody Map map){
Map retMap = manageService.freezeUser(map);
return ResponseEntity.ok(retMap);
}
2.ManageService
把要冻结的用户信息缓存进redis(有冻结时间设置的设置redis存活时间)
/**
* 冻结用户
* 实现思路:把要冻结的数据缓存进redis
* @param map
* @return
*/
public Map freezeUser(Map map) {
//1.构造key
String key = Constants.FREEZE_USER_KEY + map.get("userId").toString();//这个是要冻结的用户id
//2.设置冻结时间,也就是redis数据存活时间
Integer freezingTime = Integer.valueOf(map.get("freezingTime").toString()) ;//(冻结时间,1为冻结3天,2为冻结7天,3为永久冻结)
int day = 0;
if(freezingTime == 1){
day=3;
}else if(freezingTime == 2){
day = 7;
}
//3.操作redsi
String value = JSON.toJSONString(map);
if(day > 0){
redisTemplate.opsForValue().set(key, value,day , TimeUnit.MINUTES);
}else{
redisTemplate.opsForValue().set(key, value);
}
//4.响应操作结果
Map returnMap = new HashMap();
returnMap.put("message", "冻结成功");
return returnMap;
二、用户解冻
主要是构造key删除redis缓存的数据
1. ManageController
/**
* 用户解冻操作:
* 请求路径:/manage/users/unfreeze
* 请求方式:post
* 请求参数:Integer userId(要解冻的id);String reasonsForThawing(解冻的原因);使用map集合风封装
* 响应数据:String message(操作结果);用map集合封装返回
*/
@PostMapping("/users/unfreeze")
public ResponseEntity unfreeze(@RequestBody Map map){
Map returnMap = manageService.unfreeze(map);
return ResponseEntity.ok(returnMap);
}
2.ManageService
/**
* 用户解冻
* @param map
* @return
*/
public Map unfreeze(Map map) {
//1.构造key
String userId = map.get("userId").toString();
String key = Constants.FREEZE_USER_KEY +userId;
//2.删除redis中的数据
redisTemplate.delete(key);
//3.构造处理结果返回
Map returnMap = new HashMap();
returnMap.put("message", "解冻成功");
return returnMap;
}
三、在根据id查询用户id和查询用户分页列表的时候,构造redisKey判断用户状态,给用户设置新的值
/**
* 根据id查询用户详情
* @param userId
* @return
*/
public UserInfo queryUserInfoById(Long userId) {
UserInfo userInfo = userInfoApi.selectUserInfo(userId);
//2.判断用户是否被冻结,更新用户状态
//先构造key
String key = Constants.FREEZE_USER_KEY + userId.toString();
Boolean result = redisTemplate.hasKey(key);
if(result){
//true,用户已被冻结
userInfo.setUserStatus("2");
}
return userInfo;
}
/**
* 后台管理系统分页查询用户详情
* @param page
* @param pagesize
* @return
*/
public PageResult queryAllUserInfo(Integer page, Integer pagesize) {
IPage<UserInfo> iPage = userInfoApi.queryUserInfoByPage(page, pagesize);
//判断用户是否被冻结,设置用户状态,默认1是正常;2是被冻结
List<UserInfo> userInfos = iPage.getRecords();
for (UserInfo userInfo : userInfos) {
//先构造key
String key = Constants.FREEZE_USER_KEY + userInfo.getId().toString();
Boolean result = redisTemplate.hasKey(key);
if(result){
userInfo.setUserStatus("2");
}
}
PageResult pageResult = new PageResult(page,pagesize,iPage.getTotal(),iPage.getRecords());
return pageResult;
}
四、修改探花系统客户端
package com.tanhua.server.service;
import com.alibaba.fastjson.JSON;
import com.tanhua.commons.utils.Constants;
import com.tanhua.model.vo.ErrorResult;
import com.tanhua.server.exception.BusinessException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.Map;
@Service
public class FreezeUserService {
@Autowired
private RedisTemplate<String,String> redisTemplate;
public void checkUserStatus(String status,Long userId){
//1.构造key,调用redis查询数据
String key = Constants.FREEZE_USER_KEY + userId.toString();
String value = redisTemplate.opsForValue().get(key);
//2.value不为空,且冻结范围一样,抛出异常
if(!StringUtils.isEmpty(value)){
Map map = JSON.parseObject(value, Map.class);
String freezingRange = (String) map.get("freezingRange");
if(status.equals(freezingRange)){
throw new BusinessException(ErrorResult.freezeUser());
}
}
}
}