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静态新闻列表自动生成代码
Jun 14 PHP
destoon供应信息title调用出公司名称的方法
Aug 22 PHP
WordPress中is_singular()函数简介
Feb 05 PHP
PHP输出两个数字中间有多少个回文数的方法
Mar 23 PHP
php传值赋值和传地址赋值用法实例分析
Jun 20 PHP
php外部执行命令函数用法小结
Oct 11 PHP
Yii框架结合sphinx,Ajax实现搜索分页功能示例
Oct 18 PHP
php根据年月获取当月天数及日期数组的方法
Nov 30 PHP
laravel自定义分页效果
Jul 23 PHP
PHP实现用户登录的案例代码
May 10 PHP
php微信公众号开发之关键词回复
Oct 20 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
Mar 12 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隐藏IP地址后两位显示为星号的方法
2014/11/21 PHP
php获取ip及网址的简单方法(必看)
2017/04/01 PHP
jQuery ajax cache缓存问题
2010/07/01 Javascript
Javascript执行效率全面总结
2013/11/04 Javascript
JQuery中使用on方法绑定hover事件实例
2014/12/09 Javascript
学习JavaScript设计模式(封装)
2015/11/26 Javascript
Jquery操作Ajax方法小结
2015/11/29 Javascript
最丑的时钟效果!js canvas时钟制作方法
2016/08/15 Javascript
实例解析js中try、catch、finally的执行规则
2017/02/24 Javascript
基于vue+ bootstrap实现图片上传图片展示功能
2017/05/17 Javascript
详解Nuxt.js Vue服务端渲染摸索
2018/02/08 Javascript
4个顶级JavaScript高级文本编辑器
2018/10/10 Javascript
用npm-run实现自动化任务的方法示例
2019/01/14 Javascript
vue实现表单录入小案例
2019/09/27 Javascript
vue-cli4.0多环境配置变量与模式详解
2020/12/30 Vue.js
[01:26]DOTA2荣耀之路2:iG,China
2018/05/24 DOTA
Python中几个比较常见的名词解释
2015/07/04 Python
Google开源的Python格式化工具YAPF的安装和使用教程
2016/05/31 Python
Python数据可视化正态分布简单分析及实现代码
2017/12/04 Python
matplotlib.pyplot画图 图片的二进制流的获取方法
2018/05/24 Python
解决python给列表里添加字典时被最后一个覆盖的问题
2019/01/21 Python
python实现抽奖小程序
2020/04/15 Python
树莓派使用USB摄像头和motion实现监控
2019/06/22 Python
解决python gdal投影坐标系转换的问题
2020/01/17 Python
Django使用Celery加redis执行异步任务的实例内容
2020/02/20 Python
python json load json 数据后出现乱序的解决方案
2020/02/27 Python
Python3读取和写入excel表格数据的示例代码
2020/06/09 Python
香港化妆品经销商:我的公主
2016/08/05 全球购物
物业管理毕业生个人的求职信
2013/11/30 职场文书
七年级数学教学反思
2014/01/22 职场文书
市优秀教师事迹材料
2014/02/05 职场文书
十周年庆典策划方案
2014/06/03 职场文书
小学校园广播稿(3篇)
2014/09/19 职场文书
2015年店长工作总结范文
2015/04/08 职场文书
基于Go语言构建RESTful API服务
2021/07/25 Golang
Centos7中MySQL数据库使用mysqldump进行每日自动备份的编写
2021/08/02 MySQL