用户签到 :
逻辑实现 :
![image-20220420202625827](https://i-blog.csdnimg.cn/blog_migrate/8f0c15618aa967fab00735e2ede96a5c.png)
![image-20220420202752630](https://i-blog.csdnimg.cn/blog_migrate/6042dd94e784fe772c4ec88e770f73e4.png)
![image-20220420203940842](https://i-blog.csdnimg.cn/blog_migrate/e2d6685a84bbf8acbb00ebefebc8584e.png)
代码实现 :
@Override
public Result sign() {
Long userId = UserHolder.getUser().getId();
LocalDateTime now = LocalDateTime.now();
String keySuffix = now.format(DateTimeFormatter.ofPattern("yyyy:MM"));
String key = "sign:" + userId + keySuffix;
int dayOfMonth = now.getDayOfMonth();
stringRedisTemplate.opsForValue().setBit(key,dayOfMonth - 1,true);
return Result.ok();
}
签到统计 :
统计连续签到天数 :
@Override
public Result signCount() {
Long userId = UserHolder.getUser().getId();
LocalDateTime now = LocalDateTime.now();
String keySuffix = now.format(DateTimeFormatter.ofPattern("yyyy:MM"));
String key = "sign:" + userId + keySuffix;
int dayOfMonth = now.getDayOfMonth();
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;
while (true) {
if ((num & 1) == 0) {
break;
}else{
count++;
}
num >>>= 1;
}
return Result.ok(count);
}