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 相关文章推荐
从零开始 教你如何搭建Discuz!4.1论坛
Jul 07 PHP
用PHP实现将GB编码转换为UTF8
Nov 25 PHP
Php注入点构造代码
Jun 14 PHP
php flush类输出缓冲剖析
Oct 19 PHP
php下载文件的代码示例
Jun 29 PHP
解析PHP工厂模式的好处
Jun 18 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
Nov 08 PHP
PHP实现无限极分类图文教程
Nov 25 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
Dec 19 PHP
64位windows系统下安装Memcache缓存
Dec 06 PHP
PHP简单字符串过滤方法示例
Sep 04 PHP
PHP中的日期时间处理利器实例(Carbon)
Jun 09 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
Cannot modify header information错误解决方法
2008/10/08 PHP
php二维数组排序与默认自然排序的方法介绍
2013/04/27 PHP
深入理解PHP中的Session和Cookie
2013/06/21 PHP
PHP连接MySQL数据库并以json格式输出
2018/05/21 PHP
PHP标准库(PHP SPL)详解
2019/03/16 PHP
在b/s开发中经常用到的javaScript技术
2006/08/23 Javascript
pjblog修改技巧汇总
2007/03/12 Javascript
使用不同的方法结合/合并两个JS数组
2014/09/18 Javascript
JS实现网页顶部向下滑出的全国城市切换导航效果
2015/08/22 Javascript
详解Bootstrap插件
2016/04/25 Javascript
纯js三维数组实现三级联动效果
2017/02/07 Javascript
js数字舍入误差以及解决方法(必看篇)
2017/02/28 Javascript
JavaScript实现一个带AI的井字棋游戏源码
2018/05/21 Javascript
[01:32:22]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第一场 2月5日
2021/03/11 DOTA
利用Python实现Windows下的鼠标键盘模拟的实例代码
2017/07/13 Python
Python实现改变与矩形橡胶的线条的颜色代码示例
2018/01/05 Python
对python Tkinter Text的用法详解
2018/10/11 Python
详解python深浅拷贝区别
2019/06/24 Python
Python学习笔记之错误和异常及访问错误消息详解
2019/08/08 Python
Pytorch实现GoogLeNet的方法
2019/08/18 Python
win10从零安装配置pytorch全过程图文详解
2020/05/08 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
2020/09/04 Python
matplotlib交互式数据光标mpldatacursor的实现
2021/02/03 Python
ASP.NET Core中的配置详解
2021/02/05 Python
深入浅析CSS3中的Flex布局整理
2020/04/27 HTML / CSS
全球知名旅游社区巴西站点:TripAdvisor巴西
2016/07/21 全球购物
英国护肤品购物网站:Beauty Expert
2016/08/19 全球购物
西班牙最大的在线滑板和街头服饰商店:Fillow.net
2019/04/15 全球购物
利达恒信公司.NET笔试题面试题
2016/03/05 面试题
2014年大学生就业规划书
2014/04/04 职场文书
班主任师德师风自我剖析材料
2014/10/02 职场文书
2014年有孩子的离婚协议书范本
2014/10/08 职场文书
2015年保洁员工作总结
2015/05/04 职场文书
法律意见书范本
2015/06/04 职场文书
工作态度怎么写
2015/06/25 职场文书
拥有这5个特征人,“命”都不会太差
2019/08/16 职场文书