Java 实现简单的签到领金币功能

Java实现简单的签到领金币功能

简介

现在很多APP上都会有签到的功能,签到领金币或者领积分等等。最近也正好遇到了一个这样的业务,并且规则是连续签到每天的金币不一样,要是断了,再签到的话重新从第一天金币数开始。并且有个补签功能,一星期只能补签一次,假如中断了两天,补了第二个补签那天,而后面是有连续签到记录的,则金币为一周期内第一天的金币数补上,如果补了中断两天里的第一天,那就按一周期里那是第几天的金币加。

思路

既然这样,解决方案就需要两张表,一张是数据字典表,告诉我七天里每天的金币数是多少;另一张是用户签到表;而前端传参的话需要两个参数,一个是补签天数,如果是补签就传补签当天的时间参数;另一个参数是当前周期七天里的第几天。然后每点击签到一次,在签到表里新增一条记录,并且保存状态是否补签,根据传参的天数用代码判断前一天是否有签到记录。

如果前一天有签到记录,计算出前面签了几天,那今天就是该领这个天数金币;如果前面没有签到记录,那就是第一天的金币数,就正好符合了需求:正常签到,根据天数领取相应金币;补签规则如果12345五天,23中断了,145签到了,假设补签了3,那就领取1的金币数,假设补签了2,因1已经签过,领取2的金币数

代码

有了以上的解决思路,那就上代码,先看数据字典表
数据字典
顺序依次是:主键,金币数,描述,用来查询条件的value,根据这个value获取金币数

签到表就不贴图了,设计公司业务,大致的字段就是:主键,签到用户,签到时间,签到状态(是否补签)

上重点,贴代码
在这里插入图片描述
解说一下,代码很简单,这是个Service方法,再Controller层已经做了今天是否签到过的判断,如果签到过进不来这个方法的。

这个定义了一个status,用来判断前端是否传入了时间参数,上面说到,要是传了就是补签,补签状态是1,正常是2,正常的话取当天时间存入签到表,不然就是传入的时间存入。重点在于循环,根据前端传入的周期里的某一天作为循环次数,再根据传入的时间或者当前时间以及用户ID去签到表里查记录,并且是查询过一次之后时间设置为前一天,连续签到数 + 1来计算出前面签到过多少天。这样的话天数已经拿到了,就可以把天数传入数据字典表里value进行查询金币,然后更新用户账户金币数。

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现连续签到加分的Java代码可以参考以下示例: ``` // 定义签到记录类 public class SignInRecord { private Date signInDate; private int signInScore; public SignInRecord(Date signInDate, int signInScore) { this.signInDate = signInDate; this.signInScore = signInScore; } public Date getSignInDate() { return signInDate; } public int getSignInScore() { return signInScore; } } // 定义签到管理类 public class SignInManager { private List<SignInRecord> signInRecords; private int maxContinuousDays; // 最大连续签到天数 private int continuousDays; // 当前连续签到天数 private int signInScore; // 签到得分 public SignInManager() { signInRecords = new ArrayList<>(); maxContinuousDays = 0; continuousDays = 0; signInScore = 0; } public void signIn() { Date today = new Date(); int score = 1; if (!signInRecords.isEmpty()) { // 判断是否连续签到 Date lastSignInDate = signInRecords.get(signInRecords.size() - 1).getSignInDate(); if (isContinuousSignIn(lastSignInDate, today)) { continuousDays++; score = continuousDays; if (continuousDays > maxContinuousDays) { maxContinuousDays = continuousDays; } } else { continuousDays = 1; } } signInRecords.add(new SignInRecord(today, score)); signInScore += score; } public int getMaxContinuousDays() { return maxContinuousDays; } public int getContinuousDays() { return continuousDays; } public int getSignInScore() { return signInScore; } // 判断是否连续签到 private boolean isContinuousSignIn(Date lastSignInDate, Date today) { Calendar lastCal = Calendar.getInstance(); lastCal.setTime(lastSignInDate); int lastYear = lastCal.get(Calendar.YEAR); int lastDayOfYear = lastCal.get(Calendar.DAY_OF_YEAR); Calendar todayCal = Calendar.getInstance(); todayCal.setTime(today); int todayYear = todayCal.get(Calendar.YEAR); int todayDayOfYear = todayCal.get(Calendar.DAY_OF_YEAR); return lastYear == todayYear && todayDayOfYear - lastDayOfYear == 1; } } ``` 实现App签到功能Java代码可以参考以下示例: ``` // 定义签到记录类 public class SignInRecord { private Date signInDate; public SignInRecord(Date signInDate) { this.signInDate = signInDate; } public Date getSignInDate() { return signInDate; } } // 定义签到管理类 public class SignInManager { private List<SignInRecord> signInRecords; public SignInManager() { signInRecords = new ArrayList<>(); } public void signIn() { Date today = new Date(); signInRecords.add(new SignInRecord(today)); } public int getSignInCount() { return signInRecords.size(); } public boolean hasSignedInToday() { if (signInRecords.isEmpty()) { return false; } Date lastSignInDate = signInRecords.get(signInRecords.size() - 1).getSignInDate(); Calendar lastCal = Calendar.getInstance(); lastCal.setTime(lastSignInDate); int lastYear = lastCal.get(Calendar.YEAR); int lastDayOfYear = lastCal.get(Calendar.DAY_OF_YEAR); Calendar todayCal = Calendar.getInstance(); int todayYear = todayCal.get(Calendar.YEAR); int todayDayOfYear = todayCal.get(Calendar.DAY_OF_YEAR); return lastYear == todayYear && lastDayOfYear == todayDayOfYear; } } ``` 这两份代码仅供参考,实际应用中还需要根据业务需求进行相应的调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值