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 相关文章推荐
数字转英文
Dec 06 PHP
PHP音乐采集(部分代码)
Feb 14 PHP
php记录日志的实现代码
Aug 08 PHP
PHP读取xml方法介绍
Jan 12 PHP
解析PHP汉字转换拼音的类
Jun 18 PHP
关于url地址传参数时字符串有回车造成页面脚本赋值失败的解决方法
Jun 28 PHP
PHP文件读取功能的应用实例
May 08 PHP
用PHP代码给图片加水印
Jul 01 PHP
PDO的安全处理与事物处理方法
Oct 31 PHP
PHP中quotemeta()函数的用法讲解
Apr 04 PHP
关于laravel模板中生成URL的几种模式总结
Oct 18 PHP
php+laravel依赖注入知识点总结
Nov 04 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处理斐波那契数列非递归方法
2012/02/04 PHP
PHP生成图像验证码的方法小结(2种方法)
2016/07/18 PHP
php插入含有特殊符号数据的处理方法
2016/11/24 PHP
php和C#的yield迭代器实现方法对比分析
2019/07/17 PHP
PHP连接SQL server数据库测试脚本运行实例
2020/08/24 PHP
PHP实现简单注册登录系统
2020/12/28 PHP
简单几行JS Code实现IE邮件转发新浪微博
2013/07/03 Javascript
将list转换为json失败的原因
2013/12/17 Javascript
JQuery以JSON方式提交数据到服务端示例代码
2014/05/05 Javascript
Bootstrap3制作自己的导航栏
2016/05/12 Javascript
jQuery添加options点击事件并传值实例代码
2016/05/18 Javascript
实现easyui的datagrid导出为excel的示例代码
2016/11/10 Javascript
vue单页应用中如何使用jquery的方法示例
2017/07/27 jQuery
Angular2+国际化方案(ngx-translate)的示例代码
2017/08/23 Javascript
vue3.0 搭建项目总结(详细步骤)
2019/05/20 Javascript
vue 父组件中调用子组件函数的方法
2019/06/06 Javascript
jquery分页优化操作实例分析
2019/08/23 jQuery
[01:07:15]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第二场 1月25日
2021/03/11 DOTA
Python selenium 三种等待方式详解(必会)
2016/09/15 Python
Python增量循环删除MySQL表数据的方法
2016/09/23 Python
修复 Django migration 时遇到的问题解决
2018/06/14 Python
python引入不同文件夹下的自定义模块方法
2018/10/27 Python
python 多线程对post请求服务器测试并发的方法
2019/06/13 Python
Django自关联实现多级联动查询实例
2020/05/19 Python
python的flask框架难学吗
2020/07/31 Python
golang/python实现归并排序实例代码
2020/08/30 Python
社区版pycharm创建django项目的方法(pycharm的newproject左侧没有项目选项)
2020/09/23 Python
Infababy英国:婴儿推车、Travel System婴儿车和婴儿汽车座椅销售
2018/05/23 全球购物
微型企业创业投资计划书
2014/01/10 职场文书
见习期自我鉴定
2014/01/31 职场文书
监护人证明
2015/06/19 职场文书
公司员工管理制度
2015/08/04 职场文书
读《工匠精神》有感:热爱工作,精益求精
2019/12/28 职场文书
Python机器学习实战之k-近邻算法的实现
2021/11/27 Python
vue elementUI批量上传文件
2022/04/26 Vue.js
HTML中实现音乐或视频自动播放案例详解
2022/05/30 HTML / CSS