2020-01-01 13:17:19 +08:00
< ? php
namespace app\index\controller ;
use app\common\controller\BaseController ;
use app\common\model\User ;
use think\facade\Session ;
use think\facade\Db ;
use think\facade\View ;
use think\Collection ;
use think\Response ;
class Sign extends BaseController
{
protected $uid ;
protected function _initialize ()
{
parent :: _initialize ();
$this -> uid = session ( 'user_id' );
}
public function lists ()
{
//总榜
2020-02-19 14:59:09 +08:00
$totallist = Db :: name ( 'user_sign' ) -> alias ( 's' ) -> leftJoin ( 'user u' , 's.uid=u.id' ) -> field ( 'uid,s.id as id,max(days) as days,name,user_img' ) -> group ( 'uid' ) -> order ( 'days desc' ) -> limit ( 20 ) -> select ();
2020-01-01 13:17:19 +08:00
$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 ;
//今日最快
$fastlist = Db :: name ( 'user_sign' ) -> alias ( 's' ) -> join ( 'user u' , 's.uid=u.id' ) -> field ( 's.*,u.name as name,u.user_img as user_img' ) -> where ( " s.stime > $start_stime and s.stime < $end_stime " ) -> order ( 's.id asc' ) -> limit ( 20 ) -> select ();
//最新
$newlist = Db :: name ( 'user_sign' ) -> alias ( 's' ) -> join ( 'user u' , 's.uid=u.id' ) -> field ( 's.*,u.name as name,u.user_img as user_img' ) -> order ( 'id desc' ) -> limit ( 20 ) -> select ();
View :: assign ( 'totallist' , $totallist );
View :: assign ( 'fastlist' , $fastlist );
View :: assign ( 'newlist' , $newlist );
return View :: fetch ();
}
/**
* 执行当天签到
* @ return json 签到成功返回 { status : 1 , info : '已签到' }
*/
public function sign ()
{
if ( ! Session :: has ( 'user_id' ) || ! Session :: has ( 'user_name' )) {
2020-03-29 19:57:18 +08:00
return json ( array ( 'code' => 0 , 'msg' => '亲,登陆后才能签到哦' , 'url' => url ( 'Login/index' )));
2020-01-01 13:17:19 +08:00
} else {
$uid = session ( 'user_id' );
$todayData = $this -> todayData () -> getData ();
//var_dump($todayData);
if ( $todayData [ 'is_sign' ] == 1 ) { //数组中是返回的是一个对象,不能直接用[]来显示,正确的输出方法是:$pic[0]->title问题解决!
2020-03-29 19:57:18 +08:00
//exit('{"code":-1,"msg":"你今天已经签过到了"}');
return json ([ 'code' =>- 1 , 'msg' => '你今天已签过到!' ]);
2020-01-01 13:17:19 +08:00
} else {
$data = $this -> getInsertData ( $uid );
$days = $data [ 'days' ];
// 无今天数据
$data [ 'uid' ] = $uid ;
$data [ 'stime' ] = time ();
$id = Db :: name ( 'user_sign' ) -> insertGetId ( $data );
if ( $id ) {
//$will_getscore
//$score = $this->getTodayScores($days);
$score = $todayData [ 'will_getscore' ];
$date = date ( 'Ymd' );
$msg = '' ;
2020-02-12 15:08:52 +08:00
$teshudate = [ '20200214' , '20200501' , '20201001' ];
2020-01-01 13:17:19 +08:00
//签到奖励
if ( in_array ( $date , $teshudate )){
$randnum = rand ( 1 , 99 );
$msg = '新年好!您额外获得随机奖励' . $randnum . '金币!' ;
point_note ( $randnum , $uid , 'NewYearReward' , $id );
}
session ( 'signdate' , $date );
if ( $score > 0 ) {
// 为该用户添加积分
$user = User :: find ( $uid );
$point = $user [ 'point' ] + $score ;
$user -> save ([ 'point' => $point ]);
//point_note($score, $uid, $id);
}
return json ([ 'code' => 200 , 'score' => $score , 'days' => $days , 'msg' => $msg ]);
} else {
2020-02-12 15:08:52 +08:00
return json ([ 'code' =>- 1 , 'msg' => '签到失败,请刷新后重试!' ]);
2020-01-01 13:17:19 +08:00
}
}
}
}
/**
* 返回每次签到要插入的数据
*
* @ 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 = Db :: name ( 'user_sign' ) -> where ( " uid = $uid and stime > $start_time and stime < $end_time " ) -> value ( 'days' );
if ( $days ) {
$days ++ ;
$is_sign = 1 ;
$time = time ();
// if($days > 30){
// $days = 1;
// }
} else {
//$days=1;
$is_sign = 0 ;
$days = 1 ;
$time = '' ;
}
return [
'days' => $days ,
'is_sign' => $is_sign ,
'stime' => $time ,
];
}
/**
* 用户当天签到的数据
* @ return array 签到信息 is_sign , stime 等
*/
public 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 ;
$res = Db :: name ( 'user_sign' ) -> where ( 'uid' , session ( 'user_id' )) -> where ( 'stime' , '>' , $start_stime ) -> where ( 'stime' , '<' , $end_stime ) -> find ();
$score = 0 ;
if ( $res ) {
$is_sign = 1 ;
//昨天已签到
//已连续签到 已获取
$days = $res [ 'days' ];
$score = $this -> getTodayScores ( $res [ 'days' ]);
$will_getscore = $this -> getTodayScores ( $res [ 'days' ] + 1 );
} else {
//今天没有签,看昨天
$is_sign = 0 ;
$yestoday = $this -> getInsertData ( session ( 'user_id' ));
if ( $yestoday [ 'is_sign' ]) {
//今天连续天数
$days = $yestoday [ 'days' ] - 1 ;
$will_getscore = $this -> getTodayScores ( $yestoday [ 'days' ]);
} else {
//今天第一天
$days = 0 ;
$will_getscore = $this -> getTodayScores ( 1 );
}
//已连续签到 可获取
$score = $this -> getTodayScores ( $days );
}
$data = [
'is_sign' => $is_sign ,
'days' => $days ,
'score' => $score ,
'will_getscore' => $will_getscore ,
];
return json ( $data );
}
/**
* 积分规则,返回连续签到的天数对应的积分
*
* @ param int $days 当天应该得的分数
* @ return int 积分
*/
protected function getTodayScores ( $days )
{
$score = 0 ;
$scores = Db :: name ( 'user_signrule' ) -> where ( " days <= $days " ) -> order ( 'days desc' ) -> limit ( 1 ) -> value ( 'score' );
if ( $scores ) {
$score = $scores ;
}
return $score ;
}
public function getsignrule ()
{
$rules = Db :: name ( 'user_signrule' ) -> order ( 'days asc' ) -> select ();
return json ( array ( 'code' => 200 , 'msg' => $rules ));
}
/**
* 显示签到列表
*
* @ param array $signDays 某月签到的日期 array ( 1 , 2 , 3 , 4 , 5 , 12 , 13 )
* @ param int $year 可选,年份
* @ param int $month 可选,月份
* @ return string 日期列表 < li > 1 </ li >....
*/
public 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 = '' ;
// $i=0;
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 )
*/
public 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 = Db :: name ( 'user_sign' ) -> where ( " uid = { $this -> uid } and stime > $start_stime and stime < $end_stime " ) -> order ( 'stime asc' ) -> column ( 'stime' );
//if(is_array($list)){
foreach ( $list as $key => $value ) {
$list [ $key ] = date ( 'j' , $value );
}
//}
//return $list;
return json_encode ( $list );
}
}