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 相关文章推荐
15种PHP Encoder的比较
Mar 06 PHP
PHP操作数组的一些函数整理介绍
Jul 17 PHP
关于JSON以及JSON在PHP中的应用技巧
Nov 27 PHP
php Calender(日历)代码分享
Jan 03 PHP
php获取目标函数执行时间示例
Mar 04 PHP
php实现window平台的checkdnsrr函数
May 27 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
May 18 PHP
PHP常用算法和数据结构示例(必看篇)
Mar 15 PHP
PHP基于Redis消息队列实现发布微博的方法
May 03 PHP
thinkPHP框架中layer.js的封装与使用方法示例
Jan 18 PHP
PHP创建XML的方法示例【基于DOMDocument类及SimpleXMLElement类】
Sep 10 PHP
php swoft框架实例用法
Dec 22 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生成随机密码自定义函数代码(简单快速)
2014/05/10 PHP
PHP会话控制实例分析
2016/12/24 PHP
Prototype使用指南之dom.js
2007/01/10 Javascript
JavaScript类库D
2010/10/24 Javascript
json2.js的初步学习与了解
2011/10/06 Javascript
Javascript跨域请求的4种解决方式
2013/03/17 Javascript
Jquery Uploadify多文件上传带进度条且传递自己的参数
2013/08/28 Javascript
jQuery分组选择器用法实例
2014/12/23 Javascript
JS中artdialog弹出框控件之提交表单思路详解
2016/04/18 Javascript
JS及PHP代码编写八大排序算法
2016/07/12 Javascript
从零开始学习Node.js系列教程四:多页面实现的数学运算示例
2017/04/13 Javascript
详解windows下vue-cli及webpack 构建网站(二)导入bootstrap样式
2017/06/17 Javascript
angularjs数组判断是否含有某个元素的实例
2018/02/27 Javascript
electron中使用bootstrap的示例代码
2018/11/06 Javascript
Vue 之孙组件向爷组件通信的实现
2019/04/23 Javascript
微信小程序云开发之新手环境配置
2019/05/16 Javascript
vue中实现图片压缩 file文件的方法
2020/05/28 Javascript
.netcore+vue 实现压缩文件下载功能
2020/09/24 Javascript
[55:02]2014 DOTA2国际邀请赛中国区预选赛 HGT VS Orenda
2014/05/21 DOTA
python中使用PIL制作并验证图片验证码
2018/03/15 Python
Python中使用遍历在列表中添加字典遇到的坑
2019/02/27 Python
详解python中*号的用法
2019/10/21 Python
VSCode中autopep8无法运行问题解决方案(提示Error: Command failed,usage)
2021/03/02 Python
阿提哈德航空官方网站:Etihad Airways
2017/01/06 全球购物
PatPat香港:婴童服饰和亲子全家装在线购物
2020/09/27 全球购物
应届生会计电算化求职信
2013/10/03 职场文书
统计专业自荐书
2014/07/06 职场文书
教师职业道德事迹材料
2014/08/18 职场文书
基层党组织建设整改方案
2014/09/16 职场文书
2014年法院工作总结
2014/11/24 职场文书
2014年库房工作总结
2014/11/26 职场文书
部队2015年终工作总结
2015/04/02 职场文书
律政俏佳人观后感
2015/06/09 职场文书
python实现简易自习室座位预约系统
2021/06/30 Python
如何使用Tkinter进行窗口的管理与设置
2021/06/30 Python
利用正则表达式匹配浮点型数据
2022/05/30 Java/Android