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 相关文章推荐
杏林同学录(九)
Oct 09 PHP
PHP下几种删除目录的方法总结
Aug 19 PHP
PHP的SQL注入过程分析
Jan 06 PHP
php数组一对一替换实现代码
Aug 31 PHP
PHP 使用MySQL管理Session的回调函数详解
Jun 21 PHP
解析PHP获取当前网址及域名的实现代码
Jun 23 PHP
php判断数组元素中是否存在某个字符串的方法
Jun 14 PHP
PHP代码实现爬虫记录――超管用
Jul 31 PHP
微信红包随机生成算法php版
Jul 21 PHP
PHP重定向与伪静态区别
Feb 19 PHP
PHP 计算两个特别大的整数实例代码
May 07 PHP
php中配置文件保存修改操作 如config.php文件的读取修改等操作
May 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
php链表用法实例分析
2015/07/09 PHP
详谈PHP中的密码安全性Password Hashing
2017/02/04 PHP
Laravel 类和接口注入相关的代码
2019/10/15 PHP
传递参数的标准方法(jQuery.ajax)
2008/11/19 Javascript
JavaScript 判断判断某个对象是Object还是一个Array
2010/01/28 Javascript
将字符串转换成gb2312或者utf-8编码的参数(js版)
2013/04/10 Javascript
js和php如何获取当前url的内容
2013/09/22 Javascript
详解jQuery插件开发中的extend方法
2013/11/19 Javascript
javascript模拟订火车票和退票示例
2014/04/24 Javascript
node.js中的console.dir方法使用说明
2014/12/10 Javascript
jQuery实现点击后标记当前菜单位置(背景高亮菜单)效果
2015/08/22 Javascript
JS实现在状态栏显示打字效果完整实例
2015/11/02 Javascript
前端性能优化及技巧
2016/05/06 Javascript
深入剖析JavaScript:Object类型
2016/05/10 Javascript
详解Javascript ES6中的箭头函数(Arrow Functions)
2016/08/24 Javascript
基于JS实现移动端向左滑动出现删除按钮功能
2017/02/22 Javascript
AngualrJs清除定时器遇到的坑
2017/10/13 Javascript
webpack4与babel配合使es6代码可运行于低版本浏览器的方法
2018/10/12 Javascript
vue-cli项目中使用echarts图表实例
2018/10/22 Javascript
js实现京东秒杀倒计时功能
2019/01/21 Javascript
微信JSSDK实现打开摄像头拍照再将相片保存到服务器
2019/11/15 Javascript
Python向MySQL批量插数据的实例讲解
2018/03/31 Python
Python自定义函数实现求两个数最大公约数、最小公倍数示例
2018/05/21 Python
python中slice参数过长的处理方法及实例
2020/12/15 Python
使用HTML5中的contentEditable来将多行文本自动增高
2016/03/01 HTML / CSS
Fabletics官网:美国运动服饰品牌,由好莱坞女演员凯特·哈德森创立
2019/10/19 全球购物
公司业务主管岗位职责
2013/12/07 职场文书
出纳员岗位职责
2014/03/13 职场文书
党员廉洁自律承诺书
2014/05/26 职场文书
烹饪大赛策划方案
2014/05/26 职场文书
婚前财产协议书范本
2014/10/19 职场文书
卢旺达饭店观后感
2015/06/05 职场文书
2016年中学端午节主题活动总结
2016/04/01 职场文书
100句人生哲理语录集锦:强者征服今天,懒汉坐等明天
2019/10/18 职场文书
浅谈由position属性引申的css进阶讨论
2021/05/25 HTML / CSS
使用Springboot实现健身房管理系统
2021/07/01 Java/Android