thinkPHP实现签到功能的方法


Posted in PHP onMarch 15, 2017

本文实例讲述了thinkPHP实现签到功能的方法。分享给大家供大家参考,具体如下:

数据表:

CREATE TABLE `members_sign` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `uid` int(11) unsigned NOT NULL COMMENT '用户id',
 `days` tinyint(2) unsigned NOT NULL DEFAULT '0' COMMENT '连续签到的天数',
 `is_share` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否分享过',
 `is_sign` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否签到过',
 `stime` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '签到的时间',
 `atime` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '添加时间',
 PRIMARY KEY (`id`),
 KEY `index_uid` (`uid`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=162 DEFAULT CHARSET=utf8 COMMENT='签到分享表';

Controller:

<?php
namespace Member\Controller;
use Member\Controller\MController;
class IndexController extends MController {
  /**
  * 用户中心
  * @param
  */
  public function index(){
    $pre = C('DB_PREFIX');
        // 日历列表
    $monthSign = $this->getMonthSign();
    $dayList = $this->showDays($monthSign);
    // 今天签到
    $data = $this->todayData();
    if($data['is_sign'] == 1){
      $this->assign('isSign',true);
    }
    $this->display();
  }
  /**
  * 执行当天签到
  * @return json 签到成功返回 {status:1,info:'已签到'}
  */
  public function sign(){
    $todayData = $this->todayData();
    if($todayData['is_sign'] == 1){
      $this->successMsg('已签到');
    }else{
      $data = $this->getInsertData($this->uid);
      // 无今天数据
      if($todayData == NULL){
        $data['uid'] = $this->uid;
        $data['atime'] = time();
        $id = M('members_sign')->add($data);
      }else{
        $save = M('members_sign')->where("id = {$todayData['id']}")->save($data);
      }
      if($id or $save){
        $score = $this->getTodayScores($data['days']);
        // 为该用户添加积分
        addScore($this->uid,$score);
        $this->successMsg('已签到',array('score' => $score,'days'=>$data['days']));
      }else{
        $this->errorMsg('签到失败,请刷新后重试!');
      }
    }
  }
  /**
  * 返回每次签到要插入的数据
  *
  * @param int $uid 用户id
  * @return array(
  *  'days'   =>  '天数',
  *  'is_sign'  =>  '是否签到,用1表示已经签到',
  *  'stime'   =>  '签到时间',
  * );
  */
  protected function getInsertData($uid){
    // 昨天的连续签到天数
    $start_time = strtotime(date('Y-m-d 0:0:0',time()-86400))-1;
    $end_time  = strtotime(date('Y-m-d 23:59:59',time()-86400))+1;
    $days = M('members_sign')->where("uid = $uid and atime > $start_time and atime < $end_time")->getField('days');
    if($days){
      $days++;
      if($days > 30){
        $days = 1;
      }
    }else{
      $days = 1;
    }
    return array(
      'days'    => $days,
      'is_sign'  => 1,
      'stime'   => time()
    );
  }
  /**
  * 用户当天签到的数据
  * @return array 签到信息 is_sign,stime 等
  */
  protected function todayData(){
    $time = time();
    $start_stime  = strtotime(date('Y-m-d 0:0:0',$time))-1;
    $end_stime = strtotime(date('Y-m-d 23:59:59',$time))+1;
    return M('members_sign')->field('atime',true)->where("uid = {$this->uid} and atime > $start_stime and atime < $end_stime")->find();
  }
  /**
  * 积分规则,返回连续签到的天数对应的积分
  *
  * @param int $days 当天应该得的分数
  * @return int 积分
  */
  protected function getTodayScores($days){
    if($days == 30){
      return 50;
    }else if($days > 19){
      return 8;
    }else if($days > 9){
      return 5;
    }else{
      return 3;
    }
  }
  /**
  * 显示签到列表
  *
  * @param array  $signDays 某月签到的日期 array(1,2,3,4,5,12,13)
  * @param int $year    可选,年份
  * @param int $month   可选,月份
  * @return string 日期列表<li>1</li>....
  */
  protected function showDays($signDays,$year,$month){
    $time = time();
    $year = $year ? $year : date('Y',$time);
    $month = $month ? $month : date('m',$time);
    $daysTotal = date('t', mktime(0, 0, 0, $month, 1, $year));
    $now = date('Y-m-d',$time);
    $str = '';
    for ($j = 1; $j <= $daysTotal; $j++) {
      $i++;
      $someDay = date('Y-m-d',strtotime("$year-$month-$j"));
      // 小于今天的日期样式
      if ($someDay <= $now){
        // 当天日期样式 tdc = todayColor
        if($someDay == $now){
          // 当天签到过的
          if(in_array($j,$signDays)){
            $str .= '<li class="current fw tdc">'.$j.'</li>';
          }else{
            $str .= '<li class="today fw tdc">'.$j.'</li>';
          }
        }else{
          // 签到过的日期样式 current bfc = beforeColor , fw = font-weight
          if(in_array($j,$signDays)){
            $str .= '<li class="current fw bfc">'.$j.'</li>';
          }else{
            $str .= '<li class="fw bfc">'.$j.'</li>';
          }
        }
      }else{
        $str .= '<li>'.$j.'</li>';
      }
    }
    return $str;
  }
  /**
  * 获取当月签到的天数,与 $this->showDays() 配合使用
  * @return 当月签到日期 array(1,2,3,4,5,12,13)
  */
  protected function getMonthSign(){
    $time  = time();
    $year  = date('Y',$time);
    $month = date('m',$time);
    $day  = date("t",strtotime("$year-$month"));
    $start_stime  = strtotime("$year-$month-1 0:0:0")-1;
    $end_stime = strtotime("$year-$month-$day 23:59:59")+1;
    $list = M('members_sign')->where("uid = {$this->uid} and stime > $start_stime and stime < $end_stime")->order('stime asc')->getField('stime',true);
    foreach ($list as $key => $value){
      $list[$key] = date('j',$value);
    }
    return $list;
  }
}

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP 开源框架22个简单简介
Aug 24 PHP
php download.php实现代码 跳转到下载文件(response.redirect)
Aug 26 PHP
PHP+JS+rsa数据加密传输实现代码
Mar 23 PHP
Laravel框架数据库CURD操作、连贯操作总结
Sep 03 PHP
PHP has encountered a Stack overflow问题解决方法
Nov 03 PHP
php实现短信发送代码
Jul 05 PHP
PHP简单处理表单输入的特殊字符的方法
Feb 03 PHP
PHP实现四种基础排序算法的运行时间比较(推荐)
Aug 11 PHP
Yii框架中jquery表单验证插件用法示例
Oct 18 PHP
PHP中类的自动加载的方法
Mar 17 PHP
PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法
Jun 20 PHP
PHP实现模拟http请求的方法分析
Dec 20 PHP
thinkPHP框架实现图像裁剪、缩放、加水印的方法
Mar 14 #PHP
ThinkPHP框架分布式数据库连接方法详解
Mar 14 #PHP
让ThinkPHP的模板引擎达到最佳效率的方法详解
Mar 14 #PHP
thinkphp3.2实现跨控制器调用其他模块的方法
Mar 14 #PHP
Yii2下点击验证码的切换实例代码
Mar 14 #PHP
php分页查询的简单实现代码
Mar 14 #PHP
php实现购物车产品删除功能(2)
Jul 23 #PHP
You might like
PHP下10件你也许并不了解的事情
2008/09/11 PHP
PHP中的静态变量及static静态变量使用详解
2015/11/05 PHP
PDO::_construct讲解
2019/01/27 PHP
Laravel如何实现自动加载类
2019/10/14 PHP
表单提交时自动复制内容到剪贴板的js代码
2007/03/16 Javascript
&amp;lt;script defer&amp;gt; defer 是什么意思
2009/05/10 Javascript
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
40款非常棒的jQuery 插件和制作教程(系列一)
2011/10/26 Javascript
js arguments对象应用介绍
2012/11/28 Javascript
打开新窗口关闭当前页面不弹出关闭提示js代码
2013/03/18 Javascript
Boostrap基础教程之JavaScript插件篇
2016/09/08 Javascript
js中利用cookie实现记住密码功能
2020/08/20 Javascript
js操作浏览器的参数方法
2017/01/21 Javascript
React实践之Tree组件的使用方法
2017/09/30 Javascript
AngularJS基于http请求实现下载php生成的excel文件功能示例
2018/01/23 Javascript
详解JavaScript中的函数、对象
2019/04/01 Javascript
微信小程序swiper组件实现抖音翻页切换视频功能的实例代码
2020/06/24 Javascript
[05:40]DOTA2荣耀之路6:Wings最后进攻
2018/05/30 DOTA
记录Django开发心得
2014/07/16 Python
Python升级提示Tkinter模块找不到的解决方法
2014/08/22 Python
python OpenCV学习笔记实现二维直方图
2018/02/08 Python
python实现爬取百度图片的方法示例
2019/07/06 Python
文件上传服务器-jupyter 中python解压及压缩方式
2020/04/22 Python
html5手机键盘弹出收起的处理
2020/01/20 HTML / CSS
如何用Lucene索引数据库
2016/02/23 面试题
见习期自我鉴定
2014/01/31 职场文书
施工安全生产承诺书
2014/05/23 职场文书
党员干部廉洁承诺书
2014/05/28 职场文书
小学数学课题方案
2014/06/15 职场文书
信息管理与信息系统专业求职信
2014/06/21 职场文书
党在我心中演讲稿
2014/09/02 职场文书
高中生第一学年自我鉴定2015
2014/09/28 职场文书
群众路线教育实践活动民主生活会个人检查对照思想汇报
2014/10/04 职场文书
岗位竞聘报告范文
2014/11/06 职场文书
单位综合评价意见
2015/06/05 职场文书
初任公务员培训心得体会
2016/01/08 职场文书