<>用户签到 :

<>逻辑实现 :

<>代码实现 :
// TODO 实现用户签到功能 @Override public Result sign() { // TODO 1.获取用户信息 : Long
userId= UserHolder.getUser().getId(); // TODO 2.获取日期信息 LocalDateTime now =
LocalDateTime.now(); String keySuffix = now.format(DateTimeFormatter.ofPattern(
"yyyy:MM")); // TODO 3.拼接key String key = "sign:" + userId + keySuffix; // TODO
4.获取今天是本月的第几天 , 注意这里是从1 到 31 , // 而我们的redis的值是从0 到 30 , 所以 , 这里要减一 int
dayOfMonth= now.getDayOfMonth(); // TODO 5.写入Redis . SETBIT key offset 1 ,
这里使用boolean值是为了节省空间 , 所以这里使用true stringRedisTemplate.opsForValue().setBit(key,
dayOfMonth- 1,true); return Result.ok(); }
<>签到统计 :

<>统计连续签到天数 :
//TODO 获取连续签到天数 @Override public Result signCount() { // TODO 1.获取用户信息 : Long
userId= UserHolder.getUser().getId(); // TODO 2.获取日期信息 LocalDateTime now =
LocalDateTime.now(); String keySuffix = now.format(DateTimeFormatter.ofPattern(
"yyyy:MM")); // TODO 3.拼接key String key = "sign:" + userId + keySuffix; // TODO
4.获取今天是本月的第几天 , 注意这里是从1 到 31 , // 而我们的redis的值是从0 到 30 , 所以 , 这里要减一 int
dayOfMonth= now.getDayOfMonth(); // TODO 5.获取本月截止今天为止的签到记录 , 返回的是一个十进制数字 List<
Long> list = stringRedisTemplate.opsForValue().bitField( key,
BitFieldSubCommands.create() .get(BitFieldSubCommands.BitFieldType.unsigned(
dayOfMonth)).valueAt(0) ); if (list == null || list.isEmpty()) { // 没有签到结果
return Result.ok(0); } Long num = list.get(0); if (num == null || num == 0){
return Result.ok(0); } int count = 0; // TODO 6.循环遍历 while (true) { // TODO
7.让这个数字与1做与运算 , 得到数字的最后一个bit位 // TODO 8.判断这个bit位是否是0 if ((num & 1) == 0) { //
为零说明未签到 , 结束 break; }else{ // 不为零 , 说明已签到 , 计数器 +1 count++; } // TODO 9.把数字右移一位
, 继续下一个bit位 num >>>= 1; } return Result.ok(count); }

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信