实现一个类似于这样的签到功能 (参考的百度网盘签到页面)

数据表是一个用户只有一条签到记录的设计, 没有使用签到一次表中加一条数据, 那样的话数据太多了

签到有中断,下一次签到重新从第一天开始计算连续签到天数

表结构:

CREATE TABLE `sign_in` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',`user_id` bigint(20) NOT NULL COMMENT '签到用户id',`continue_days` int(3) NOT NULL DEFAULT '1' COMMENT '连续签到天数',`update_time` datetime DEFAULT NULL COMMENT '更新日期, 最后签到日期',PRIMARY KEY (`id`) USING BTREE,UNIQUE KEY `user_id_unique` (`user_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='用户签到表';

实体对象:

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.NoArgsConstructor;import java.time.LocalDateTime;/*** 用户签到表** @author lixx* @version 1.0* @date 2020-06-10 10:36*/
@Data
@NoArgsConstructor
public class SignIn {/*** 主键*/@TableId(type = IdType.AUTO)private Long id;/*** 签到用户id*/private Long userId;/*** 连续签到天数*/private Integer continueDays;/*** 更新日期, 最后签到日期*/@JsonFormat(pattern = "yyyy-MM-dd HH:mm")@TableField(fill = FieldFill.UPDATE)private LocalDateTime updateTime;public SignIn(Long userId, LocalDateTime updateTime) {this.userId = userId;this.updateTime = updateTime;}
}

签到接口:

 /*** 用户签到** @param userId 用户id* @return*/public JsonResult signIn(Long userId) {// 查询用户是否签过到QueryWrapper<SignIn> queryWrapper = new QueryWrapper<>();queryWrapper.lambda().eq(SignIn::getUserId, userId);SignIn signIn = signInMapper.selectOne(queryWrapper);/*没有签过到, 直接新增*/if (null == signIn) {signInMapper.insert(new SignIn(userId, LocalDateTime.now()));} else {/*签过到*/// 判断最后签到日期与当前日期是否超过一天LocalDate signInTime = signIn.getUpdateTime().toLocalDate();LocalDate currTime = LocalDate.now();long daysDiff = ChronoUnit.DAYS.between(signInTime, currTime);if (daysDiff <= 0) {return JsonResult.buildSuccess("重复签到");}if (daysDiff > 1) {// 1, 超过一天, 把连续签到的天数重置为 1signIn.setContinueDays(1);} else {// 2, 没有超过一天, 把连续签到的天数+1signIn.setContinueDays(signIn.getContinueDays() + 1);}signIn.setUpdateTime(LocalDateTime.now());signInMapper.updateById(signIn);}return JsonResult.buildSuccess();}

这样签到功能就做好了, 数据库数据如下:

签到列表接口:

需要增加一个接口返回的dto类型(大家用map也行)

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;/*** @author lixx* @version 1.0* @date 2020-06-10 15:09*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SignInDto implements Serializable {/*** 表示签到的天数*/private Integer day;/*** 1表示已经签到, 0表示未签到*/private Integer flag;// 如果还有其他业务字段就加在后面, 如积分, 如金币}

签到列表接口逻辑代码:

 /*** 用户签到列表** @param userId 用户id* @return*/public JsonResult signInList(Long userId) {QueryWrapper<SignIn> queryWrapper = new QueryWrapper<>();queryWrapper.lambda().eq(SignIn::getUserId, userId);SignIn signIn = signInMapper.selectOne(queryWrapper);List<SignInDto> list = new ArrayList<>(7);if (null == signIn) {// 没有签过到for (int i = 1; i < 8; i++) {list.add(new SignInDto(i, 0));}} else {// 签过到Integer continueDays = signIn.getContinueDays();// 1, 前六天的 flag是要固定的if (continueDays <= 6) {for (int i = 1; i < 8; i++) {if (i <= continueDays) {list.add(new SignInDto(i, 1));} else {list.add(new SignInDto(i, 0));}}} else {// 2, 6天后的签到天数要跟随日期增加for (int i = 5; i > -2; i--) {if (i > -1) {list.add(new SignInDto(continueDays - i, 1));} else {list.add(new SignInDto(continueDays + 1, 0));}}}}return JsonResult.buildSuccess(list);}

效果如下:

1:签到第五天的时候

2:签到第7天的时候

3:签到第N天的时候

ps: 每天凌晨要把未连续签到用户的连续签到天数(sign_in表的continue_days字段)设置为0, 我这里使用的是数据库定时任务, 大家也可以使用代码的定时任务,看个人选择

/*定时任务*/
-- 每天凌晨重置超过时间未签到的连续签到天数为0
CREATE EVENT IF NOT EXISTS reset_expired_signinsON SCHEDULE EVERY 1 DAY STARTS DATE_ADD(DATE_ADD(CURDATE(), INTERVAL 1 DAY), INTERVAL 5 MINUTE)ON COMPLETION PRESERVE ENABLE-- 更新语句DO UPDATE sign_in SET continue_days = 0 WHERE id IN ( SELECT a.id FROM ( SELECT id FROM sign_in WHERE DATEDIFF(CURDATE(), update_time) > 1 ) AS a )

springboot 7天签到功能设计 数据库表设计 加代码相关推荐

  1. java签到 表设计_java springboot 7天签到功能设计 数据库表设计 加代码

    实现一个类似于这样的签到功能 (参考的百度网盘签到页面) 数据表是一个用户只有一条签到记录的设计, 没有使用签到一次表中加一条数据, 那样的话数据太多了 表结构: CREATE TABLE `sign ...

  2. mysql设计积分兑换表_积分系统数据库表设计.docx

    积分系统数据库表设计 文件编号:JHDZ/SJ 密 级: 云上城积分功能数据库设计文档 项目名称:<云上城>项目代号:XXX版 本:V1.0编制单位:平台运营编制日期:2014-10-08 ...

  3. 美多商城之商品(商品数据库表设计)

    一.商品数据库表设计 1.1 SPU和SKU 在电商中对于商品,有两个重要的概念:SPU和SKU 1. SPU介绍      [即为商品的一个概述,一种商品的统称] SPU = Standard Pr ...

  4. Oracle数据库表设计时的注意事项

    Oracle数据库表设计时的注意事项  表是Oracle数据库中最基本的对象之一.万丈高楼从平地起,这个基础对象对于数据库来说,非常重要.因为其设计是否合理,直接跟数据库的性能相关.从Oracle数据 ...

  5. 不定字段数目的数据库表设计和数据结构

    不定字段数目的数据库表设计和数据结构 可能采用四种技术: 动态增加数据库表字段 预留足够的空白字段,运行时作动态影射 用xml格式保存在单字段里 改列为行,用另外一个表存放定制字段 现在我们来分析一下 ...

  6. 数据库表设计、 数据库分层、myslq水平拆分、oracle表分区

    数据库表设计 数据库表结构设计方法及原则(li)数据库设计的三大范式:为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的 ...

  7. 万字归纳总结 | 数据库表设计与SQL编写技巧

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"加入公众号专属技术群 前言 随着移动云平台系统业务不断增长,必然需要对各系统进行 ...

  8. 数据库表设计索引外键设计_关于索引的设计决策 数据库管理系统

    数据库表设计索引外键设计 Introduction: 介绍: The attributes whose values are required inequality or range conditio ...

  9. 数据库表设计必需元素_HTML5输入,必需,模式,数据列表

    数据库表设计必需元素 Today we will look into some HTML5 features that will help us in removing a lot of boiler ...

最新文章

  1. adam优化器再理解
  2. ul 、ol li 继承原有样式的问题
  3. c++引用专题之常引用
  4. 曝台积电芯片要涨价:2022年至少上调10%
  5. 一图看懂hadoop分布式文件存储系统HDFS工作原理
  6. 2021技术文大盘点 | 打包过去,​面向未来
  7. 2021年中国物流地产行业发展报告
  8. 不忘初心,砥砺前行;只争朝夕,不负韶华——国家开放大学2018年度首届优秀青年教师总结报告
  9. python领域驱动_DDD领域驱动设计学习初探
  10. 解决使用feign调用服务时携带token
  11. 基于libtorch的Alexnet深度学习网络实现——Cifar-10数据集分类(提升准确率)
  12. 深度精简版操作系统下IIS的安装方法
  13. java 图片加多处水印_Java在Word中添加多行图片水印
  14. 通过DCF模型对股票进行估值
  15. 1807520-99-5,DNP-PEG4-alcohol含有二硝基苯和羟基的PEG连接剂
  16. 蓝桥杯实验4--按键之独立键盘(proteus仿真)
  17. linux安装网卡驱动教程6,CentOS 6.5安装无线网卡驱动教程
  18. 专业的人脸拼接工具:Morph Age mac版
  19. ajax获取api中json数据显示到网页【带有“-”横杠注意】
  20. swift MT报文处理相关资料

热门文章

  1. Linux中在Virtualbox 5.0上安装Windows10
  2. python中用递归求和
  3. 使用opencv检测字符断裂
  4. QtCreator搜索关键字方法
  5. 实名认证在互联网金融领域的应用
  6. python实现中文的繁简转换
  7. MONTARA酒店集团呈献布吉岛最新奢华宅邸别墅推广综合式养生社区概念
  8. 天津股权交易所做市规则
  9. ADAS十大灵魂拷问
  10. 什么是DDOS攻击?