Java签到功能实现

  • Post author:
  • Post category:java




数据库表设计



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 版权协议,转载请附上原文出处链接和本声明。