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 模板语句分析及知识技巧
Aug 21 PHP
PHP序列号生成函数和字符串替换函数代码
Jun 07 PHP
phpphp图片采集后按原路径保存图片示例
Feb 18 PHP
PHP单例模式详细介绍
Jul 01 PHP
PHP设置头信息及取得返回头信息的方法
Jan 25 PHP
composer.lock文件的作用
Feb 03 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
Jul 20 PHP
thinkPHP5.0框架安装教程
Mar 25 PHP
PHP编译configure时常见错误的总结
Aug 17 PHP
PHP迭代与递归实现无限级分类
Aug 28 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解
Apr 09 PHP
Laravel5框架自定义错误页面配置操作示例
Apr 17 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
星际争霸 Starcraft 秘技补丁
2020/03/14 星际争霸
最小化数据传输――在客户端存储数据
2006/10/09 PHP
dede全站URL静态化改造[070414更正]
2007/04/17 PHP
PHP远程连接MYSQL数据库非常慢的解决方法
2008/07/05 PHP
splice slice区别
2006/10/09 Javascript
javascript中简单的进制转换代码实例
2013/10/26 Javascript
JavaScript中的prototype.bind()方法介绍
2014/04/04 Javascript
jQuery统计指定子元素数量的方法
2015/03/17 Javascript
javascript日期计算实例分析
2015/06/29 Javascript
jQuery实现在最后一个元素之前插入新元素的方法
2015/07/18 Javascript
基于jquery实现一个滚动的分步注册向导-附源码
2015/08/26 Javascript
JavaScript iframe数据共享接口实现方法
2016/01/06 Javascript
jQuery Ajax和getJSON获取后台普通json数据和层级json数据用法分析
2016/06/08 Javascript
BootStrap Validator使用注意事项(必看篇)
2016/09/28 Javascript
AngularJS创建自定义指令的方法详解
2016/11/03 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
AngularJS实践之使用ng-repeat中$index的注意点
2016/12/22 Javascript
js自制图片放大镜功能
2017/01/24 Javascript
jQuery实现 RadioButton做必选校验功能
2017/06/15 jQuery
微信小程序实现星级评分和展示
2018/07/05 Javascript
React父子组件间的传值的方法
2018/11/13 Javascript
判断iOS、Android以及PC端的示例代码
2018/11/15 Javascript
[00:12]DAC SOLO赛卫冕冠军 VG.Paparazi灬展现SOLO技巧
2018/04/06 DOTA
python解决字典中的值是列表问题的方法
2013/03/04 Python
简单文件操作python 修改文件指定行的方法
2013/05/15 Python
Ubuntu下Python2与Python3的共存问题
2018/10/31 Python
python爬虫之自制英汉字典
2019/06/24 Python
Python使用selenium + headless chrome获取网页内容的方法示例
2019/10/16 Python
Python中remove漏删和索引越界问题的解决
2020/03/18 Python
一个非常简单好用的Python图形界面库(PysimpleGUI)
2020/12/28 Python
澳大利亚宠物食品和药物在线:Jumbo Pets
2018/03/24 全球购物
找工作求职信
2014/07/07 职场文书
推普周活动总结
2014/08/28 职场文书
公证书格式
2015/01/23 职场文书
二十年同学聚会感言
2015/07/30 职场文书
python3 sqlite3限制条件查询的操作
2021/04/07 Python