最近写项目的时候要写一个每日签到在此记录下话不多说直接上代码
第一步:创建两个表(签到记录表,签到积分表)
签到积分表
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不久,有什么问题希望大佬帮忙指正。