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的header和asp中的redirect比较
Oct 09 PHP
PHPMailer安装方法及简单实例
Nov 25 PHP
PHP 万年历实现代码
Oct 18 PHP
PHP常用的文件操作函数经典收藏
Apr 02 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十四)
Jun 26 PHP
php写入、删除与复制文件的方法
Jun 20 PHP
php可扩展的验证类实例(可对邮件、手机号、URL等验证)
Jul 09 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
Oct 19 PHP
PHP将URL转换成短网址的算法分享
Sep 13 PHP
如何判断php mysqli扩展类是否开启
Dec 24 PHP
PHP实现的链式队列结构示例
Sep 15 PHP
php删除二维数组中的重复值方法
Mar 12 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
thinkphp3.x中cookie方法的用法分析
2016/05/19 PHP
PHP数组对象与Json转换操作实例分析
2019/10/22 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
checkbox 多选框 联动实现代码
2008/10/22 Javascript
对javascript的一点点认识总结《javascript高级程序设计》读书笔记
2011/11/30 Javascript
js操纵跨frame的三级联动select下拉选项实例介绍
2013/05/19 Javascript
JS操作select下拉框动态变动(创建/删除/获取)
2013/06/02 Javascript
JS预览图像将本地图片显示到浏览器上
2013/08/25 Javascript
javascript 上下banner替换具体实现
2013/11/14 Javascript
JavaScript弹出窗口方法汇总
2014/08/12 Javascript
node.js中的http.get方法使用说明
2014/12/14 Javascript
JavaScript返回网页中超链接数量的方法
2015/04/03 Javascript
jQuery控制网页打印指定区域的方法
2015/04/07 Javascript
jQuery on()方法示例及jquery on()方法的优点
2015/08/27 Javascript
jQuery 1.9.1源码分析系列(十五)之动画处理
2015/12/03 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
2016/02/16 Javascript
基于JavaScript实现类似于百度学术高级检索功能
2016/03/02 Javascript
JS+Canvas 实现下雨下雪效果
2016/05/18 Javascript
jQuery如何获取动态添加的元素
2016/06/24 Javascript
基于Vue.js实现数字拼图游戏
2016/08/02 Javascript
前端JS面试中常见的算法问题总结
2016/12/23 Javascript
JavaScript实现form表单的多文件上传
2020/03/27 Javascript
解读ES6中class关键字
2017/11/20 Javascript
vue中使用element-ui进行表单验证的实例代码
2018/06/22 Javascript
[01:10:02]IG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
用Python程序抓取网页的HTML信息的一个小实例
2015/05/02 Python
Python设计模式之命令模式简单示例
2018/01/10 Python
详解python的sorted函数对字典按key排序和按value排序
2018/08/10 Python
pip安装py_zipkin时提示的SSL问题对应
2018/12/29 Python
通过Python编写一个简单登录功能过程解析
2019/09/04 Python
python按顺序重命名文件并分类转移到各个文件夹中的实现代码
2020/07/21 Python
总裁助理岗位职责
2014/02/17 职场文书
中学教师教育感言
2014/02/21 职场文书
驾驶员培训方案
2014/05/01 职场文书
党员干部观看《周恩来四个昼夜》思想汇报
2014/09/10 职场文书
「我的青春恋爱物语果然有问题。-妄言录-」第20卷封面公开
2022/03/21 日漫