TaoLer/app/index/controller/Sign.php
2020-02-12 15:08:52 +08:00

267 lines
9.2 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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()
{
//总榜
$list = 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();
$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')) {
return json(array('code' => 0, 'msg' => '亲,登陆后才能签到哦','url' => 'index/login/index'));
} else {
$uid = session('user_id');
$todayData = $this->todayData()->getData();
//var_dump($todayData);
if ($todayData['is_sign'] == 1) { //数组中是返回的是一个对象,不能直接用[]来显示,正确的输出方法是:$pic[0]->title问题解决
exit('{"code":-1,"msg":"你今天已经签过到了"}');
} 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='';
$teshudate=['20200214','20200501','20201001'];
//签到奖励
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 {
return json(['code'=>-1,'msg'=>'签到失败,请刷新后重试!']);
}
}
}
}
/**
* 返回每次签到要插入的数据
*
* @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);
}
}