常用签到功能实现
数据库表设计
1.用户签到表
id | id |
---|---|
uid | 用户id |
award | 基础奖励 |
extaward | 额外奖励 |
days | 签到天数 |
ctime | 创建时间 |
2.卡路里(积分)表
id | id |
---|---|
uid | 用户id |
calorie | 卡路里(积分) |
type | 类型(签到奖励或者其他奖励) |
info | 信息 |
ctime | 时间 |
代码编写
1.判断用户是否已签到
//检查用户今天是否已签到
public R checkSign(String token) {
// 前端传来的token 里面存的是用户的id
// 实际方法在这里不详细说(可以私聊)
int uid = TokenUtil.getUid(token);
// 查询数据库获取用户签到信息
TUsersign userSign = tUsersignDao.selectByUid(uid);
if (userSign != null) {
// 判断用户是否已经签到
// 参数1 就是用户上次签到时间
// 参数2 是当前时间 根据工具类判断是否签过到
if (DateUtil.dateDays(userSign.getCtime(), new Date()) == 0) {
return R.fail();
}
}
// 没签过到就返回ok
return R.ok();
}
2.签到
public R sign(String token) {
// 从token中获取用户id
int uid = TokenUtil.getUid(token);
// 通过uid查询用户签到情况
TUsersign userSign = tUsersignDao.selectByUid(uid);
TUsersign sign = new TUsersign();
Random random = new Random();
// 设置用户id
sign.setUid(uid);
// 设置基础签到卡路里
if (userSign == null) {
// 初次签到 额外奖励 自己可以设置
sign.setExtaward(SystemConfig.SIGN_INIT);
// 设置签到天数
sign.setDays(1);
} else {
// 不是第一次签到 卡路里基础奖励随机分配 (3-8)
sign.setAward(random.nextInt(SystemConfig.SIGN_MAX - SystemConfig.SIGN_MIN + 1) + SystemConfig.SIGN_MIN);
// 有签到数据
// 验证今日是否签到
long d = DateUtil.dateDays(userSign.getCtime(), new Date());
if (d == 0) {
return R.fail("亲,今日已签到");
} else if (d == 1) {
Integer days = userSign.getDays() + 1;
// 根据不同情况进行奖励 连续签到一年 一星期 一个月
// 三天给不同的额外奖励 自己设置奖励
if (days % 365 == 0) {
sign.setExtaward(SystemConfig.SIGN_YEAR);
} else if (days % 30 == 0) {
sign.setExtaward(sign.getAward() * 5);
} else if (days % 7 == 0) {
sign.setExtaward(sign.getAward() * 3);
} else if (days % 3 == 0) {
sign.setExtaward(sign.getAward() * 2);
}
sign.setDays(days);
} else if (d >= 365) {
// 当上次签到与当前日期相差一年时 给用户回归奖励
// 奖励自己设置
sign.setExtaward(SystemConfig.SIGN_BACK);
// 设置连续签到一天
sign.setDays(1);
} else {
// 签到断开
sign.setDays(1);
}
// 进行数据库插入操作
if (tUsersignDao.insert(sign) > 0) {
int c = sign.getAward() + sign.getExtaward();
// 签到成功 卡路里发生变化
usercalorieService.saveAdd(new UserCalorDto(c, SystemConfig.CALORIE_SIGN, "签到基础奖励" + sign.getAward() + "签到额外奖励" + sign.getExtaward(), uid));
return R.ok();
}
}
return R.fail();
}
3.月签到记录
public R signMonth(String token, String date) {
int uid = TokenUtil.getUid(token);
// 检查date不为空 自己封装的方法
if (StrUtil.checkNotEmpty(date)) {
// 将查到的数据返回
return R.ok(tUsersignDao.selectMonth(uid, date));
}
return R.fail();
}
查数据库时,可以将数据库中时间转化为 ‘%Y-%m’ ,这样就可以查出来一个月的签到记录
4.用户签到记录
public R signList(String token) {
int uid = TokenUtil.getUid(token);
return R.ok(tUsersignDao.selectByUid(uid));
}
到这里,一个简单的签到就结束了,本人小白一个,不喜勿喷,但是欢迎大佬指点,谢谢大家!!!
版权声明:本文为m0_53556997原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。