Zory 3 周之前
父节点
当前提交
e8bf7c27fd

+ 5 - 1
app/controller/common/Common.php

@@ -3,10 +3,12 @@
 namespace app\controller\common;
 
 use app\extra\basic\Base;
+use app\model\system\SystemConfig;
 use LinFly\Annotation\Route\Controller;
 use LinFly\Annotation\Route\Middleware;
 use LinFly\Annotation\Route\Route;
 use support\Response;
+use Tinywan\Captcha\Captcha;
 
 /**
  *
@@ -22,7 +24,9 @@ class Common extends Base
     public function getServiceData(): Response
     {
         try {
-            return successTrans("success",[]);
+            $captcha = Captcha::base64();
+            $service = (new SystemConfig)->where("type","service")->column("value","name");
+            return successTrans("success",compact('captcha','service'));
         } catch (\Throwable $throwable) {
             return error($throwable->getMessage());
         }

+ 60 - 0
app/controller/common/Login.php

@@ -0,0 +1,60 @@
+<?php
+
+namespace app\controller\common;
+
+use app\extra\basic\Base;
+use LinFly\Annotation\Route\Controller;
+use LinFly\Annotation\Route\Route;
+use support\Request;
+use support\Response;
+use Tinywan\Captcha\Captcha;
+
+
+#[Controller(prefix: "/api/login")]
+class Login extends Base
+{
+
+    /**
+     * 登陆
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "user",methods: "post")]
+    public function setLogin(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "username.require"  => trans("empty.user"),
+                "password.require"  => trans("empty.passwd"),
+                "code.require"      => trans("empty.code"),
+                "key.require"       => trans("empty.data"),
+            ],"post");
+            if (!is_array($param)) return error($param);
+            if (Captcha::check($param['code'],$param['key']) === false) return errorTrans("error.captcha");
+
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+    /**
+     * 手机号码登陆
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "mobile",methods: "post")]
+    public function setLogin2Mobile(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "mobile.require"    => trans("empty.mobile"),
+                "code.require"      => trans("empty.code"),
+            ],"post");
+            if (!is_array($param)) return error($param);
+
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+}

+ 48 - 0
app/model/system/SystemConfig.php

@@ -0,0 +1,48 @@
+<?php
+
+namespace app\model\system;
+
+use app\extra\basic\Model;
+
+
+/**
+ * @property integer $id (主键)
+ * @property string $type 配置分类
+ * @property string $name 配置名称
+ * @property string $value 配置内容
+ * @property string $desc 字段名称
+ * @property integer $status 
+ * @property mixed $update_at 更新时间
+ */
+class SystemConfig extends Model
+{
+    /**
+     * The connection name for the model.
+     *
+     * @var string|null
+     */
+    protected $connection = 'mysql';
+    
+    /**
+     * The table associated with the model.
+     *
+     * @var string
+     */
+    protected string $table = "system_config";
+    
+    /**
+     * The primary key associated with the table.
+     *
+     * @var string
+     */
+    protected string $primaryKey = "id";
+    
+    /**
+     * Indicates if the model should be timestamped.
+     *
+     * @var bool
+     */
+    public bool $timestamps = false;
+
+
+}

+ 45 - 0
app/model/system/SystemData.php

@@ -0,0 +1,45 @@
+<?php
+
+namespace app\model\system;
+
+use app\extra\basic\Model;
+
+
+/**
+ * @property integer $id (主键)
+ * @property mixed $name 
+ * @property mixed $content 
+ * @property integer $is_default 是否使用
+ */
+class SystemData extends Model
+{
+    /**
+     * The connection name for the model.
+     *
+     * @var string|null
+     */
+    protected $connection = 'mysql';
+    
+    /**
+     * The table associated with the model.
+     *
+     * @var string
+     */
+    protected string $table = "system_data";
+    
+    /**
+     * The primary key associated with the table.
+     *
+     * @var string
+     */
+    protected string $primaryKey = "id";
+    
+    /**
+     * Indicates if the model should be timestamped.
+     *
+     * @var bool
+     */
+    public bool $timestamps = false;
+
+
+}

+ 48 - 0
app/model/system/SystemOplog.php

@@ -0,0 +1,48 @@
+<?php
+
+namespace app\model\system;
+
+use app\extra\basic\Model;
+
+
+/**
+ * @property integer $id (主键)
+ * @property string $username 
+ * @property string $node 当前操作节点
+ * @property string $action 操作行为名称
+ * @property string $content 当前操作节点
+ * @property mixed $geoip 
+ * @property mixed $create_at
+ */
+class SystemOplog extends Model
+{
+    /**
+     * The connection name for the model.
+     *
+     * @var string|null
+     */
+    protected $connection = 'mysql';
+    
+    /**
+     * The table associated with the model.
+     *
+     * @var string
+     */
+    protected string $table = "system_oplog";
+    
+    /**
+     * The primary key associated with the table.
+     *
+     * @var string
+     */
+    protected string $primaryKey = "id";
+    
+    /**
+     * Indicates if the model should be timestamped.
+     *
+     * @var bool
+     */
+    public bool $timestamps = false;
+
+
+}

+ 63 - 0
app/model/system/SystemUser.php

@@ -0,0 +1,63 @@
+<?php
+
+namespace app\model\system;
+
+use app\extra\basic\Model;
+
+
+/**
+ * @property integer $id (主键)
+ * @property integer $user_id 账号唯一ID
+ * @property integer $agent_id 代理ID
+ * @property integer $store_id 门店ID
+ * @property integer $factory_id 地址ID
+ * @property string $username 用户名
+ * @property string $truename 真实姓名
+ * @property mixed $mobile 手机号码
+ * @property string $password 密码
+ * @property mixed $salt 密钥串
+ * @property integer $status 状态
+ * @property integer $type 1管理员2代理3门店4洗衣工厂
+ * @property integer $is_deleted 删除状态
+ * @property integer $is_super 
+ * @property string $remark 备注
+ * @property string $login_ip 登录IP
+ * @property mixed $login_at 登录时间
+ * @property integer $login_num 
+ * @property string $create_ip 
+ * @property mixed $vip_at VIP到期时间
+ * @property mixed $updated_at 更新时间
+ * @property mixed $create_at 创建时间
+ */
+class SystemUser extends Model
+{
+    /**
+     * The connection name for the model.
+     *
+     * @var string|null
+     */
+    protected $connection = 'mysql';
+    
+    /**
+     * The table associated with the model.
+     *
+     * @var string
+     */
+    protected string $table = "system_user";
+    
+    /**
+     * The primary key associated with the table.
+     *
+     * @var string
+     */
+    protected string $primaryKey = "id";
+    
+    /**
+     * Indicates if the model should be timestamped.
+     *
+     * @var bool
+     */
+    public bool $timestamps = false;
+
+
+}

+ 26 - 26
composer.lock

@@ -1148,10 +1148,10 @@
         },
         {
             "name": "illuminate/bus",
-            "version": "v12.38.1",
+            "version": "v12.39.0",
             "dist": {
                 "type": "zip",
-                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/bus/v12.38.1/illuminate-bus-v12.38.1.zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/bus/v12.39.0/illuminate-bus-v12.39.0.zip",
                 "reference": "7845b735651ffb734b8b064e7d0349490adf4564",
                 "shasum": ""
             },
@@ -1195,10 +1195,10 @@
         },
         {
             "name": "illuminate/collections",
-            "version": "v12.38.1",
+            "version": "v12.39.0",
             "dist": {
                 "type": "zip",
-                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/collections/v12.38.1/illuminate-collections-v12.38.1.zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/collections/v12.39.0/illuminate-collections-v12.39.0.zip",
                 "reference": "deb291b109b6f7fd776a3550a120771137b3c5d1",
                 "shasum": ""
             },
@@ -1248,10 +1248,10 @@
         },
         {
             "name": "illuminate/conditionable",
-            "version": "v12.38.1",
+            "version": "v12.39.0",
             "dist": {
                 "type": "zip",
-                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/conditionable/v12.38.1/illuminate-conditionable-v12.38.1.zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/conditionable/v12.39.0/illuminate-conditionable-v12.39.0.zip",
                 "reference": "ec677967c1f2faf90b8428919124d2184a4c9b49",
                 "shasum": ""
             },
@@ -1288,11 +1288,11 @@
         },
         {
             "name": "illuminate/container",
-            "version": "v12.38.1",
+            "version": "v12.39.0",
             "dist": {
                 "type": "zip",
-                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/container/v12.38.1/illuminate-container-v12.38.1.zip",
-                "reference": "d6eaa8afd48dbe16b6b3c412a87479cad67eeb12",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/container/v12.39.0/illuminate-container-v12.39.0.zip",
+                "reference": "17ec6c2f741b11564420acc737dea9334d69988c",
                 "shasum": ""
             },
             "require": {
@@ -1339,14 +1339,14 @@
                 "issues": "https://github.com/laravel/framework/issues",
                 "source": "https://github.com/laravel/framework"
             },
-            "time": "2025-09-12T14:35:11+00:00"
+            "time": "2025-11-14T15:29:05+00:00"
         },
         {
             "name": "illuminate/contracts",
-            "version": "v12.38.1",
+            "version": "v12.39.0",
             "dist": {
                 "type": "zip",
-                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/contracts/v12.38.1/illuminate-contracts-v12.38.1.zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/contracts/v12.39.0/illuminate-contracts-v12.39.0.zip",
                 "reference": "5ab717c8f0dd4e84be703796bbb415ccff8de57a",
                 "shasum": ""
             },
@@ -1385,10 +1385,10 @@
         },
         {
             "name": "illuminate/events",
-            "version": "v12.38.1",
+            "version": "v12.39.0",
             "dist": {
                 "type": "zip",
-                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/events/v12.38.1/illuminate-events-v12.38.1.zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/events/v12.39.0/illuminate-events-v12.39.0.zip",
                 "reference": "e0de667c68040d59a6ffc09e914536a1186870f0",
                 "shasum": ""
             },
@@ -1434,10 +1434,10 @@
         },
         {
             "name": "illuminate/macroable",
-            "version": "v12.38.1",
+            "version": "v12.39.0",
             "dist": {
                 "type": "zip",
-                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/macroable/v12.38.1/illuminate-macroable-v12.38.1.zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/macroable/v12.39.0/illuminate-macroable-v12.39.0.zip",
                 "reference": "e862e5648ee34004fa56046b746f490dfa86c613",
                 "shasum": ""
             },
@@ -1474,10 +1474,10 @@
         },
         {
             "name": "illuminate/pipeline",
-            "version": "v12.38.1",
+            "version": "v12.39.0",
             "dist": {
                 "type": "zip",
-                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/pipeline/v12.38.1/illuminate-pipeline-v12.38.1.zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/pipeline/v12.39.0/illuminate-pipeline-v12.39.0.zip",
                 "reference": "b6a14c20d69a44bf0a6fba664a00d23ca71770ee",
                 "shasum": ""
             },
@@ -1520,10 +1520,10 @@
         },
         {
             "name": "illuminate/redis",
-            "version": "v12.38.1",
+            "version": "v12.39.0",
             "dist": {
                 "type": "zip",
-                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/redis/v12.38.1/illuminate-redis-v12.38.1.zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/redis/v12.39.0/illuminate-redis-v12.39.0.zip",
                 "reference": "7e70e89db07e4bc3b0271a7a820a0d85b746c069",
                 "shasum": ""
             },
@@ -1568,11 +1568,11 @@
         },
         {
             "name": "illuminate/support",
-            "version": "v12.38.1",
+            "version": "v12.39.0",
             "dist": {
                 "type": "zip",
-                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/support/v12.38.1/illuminate-support-v12.38.1.zip",
-                "reference": "008b6c0d45f548de0f801d60a5854a7f9e4dd32f",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/support/v12.39.0/illuminate-support-v12.39.0.zip",
+                "reference": "d9780f626aa79d6b7b9c18f0d886340a29c66659",
                 "shasum": ""
             },
             "require": {
@@ -1637,7 +1637,7 @@
                 "issues": "https://github.com/laravel/framework/issues",
                 "source": "https://github.com/laravel/framework"
             },
-            "time": "2025-11-06T14:27:18+00:00"
+            "time": "2025-11-16T14:43:22+00:00"
         },
         {
             "name": "intervention/gif",
@@ -4872,12 +4872,12 @@
     "packages-dev": [],
     "aliases": [],
     "minimum-stability": "dev",
-    "stability-flags": {},
+    "stability-flags": [],
     "prefer-stable": true,
     "prefer-lowest": false,
     "platform": {
         "php": ">=8.1"
     },
-    "platform-dev": {},
+    "platform-dev": [],
     "plugin-api-version": "2.6.0"
 }

+ 10 - 46
resource/translations/zh_CN/messages.php

@@ -2,51 +2,15 @@
 
 
 return [
-    40001 => '请输入登录账号',
-    40002 => '请输入登录密码',
-    40003 => '登录账号不存在',
-    40004 => '您已被禁止登录,请联系管理员',
-    40005 => '此账号已被封禁,无法操作',
-    40006 => '账号或密码错误',
-    40007 => '登录成功',
-    400017 => '注册成功,正在跳转登录',
-    40008 => '登录已过期,请重新登录',
-    40009 => '登录状态有误,请重新登录',
-    40010 => '上传失败',
-    40011 => '权限已到期,请联系管理员',
-    40012 => '该来客账户ID已添加,请勿重复操作',
-    40013 => '该AppId已添加,请勿重复操作',
-    40014 => '该POI已添加,请勿重复操作',
-    40015 => '门店数据不存在',
-    40035 => '不合法的参数',
-    40038 => '不合法的请求格式',
-
-    "error"     => '操作失败',
+    "empty" => [
+        "mobile"    => "请输入手机号码",
+        "user"      => "请输入用户名",
+        "passwd"    => "请输入登陆密码",
+        "code"      => "请输入验证码",
+        "data"      => "数据不存在"
+    ],
+    "error"     => [
+        "captcha"  => "验证码输入错误"
+    ],
     "success"   => "操作成功",
-    "empty"     => "数据不存在",
-
-    20010 => "参数格式错误",
-    20011 => "当前设定账号已存在,请更换",
-    20012 => "该手机号码已注册,请更换",
-    20014 => "用户账号已存在,请更换",
-    20015 => "当前门店入库错误,请联系管理员",
-    20016 => "注册成功,请联系对应负责人开通权限",
-    20017 => "该账号尚未绑定权限,请联系对应负责人",
-    20018 => "注册账号失败,请联系对应负责人",
-
-    300010 => "请勿重复获取",
-    300011 => "获取验证码失败,请联系管理员",
-    300012 => "验证码已成功发送至%mobile%,请注意查收",
-    300013 => "请先验证手机号码",
-
-    500001 => "门店开通成功,请使用手机号码%mobile%进行登录",
-    500002 => "请输入用户手机号码",
-    500003 => "请输入密码",
-    500004 => "请输入验证码",
-    500005 => "场景值错误",
-    500006 => "请选择所属门店",
-    500007 => "请输入名称",
-    500008 => "请输入登录账号",
-
-    600001 => "当前账号无权限,请使用主账号操作"
 ];

+ 4 - 1
vendor/autoload.php

@@ -14,7 +14,10 @@ if (PHP_VERSION_ID < 50600) {
             echo $err;
         }
     }
-    throw new RuntimeException($err);
+    trigger_error(
+        $err,
+        E_USER_ERROR
+    );
 }
 
 require_once __DIR__ . '/composer/autoload_real.php';

+ 4 - 41
vendor/composer/InstalledVersions.php

@@ -26,23 +26,12 @@ use Composer\Semver\VersionParser;
  */
 class InstalledVersions
 {
-    /**
-     * @var string|null if set (by reflection by Composer), this should be set to the path where this class is being copied to
-     * @internal
-     */
-    private static $selfDir = null;
-
     /**
      * @var mixed[]|null
      * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null
      */
     private static $installed;
 
-    /**
-     * @var bool
-     */
-    private static $installedIsLocalDir;
-
     /**
      * @var bool|null
      */
@@ -320,24 +309,6 @@ class InstalledVersions
     {
         self::$installed = $data;
         self::$installedByVendor = array();
-
-        // when using reload, we disable the duplicate protection to ensure that self::$installed data is
-        // always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not,
-        // so we have to assume it does not, and that may result in duplicate data being returned when listing
-        // all installed packages for example
-        self::$installedIsLocalDir = false;
-    }
-
-    /**
-     * @return string
-     */
-    private static function getSelfDir()
-    {
-        if (self::$selfDir === null) {
-            self::$selfDir = strtr(__DIR__, '\\', '/');
-        }
-
-        return self::$selfDir;
     }
 
     /**
@@ -351,27 +322,19 @@ class InstalledVersions
         }
 
         $installed = array();
-        $copiedLocalDir = false;
 
         if (self::$canGetVendors) {
-            $selfDir = self::getSelfDir();
             foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
-                $vendorDir = strtr($vendorDir, '\\', '/');
                 if (isset(self::$installedByVendor[$vendorDir])) {
                     $installed[] = self::$installedByVendor[$vendorDir];
                 } elseif (is_file($vendorDir.'/composer/installed.php')) {
                     /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
                     $required = require $vendorDir.'/composer/installed.php';
-                    self::$installedByVendor[$vendorDir] = $required;
-                    $installed[] = $required;
-                    if (self::$installed === null && $vendorDir.'/composer' === $selfDir) {
-                        self::$installed = $required;
-                        self::$installedIsLocalDir = true;
+                    $installed[] = self::$installedByVendor[$vendorDir] = $required;
+                    if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
+                        self::$installed = $installed[count($installed) - 1];
                     }
                 }
-                if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) {
-                    $copiedLocalDir = true;
-                }
             }
         }
 
@@ -387,7 +350,7 @@ class InstalledVersions
             }
         }
 
-        if (self::$installed !== array() && !$copiedLocalDir) {
+        if (self::$installed !== array()) {
             $installed[] = self::$installed;
         }
 

+ 4 - 4
vendor/composer/autoload_psr4.php

@@ -8,8 +8,8 @@ $baseDir = dirname($vendorDir);
 return array(
     'yzh52521\\EasyHttp\\' => array($vendorDir . '/yzh52521/easyhttp/src'),
     'voku\\' => array($vendorDir . '/voku/portable-ascii/src/voku'),
-    'think\\' => array($vendorDir . '/topthink/think-template/src', $vendorDir . '/topthink/think-orm/src', $vendorDir . '/topthink/think-validate/src', $vendorDir . '/topthink/think-container/src', $vendorDir . '/topthink/think-helper/src'),
-    'support\\' => array($vendorDir . '/webman/think-orm/src/support', $vendorDir . '/webman/think-cache/src/support', $vendorDir . '/webman/redis/src/support', $vendorDir . '/workerman/webman-framework/src/support'),
+    'think\\' => array($vendorDir . '/topthink/think-container/src', $vendorDir . '/topthink/think-helper/src', $vendorDir . '/topthink/think-orm/src', $vendorDir . '/topthink/think-template/src', $vendorDir . '/topthink/think-validate/src'),
+    'support\\' => array($vendorDir . '/webman/redis/src/support', $vendorDir . '/webman/think-cache/src/support', $vendorDir . '/webman/think-orm/src/support', $vendorDir . '/workerman/webman-framework/src/support'),
     'app\\View\\Components\\' => array($baseDir . '/app/view/components'),
     'app\\' => array($baseDir . '/app'),
     'ZipStream\\' => array($vendorDir . '/maennchen/zipstream-php/src'),
@@ -18,7 +18,7 @@ return array(
     'Workerman\\RedisQueue\\' => array($vendorDir . '/workerman/redis-queue/src'),
     'Workerman\\Crontab\\' => array($vendorDir . '/workerman/crontab/src'),
     'Workerman\\Coroutine\\' => array($vendorDir . '/workerman/coroutine/src'),
-    'Workerman\\' => array($vendorDir . '/workerman/workerman/src', $vendorDir . '/workerman/coroutine/src'),
+    'Workerman\\' => array($vendorDir . '/workerman/coroutine/src', $vendorDir . '/workerman/workerman/src'),
     'Webman\\ThinkOrm\\' => array($vendorDir . '/webman/think-orm/src'),
     'Webman\\ThinkCache\\' => array($vendorDir . '/webman/think-cache/src'),
     'Webman\\Redis\\' => array($vendorDir . '/webman/redis/src'),
@@ -68,7 +68,7 @@ return array(
     'Kkokk\\Poster\\' => array($vendorDir . '/kkokk/poster/src'),
     'Intervention\\Image\\' => array($vendorDir . '/intervention/image/src'),
     'Intervention\\Gif\\' => array($vendorDir . '/intervention/gif/src'),
-    'Illuminate\\Support\\' => array($vendorDir . '/illuminate/support', $vendorDir . '/illuminate/collections', $vendorDir . '/illuminate/conditionable', $vendorDir . '/illuminate/macroable'),
+    'Illuminate\\Support\\' => array($vendorDir . '/illuminate/macroable', $vendorDir . '/illuminate/conditionable', $vendorDir . '/illuminate/collections', $vendorDir . '/illuminate/support'),
     'Illuminate\\Redis\\' => array($vendorDir . '/illuminate/redis'),
     'Illuminate\\Pipeline\\' => array($vendorDir . '/illuminate/pipeline'),
     'Illuminate\\Events\\' => array($vendorDir . '/illuminate/events'),

+ 13 - 13
vendor/composer/autoload_static.php

@@ -219,17 +219,17 @@ class ComposerStaticInit691f538563ac6695008ddc51b7722c80
         ),
         'think\\' => 
         array (
-            0 => __DIR__ . '/..' . '/topthink/think-template/src',
-            1 => __DIR__ . '/..' . '/topthink/think-orm/src',
-            2 => __DIR__ . '/..' . '/topthink/think-validate/src',
-            3 => __DIR__ . '/..' . '/topthink/think-container/src',
-            4 => __DIR__ . '/..' . '/topthink/think-helper/src',
+            0 => __DIR__ . '/..' . '/topthink/think-container/src',
+            1 => __DIR__ . '/..' . '/topthink/think-helper/src',
+            2 => __DIR__ . '/..' . '/topthink/think-orm/src',
+            3 => __DIR__ . '/..' . '/topthink/think-template/src',
+            4 => __DIR__ . '/..' . '/topthink/think-validate/src',
         ),
         'support\\' => 
         array (
-            0 => __DIR__ . '/..' . '/webman/think-orm/src/support',
+            0 => __DIR__ . '/..' . '/webman/redis/src/support',
             1 => __DIR__ . '/..' . '/webman/think-cache/src/support',
-            2 => __DIR__ . '/..' . '/webman/redis/src/support',
+            2 => __DIR__ . '/..' . '/webman/think-orm/src/support',
             3 => __DIR__ . '/..' . '/workerman/webman-framework/src/support',
         ),
         'app\\View\\Components\\' => 
@@ -266,8 +266,8 @@ class ComposerStaticInit691f538563ac6695008ddc51b7722c80
         ),
         'Workerman\\' => 
         array (
-            0 => __DIR__ . '/..' . '/workerman/workerman/src',
-            1 => __DIR__ . '/..' . '/workerman/coroutine/src',
+            0 => __DIR__ . '/..' . '/workerman/coroutine/src',
+            1 => __DIR__ . '/..' . '/workerman/workerman/src',
         ),
         'Webman\\ThinkOrm\\' => 
         array (
@@ -468,10 +468,10 @@ class ComposerStaticInit691f538563ac6695008ddc51b7722c80
         ),
         'Illuminate\\Support\\' => 
         array (
-            0 => __DIR__ . '/..' . '/illuminate/support',
-            1 => __DIR__ . '/..' . '/illuminate/collections',
-            2 => __DIR__ . '/..' . '/illuminate/conditionable',
-            3 => __DIR__ . '/..' . '/illuminate/macroable',
+            0 => __DIR__ . '/..' . '/illuminate/macroable',
+            1 => __DIR__ . '/..' . '/illuminate/conditionable',
+            2 => __DIR__ . '/..' . '/illuminate/collections',
+            3 => __DIR__ . '/..' . '/illuminate/support',
         ),
         'Illuminate\\Redis\\' => 
         array (

+ 34 - 34
vendor/composer/installed.json

@@ -1199,11 +1199,11 @@
         },
         {
             "name": "illuminate/bus",
-            "version": "v12.38.1",
-            "version_normalized": "12.38.1.0",
+            "version": "v12.39.0",
+            "version_normalized": "12.39.0.0",
             "dist": {
                 "type": "zip",
-                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/bus/v12.38.1/illuminate-bus-v12.38.1.zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/bus/v12.39.0/illuminate-bus-v12.39.0.zip",
                 "reference": "7845b735651ffb734b8b064e7d0349490adf4564",
                 "shasum": ""
             },
@@ -1249,11 +1249,11 @@
         },
         {
             "name": "illuminate/collections",
-            "version": "v12.38.1",
-            "version_normalized": "12.38.1.0",
+            "version": "v12.39.0",
+            "version_normalized": "12.39.0.0",
             "dist": {
                 "type": "zip",
-                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/collections/v12.38.1/illuminate-collections-v12.38.1.zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/collections/v12.39.0/illuminate-collections-v12.39.0.zip",
                 "reference": "deb291b109b6f7fd776a3550a120771137b3c5d1",
                 "shasum": ""
             },
@@ -1305,11 +1305,11 @@
         },
         {
             "name": "illuminate/conditionable",
-            "version": "v12.38.1",
-            "version_normalized": "12.38.1.0",
+            "version": "v12.39.0",
+            "version_normalized": "12.39.0.0",
             "dist": {
                 "type": "zip",
-                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/conditionable/v12.38.1/illuminate-conditionable-v12.38.1.zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/conditionable/v12.39.0/illuminate-conditionable-v12.39.0.zip",
                 "reference": "ec677967c1f2faf90b8428919124d2184a4c9b49",
                 "shasum": ""
             },
@@ -1348,12 +1348,12 @@
         },
         {
             "name": "illuminate/container",
-            "version": "v12.38.1",
-            "version_normalized": "12.38.1.0",
+            "version": "v12.39.0",
+            "version_normalized": "12.39.0.0",
             "dist": {
                 "type": "zip",
-                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/container/v12.38.1/illuminate-container-v12.38.1.zip",
-                "reference": "d6eaa8afd48dbe16b6b3c412a87479cad67eeb12",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/container/v12.39.0/illuminate-container-v12.39.0.zip",
+                "reference": "17ec6c2f741b11564420acc737dea9334d69988c",
                 "shasum": ""
             },
             "require": {
@@ -1374,7 +1374,7 @@
                 "illuminate/filesystem": "Required to use the Storage attribute",
                 "illuminate/log": "Required to use the Log or Context attributes"
             },
-            "time": "2025-09-12T14:35:11+00:00",
+            "time": "2025-11-14T15:29:05+00:00",
             "type": "library",
             "extra": {
                 "branch-alias": {
@@ -1406,11 +1406,11 @@
         },
         {
             "name": "illuminate/contracts",
-            "version": "v12.38.1",
-            "version_normalized": "12.38.1.0",
+            "version": "v12.39.0",
+            "version_normalized": "12.39.0.0",
             "dist": {
                 "type": "zip",
-                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/contracts/v12.38.1/illuminate-contracts-v12.38.1.zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/contracts/v12.39.0/illuminate-contracts-v12.39.0.zip",
                 "reference": "5ab717c8f0dd4e84be703796bbb415ccff8de57a",
                 "shasum": ""
             },
@@ -1451,11 +1451,11 @@
         },
         {
             "name": "illuminate/events",
-            "version": "v12.38.1",
-            "version_normalized": "12.38.1.0",
+            "version": "v12.39.0",
+            "version_normalized": "12.39.0.0",
             "dist": {
                 "type": "zip",
-                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/events/v12.38.1/illuminate-events-v12.38.1.zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/events/v12.39.0/illuminate-events-v12.39.0.zip",
                 "reference": "e0de667c68040d59a6ffc09e914536a1186870f0",
                 "shasum": ""
             },
@@ -1503,11 +1503,11 @@
         },
         {
             "name": "illuminate/macroable",
-            "version": "v12.38.1",
-            "version_normalized": "12.38.1.0",
+            "version": "v12.39.0",
+            "version_normalized": "12.39.0.0",
             "dist": {
                 "type": "zip",
-                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/macroable/v12.38.1/illuminate-macroable-v12.38.1.zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/macroable/v12.39.0/illuminate-macroable-v12.39.0.zip",
                 "reference": "e862e5648ee34004fa56046b746f490dfa86c613",
                 "shasum": ""
             },
@@ -1546,11 +1546,11 @@
         },
         {
             "name": "illuminate/pipeline",
-            "version": "v12.38.1",
-            "version_normalized": "12.38.1.0",
+            "version": "v12.39.0",
+            "version_normalized": "12.39.0.0",
             "dist": {
                 "type": "zip",
-                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/pipeline/v12.38.1/illuminate-pipeline-v12.38.1.zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/pipeline/v12.39.0/illuminate-pipeline-v12.39.0.zip",
                 "reference": "b6a14c20d69a44bf0a6fba664a00d23ca71770ee",
                 "shasum": ""
             },
@@ -1595,11 +1595,11 @@
         },
         {
             "name": "illuminate/redis",
-            "version": "v12.38.1",
-            "version_normalized": "12.38.1.0",
+            "version": "v12.39.0",
+            "version_normalized": "12.39.0.0",
             "dist": {
                 "type": "zip",
-                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/redis/v12.38.1/illuminate-redis-v12.38.1.zip",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/redis/v12.39.0/illuminate-redis-v12.39.0.zip",
                 "reference": "7e70e89db07e4bc3b0271a7a820a0d85b746c069",
                 "shasum": ""
             },
@@ -1646,12 +1646,12 @@
         },
         {
             "name": "illuminate/support",
-            "version": "v12.38.1",
-            "version_normalized": "12.38.1.0",
+            "version": "v12.39.0",
+            "version_normalized": "12.39.0.0",
             "dist": {
                 "type": "zip",
-                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/support/v12.38.1/illuminate-support-v12.38.1.zip",
-                "reference": "008b6c0d45f548de0f801d60a5854a7f9e4dd32f",
+                "url": "https://mirrors.cloud.tencent.com/repository/composer/illuminate/support/v12.39.0/illuminate-support-v12.39.0.zip",
+                "reference": "d9780f626aa79d6b7b9c18f0d886340a29c66659",
                 "shasum": ""
             },
             "require": {
@@ -1686,7 +1686,7 @@
                 "symfony/var-dumper": "Required to use the dd function (^7.2).",
                 "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.6.1)."
             },
-            "time": "2025-11-06T14:27:18+00:00",
+            "time": "2025-11-16T14:43:22+00:00",
             "type": "library",
             "extra": {
                 "branch-alias": {

+ 24 - 24
vendor/composer/installed.php

@@ -3,7 +3,7 @@
         'name' => 'workerman/webman',
         'pretty_version' => 'dev-master',
         'version' => 'dev-master',
-        'reference' => 'a30513060a63d7dd4e748698f53f00a28a236182',
+        'reference' => '30c96d0f94751c8e0c1e1703781aee519213b2f4',
         'type' => 'project',
         'install_path' => __DIR__ . '/../../',
         'aliases' => array(),
@@ -188,8 +188,8 @@
             'dev_requirement' => false,
         ),
         'illuminate/bus' => array(
-            'pretty_version' => 'v12.38.1',
-            'version' => '12.38.1.0',
+            'pretty_version' => 'v12.39.0',
+            'version' => '12.39.0.0',
             'reference' => '7845b735651ffb734b8b064e7d0349490adf4564',
             'type' => 'library',
             'install_path' => __DIR__ . '/../illuminate/bus',
@@ -197,8 +197,8 @@
             'dev_requirement' => false,
         ),
         'illuminate/collections' => array(
-            'pretty_version' => 'v12.38.1',
-            'version' => '12.38.1.0',
+            'pretty_version' => 'v12.39.0',
+            'version' => '12.39.0.0',
             'reference' => 'deb291b109b6f7fd776a3550a120771137b3c5d1',
             'type' => 'library',
             'install_path' => __DIR__ . '/../illuminate/collections',
@@ -206,8 +206,8 @@
             'dev_requirement' => false,
         ),
         'illuminate/conditionable' => array(
-            'pretty_version' => 'v12.38.1',
-            'version' => '12.38.1.0',
+            'pretty_version' => 'v12.39.0',
+            'version' => '12.39.0.0',
             'reference' => 'ec677967c1f2faf90b8428919124d2184a4c9b49',
             'type' => 'library',
             'install_path' => __DIR__ . '/../illuminate/conditionable',
@@ -215,17 +215,17 @@
             'dev_requirement' => false,
         ),
         'illuminate/container' => array(
-            'pretty_version' => 'v12.38.1',
-            'version' => '12.38.1.0',
-            'reference' => 'd6eaa8afd48dbe16b6b3c412a87479cad67eeb12',
+            'pretty_version' => 'v12.39.0',
+            'version' => '12.39.0.0',
+            'reference' => '17ec6c2f741b11564420acc737dea9334d69988c',
             'type' => 'library',
             'install_path' => __DIR__ . '/../illuminate/container',
             'aliases' => array(),
             'dev_requirement' => false,
         ),
         'illuminate/contracts' => array(
-            'pretty_version' => 'v12.38.1',
-            'version' => '12.38.1.0',
+            'pretty_version' => 'v12.39.0',
+            'version' => '12.39.0.0',
             'reference' => '5ab717c8f0dd4e84be703796bbb415ccff8de57a',
             'type' => 'library',
             'install_path' => __DIR__ . '/../illuminate/contracts',
@@ -233,8 +233,8 @@
             'dev_requirement' => false,
         ),
         'illuminate/events' => array(
-            'pretty_version' => 'v12.38.1',
-            'version' => '12.38.1.0',
+            'pretty_version' => 'v12.39.0',
+            'version' => '12.39.0.0',
             'reference' => 'e0de667c68040d59a6ffc09e914536a1186870f0',
             'type' => 'library',
             'install_path' => __DIR__ . '/../illuminate/events',
@@ -242,8 +242,8 @@
             'dev_requirement' => false,
         ),
         'illuminate/macroable' => array(
-            'pretty_version' => 'v12.38.1',
-            'version' => '12.38.1.0',
+            'pretty_version' => 'v12.39.0',
+            'version' => '12.39.0.0',
             'reference' => 'e862e5648ee34004fa56046b746f490dfa86c613',
             'type' => 'library',
             'install_path' => __DIR__ . '/../illuminate/macroable',
@@ -251,8 +251,8 @@
             'dev_requirement' => false,
         ),
         'illuminate/pipeline' => array(
-            'pretty_version' => 'v12.38.1',
-            'version' => '12.38.1.0',
+            'pretty_version' => 'v12.39.0',
+            'version' => '12.39.0.0',
             'reference' => 'b6a14c20d69a44bf0a6fba664a00d23ca71770ee',
             'type' => 'library',
             'install_path' => __DIR__ . '/../illuminate/pipeline',
@@ -260,8 +260,8 @@
             'dev_requirement' => false,
         ),
         'illuminate/redis' => array(
-            'pretty_version' => 'v12.38.1',
-            'version' => '12.38.1.0',
+            'pretty_version' => 'v12.39.0',
+            'version' => '12.39.0.0',
             'reference' => '7e70e89db07e4bc3b0271a7a820a0d85b746c069',
             'type' => 'library',
             'install_path' => __DIR__ . '/../illuminate/redis',
@@ -269,9 +269,9 @@
             'dev_requirement' => false,
         ),
         'illuminate/support' => array(
-            'pretty_version' => 'v12.38.1',
-            'version' => '12.38.1.0',
-            'reference' => '008b6c0d45f548de0f801d60a5854a7f9e4dd32f',
+            'pretty_version' => 'v12.39.0',
+            'version' => '12.39.0.0',
+            'reference' => 'd9780f626aa79d6b7b9c18f0d886340a29c66659',
             'type' => 'library',
             'install_path' => __DIR__ . '/../illuminate/support',
             'aliases' => array(),
@@ -878,7 +878,7 @@
         'workerman/webman' => array(
             'pretty_version' => 'dev-master',
             'version' => 'dev-master',
-            'reference' => 'a30513060a63d7dd4e748698f53f00a28a236182',
+            'reference' => '30c96d0f94751c8e0c1e1703781aee519213b2f4',
             'type' => 'project',
             'install_path' => __DIR__ . '/../../',
             'aliases' => array(),

+ 1 - 3
vendor/illuminate/container/Attributes/Give.php

@@ -12,9 +12,7 @@ class Give implements ContextualAttribute
     /**
      * Provide a concrete class implementation for dependency injection.
      *
-     * @template T
-     *
-     * @param  class-string<T>  $class
+     * @param  string  $class
      * @param  array|null  $params
      */
     public function __construct(

+ 1 - 0
vendor/illuminate/support/Facades/View.php

@@ -78,6 +78,7 @@ namespace Illuminate\Support\Facades;
  * @method static void startPrepend(string $section, string $content = '')
  * @method static string stopPrepend()
  * @method static string yieldPushContent(string $section, string $default = '')
+ * @method static bool isStackEmpty(string $section)
  * @method static void flushStacks()
  * @method static void startTranslation(array $replacements = [])
  * @method static string renderTranslation()