HEX
Server: nginx/1.28.1
System: Linux 10-41-63-61 6.8.0-31-generic #31-Ubuntu SMP PREEMPT_DYNAMIC Sat Apr 20 00:40:06 UTC 2024 x86_64
User: www (1001)
PHP: 7.4.33
Disabled: passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Upload Files
File: /www/wwwroot//www.kvrdp.com/addons/signin/controller/Index.php
<?php
// +----------------------------------------------------------------------
// | Yzncms [ 御宅男工作室 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2018 http://yzncms.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: https://www.fastadmin.net/
// +----------------------------------------------------------------------

// +----------------------------------------------------------------------
// | 会员签到管理
// +----------------------------------------------------------------------
namespace addons\signin\Controller;

use addons\signin\model\Signin as SigninModel;
use app\member\controller\MemberBase;
use think\Db;
use util\Date;

class Index extends MemberBase
{
    // 签到首页
    public function index()
    {
        $config   = get_addon_config('signin');
        $signdata = $config['signinscore'];
        $date     = $this->request->request('date', date("Y-m-d"), "trim");
        $time     = strtotime($date);

        $lastdata    = SigninModel::where('uid', $this->auth->id)->order('create_time', 'desc')->find();
        $successions = $lastdata && $lastdata['create_time'] > Date::unixtime('day', -1) ? $lastdata['successions'] : 0;
        $signin      = SigninModel::where('uid', $this->auth->id)->whereTime('create_time', 'today')->find();

        $calendar = new \addons\signin\library\Calendar();
        $list     = SigninModel::where('uid', $this->auth->id)
            ->field('id,create_time')
            ->whereTime('create_time', 'between', [date("Y-m-1", $time), date("Y-m-1", strtotime("+1 month", $time))])
            ->select();
        foreach ($list as $index => $item) {
            $calendar->addEvent(date("Y-m-d", $item->create_time), date("Y-m-d", $item->create_time), "", false, "signed");
        }
        $this->assign('fillupscore', $config['fillupscore']);
        //$this->assignconfig('isfillup', $config['isfillup']);
        $this->assign('calendar', $calendar);
        $this->assign('date', $date);
        $this->assign('successions', $successions);
        $successions++;
        $score = isset($signdata['s' . $successions]) ? $signdata['s' . $successions] : $signdata['sn'];
        $this->assign('signin', $signin);
        $this->assign('score', $score);
        $this->assign('config', $config);
        return $this->fetch();
    }

    // 立即签到
    public function dosign()
    {
        if ($this->request->isPost()) {
            $config   = get_addon_config('signin');
            $signdata = $config['signinscore'];

            $lastdata    = SigninModel::where('uid', $this->auth->id)->order('create_time', 'desc')->find();
            $successions = $lastdata && $lastdata['create_time'] > Date::unixtime('day', -1) ? $lastdata['successions'] : 0;
            $signin      = SigninModel::where('uid', $this->auth->id)->whereTime('create_time', 'today')->find();
            if ($signin) {
                $this->error('今天已签到,请明天再来!');
            } else {
                $successions++;
                $score = isset($signdata['s' . $successions]) ? $signdata['s' . $successions] : $signdata['sn'];
                try {
                    SigninModel::create(['uid' => $this->auth->id, 'successions' => $successions, 'create_time' => time()]);
                    //\app\common\model\User::score($score, $this->auth->id, "连续签到{$successions}天");
                    //增加积分
                    \think\Db::name('member')->where(['id' => $this->auth->id])->setInc('point', $score);
                } catch (Exception $e) {
                    $this->error('签到失败,请稍后重试');
                }
                $this->success('签到成功!连续签到' . $successions . '天!获得' . $score . '积分');
            }
        }
        $this->error("请求错误");
    }

    // 签到补签
    public function fillup()
    {
        $date   = $this->request->request('date');
        $time   = strtotime($date);
        $config = get_addon_config('signin');
        if (!$config['isfillup']) {
            $this->error('暂未开启签到补签');
        }
        if ($time > time()) {
            $this->error('无法补签未来的日期');
        }
        if ($config['fillupscore'] > $this->auth->point) {
            $this->error('你当前积分不足');
        }
        $days = Date::span(time(), $time, 'days');
        if ($config['fillupdays'] < $days) {
            $this->error("只允许补签{$config['fillupdays']}天的签到");
        }
        $count = SigninModel::where('uid', $this->auth->id)
            ->where('type', 'fillup')
            ->whereTime('create_time', 'between', [Date::unixtime('month'), Date::unixtime('month', 0, 'end')])
            ->count();
        if ($config['fillupnumsinmonth'] <= $count) {
            $this->error("每月只允许补签{$config['fillupnumsinmonth']}次");
        }
        Db::name('signin')->whereTime('create_time', 'd')->select();
        $signin = SigninModel::where('uid', $this->auth->id)
            ->where('type', 'fillup')
            ->whereTime('create_time', 'between', [$date, date("Y-m-d 23:59:59", $time)])
            ->count();
        if ($signin) {
            $this->error("该日期无需补签到");
        }
        $successions = 1;
        $prev        = $signin        = SigninModel::where('uid', $this->auth->id)
            ->whereTime('create_time', 'between', [date("Y-m-d", strtotime("-1 day", $time)), date("Y-m-d 23:59:59", strtotime("-1 day", $time))])
            ->find();
        if ($prev) {
            $successions = $prev['successions'] + 1;
        }
        try {
            //\app\common\model\User::score(-$config['fillupscore'], $this->auth->id, '签到补签');
            //寻找日期之后的
            $nextList = SigninModel::where('uid', $this->auth->id)
                ->where('create_time', '>=', strtotime("+1 day", $time))
                ->order('create_time', 'asc')
                ->select();
            foreach ($nextList as $index => $item) {
                //如果是阶段数据,则中止
                if ($index > 0 && $item->successions == 1) {
                    break;
                }
                $day = $index + 1;
                if (date("Y-m-d", $item->create_time) == date("Y-m-d", strtotime("+{$day} day", $time))) {
                    $item->successions = $successions + $day;
                    $item->save();
                }
            }
            SigninModel::create(['uid' => $this->auth->id, 'type' => 'fillup', 'successions' => $successions, 'create_time' => $time + 43200]);
        } catch (Exception $e) {
            $this->error('补签失败,请稍后重试');
        }
        $this->success('补签成功');
    }

    // 排行榜
    public function rank()
    {
        $data = SigninModel::with(["user"])
            ->where("create_time", ">", Date::unixtime('day', -1))
            ->field("uid,MAX(successions) AS days")
            ->group("uid")
            ->order("days", "desc")
            ->limit(10)
            ->select();
        foreach ($data as $index => $datum) {
            $datum->getRelation('user')->visible(['id', 'username', 'nickname', 'avatar']);
        }
        $this->success("", "", ['ranklist' => collection($data)->toArray()]);
    }
}