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());
            }

        }

    }
}

posted @ 2022-11-08 17:02  给我手牵你走  阅读(246)  评论(0编辑  收藏  举报