(JAVA)服务端实现检查当前用户连续签到天数、是否连续签到等业务

简介: (JAVA)服务端实现检查当前用户连续签到天数、是否连续签到等业务

前言:

最近项目有一个业务是用户连续签到xx天赠送多少奖励积分等等,看了网上绝大部分的思路,查询所有签到记录在进行比对有没有漏签,个人认为有些麻烦,自己设计了一下,仅供朋友们一些参考,如果你们有更好的想法,请留言,我也想学习下,大家共同进步嘛。

技术栈是:Springboot2.0+JPA+MYSQL+Lombok+Swagger2.0

正片开始:

先贴实体类代码:

package com.dq.domain.user;
 
import com.dq.domain.VO;
import com.dq.domain.base.BaseEntity;
import com.dq.utils.TimeUtil;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
 
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
 
/**
 * @author liuhui
 * @date 2019/12/11 0011 13:40:58
 */
@Data
@Entity
@ApiModel("签到记录")
public class SignInRecord extends BaseEntity implements VO.ToVO {
    @ManyToOne
    @ApiModelProperty("签到用户")
    protected SysUser sysUser;
 
    /**
     * 签到日期  格式 yyyy-MM-DD
     */
    protected String signDate;
 
    /**
     * 连续签到天数  检查最后一次签到是不是昨天,是的话就+1,不是的话就变成1,
     * 每到 7、15、30给一次奖励,如果到了30也变成1
     */
    protected Integer continueNumber;
 
    @Data
    @ApiModel("签到视图")
    public static class Vo implements VO{
        @ApiModelProperty("签到用户")
        public String username;
        @ApiModelProperty("签到时间")
        public String signInTime;
    }
 
    @Override
    public VO toVO(boolean isRecursion) {
        Vo vo = new Vo();
        WxUser wxUser = (WxUser) this.getSysUser();
        vo.username = wxUser.getUsername();
        vo.signInTime = fmt(this.getCreateTime(), TimeUtil.YYYY_MM_DD_HH_MM_SS);
        return vo;
    }
}

数据库数据大致长这样:

id27以后为正式数据,前边的是测试数据 ,大家可以不看。

接下来放业务代码:

    @Override
    public Map signIn() throws AdminException {
        SysUser sysUser = shiroService.getUser();
        //今天是否签到过
        if (apiSignInRecordRepository.existsBySysUserAndSignDateAndDeletedFalse(sysUser, TimeUtil.getString(DateTime.now(), TimeUtil.YYYY_MM_DD))) {
            throw new AdminException("您今天已经签到过了");
        }
       List<SignInRecord> signInRecordList = apiSignInRecordRepository.findBySysUserOrderByCreateTimeDesc(sysUser, PageableUtil.get(0, 1));
        if (!signInRecordList.isEmpty()) {
            SignInRecord findSignInRecord = signInRecordList.get(0);
        }
    }

TimeUtil是一个工具类,用到的方法如下:

public static final String YYYY_MM_DD= "yyyy-MM-dd";
 
// 获取格式化时间
    public static final String getString(DateTime var, String fmt) {
        return var.toString(fmt);
    }

判断用户签到是获取当天的日期,格式为2020-01-01这种去和数据库signDate字段比对。

判断是否是连续签到逻辑是:获取用户最后一次的签到记录,检查查询到的签到记录的signDate是不是昨天的signDate,是的话就是连续签到,continueNumber++,不是的话就是断签了,continueNumber设置成1重新开始就行了。

注:PageableUtil是封装的spring的Pageable分页方法,传入0,1代表limit0,1是一个意思,order by createTime是根据日期从大到小取第一个就是最后一次签到记录,不会出问题。

大家如果有更好的方法欢迎留言,一起学习啊。

相关文章
|
6月前
|
算法 Java 程序员
Java检查字符串是否为回文
Java检查字符串是否为回文
|
21天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
21天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
19天前
|
Ubuntu Java Linux
如何检查 Java 版本是否兼容
要检查Java版本是否兼容,可在命令行输入“java -version”查看当前安装的Java版本,然后对比目标应用所需的Java版本,确保其满足要求。
|
25天前
|
JSON Java 开发工具
Java服务端集成Google FCM推送的注意事项和实际经验
本文分享了作者在公司APP海外发布过程中,选择Google FCM进行消息推送的集成经验。文章详细解析了Java集成FCM推送的多种实现方式,包括HTTP请求和SDK集成,并指出了通知栏消息和透传消息的区别与应用场景。同时,作者还探讨了Firebase项目的创建、配置和服务端集成的注意事项,帮助读者解决文档混乱和选择困难的问题。
44 1
|
1月前
|
Java
让星星⭐月亮告诉你,Java异常分类[Throwable(Error/Exception(RuntimeException/其他异常)) 检查时异常 非检查时异常]
本文深入解析了Java异常处理机制,重点介绍了`Throwable`类及其子类`Error`和`Exception`,并通过实例代码、流程图和表格详细解释了异常的分类、区别及处理方法,帮助读者掌握异常处理的关键技巧,提升程序的稳定性和健壮性。
47 1
|
6月前
|
Java 编译器
Java一分钟之——异常分类:检查异常与运行时异常
【5月更文挑战第20天】Java异常处理分为检查异常(Checked Exceptions)和运行时异常(Unchecked Exceptions),两者在编译期处理方式不同。检查异常需捕获或声明,如`IOException`,而运行时异常如`NullPointerException`在运行时终止程序。常见问题包括不恰当的异常使用、过度捕获和忽略异常信息。避免策略包括正确区分异常类型、具体捕获和处理异常信息。示例代码展示了如何处理这两种类型的异常。理解并妥善处理异常能提升程序的健壮性和可维护性。
131 4
|
1月前
|
JSON Java 开发工具
Java服务端集成Google FCM推送的注意事项和实际经验
公司的app要上海外,涉及到推送功能,经过综合考虑,选择Google FCM进行消息推送。 查看一些集成博客和官方文档,看的似懂非懂,迷迷惑惑。本篇文章除了将我实际集成的经验分享出来,也会对看到的博客及其中产生的疑惑、注意事项一一评论。 从官方文档和众多博客中,你会发现Java集成FCM推送有多种实现方式,会让生产生文档很乱,不知作何选择的困惑。
82 0
|
3月前
|
存储 搜索推荐 Java
|
4月前
|
存储 NoSQL Java
Java中使用redis的bitMap实现签到功能
这个实现示例提供了一种灵活、高效的方式,展示了如何使用Redis来解决现实中的问题。
284 2