1、用户冻结解冻
用户冻结/解冻使用管理员在后台系统对用户的惩罚措施。对于发布不当言论或者违法违规内容的用户,可以暂时、永久禁止其登录,评论,发布动态、
后台中解冻/冻结,就是将用户状态写入数据库中
APP端用户在进行登录,评论,发布动态时检测Redis中冻结状态
1.1 用户冻结
ManageController
//用户冻结
@PostMapping("/users/freeze")
public ResponseEntity freeze(@RequestBody Map params) {
Map map = managerService.userFreeze(params);
return ResponseEntity.ok(map);
}
ManageService
//用户冻结
public Map userFreeze(Map params) {
Integer freezingTime = (Integer) params.get("freezingTime");
Long userId = (Long) params.get("userId");
int days = 0;
if (freezingTime == 1) {
days = 3;
}
if (freezingTime == 2) {
days = 7;
}
if (freezingTime == 3) {
days = -1;
}
String value = JSON.toJSONString(params);
redisTemplate.opsForValue().set(Constants.FREEZE_USER+userId,value,days, TimeUnit.MINUTES);
Map map = new HashMap();
map.put("message","冻结成功");
return map;
}
1.2 用户解冻
ManageController
//用户解冻
@PostMapping("/users/unfreeze")
public ResponseEntity unfreeze(@RequestBody Map params) {
Map map = managerService.userUnfreeze(params);
return ResponseEntity.ok(map);
}
ManageService
//用户解冻
public Map userUnfreeze(Map params) {
Long userId = (Long) params.get("userId");
String reasonsForThawing = (String) params.get("reasonsForThawing");
redisTemplate.delete(Constants.FREEZE_USER+userId);
Map map = new HashMap();
map.put("message","解冻成功");
return map;
}
1.3 查询数据列表
UserInfo
添加字段
//用户状态,1为正常,2为冻结
@TableField(exist = false)
private String userStatus = "1";
ManageService
public ResponseEntity findById(Long userId) {
UserInfo info = userInfoApi.findById(userId);
if(redisTemplate.hasKey(Constants.FREEZE_USER+info.getId())) {
info.setUserStatus("2");
}
return ResponseEntity.ok(info);
}
1.4 探花系统修改
UserFreezeService
@Service
public class UserFreezeService {
@Autowired
private RedisTemplate<String,String> redisTemplate;
public void checkUserStatus(Integer state,Long userId) {
String value = redisTemplate.opsForValue().get(Constants.FREEZE_USER + userId);
if(!StringUtils.isEmpty(value)) {
Map map = JSON.parseObject(value, Map.class);
Integer freezingRange = (Integer) map.get("freezingRange");
if(freezingRange == state) {
throw new BusinessException(ErrorResult.builder().errMessage("您的账号被冻结!").build());
}
}
}
}
2、数据统计
后台系统首页中,显示各种统计数据,比如:累计用户数、新增用户数、登录次数等内容。
1、探花系统将用户操作日志写入RabbitMQ
2、管理后台获取最新消息,构造日志数据存入数据库
3、加入统计表,定时统计
2.1 数据采集
1、探花系统将用户操作日志写入RabbitMQ
2、管理后台获取最新消息,构造日志数据存入数据库
2.1.1 部署RabbitMQ
探花交友所需的第三方服务组件,已经以Docker-Compose准备好了。仅仅需要进入相关目录,以命令形式启动运行即可
#进入目录
cd /root/docker-file/rmq/
#创建容器并启动
docker-compose up –d
#查看容器
docker ps -a
服务地址:192.168.136.160:5672
管理后台:http://192.168.136.160:15672/
2.1.2 消息类型说明
探花项目间使用RabbitMQ收发消息,这里采用topic类型消息
日志消息key规则:log.xxx
2.1.3 实体类对象
Log
package com.tanhua.model.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Log {
/**
* id
*/
private Long id;
/**
* 用户id
*/
private Long userId;
/**
* 操作时间
*/
private String logTime;
/**
* 操作类型,
* 0101为登录,0102为注册,
* 0201为发动态,0202为浏览动态,0203为动态点赞,0204为动态喜欢,0205为评论,0206为动态取消点赞,0207为动态取消喜欢,
* 0301为发小视频,0302为小视频点赞,0303为小视频取消点赞,0304为小视频评论
*/
private String type;
/**
* 登陆地点
*/
private String place;
/**
* 登陆设备
*/
private String equipment;
public Log(Long userId, String logTime, String type) {
this.userId = userId;
this.logTime = logTime;
this.type = type;
}
}
Analysis
package com.tanhua.model.domain;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Analysis{
private Long id;
/**
* 日期
*/
private Date recordDate;
/**
* 新注册用户数
*/
private Integer numRegistered = 0;
/**
* 活跃用户数
*/
private Integer numActive = 0;
/**
* 登陆次数
*/
private Integer numLogin = 0;
/**
* 次日留存用户数
*/
private Integer numRetention1d = 0;
private Date created;
}
2.1.4 发送日志消息
@Autowired
private AmqpTemplate amqpTemplate;
public void login() {
………
//构造Map集合
Map<String, Object> msg = new HashMap<>();
msg.put(“userId”, UserHolder.getUserId().toString());
msg.put(“date", System.currentTimeMillis());
msg.put("type", "0101",);
String message = JSON.toJSONString(msg);
//发送消息
try {
amqpTemplate.convertSendAndReceive("tanhua.log.exchange",
"log.user",message);
}catch (Exception e) {
e.printStackTrace();
}
………
}
2.1.5 监听器处理消息
@Component
public class LogListener {
@Autowired
private LogMapper logMapper;
@RabbitListener(bindings = @QueueBinding(
value = @Queue(
value = "tanhua.log.queue",
durable = "true"
),
exchange = @Exchange(
value = "tanhua.log.exchange",
type = ExchangeTypes.TOPIC),
key = {
"log.*"})
)
public void listenCreate(String message) throws Exception {
try {
Map<String, Object> map = JSON.parseObject(message);
//1、获取数据
Long userId = (Long) map.get("userId");
String date = (String) map.get("date");
String objId = (String) map.get("objId");
String type = (String) map.get("type");
//2、保存到数据库
Log log = new Log(userId,date,type);
logMapper.insert(log);
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.1.6 消息发送工具类
package com.tanhua.server.service;
import com.alibaba.fastjson.JSON;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Service
public class MqMessageService {
@Autowired
private AmqpTemplate amqpTemplate;
//发送日志消息
public void sendLogService(Long userId,String type,String key,String busId) {
try {
Map map = new HashMap(