Java实现简单的七日签到信息
- 数据库设计
- 接口controller层
- 业务层Service
- 效果图
数据库设计
首先创建一个表来存储用户签到信息
接口controller层
1、查询用户签到信息(前端用户展示第几天签到)
2、查看今日是否签到(前端用于签到按钮是否隐藏)
3、点击签到
业务层Service
1、查询签到信息
@Override
public int signMsg() {
long uid = userToken.getUserId();
List<SigninMsg> signMsg = msgMapper.selectList(new EntityWrapper<SigninMsg>()
.eq("uid", uid)
.orderBy("create_time").last("desc"));
// 如果未有签到信息 从第一天开始签到
if (signMsg.isEmpty()) {
return 0;
}
// 获得最后一次签到的时间
int day = signMsg.get(0).getTime();
Date date = signMsg.get(0).getCreateTime();
// 判断 如果上次签到时间与今日相差大于一天 。则掉签
if (DateUtils.differentDaysByMillisecond(date, new Date()) > 1) {
return 0;
}
// 签满七天则 从第一天重新开始
if (day > 7) {
return 0;
}
// 如果 相差时间不大于一天 且 未签满 七天 则续签
return day;
}
2、查看今日是否签到
@Override
public int checkSignToday() {
long uid = userToken.getUserId();
List<SigninMsg> signs = msgMapper.selectList(new EntityWrapper<SigninMsg>()
.eq("uid", uid));
if (signs.isEmpty()) {
return 0;
}
// 获得最后一次签到的时间
Date date = signs.get(0).getCreateTime();
if (DateUtils.greaterDate(new Date(), date)) return 0;
return 1;
}
3、点击签到
@Override
@Transactional(rollbackFor = Exception.class)
public int sign(int number, int day) {
if (number > 10) {
throw new CustomException("签到奖励不能超过10");
}
long uid = userToken.getUserId();
List<SigninMsg> signMsg = msgMapper.selectList(new EntityWrapper<SigninMsg>()
.eq("uid", uid).orderBy("create_time").last("desc"));
// 如果没有签到信息 从第一天开始签到
if (signMsg.isEmpty()) {
SigninMsg msg = new SigninMsg();
msg.setTime(Constant.USER_ON_LINE);
msg.setUid(uid);
msg.setCreateTime(new Date());
msgMapper.insert(msg);
insertForceBill(uid, number, Constant.YLBillKey.SIGN_BILL, Constant.YLBillType.MAGIC);
return day;
}
// 获得最后一次签到的时间
Date date = signMsg.get(0).getCreateTime();
// 判断今日是否签到过
boolean flag = DateUtils.greaterDate(new Date(), date);
if (!flag) throw new CustomException("未满签到时间");
SigninMsg msg = new SigninMsg();
msg.setUid(uid);
msg.setTime(day);
msg.setCreateTime(new Date());
msgMapper.update(msg, new EntityWrapper<SigninMsg>().eq("uid", uid));
return day;
}
效果图