关闭

签到,打卡领取积分,记录连续签到,获取签到排名。

标签: 签到积分兑换工具方法
1225人阅读 评论(1) 收藏 举报
分类:

签到,打卡领取积分,记录连续签到,获取签到排名。

1、签到表的设计

CREATE TABLE `signin` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userId` int(11) DEFAULT NULL COMMENT '用户ID',
  `signCount` int(11) DEFAULT NULL COMMENT '连续签到次数',
  `beforRank` varchar(32) CHARACTER SET utf8 DEFAULT NULL COMMENT '前天签到排名',
  `yesRank` varchar(32) CHARACTER SET utf8 DEFAULT NULL COMMENT '昨天签到排名',
  `todayRank` varchar(32) CHARACTER SET utf8 DEFAULT NULL COMMENT '今天签到排名',
  `signHistory` bigint(4) DEFAULT NULL COMMENT '签到历史,bit位数表示历史签到',
  `modifyTime` datetime DEFAULT NULL COMMENT '签到时间(也即修改时间)',
  `ext` varchar(32) CHARACTER SET utf8 DEFAULT NULL COMMENT '预留字段',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=gbk;

2、签到功能
2.1 签到

    /**
     * 签到
     */
    public void sign(){
        int userId=getParaToInt("id");
        Integer signCount=0;//连续签到次数
        long signHistory=0; //最精彩的设计之处:用bit位表示历史签到
        Date modifyTime=null;//最后签到时间
        Integer vantages=0; //用户表中积分
        String userName="";
        String msg=null;
        //获取用户积分
        String userSql="SELECT id,vantages FROM users WHERE id="+userId;
        Record user=Db.findFirst(userSql);
        if(user==null){
            msg="没有用户id";
            System.out.print("没有用户id");
            return ;
        }
        vantages=user.getInt("vantages");
        if(vantages==null){
            vantages=0;
        }
        //查询用户的签到表
        String signSql="SELECT id,userId,signCount,signHistory,modifyTime,beforRank,yesRank,todayRank "
                     + "FROM signIn WHERE userId="+userId;
        Record userSign=Db.findFirst(signSql);
        //现在时间应该是当天起始时间。
        Date todayStartTime=getTodayStartTime();
        DateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String startTime=df.format(todayStartTime);
        if(userSign==null){//没有签到过,第一次签到,执行插入
            msg="欢迎您第一次签到";
            System.out.print("欢迎第一次签到");
            signHistory=moveByte(signHistory,1);
            signCount=1;
            vantages=vantages+1;
            modifyTime=new Date();//时间精度?timestamp
            SignIn signIn=new SignIn();
            signIn.set("userId", userId);
            signIn.set("signHistory",signHistory);
            signIn.set("signCount",signCount);
            signIn.set("modifyTime",modifyTime);
            //积分的修改
            user.set("vantages", vantages);
            //记录保存
            Db.update("users", user);
            String rankSql="SELECT COUNT(0)+1 signRank FROM signIn WHERE modifyTime <= NOW() AND modifyTime>='"+startTime+"'";
            Record rank=Db.findFirst(rankSql);
            signIn.set("todayRank", rank.get("signRank"));
            signIn.save();
        }else{
            signHistory=userSign.get("signHistory");
            signCount=userSign.get("signCount");
            modifyTime=userSign.getDate("modifyTime");//上次签到时间
            if(todayStartTime.after(modifyTime)){//今天没有签到
                //查询排名
                String rankSql="SELECT COUNT(0)+1 signRank FROM signIn WHERE modifyTime <= NOW() AND modifyTime>='"+startTime+"'";
                Record rank=Db.findFirst(rankSql);
                userSign.set("beforRank", userSign.get("yesRank"));
                userSign.set("yesRank", userSign.get("todayRank"));
                userSign.set("todayRank", rank.get("signRank"));
                //计算是否为连续签到
                final long missDays=(System.currentTimeMillis()-modifyTime.getTime())/(24*60*60*1000);
                if(missDays==1){//连续签到
                    signCount++;
                    vantages=vantages+getScoreByRule(signCount);
                    msg="您已连续签到"+signCount+"天,请再接再励";
                }else{//不连续签到
                    signCount=1;
                    vantages=vantages+1;
                    msg="恭喜您已签到成功";
                }
                modifyTime=new Date();
                signHistory=moveByte(signHistory,missDays);
                userSign.set("signCount", signCount);
                userSign.set("signHistory",signHistory);    
                userSign.set("modifyTime", modifyTime);
                user.set("vantages", vantages);
                Db.update("users", user);
                Db.update("signIn",userSign);
            }else{
                msg="您今天已经签到过了";
            }
        }
        setAttr("msg",msg);
        setAttr("vantages",vantages);
        renderJson();
    }

2.2 查看签到排名

    /**
     * 查看签到排名
     */
    public void rank(){
        //查询个人签到排名记录
        Integer userId=getParaToInt();
        String signSql="SELECT s.id,s.userId,realname,beforRank,yesRank,todayRank "
                 + "FROM signIn s JOIN users u ON s.userId=u.id "
                 + " WHERE userId="+userId;
        Record userSign=Db.findFirst(signSql);
        //签到排名表
        Date todayStartTime=getTodayStartTime();
        DateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String today=df.format(todayStartTime);
        String rankSql="SELECT s.id,u.realname,u.areaname,s.modifyTime,t.truckNum "
                + "FROM (signin s  JOIN users u ON u.id=s.userId) JOIN truck t ON s.userId=t.usersId "
                + "WHERE s.modifyTime >'"+today+"'"+" ORDER BY s.modifyTime ASC";
        List<Record> rankList=Db.find(rankSql);
        setAttr("userSign", userSign);
        setAttr("rankList", rankList);
        render("/front/driver/sign/rank.jsp");
    }

2.3 积分兑换奖品

    /**
     * 兑换奖品,返回兑换码.
     * 目前奖品只是虚拟奖品,现场发放,不通过商家端领取。
     * 用户表的积分,奖品表的库存,兑换表:手机,userId,time
     */
    public void exchange(){
        Integer awardId=getParaToInt("awardId");//奖品的ID
        Integer userId =getParaToInt("userId");
        Integer awardVantages=null;
        Integer stock=null;
        String exchangeCode=null;
        Integer userVantages=null;
        String mobile=null;
        String msg=null;
        Record award=Db.findById("award", awardId);
        stock=award.get("stock");
        awardVantages=award.get("vantages");
        //获取用户的积分
        String userSql="SELECT id,vantages,mobile FROM users WHERE id="+userId;
        Record user=Db.findFirst(userSql); 
        mobile=user.getStr("mobile");
        //获取兑换表
        String exchangeSql="SELECT id,awardId,userId,exchangeCode,exchangeTime FROM awardexchange "
                + "WHERE userId is NULL AND awardId="+awardId;
        Record awardExchange=Db.findFirst(exchangeSql);
        if(user==null){
            msg="用户不存在";
            return ;
        }
        if(award==null||awardExchange==null){
            msg="您所要兑换的奖品不存在";
        }else{
            userVantages=user.getInt("vantages");
            if(stock>0){
                if(userVantages>=awardVantages){
                    exchangeCode=awardExchange.get("exchangeCode");
                    user.set("vantages", userVantages-awardVantages);
                    award.set("stock",stock-1);
                    //兑换表的更新
                    awardExchange.set("userId", userId);
                    awardExchange.set("exchangeTime",new Date());
                    awardExchange.set("mobile",mobile);              
                    {//后续添加事物管理
                        Db.update("users", user);
                        Db.update("award",award);
                        Db.update("awardexchange",awardExchange);
                    }
                    msg="恭喜您已兑换成功,兑换码:"+exchangeCode;
                }else{
                    msg="对不起,您的积分不足,无法兑换该奖品";
                }
            }else{
                msg="对不起,您所选择的奖品,库存不足";
            }
        }
        setAttr("msg", msg);
        renderJson();
    }

2.4 工具方法

/**
     * 移位
     * @param oldHistory
     * @param moveAmount
     * @return
     */
    public static long moveByte(long oldHistory,long moveAmount){
        long moveResult = oldHistory<<moveAmount;
        long result=Long.parseLong(toFullBinaryString(moveResult), 2)+1;
        return result;
    }

    public static String toFullBinaryString(long num){
           final int size=42;
            char[] chs = new char[size];
            for(int i = 0; i < size; i++) {
                chs[size - 1 - i] = (char)(((num >> i) & 1) + '0');
            }
            return new String(chs);
    }


     /**
     * 按照积分规则,得到积分 ,
     * 积分规则如下:
     签到功能说明
     1.每天只能签到一次(按服务器系统时间为准)
     2.连续签到 额外奖励积分,
     3.连续签到1天,奖励1积分
     4.连续签到2天,奖励2积分
     5.连续签到3及以上天数,奖励3积分
     * @param signCount  连续签到次数
     * @return 增加的积分
     */
    public static  int getScoreByRule(int signCount)
    {
        int addScore=0;
        if(signCount==1){
            addScore=1;
        }else if(signCount==2){
            addScore=2;
        }else{
            addScore=3;
        }
        return addScore;
    }

    /**
     * 获取当天的起始时间
     * @param oldTime
     * @param newTime
     */
    public Date getTodayStartTime(){
        Date now=new Date();
        Calendar calendar=Calendar.getInstance();
        calendar.setTime(now);
        calendar.set(Calendar.HOUR_OF_DAY,0);
        calendar.set(Calendar.MINUTE,0);
        calendar.set(Calendar.SECOND,0);
        calendar.set(Calendar.MILLISECOND,0);
        Date startTime=calendar.getTime();
        return startTime;
    }
1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5557次
    • 积分:161
    • 等级:
    • 排名:千里之外
    • 原创:9篇
    • 转载:6篇
    • 译文:0篇
    • 评论:1条
    文章分类
    文章存档