简单的每日签到

最近写项目的时候要写一个每日签到在此记录下话不多说直接上代码

第一步:创建两个表(签到记录表,签到积分表)

签到积分表

CREATE TABLE `sign`  (
  `sign_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '签到id',
  `sign_name` int(10) NULL DEFAULT NULL COMMENT '连续签到天数',
  `sign_intergln` int(10) NULL DEFAULT NULL COMMENT '签到积分',
  PRIMARY KEY (`sign_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

签到记录表

CREATE TABLE `sign_in`  (
  `sign_in_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '签到id',
  `openid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '签到人openid',
  `sign_in_time` date NULL DEFAULT NULL COMMENT '签到日期',
  PRIMARY KEY (`sign_in_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

第二部创建基本的代码(省略,就是增删改查)

第三步编写逻辑代码(这个是我的业务需求编写的代码(我的比较简单),你们可能不一样)

查询签到次数


 @PostMapping("/clearCache")
    @ApiOperation("根据openid查询签到次数")
    public AjaxResult clearCache(String openId) throws ParseException {
        Map<String,Object> map = new HashMap<>();
        SignIn signIn1 = signInService.SignInTop1(openId);
        String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date parse = sdf.parse(format);
        if (signIn1==null){
            map.put("state",1);
        }else {
            if (parse.getTime()==signIn1.getSignInTime().getTime()){
                map.put("state", 0);
            }else {
                map.put("state",1);
            }
        }
        int count =0;
        List<SignIn> signIns = signInService.SignInTop(openId);
        SignIn signIn2 = signInService.SignInTop1(openId);
        if (signIns!=null){
            Map<String, SignIn> maps = new HashMap<>();
            for (SignIn signIn : signIns) {
                if ((parse.getTime()-signIn2.getSignInTime().getTime())/ (24 * 60 * 60 * 1000)<2){
                    if ((( signIn2.getSignInTime().getTime())- signIn.getSignInTime().getTime()) / (24 * 60 * 60 * 1000)==0){
                        maps.put("signIn",signIn);
                        count++;
                    }else {
                        long signIn3 = (maps.get("signIn").getSignInTime().getTime() - signIn.getSignInTime().getTime()) / (24 * 60 * 60 * 1000);
                        if (signIn3==1){
                            count++;
                            maps.put("signIn",signIn);
                        }else {
                            break;
                        }
                    }
                }else {
                    count=0;
                    break;
                }

            }
        }
        if (count>=7){
            if (count%7==0){
                count=7;
                if ((int)map.get("state")==1) {
                    count = 0;
                }
            }else {
                count=count%7;
            }
        }
        map.put("count", count);
        return AjaxResult.success(map);
    }

签到的点击接口

  @PostMapping("/clearCacheA")
    @ApiOperation("根据openid进行签到")
    public AjaxResult clearCachea(String openId) throws ParseException {
        if (openId == null){
            return AjaxResult.error("无法签到");
        }
 WxUser WxUser = WxUserService.selectWxUserByOpenId(openId);
        if (WxUser ==null){
            return AjaxResult.error("签到失败");
        }
        String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date parse = sdf.parse(format);
        SignIn signIn1 = signInService.SignInTop1(openId);
        if (signIn1!=null){
            if (parse.getTime()==signIn1.getSignInTime().getTime()){
                return AjaxResult.error("你今天已经签到过了");
            }
        }
        SignIn signIn = new SignIn();
        signIn.setOpenid(openId);
        signIn.setSignInTime(parse);
        signInService.insertSignIn(signIn);
        int count =0;
        List<SignIn> signInsA = signInService.SignInTop(openId);
        SignIn signIn2 = signInService.SignInTop1(openId);
        if (signInsA!=null){
            Map<String, SignIn> maps = new HashMap<>();
            for (SignIn signIns : signInsA) {
                if ((( signIn2.getSignInTime().getTime())- signIns.getSignInTime().getTime()) / (24 * 60 * 60 * 1000)==0){
                    maps.put("signIn",signIns);
                    count++;
                }else {
                    long signIn3 = (maps.get("signIn").getSignInTime().getTime() - signIns.getSignInTime().getTime()) / (24 * 60 * 60 * 1000);
                    if (signIn3==1){
                        count++;
                        maps.put("signIn",signIns);
                    }else {
                        break;
                    }
                }
            }
        }
        if (count>=7){
            if (count%7==0){
                count=7;
            }else {
                count=count%7;
            }
        }
        Sign sign = signService.listOne(count);
        WxUser.setIntegral(WxUser.getIntegral()+sign.getSignIntergln());
        WxUserService.updateWxUser(WxUser);
        return AjaxResult.success("签到成功");
    }

本篇文章的逻辑是根据用户查询所有的签到记录进行循环遍历,每次遍历把上一个遍历的日期存进map中进行替换,第一次拿最近的一次时间与最新的数据进行较,没出意外的话基本为0,这时候需要把为0的这个加进去,剩下的都是今天减去昨天看是否为1,不是1则退出循环,获得签到数量,判断是否大于7,小于7则正常返回给前端,大于七进行判断返回余数。

本人接触java不久,有什么问题希望大佬帮忙指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值