1,最近网站要上一个签到的功能,一个多游戏的平台,每种游戏的官网都有签到功能,设计打算把数据放到平台。
2,首先要设计签到表,这里直接给出过了一遍dba,需求人员,设计人员脑子的结果:
最精彩的地方是signHistory的设计,直接存成bigint,通过转换成二进制来记录签到的历史;
3,预览图
4,功能抽取
非常明显,只有三个主要的功能,第一个签到之前的登录;第二个,签到;第三个,领取礼包;
功能 | 功能概述 | 功能的具体逻辑 | 接口方法设计 |
登录之前的查询 | 通过查询,以前签过到的,显示签到历史;没有签过到的,神马也不显示; | 查询dt_sign表,通过gid和uid查询,如果查询到,返回签到信息,如果没有查到,返回提示信息 | SignMsg loginQuery(int gid,int uid) |
签到 | 点击签到,如果当天已经签过到了,提示已经签过到了;如果从来没有签过到,插入数据,把积分设置为1,连续签到次数设置为1,最后修改时间设置为当天,历史为1;如果今天没有签过到,首先计算出有多少天没签到了,如果是昨天签了的,连续签到次数加1,历史左移一位,积分按照积分规则加上;如果超过两天没有签到,连续签到次数设置为1,历史左移天数位,积分加上签到单次的积分,时间为当前的修改时间; | 首先查询dt_sign,按照gid和uid,如果没查到,插入记录;查到了,判断最后修改时间,做相应的处理; | SignMsg todaySign(int gid,int uid) |
领取礼包 | 点击领取礼包,如果分数够,减去积分,允许该用户领取礼包;如果分数不过,提示积分不够; | 点击领取礼包,如果分数够,减去积分,允许该用户领取礼包;如果分数不过,提示积分不够; | SignMsg getGiftPack(int gid,int uid,int score) |
5,具体实现
jdbc实现:
1 package com.sz7road.userplatform.dao.jdbc; 2 3 import com.google.common.base.Strings; 4 import com.sz7road.userplatform.dao.SignDao; 5 import com.sz7road.userplatform.ws.sign.ScoreRuleAndMoveByte; 6 import com.sz7road.userplatform.ws.sign.Sign; 7 import com.sz7road.userplatform.ws.sign.SignObject; 8 import com.sz7road.utils.CommonDateUtils; 9 import org.apache.commons.dbutils.DbUtils; 10 import org.slf4j.Logger; 11 import org.slf4j.LoggerFactory; 12 13 import java.sql.*; 14 import java.text.ParseException; 15 import java.text.SimpleDateFormat; 16 import java.util.*; 17 import java.util.Date; 18 19 /** 20 * Created with IntelliJ IDEA. 21 * User: cutter.li 22 * Date: 13-1-18 23 * Time: 上午11:01 24 */ 25 public class SignDaoJdbcImp extends JdbcDaoSupport<SignObject> implements SignDao { 26 27 private final static Logger log = LoggerFactory.getLogger(SignDaoJdbcImp.class); 28 29 private Connection conn = null; 30 31 @Override 32 public Sign querySign(int uid, int gid) { 33 Sign sign = new Sign(); 34 ResultSet rs = null; 35 PreparedStatement preparedStatement = null; 36 try { 37 conn = getQueryRunner().getDataSource().getConnection(); 38 preparedStatement = conn.prepareStatement(" select * from db_userplatform.dt_sign where userid=? and gameid=? ;"); 39 40 preparedStatement.setInt(1, uid); 41 preparedStatement.setInt(2, gid); 42 43 rs = preparedStatement.executeQuery(); 44 if (rs.next()) { 45 sign.setCode(200); 46 sign.setMsg("成功的查询到签到信息!"); 47 sign.setContinueSignCount(rs.getInt("signCount")); 48 sign.setTotalScore(rs.getInt("integration")); 49 sign.setLastModifyDate(new Date(rs.getDate("lastModifyTime").getTime())); 50 sign.setSignHistory(rs.getLong("signHistory")); 51 } else { 52 sign.setCode(300); 53 sign.setMsg("该用户从来没有签过到!"); 54 } 55 56 } catch (SQLException e) { 57 sign.setCode(404); 58 sign.setMsg("平台或者db异常!"); 59 e.printStackTrace(); 60 } finally { 61 DbUtils.closeQuietly(rs); 62 try { 63 DbUtils.close(preparedStatement); 64 } catch (SQLException e) { 65 e.printStackTrace(); 66 } 67 DbUtils.closeQuietly(conn); 68 } 69 return sign; 70 } 71 72 73 @Override 74 public Sign signThenReturn(int uid, int gid) { 75 Sign sign = new Sign(); 76 ResultSet rs = null; 77 PreparedStatement preparedStatement = null, executePreparedStatement = null; 78 try { 79 conn = getQueryRunner().getDataSource().getConnection(); 80 preparedStatement = conn.prepareStatement(" select * from db_userplatform.dt_sign where userid=? and gameid=? ;"); 81 preparedStatement.setInt(1, uid); 82 preparedStatement.setInt(2, gid); 83 84 rs = preparedStatement.executeQuery(); 85 if (rs.next()) {//查到了更新 86 SignObject signObject = new SignObject(); 87 signObject.setId(rs.getInt("id")); 88 signObject.setUid(rs.getInt("userid")); 89 signObject.setGid(rs.getInt("gameid")); 90 signObject.setSignCount(rs.getInt("signCount")); 91 signObject.setIntegration(rs.getInt("integration")); 92 signObject.setLastModifyTime(new Date(rs.getDate("lastModifyTime").getTime())); 93 signObject.setSignHistory(rs.getLong("signHistory")); 94 signObject.setExt(rs.getString("ext")); 95 96 97 Timestamp lastModifyTimeStamp = new Timestamp(signObject.getLastModifyTime().getTime()); 98 Timestamp todayStartTimeStamp = CommonDateUtils.getTodayStartTimeStamp(); 99 if (todayStartTimeStamp.after(lastModifyTimeStamp)) {//今天没有签过到 100 final long missDays= (System.currentTimeMillis()-signObject.getLastModifyTime().getTime())/(24*60*60*1000); 101 int newSignCount=signObject.getSignCount(); 102 String newExt="签到"; 103 if(missDays==1) 104 { //连续签到,加分,连续签到次数增加1 ,签到历史移动一位 105 newSignCount+=1; 106 }else 107 {//不连续签到,加分,连续签到次数为1,签到历史移动missDays位 108 newSignCount=1; 109 } 110 if(newSignCount>=91) 111 { //签到超过90天,连续签到次数重置为1 112 newSignCount=1; 113 newExt="连续签到天数重置为1,时间:"+CommonDateUtils.getDate(System.currentTimeMillis()); 114 } 115 final long newSignHistory= ScoreRuleAndMoveByte.moveByte(signObject.getSignHistory(),missDays); 116 final int newIntegration=signObject.getIntegration()+ScoreRuleAndMoveByte.getScoreByRule(newSignCount); 117 executePreparedStatement = conn.prepareStatement(" update db_userplatform.dt_sign set signCount=? , integration=? , signHistory=? , lastModifyTime=? , ext=? where id=?; "); 118 executePreparedStatement.setInt(1, newSignCount); 119 executePreparedStatement.setInt(2, newIntegration); 120 executePreparedStatement.setLong(3, newSignHistory); 121 java.sql.Date signDate= new java.sql.Date(System.currentTimeMillis()); 122 executePreparedStatement.setDate(4,signDate); 123 executePreparedStatement.setString(5,newExt); 124 executePreparedStatement.setInt(6,signObject.getId()); 125 126 int effectRows = executePreparedStatement.executeUpdate(); 127 128 if (effectRows >= 1) { 129 sign.setCode(206); 130 sign.setMsg("签到成功!成功更新数据!"); 131 sign.setContinueSignCount(newSignCount); 132 sign.setLastModifyDate(signDate); 133 sign.setTotalScore(newIntegration); 134 sign.setSignHistory(newSignHistory); 135 } else { 136 sign.setCode(208); 137 sign.setMsg("签到失败,更新数据失败!"); 138 } 139 } 140 else 141 {//今天已经签过到了 142 sign.setCode(300); 143 sign.setMsg("该用户今天已经签过到了!"); 144 sign.setLastModifyDate(signObject.getLastModifyTime()); 145 sign.setContinueSignCount(signObject.getSignCount()); 146 sign.setSignHistory(signObject.getSignHistory()); 147 sign.setTotalScore(signObject.getIntegration()); 148 } 149 150 } else {//没查到,插入 151 executePreparedStatement = conn.prepareStatement(" insert into db_userplatform.dt_sign(userid,gameid,signCount,integration,lastModifyTime,signHistory,ext) values(?,?,1,1,?,1,?); "); 152 executePreparedStatement.setInt(1, uid); 153 executePreparedStatement.setInt(2, gid); 154 final java.sql.Date insertDate= new java.sql.Date(System.currentTimeMillis()); 155 executePreparedStatement.setDate(3, insertDate); 156 executePreparedStatement.setString(4,"首次签到,时间:"+insertDate); 157 int effectRows = executePreparedStatement.executeUpdate(); 158 159 if (effectRows >= 1) { 160 sign.setCode(200); 161 sign.setMsg("该用户第一次签到!成功插入数据!"); 162 sign.setContinueSignCount(1); 163 sign.setLastModifyDate(insertDate); 164 sign.setTotalScore(1); 165 sign.setSignHistory(1); 166 } else { 167 sign.setCode(204); 168 sign.setMsg("该用户第一次签到,插入数据失败!"); 169 } 170 171 } 172 } catch (SQLException e) { 173 sign.setCode(404); 174 sign.setMsg("平台或者db异常!"); 175 e.printStackTrace(); 176 } finally { 177 DbUtils.closeQuietly(rs); 178 try { 179 DbUtils.close(preparedStatement); 180 } catch (SQLException e) { 181 e.printStackTrace(); 182 } 183 DbUtils.closeQuietly(conn); 184 } 185 return sign; 186 } 187 188 @Override 189 public Sign getGiftPackThenReturn(int uid, int gid, int giftPackScore) { 190 Sign sign = new Sign(); 191 ResultSet rs = null; 192 PreparedStatement preparedStatement = null, executePreparedStatement = null; 193 try { 194 conn = getQueryRunner().getDataSource().getConnection(); 195 preparedStatement = conn.prepareStatement(" select * from db_userplatform.dt_sign where userid=? and gameid=? and integration >=? ;"); 196 197 preparedStatement.setInt(1, uid); 198 preparedStatement.setInt(2, gid); 199 preparedStatement.setInt(3, giftPackScore); 200 201 rs = preparedStatement.executeQuery(); 202 if (rs.next()) { //如果查到了减去积分 203 SignObject signObject = new SignObject(); 204 205 signObject.setId(rs.getInt("id")); 206 signObject.setUid(rs.getInt("userid")); 207 signObject.setGid(rs.getInt("gameid")); 208 signObject.setSignCount(rs.getInt("signCount")); 209 signObject.setIntegration(rs.getInt("integration")); 210 signObject.setLastModifyTime(new Date(rs.getDate("lastModifyTime").getTime())); 211 signObject.setSignHistory(rs.getLong("signHistory")); 212 signObject.setExt(rs.getString("ext")); 213 214 215 executePreparedStatement = conn.prepareStatement(" update db_userplatform.dt_sign set integration=? where id=? ;"); 216 executePreparedStatement.setInt(1, signObject.getIntegration() - giftPackScore); 217 executePreparedStatement.setInt(2, signObject.getId()); 218 219 int effectRows = executePreparedStatement.executeUpdate(); 220 221 if (effectRows >= 1) { 222 sign.setCode(200); 223 sign.setMsg("成功领取礼包,积分消耗" + giftPackScore); 224 sign.setLastModifyDate(signObject.getLastModifyTime()); 225 sign.setContinueSignCount(signObject.getSignCount()); 226 sign.setSignHistory(signObject.getSignHistory()); 227 sign.setTotalScore(signObject.getIntegration() - giftPackScore); 228 } else { //减去积分失败 229 sign.setCode(400); 230 sign.setMsg("领取礼包失败,积分没有减去!"); 231 } 232 } else { //没查到,说明积分不够 返回300 233 sign.setCode(300); 234 sign.setMsg("积分不够领取礼包!"); 235 } 236 } catch (Exception e) {//发生异常则是404 237 sign.setCode(404); 238 sign.setMsg("平台或db异常"); 239 e.printStackTrace(); 240 } finally { 241 DbUtils.closeQuietly(rs); 242 try { 243 DbUtils.close(preparedStatement); 244 } catch (SQLException e) { 245 e.printStackTrace(); 246 } 247 DbUtils.closeQuietly(conn); 248 } 249 return sign; 250 } 251 }
移位和规则类:
package com.sz7road.userplatform.ws.sign; import java.math.BigInteger; /** * Created with IntelliJ IDEA. * User: cutter.li * Date: 13-1-18 * Time: 下午5:24 * 移位和积分规则类 */ public class ScoreRuleAndMoveByte { public static Long moveByte(long oldHistory,long moveAmonut) { long moveResult= oldHistory<<moveAmonut; long result= Long.parseLong(toFullBinaryString(moveResult),2)+1; return result; } /** * 读取 * @param num * @return */ private 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.连续签到10天,一次性奖励2积分 4.连续签到30天,一次性奖励10积分 5.连续签到60天,一次性奖励30积分 6.连续签到90天,一次性奖励100积分 * @param signCount 连续签到次数 * @return 增加的积分 */ public static int getScoreByRule(int signCount) { int addScore=1; if(signCount==10) { addScore+=2; } else if(signCount==30) { addScore+=10; } else if(signCount==60) { addScore+=30; } else if(signCount==90) { addScore+=100; } return addScore; } public static void main(String[] args) { long result= moveByte(1,3); System.out.println("移位结果:"+result); System.out.println("连续签到次数9:所增加的积分:"+getScoreByRule(9)); System.out.println("连续签到次数10:所增加的积分:"+getScoreByRule(10)); System.out.println("连续签到次数29:所增加的积分:"+getScoreByRule(29)); System.out.println("连续签到次数30:所增加的积分:"+getScoreByRule(30)); System.out.println("连续签到次数59:所增加的积分:"+getScoreByRule(59)); System.out.println("连续签到次数60:所增加的积分:"+getScoreByRule(60)); System.out.println("连续签到次数89:所增加的积分:"+getScoreByRule(89)); System.out.println("连续签到次数90:所增加的积分:"+getScoreByRule(90)); System.out.println("连续签到次数91:所增加的积分:"+getScoreByRule(91)); } }
各位屌丝,有什么可以进一步优化的,欢迎联系我,共同进步是我觉得最开心的事情!
2013-01-22 16:22:24
相关推荐
基于微信小程序的生签到系统服务端用Java开发的网站后台,接收并且处理微信小程序端传入的json数据,数据库用到了MySQL数据库作为数据的存储。这样就让用户用着方便快捷,都通过同一个后台进行业务处理,而后台又...
毕业设计,微信小程序+SSM后端+MySql开发的学生签到系统小程序,内含完整源代码,数据库脚本,论文视频,视频教程 社会发展日新月异,用计算机应用实现数据管理功能已经算是很完善的了,但是随着移动互联网的到来,...
8、 微会员卡:微时代,永不挂失的会员卡,可每日签到吸引粉丝参与的积极性,可分兑换,发放优惠卷等功能 9、 微查询:如天气查询、手机归属地查询、公交换乘查询、公交查询、火车车次查询、健康指数查询、翻译、...
模块设计 20 6.1功能设计说明 20 6.2程序描述 20 7.系统出错设计 20 7.1出错信息 20 7.2补救措施 20 7.3系统维护设计 20 8.系统安全性设计 21 9.服务器要求 22 电子商务会员与积分系统设计全文共34页,当前为第2页。...
毕设&端云结合的人脸识别签到系统,后端采用SpringBoot开发,Android客户端采用MMVM框架,签到终端基于ESP32与STM32进行人脸识别 【项目资源】: 包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理...
主要连接acess数据库实现登录注册签到等功能,在产品展示一栏中可以进行搜索,搜索出相关产品信息。后台管理界面需要以管理员身份登录后可以对主界面产品顺序按照点击量排序,主界面的产品点击后连接数据库点击量...
再比如,实现静态资源访问功能,还要使用文件读取模块,对文件内容读取,还要设计响应内容类型,但实际和网站本身的业务逻辑没有关系;再者,接收post请求参数的代码,需要对请求对象添加事件,手动拼接请求参数,对...
网站管理员登录效果图如图5-1所示: 图5-1管理员登录界面 5.2 管理员功能模块 5.2.1部门类型管理 管理员对部门类型管理进行获取类型等信息进行删除、修改等操作。程序成效图如下图5-2所示: 图5-2部门类型管理...
(1)根据调研和需求分析完成系统功能设计,系统功能如下: ①权限管理模块 权限管理分为管理员,老师和学生; 管理员:可以对老师和学生进行,进行信息录入、修改、删除、查询。 老师:可以查看自己和学生的信息。 ...
软件开发设计:PHP、QT、应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、...
百度贴吧签到网站源码Java FancyBBS 引言 编写本文目的 本项目为BBS论坛系统,书写此文档是为了确定用户对本系统的真正需求,确定一份完整、准确、清晰、具体的系统要求及设计方案,从而有效地帮助开发人员实现此...
考勤记录:学生可以通过网站进行每日的考勤记录,包括签到时间、签退时间等,系统可以自动记录学生的考勤信息。 请假管理:学生可以通过网站提交请假申请,包括请假类型、请假时间段、请假原因等,系统支持教师或...
8、 微会员卡:微时代,永不挂失的会员卡,可每日签到吸引粉丝参与的积极性,可分兑换,发放优惠卷等功能 9、 微查询:如天气查询、手机归属地查询、公交换乘查询、公交查询、火车车次查询、健康指数查询、翻译、...
4.功能点描述: 系统的需求背景 学校拟开发一套青年志愿者信息管理系统,实现青年志愿者档案信息的管理志愿者活动通知公告管理、志愿者活动组织实施过程管理。需求描述如下: (1)志愿者活动流程是青年志愿者协会...
集成会员中心模块:支持用户自主上传头像、用户自主上传封面、拥有大V认证、VIP会员系统、私信系统、充值系统、金币系统、用户等级系统、支持签到功能、用户关注功能、被关注/赞/赏等提醒功能。 集成SNS社交功能:...
- 具有签到、后台授权、后台管理、网页GM功能 效果图: ![image](/Hk4e-Cdk-Interaction.png) 功能说明 根目录下 - 首页: DailySignIn.html - 服主快捷功能:AccountAuth.html 在Index目录下 - CDK兑换:...
其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始...
包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。 包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python...