<?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 ;
}
}
|