TaoLer/app/index/controller/Sign.php

313 lines
11 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;
2020-03-30 21:11:12 +08:00
use taoler\com\Level;
2020-01-01 13:17:19 +08:00
class Sign extends BaseController
{
2021-05-21 19:49:21 +08:00
//签到最新最快活跃榜JSON数据
public function signJson()
{
$time = time();
2020-01-01 13:17:19 +08:00
$start_stime = strtotime(date('Y-m-d 0:0:0', $time)) - 1;
$end_stime = strtotime(date('Y-m-d 23:59:59', $time)) + 1;
2021-05-21 19:49:21 +08:00
$res = [];
$res['status'] = 0;
//最新签到
2020-01-01 13:17:19 +08:00
$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();
2021-05-21 19:49:21 +08:00
if(count($newlist)){
foreach($newlist as $n){
$new = ['uid'=>$n['uid'],'time'=>date('Y-m-d H:i:s',$n['stime']),'user'=>['username'=>$n['name'],'avatar'=>$n['user_img']]];
$res['data'][0][] = $new;
}
} else {
$res['data'][0] = [];
}
//今日最快
$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();
if(count($fastlist)){
foreach($fastlist as $f){
$fast = ['uid'=>$f['uid'],'days'=>$f['days'],'time'=>date('Y-m-d H:i:s',$f['stime']),'user'=>['username'=>$f['name'],'avatar'=>$f['user_img']]];
$res['data'][1][] = $fast;
}
} else {
$res['data'][1] = [];
}
//签到排行榜
2021-05-21 19:49:21 +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();
if(count($totallist)){
foreach($totallist as $t){
$total = ['uid'=>$t['uid'],'days'=>$t['days'],'user'=>['username'=>$t['name'],'avatar'=>$t['user_img']]];
2021-05-21 19:49:21 +08:00
$res['data'][2][] = $total;
}
} else {
$res['data'][2] = [];
}
return json($res);
}
/**
* @return \think\response\Json
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
2021-05-21 19:49:21 +08:00
public function status()
{
if(session('user_id')){
$res = $this->todayData()->getData();
2021-05-21 19:49:21 +08:00
if($res['is_sign'] == 1){
return json(['status'=>0,'msg'=>'已签到','data'=>['signed'=>$res['is_sign'],'token'=>'1111','experience'=>$res['score'],'days'=>$res['days']]]);
} else {
return json(['status'=>0,'msg'=>'未签到','data'=>['signed'=>0,'experience'=>$res['will_getscore'],'days'=>$res['days']]]);
2021-05-21 19:49:21 +08:00
}
} else {
return json(['status'=>0,'msg'=>'未登陆']);
}
}
2020-01-01 13:17:19 +08:00
/**
* 执行签到返回json status 0成功
* @return \think\response\Json
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
2020-01-01 13:17:19 +08:00
*/
public function sign()
{
if (!Session::has('user_id') || !Session::has('user_name')) {
return json(['status'=>1,'code' => -1, 'msg' => '亲,登陆后才能签到哦']);
2020-01-01 13:17:19 +08:00
} else {
2021-05-21 19:49:21 +08:00
$uid = $this->uid;
2020-01-01 13:17:19 +08:00
$todayData = $this->todayData()->getData();
if ($todayData['is_sign'] == 1) {
return json(['status'=>1,'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);
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');
2021-05-21 19:49:21 +08:00
$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等级
Level::writeLv($uid);
2020-01-01 13:17:19 +08:00
}
2021-05-21 19:49:21 +08:00
return json(['status'=>0,'code'=>200,'msg'=>$msg,'data'=>['signed'=>1,'experience'=>$score,'days'=>$days]]);
2020-01-01 13:17:19 +08:00
} else {
return json(['status'=>1,'code'=>1,'msg'=>'签到失败,请刷新后重试!']);
2020-01-01 13:17:19 +08:00
}
}
}
}
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)->whereBetweenTime('stime', $start_time, $end_time)->value('days');
2020-01-01 13:17:19 +08:00
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,
];
}
2020-01-01 13:17:19 +08:00
/**
* 用户当天签到的数据 返回Array
* @return \think\response\Json
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
2020-01-01 13:17:19 +08:00
*/
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'))->whereTime('stime', 'between', [$start_stime,$end_stime])->find();
2020-01-01 13:17:19 +08:00
$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');
2020-01-01 13:17:19 +08:00
foreach ($list as $key => $value) {
$list[$key] = date('j', $value);
}
2020-01-01 13:17:19 +08:00
return json_encode($list);
}
}