拉黑的话,我觉得是可以不写表的,只是个人理解,因为是不会出现高并发场景,所以我觉得就放入redis就足够了。
Controller层的代码:
在controller层接收到前端发送的参数,根据参数写出service层的业务代码逻辑
/*
* 拉黑功能*/
@RequestMapping(value = "/blacklist/{id}",method = RequestMethod.GET)
public JSONResult blacklist(@PathVariable("id") Long id){
messageSmsService.blacklist(id);
return JSONResult.success();
}
/*
* 查询黑名单功能*/
@RequestMapping(value = "/selectblacklist",method = RequestMethod.POST)
public JSONResult selectblacklist(@RequestBody MessageSmsQuery query){
Page<MessageSms> page = new Page<MessageSms>(query.getPage(),query.getRows());
page = messageSmsService.selectblacklist(page);
return JSONResult.success(new PageList<MessageSms>(page.getTotal(),page.getRecords()));
}
/*
* 移除黑名单功能*/
@RequestMapping(value = "/removeblacklist/{id}",method = RequestMethod.GET)
public JSONResult removeblacklist(@PathVariable("id") Long id){
messageSmsService.removeblacklist(id);
return JSONResult.success();
}
Service层(拉黑功能):
通过id,拿到要拉黑的短信对象,里面有IP、电话、用户
这里可以选择redis的Hash结构来写,传入三个参数
再生成一个“blacklist:”+id的业务键,然后将ip,phone,userID放入redis的hash结构当中存储,并且要设置永不过期。
/*拉黑业务逻辑代码
* */
@Override
public void blacklist(Long id) {
MessageSms messageSms = messageSmsMapper.selectById(id);
System.out.println(messageSms);
String ip = messageSms.getIp();
String phone = messageSms.getPhone();
String userId = String.valueOf(messageSms.getUserId()); // 将userId转换为字符串
// 假设RedisTemplate配置为使用String类型的键和值,可以根据需要调整序列化/反序列化来支持其他类型。
HashOperations<String, String, String> hashOps = redisTemplate.opsForHash();
// 生成一个业务键,用于存储与特定id相关联的信息。
String blacklistKey = "blacklist:" + id;
// 将ip、phone和userId作为字段存储在Redis Hash中。
hashOps.put(blacklistKey, "ip", ip);
hashOps.put(blacklistKey, "phone", phone);
hashOps.put(blacklistKey, "userId", userId);
// 设置永不过期
redisTemplate.persist(blacklistKey);
}
Service层(黑名单查询功能):
黑名单查询功能的话,用redisTemplate取出“blacklist”的所有key,然后创建ArrayList集合,遍历这个key,通过key截取到“blacklist”后面的值,然后取到id,查询出相应对象添加到ArrayList中
/*
黑名单查询
* */
@Override
public Page<MessageSms> selectblacklist(Page<MessageSms> page) {
Set<String> keys = redisTemplate.keys("blacklist:*");
List<MessageSms> blacklistedIds = new ArrayList<>();
for (String key : keys) {
String idStr = key.substring("blacklist:".length());
Long id = Long.parseLong(idStr);
MessageSms messageSms = messageSmsMapper.selectById(id);
blacklistedIds.add(messageSms);
}
// 将黑名单数据作为分页结果返回给前端
Page<MessageSms> resultPage = new Page<>(page.getCurrent(), page.getSize());
resultPage.setTotal(Long.parseLong(String.valueOf(blacklistedIds.size()))); // 将总记录数转换为字符串形式
resultPage.setRecords(blacklistedIds);
return resultPage;
}
Service(移除黑名单):
这里就是移除
/*移除黑名单逻辑代码
* */
@Override
public void removeblacklist(Long id) {
String blacklistKey = "blacklist:" + id;
redisTemplate.delete(blacklistKey);
}
Service层(重新查询 已经拉黑的短信)
需要添加过滤信息,通过key来对比
//重写查询的方法,添加了过滤条件
@Override
public Page<MessageSms> selectPage(Page<MessageSms> page, Wrapper<MessageSms> wrapper) {
Page<MessageSms> messageSmsPage = super.selectPage(page, wrapper);
List<MessageSms> records = messageSmsPage.getRecords();
ArrayList<MessageSms> filteredData = new ArrayList<>();
for (MessageSms message : records) {
Long id = message.getId();
String blacklistKey = "blacklist:" + id;
if (!redisTemplate.opsForHash().hasKey(blacklistKey, "ip")) {
// 该条数据不在黑名单中,将其添加到过滤后的列表中
filteredData.add(message);
}
}
// 更新查询结果的数据列表为过滤后的列表
messageSmsPage.setRecords(filteredData);
return messageSmsPage;
}