tp5每日签到设计

  • 数据库设计
  • 代码实现

数据库设计

要求:

每个用户可以签到7天,连续签到7天或者中途断签都重新开始计算签到天数,签到会获取对应奖励

分析:

1、连续签到
2、签到7天或者断签重新开始计算天数
3、签到获取奖励

设计:

1、每个用户可以连续签到,这就需要一个字段来记录连续签到天数
2、因为有连续签到7天或者断签重新开始计算的需求,所以需要一个字段来记录签到时间,来判断是否是连续签到从而改变连续签到天数,签到时判断表里的签到时间与现在的时间差是否为1天,为1天则连续签到,天数+1,反之则为断签,天数重置为1
3、签到获取奖励,需要记录签到天数对应的奖励(签到奖励表)

实现:
1、创建签到表(sign_in)

CREATE TABLE `sign_in`  (`id` int(11) NOT NULL COMMENT '主键',`userId` int(11) NULL DEFAULT NULL COMMENT '用户id',`num` int(11) NULL DEFAULT NULL COMMENT '签到天数',`signTime` datetime(0) NULL DEFAULT NULL COMMENT '签到时间',PRIMARY KEY (`id`)
);

2、创建奖励表(sign_in_reward)

CREATE TABLE `sign_in_reward`  (`id` int(11) NOT NULL COMMENT '主键',`coin` int(11) NOT NULL COMMENT '金币',PRIMARY KEY (`id`)
);

3、用户表

CREATE TABLE `user`  (`id` int(11) NOT NULL COMMENT '主键',`userId` int(11) NOT NULL COMMENT '用户id',`coin` int(11) NOT NULL COMMENT '金币',PRIMARY KEY (`id`)
);

代码实现

签到:

/*** @api {post} /minwx/sign/signIn 签到* @apiName signIn* @apiParam {string} userId 用户id* @apiGroup 签到*/public function signIn(){try {$userId = $this->request->param('userId');$signIn = new ModelSignIn();$res = $signIn->get(['userId' => $userId]);// 判断用户是否签到过if ($res) {// 更新用户数据if ($this->diffBetweenTwoDays(date('Y-m-d', time()), substr($res['signTime'], 0, 10)) == 1) {// 连续签到,更新签到时间,签到天数+1$num = $res['num'] + 1;} else {// 没有连续签到,更新签到时间,签到次数初始化为1$num = 1;}$signIn->where(['userId' => $userId])->update(['signTime' => date('Y-m-d H:i:s', time()), 'num' => $num]);} else {// 添加用户数据$signIn->data(['userId' => $this->request->param('userId'),'num' => 1,'signTime' => date('Y-m-d H:i:s', time())]);$signIn->save();}// 获取签到奖励$reward = Db::table('sign_in_reward')->where(['id'=> $num % 7 == 0 ? 7 : $num % 7])->find();// 给予用户奖励$user = new User();$userInfo = $user->where(['userId' => $userId])->setInc('coin', $reward['coin']);return json(['code'=>1,'msg'=>'签到成功','data'=>'']);} catch (Exception $e) {return json(['code'=>-1,'msg'=>'系统错误','err'=>$e->getMessage()]);}}//两个日期之间相差的天数public function diffBetweenTwoDays($day1, $day2){$second1 = strtotime($day1);$second2 = strtotime($day2);if ($second1 < $second2) {$tmp = $second2;$second2 = $second1;$second1 = $tmp;}return ($second1 - $second2) / 86400;}

获取签到:

/*** @api {post} /minwx/sign/getSignIn 获取签到* @apiName getSignIn* @apiParam {string} userId 用户id* @apiGroup 签到*/public function getSignIn(){Db::startTrans();try {$userId= $this->request->param('userId');// 获取用户信息$user = new User();$userInfo = $user->get(['userId' => $userId]);// 获取签到日期$signIn = new ModelSignIn();$arr = $signIn->get(['userId' => $userId]);// 判断是否签到过if ($arr) {// 计算天数$differDay = $this->diffBetweenTwoDays(date('Y-m-d', time()), substr($arr['signTime'], 0, 10));// 0今日签到,1昨日已签到if ($differDay == 0 || $differDay == 1) {// 这里不对数据库的签到天数做处理,可以一直记录连续签到的天数,方便后面需求的拓展// 而在逻辑上连续签到7天需重置签到天数,所以对签到天数做7求余(具体天数看实际项目需求更改求余),得出逻辑需求里的连续签到天数$num = $arr['num'] % 7 == 0 ? 7 : $arr['num'] % 7;} else {// 断签,重置签到天数,因为是获取签到而不是签到,所以num重置为0$num = 0;$signIn->where(['userId' => $userId])->update(['num' => $num]);}// 判断今日是否签到if ($differDay == 0) {// 今天已签到$today = 1;} else {// 今日未签到$today = 0;}} else {// 未签到,插入数据,签到天数为0$num = 0;$today = 0;$signIn->where(['userId' => $userId])->update(['num' => $num]);}// 获取签到奖励$reward = Db::table('sign_in_reward')->order('id')->select();$res = ['coin' => $userInfo['coin'],    // 用户金币'signIn' => $num,  // 签到天数'reward' => $reward,   // 签到奖励'today' => $today  // 今天是否签到(0没有、1有)];Db::commit();return json(['code'=>1,'msg'=>'获取成功','data'=>$res]);} catch (Exception $e) {Db::rollback();return json(['code'=>-1,'msg'=>'系统错误','err'=>$e->getMessage()]);}}

tp5实现每日签到功能相关推荐

  1. 每日签到功能怎么实现的?

    关于网友提出的" 每日签到功能怎么实现的?"问题疑问,本网通过在网上对" 每日签到功能怎么实现的?"有关的相关答案进行了整理,供用户进行参考,详细问题解答如下: ...

  2. js php 实现日历签到_js实现每日签到功能

    本文实例为大家分享了js实现每日签到功能的具体代码,供大家参考,具体内容如下 js: var calUtil = { getDaysInmonth : function(iMonth, iYear){ ...

  3. 基于jQuery的日历+每日签到功能

    公司要开发一个h5页面,里边有一个每日签到抽奖的功能,本以为这样的插件应该会有很多,结果找到的全都是仅生成日历的插件,于是乎就出现了下面这个东西.(前端菜鸟,请大神嘴下留情,也请小伙伴们多提宝贵意见) ...

  4. 每日积分返还的php代码,php实现每日签到功能

    每日签到的功能,供大家参考,具体内容如下 首次签到获得1个积分,第二次签到获得2个积分,第三次签到获得3个积分,以此类推但是签到必须每天连续积分才可以递增,如果有中断再次签到时获得积分仍然从1开始递增 ...

  5. html+css+JavaScript实现每日签到功能

    用户每日签到主要在于实现点击-签到-显示即时时间 本次使用的是原生js实现签到功能,绑定签到按钮点击需要显示的内容,获取网络时间,获取年月日,再对文字进行拼接,最后再进行插入html中的展示内容 下面 ...

  6. js实现每日签到功能

    注:此功能是在借鉴一位前辈的功能上实现的,稍有改动,具体在哪里我又忘了,因为我都是写好了才来博客记录的,所以之前在哪里找的资料没给记住,对不住啦! 不废话,先看效果! 核心js: var calUti ...

  7. 公众号签到领积分怎么做?每日签到功能上架

    每日签到为公众号实现了每日积分签到的的功能,对于吸粉和留存起到了非常重要的意义. 微Sir图文助手可以实现递增签到和签到上限和自定义签到签到回复的功能. 费用:接入微Sir图文助手基础服务后免费使用 ...

  8. java实现用户每日签到功能

    java用户每日签到 签到规则 签到周期以周为单位(最大连续签到天数为 7 天),周一为新的签到周期,所有连续签到天数重新开始计算. 表字段 以下为数据库所需的字段: 代码实现 非全部的代码: /** ...

  9. ios 每日签到功能,模拟连续签到和中断需要重新签到

    闲着没事干,想到之前一个项目有个签到功能,如上图所示,所幸就写出来,难度也不大,因为没有接口,我自己写了本地数据库模拟一些连续签到和中断签到需要重新签到的功能,如果有需要的话,直接跟后台商量写成这样替 ...

最新文章

  1. 未来之城,管理者可能不是人......
  2. SVN:This client is too old to work with working copy…解决的方法
  3. html5父子页面数据传递,使用iframe标签嵌套页面时 如何进行父子页面通讯/传值...
  4. PostgreSQL在何处处理 sql查询之十三
  5. BZOJ4001 TJOI2015概率论(生成函数+卡特兰数)
  6. mysql中字符串拼接函数_MySQL字符串连接函数
  7. 在Flex组件外观实施中使用Scale9
  8. Java 开发新选择?Apache NetBeans IDE 9.0 正式发布
  9. 计算DSP程序运行时间
  10. h5快速制作工具-企业级. 非个人无水印
  11. VS运行程序时遇到0xc0150002的问题
  12. doe五步法_DOE试验设计的五大步骤
  13. django 框架 SQL 语句 查询篇
  14. 莫古力最新服务器,《最终幻想14》将调整现有人口平均化策略
  15. dis ospf brief 命令解读
  16. Vue3基础——条件渲染、列表渲染、事件事件修饰符、父子组件间的数据传递、生命周期钩子
  17. LeetCode刷题笔记 动态规划 股票交易问题
  18. 将Object类对象转为对应实体类对象
  19. NSA局长:美军网络部队已处于战备状态
  20. 常见的语言表示模型(词嵌入、句表示、篇章表示)

热门文章

  1. oracle补丁报错10044,【案例】Oracle补丁 数据库打patch报错OPatch failed with error code 73...
  2. node处理高并发解决方案
  3. nlog官方帮助_Nlog日志组件简介
  4. php文件代码格式化,PHP代码格式化(EditPlus+PHPCB) 支持批量格式化
  5. Kali2021.1汉化教程
  6. 正则表达式中的常用模式字符串及两种匹配模式
  7. 如何利用sql查找表中的重复数据?
  8. 小米无法播放html5,[html5]关于H5视频播放器常见的一些问题汇总
  9. 在 Linux 中查找文件的 4 种方式
  10. 二战考研,决心启程 第一天