TP5框架实现签到功能的方法分析


Posted in PHP onApril 05, 2020

本文实例讲述了TP5框架实现签到功能的方法。分享给大家供大家参考,具体如下:

基于tp5 模型的一个签到功能;

由于存储所有的签到日期数据库会非常庞大,所以签到日期只存储近三个月的。

具体功能:

1、记录最近一次的签到时间

2、每次签到都会添加15积分

3、有连续签到的记录

CREATE TABLE `sp_sign` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
 `times` datetime DEFAULT NULL COMMENT '最近一次签到时间',
 `userid` int(11) DEFAULT NULL COMMENT '用户id',
 `days` tinyint(6) NOT NULL DEFAULT '0' COMMENT '连续签到的天数',
 `number` decimal(10,0) NOT NULL DEFAULT '0' COMMENT '当月签到给的积分',
 `one` varchar(255) DEFAULT NULL COMMENT '当月签到的日期,用“,”隔开',
 `two` varchar(255) DEFAULT NULL COMMENT '上个月签到的日期,用“,”隔开',
 `three` varchar(255) DEFAULT NULL COMMENT '上上个月签到的日期,用“,”隔开',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
/**
   * 用户签到
   * @param array $userid 用户id
   */
  public function add($userid)
  {
      $data = Db::name('sign')->where('userid',$userid)->select();
      if(count($data) == 0) //没有该用户的签到记录
      {
        $query4 = Db::name('sign')->insert(['times'=>date('Y-m-d H:i:s'),'userid'=>$userid,'days'=>1,'number'=>'15','one'=>date('d',time())]);
        return 1;
      }
      else
      {
        //判断今天是否签到
        $todayBegin=date('Y-m-d'." 00:00:00");
        $todayEnd= date('Y-m-d'." 23:59:59");
        $isexit = Db::name('sign')->field('times')->where(['userid'=>$userid])->where('times','between',[$todayBegin,$todayEnd])->select();
        if(count($isexit) == 1)  //今日已签到
        {
          return 0;
        }
        else  //今日未签到
        {
          $times = Db::name('sign')->where('userid',$userid)->field('times')->select();
          $time = strtotime($times[0]['times']);
 
          if((time()-$time > 24*60*60))    //上次签到时间大于24小时,连续签到天数清零
          {
            $query = Db::name('sign')->where('userid',$userid)->update(['days'=>1]);
          }
          else   //上次签到时间小于24小时,连续签到次数加1
          {
            $query = Db::name('sign')->where('userid',$userid)->setInc('days');
          }
          //更新上次签到时间和签到积分
          $query1 = Db::name('sign')->where('userid',$userid)->update(['times'=>date('Y-m-d H:i:s')]);
          $query2 = Db::name('sign')->where('userid',$userid)->setInc('number', 15);
 
          $sqldate = date('m',$time);  //上次签到日期的月份
          $nowdate = date('m',time()); //当前月份
          //记录本次签到日期
          if($sqldate != $nowdate) //上次签到日期与本次签到日期月份不一样
          {
            $oldtime = $times[0]['times'];
            $onetime=date("Y-m-d H:i:s", strtotime("-1 month")); //获取前1个月的时间,获取格式为2016-12-30 13:26:13
            $twotime=date("Y-m-d H:i:s", strtotime("-2 month")); //获取前2个月的时间
            $threetime=date("Y-m-d H:i:s", strtotime("-3 month")); //获取前3个月的时间
 
            $rs = Db::name('sign')->where('userid',$userid)->field('one,two,three')->select();
 
            if($oldtime < $onetime && $oldtime >= $twotime)   //月份间隔 大于1个月,小于2个月
            {
              $one = date('d',time());
              $two = $rs[0]['one'];
              $three = $rs[0]['two'];
            }
            elseif($oldtime < $twotime && $oldtime >= $threetime) //月份间隔 大于2个月,小于3个月
            {
              $one = date('d',time());
              $two = '';
              $three = $rs[0]['one'];
            }
            elseif($oldtime < $threetime) //月份间隔 大于3个月
            {
              $one = date('d',time());
              $two = '';
              $three = '';
            }
            $query3 = Db::name('sign')->where('userid',$userid)->update(['one'=>$one,'two'=>$two,'three'=>$three]);
          }
          else //上次签到日期与本次签到日期月份一样
          {
            $one = Db::name('sign')->where('userid',$userid)->field('one')->select();
            $arr[] = $one[0]['one'];
            $arr[] = date('d',time());
            $newones = implode(",",$arr);
            $query3 = Db::name('sign')->where('userid',$userid)->update(['one'=>$newones]);
          }
        return 1;
        }
      }
  }

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php启用zlib压缩文件的配置方法
Jun 12 PHP
PHP过滤★等特殊符号的正则
Jan 27 PHP
zf框架的校验器InArray使用示例
Mar 13 PHP
19个Android常用工具类汇总
Dec 30 PHP
使用PHP编写发红包程序
Jul 22 PHP
PHP如何通过AJAX方式实现登录功能
Nov 23 PHP
基于PHP实现用户注册登录功能
Oct 14 PHP
PHP在线打包下载功能示例
Oct 15 PHP
PHP给源代码加密的几种方法汇总(推荐)
Feb 06 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
May 23 PHP
php微信公众号开发之欢迎老朋友
Oct 20 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
Mar 06 PHP
TP5框架页面跳转样式操作示例
Apr 05 #PHP
TP5框架实现的数据库备份功能示例
Apr 05 #PHP
TP5框架实现一次选择多张图片并预览的方法示例
Apr 04 #PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 #PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
Apr 04 #PHP
thinkphp框架表单数组实现图片批量上传功能示例
Apr 04 #PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
Apr 04 #PHP
You might like
Syphon 秘笈
2021/03/03 冲泡冲煮
无刷新动态加载数据 滚动条加载适合评论等页面
2013/10/16 PHP
php使用google地图应用实例
2014/12/31 PHP
[原创]php使用curl判断网页404(不存在)的方法
2016/06/23 PHP
将PHP的session数据存储到数据库中的代码实例
2016/06/24 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
各浏览器中querySelector和querySelectorAll的实现差异分析
2012/05/23 Javascript
javascript事件函数中获得事件源的两种不错方法
2014/03/17 Javascript
js调试工具console.log()方法查看js代码的执行情况
2014/08/08 Javascript
jquery validate和jquery form 插件组合实现验证表单后AJAX提交
2015/08/26 Javascript
简单的jQuery拖拽排序效果的实现(增强动态)
2017/02/09 Javascript
JavaScript实现瀑布流以及加载效果
2017/02/11 Javascript
NodeJS处理Express中异步错误
2017/03/26 NodeJs
JS实现移动端判断上拉和下滑功能
2017/08/07 Javascript
详解vue-cli本地环境API代理设置和解决跨域
2017/09/05 Javascript
Vue CLI3 开启gzip压缩文件的方式
2018/09/30 Javascript
如何封装了一个vue移动端下拉加载下一页数据的组件
2019/01/06 Javascript
原生js实现针对Dom节点的CRUD操作示例
2019/08/26 Javascript
ES6中Promise的使用方法实例总结
2020/02/18 Javascript
Vue 中获取当前时间并实时刷新的实现代码
2020/05/12 Javascript
[00:32]2018DOTA2亚洲邀请赛EG出场
2018/04/03 DOTA
python 随机数生成的代码的详细分析
2011/05/15 Python
分享Python文本生成二维码实例
2016/01/06 Python
python爬虫正则表达式之处理换行符
2018/06/08 Python
如何用Python做一个微信机器人自动拉群
2019/07/03 Python
基于Django实现日志记录报错信息
2019/12/17 Python
将不规则的Python多维数组拉平到一维的方法实现
2021/01/11 Python
利用CSS3实现圆角的outline效果的教程
2015/06/05 HTML / CSS
贷款委托书
2014/08/01 职场文书
班主任开场白
2015/06/01 职场文书
个人向公司借款协议书
2016/03/19 职场文书
优秀新员工事迹材料
2019/05/13 职场文书
解决Pytorch dataloader时报错每个tensor维度不一样的问题
2021/05/28 Python
如何将JavaScript将数组转为树形结构
2021/06/02 Javascript
解析高可用Redis服务架构分析与搭建方案
2021/06/20 Redis
Mysql 数据库中的 redo log 和 binlog 写入策略
2022/04/26 MySQL