Java中使用redis的bitMap实现签到功能

慈云数据 2024-03-15 技术支持 75 0
简介

使用Redis中的bitMap实现 功能

1. 用户签到, 可以补签

2. 用户当前签到情况

3. 用户当月签到情况

SignController
import com.example.signdemo.service.SignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
@RequestMapping("sign")
public class SignController {
    @Autowired
    private SignService signService;
    /***
     * 用户签到, 可以补签
     */
    @PostMapping
    public Map doSign(Integer userId, string dateStr){
        return signService.doSign(userId, dateStr);
    }
    /**
     * 获取用户当前签到情况
     *
     * @param userId
     * @param dateStr
     * @return
     */
    @GetMapping("/today")
    public Map today(Integer userId, String dateStr){
        return signService.today(userId, dateStr);
    }
    /**
     * 获取用户当月签到情况
     *
     * @param userId
     * @param dateStr
     * @return
     */
    @GetMapping("/getSignInfo")
    public Map getSignInfo(Integer userId, String dateStr){
        return signService.getSignInfo(userId, dateStr);
    }
}

 

import cn.hutool.core.date.DateUtil;
import com.example.signdemo.utils.SignUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
@Service
public class SignService {
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private SignUtils signUtils;
    public Map doSign(Integer userId, String dateStr) {
        Map result = new HashMap();
        //获取日期
        Date date = signUtils.getDate(dateStr);
        // 获取日期对应的天数, 多少号
        int day = DateUtil.dayOfMonth(date) - 1;
        // 构建redis ke
        String signKey = signUtils.buildSignKey(userId, date);
        // 获取对应的日期是否已签到
        Boolean isSigned = redisTemplate.opsForValue().getBit(signKey, day);
        if (isSigned) {
            result.put("code", 400);
            result.put("message", "用户该日期已签到, 无需再签");
            return result;
        }
        // 签到
        redisTemplate.opsForValue().setBit(signKey, day, true);
        // 根据当前日期统计签到次数
        Date todate = new Date();
        // 统计连续签到
        int contniuousSignCount = signUtils.getContniuousSignCount(userId, todate);
        // 统计总签到数
        long sumSignCount = signUtils.getSumSignCount(userId, todate);
        result.put("code", 200);
        result.put("message", "签到成功");
        result.put("contniuousSignCount", contniuousSignCount);
        result.put("sumSignCount", sumSignCount);
        return result;
    }
    /**
     * 获取用户当前签到情况
     *
     * @param userId
     * @param dateStr
     * @return
     */
    public Map today(Integer userId, String dateStr) {
        Map result = new HashMap();
        
        // TODO
        
        return result;
    }
    /**
     * 获取用户当月签到情况
     *
     * @param userId
     * @param dateStr
     * @return
     */
    public Map getSignInfo(Integer userId, String dateStr) {
        Map signInfo = new TreeMap();
        // TODO
        
        return signInfo;
    }
}
发送内容: "签到功能", 获取提取码

 

 

 

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon