(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是根據日期從大到小取第一個就是最後一次簽到記錄,不會出問題。

大家如果有更好的方法歡迎留言,一起學習啊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章