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

来源:互联网 发布:mac炉石传说正在运行 编辑:程序博客网 时间:2024/05/01 20:09

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

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
原创粉丝点击