springboot 7天签到功能设计 数据库表设计 加代码
实现一个类似于这样的签到功能 (参考的百度网盘签到页面)
数据表是一个用户只有一条签到记录的设计, 没有使用签到一次表中加一条数据, 那样的话数据太多了
签到有中断,下一次签到重新从第一天开始计算连续签到天数
表结构:
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天签到功能设计 数据库表设计 加代码相关推荐
- java签到 表设计_java springboot 7天签到功能设计 数据库表设计 加代码
实现一个类似于这样的签到功能 (参考的百度网盘签到页面) 数据表是一个用户只有一条签到记录的设计, 没有使用签到一次表中加一条数据, 那样的话数据太多了 表结构: CREATE TABLE `sign ...
- mysql设计积分兑换表_积分系统数据库表设计.docx
积分系统数据库表设计 文件编号:JHDZ/SJ 密 级: 云上城积分功能数据库设计文档 项目名称:<云上城>项目代号:XXX版 本:V1.0编制单位:平台运营编制日期:2014-10-08 ...
- 美多商城之商品(商品数据库表设计)
一.商品数据库表设计 1.1 SPU和SKU 在电商中对于商品,有两个重要的概念:SPU和SKU 1. SPU介绍 [即为商品的一个概述,一种商品的统称] SPU = Standard Pr ...
- Oracle数据库表设计时的注意事项
Oracle数据库表设计时的注意事项 表是Oracle数据库中最基本的对象之一.万丈高楼从平地起,这个基础对象对于数据库来说,非常重要.因为其设计是否合理,直接跟数据库的性能相关.从Oracle数据 ...
- 不定字段数目的数据库表设计和数据结构
不定字段数目的数据库表设计和数据结构 可能采用四种技术: 动态增加数据库表字段 预留足够的空白字段,运行时作动态影射 用xml格式保存在单字段里 改列为行,用另外一个表存放定制字段 现在我们来分析一下 ...
- 数据库表设计、 数据库分层、myslq水平拆分、oracle表分区
数据库表设计 数据库表结构设计方法及原则(li)数据库设计的三大范式:为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的 ...
- 万字归纳总结 | 数据库表设计与SQL编写技巧
点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"加入公众号专属技术群 前言 随着移动云平台系统业务不断增长,必然需要对各系统进行 ...
- 数据库表设计索引外键设计_关于索引的设计决策 数据库管理系统
数据库表设计索引外键设计 Introduction: 介绍: The attributes whose values are required inequality or range conditio ...
- 数据库表设计必需元素_HTML5输入,必需,模式,数据列表
数据库表设计必需元素 Today we will look into some HTML5 features that will help us in removing a lot of boiler ...
最新文章
- adam优化器再理解
- ul 、ol li 继承原有样式的问题
- c++引用专题之常引用
- 曝台积电芯片要涨价:2022年至少上调10%
- 一图看懂hadoop分布式文件存储系统HDFS工作原理
- 2021技术文大盘点 | 打包过去,​面向未来
- 2021年中国物流地产行业发展报告
- 不忘初心,砥砺前行;只争朝夕,不负韶华——国家开放大学2018年度首届优秀青年教师总结报告
- python领域驱动_DDD领域驱动设计学习初探
- 解决使用feign调用服务时携带token
- 基于libtorch的Alexnet深度学习网络实现——Cifar-10数据集分类(提升准确率)
- 深度精简版操作系统下IIS的安装方法
- java 图片加多处水印_Java在Word中添加多行图片水印
- 通过DCF模型对股票进行估值
- 1807520-99-5,DNP-PEG4-alcohol含有二硝基苯和羟基的PEG连接剂
- 蓝桥杯实验4--按键之独立键盘(proteus仿真)
- linux安装网卡驱动教程6,CentOS 6.5安装无线网卡驱动教程
- 专业的人脸拼接工具:Morph Age mac版
- ajax获取api中json数据显示到网页【带有“-”横杠注意】
- swift MT报文处理相关资料