diff --git a/.github/docker/Dockerfile b/.github/docker/Dockerfile new file mode 100644 index 0000000..3303ea6 --- /dev/null +++ b/.github/docker/Dockerfile @@ -0,0 +1,77 @@ +ARG ALPINE_VERSION=3.24 +FROM alpine:${ALPINE_VERSION} +# Setup document root +WORKDIR /app/www + +# Install packages and remove default server definition +RUN apk add --no-cache \ + bash \ + curl \ + nginx \ + php83 \ + php83-ctype \ + php83-curl \ + php83-dom \ + php83-fileinfo \ + php83-fpm \ + php83-gd \ + php83-gettext \ + php83-intl \ + php83-iconv \ + php83-mbstring \ + php83-mysqli \ + php83-opcache \ + php83-openssl \ + php83-phar \ + php83-sodium \ + php83-session \ + php83-simplexml \ + php83-tokenizer \ + php83-xml \ + php83-xmlreader \ + php83-xmlwriter \ + php83-zip \ + php83-pdo \ + php83-pdo_mysql \ + php83-pdo_sqlite \ + supervisor \ + && ln -sf /usr/bin/php83 /usr/bin/php + +RUN rm -rf /var/cache/apk/* /tmp/* + +# Configure nginx - http +COPY config/nginx.conf /etc/nginx/nginx.conf + +# Configure PHP-FPM +ENV PHP_INI_DIR /etc/php83 +COPY config/fpm-pool.conf ${PHP_INI_DIR}/php-fpm.d/www.conf +COPY config/php.ini ${PHP_INI_DIR}/conf.d/custom.ini + +# Configure supervisord +COPY config/supervisord.conf /etc/supervisor/conf.d/supervisord.conf + +# CACHE_BUST 须写进每条相关 RUN,否则 GHA/BuildKit 可能单独命中 composer 相关层缓存,vendor 仍来自旧构建 +ARG CACHE_BUST=local + +# Add application +RUN mkdir -p /usr/src && echo "$CACHE_BUST" >/dev/null && wget --no-cache https://github.com/netcccyun/toolbox/archive/refs/heads/main.zip -O /usr/src/www.zip && unzip /usr/src/www.zip -d /usr/src/ && mv /usr/src/toolbox-main /usr/src/www && rm -f /usr/src/www.zip + +# Install composer(与下面 install 一并随 CACHE_BUST 失效) +RUN echo "$CACHE_BUST" >/dev/null && wget https://getcomposer.org/download/latest-stable/composer.phar -O /usr/local/bin/composer && chmod +x /usr/local/bin/composer + +RUN echo "$CACHE_BUST" >/dev/null && composer install -d /usr/src/www --no-interaction --no-dev --optimize-autoloader --no-cache + +RUN adduser -D -s /sbin/nologin -g www www && chown -R www:www /usr/src/www /var/lib/nginx /var/log/nginx + +# copy entrypoint script +COPY entrypoint.sh /entrypoint.sh +ENTRYPOINT ["sh", "/entrypoint.sh"] + +# Expose the port nginx is reachable on +EXPOSE 80 + +# Let supervisord start nginx & php-fpm +CMD /usr/sbin/crond && /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf + +# Configure a healthcheck to validate that everything is up&running +HEALTHCHECK --timeout=10s CMD curl --silent --fail http://127.0.0.1/fpm-ping || exit 1 diff --git a/.github/docker/config/fpm-pool.conf b/.github/docker/config/fpm-pool.conf new file mode 100644 index 0000000..4d6d9bd --- /dev/null +++ b/.github/docker/config/fpm-pool.conf @@ -0,0 +1,21 @@ +[global] +error_log = /dev/stderr + +[www] +listen = /run/php-fpm.sock +listen.backlog = 8192 +listen.allowed_clients = 127.0.0.1 +listen.owner = www +listen.group = www +listen.mode = 0666 +user = www +group = www +pm.status_path = /fpm-status +pm = ondemand +pm.max_children = 100 +pm.process_idle_timeout = 60s; +pm.max_requests = 1000 +clear_env = no +catch_workers_output = yes +decorate_workers_output = no +ping.path = /fpm-ping diff --git a/.github/docker/config/nginx.conf b/.github/docker/config/nginx.conf new file mode 100644 index 0000000..2c65f92 --- /dev/null +++ b/.github/docker/config/nginx.conf @@ -0,0 +1,94 @@ +user www; +worker_processes auto; +error_log stderr warn; +pid /run/nginx.pid; + +events { + worker_connections 1024; +} + +http { + include mime.types; + # Threat files with a unknown filetype as binary + default_type application/octet-stream; + + # Define custom log format to include reponse times + log_format main_timed '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for" ' + '$request_time $upstream_response_time $pipe $upstream_cache_status'; + + access_log /dev/stdout main_timed; + error_log /dev/stderr crit; + + keepalive_timeout 65; + + server_tokens off; + + # Enable gzip compression by default + gzip on; + gzip_min_length 1k; + gzip_buffers 4 16k; + gzip_proxied expired no-cache no-store private auth; + gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml; + gzip_vary on; + gzip_disable "MSIE [1-6]\."; + + # Include server configs + server { + listen [::]:80 default_server; + listen 80 default_server; + server_name _; + + sendfile on; + tcp_nodelay on; + absolute_redirect off; + + root /app/www/public; + index index.php index.html; + + # Pass the PHP scripts to PHP-FPM listening on php-fpm.sock + location ~ \.php$ { + try_files $uri =404; + fastcgi_split_path_info ^(.+\.php)(/.+)$; + fastcgi_pass unix:/run/php-fpm.sock; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_index index.php; + include fastcgi_params; + } + + #rewrite rule for pretty urls + location / { + if (!-e $request_filename){ + rewrite ^(.*)$ /index.php?s=$1 last; break; + } + } + + # Set the cache-control headers on assets to cache for 5 days + location ~* \.(jpg|jpeg|gif|png|ico|bmp)$ { + access_log off; + expires 30d; + } + + location ~* \.(css|js)$ { + access_log off; + expires 12h; + } + + # Deny access to . files, for security + location ~ /\. { + log_not_found off; + deny all; + } + + # Allow fpm ping and status from localhost + location ~ ^/(fpm-status|fpm-ping)$ { + access_log off; + allow 127.0.0.1; + deny all; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + include fastcgi_params; + fastcgi_pass unix:/run/php-fpm.sock; + } + } +} diff --git a/.github/docker/config/php.ini b/.github/docker/config/php.ini new file mode 100644 index 0000000..17461ea --- /dev/null +++ b/.github/docker/config/php.ini @@ -0,0 +1,15 @@ +[PHP] +short_open_tag = On +expose_php = Off +max_execution_time = 300 +post_max_size = 50M +upload_max_filesize = 50M +[Date] +date.timezone = PRC +[Opcache] +opcache.enable=1 +opcache.enable_cli=1 +opcache.memory_consumption=128 +opcache.interned_strings_buffer=32 +opcache.max_accelerated_files=10000 +opcache.revalidate_freq=30 diff --git a/.github/docker/config/supervisord.conf b/.github/docker/config/supervisord.conf new file mode 100644 index 0000000..5aad78f --- /dev/null +++ b/.github/docker/config/supervisord.conf @@ -0,0 +1,25 @@ +[supervisord] +nodaemon=true +logfile=/dev/null +logfile_maxbytes=0 +pidfile=/run/supervisord.pid + +[program:php-fpm] +command=php-fpm83 -F +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +autostart=true +autorestart=false +startretries=0 + +[program:nginx] +command=nginx -g 'daemon off;' +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +autostart=true +autorestart=false +startretries=0 diff --git a/.github/docker/entrypoint.sh b/.github/docker/entrypoint.sh new file mode 100644 index 0000000..4cf242d --- /dev/null +++ b/.github/docker/entrypoint.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +set -e + +if [ ! -f /app/www/public/index.php ] || [ ! -f /app/firstrun ]; then + echo 'Copying new files' + \cp -a /usr/src/www /app/ + + if [ -d /app/www/runtime/cache ]; then + rm -rf /app/www/runtime/* + fi + + chown -R www:www /app/www + + touch /app/firstrun +fi + +exec "$@" \ No newline at end of file diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml new file mode 100644 index 0000000..1755ecd --- /dev/null +++ b/.github/workflows/docker-build.yml @@ -0,0 +1,59 @@ +# 手动触发:构建多架构镜像(amd64 / arm64),仅推送 latest 至 Docker Hub 与华为云 SWR。 +# Dockerfile 与构建上下文位于 .github/docker/ 目录。 +# +# 需在仓库 Settings → Secrets 中配置: +# DOCKERHUB_USERNAME / DOCKERHUB_TOKEN(Docker Hub 访问令牌) +# HUAWEI_SWR_USERNAME / HUAWEI_SWR_PASSWORD(华为云 SWR 登录凭证,与本地 docker login swr.cn-east-3.myhuaweicloud.com 一致) + +name: Docker Build + +on: + workflow_dispatch: + +jobs: + build-and-push: + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout + uses: actions/checkout@v7 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v4 + + - name: Log in to Docker Hub + uses: docker/login-action@v4 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Log in to Huawei SWR + uses: docker/login-action@v4 + with: + registry: swr.cn-east-3.myhuaweicloud.com + username: ${{ secrets.HUAWEI_SWR_USERNAME }} + password: ${{ secrets.HUAWEI_SWR_PASSWORD }} + + - name: Build and push (Docker Hub + Huawei SWR, latest only) + uses: docker/build-push-action@v7 + with: + context: .github/docker + file: .github/docker/Dockerfile + platforms: linux/amd64,linux/arm64 + outputs: type=registry,oci-mediatypes=false + # 每次运行唯一,打破「下载源码 + composer」等层的缓存,否则会一直用首次构建时的层 + build-args: | + CACHE_BUST=${{ github.sha }}-${{ github.run_id }}-${{ github.run_attempt }} + # 避免向仓库推送 attestations;部分镜像仓库(含部分 SWR 场景)无法解析导致 “fail to parse manifest.json” + provenance: false + sbom: false + tags: | + netcccyun/toolbox:latest + swr.cn-east-3.myhuaweicloud.com/netcccyun/toolbox:latest + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/README.md b/README.md index 3753c51..d699b2e 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ ### 🎊 环境要求 -* `PHP` >= 7.4 +* `PHP` >= 8.2 * `MySQL` >= 5.6 * `fileinfo`扩展 * 使用`Redis`缓存需安装`Redis`扩展 @@ -72,6 +72,12 @@ location / { docker run --name toolbox -dit -p 8081:80 -v /var/toolbox:/app/www netcccyun/toolbox ``` +从国内镜像地址拉取: + +``` +docker pull swr.cn-east-3.myhuaweicloud.com/netcccyun/toolbox:latest +``` + #### 🍓 鸣谢 * [aoaostar](https://github.com/aoaostar/toolbox) diff --git a/app/Request.php b/app/Request.php index b30b1df..a9aa8f9 100644 --- a/app/Request.php +++ b/app/Request.php @@ -4,5 +4,9 @@ namespace app; // 应用请求对象类 class Request extends \think\Request { + /** @var bool 用户是否登录 */ + public $islogin = false; + /** @var array|null 当前登录用户 */ + public $user = null; } diff --git a/app/lib/GeetestLib.php b/app/lib/GeetestLib.php index 94e3170..aef1be1 100644 --- a/app/lib/GeetestLib.php +++ b/app/lib/GeetestLib.php @@ -1,5 +1,7 @@ geetest_id = $geetest_id; $this->geetest_key = $geetest_key; } //验证初始化 - public function pre_process($params) { - if(!empty($this->geetest_id) && !empty($this->geetest_key)){ + public function pre_process($params) + { + if (!empty($this->geetest_id) && !empty($this->geetest_key)) { return $this->pre_process_api($params); - }else{ + } else { return $this->pre_process_demo($params); } } - private function pre_process_api($params) { + private function pre_process_api($params) + { $public_params = [ 'digestmod' => 'md5', 'gt' => $this->geetest_id, @@ -35,58 +40,65 @@ class GeetestLib $params = array_merge($params, $public_params); $url = 'http://api.geetest.com/register.php?' . http_build_query($params); $res = get_curl($url); - $arr = json_decode($res, true); - if($arr && isset($arr['challenge'])){ - return $this->success_process($arr['challenge']); - }else{ - return $this->failback_process(); + if ($res) { + $arr = json_decode($res, true); + if (isset($arr['challenge'])) { + return $this->success_process($arr['challenge']); + } } + return $this->failback_process(); } - private function success_process($challenge) { + private function success_process($challenge) + { $challenge = md5($challenge . $this->geetest_key); $result = array( 'success' => 1, 'gt' => $this->geetest_id, 'challenge' => $challenge, - 'new_captcha'=>true + 'new_captcha' => true ); return $result; } - private function failback_process() { + private function failback_process() + { $challenge = md5(uniqid(mt_rand(), true) . microtime()); $result = array( 'success' => 0, - 'gt' => $this->geetest_id, + 'gt' => !empty($this->geetest_id) ? $this->geetest_id : 'e10adc3949ba59abbe56e057f20f883e', 'challenge' => $challenge, - 'new_captcha'=>true + 'new_captcha' => true ); return $result; } - private function pre_process_demo($params) { + private function pre_process_demo($params) + { $url = 'https://www.geetest.com/demo/gt/register-fullpage?t=' . time() . "123"; $referer = 'https://www.geetest.com/demo/slide-popup.html'; $data = get_curl($url, 0, $referer); - $arr = json_decode($data, true); - if($arr && isset($arr['challenge'])){ - return $arr; - }else{ - return $this->failback_process(); + if ($data) { + $arr = json_decode($data, true); + if (isset($arr['challenge'])) { + return $arr; + } } + return $this->failback_process(); } //正常流程下(即验证初始化成功),二次验证 - public function success_validate($challenge, $validate, $seccode, $params) { - if(!empty($this->geetest_id) && !empty($this->geetest_key)){ + public function success_validate($challenge, $validate, $seccode, $params) + { + if (!empty($this->geetest_id) && !empty($this->geetest_key)) { return $this->success_validate_api($challenge, $validate, $seccode, $params); - }else{ + } else { return $this->success_validate_demo($challenge, $validate, $seccode); } } - private function success_validate_api($challenge, $validate, $seccode, $params) { + private function success_validate_api($challenge, $validate, $seccode, $params) + { if (!$this->check_validate($challenge, $validate)) { return false; } @@ -101,15 +113,16 @@ class GeetestLib $url = 'http://api.geetest.com/validate.php'; $res = get_curl($url, http_build_query($params)); $arr = json_decode($res, true); - if($arr && isset($arr['seccode'])){ - if($arr['seccode'] == md5($seccode)){ + if ($arr && isset($arr['seccode'])) { + if ($arr['seccode'] == md5($seccode)) { return true; } } return false; } - private function check_validate($challenge, $validate) { + private function check_validate($challenge, $validate) + { if (strlen($validate) != 32) { return false; } @@ -119,7 +132,8 @@ class GeetestLib return true; } - private function success_validate_demo($challenge, $validate, $seccode) { + private function success_validate_demo($challenge, $validate, $seccode) + { $params = [ 'geetest_challenge' => $challenge, 'geetest_validate' => $validate, @@ -128,19 +142,76 @@ class GeetestLib $url = 'https://www.geetest.com/demo/gt/validate-fullpage'; $referer = 'https://www.geetest.com/demo/slide-popup.html'; $data = get_curl($url, http_build_query($params), $referer); - $arr = json_decode($data, true); - if($arr && $arr['status'] == 'success'){ - return true; + if ($data) { + $arr = json_decode($data, true); + if (isset($arr['status']) && $arr['status'] == 'success') { + return true; + } } return false; } //异常流程下(即验证初始化失败,宕机模式),二次验证 - public function fail_validate($challenge, $validate, $seccode) { - if(md5($challenge) == $validate){ + public function fail_validate($challenge, $validate, $seccode) + { + if (md5($challenge) == $validate) { return true; - }else{ + } else { return false; } } -} \ No newline at end of file + + public function gt4_validate($captcha_id, $lot_number, $pass_token, $gen_time, $captcha_output) + { + if (!empty($this->geetest_id) && !empty($this->geetest_key)) { + return $this->gt4_validate_api($captcha_id, $lot_number, $pass_token, $gen_time, $captcha_output); + } else { + return $this->gt4_validate_demo($captcha_id, $lot_number, $pass_token, $gen_time, $captcha_output); + } + } + + private function gt4_validate_api($captcha_id, $lot_number, $pass_token, $gen_time, $captcha_output) + { + $url = 'http://gcaptcha4.geetest.com/validate?captcha_id=' . $captcha_id; + $param = [ + 'lot_number' => $lot_number, + 'pass_token' => $pass_token, + 'gen_time' => $gen_time, + 'captcha_output' => $captcha_output + ]; + $param['sign_token'] = hash_hmac('sha256', $param['lot_number'], $this->geetest_key); + $data = get_curl($url, http_build_query($param)); + if ($data) { + $arr = json_decode($data, true); + if (isset($arr['status']) && $arr['status'] == 'success') { + if (isset($arr['result']) && $arr['result'] == 'success') { + return true; + } + } + } + return false; + } + + private function gt4_validate_demo($captcha_id, $lot_number, $pass_token, $gen_time, $captcha_output) + { + $url = 'http://gt4.geetest.com/demov4/demo/login'; + $param = [ + 'captcha_id' => $captcha_id, + 'lot_number' => $lot_number, + 'pass_token' => $pass_token, + 'gen_time' => $gen_time, + 'captcha_output' => $captcha_output + ]; + $referer = 'http://gt4.geetest.com/demov4/invisible-bind-zh.html'; + $httpheader[] = "X-Real-IP: " . request()->clientip; + $httpheader[] = "X-Forwarded-For: " . request()->clientip; + $data = get_curl($url . '?' . http_build_query($param), 0, $referer, 0, 0, 0, 0, $httpheader); + if ($data) { + $arr = json_decode($data, true); + if (isset($arr['result']) && $arr['result'] == 'success') { + return true; + } + } + return false; + } +} diff --git a/composer.json b/composer.json index d3f78b7..2629a94 100644 --- a/composer.json +++ b/composer.json @@ -9,23 +9,27 @@ "homepage": "http://tool.cccyun.cc/", "license": "GPL-3.0-only", "require": { - "php": ">=7.3.5", - "topthink/framework": "^6.0.0", - "topthink/think-orm": "^2.0", - "topthink/think-view": "^1.0", + "php": ">=8.2.0", + "topthink/framework": "^8.1.0", + "topthink/think-orm": "^3.0|^4.0", + "topthink/think-filesystem": "^2.0|^3.0", + "topthink/think-view": "^2.0", "topthink/think-migration": "^3.0", "cccyun/think-captcha": "^3.0", "ext-curl": "*", + "ext-gd": "*", + "ext-mbstring": "*", + "ext-openssl": "*", "ext-json": "*", "ext-zip": "*", "ext-pdo": "*", "ext-iconv": "*", - "khanamiryan/qrcode-detector-decoder": "1.0.5.2", - "cccyun/php-whois": "^1.2" + "cccyun/php-whois": "^1.2", + "khanamiryan/qrcode-detector-decoder": "^2.0" }, "require-dev": { - "symfony/var-dumper": "^4.2", - "topthink/think-trace": "^1.0" + "topthink/think-dumper": "^1.0", + "topthink/think-trace": "^2.0" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index 280d584..529a180 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "cc447ea0a5a3bc2bf911a9ac53603245", + "content-hash": "2460d31b05b74ff525434e1be3eff065", "packages": [ { "name": "cccyun/php-whois", - "version": "1.2", + "version": "1.3", "source": { "type": "git", "url": "https://github.com/netcccyun/php-whois.git", - "reference": "c631f1c5e26e7150501a14cd25a2380f8a077ca1" + "reference": "f02627ba0bef005aa9e336d63541f9fd288675b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/netcccyun/php-whois/zipball/c631f1c5e26e7150501a14cd25a2380f8a077ca1", - "reference": "c631f1c5e26e7150501a14cd25a2380f8a077ca1", + "url": "https://api.github.com/repos/netcccyun/php-whois/zipball/f02627ba0bef005aa9e336d63541f9fd288675b5", + "reference": "f02627ba0bef005aa9e336d63541f9fd288675b5", "shasum": "" }, "require": { @@ -62,22 +62,22 @@ "црщшы" ], "support": { - "source": "https://github.com/netcccyun/php-whois/tree/1.2" + "source": "https://github.com/netcccyun/php-whois/tree/1.3" }, - "time": "2025-06-25T06:54:23+00:00" + "time": "2026-02-12T05:56:18+00:00" }, { "name": "cccyun/think-captcha", - "version": "3.0.11", + "version": "3.0.12", "source": { "type": "git", "url": "https://github.com/netcccyun/think-captcha.git", - "reference": "40012811bf27b41011b1b60bcfadf16ad339931c" + "reference": "e20974d9f86a7e3039ead56a66995c396109a757" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/netcccyun/think-captcha/zipball/40012811bf27b41011b1b60bcfadf16ad339931c", - "reference": "40012811bf27b41011b1b60bcfadf16ad339931c", + "url": "https://api.github.com/repos/netcccyun/think-captcha/zipball/e20974d9f86a7e3039ead56a66995c396109a757", + "reference": "e20974d9f86a7e3039ead56a66995c396109a757", "shasum": "" }, "require": { @@ -114,29 +114,32 @@ ], "description": "captcha package for thinkphp", "support": { - "source": "https://github.com/netcccyun/think-captcha/tree/3.0.11" + "source": "https://github.com/netcccyun/think-captcha/tree/3.0.12" }, - "time": "2025-04-26T08:37:18+00:00" + "time": "2026-06-23T15:30:22+00:00" }, { "name": "khanamiryan/qrcode-detector-decoder", - "version": "1.0.5.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/khanamiryan/php-qrcode-detector-decoder.git", - "reference": "04fdd58d86a387065f707dc6d3cc304c719910c1" + "reference": "17c570bb39f641cc1c4c41a46177ac491393a01d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/khanamiryan/php-qrcode-detector-decoder/zipball/04fdd58d86a387065f707dc6d3cc304c719910c1", - "reference": "04fdd58d86a387065f707dc6d3cc304c719910c1", + "url": "https://api.github.com/repos/khanamiryan/php-qrcode-detector-decoder/zipball/17c570bb39f641cc1c4c41a46177ac491393a01d", + "reference": "17c570bb39f641cc1c4c41a46177ac491393a01d", "shasum": "" }, "require": { - "php": ">=5.6" + "php": ">=8.1" }, "require-dev": { - "phpunit/phpunit": "^5.7 | ^7.5 | ^8.0 | ^9.0" + "phpunit/phpunit": "^7.5 | ^8.0 | ^9.0", + "rector/rector": "^1.0.4", + "symplify/easy-coding-standard": "^11.0", + "vimeo/psalm": "^4.24" }, "type": "library", "autoload": { @@ -169,28 +172,221 @@ ], "support": { "issues": "https://github.com/khanamiryan/php-qrcode-detector-decoder/issues", - "source": "https://github.com/khanamiryan/php-qrcode-detector-decoder/tree/1.0.5.2" + "source": "https://github.com/khanamiryan/php-qrcode-detector-decoder/tree/2.0.3" }, - "time": "2021-07-13T18:46:38+00:00" + "time": "2025-06-10T08:44:02+00:00" }, { - "name": "psr/container", - "version": "1.1.2", + "name": "league/flysystem", + "version": "3.35.2", "source": { "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "b277b5dc3d56650b68904117124e79c851e12376" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/b277b5dc3d56650b68904117124e79c851e12376", + "reference": "b277b5dc3d56650b68904117124e79c851e12376", + "shasum": "" + }, + "require": { + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", + "aws/aws-sdk-php": "^3.295.10", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-mongodb": "^1.3|^2", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "guzzlehttp/psr7": "^2.6", + "microsoft/azure-storage-blob": "^1.1", + "mongodb/mongodb": "^1.2|^2", + "phpseclib/phpseclib": "^3.0.36", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.35.2" + }, + "time": "2026-07-06T14:42:07+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.31.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/2f669db18a4c20c755c2bb7d3a7b0b2340488079", + "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Local\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], + "support": { + "source": "https://github.com/thephpleague/flysystem-local/tree/3.31.0" + }, + "time": "2026-01-23T15:30:45+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.17.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "f5f47eff7c48ed1003069a2ca67f316fb4021c76" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/f5f47eff7c48ed1003069a2ca67f316fb4021c76", + "reference": "f5f47eff7c48ed1003069a2ca67f316fb4021c76", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0 || ^11.0 || ^12.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.17.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2026-07-09T11:49:27+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { "php": ">=7.4.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, "autoload": { "psr-4": { "Psr\\Container\\": "src/" @@ -217,22 +413,22 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.2" + "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "time": "2021-11-05T16:50:12+00:00" + "time": "2021-11-05T16:47:00+00:00" }, { "name": "psr/http-message", - "version": "1.1", + "version": "2.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", - "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", - "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", "shasum": "" }, "require": { @@ -241,7 +437,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -256,7 +452,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP messages", @@ -270,36 +466,36 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-message/tree/1.1" + "source": "https://github.com/php-fig/http-message/tree/2.0" }, - "time": "2023-04-04T09:50:52+00:00" + "time": "2023-04-04T09:54:51+00:00" }, { "name": "psr/log", - "version": "1.1.4", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "3.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Psr\\Log\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -320,31 +516,31 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" + "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "time": "2021-05-03T11:20:27+00:00" + "time": "2024-09-11T13:17:53+00:00" }, { "name": "psr/simple-cache", - "version": "1.0.1", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/simple-cache.git", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "3.0.x-dev" } }, "autoload": { @@ -359,7 +555,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interfaces for simple caching", @@ -371,22 +567,22 @@ "simple-cache" ], "support": { - "source": "https://github.com/php-fig/simple-cache/tree/master" + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" }, - "time": "2017-10-23T01:57:42+00:00" + "time": "2021-10-29T13:26:27+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.33.0", + "version": "v1.38.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" + "reference": "dc21118016c039a66235cf93d96b435ffb282412" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", - "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/dc21118016c039a66235cf93d96b435ffb282412", + "reference": "dc21118016c039a66235cf93d96b435ffb282412", "shasum": "" }, "require": { @@ -440,7 +636,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.38.1" }, "funding": [ { @@ -460,20 +656,20 @@ "type": "tidelift" } ], - "time": "2024-09-10T14:38:51+00:00" + "time": "2026-05-25T15:22:23+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.33.0", + "version": "v1.38.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "3833d7255cc303546435cb650316bff708a1c75c" + "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", - "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/2d446c214bdbe5b71bde5011b060a05fece3ae6b", + "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b", "shasum": "" }, "require": { @@ -525,7 +721,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.38.0" }, "funding": [ { @@ -545,38 +741,41 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-05-25T13:48:31+00:00" }, { "name": "topthink/framework", - "version": "v6.1.5", + "version": "v8.1.4", "source": { "type": "git", "url": "https://github.com/top-think/framework.git", - "reference": "57d1950a1844ef8d3098ea290032aeb92e2e32c3" + "reference": "8e7b2b2364047cbf71a38c4e397a9ca0d4ef2b01" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/top-think/framework/zipball/57d1950a1844ef8d3098ea290032aeb92e2e32c3", - "reference": "57d1950a1844ef8d3098ea290032aeb92e2e32c3", + "url": "https://api.github.com/repos/top-think/framework/zipball/8e7b2b2364047cbf71a38c4e397a9ca0d4ef2b01", + "reference": "8e7b2b2364047cbf71a38c4e397a9ca0d4ef2b01", "shasum": "" }, "require": { + "ext-ctype": "*", "ext-json": "*", "ext-mbstring": "*", - "php": ">=7.2.5", - "psr/container": "~1.0", - "psr/http-message": "^1.0", - "psr/log": "~1.0", - "psr/simple-cache": "^1.0", - "topthink/think-helper": "^3.1.1", - "topthink/think-orm": "^2.0|^3.0" + "php": ">=8.0.0", + "psr/http-message": "^1.0|^2.0", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "topthink/think-container": "^3.0", + "topthink/think-helper": "^3.1", + "topthink/think-orm": "^3.0|^4.0", + "topthink/think-validate": "^3.0" }, "require-dev": { + "friendsofphp/php-cs-fixer": "^3.92", "guzzlehttp/psr7": "^2.1.0", "mikey179/vfsstream": "^1.6", "mockery/mockery": "^1.2", - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "^9.5" }, "type": "library", "autoload": { @@ -608,9 +807,102 @@ ], "support": { "issues": "https://github.com/top-think/framework/issues", - "source": "https://github.com/top-think/framework/tree/v6.1.5" + "source": "https://github.com/top-think/framework/tree/v8.1.4" }, - "time": "2024-04-16T02:01:19+00:00" + "time": "2026-01-15T02:45:10+00:00" + }, + { + "name": "topthink/think-container", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/top-think/think-container.git", + "reference": "b2df244be1e7399ad4c8be1ccc40ed57868f730a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/top-think/think-container/zipball/b2df244be1e7399ad4c8be1ccc40ed57868f730a", + "reference": "b2df244be1e7399ad4c8be1ccc40ed57868f730a", + "shasum": "" + }, + "require": { + "php": ">=8.0", + "psr/container": "^2.0", + "topthink/think-helper": "^3.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "autoload": { + "files": [], + "psr-4": { + "think\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "liu21st", + "email": "liu21st@gmail.com" + } + ], + "description": "PHP Container & Facade Manager", + "support": { + "issues": "https://github.com/top-think/think-container/issues", + "source": "https://github.com/top-think/think-container/tree/v3.0.2" + }, + "time": "2025-04-07T03:21:51+00:00" + }, + { + "name": "topthink/think-filesystem", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/top-think/think-filesystem.git", + "reference": "7a1231a65bca278de9b7f9236767eef9741dfe5c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/top-think/think-filesystem/zipball/7a1231a65bca278de9b7f9236767eef9741dfe5c", + "reference": "7a1231a65bca278de9b7f9236767eef9741dfe5c", + "shasum": "" + }, + "require": { + "league/flysystem": "^3.0", + "php": "^8.2", + "topthink/framework": "^8.0" + }, + "require-dev": { + "mikey179/vfsstream": "^1.6", + "mockery/mockery": "^1.2", + "phpunit/phpunit": "^11.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "think\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "yunwuxin", + "email": "448901948@qq.com" + } + ], + "description": "The ThinkPHP6.1 Filesystem Package", + "support": { + "issues": "https://github.com/top-think/think-filesystem/issues", + "source": "https://github.com/top-think/think-filesystem/tree/v3.0.0" + }, + "time": "2024-12-10T06:23:28+00:00" }, { "name": "topthink/think-helper", @@ -717,32 +1009,37 @@ }, { "name": "topthink/think-orm", - "version": "v2.0.62", + "version": "v4.0.51", "source": { "type": "git", "url": "https://github.com/top-think/think-orm.git", - "reference": "e53bfea572a133039ad687077120de5521af617f" + "reference": "46abe2f824eb3bcb117d4c0ce93b203b592b79f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/top-think/think-orm/zipball/e53bfea572a133039ad687077120de5521af617f", - "reference": "e53bfea572a133039ad687077120de5521af617f", + "url": "https://api.github.com/repos/top-think/think-orm/zipball/46abe2f824eb3bcb117d4c0ce93b203b592b79f7", + "reference": "46abe2f824eb3bcb117d4c0ce93b203b592b79f7", "shasum": "" }, "require": { "ext-json": "*", "ext-pdo": "*", - "php": ">=7.1.0", - "psr/log": "^1.0|^2.0", - "psr/simple-cache": "^1.0|^2.0", - "topthink/think-helper": "^3.1" + "php": ">=8.0.0", + "psr/log": ">=1.0", + "psr/simple-cache": "^3.0", + "topthink/think-helper": "^3.1", + "topthink/think-validate": "^3.0" }, "require-dev": { - "phpunit/phpunit": "^7|^8|^9.5" + "phpunit/phpunit": "^9.6|^10" + }, + "suggest": { + "ext-mongodb": "provide mongodb support" }, "type": "library", "autoload": { "files": [ + "src/helper.php", "stubs/load_stubs.php" ], "psr-4": { @@ -759,34 +1056,34 @@ "email": "liu21st@gmail.com" } ], - "description": "think orm", + "description": "the PHP Database&ORM Framework", "keywords": [ "database", "orm" ], "support": { "issues": "https://github.com/top-think/think-orm/issues", - "source": "https://github.com/top-think/think-orm/tree/v2.0.62" + "source": "https://github.com/top-think/think-orm/tree/v4.0.51" }, - "time": "2024-09-22T06:17:47+00:00" + "time": "2025-12-18T13:11:52+00:00" }, { "name": "topthink/think-template", - "version": "v2.0.10", + "version": "v3.0.2", "source": { "type": "git", "url": "https://github.com/top-think/think-template.git", - "reference": "2b28c9f787c94f6c22312c9fe97dd3d926c03e1c" + "reference": "0b88bd449f0f7626dd75b05f557c8bc208c08b0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/top-think/think-template/zipball/2b28c9f787c94f6c22312c9fe97dd3d926c03e1c", - "reference": "2b28c9f787c94f6c22312c9fe97dd3d926c03e1c", + "url": "https://api.github.com/repos/top-think/think-template/zipball/0b88bd449f0f7626dd75b05f557c8bc208c08b0c", + "reference": "0b88bd449f0f7626dd75b05f557c8bc208c08b0c", "shasum": "" }, "require": { - "php": ">=7.1.0", - "psr/simple-cache": "^1.0" + "php": ">=8.0.0", + "psr/simple-cache": ">=1.0" }, "type": "library", "autoload": { @@ -807,27 +1104,71 @@ "description": "the php template engine", "support": { "issues": "https://github.com/top-think/think-template/issues", - "source": "https://github.com/top-think/think-template/tree/v2.0.10" + "source": "https://github.com/top-think/think-template/tree/v3.0.2" }, - "time": "2024-08-12T05:48:57+00:00" + "time": "2024-10-16T03:41:06+00:00" }, { - "name": "topthink/think-view", - "version": "v1.0.14", + "name": "topthink/think-validate", + "version": "v3.0.7", "source": { "type": "git", - "url": "https://github.com/top-think/think-view.git", - "reference": "edce0ae2c9551ab65f9e94a222604b0dead3576d" + "url": "https://github.com/top-think/think-validate.git", + "reference": "85063f6d4ef8ed122f17a36179dc3e0949b30988" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/top-think/think-view/zipball/edce0ae2c9551ab65f9e94a222604b0dead3576d", - "reference": "edce0ae2c9551ab65f9e94a222604b0dead3576d", + "url": "https://api.github.com/repos/top-think/think-validate/zipball/85063f6d4ef8ed122f17a36179dc3e0949b30988", + "reference": "85063f6d4ef8ed122f17a36179dc3e0949b30988", "shasum": "" }, "require": { - "php": ">=7.1.0", - "topthink/think-template": "^2.0" + "php": ">=8.0", + "topthink/think-container": ">=3.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/helper.php" + ], + "psr-4": { + "think\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "liu21st", + "email": "liu21st@gmail.com" + } + ], + "description": "think validate", + "support": { + "issues": "https://github.com/top-think/think-validate/issues", + "source": "https://github.com/top-think/think-validate/tree/v3.0.7" + }, + "time": "2025-06-11T05:51:40+00:00" + }, + { + "name": "topthink/think-view", + "version": "v2.0.5", + "source": { + "type": "git", + "url": "https://github.com/top-think/think-view.git", + "reference": "b42009b98199b5a3833d3d6fd18c8a55aa511fad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/top-think/think-view/zipball/b42009b98199b5a3833d3d6fd18c8a55aa511fad", + "reference": "b42009b98199b5a3833d3d6fd18c8a55aa511fad", + "shasum": "" + }, + "require": { + "php": ">=8.0.0", + "topthink/think-template": "^3.0" }, "type": "library", "autoload": { @@ -848,24 +1189,95 @@ "description": "thinkphp template driver", "support": { "issues": "https://github.com/top-think/think-view/issues", - "source": "https://github.com/top-think/think-view/tree/v1.0.14" + "source": "https://github.com/top-think/think-view/tree/v2.0.5" }, - "time": "2019-11-06T11:40:13+00:00" + "time": "2025-03-19T07:04:19+00:00" } ], "packages-dev": [ { - "name": "symfony/polyfill-mbstring", - "version": "v1.33.0", + "name": "symfony/deprecation-contracts", + "version": "v3.7.1", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", - "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/f3202fa1b5097b0af062dc978b32ecf63404e31d", + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-05T06:23:12+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.38.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", "shasum": "" }, "require": { @@ -917,7 +1329,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.2" }, "funding": [ { @@ -937,191 +1349,36 @@ "type": "tidelift" } ], - "time": "2024-12-23T08:48:59+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.31.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce", - "reference": "fa2ae56c44f03bed91a39bfc9822e31e7c5c38ce", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "type": "metapackage", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.31.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-09T11:45:10+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.33.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", - "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-01-02T08:10:11+00:00" + "time": "2026-05-27T06:59:30+00:00" }, { "name": "symfony/var-dumper", - "version": "v4.4.47", + "version": "v7.4.14", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "1069c7a3fca74578022fab6f81643248d02f8e63" + "reference": "9a3a56a4a1e65a5cb4f8d13801fe8ab0a170e358" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/1069c7a3fca74578022fab6f81643248d02f8e63", - "reference": "1069c7a3fca74578022fab6f81643248d02f8e63", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/9a3a56a4a1e65a5cb4f8d13801fe8ab0a170e358", + "reference": "9a3a56a4a1e65a5cb4f8d13801fe8ab0a170e358", "shasum": "" }, "require": { - "php": ">=7.1.3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php72": "~1.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", - "symfony/console": "<3.4" + "symfony/console": "<6.4" }, "require-dev": { - "ext-iconv": "*", - "symfony/console": "^3.4|^4.0|^5.0", - "symfony/process": "^4.4|^5.0", - "twig/twig": "^1.43|^2.13|^3.0.4" - }, - "suggest": { - "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "twig/twig": "^3.12" }, "bin": [ "Resources/bin/var-dump-server" @@ -1159,7 +1416,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v4.4.47" + "source": "https://github.com/symfony/var-dumper/tree/v7.4.14" }, "funding": [ { @@ -1170,31 +1427,83 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2022-10-03T15:15:11+00:00" + "time": "2026-06-08T20:24:16+00:00" }, { - "name": "topthink/think-trace", - "version": "v1.6", + "name": "topthink/think-dumper", + "version": "v1.0.7", "source": { "type": "git", - "url": "https://github.com/top-think/think-trace.git", - "reference": "136cd5d97e8bdb780e4b5c1637c588ed7ca3e142" + "url": "https://github.com/top-think/think-dumper.git", + "reference": "1bd79783bf9551330c7cf55c9ef49c82b3a2e110" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/top-think/think-trace/zipball/136cd5d97e8bdb780e4b5c1637c588ed7ca3e142", - "reference": "136cd5d97e8bdb780e4b5c1637c588ed7ca3e142", + "url": "https://api.github.com/repos/top-think/think-dumper/zipball/1bd79783bf9551330c7cf55c9ef49c82b3a2e110", + "reference": "1bd79783bf9551330c7cf55c9ef49c82b3a2e110", "shasum": "" }, "require": { - "php": ">=7.1.0", + "php": ">=8.0.2", + "symfony/var-dumper": ">=6.0", "topthink/framework": "^6.0|^8.0" }, + "require-dev": { + "phpunit/phpunit": "^11.4" + }, + "type": "library", + "autoload": { + "files": [ + "src/helper.php" + ], + "psr-4": { + "think\\dumper\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "yunwuxin", + "email": "448901948@qq.com" + } + ], + "description": "Dumper extend for thinkphp", + "support": { + "issues": "https://github.com/top-think/think-dumper/issues", + "source": "https://github.com/top-think/think-dumper/tree/v1.0.7" + }, + "time": "2026-05-29T04:34:25+00:00" + }, + { + "name": "topthink/think-trace", + "version": "v2.0", + "source": { + "type": "git", + "url": "https://github.com/top-think/think-trace.git", + "reference": "4ba6da2945b37931d61900a6e55dc02b05e5a63f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/top-think/think-trace/zipball/4ba6da2945b37931d61900a6e55dc02b05e5a63f", + "reference": "4ba6da2945b37931d61900a6e55dc02b05e5a63f", + "shasum": "" + }, + "require": { + "php": ">=8.0", + "topthink/framework": "^8.1" + }, "type": "library", "extra": { "think": { @@ -1224,24 +1533,27 @@ "description": "thinkphp debug trace", "support": { "issues": "https://github.com/top-think/think-trace/issues", - "source": "https://github.com/top-think/think-trace/tree/v1.6" + "source": "https://github.com/top-think/think-trace/tree/v2.0" }, - "time": "2023-02-07T08:36:32+00:00" + "time": "2025-06-12T09:18:19+00:00" } ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=7.3.5", + "php": ">=8.2.0", "ext-curl": "*", + "ext-gd": "*", + "ext-mbstring": "*", + "ext-openssl": "*", "ext-json": "*", "ext-zip": "*", "ext-pdo": "*", "ext-iconv": "*" }, - "platform-dev": [], - "plugin-api-version": "2.6.0" + "platform-dev": {}, + "plugin-api-version": "2.9.0" } diff --git a/config/app.php b/config/app.php index 0e7dfd9..6be3a5f 100644 --- a/config/app.php +++ b/config/app.php @@ -32,6 +32,6 @@ return [ // 定义404错误的模板文件地址 404 => \think\facade\App::getRootPath() . 'public/404.html', ], - 'version' => '1.11', - 'ver' => 1092 + 'version' => '1.12', + 'ver' => 1093 ]; diff --git a/install.sql b/install.sql index 5b52fa6..9a79688 100644 --- a/install.sql +++ b/install.sql @@ -194,7 +194,7 @@ CREATE TABLE `toolbox_querycache` ( `content` text, `uptime` datetime NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `cachekey` (`key`,`type`), + UNIQUE KEY `cachekey` (`key`,`subkey`,`type`), KEY `cachekey2` (`subkey`,`type`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/public/index.php b/public/index.php index 1680e0c..8a4d0bf 100644 --- a/public/index.php +++ b/public/index.php @@ -8,9 +8,14 @@ // +---------------------------------------------------------------------- // | Author: liu21st // +---------------------------------------------------------------------- -// [ 应用入口文件 ] -namespace think; +use think\App; + +if (version_compare(PHP_VERSION, '8.0.0', '<')) { + die('require PHP >= 8.0 !'); +} + +// [ 应用入口文件 ] require __DIR__ . '/../vendor/autoload.php'; // 执行HTTP应用并响应 diff --git a/public/router.php b/public/router.php new file mode 100644 index 0000000..ad261d5 --- /dev/null +++ b/public/router.php @@ -0,0 +1,19 @@ + +// +---------------------------------------------------------------------- +// $Id$ + +if (is_file($_SERVER["DOCUMENT_ROOT"] . $_SERVER["SCRIPT_NAME"])) { + return false; +} else { + $_SERVER["SCRIPT_FILENAME"] = __DIR__ . '/index.php'; + + require __DIR__ . "/index.php"; +}