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 相关文章推荐
10个实用的PHP代码片段
Sep 02 PHP
PHP连接SQLServer2005方法及代码
Dec 26 PHP
php生成缩略图示例代码分享(使用gd库实现)
Jan 20 PHP
php分页代码学习示例分享
Feb 20 PHP
php 生成自动创建文件夹并上传文件的示例代码
Mar 07 PHP
php中动态变量用法实例
Jun 10 PHP
php面向对象编程self和static的区别
May 08 PHP
php利用gd库为图片添加水印
Nov 09 PHP
php实现XML和数组的相互转化功能示例
Feb 08 PHP
Yii框架批量插入数据扩展类的简单实现方法
May 23 PHP
总结PHP代码规范、流程规范、git规范
Jun 18 PHP
eval(cmd)与eval($cmd)的区别与联系
Jul 07 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
德劲1107的电路分析与打磨
2021/03/02 无线电
在WAMP环境下搭建ZendDebugger php调试工具的方法
2011/07/18 PHP
php smarty截取中文字符乱码问题?gb2312/utf-8
2011/11/07 PHP
php 注释规范
2012/03/29 PHP
codeigniter教程之上传视频并使用ffmpeg转flv示例
2014/02/13 PHP
CodeIgniter使用smtp服务发送html邮件的方法
2015/06/10 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
2016/03/21 PHP
JavaScript是否可实现多线程  深入理解JavaScript定时机制
2009/12/22 Javascript
js String对象中常用方法小结(字符串操作)
2012/01/27 Javascript
node.js中的fs.open方法使用说明
2014/12/17 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
2015/08/27 Javascript
实例解析jQuery插件EasyUI最常用的表单验证规则
2015/11/29 Javascript
JavaScript SweetAlert插件实现超酷消息警告框
2016/01/28 Javascript
JavaScript语言精粹经典实例(整理篇)
2016/06/07 Javascript
js实现html table 行,列锁定的简单实例
2016/10/13 Javascript
BootStrap整体框架之基础布局组件
2016/12/15 Javascript
Vue文件配置全局变量的实例
2018/09/06 Javascript
一次Webpack配置文件的分离实战记录
2018/11/30 Javascript
Vue.js 中的 v-model 指令及绑定表单元素的方法
2018/12/03 Javascript
JavaScript强制类型转换和隐式类型转换操作示例
2019/05/01 Javascript
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
2019/06/18 jQuery
layer页面跳转,获取html子节点元素的值方法
2019/09/27 Javascript
Element Input输入框的使用方法
2020/07/26 Javascript
python实现自动登录后台管理系统
2018/10/18 Python
python实现合并两个排序的链表
2019/03/03 Python
python批量读取文件名并写入txt文件中
2020/09/05 Python
Keras 利用sklearn的ROC-AUC建立评价函数详解
2020/06/15 Python
css3实现文字首尾衔接跑马灯的示例代码
2020/10/16 HTML / CSS
h5页面唤起app如果没安装就跳转下载(iOS和Android)
2020/06/03 HTML / CSS
应届中专生自荐书范文
2014/02/13 职场文书
《七颗钻石》教学反思
2014/02/28 职场文书
个人求职信范文
2014/05/24 职场文书
优秀班集体先进事迹材料
2014/05/28 职场文书
任命书范本大全
2014/06/06 职场文书
中小学生学籍证明
2014/10/25 职场文书
怎样写观后感
2015/06/19 职场文书