需求:
限制每人每天只能点击30次按钮,当点击到达30次限度之后进行提示,并向上级发送短信
思路: redis ---》当用户点击之后,在redis中创建一个hash,将用户id和点击次数存入到redis中,用户每次点击之后,对用户点击次数进行判断 ,并对用户的点击次数进行累加。如果点击次数大于限制次数之后,在前端进行消息提示。当点击次数等于限制次数,发送消息到指定的手机上。定时清空redis的数据。
1.当点击按钮之后,在redis中为当前用户创建键值。
//当用户点击之后,先判断当前redis中有没有该用户的数据,如果没有,将该用户id设为键,0设为值表示点击次数。
if (!redisTemplate.opsForHash().hasKey("clickCount", String.valueOf(hluser.getId()))) {redisTemplate.opsForHash().put("clickCount", String.valueOf(hluser.getId()),"0");} //每次点击之后,将当前用户的点击次数获取下来,对次数进行加1操作 String clickCount = (String)redisTemplate.opsForHash().get("clickCount", String.valueOf(hluser.getId())); Integer count =Integer.valueOf(clickCount); ++count; //限制点击次数为30次 if(count == 30) { a.setSign(2); //追加点击次数到达限制次数的日志 redisTemplate.opsForHash().put("clickCount", String.valueOf(hluser.getId()),String.valueOf(count)); String note = hluser.getUserName() + "点击显示联系方式图标已达"+count+"次"; logService.add("客户管理", "点击显示联系方式", note); logService.add("客户管理","联系方式的显示",detail); customersResponseData.setMas("请求成功"); //到达次数之后进行短信发送 List<String> sendTelephone = new ArrayList<>(); //追加接收人的电话信息 sendTelephone.add("11111111111"); sendTelephone.add("11111111111"); //发送短信 :sendSms(用户名,电话列表) msgService.sendSms(hluser.getUserName(), sendTelephone); //没有达到限制次数的情况 }else if(count < 30){ a.setSign(2); redisTemplate.opsForHash().put("clickCount", String.valueOf(hluser.getId()),String.valueOf(count)); logService.add("客户管理","联系方式的显示",detail); customersResponseData.setMas("请求成功"); }else{ //达到限制次数的情况 redisTemplate.opsForHash().put("clickCount", String.valueOf(hluser.getId()),String.valueOf(count)); a.setSign(1); a.setTelephone(encryptTelephone(a.getTelephone())); customersResponseData.setMas("您今天的点击次数已达上限"); }
2.进行短信发送
/** * 当客户管理点击30次之后发送短信 * */ @Override public void sendSms(String name, List<String> sendTelephone){ CommonResponse response = null; DefaultProfile profile = DefaultProfile.getProfile("", "", ""); IAcsClient client = new DefaultAcsClient(profile); CommonRequest request = new CommonRequest(); request.setSysMethod(MethodType.POST); request.setSysDomain("dysmsapi.aliyuncs.com"); request.setSysVersion(""); request.setSysAction("SendSms"); request.putQueryParameter("RegionId", "cn-hangzhou"); request.putQueryParameter("SignName", ""); request.putQueryParameter("TemplateCode", ""); for (String telephone : sendTelephone) { request.putQueryParameter("PhoneNumbers", telephone); JSONObject param = new JSONObject(); param.put("name",name); request.putQueryParameter("TemplateParam", param.toString()); try { // 客户端发送短信 response = client.getCommonResponse(request); } catch (Exception e) { e.printStackTrace(); } } }
3.定时清除redis中当天点击次数:
/** * 每天凌晨12点的点击次数进行清除,将所有的数据都修改为0 */ @Scheduled(cron = "0 0 0 * * *") //每分钟对数据进行一次清空操作 // @Scheduled(cron = "0 */1 * * * ?") public void clearClickCount() { //获取redis中当天进行点击的用户id Map<Object, Object> clickCount = redisTemplate.opsForHash().entries("clickCount"); for (Object id : clickCount.keySet()) { //通过id删除当天点击的次数 redisTemplate.opsForHash().delete("clickCount", (String)id); } }