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 相关文章推荐
第十一节--重载
Nov 16 PHP
PHP中几个常用的魔术常量
Feb 23 PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
Oct 06 PHP
解析array splice的移除数组中指定键的值,返回一个新的数组
Jul 02 PHP
php格式化日期实例分析
Nov 12 PHP
PHP生成随机密码方法汇总
Aug 27 PHP
PHP实现截取中文字符串不出现?号的解决方法
Dec 29 PHP
基于PHP常用文件函数和目录函数整理
Aug 17 PHP
深入理解PHP的远程多会话调试
Sep 21 PHP
laravel实现按时间日期进行分组统计方法示例
Mar 23 PHP
YII框架关联查询操作示例
Apr 29 PHP
thinkPHP5框架接口写法简单示例
Aug 05 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
PHP 执行系统外部命令 system() exec() passthru()
2009/08/11 PHP
libmysql.dll与php.ini是否真的要拷贝到c:\windows目录下呢
2010/03/15 PHP
PHP邮件群发机实现代码
2016/02/16 PHP
详解Angularjs中的依赖注入
2016/03/11 Javascript
jquery.validate[.unobtrusive]和Bootstrap实现tooltip错误提示问题分析
2016/10/30 Javascript
详解nodejs中exports和module.exports的区别
2017/02/17 NodeJs
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
教你用Cordova打包Vue项目的方法
2017/10/17 Javascript
node和vue实现商城用户地址模块
2018/12/05 Javascript
vue进入页面时滚动条始终在底部代码实例
2019/03/26 Javascript
Vue实现日历小插件
2019/06/26 Javascript
layer ui 导入文件之前传入数据的实例
2019/09/23 Javascript
nodejs使用socket5进行代理请求的实现
2020/02/21 NodeJs
JS页面动态绘图工具SVG,Canvas,VML介简介
2020/10/16 Javascript
Python实现HTTP协议下的文件下载方法总结
2016/04/20 Python
一个基于flask的web应用诞生 组织结构调整(7)
2017/04/11 Python
python如何为创建大量实例节省内存
2018/03/20 Python
Python使用Phantomjs截屏网页的方法
2018/05/17 Python
python中metaclass原理与用法详解
2019/06/25 Python
python 环境搭建 及python-3.4.4的下载和安装过程
2019/07/20 Python
使用Python自动生成HTML的方法示例
2019/08/06 Python
对YOLOv3模型调用时候的python接口详解
2019/08/26 Python
Python对excel的基本操作方法
2021/02/18 Python
css3学习心得分享
2013/08/19 HTML / CSS
美国祛痘、抗衰老药妆品牌:Murad
2016/08/27 全球购物
长青弘远的面试题
2012/06/09 面试题
大四学生找工作的自荐信
2014/03/27 职场文书
小学生新年寄语
2014/04/03 职场文书
企业环保标语
2014/06/10 职场文书
租房协议书
2014/09/12 职场文书
2014年后勤工作总结范文
2014/12/16 职场文书
小学教师个人总结
2015/02/05 职场文书
手术室护士个人总结
2015/02/13 职场文书
《抽屉原理》教学反思
2016/02/20 职场文书
PHP中多字节字符串操作实例详解
2021/08/23 PHP
css3带你实现3D转换效果
2022/02/24 HTML / CSS