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制作的意见反馈表源码
Mar 11 PHP
php 图片加水印与上传图片加水印php类
May 12 PHP
基于Snoopy的PHP近似完美获取网站编码的代码
Oct 23 PHP
PHP实现根据浏览器跳转不同语言页面代码
Aug 02 PHP
PHP引用(&amp;)各种使用方法实例详解
Mar 20 PHP
WordPress自定义时间显示格式
Mar 27 PHP
PHP中类的继承和用法实例分析
May 24 PHP
php opendir()列出目录下所有文件的实例代码
Oct 02 PHP
详解PHP处理字符串类似indexof的方法函数
Jun 11 PHP
PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法
Aug 11 PHP
php递归函数怎么用才有效
Feb 24 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
Apr 14 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错误抑制符(@)导致引用传参失败Bug的分析
2011/05/02 PHP
基于Zend的Config机制的应用分析
2013/05/02 PHP
php编写批量生成不重复的卡号密码代码
2015/05/14 PHP
PHP5.6新增加的可变函数参数用法分析
2017/08/25 PHP
JS支持带x身份证号码验证函数
2008/08/10 Javascript
JavaScript 异步调用框架 (Part 4 - 链式调用)
2009/08/04 Javascript
Firebug入门指南(Firefox浏览器)
2010/08/21 Javascript
JavaScript使用过程中需要注意的地方和一些基本语法
2010/08/26 Javascript
实现checkbox全选、反选、取消JavaScript小脚本异常
2014/04/10 Javascript
js单词形式的运算符
2014/05/06 Javascript
node.js中的fs.readFileSync方法使用说明
2014/12/15 Javascript
jQuery中map()方法用法实例
2015/01/06 Javascript
JavaScript动态加载样式表的方法
2015/03/21 Javascript
jQuery延迟加载图片插件Lazy Load使用指南
2015/03/25 Javascript
javascript实现简单加载随机色方块
2015/12/25 Javascript
全面解析JavaScript中apply和call以及bind(推荐)
2016/06/15 Javascript
jQuery内容过滤选择器用法示例
2016/09/09 Javascript
Bootstrap的Carousel配合dropload.js实现移动端滑动切换图片
2017/03/10 Javascript
对vue下点击事件传参和不传参的区别详解
2018/09/15 Javascript
Koa代理Http请求的示例代码
2018/10/10 Javascript
Vue.js watch监视属性知识点总结
2019/11/11 Javascript
Python实现模拟登录网易邮箱的方法示例
2018/07/05 Python
对python字典元素的添加与修改方法详解
2018/07/06 Python
python求最大连续子数组的和
2018/07/07 Python
Python 调用 zabbix api的方法示例
2019/01/06 Python
使用python的pandas为你的股票绘制趋势图
2019/06/26 Python
django 装饰器 检测登录状态操作
2020/07/02 Python
Python同时迭代多个序列的方法
2020/07/28 Python
python爬虫用request库处理cookie的实例讲解
2021/02/20 Python
彪马香港官方网上商店:PUMA香港
2020/12/06 全球购物
2014教师党员自我评议总结
2014/09/19 职场文书
2014年食品安全工作总结
2014/12/04 职场文书
2015安全保卫工作总结
2015/04/25 职场文书
JavaScript如何利用Promise控制并发请求个数
2021/05/14 Javascript
从np.random.normal()到正态分布的拟合操作
2021/06/02 Python
Nginx源码编译安装过程记录
2021/11/17 Servers