TaoLer/app/index/controller/Sign.php

270 lines
9.4 KiB
PHP
Raw Normal View History

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;
2020-03-30 21:11:12 +08:00
use taoler\com\Level;
2020-01-01 13:17:19 +08:00
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);
2020-03-30 21:11:12 +08:00
2020-01-01 13:17:19 +08:00
$days = $data['days'];
// 无今天数据
$data['uid'] = $uid;
$data['stime'] = time();
$id = Db::name('user_sign')->insertGetId($data);
2020-03-30 21:11:12 +08:00
2020-01-01 13:17:19 +08:00
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);
2020-03-30 21:11:12 +08:00
//到达积分值升级Vip等级
$viplv = Level::writeLv($uid);
2020-01-01 13:17:19 +08:00
}
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);
}
}