用PHP实现会员签到分享或者领积分

2019-08-09 05:49:01来源:编程学习网 阅读 ()

新老客户大回馈,云服务器低至5折



会员签到,我们在大部分网站都可以遇到,今天就给大家分享这个功能,希望能帮助到大家。


源码于thinkphp3.2.3的方法,如果你不会把以下方法改为thinkphp5或者laravel等方法来实现,那就证明你php还没学到家


以下是截图

数据表数据

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


接下来是PHP源码,一一为大家实现

<?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(000, $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;   } }

以上内容希望帮助到大家,有需要的可以添加下方二维码进群交流学习新技术。



原文链接:http://www.phpxs.com/post/6413/
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:PHP的垃圾回收机制以及大概实现

下一篇:复习基础:MongoDB的十大总结