zxhxx 3 years ago
commit
b2935354d4
100 changed files with 7574 additions and 0 deletions
  1. 1 0
      .example.env
  2. 5 0
      .gitignore
  3. 42 0
      .travis.yml
  4. 32 0
      LICENSE.txt
  5. 56 0
      README.md
  6. 1 0
      app/.htaccess
  7. 22 0
      app/AppService.php
  8. 94 0
      app/BaseController.php
  9. 58 0
      app/ExceptionHandle.php
  10. 8 0
      app/Request.php
  11. 2 0
      app/common.php
  12. 17 0
      app/controller/Index.php
  13. 17 0
      app/event.php
  14. 10 0
      app/middleware.php
  15. 9 0
      app/provider.php
  16. 9 0
      app/service.php
  17. 57 0
      composer.json
  18. 3919 0
      composer.lock
  19. 32 0
      config/app.php
  20. 29 0
      config/cache.php
  21. 9 0
      config/console.php
  22. 20 0
      config/cookie.php
  23. 63 0
      config/database.php
  24. 24 0
      config/filesystem.php
  25. 27 0
      config/lang.php
  26. 45 0
      config/log.php
  27. 8 0
      config/middleware.php
  28. 39 0
      config/queue.php
  29. 45 0
      config/route.php
  30. 19 0
      config/session.php
  31. 10 0
      config/trace.php
  32. 25 0
      config/view.php
  33. 2 0
      extend/.gitignore
  34. 16 0
      ln/exceptions/AuthException.php
  35. 12 0
      ln/exceptions/SmsException.php
  36. 15 0
      ln/exceptions/UploadException.php
  37. 18 0
      ln/exceptions/UploadFailException.php
  38. 13 0
      ln/exceptions/WechatException.php
  39. 11 0
      ln/interfaces/JobInterface.php
  40. 9 0
      ln/interfaces/ListenerInterface.php
  41. 13 0
      ln/interfaces/MiddlewareInterface.php
  42. 37 0
      ln/jobs/ApplyBroadcastGoodsJob.php
  43. 34 0
      ln/jobs/AutoUserPosterJob.php
  44. 37 0
      ln/jobs/BatchDeliveryJob.php
  45. 38 0
      ln/jobs/CancelGroupBuyingJob.php
  46. 54 0
      ln/jobs/CancelGroupOrderJob.php
  47. 31 0
      ln/jobs/ChangeMerchantStatusJob.php
  48. 30 0
      ln/jobs/ChangeSpuStatusJob.php
  49. 30 0
      ln/jobs/CheckProductExtensionJob.php
  50. 40 0
      ln/jobs/CheckProductPresellJob.php
  51. 27 0
      ln/jobs/ClearMerchantStoreJob.php
  52. 48 0
      ln/jobs/ClearUserIntegralJob.php
  53. 29 0
      ln/jobs/ExpressSyncJob.php
  54. 27 0
      ln/jobs/GauaranteeCountJob.php
  55. 27 0
      ln/jobs/ImportSpreadsheetExcelJob.php
  56. 60 0
      ln/jobs/MerchantSendCouponJob.php
  57. 34 0
      ln/jobs/OrderProfitsharingJob.php
  58. 61 0
      ln/jobs/OrderReplyJob.php
  59. 33 0
      ln/jobs/PayGiveCouponJob.php
  60. 39 0
      ln/jobs/SendNewPeopleCouponJob.php
  61. 38 0
      ln/jobs/SendNewsJob.php
  62. 37 0
      ln/jobs/SendSmsJob.php
  63. 37 0
      ln/jobs/SendTemplateMessageJob.php
  64. 27 0
      ln/jobs/SpreadsheetExcelJob.php
  65. 41 0
      ln/jobs/UpdateProductReplyJob.php
  66. 45 0
      ln/jobs/UserBrokerageLevelJob.php
  67. 28 0
      ln/jobs/UserHistoryJob.php
  68. 39 0
      ln/listens/AuthCancelPresellOrderListen.php
  69. 39 0
      ln/listens/AuthTakeOrderListen.php
  70. 31 0
      ln/listens/AutoCancelGroupOrderListen.php
  71. 87 0
      ln/listens/AutoClearIntegralListen.php
  72. 28 0
      ln/listens/AutoOrderProfitsharingListen.php
  73. 28 0
      ln/listens/AutoOrderReplyListen.php
  74. 32 0
      ln/listens/AutoSendPayOrderSmsListen.php
  75. 41 0
      ln/listens/AutoUnLockBrokerageListen.php
  76. 42 0
      ln/listens/AutoUnLockIntegralListen.php
  77. 45 0
      ln/listens/AutoUnlockMerchantMoneyListen.php
  78. 31 0
      ln/listens/CreateTimerListen.php
  79. 38 0
      ln/listens/ExcelFileDelListen.php
  80. 32 0
      ln/listens/GuaranteeCountListen.php
  81. 31 0
      ln/listens/InitSwooleLockListen.php
  82. 40 0
      ln/listens/MerchantApplyMentsCheckListen.php
  83. 35 0
      ln/listens/ProductGroupStatusCheckListen.php
  84. 46 0
      ln/listens/ProductPresellStatusListen.php
  85. 41 0
      ln/listens/RefundOrderAgreeListen.php
  86. 44 0
      ln/listens/SeckillTImeCheckListen.php
  87. 164 0
      ln/listens/SwooleTaskListen.php
  88. 26 0
      ln/listens/SwooleWorkerExitListen.php
  89. 54 0
      ln/listens/SyncBroadcastStatusListen.php
  90. 42 0
      ln/listens/SyncSmsResultCodeListen.php
  91. 32 0
      ln/listens/SyncSpreadStatusListen.php
  92. 17 0
      ln/listens/pay/MealSuccessListen.php
  93. 27 0
      ln/listens/pay/OrderPaySuccessListen.php
  94. 27 0
      ln/listens/pay/PresellPaySuccessListen.php
  95. 19 0
      ln/listens/pay/UserRechargeSuccessListen.php
  96. 169 0
      ln/services/AccessTokenServeService.php
  97. 148 0
      ln/services/AlipayService.php
  98. 133 0
      ln/services/ApiResponseService.php
  99. 72 0
      ln/services/BaseExpress.php
  100. 62 0
      ln/services/BaseProduct.php

+ 1 - 0
.example.env

@@ -0,0 +1 @@
+APP_DEBUG = true

[APP]
DEFAULT_TIMEZONE = Asia/Shanghai

[DATABASE]
TYPE = mysql
HOSTNAME = 127.0.0.1
DATABASE = test
USERNAME = username
PASSWORD = password
HOSTPORT = 3306
CHARSET = utf8
DEBUG = true

[LANG]
default_lang = zh-cn

+ 5 - 0
.gitignore

@@ -0,0 +1,5 @@
+/.idea
+/.vscode
+/vendor
+*.log
+.env

+ 42 - 0
.travis.yml

@@ -0,0 +1,42 @@
+sudo: false
+
+language: php
+
+branches:
+  only:
+    - stable
+
+cache:
+  directories:
+    - $HOME/.composer/cache
+
+before_install:
+  - composer self-update
+
+install:
+  - composer install --no-dev --no-interaction --ignore-platform-reqs
+  - zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Core.zip .
+  - composer require --update-no-dev --no-interaction "topthink/think-image:^1.0"
+  - composer require --update-no-dev --no-interaction "topthink/think-migration:^1.0"
+  - composer require --update-no-dev --no-interaction "topthink/think-captcha:^1.0"
+  - composer require --update-no-dev --no-interaction "topthink/think-mongo:^1.0"
+  - composer require --update-no-dev --no-interaction "topthink/think-worker:^1.0"
+  - composer require --update-no-dev --no-interaction "topthink/think-helper:^1.0"
+  - composer require --update-no-dev --no-interaction "topthink/think-queue:^1.0"
+  - composer require --update-no-dev --no-interaction "topthink/think-angular:^1.0"
+  - composer require --dev --update-no-dev --no-interaction "topthink/think-testing:^1.0"
+  - zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Full.zip .
+
+script:
+  - php think unit
+
+deploy:
+  provider: releases
+  api_key:
+    secure: TSF6bnl2JYN72UQOORAJYL+CqIryP2gHVKt6grfveQ7d9rleAEoxlq6PWxbvTI4jZ5nrPpUcBUpWIJHNgVcs+bzLFtyh5THaLqm39uCgBbrW7M8rI26L8sBh/6nsdtGgdeQrO/cLu31QoTzbwuz1WfAVoCdCkOSZeXyT/CclH99qV6RYyQYqaD2wpRjrhA5O4fSsEkiPVuk0GaOogFlrQHx+C+lHnf6pa1KxEoN1A0UxxVfGX6K4y5g4WQDO5zT4bLeubkWOXK0G51XSvACDOZVIyLdjApaOFTwamPcD3S1tfvuxRWWvsCD5ljFvb2kSmx5BIBNwN80MzuBmrGIC27XLGOxyMerwKxB6DskNUO9PflKHDPI61DRq0FTy1fv70SFMSiAtUv9aJRT41NQh9iJJ0vC8dl+xcxrWIjU1GG6+l/ZcRqVx9V1VuGQsLKndGhja7SQ+X1slHl76fRq223sMOql7MFCd0vvvxVQ2V39CcFKao/LB1aPH3VhODDEyxwx6aXoTznvC/QPepgWsHOWQzKj9ftsgDbsNiyFlXL4cu8DWUty6rQy8zT2b4O8b1xjcwSUCsy+auEjBamzQkMJFNlZAIUrukL/NbUhQU37TAbwsFyz7X0E/u/VMle/nBCNAzgkMwAUjiHM6FqrKKBRWFbPrSIixjfjkCnrMEPw=
+  file:
+    - ThinkPHP_Core.zip
+    - ThinkPHP_Full.zip
+  skip_cleanup: true
+  on:
+    tags: true

+ 32 - 0
LICENSE.txt

@@ -0,0 +1,32 @@
+
+ThinkPHP遵循Apache2开源协议发布,并提供免费使用。
+版权所有Copyright © 2006-2016 by ThinkPHP (http://thinkphp.cn)
+All rights reserved。
+ThinkPHP® 商标和著作权所有者为上海顶想信息科技有限公司。
+
+Apache Licence是著名的非盈利开源组织Apache采用的协议。
+该协议和BSD类似,鼓励代码共享和尊重原作者的著作权,
+允许代码修改,再作为开源或商业软件发布。需要满足
+的条件: 
+1. 需要给代码的用户一份Apache Licence ;
+2. 如果你修改了代码,需要在被修改的文件中说明;
+3. 在延伸的代码中(修改和有源代码衍生的代码中)需要
+带有原来代码中的协议,商标,专利声明和其他原来作者规
+定需要包含的说明;
+4. 如果再发布的产品中包含一个Notice文件,则在Notice文
+件中需要带有本协议内容。你可以在Notice中增加自己的
+许可,但不可以表现为对Apache Licence构成更改。 
+具体的协议参考:http://www.apache.org/licenses/LICENSE-2.0
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.

+ 56 - 0
README.md

@@ -0,0 +1,56 @@
+ThinkPHP 6.0
+===============
+
+> 运行环境要求PHP7.1+,兼容PHP8.0。
+
+[官方应用服务市场](https://market.topthink.com) | [`ThinkAPI`——官方统一API服务](https://docs.topthink.com/think-api)
+
+ThinkPHPV6.0版本由[亿速云](https://www.yisu.com/)独家赞助发布。
+
+## 主要新特性
+
+* 采用`PHP7`强类型(严格模式)
+* 支持更多的`PSR`规范
+* 原生多应用支持
+* 更强大和易用的查询
+* 全新的事件系统
+* 模型事件和数据库事件统一纳入事件系统
+* 模板引擎分离出核心
+* 内部功能中间件化
+* SESSION/Cookie机制改进
+* 对Swoole以及协程支持改进
+* 对IDE更加友好
+* 统一和精简大量用法
+
+## 安装
+
+~~~
+composer create-project topthink/think tp 6.0.*
+~~~
+
+如果需要更新框架使用
+~~~
+composer update topthink/framework
+~~~
+
+## 文档
+
+[完全开发手册](https://www.kancloud.cn/manual/thinkphp6_0/content)
+
+## 参与开发
+
+请参阅 [ThinkPHP 核心框架包](https://github.com/top-think/framework)。
+
+## 版权信息
+
+ThinkPHP遵循Apache2开源协议发布,并提供免费使用。
+
+本项目包含的第三方源码和二进制文件之版权信息另行标注。
+
+版权所有Copyright © 2006-2020 by ThinkPHP (http://thinkphp.cn)
+
+All rights reserved。
+
+ThinkPHP® 商标和著作权所有者为上海顶想信息科技有限公司。
+
+更多细节参阅 [LICENSE.txt](LICENSE.txt)

+ 1 - 0
app/.htaccess

@@ -0,0 +1 @@
+deny from all

+ 22 - 0
app/AppService.php

@@ -0,0 +1,22 @@
+<?php
+declare (strict_types = 1);
+
+namespace app;
+
+use think\Service;
+
+/**
+ * 应用服务类
+ */
+class AppService extends Service
+{
+    public function register()
+    {
+        // 服务注册
+    }
+
+    public function boot()
+    {
+        // 服务启动
+    }
+}

+ 94 - 0
app/BaseController.php

@@ -0,0 +1,94 @@
+<?php
+declare (strict_types = 1);
+
+namespace app;
+
+use think\App;
+use think\exception\ValidateException;
+use think\Validate;
+
+/**
+ * 控制器基础类
+ */
+abstract class BaseController
+{
+    /**
+     * Request实例
+     * @var \think\Request
+     */
+    protected $request;
+
+    /**
+     * 应用实例
+     * @var \think\App
+     */
+    protected $app;
+
+    /**
+     * 是否批量验证
+     * @var bool
+     */
+    protected $batchValidate = false;
+
+    /**
+     * 控制器中间件
+     * @var array
+     */
+    protected $middleware = [];
+
+    /**
+     * 构造方法
+     * @access public
+     * @param  App  $app  应用对象
+     */
+    public function __construct(App $app)
+    {
+        $this->app     = $app;
+        $this->request = $this->app->request;
+
+        // 控制器初始化
+        $this->initialize();
+    }
+
+    // 初始化
+    protected function initialize()
+    {}
+
+    /**
+     * 验证数据
+     * @access protected
+     * @param  array        $data     数据
+     * @param  string|array $validate 验证器名或者验证规则数组
+     * @param  array        $message  提示信息
+     * @param  bool         $batch    是否批量验证
+     * @return array|string|true
+     * @throws ValidateException
+     */
+    protected function validate(array $data, $validate, array $message = [], bool $batch = false)
+    {
+        if (is_array($validate)) {
+            $v = new Validate();
+            $v->rule($validate);
+        } else {
+            if (strpos($validate, '.')) {
+                // 支持场景
+                [$validate, $scene] = explode('.', $validate);
+            }
+            $class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate);
+            $v     = new $class();
+            if (!empty($scene)) {
+                $v->scene($scene);
+            }
+        }
+
+        $v->message($message);
+
+        // 是否批量验证
+        if ($batch || $this->batchValidate) {
+            $v->batch(true);
+        }
+
+        return $v->failException(true)->check($data);
+    }
+
+}

+ 58 - 0
app/ExceptionHandle.php

@@ -0,0 +1,58 @@
+<?php
+namespace app;
+
+use think\db\exception\DataNotFoundException;
+use think\db\exception\ModelNotFoundException;
+use think\exception\Handle;
+use think\exception\HttpException;
+use think\exception\HttpResponseException;
+use think\exception\ValidateException;
+use think\Response;
+use Throwable;
+
+/**
+ * 应用异常处理类
+ */
+class ExceptionHandle extends Handle
+{
+    /**
+     * 不需要记录信息(日志)的异常类列表
+     * @var array
+     */
+    protected $ignoreReport = [
+        HttpException::class,
+        HttpResponseException::class,
+        ModelNotFoundException::class,
+        DataNotFoundException::class,
+        ValidateException::class,
+    ];
+
+    /**
+     * 记录异常信息(包括日志或者其它方式记录)
+     *
+     * @access public
+     * @param  Throwable $exception
+     * @return void
+     */
+    public function report(Throwable $exception): void
+    {
+        // 使用内置的方式记录异常日志
+        parent::report($exception);
+    }
+
+    /**
+     * Render an exception into an HTTP response.
+     *
+     * @access public
+     * @param \think\Request   $request
+     * @param Throwable $e
+     * @return Response
+     */
+    public function render($request, Throwable $e): Response
+    {
+        // 添加自定义异常处理机制
+
+        // 其他错误交给系统处理
+        return parent::render($request, $e);
+    }
+}

+ 8 - 0
app/Request.php

@@ -0,0 +1,8 @@
+<?php
+namespace app;
+
+// 应用请求对象类
+class Request extends \think\Request
+{
+
+}

+ 2 - 0
app/common.php

@@ -0,0 +1,2 @@
+<?php
+// 应用公共文件

+ 17 - 0
app/controller/Index.php

@@ -0,0 +1,17 @@
+<?php
+namespace app\controller;
+
+use app\BaseController;
+
+class Index extends BaseController
+{
+    public function index()
+    {
+        return '<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} a{color:#2E5CD5;cursor: pointer;text-decoration: none} a:hover{text-decoration:underline; } body{ background: #fff; font-family: "Century Gothic","Microsoft yahei"; color: #333;font-size:18px;} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.6em; font-size: 42px }</style><div style="padding: 24px 48px;"> <h1>:) </h1><p> ThinkPHP V' . \think\facade\App::version() . '<br/><span style="font-size:30px;">14载初心不改 - 你值得信赖的PHP框架</span></p><span style="font-size:25px;">[ V6.0 版本由 <a href="https://www.yisu.com/" target="yisu">亿速云</a> 独家赞助发布 ]</span></div><script type="text/javascript" src="https://tajs.qq.com/stats?sId=64890268" charset="UTF-8"></script><script type="text/javascript" src="https://e.topthink.com/Public/static/client.js"></script><think id="ee9b1aa918103c4fc"></think>';
+    }
+
+    public function hello($name = 'ThinkPHP6')
+    {
+        return 'hello,' . $name;
+    }
+}

+ 17 - 0
app/event.php

@@ -0,0 +1,17 @@
+<?php
+// 事件定义文件
+return [
+    'bind'      => [
+    ],
+
+    'listen'    => [
+        'AppInit'  => [],
+        'HttpRun'  => [],
+        'HttpEnd'  => [],
+        'LogLevel' => [],
+        'LogWrite' => [],
+    ],
+
+    'subscribe' => [
+    ],
+];

+ 10 - 0
app/middleware.php

@@ -0,0 +1,10 @@
+<?php
+// 全局中间件定义文件
+return [
+    // 全局请求缓存
+    // \think\middleware\CheckRequestCache::class,
+    // 多语言加载
+    // \think\middleware\LoadLangPack::class,
+    // Session初始化
+    // \think\middleware\SessionInit::class
+];

+ 9 - 0
app/provider.php

@@ -0,0 +1,9 @@
+<?php
+use app\ExceptionHandle;
+use app\Request;
+
+// 容器Provider定义文件
+return [
+    'think\Request'          => Request::class,
+    'think\exception\Handle' => ExceptionHandle::class,
+];

+ 9 - 0
app/service.php

@@ -0,0 +1,9 @@
+<?php
+
+use app\AppService;
+
+// 系统服务定义文件
+// 服务在完成全局初始化之后执行
+return [
+    AppService::class,
+];

+ 57 - 0
composer.json

@@ -0,0 +1,57 @@
+{
+    "name": "topthink/think",
+    "description": "the new thinkphp framework",
+    "type": "project",
+    "keywords": [
+        "framework",
+        "thinkphp",
+        "ORM"
+    ],
+    "homepage": "http://thinkphp.cn/",
+    "license": "Apache-2.0",
+    "authors": [
+        {
+            "name": "liu21st",
+            "email": "liu21st@gmail.com"
+        },
+        {
+            "name": "yunwuxin",
+            "email": "448901948@qq.com"
+        }        
+    ],
+    "require": {
+        "php": ">=7.1.0",
+        "topthink/framework": "^6.0.0",
+        "topthink/think-orm": "^2.0",
+        "firebase/php-jwt": "^5.4",
+        "overtrue/wechat": "^5.7",
+        "qiniu/php-sdk": "^7.4",
+        "topthink/think-queue": "^3.0",
+        "xaboy/form-builder": "^2.0",
+        "phpoffice/phpexcel": "^1.8",
+        "endroid/qr-code": "^4.3",
+        "aliyuncs/oss-sdk-php": "^2.4"
+    },
+    "require-dev": {
+        "symfony/var-dumper": "^4.2",
+        "topthink/think-trace":"^1.0"
+    },
+    "autoload": {
+        "psr-4": {
+            "app\\": "app",
+            "ln\\": "ln"
+        },
+        "psr-0": {
+            "": "extend/"
+        }
+    },
+    "config": {
+        "preferred-install": "dist"
+    },
+    "scripts": {
+        "post-autoload-dump": [
+            "@php think service:discover",
+            "@php think vendor:publish"
+        ]
+    }
+}

+ 3919 - 0
composer.lock

@@ -0,0 +1,3919 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "7bdd1cd4c7b54a82528656dcdd995a0a",
+    "packages": [
+        {
+            "name": "aliyuncs/oss-sdk-php",
+            "version": "v2.4.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/aliyun/aliyun-oss-php-sdk.git",
+                "reference": "4ccead614915ee6685bf30016afb01aabd347e46"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/aliyun/aliyun-oss-php-sdk/zipball/4ccead614915ee6685bf30016afb01aabd347e46",
+                "reference": "4ccead614915ee6685bf30016afb01aabd347e46",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "*",
+                "satooshi/php-coveralls": "*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "OSS\\": "src/OSS"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Aliyuncs",
+                    "homepage": "http://www.aliyun.com"
+                }
+            ],
+            "description": "Aliyun OSS SDK for PHP",
+            "homepage": "http://www.aliyun.com/product/oss/",
+            "support": {
+                "issues": "https://github.com/aliyun/aliyun-oss-php-sdk/issues",
+                "source": "https://github.com/aliyun/aliyun-oss-php-sdk/tree/v2.4.3"
+            },
+            "time": "2021-08-25T13:03:58+00:00"
+        },
+        {
+            "name": "bacon/bacon-qr-code",
+            "version": "2.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Bacon/BaconQrCode.git",
+                "reference": "f73543ac4e1def05f1a70bcd1525c8a157a1ad09"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/f73543ac4e1def05f1a70bcd1525c8a157a1ad09",
+                "reference": "f73543ac4e1def05f1a70bcd1525c8a157a1ad09",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "dasprid/enum": "^1.0.3",
+                "ext-iconv": "*",
+                "php": "^7.1 || ^8.0"
+            },
+            "require-dev": {
+                "phly/keep-a-changelog": "^1.4",
+                "phpunit/phpunit": "^7 | ^8 | ^9",
+                "squizlabs/php_codesniffer": "^3.4"
+            },
+            "suggest": {
+                "ext-imagick": "to generate QR code images"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "BaconQrCode\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-2-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Ben Scholzen 'DASPRiD'",
+                    "email": "mail@dasprids.de",
+                    "homepage": "https://dasprids.de/",
+                    "role": "Developer"
+                }
+            ],
+            "description": "BaconQrCode is a QR code generator for PHP.",
+            "homepage": "https://github.com/Bacon/BaconQrCode",
+            "support": {
+                "issues": "https://github.com/Bacon/BaconQrCode/issues",
+                "source": "https://github.com/Bacon/BaconQrCode/tree/2.0.4"
+            },
+            "time": "2021-06-18T13:26:35+00:00"
+        },
+        {
+            "name": "dasprid/enum",
+            "version": "1.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/DASPRiD/Enum.git",
+                "reference": "5abf82f213618696dda8e3bf6f64dd042d8542b2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/5abf82f213618696dda8e3bf6f64dd042d8542b2",
+                "reference": "5abf82f213618696dda8e3bf6f64dd042d8542b2",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^7 | ^8 | ^9",
+                "squizlabs/php_codesniffer": "^3.4"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "DASPRiD\\Enum\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-2-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Ben Scholzen 'DASPRiD'",
+                    "email": "mail@dasprids.de",
+                    "homepage": "https://dasprids.de/",
+                    "role": "Developer"
+                }
+            ],
+            "description": "PHP 7.1 enum implementation",
+            "keywords": [
+                "enum",
+                "map"
+            ],
+            "support": {
+                "issues": "https://github.com/DASPRiD/Enum/issues",
+                "source": "https://github.com/DASPRiD/Enum/tree/1.0.3"
+            },
+            "time": "2020-10-02T16:03:48+00:00"
+        },
+        {
+            "name": "doctrine/annotations",
+            "version": "1.13.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/annotations.git",
+                "reference": "5b668aef16090008790395c02c893b1ba13f7e08"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/annotations/zipball/5b668aef16090008790395c02c893b1ba13f7e08",
+                "reference": "5b668aef16090008790395c02c893b1ba13f7e08",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "doctrine/lexer": "1.*",
+                "ext-tokenizer": "*",
+                "php": "^7.1 || ^8.0",
+                "psr/cache": "^1 || ^2 || ^3"
+            },
+            "require-dev": {
+                "doctrine/cache": "^1.11 || ^2.0",
+                "doctrine/coding-standard": "^6.0 || ^8.1",
+                "phpstan/phpstan": "^0.12.20",
+                "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5",
+                "symfony/cache": "^4.4 || ^5.2"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Guilherme Blanco",
+                    "email": "guilhermeblanco@gmail.com"
+                },
+                {
+                    "name": "Roman Borschel",
+                    "email": "roman@code-factory.org"
+                },
+                {
+                    "name": "Benjamin Eberlei",
+                    "email": "kontakt@beberlei.de"
+                },
+                {
+                    "name": "Jonathan Wage",
+                    "email": "jonwage@gmail.com"
+                },
+                {
+                    "name": "Johannes Schmitt",
+                    "email": "schmittjoh@gmail.com"
+                }
+            ],
+            "description": "Docblock Annotations Parser",
+            "homepage": "https://www.doctrine-project.org/projects/annotations.html",
+            "keywords": [
+                "annotations",
+                "docblock",
+                "parser"
+            ],
+            "support": {
+                "issues": "https://github.com/doctrine/annotations/issues",
+                "source": "https://github.com/doctrine/annotations/tree/1.13.2"
+            },
+            "time": "2021-08-05T19:00:23+00:00"
+        },
+        {
+            "name": "doctrine/lexer",
+            "version": "1.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/lexer.git",
+                "reference": "e864bbf5904cb8f5bb334f99209b48018522f042"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042",
+                "reference": "e864bbf5904cb8f5bb334f99209b48018522f042",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.2 || ^8.0"
+            },
+            "require-dev": {
+                "doctrine/coding-standard": "^6.0",
+                "phpstan/phpstan": "^0.11.8",
+                "phpunit/phpunit": "^8.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.2.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Guilherme Blanco",
+                    "email": "guilhermeblanco@gmail.com"
+                },
+                {
+                    "name": "Roman Borschel",
+                    "email": "roman@code-factory.org"
+                },
+                {
+                    "name": "Johannes Schmitt",
+                    "email": "schmittjoh@gmail.com"
+                }
+            ],
+            "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.",
+            "homepage": "https://www.doctrine-project.org/projects/lexer.html",
+            "keywords": [
+                "annotations",
+                "docblock",
+                "lexer",
+                "parser",
+                "php"
+            ],
+            "support": {
+                "issues": "https://github.com/doctrine/lexer/issues",
+                "source": "https://github.com/doctrine/lexer/tree/1.2.1"
+            },
+            "funding": [
+                {
+                    "url": "https://www.doctrine-project.org/sponsorship.html",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://www.patreon.com/phpdoctrine",
+                    "type": "patreon"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-05-25T17:44:05+00:00"
+        },
+        {
+            "name": "easywechat-composer/easywechat-composer",
+            "version": "1.4.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/mingyoung/easywechat-composer.git",
+                "reference": "3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/mingyoung/easywechat-composer/zipball/3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd",
+                "reference": "3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "composer-plugin-api": "^1.0 || ^2.0",
+                "php": ">=7.0"
+            },
+            "require-dev": {
+                "composer/composer": "^1.0 || ^2.0",
+                "phpunit/phpunit": "^6.5 || ^7.0"
+            },
+            "type": "composer-plugin",
+            "extra": {
+                "class": "EasyWeChatComposer\\Plugin"
+            },
+            "autoload": {
+                "psr-4": {
+                    "EasyWeChatComposer\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "张铭阳",
+                    "email": "mingyoungcheung@gmail.com"
+                }
+            ],
+            "description": "The composer plugin for EasyWeChat",
+            "support": {
+                "issues": "https://github.com/mingyoung/easywechat-composer/issues",
+                "source": "https://github.com/mingyoung/easywechat-composer/tree/1.4.1"
+            },
+            "time": "2021-07-05T04:03:22+00:00"
+        },
+        {
+            "name": "endroid/qr-code",
+            "version": "4.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/endroid/qr-code.git",
+                "reference": "98f6d4024289ad3a8d7f3e63cab947ef6929dcdb"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/endroid/qr-code/zipball/98f6d4024289ad3a8d7f3e63cab947ef6929dcdb",
+                "reference": "98f6d4024289ad3a8d7f3e63cab947ef6929dcdb",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "bacon/bacon-qr-code": "^2.0",
+                "php": "^7.3||^8.0"
+            },
+            "require-dev": {
+                "endroid/quality": "dev-master",
+                "ext-gd": "*",
+                "khanamiryan/qrcode-detector-decoder": "^1.0.4",
+                "setasign/fpdf": "^1.8.2"
+            },
+            "suggest": {
+                "ext-gd": "Enables you to write PNG images",
+                "khanamiryan/qrcode-detector-decoder": "Enables you to use the image validator",
+                "roave/security-advisories": "Makes sure package versions with known security issues are not installed",
+                "setasign/fpdf": "Enables you to use the PDF writer"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Endroid\\QrCode\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jeroen van den Enden",
+                    "email": "info@endroid.nl"
+                }
+            ],
+            "description": "Endroid QR Code",
+            "homepage": "https://github.com/endroid/qr-code",
+            "keywords": [
+                "code",
+                "endroid",
+                "php",
+                "qr",
+                "qrcode"
+            ],
+            "support": {
+                "issues": "https://github.com/endroid/qr-code/issues",
+                "source": "https://github.com/endroid/qr-code/tree/4.3.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/endroid",
+                    "type": "github"
+                }
+            ],
+            "time": "2021-08-28T12:29:40+00:00"
+        },
+        {
+            "name": "firebase/php-jwt",
+            "version": "v5.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/firebase/php-jwt.git",
+                "reference": "d2113d9b2e0e349796e72d2a63cf9319100382d2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/firebase/php-jwt/zipball/d2113d9b2e0e349796e72d2a63cf9319100382d2",
+                "reference": "d2113d9b2e0e349796e72d2a63cf9319100382d2",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": ">=4.8 <=9"
+            },
+            "suggest": {
+                "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Firebase\\JWT\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Neuman Vong",
+                    "email": "neuman+pear@twilio.com",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Anant Narayanan",
+                    "email": "anant@php.net",
+                    "role": "Developer"
+                }
+            ],
+            "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
+            "homepage": "https://github.com/firebase/php-jwt",
+            "keywords": [
+                "jwt",
+                "php"
+            ],
+            "support": {
+                "issues": "https://github.com/firebase/php-jwt/issues",
+                "source": "https://github.com/firebase/php-jwt/tree/v5.4.0"
+            },
+            "time": "2021-06-23T19:00:23+00:00"
+        },
+        {
+            "name": "guzzlehttp/guzzle",
+            "version": "7.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/guzzle.git",
+                "reference": "7008573787b430c1c1f650e3722d9bba59967628"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7008573787b430c1c1f650e3722d9bba59967628",
+                "reference": "7008573787b430c1c1f650e3722d9bba59967628",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "guzzlehttp/promises": "^1.4",
+                "guzzlehttp/psr7": "^1.7 || ^2.0",
+                "php": "^7.2.5 || ^8.0",
+                "psr/http-client": "^1.0"
+            },
+            "provide": {
+                "psr/http-client-implementation": "1.0"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.4.1",
+                "ext-curl": "*",
+                "php-http/client-integration-tests": "^3.0",
+                "phpunit/phpunit": "^8.5.5 || ^9.3.5",
+                "psr/log": "^1.1"
+            },
+            "suggest": {
+                "ext-curl": "Required for CURL handler support",
+                "ext-intl": "Required for Internationalized Domain Name (IDN) support",
+                "psr/log": "Required for using the Log middleware"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "7.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\": "src/"
+                },
+                "files": [
+                    "src/functions_include.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com",
+                    "homepage": "https://sagikazarmark.hu"
+                }
+            ],
+            "description": "Guzzle is a PHP HTTP client library",
+            "homepage": "http://guzzlephp.org/",
+            "keywords": [
+                "client",
+                "curl",
+                "framework",
+                "http",
+                "http client",
+                "psr-18",
+                "psr-7",
+                "rest",
+                "web service"
+            ],
+            "support": {
+                "issues": "https://github.com/guzzle/guzzle/issues",
+                "source": "https://github.com/guzzle/guzzle/tree/7.3.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/GrahamCampbell",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/Nyholm",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/alexeyshockov",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/gmponos",
+                    "type": "github"
+                }
+            ],
+            "time": "2021-03-23T11:33:13+00:00"
+        },
+        {
+            "name": "guzzlehttp/promises",
+            "version": "1.4.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/promises.git",
+                "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/promises/zipball/8e7d04f1f6450fef59366c399cfad4b9383aa30d",
+                "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.5"
+            },
+            "require-dev": {
+                "symfony/phpunit-bridge": "^4.4 || ^5.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Promise\\": "src/"
+                },
+                "files": [
+                    "src/functions_include.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                }
+            ],
+            "description": "Guzzle promises library",
+            "keywords": [
+                "promise"
+            ],
+            "support": {
+                "issues": "https://github.com/guzzle/promises/issues",
+                "source": "https://github.com/guzzle/promises/tree/1.4.1"
+            },
+            "time": "2021-03-07T09:25:29+00:00"
+        },
+        {
+            "name": "guzzlehttp/psr7",
+            "version": "2.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/psr7.git",
+                "reference": "1dc8d9cba3897165e16d12bb13d813afb1eb3fe7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/psr7/zipball/1dc8d9cba3897165e16d12bb13d813afb1eb3fe7",
+                "reference": "1dc8d9cba3897165e16d12bb13d813afb1eb3fe7",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.2.5 || ^8.0",
+                "psr/http-factory": "^1.0",
+                "psr/http-message": "^1.0",
+                "ralouphie/getallheaders": "^3.0"
+            },
+            "provide": {
+                "psr/http-factory-implementation": "1.0",
+                "psr/http-message-implementation": "1.0"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.4.1",
+                "http-interop/http-factory-tests": "^0.9",
+                "phpunit/phpunit": "^8.5.8 || ^9.3.10"
+            },
+            "suggest": {
+                "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Psr7\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "Tobias Schultze",
+                    "homepage": "https://github.com/Tobion"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com",
+                    "homepage": "https://sagikazarmark.hu"
+                }
+            ],
+            "description": "PSR-7 message implementation that also provides common utility methods",
+            "keywords": [
+                "http",
+                "message",
+                "psr-7",
+                "request",
+                "response",
+                "stream",
+                "uri",
+                "url"
+            ],
+            "support": {
+                "issues": "https://github.com/guzzle/psr7/issues",
+                "source": "https://github.com/guzzle/psr7/tree/2.0.0"
+            },
+            "time": "2021-06-30T20:03:07+00:00"
+        },
+        {
+            "name": "league/flysystem",
+            "version": "1.1.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/thephpleague/flysystem.git",
+                "reference": "18634df356bfd4119fe3d6156bdb990c414c14ea"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/18634df356bfd4119fe3d6156bdb990c414c14ea",
+                "reference": "18634df356bfd4119fe3d6156bdb990c414c14ea",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-fileinfo": "*",
+                "league/mime-type-detection": "^1.3",
+                "php": "^7.2.5 || ^8.0"
+            },
+            "conflict": {
+                "league/flysystem-sftp": "<1.0.6"
+            },
+            "require-dev": {
+                "phpspec/prophecy": "^1.11.1",
+                "phpunit/phpunit": "^8.5.8"
+            },
+            "suggest": {
+                "ext-ftp": "Allows you to use FTP server storage",
+                "ext-openssl": "Allows you to use FTPS server storage",
+                "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2",
+                "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3",
+                "league/flysystem-azure": "Allows you to use Windows Azure Blob storage",
+                "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching",
+                "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem",
+                "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files",
+                "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib",
+                "league/flysystem-webdav": "Allows you to use WebDAV storage",
+                "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter",
+                "spatie/flysystem-dropbox": "Allows you to use Dropbox storage",
+                "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "League\\Flysystem\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Frank de Jonge",
+                    "email": "info@frenky.net"
+                }
+            ],
+            "description": "Filesystem abstraction: Many filesystems, one API.",
+            "keywords": [
+                "Cloud Files",
+                "WebDAV",
+                "abstraction",
+                "aws",
+                "cloud",
+                "copy.com",
+                "dropbox",
+                "file systems",
+                "files",
+                "filesystem",
+                "filesystems",
+                "ftp",
+                "rackspace",
+                "remote",
+                "s3",
+                "sftp",
+                "storage"
+            ],
+            "support": {
+                "issues": "https://github.com/thephpleague/flysystem/issues",
+                "source": "https://github.com/thephpleague/flysystem/tree/1.1.5"
+            },
+            "funding": [
+                {
+                    "url": "https://offset.earth/frankdejonge",
+                    "type": "other"
+                }
+            ],
+            "time": "2021-08-17T13:49:42+00:00"
+        },
+        {
+            "name": "league/flysystem-cached-adapter",
+            "version": "1.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/thephpleague/flysystem-cached-adapter.git",
+                "reference": "d1925efb2207ac4be3ad0c40b8277175f99ffaff"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/thephpleague/flysystem-cached-adapter/zipball/d1925efb2207ac4be3ad0c40b8277175f99ffaff",
+                "reference": "d1925efb2207ac4be3ad0c40b8277175f99ffaff",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "league/flysystem": "~1.0",
+                "psr/cache": "^1.0.0"
+            },
+            "require-dev": {
+                "mockery/mockery": "~0.9",
+                "phpspec/phpspec": "^3.4",
+                "phpunit/phpunit": "^5.7",
+                "predis/predis": "~1.0",
+                "tedivm/stash": "~0.12"
+            },
+            "suggest": {
+                "ext-phpredis": "Pure C implemented extension for PHP"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "League\\Flysystem\\Cached\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "frankdejonge",
+                    "email": "info@frenky.net"
+                }
+            ],
+            "description": "An adapter decorator to enable meta-data caching.",
+            "support": {
+                "issues": "https://github.com/thephpleague/flysystem-cached-adapter/issues",
+                "source": "https://github.com/thephpleague/flysystem-cached-adapter/tree/master"
+            },
+            "time": "2020-07-25T15:56:04+00:00"
+        },
+        {
+            "name": "league/mime-type-detection",
+            "version": "1.7.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/thephpleague/mime-type-detection.git",
+                "reference": "3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3",
+                "reference": "3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-fileinfo": "*",
+                "php": "^7.2 || ^8.0"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^2.18",
+                "phpstan/phpstan": "^0.12.68",
+                "phpunit/phpunit": "^8.5.8 || ^9.3"
+            },
+            "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.7.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/frankdejonge",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/league/flysystem",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2021-01-18T20:58:21+00:00"
+        },
+        {
+            "name": "monolog/monolog",
+            "version": "2.3.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Seldaek/monolog.git",
+                "reference": "71312564759a7db5b789296369c1a264efc43aad"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Seldaek/monolog/zipball/71312564759a7db5b789296369c1a264efc43aad",
+                "reference": "71312564759a7db5b789296369c1a264efc43aad",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2",
+                "psr/log": "^1.0.1"
+            },
+            "provide": {
+                "psr/log-implementation": "1.0.0"
+            },
+            "require-dev": {
+                "aws/aws-sdk-php": "^2.4.9 || ^3.0",
+                "doctrine/couchdb": "~1.0@dev",
+                "elasticsearch/elasticsearch": "^7",
+                "graylog2/gelf-php": "^1.4.2",
+                "mongodb/mongodb": "^1.8",
+                "php-amqplib/php-amqplib": "~2.4",
+                "php-console/php-console": "^3.1.3",
+                "phpspec/prophecy": "^1.6.1",
+                "phpstan/phpstan": "^0.12.91",
+                "phpunit/phpunit": "^8.5",
+                "predis/predis": "^1.1",
+                "rollbar/rollbar": "^1.3",
+                "ruflin/elastica": ">=0.90 <7.0.1",
+                "swiftmailer/swiftmailer": "^5.3|^6.0"
+            },
+            "suggest": {
+                "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
+                "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
+                "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client",
+                "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
+                "ext-mbstring": "Allow to work properly with unicode symbols",
+                "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)",
+                "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
+                "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
+                "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
+                "php-console/php-console": "Allow sending log messages to Google Chrome",
+                "rollbar/rollbar": "Allow sending log messages to Rollbar",
+                "ruflin/elastica": "Allow sending log messages to an Elastic Search server"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "2.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Monolog\\": "src/Monolog"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "https://seld.be"
+                }
+            ],
+            "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
+            "homepage": "https://github.com/Seldaek/monolog",
+            "keywords": [
+                "log",
+                "logging",
+                "psr-3"
+            ],
+            "support": {
+                "issues": "https://github.com/Seldaek/monolog/issues",
+                "source": "https://github.com/Seldaek/monolog/tree/2.3.2"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/Seldaek",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2021-07-23T07:42:52+00:00"
+        },
+        {
+            "name": "nesbot/carbon",
+            "version": "2.53.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/briannesbitt/Carbon.git",
+                "reference": "f4655858a784988f880c1b8c7feabbf02dfdf045"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/f4655858a784988f880c1b8c7feabbf02dfdf045",
+                "reference": "f4655858a784988f880c1b8c7feabbf02dfdf045",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "php": "^7.1.8 || ^8.0",
+                "symfony/polyfill-mbstring": "^1.0",
+                "symfony/polyfill-php80": "^1.16",
+                "symfony/translation": "^3.4 || ^4.0 || ^5.0"
+            },
+            "require-dev": {
+                "doctrine/orm": "^2.7",
+                "friendsofphp/php-cs-fixer": "^3.0",
+                "kylekatarnls/multi-tester": "^2.0",
+                "phpmd/phpmd": "^2.9",
+                "phpstan/extension-installer": "^1.0",
+                "phpstan/phpstan": "^0.12.54",
+                "phpunit/phpunit": "^7.5.20 || ^8.5.14",
+                "squizlabs/php_codesniffer": "^3.4"
+            },
+            "bin": [
+                "bin/carbon"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-3.x": "3.x-dev",
+                    "dev-master": "2.x-dev"
+                },
+                "laravel": {
+                    "providers": [
+                        "Carbon\\Laravel\\ServiceProvider"
+                    ]
+                },
+                "phpstan": {
+                    "includes": [
+                        "extension.neon"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Carbon\\": "src/Carbon/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Brian Nesbitt",
+                    "email": "brian@nesbot.com",
+                    "homepage": "https://markido.com"
+                },
+                {
+                    "name": "kylekatarnls",
+                    "homepage": "https://github.com/kylekatarnls"
+                }
+            ],
+            "description": "An API extension for DateTime that supports 281 different languages.",
+            "homepage": "https://carbon.nesbot.com",
+            "keywords": [
+                "date",
+                "datetime",
+                "time"
+            ],
+            "support": {
+                "issues": "https://github.com/briannesbitt/Carbon/issues",
+                "source": "https://github.com/briannesbitt/Carbon"
+            },
+            "funding": [
+                {
+                    "url": "https://opencollective.com/Carbon",
+                    "type": "open_collective"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2021-09-06T09:29:23+00:00"
+        },
+        {
+            "name": "overtrue/socialite",
+            "version": "3.2.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/overtrue/socialite.git",
+                "reference": "7605f4370a92ea4811cc5016d4709ef3d545f51c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/overtrue/socialite/zipball/7605f4370a92ea4811cc5016d4709ef3d545f51c",
+                "reference": "7605f4370a92ea4811cc5016d4709ef3d545f51c",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "ext-openssl": "*",
+                "guzzlehttp/guzzle": "~6.0|~7.0",
+                "php": ">=7.4",
+                "symfony/http-foundation": "^5.0",
+                "symfony/psr-http-message-bridge": "^2.0"
+            },
+            "require-dev": {
+                "mockery/mockery": "~1.2",
+                "phpunit/phpunit": "~9.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Overtrue\\Socialite\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "overtrue",
+                    "email": "anzhengchao@gmail.com"
+                }
+            ],
+            "description": "A collection of OAuth 2 packages.",
+            "keywords": [
+                "Feishu",
+                "login",
+                "oauth",
+                "qcloud",
+                "qq",
+                "social",
+                "wechat",
+                "weibo"
+            ],
+            "support": {
+                "issues": "https://github.com/overtrue/socialite/issues",
+                "source": "https://github.com/overtrue/socialite/tree/3.2.4"
+            },
+            "funding": [
+                {
+                    "url": "https://www.patreon.com/overtrue",
+                    "type": "patreon"
+                }
+            ],
+            "time": "2021-08-31T07:32:54+00:00"
+        },
+        {
+            "name": "overtrue/wechat",
+            "version": "5.7.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/w7corp/easywechat.git",
+                "reference": "d57d2104fe705511374ae3627b0d9b7a761d87b9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/w7corp/easywechat/zipball/d57d2104fe705511374ae3627b0d9b7a761d87b9",
+                "reference": "d57d2104fe705511374ae3627b0d9b7a761d87b9",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "easywechat-composer/easywechat-composer": "^1.1",
+                "ext-fileinfo": "*",
+                "ext-libxml": "*",
+                "ext-openssl": "*",
+                "ext-simplexml": "*",
+                "guzzlehttp/guzzle": "^6.2 || ^7.0",
+                "monolog/monolog": "^1.22 || ^2.0",
+                "overtrue/socialite": "^3.2",
+                "php": ">=7.4",
+                "pimple/pimple": "^3.0",
+                "psr/simple-cache": "^1.0",
+                "symfony/cache": "^3.3 || ^4.3 || ^5.0",
+                "symfony/event-dispatcher": "^4.3 || ^5.0",
+                "symfony/http-foundation": "^2.7 || ^3.0 || ^4.0 || ^5.0",
+                "symfony/psr-http-message-bridge": "^0.3 || ^1.0 || ^2.0"
+            },
+            "require-dev": {
+                "brainmaestro/composer-git-hooks": "^2.7",
+                "dms/phpunit-arraysubset-asserts": "^0.2.0",
+                "friendsofphp/php-cs-fixer": "^2.15",
+                "mikey179/vfsstream": "^1.6",
+                "mockery/mockery": "^1.2.3",
+                "phpstan/phpstan": "^0.12.0",
+                "phpunit/phpunit": "^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "hooks": {
+                    "pre-commit": [
+                        "composer test",
+                        "composer fix-style"
+                    ],
+                    "pre-push": [
+                        "composer test",
+                        "composer fix-style"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "EasyWeChat\\": "src/"
+                },
+                "files": [
+                    "src/Kernel/Support/Helpers.php",
+                    "src/Kernel/Helpers.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "overtrue",
+                    "email": "anzhengchao@gmail.com"
+                }
+            ],
+            "description": "微信SDK",
+            "keywords": [
+                "easywechat",
+                "sdk",
+                "wechat",
+                "weixin",
+                "weixin-sdk"
+            ],
+            "support": {
+                "issues": "https://github.com/w7corp/easywechat/issues",
+                "source": "https://github.com/w7corp/easywechat/tree/5.7.2"
+            },
+            "funding": [
+                {
+                    "url": "https://www.easywechat.com/img/pay/wechat.jpg",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/overtrue",
+                    "type": "github"
+                },
+                {
+                    "url": "https://www.patreon.com/overtrue",
+                    "type": "patreon"
+                }
+            ],
+            "time": "2021-09-06T10:39:11+00:00"
+        },
+        {
+            "name": "phpoffice/phpexcel",
+            "version": "1.8.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/PHPOffice/PHPExcel.git",
+                "reference": "372c7cbb695a6f6f1e62649381aeaa37e7e70b32"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/PHPOffice/PHPExcel/zipball/372c7cbb695a6f6f1e62649381aeaa37e7e70b32",
+                "reference": "372c7cbb695a6f6f1e62649381aeaa37e7e70b32",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-xml": "*",
+                "ext-xmlwriter": "*",
+                "php": ">=5.2.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-0": {
+                    "PHPExcel": "Classes/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "LGPL"
+            ],
+            "authors": [
+                {
+                    "name": "Maarten Balliauw",
+                    "homepage": "http://blog.maartenballiauw.be"
+                },
+                {
+                    "name": "Mark Baker"
+                },
+                {
+                    "name": "Franck Lefevre",
+                    "homepage": "http://blog.rootslabs.net"
+                },
+                {
+                    "name": "Erik Tilt"
+                }
+            ],
+            "description": "PHPExcel - OpenXML - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine",
+            "homepage": "http://phpexcel.codeplex.com",
+            "keywords": [
+                "OpenXML",
+                "excel",
+                "php",
+                "spreadsheet",
+                "xls",
+                "xlsx"
+            ],
+            "support": {
+                "issues": "https://github.com/PHPOffice/PHPExcel/issues",
+                "source": "https://github.com/PHPOffice/PHPExcel/tree/master"
+            },
+            "abandoned": "phpoffice/phpspreadsheet",
+            "time": "2015-05-01T07:00:55+00:00"
+        },
+        {
+            "name": "pimple/pimple",
+            "version": "v3.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/silexphp/Pimple.git",
+                "reference": "86406047271859ffc13424a048541f4531f53601"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/silexphp/Pimple/zipball/86406047271859ffc13424a048541f4531f53601",
+                "reference": "86406047271859ffc13424a048541f4531f53601",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "psr/container": "^1.1"
+            },
+            "require-dev": {
+                "symfony/phpunit-bridge": "^5.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.4.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Pimple": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Pimple, a simple Dependency Injection Container",
+            "homepage": "https://pimple.symfony.com",
+            "keywords": [
+                "container",
+                "dependency injection"
+            ],
+            "support": {
+                "source": "https://github.com/silexphp/Pimple/tree/v3.4.0"
+            },
+            "time": "2021-03-06T08:28:00+00:00"
+        },
+        {
+            "name": "psr/cache",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/cache.git",
+                "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
+                "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Cache\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for caching libraries",
+            "keywords": [
+                "cache",
+                "psr",
+                "psr-6"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/cache/tree/master"
+            },
+            "time": "2016-08-06T20:24:11+00:00"
+        },
+        {
+            "name": "psr/container",
+            "version": "1.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/container.git",
+                "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf",
+                "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Container\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common Container Interface (PHP FIG PSR-11)",
+            "homepage": "https://github.com/php-fig/container",
+            "keywords": [
+                "PSR-11",
+                "container",
+                "container-interface",
+                "container-interop",
+                "psr"
+            ],
+            "support": {
+                "issues": "https://github.com/php-fig/container/issues",
+                "source": "https://github.com/php-fig/container/tree/1.1.1"
+            },
+            "time": "2021-03-05T17:36:06+00:00"
+        },
+        {
+            "name": "psr/event-dispatcher",
+            "version": "1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/event-dispatcher.git",
+                "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
+                "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\EventDispatcher\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Standard interfaces for event handling.",
+            "keywords": [
+                "events",
+                "psr",
+                "psr-14"
+            ],
+            "support": {
+                "issues": "https://github.com/php-fig/event-dispatcher/issues",
+                "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
+            },
+            "time": "2019-01-08T18:20:26+00:00"
+        },
+        {
+            "name": "psr/http-client",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-client.git",
+                "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
+                "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.0 || ^8.0",
+                "psr/http-message": "^1.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Client\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for HTTP clients",
+            "homepage": "https://github.com/php-fig/http-client",
+            "keywords": [
+                "http",
+                "http-client",
+                "psr",
+                "psr-18"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/http-client/tree/master"
+            },
+            "time": "2020-06-29T06:28:15+00:00"
+        },
+        {
+            "name": "psr/http-factory",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-factory.git",
+                "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
+                "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.0.0",
+                "psr/http-message": "^1.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Message\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interfaces for PSR-7 HTTP message factories",
+            "keywords": [
+                "factory",
+                "http",
+                "message",
+                "psr",
+                "psr-17",
+                "psr-7",
+                "request",
+                "response"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/http-factory/tree/master"
+            },
+            "time": "2019-04-30T12:38:16+00:00"
+        },
+        {
+            "name": "psr/http-message",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-message.git",
+                "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+                "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Message\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for HTTP messages",
+            "homepage": "https://github.com/php-fig/http-message",
+            "keywords": [
+                "http",
+                "http-message",
+                "psr",
+                "psr-7",
+                "request",
+                "response"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/http-message/tree/master"
+            },
+            "time": "2016-08-06T14:39:51+00:00"
+        },
+        {
+            "name": "psr/log",
+            "version": "1.1.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/log.git",
+                "reference": "d49695b909c3b7628b6289db5479a1c204601f11"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
+                "reference": "d49695b909c3b7628b6289db5479a1c204601f11",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Log\\": "Psr/Log/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for logging libraries",
+            "homepage": "https://github.com/php-fig/log",
+            "keywords": [
+                "log",
+                "psr",
+                "psr-3"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/log/tree/1.1.4"
+            },
+            "time": "2021-05-03T11:20:27+00:00"
+        },
+        {
+            "name": "psr/simple-cache",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/simple-cache.git",
+                "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+                "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\SimpleCache\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interfaces for simple caching",
+            "keywords": [
+                "cache",
+                "caching",
+                "psr",
+                "psr-16",
+                "simple-cache"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/simple-cache/tree/master"
+            },
+            "time": "2017-10-23T01:57:42+00:00"
+        },
+        {
+            "name": "qiniu/php-sdk",
+            "version": "v7.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/qiniu/php-sdk.git",
+                "reference": "1c6bc89166e524a40ee42bf516fb99ffc6401c82"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/qiniu/php-sdk/zipball/1c6bc89166e524a40ee42bf516fb99ffc6401c82",
+                "reference": "1c6bc89166e524a40ee42bf516fb99ffc6401c82",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0",
+                "squizlabs/php_codesniffer": "~3.6"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Qiniu\\": "src/Qiniu"
+                },
+                "files": [
+                    "src/Qiniu/functions.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Qiniu",
+                    "email": "sdk@qiniu.com",
+                    "homepage": "http://www.qiniu.com"
+                }
+            ],
+            "description": "Qiniu Resource (Cloud) Storage SDK for PHP",
+            "homepage": "http://developer.qiniu.com/",
+            "keywords": [
+                "cloud",
+                "qiniu",
+                "sdk",
+                "storage"
+            ],
+            "support": {
+                "issues": "https://github.com/qiniu/php-sdk/issues",
+                "source": "https://github.com/qiniu/php-sdk/tree/v7.4.0"
+            },
+            "time": "2021-07-19T07:41:36+00:00"
+        },
+        {
+            "name": "ralouphie/getallheaders",
+            "version": "3.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/ralouphie/getallheaders.git",
+                "reference": "120b605dfeb996808c31b6477290a714d356e822"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+                "reference": "120b605dfeb996808c31b6477290a714d356e822",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.6"
+            },
+            "require-dev": {
+                "php-coveralls/php-coveralls": "^2.1",
+                "phpunit/phpunit": "^5 || ^6.5"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/getallheaders.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ralph Khattar",
+                    "email": "ralph.khattar@gmail.com"
+                }
+            ],
+            "description": "A polyfill for getallheaders.",
+            "support": {
+                "issues": "https://github.com/ralouphie/getallheaders/issues",
+                "source": "https://github.com/ralouphie/getallheaders/tree/develop"
+            },
+            "time": "2019-03-08T08:55:37+00:00"
+        },
+        {
+            "name": "symfony/cache",
+            "version": "v5.3.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/cache.git",
+                "reference": "864867b13bd67347497ce956f4b253f8fe18b80c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/cache/zipball/864867b13bd67347497ce956f4b253f8fe18b80c",
+                "reference": "864867b13bd67347497ce956f4b253f8fe18b80c",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "psr/cache": "^1.0|^2.0",
+                "psr/log": "^1.1|^2|^3",
+                "symfony/cache-contracts": "^1.1.7|^2",
+                "symfony/deprecation-contracts": "^2.1",
+                "symfony/polyfill-php73": "^1.9",
+                "symfony/polyfill-php80": "^1.16",
+                "symfony/service-contracts": "^1.1|^2",
+                "symfony/var-exporter": "^4.4|^5.0"
+            },
+            "conflict": {
+                "doctrine/dbal": "<2.10",
+                "symfony/dependency-injection": "<4.4",
+                "symfony/http-kernel": "<4.4",
+                "symfony/var-dumper": "<4.4"
+            },
+            "provide": {
+                "psr/cache-implementation": "1.0|2.0",
+                "psr/simple-cache-implementation": "1.0",
+                "symfony/cache-implementation": "1.0|2.0"
+            },
+            "require-dev": {
+                "cache/integration-tests": "dev-master",
+                "doctrine/cache": "^1.6|^2.0",
+                "doctrine/dbal": "^2.10|^3.0",
+                "predis/predis": "^1.1",
+                "psr/simple-cache": "^1.0",
+                "symfony/config": "^4.4|^5.0",
+                "symfony/dependency-injection": "^4.4|^5.0",
+                "symfony/filesystem": "^4.4|^5.0",
+                "symfony/http-kernel": "^4.4|^5.0",
+                "symfony/messenger": "^4.4|^5.0",
+                "symfony/var-dumper": "^4.4|^5.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Cache\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "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": "Provides an extended PSR-6, PSR-16 (and tags) implementation",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "caching",
+                "psr6"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/cache/tree/v5.3.7"
+            },
+            "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": "2021-08-29T15:08:21+00:00"
+        },
+        {
+            "name": "symfony/cache-contracts",
+            "version": "v2.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/cache-contracts.git",
+                "reference": "c0446463729b89dd4fa62e9aeecc80287323615d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/c0446463729b89dd4fa62e9aeecc80287323615d",
+                "reference": "c0446463729b89dd4fa62e9aeecc80287323615d",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "psr/cache": "^1.0|^2.0|^3.0"
+            },
+            "suggest": {
+                "symfony/cache-implementation": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "2.4-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Contracts\\Cache\\": ""
+                }
+            },
+            "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": "Generic abstractions related to caching",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/cache-contracts/tree/v2.4.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": "2021-03-23T23:28:01+00:00"
+        },
+        {
+            "name": "symfony/deprecation-contracts",
+            "version": "v2.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/deprecation-contracts.git",
+                "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627",
+                "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "2.4-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "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/v2.4.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": "2021-03-23T23:28:01+00:00"
+        },
+        {
+            "name": "symfony/event-dispatcher",
+            "version": "v5.3.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/event-dispatcher.git",
+                "reference": "ce7b20d69c66a20939d8952b617506a44d102130"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ce7b20d69c66a20939d8952b617506a44d102130",
+                "reference": "ce7b20d69c66a20939d8952b617506a44d102130",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "symfony/deprecation-contracts": "^2.1",
+                "symfony/event-dispatcher-contracts": "^2",
+                "symfony/polyfill-php80": "^1.16"
+            },
+            "conflict": {
+                "symfony/dependency-injection": "<4.4"
+            },
+            "provide": {
+                "psr/event-dispatcher-implementation": "1.0",
+                "symfony/event-dispatcher-implementation": "2.0"
+            },
+            "require-dev": {
+                "psr/log": "^1|^2|^3",
+                "symfony/config": "^4.4|^5.0",
+                "symfony/dependency-injection": "^4.4|^5.0",
+                "symfony/error-handler": "^4.4|^5.0",
+                "symfony/expression-language": "^4.4|^5.0",
+                "symfony/http-foundation": "^4.4|^5.0",
+                "symfony/service-contracts": "^1.1|^2",
+                "symfony/stopwatch": "^4.4|^5.0"
+            },
+            "suggest": {
+                "symfony/dependency-injection": "",
+                "symfony/http-kernel": ""
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\EventDispatcher\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.7"
+            },
+            "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": "2021-08-04T21:20:46+00:00"
+        },
+        {
+            "name": "symfony/event-dispatcher-contracts",
+            "version": "v2.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/event-dispatcher-contracts.git",
+                "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/69fee1ad2332a7cbab3aca13591953da9cdb7a11",
+                "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "psr/event-dispatcher": "^1"
+            },
+            "suggest": {
+                "symfony/event-dispatcher-implementation": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "2.4-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Contracts\\EventDispatcher\\": ""
+                }
+            },
+            "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": "Generic abstractions related to dispatching event",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.4.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": "2021-03-23T23:28:01+00:00"
+        },
+        {
+            "name": "symfony/http-foundation",
+            "version": "v5.3.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/http-foundation.git",
+                "reference": "e36c8e5502b4f3f0190c675f1c1f1248a64f04e5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e36c8e5502b4f3f0190c675f1c1f1248a64f04e5",
+                "reference": "e36c8e5502b4f3f0190c675f1c1f1248a64f04e5",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "symfony/deprecation-contracts": "^2.1",
+                "symfony/polyfill-mbstring": "~1.1",
+                "symfony/polyfill-php80": "^1.16"
+            },
+            "require-dev": {
+                "predis/predis": "~1.0",
+                "symfony/cache": "^4.4|^5.0",
+                "symfony/expression-language": "^4.4|^5.0",
+                "symfony/mime": "^4.4|^5.0"
+            },
+            "suggest": {
+                "symfony/mime": "To use the file extension guesser"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\HttpFoundation\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Defines an object-oriented layer for the HTTP specification",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/http-foundation/tree/v5.3.7"
+            },
+            "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": "2021-08-27T11:20:35+00:00"
+        },
+        {
+            "name": "symfony/polyfill-mbstring",
+            "version": "v1.23.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-mbstring.git",
+                "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6",
+                "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "suggest": {
+                "ext-mbstring": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.23-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Mbstring\\": ""
+                },
+                "files": [
+                    "bootstrap.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": "Symfony polyfill for the Mbstring extension",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "mbstring",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1"
+            },
+            "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": "2021-05-27T12:26:48+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php73",
+            "version": "v1.23.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php73.git",
+                "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010",
+                "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.23-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php73\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ],
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "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.3+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.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": "2021-02-19T12:13:01+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php80",
+            "version": "v1.23.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php80.git",
+                "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be",
+                "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.23-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php80\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ],
+                "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.23.1"
+            },
+            "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": "2021-07-28T13:41:28+00:00"
+        },
+        {
+            "name": "symfony/process",
+            "version": "v4.4.30",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/process.git",
+                "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/process/zipball/13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d",
+                "reference": "13d3161ef63a8ec21eeccaaf9a4d7f784a87a97d",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1.3",
+                "symfony/polyfill-php80": "^1.16"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Process\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Executes commands in sub-processes",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/process/tree/v4.4.30"
+            },
+            "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": "2021-08-04T20:31:23+00:00"
+        },
+        {
+            "name": "symfony/psr-http-message-bridge",
+            "version": "v2.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/psr-http-message-bridge.git",
+                "reference": "c9012994c4b4fb23e7c57dd86b763a417a04feba"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/c9012994c4b4fb23e7c57dd86b763a417a04feba",
+                "reference": "c9012994c4b4fb23e7c57dd86b763a417a04feba",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1",
+                "psr/http-message": "^1.0",
+                "symfony/http-foundation": "^4.4 || ^5.0"
+            },
+            "require-dev": {
+                "nyholm/psr7": "^1.1",
+                "psr/log": "^1.1 || ^2 || ^3",
+                "symfony/browser-kit": "^4.4 || ^5.0",
+                "symfony/config": "^4.4 || ^5.0",
+                "symfony/event-dispatcher": "^4.4 || ^5.0",
+                "symfony/framework-bundle": "^4.4 || ^5.0",
+                "symfony/http-kernel": "^4.4 || ^5.0",
+                "symfony/phpunit-bridge": "^4.4.19 || ^5.2"
+            },
+            "suggest": {
+                "nyholm/psr7": "For a super lightweight PSR-7/17 implementation"
+            },
+            "type": "symfony-bridge",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "2.1-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Bridge\\PsrHttpMessage\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                }
+            ],
+            "description": "PSR HTTP message bridge",
+            "homepage": "http://symfony.com",
+            "keywords": [
+                "http",
+                "http-message",
+                "psr-17",
+                "psr-7"
+            ],
+            "support": {
+                "issues": "https://github.com/symfony/psr-http-message-bridge/issues",
+                "source": "https://github.com/symfony/psr-http-message-bridge/tree/v2.1.1"
+            },
+            "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": "2021-07-27T17:25:39+00:00"
+        },
+        {
+            "name": "symfony/service-contracts",
+            "version": "v2.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/service-contracts.git",
+                "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb",
+                "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "psr/container": "^1.1"
+            },
+            "suggest": {
+                "symfony/service-implementation": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "2.4-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Contracts\\Service\\": ""
+                }
+            },
+            "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": "Generic abstractions related to writing services",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/service-contracts/tree/v2.4.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": "2021-04-01T10:43:52+00:00"
+        },
+        {
+            "name": "symfony/translation",
+            "version": "v5.3.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/translation.git",
+                "reference": "4d595a6d15fd3a2c67f6f31d14d15d3b7356d7a6"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/translation/zipball/4d595a6d15fd3a2c67f6f31d14d15d3b7356d7a6",
+                "reference": "4d595a6d15fd3a2c67f6f31d14d15d3b7356d7a6",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "symfony/deprecation-contracts": "^2.1",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/polyfill-php80": "^1.16",
+                "symfony/translation-contracts": "^2.3"
+            },
+            "conflict": {
+                "symfony/config": "<4.4",
+                "symfony/dependency-injection": "<5.0",
+                "symfony/http-kernel": "<5.0",
+                "symfony/twig-bundle": "<5.0",
+                "symfony/yaml": "<4.4"
+            },
+            "provide": {
+                "symfony/translation-implementation": "2.3"
+            },
+            "require-dev": {
+                "psr/log": "^1|^2|^3",
+                "symfony/config": "^4.4|^5.0",
+                "symfony/console": "^4.4|^5.0",
+                "symfony/dependency-injection": "^5.0",
+                "symfony/finder": "^4.4|^5.0",
+                "symfony/http-kernel": "^5.0",
+                "symfony/intl": "^4.4|^5.0",
+                "symfony/polyfill-intl-icu": "^1.21",
+                "symfony/service-contracts": "^1.1.2|^2",
+                "symfony/yaml": "^4.4|^5.0"
+            },
+            "suggest": {
+                "psr/log-implementation": "To use logging capability in translator",
+                "symfony/config": "",
+                "symfony/yaml": ""
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "Resources/functions.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Component\\Translation\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides tools to internationalize your application",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/translation/tree/v5.3.7"
+            },
+            "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": "2021-08-26T08:22:53+00:00"
+        },
+        {
+            "name": "symfony/translation-contracts",
+            "version": "v2.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/translation-contracts.git",
+                "reference": "95c812666f3e91db75385749fe219c5e494c7f95"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/95c812666f3e91db75385749fe219c5e494c7f95",
+                "reference": "95c812666f3e91db75385749fe219c5e494c7f95",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5"
+            },
+            "suggest": {
+                "symfony/translation-implementation": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "2.4-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Contracts\\Translation\\": ""
+                }
+            },
+            "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": "Generic abstractions related to translation",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/translation-contracts/tree/v2.4.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": "2021-03-23T23:28:01+00:00"
+        },
+        {
+            "name": "symfony/var-exporter",
+            "version": "v5.3.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/var-exporter.git",
+                "reference": "2ded877ab0574d8b646f4eb3f716f8ed7ee7f392"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/var-exporter/zipball/2ded877ab0574d8b646f4eb3f716f8ed7ee7f392",
+                "reference": "2ded877ab0574d8b646f4eb3f716f8ed7ee7f392",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "symfony/polyfill-php80": "^1.16"
+            },
+            "require-dev": {
+                "symfony/var-dumper": "^4.4.9|^5.0.9"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\VarExporter\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "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": "Allows exporting any serializable PHP data structure to plain PHP code",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "clone",
+                "construct",
+                "export",
+                "hydrate",
+                "instantiate",
+                "serialize"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/var-exporter/tree/v5.3.7"
+            },
+            "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": "2021-08-04T22:42:42+00:00"
+        },
+        {
+            "name": "topthink/framework",
+            "version": "v6.0.9",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/framework.git",
+                "reference": "0b5fb453f0e533de3af3a1ab6a202510b61be617"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/framework/zipball/0b5fb453f0e533de3af3a1ab6a202510b61be617",
+                "reference": "0b5fb453f0e533de3af3a1ab6a202510b61be617",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "ext-mbstring": "*",
+                "league/flysystem": "^1.1.4",
+                "league/flysystem-cached-adapter": "^1.0",
+                "php": ">=7.2.5",
+                "psr/container": "~1.0",
+                "psr/log": "~1.0",
+                "psr/simple-cache": "^1.0",
+                "topthink/think-helper": "^3.1.1",
+                "topthink/think-orm": "^2.0"
+            },
+            "require-dev": {
+                "mikey179/vfsstream": "^1.6",
+                "mockery/mockery": "^1.2",
+                "phpunit/phpunit": "^7.0"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [],
+                "psr-4": {
+                    "think\\": "src/think/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "liu21st",
+                    "email": "liu21st@gmail.com"
+                },
+                {
+                    "name": "yunwuxin",
+                    "email": "448901948@qq.com"
+                }
+            ],
+            "description": "The ThinkPHP Framework.",
+            "homepage": "http://thinkphp.cn/",
+            "keywords": [
+                "framework",
+                "orm",
+                "thinkphp"
+            ],
+            "support": {
+                "issues": "https://github.com/top-think/framework/issues",
+                "source": "https://github.com/top-think/framework/tree/v6.0.9"
+            },
+            "time": "2021-07-22T03:24:49+00:00"
+        },
+        {
+            "name": "topthink/think-helper",
+            "version": "v3.1.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/think-helper.git",
+                "reference": "f98e3ad44acd27ae85a4d923b1bdfd16c6d8d905"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/think-helper/zipball/f98e3ad44acd27ae85a4d923b1bdfd16c6d8d905",
+                "reference": "f98e3ad44acd27ae85a4d923b1bdfd16c6d8d905",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "think\\": "src"
+                },
+                "files": [
+                    "src/helper.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "yunwuxin",
+                    "email": "448901948@qq.com"
+                }
+            ],
+            "description": "The ThinkPHP6 Helper Package",
+            "support": {
+                "issues": "https://github.com/top-think/think-helper/issues",
+                "source": "https://github.com/top-think/think-helper/tree/v3.1.5"
+            },
+            "time": "2021-06-21T06:17:31+00:00"
+        },
+        {
+            "name": "topthink/think-orm",
+            "version": "v2.0.44",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/think-orm.git",
+                "reference": "5d3d5c1ebf8bfccf34bacd90edb42989b16ea409"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/think-orm/zipball/5d3d5c1ebf8bfccf34bacd90edb42989b16ea409",
+                "reference": "5d3d5c1ebf8bfccf34bacd90edb42989b16ea409",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "ext-pdo": "*",
+                "php": ">=7.1.0",
+                "psr/log": "~1.0",
+                "psr/simple-cache": "^1.0",
+                "topthink/think-helper": "^3.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^7|^8|^9.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "think\\": "src"
+                },
+                "files": [
+                    "stubs/load_stubs.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "liu21st",
+                    "email": "liu21st@gmail.com"
+                }
+            ],
+            "description": "think orm",
+            "keywords": [
+                "database",
+                "orm"
+            ],
+            "support": {
+                "issues": "https://github.com/top-think/think-orm/issues",
+                "source": "https://github.com/top-think/think-orm/tree/v2.0.44"
+            },
+            "time": "2021-07-21T02:22:31+00:00"
+        },
+        {
+            "name": "topthink/think-queue",
+            "version": "v3.0.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/think-queue.git",
+                "reference": "a9f81126bdd52d036461e0c6556592dd478c8728"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/think-queue/zipball/a9f81126bdd52d036461e0c6556592dd478c8728",
+                "reference": "a9f81126bdd52d036461e0c6556592dd478c8728",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "nesbot/carbon": "^2.16",
+                "symfony/process": "^4.2",
+                "topthink/framework": "^6.0"
+            },
+            "require-dev": {
+                "mockery/mockery": "^1.2",
+                "phpunit/phpunit": "^6.2",
+                "topthink/think-migration": "^3.0.0"
+            },
+            "type": "library",
+            "extra": {
+                "think": {
+                    "services": [
+                        "think\\queue\\Service"
+                    ],
+                    "config": {
+                        "queue": "src/config.php"
+                    }
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "think\\": "src"
+                },
+                "files": [
+                    "src/common.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "yunwuxin",
+                    "email": "448901948@qq.com"
+                }
+            ],
+            "description": "The ThinkPHP6 Queue Package",
+            "support": {
+                "issues": "https://github.com/top-think/think-queue/issues",
+                "source": "https://github.com/top-think/think-queue/tree/v3.0.6"
+            },
+            "time": "2021-06-24T18:03:45+00:00"
+        },
+        {
+            "name": "xaboy/form-builder",
+            "version": "2.0.19",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/xaboy/form-builder.git",
+                "reference": "5cf3f5435a63954c1d11ba82c3cd4cfe3d145acf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/xaboy/form-builder/zipball/5cf3f5435a63954c1d11ba82c3cd4cfe3d145acf",
+                "reference": "5cf3f5435a63954c1d11ba82c3cd4cfe3d145acf",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "doctrine/annotations": "^1.2.7",
+                "ext-json": "*",
+                "php": ">=5.4.0",
+                "symfony/http-foundation": ">=2.6"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "FormBuilder\\": "./src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "xaboy",
+                    "email": "xaboy2005@qq.com"
+                }
+            ],
+            "description": "PHP表单生成器,快速生成现代化的form表单。包含复选框、单选框、输入框、下拉选择框等元素以及,省市区三级联动,时间选择,日期选择,颜色选择,文件/图片上传等功能。",
+            "homepage": "https://github.com/xaboy/form-builder",
+            "keywords": [
+                "dynamic-form",
+                "element-ui",
+                "form",
+                "form-create",
+                "form-generator",
+                "iview"
+            ],
+            "support": {
+                "issues": "https://github.com/xaboy/form-builder/issues",
+                "source": "https://github.com/xaboy/form-builder"
+            },
+            "time": "2021-02-25T03:51:14+00:00"
+        }
+    ],
+    "packages-dev": [
+        {
+            "name": "symfony/polyfill-php72",
+            "version": "v1.23.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php72.git",
+                "reference": "9a142215a36a3888e30d0a9eeea9766764e96976"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976",
+                "reference": "9a142215a36a3888e30d0a9eeea9766764e96976",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.23-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php72\\": ""
+                },
+                "files": [
+                    "bootstrap.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": "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.23.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": "2021-05-27T09:17:38+00:00"
+        },
+        {
+            "name": "symfony/var-dumper",
+            "version": "v4.4.30",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/var-dumper.git",
+                "reference": "7f65c44c2ce80d3a0fcdb6385ee0ad535e45660c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7f65c44c2ce80d3a0fcdb6385ee0ad535e45660c",
+                "reference": "7f65c44c2ce80d3a0fcdb6385ee0ad535e45660c",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1.3",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/polyfill-php72": "~1.5",
+                "symfony/polyfill-php80": "^1.16"
+            },
+            "conflict": {
+                "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
+                "symfony/console": "<3.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"
+            },
+            "bin": [
+                "Resources/bin/var-dump-server"
+            ],
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "Resources/functions/dump.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Component\\VarDumper\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "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": "Provides mechanisms for walking through any arbitrary PHP variable",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "debug",
+                "dump"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/var-dumper/tree/v4.4.30"
+            },
+            "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": "2021-08-04T20:31:23+00:00"
+        },
+        {
+            "name": "topthink/think-trace",
+            "version": "v1.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/think-trace.git",
+                "reference": "9a9fa8f767b6c66c5a133ad21ca1bc96ad329444"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/think-trace/zipball/9a9fa8f767b6c66c5a133ad21ca1bc96ad329444",
+                "reference": "9a9fa8f767b6c66c5a133ad21ca1bc96ad329444",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1.0",
+                "topthink/framework": "^6.0.0"
+            },
+            "type": "library",
+            "extra": {
+                "think": {
+                    "services": [
+                        "think\\trace\\Service"
+                    ],
+                    "config": {
+                        "trace": "src/config.php"
+                    }
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "think\\trace\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "liu21st",
+                    "email": "liu21st@gmail.com"
+                }
+            ],
+            "description": "thinkphp debug trace",
+            "support": {
+                "issues": "https://github.com/top-think/think-trace/issues",
+                "source": "https://github.com/top-think/think-trace/tree/v1.4"
+            },
+            "time": "2020-06-29T05:27:28+00:00"
+        }
+    ],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": {
+        "php": ">=7.1.0"
+    },
+    "platform-dev": [],
+    "plugin-api-version": "2.1.0"
+}

+ 32 - 0
config/app.php

@@ -0,0 +1,32 @@
+<?php
+// +----------------------------------------------------------------------
+// | 应用设置
+// +----------------------------------------------------------------------
+
+return [
+    // 应用地址
+    'app_host'         => env('app.host', ''),
+    // 应用的命名空间
+    'app_namespace'    => '',
+    // 是否启用路由
+    'with_route'       => true,
+    // 默认应用
+    'default_app'      => 'index',
+    // 默认时区
+    'default_timezone' => 'Asia/Shanghai',
+
+    // 应用映射(自动多应用模式有效)
+    'app_map'          => [],
+    // 域名绑定(自动多应用模式有效)
+    'domain_bind'      => [],
+    // 禁止URL访问的应用列表(自动多应用模式有效)
+    'deny_app_list'    => [],
+
+    // 异常页面的模板文件
+    'exception_tmpl'   => app()->getThinkPath() . 'tpl/think_exception.tpl',
+
+    // 错误显示信息,非调试模式有效
+    'error_message'    => '页面错误!请稍后再试~',
+    // 显示错误信息
+    'show_error_msg'   => false,
+];

+ 29 - 0
config/cache.php

@@ -0,0 +1,29 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | 缓存设置
+// +----------------------------------------------------------------------
+
+return [
+    // 默认缓存驱动
+    'default' => env('cache.driver', 'file'),
+
+    // 缓存连接方式配置
+    'stores'  => [
+        'file' => [
+            // 驱动方式
+            'type'       => 'File',
+            // 缓存保存目录
+            'path'       => '',
+            // 缓存前缀
+            'prefix'     => '',
+            // 缓存有效期 0表示永久缓存
+            'expire'     => 0,
+            // 缓存标签前缀
+            'tag_prefix' => 'tag:',
+            // 序列化机制 例如 ['serialize', 'unserialize']
+            'serialize'  => [],
+        ],
+        // 更多的缓存连接
+    ],
+];

+ 9 - 0
config/console.php

@@ -0,0 +1,9 @@
+<?php
+// +----------------------------------------------------------------------
+// | 控制台配置
+// +----------------------------------------------------------------------
+return [
+    // 指令定义
+    'commands' => [
+    ],
+];

+ 20 - 0
config/cookie.php

@@ -0,0 +1,20 @@
+<?php
+// +----------------------------------------------------------------------
+// | Cookie设置
+// +----------------------------------------------------------------------
+return [
+    // cookie 保存时间
+    'expire'    => 0,
+    // cookie 保存路径
+    'path'      => '/',
+    // cookie 有效域名
+    'domain'    => '',
+    //  cookie 启用安全传输
+    'secure'    => false,
+    // httponly设置
+    'httponly'  => false,
+    // 是否使用 setcookie
+    'setcookie' => true,
+    // samesite 设置,支持 'strict' 'lax'
+    'samesite'  => '',
+];

+ 63 - 0
config/database.php

@@ -0,0 +1,63 @@
+<?php
+
+return [
+    // 默认使用的数据库连接配置
+    'default'         => env('database.driver', 'mysql'),
+
+    // 自定义时间查询规则
+    'time_query_rule' => [],
+
+    // 自动写入时间戳字段
+    // true为自动识别类型 false关闭
+    // 字符串则明确指定时间字段类型 支持 int timestamp datetime date
+    'auto_timestamp'  => true,
+
+    // 时间字段取出后的默认时间格式
+    'datetime_format' => 'Y-m-d H:i:s',
+
+    // 时间字段配置 配置格式:create_time,update_time
+    'datetime_field'  => '',
+
+    // 数据库连接配置信息
+    'connections'     => [
+        'mysql' => [
+            // 数据库类型
+            'type'            => env('database.type', 'mysql'),
+            // 服务器地址
+            'hostname'        => env('database.hostname', '127.0.0.1'),
+            // 数据库名
+            'database'        => env('database.database', ''),
+            // 用户名
+            'username'        => env('database.username', 'root'),
+            // 密码
+            'password'        => env('database.password', ''),
+            // 端口
+            'hostport'        => env('database.hostport', '3306'),
+            // 数据库连接参数
+            'params'          => [],
+            // 数据库编码默认采用utf8
+            'charset'         => env('database.charset', 'utf8'),
+            // 数据库表前缀
+            'prefix'          => env('database.prefix', ''),
+
+            // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
+            'deploy'          => 0,
+            // 数据库读写是否分离 主从式有效
+            'rw_separate'     => false,
+            // 读写分离后 主服务器数量
+            'master_num'      => 1,
+            // 指定从服务器序号
+            'slave_no'        => '',
+            // 是否严格检查字段是否存在
+            'fields_strict'   => true,
+            // 是否需要断线重连
+            'break_reconnect' => false,
+            // 监听SQL
+            'trigger_sql'     => env('app_debug', true),
+            // 开启字段缓存
+            'fields_cache'    => false,
+        ],
+
+        // 更多的数据库配置信息
+    ],
+];

+ 24 - 0
config/filesystem.php

@@ -0,0 +1,24 @@
+<?php
+
+return [
+    // 默认磁盘
+    'default' => env('filesystem.driver', 'local'),
+    // 磁盘列表
+    'disks'   => [
+        'local'  => [
+            'type' => 'local',
+            'root' => app()->getRuntimePath() . 'storage',
+        ],
+        'public' => [
+            // 磁盘类型
+            'type'       => 'local',
+            // 磁盘路径
+            'root'       => app()->getRootPath() . 'public/storage',
+            // 磁盘路径对应的外部URL路径
+            'url'        => '/storage',
+            // 可见性
+            'visibility' => 'public',
+        ],
+        // 更多的磁盘配置信息
+    ],
+];

+ 27 - 0
config/lang.php

@@ -0,0 +1,27 @@
+<?php
+// +----------------------------------------------------------------------
+// | 多语言设置
+// +----------------------------------------------------------------------
+
+return [
+    // 默认语言
+    'default_lang'    => env('lang.default_lang', 'zh-cn'),
+    // 允许的语言列表
+    'allow_lang_list' => [],
+    // 多语言自动侦测变量名
+    'detect_var'      => 'lang',
+    // 是否使用Cookie记录
+    'use_cookie'      => true,
+    // 多语言cookie变量
+    'cookie_var'      => 'think_lang',
+    // 多语言header变量
+    'header_var'      => 'think-lang',
+    // 扩展语言包
+    'extend_list'     => [],
+    // Accept-Language转义为对应语言包名称
+    'accept_language' => [
+        'zh-hans-cn' => 'zh-cn',
+    ],
+    // 是否支持语言分组
+    'allow_group'     => false,
+];

+ 45 - 0
config/log.php

@@ -0,0 +1,45 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | 日志设置
+// +----------------------------------------------------------------------
+return [
+    // 默认日志记录通道
+    'default'      => env('log.channel', 'file'),
+    // 日志记录级别
+    'level'        => [],
+    // 日志类型记录的通道 ['error'=>'email',...]
+    'type_channel' => [],
+    // 关闭全局日志写入
+    'close'        => false,
+    // 全局日志处理 支持闭包
+    'processor'    => null,
+
+    // 日志通道列表
+    'channels'     => [
+        'file' => [
+            // 日志记录方式
+            'type'           => 'File',
+            // 日志保存目录
+            'path'           => '',
+            // 单文件日志写入
+            'single'         => false,
+            // 独立日志级别
+            'apart_level'    => [],
+            // 最大日志文件数量
+            'max_files'      => 0,
+            // 使用JSON格式记录
+            'json'           => false,
+            // 日志处理
+            'processor'      => null,
+            // 关闭通道日志写入
+            'close'          => false,
+            // 日志输出格式化
+            'format'         => '[%s][%s] %s',
+            // 是否实时写入
+            'realtime_write' => false,
+        ],
+        // 其它日志通道配置
+    ],
+
+];

+ 8 - 0
config/middleware.php

@@ -0,0 +1,8 @@
+<?php
+// 中间件配置
+return [
+    // 别名或分组
+    'alias'    => [],
+    // 优先级设置,此数组中的中间件会按照数组中的顺序优先执行
+    'priority' => [],
+];

+ 39 - 0
config/queue.php

@@ -0,0 +1,39 @@
+<?php
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: yunwuxin <448901948@qq.com>
+// +----------------------------------------------------------------------
+
+return [
+    'default'     => 'sync',
+    'connections' => [
+        'sync'     => [
+            'type' => 'sync',
+        ],
+        'database' => [
+            'type'       => 'database',
+            'queue'      => 'default',
+            'table'      => 'jobs',
+            'connection' => null,
+        ],
+        'redis'    => [
+            'type'       => 'redis',
+            'queue'      => 'default',
+            'host'       => '127.0.0.1',
+            'port'       => 6379,
+            'password'   => '',
+            'select'     => 0,
+            'timeout'    => 0,
+            'persistent' => false,
+        ],
+    ],
+    'failed'      => [
+        'type'  => 'none',
+        'table' => 'failed_jobs',
+    ],
+];

+ 45 - 0
config/route.php

@@ -0,0 +1,45 @@
+<?php
+// +----------------------------------------------------------------------
+// | 路由设置
+// +----------------------------------------------------------------------
+
+return [
+    // pathinfo分隔符
+    'pathinfo_depr'         => '/',
+    // URL伪静态后缀
+    'url_html_suffix'       => 'html',
+    // URL普通方式参数 用于自动生成
+    'url_common_param'      => true,
+    // 是否开启路由延迟解析
+    'url_lazy_route'        => false,
+    // 是否强制使用路由
+    'url_route_must'        => false,
+    // 合并路由规则
+    'route_rule_merge'      => false,
+    // 路由是否完全匹配
+    'route_complete_match'  => false,
+    // 访问控制器层名称
+    'controller_layer'      => 'controller',
+    // 空控制器名
+    'empty_controller'      => 'Error',
+    // 是否使用控制器后缀
+    'controller_suffix'     => false,
+    // 默认的路由变量规则
+    'default_route_pattern' => '[\w\.]+',
+    // 是否开启请求缓存 true自动缓存 支持设置请求缓存规则
+    'request_cache_key'     => false,
+    // 请求缓存有效期
+    'request_cache_expire'  => null,
+    // 全局请求缓存排除规则
+    'request_cache_except'  => [],
+    // 默认控制器名
+    'default_controller'    => 'Index',
+    // 默认操作名
+    'default_action'        => 'index',
+    // 操作方法后缀
+    'action_suffix'         => '',
+    // 默认JSONP格式返回的处理方法
+    'default_jsonp_handler' => 'jsonpReturn',
+    // 默认JSONP处理方法
+    'var_jsonp_handler'     => 'callback',
+];

+ 19 - 0
config/session.php

@@ -0,0 +1,19 @@
+<?php
+// +----------------------------------------------------------------------
+// | 会话设置
+// +----------------------------------------------------------------------
+
+return [
+    // session name
+    'name'           => 'PHPSESSID',
+    // SESSION_ID的提交变量,解决flash上传跨域
+    'var_session_id' => '',
+    // 驱动方式 支持file cache
+    'type'           => 'file',
+    // 存储连接标识 当type使用cache的时候有效
+    'store'          => null,
+    // 过期时间
+    'expire'         => 1440,
+    // 前缀
+    'prefix'         => '',
+];

+ 10 - 0
config/trace.php

@@ -0,0 +1,10 @@
+<?php
+// +----------------------------------------------------------------------
+// | Trace设置 开启调试模式后有效
+// +----------------------------------------------------------------------
+return [
+    // 内置Html和Console两种方式 支持扩展
+    'type'    => 'Html',
+    // 读取的日志通道名
+    'channel' => '',
+];

+ 25 - 0
config/view.php

@@ -0,0 +1,25 @@
+<?php
+// +----------------------------------------------------------------------
+// | 模板设置
+// +----------------------------------------------------------------------
+
+return [
+    // 模板引擎类型使用Think
+    'type'          => 'Think',
+    // 默认模板渲染规则 1 解析为小写+下划线 2 全部转换小写 3 保持操作方法
+    'auto_rule'     => 1,
+    // 模板目录名
+    'view_dir_name' => 'view',
+    // 模板后缀
+    'view_suffix'   => 'html',
+    // 模板文件名分隔符
+    'view_depr'     => DIRECTORY_SEPARATOR,
+    // 模板引擎普通标签开始标记
+    'tpl_begin'     => '{',
+    // 模板引擎普通标签结束标记
+    'tpl_end'       => '}',
+    // 标签库标签开始标记
+    'taglib_begin'  => '{',
+    // 标签库标签结束标记
+    'taglib_end'    => '}',
+];

+ 2 - 0
extend/.gitignore

@@ -0,0 +1,2 @@
+*
+!.gitignore

+ 16 - 0
ln/exceptions/AuthException.php

@@ -0,0 +1,16 @@
+<?php
+
+
+
+namespace ln\exceptions;
+
+
+use think\exception\HttpResponseException;
+
+class AuthException extends HttpResponseException
+{
+    public function __construct($message, $code = 40000)
+    {
+        parent::__construct(app('json')->make($code, $message));
+    }
+}

+ 12 - 0
ln/exceptions/SmsException.php

@@ -0,0 +1,12 @@
+<?php
+
+
+
+
+namespace ln\exceptions;
+
+
+class SmsException extends \Exception
+{
+
+}

+ 15 - 0
ln/exceptions/UploadException.php

@@ -0,0 +1,15 @@
+<?php
+
+
+
+
+namespace ln\exceptions;
+
+/**
+ * Class AuthException
+ * @package crmeb\exceptions
+ */
+class UploadException extends \RuntimeException
+{
+
+}

+ 18 - 0
ln/exceptions/UploadFailException.php

@@ -0,0 +1,18 @@
+<?php
+
+
+
+
+namespace ln\exceptions;
+
+
+use think\exception\HttpResponseException;
+
+class UploadFailException extends HttpResponseException
+{
+
+    public function __construct($message = '附件上传失败')
+    {
+        parent::__construct(app('json')->fail($message));
+    }
+}

+ 13 - 0
ln/exceptions/WechatException.php

@@ -0,0 +1,13 @@
+<?php
+
+
+namespace ln\exceptions;
+
+
+use think\exception\HttpResponseException;
+use think\exception\ValidateException;
+use think\Response;
+
+class WechatException extends ValidateException
+{
+}

+ 11 - 0
ln/interfaces/JobInterface.php

@@ -0,0 +1,11 @@
+<?php
+
+namespace ln\interfaces;
+
+
+interface JobInterface
+{
+    public function fire($job, $data);
+
+    public function failed($data);
+}

+ 9 - 0
ln/interfaces/ListenerInterface.php

@@ -0,0 +1,9 @@
+<?php
+
+namespace ln\interfaces;
+
+
+interface ListenerInterface
+{
+    public function handle($event): void;
+}

+ 13 - 0
ln/interfaces/MiddlewareInterface.php

@@ -0,0 +1,13 @@
+<?php
+
+
+namespace ln\interfaces;
+
+
+use app\Request;
+use think\Response;
+
+interface MiddlewareInterface
+{
+    public function handle(Request $request, \Closure $next): Response;
+}

+ 37 - 0
ln/jobs/ApplyBroadcastGoodsJob.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace ln\jobs;
+
+use app\common\repositories\store\broadcast\BroadcastGoodsRepository;
+use ln\interfaces\JobInterface;
+use think\facade\Log;
+
+class ApplyBroadcastGoodsJob implements JobInterface
+{
+
+    public function fire($job, $goodsId)
+    {
+        $broadcastRoomGoodsRepository = app()->make(BroadcastGoodsRepository::class);
+        $goods = $broadcastRoomGoodsRepository->get($goodsId);
+        if ($goods) {
+            try {
+                $res = $broadcastRoomGoodsRepository->wxCreate($goods);
+            } catch (\Exception $e) {
+                $goods->error_msg = $e->getMessage();
+                $goods->status = -1;
+            }
+            if (isset($res)) {
+                $goods->goods_id = $res->goodsId;
+                $goods->audit_id = $res->auditId;
+                $goods->status = 1;
+            }
+            $goods->save();
+        }
+        $job->delete();
+    }
+
+    public function failed($data)
+    {
+        // TODO: Implement failed() method.
+    }
+}

+ 34 - 0
ln/jobs/AutoUserPosterJob.php

@@ -0,0 +1,34 @@
+<?php
+
+
+
+namespace ln\jobs;
+
+
+use app\common\repositories\user\UserRepository;
+use ln\interfaces\JobInterface;
+
+class AutoUserPosterJob implements JobInterface
+{
+    public function fire($job, $uid)
+    {
+        $userRepository = app()->make(UserRepository::class);
+        $user = $userRepository->get($uid);
+        if (!$user)
+            $job->delete();
+        try {
+            $userRepository->routineSpreadImage($user);
+        } catch (\Exception $e) {
+        };
+        try {
+            $userRepository->wxSpreadImage($user);
+        } catch (\Exception $e) {
+        };
+        $job->delete();
+    }
+
+    public function failed($data)
+    {
+        // TODO: Implement failed() method.
+    }
+}

+ 37 - 0
ln/jobs/BatchDeliveryJob.php

@@ -0,0 +1,37 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+
+namespace ln\jobs;
+
+use app\common\repositories\store\order\StoreOrderRepository;
+use ln\interfaces\JobInterface;
+use think\facade\Log;
+
+class BatchDeliveryJob implements JobInterface
+{
+
+    public function fire($job, $data)
+    {
+        try{
+            app()->make(StoreOrderRepository::class)->batchDelivery($data['mer_id'],$data['data']);
+            $job->delete();
+        }catch (\Exception $exception){
+            Log::info(var_export($exception, 1));
+        }
+    }
+
+    public function failed($data)
+    {
+        // TODO: Implement failed() method.
+    }
+}

+ 38 - 0
ln/jobs/CancelGroupBuyingJob.php

@@ -0,0 +1,38 @@
+<?php
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+
+namespace ln\jobs;
+
+use app\common\repositories\store\order\StoreRefundOrderRepository;
+use ln\interfaces\JobInterface;
+use think\facade\Log;
+
+class CancelGroupBuyingJob implements JobInterface
+{
+
+    public function fire($job, $data)
+    {
+        try{
+        //TODO 关闭子团,自动退款,关闭订单
+            $make = app()->make(StoreRefundOrderRepository::class);
+            $make->autoRefundOrder($data['order_id'], 1, $data['message']);
+            $job->delete();
+        }catch (\Exception $exception){
+            Log::info(var_export($exception, 1));
+        }
+    }
+
+    public function failed($data)
+    {
+        // TODO: Implement failed() method.
+    }
+}

+ 54 - 0
ln/jobs/CancelGroupOrderJob.php

@@ -0,0 +1,54 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+
+namespace ln\jobs;
+
+
+use app\common\repositories\store\coupon\StoreCouponUserRepository;
+use app\common\repositories\store\order\StoreGroupOrderRepository;
+use app\common\repositories\store\product\ProductAttrValueRepository;
+use app\common\repositories\store\product\ProductRepository;
+use ln\interfaces\JobInterface;
+use think\facade\Db;
+use think\facade\Log;
+
+class CancelGroupOrderJob implements JobInterface
+{
+
+    public function fire($job, $groupOrderId)
+    {
+        $groupOrderRepository = app()->make(StoreGroupOrderRepository::class);
+        $groupOrder = $groupOrderRepository->getCancelDetail($groupOrderId);
+        if (!$groupOrder) return $job->delete();
+        Db::transaction(function () use ($groupOrder) {
+            $couponId = [];
+            $productRepository = app()->make(ProductRepository::class);
+            foreach ($groupOrder->orderList as $order) {
+                if ($order->coupon_id)
+                    $couponId = array_merge($couponId, explode(',', $order->coupon_id));
+                foreach ($order->orderProduct as $cart) {
+                    $productRepository->orderProductIncStock($order, $cart);
+                }
+            }
+            if (count($couponId)) {
+                app()->make(StoreCouponUserRepository::class)->updates($couponId, ['status' => 0]);
+            }
+        });
+        return $job->delete();
+    }
+
+    public function failed($data)
+    {
+        Log::info('取消订单执行失败:' . var_export($data, true));
+    }
+}

+ 31 - 0
ln/jobs/ChangeMerchantStatusJob.php

@@ -0,0 +1,31 @@
+<?php
+
+namespace ln\jobs;
+
+
+use app\common\repositories\store\product\ProductRepository;
+use app\common\repositories\system\merchant\MerchantRepository;
+use ln\interfaces\JobInterface;
+use think\facade\Log;
+use think\queue\Job;
+
+class ChangeMerchantStatusJob implements JobInterface
+{
+
+    public function fire($job, $merId)
+    {
+        $merchant = app()->make(MerchantRepository::class)->get($merId);
+        if ($merchant) {
+            $where = [
+                'mer_status' => ($merchant['is_del'] || !$merchant['mer_state'] || !$merchant['status']) ? 0 : 1
+            ];
+            app()->make(ProductRepository::class)->changeMerchantProduct($merId, $where);
+        }
+        $job->delete();
+    }
+
+    public function failed($data)
+    {
+        // TODO: Implement failed() method.
+    }
+}

+ 30 - 0
ln/jobs/ChangeSpuStatusJob.php

@@ -0,0 +1,30 @@
+<?php
+
+
+namespace ln\jobs;
+
+use app\common\repositories\store\product\SpuRepository;
+use ln\interfaces\JobInterface;
+use think\facade\Log;
+
+class ChangeSpuStatusJob implements JobInterface
+{
+
+    public function fire($job, $data)
+    {
+        try{
+            $make = app()->make(SpuRepository::class);
+            if(!is_array($data['id']) && is_numeric($data['id'])){
+                $make->changeStatus($data['id'],$data['product_type']);
+            }
+            $job->delete();
+        }catch (\Exception $exception){
+            Log::info($exception->getMessage());
+        }
+    }
+
+    public function failed($data)
+    {
+        // TODO: Implement failed() method.
+    }
+}

+ 30 - 0
ln/jobs/CheckProductExtensionJob.php

@@ -0,0 +1,30 @@
+<?php
+
+
+
+namespace ln\jobs;
+
+
+use ln\interfaces\JobInterface;
+use think\facade\Log;
+use think\queue\Job;
+use app\common\repositories\store\product\ProductRepository;
+
+class CheckProductExtensionJob implements JobInterface
+{
+
+    public function fire($job, $data)
+    {
+        try{
+            app()->make(ProductRepository::class)->checkProductByExtension();
+            $job->delete();
+        }catch (\Exception $exception){
+            Log::info(var_export($exception, 1));
+        }
+    }
+
+    public function failed($data)
+    {
+        // TODO: Implement failed() method.
+    }
+}

+ 40 - 0
ln/jobs/CheckProductPresellJob.php

@@ -0,0 +1,40 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+
+namespace ln\jobs;
+
+
+use app\common\repositories\store\product\ProductPresellRepository;
+use ln\interfaces\JobInterface;
+use think\facade\Log;
+use think\queue\Job;
+
+class CheckProductPresellJob implements JobInterface
+{
+
+    public function fire($job, $data)
+    {
+        try{
+            $make = app()->make(ProductPresellRepository::class);
+            $make->checkStatus(null);
+        $job->delete();
+        }catch (\Exception $exception){
+            Log::info($exception->getMessage());
+        }
+    }
+
+    public function failed($data)
+    {
+        // TODO: Implement failed() method.
+    }
+}

+ 27 - 0
ln/jobs/ClearMerchantStoreJob.php

@@ -0,0 +1,27 @@
+<?php
+
+
+namespace ln\jobs;
+
+use app\common\repositories\store\product\ProductRepository;
+use ln\interfaces\JobInterface;
+use think\facade\Log;
+
+class ClearMerchantStoreJob implements JobInterface
+{
+
+    public function fire($job, $data)
+    {
+        try{
+            app()->make(ProductRepository::class)->clearMerchantProduct($data['mer_id']);
+        }catch (\Exception $e){
+            Log::info('商户ID:'.$data['mer_id'].'清除出错');
+        }
+        $job->delete();
+    }
+
+    public function failed($data)
+    {
+        // TODO: Implement failed() method.
+    }
+}

+ 48 - 0
ln/jobs/ClearUserIntegralJob.php

@@ -0,0 +1,48 @@
+<?php
+
+
+
+
+namespace ln\jobs;
+
+use app\common\repositories\store\product\ProductRepository;
+use app\common\repositories\user\UserBillRepository;
+use app\common\repositories\user\UserRepository;
+use ln\interfaces\JobInterface;
+use think\facade\Db;
+use think\facade\Log;
+
+class ClearUserIntegralJob implements JobInterface
+{
+
+    public function fire($job, $data)
+    {
+        try {
+            $user = app()->make(UserRepository::class)->get($data['uid']);
+            if ($user && $user->integral > 0) {
+                $validIntegral = app()->make(UserBillRepository::class)->validIntegral($data['uid'], $data['startTime'], $data['endTime']);
+                if ($user->integral > $validIntegral) {
+                    $clear = bcsub($user->integral, $validIntegral, 0);
+                    $user->integral = $validIntegral;
+                    app()->make(UserBillRepository::class)->decBill($user->uid, 'integral', 'timeout', [
+                        'link_id' => 0,
+                        'status' => 1,
+                        'title' => '积分过期',
+                        'number' => $clear,
+                        'mark' => $clear . '积分已过期',
+                        'balance' => $user->integral
+                    ]);
+                    $user->save();
+                }
+            }
+        } catch (\Exception $e) {
+            Log::info('用户ID:' . $data['uid'] . '积分清理失败');
+        }
+        $job->delete();
+    }
+
+    public function failed($data)
+    {
+        // TODO: Implement failed() method.
+    }
+}

+ 29 - 0
ln/jobs/ExpressSyncJob.php

@@ -0,0 +1,29 @@
+<?php
+
+
+
+
+namespace ln\jobs;
+
+use app\common\repositories\store\shipping\ExpressRepository;
+use ln\interfaces\JobInterface;
+use think\facade\Log;
+
+class ExpressSyncJob implements JobInterface
+{
+
+    public function fire($job, $data)
+    {
+        try{
+            app()->make(ExpressRepository::class)->syncExportAll();
+            $job->delete();
+        }catch (\Exception $exception){
+            Log::info(var_export($exception, 1));
+        }
+    }
+
+    public function failed($data)
+    {
+        // TODO: Implement failed() method.
+    }
+}

+ 27 - 0
ln/jobs/GauaranteeCountJob.php

@@ -0,0 +1,27 @@
+<?php
+
+
+namespace ln\jobs;
+
+use app\common\repositories\store\GuaranteeRepository;
+use ln\interfaces\JobInterface;
+use think\facade\Log;
+
+class GauaranteeCountJob implements JobInterface
+{
+
+    public function fire($job, $data)
+    {
+        try{
+            app()->make(GuaranteeRepository::class)->countGuarantee();
+        $job->delete();
+        }catch (\Exception $exception){
+            Log::info($exception->getMessage());
+        }
+    }
+
+    public function failed($data)
+    {
+        // TODO: Implement failed() method.
+    }
+}

+ 27 - 0
ln/jobs/ImportSpreadsheetExcelJob.php

@@ -0,0 +1,27 @@
+<?php
+
+
+namespace ln\jobs;
+
+use app\common\repositories\store\order\StoreOrderRepository;
+use ln\interfaces\JobInterface;
+use think\facade\Log;
+
+class ImportSpreadsheetExcelJob implements JobInterface
+{
+
+    public function fire($job, $data)
+    {
+        try{
+            app()->make(StoreOrderRepository::class)->setWhereDeliveryStatus($data['data'],$data['mer_id']);
+        }catch (\Exception $e){
+            Log::info('商户ID:'.$data['mer_id'].' 导入文件  error : ' . $e->getMessage());
+        }
+        $job->delete();
+    }
+
+    public function failed($data)
+    {
+        // TODO: Implement failed() method.
+    }
+}

+ 60 - 0
ln/jobs/MerchantSendCouponJob.php

@@ -0,0 +1,60 @@
+<?php
+
+
+
+namespace ln\jobs;
+
+
+use app\common\repositories\store\coupon\StoreCouponRepository;
+use app\common\repositories\store\coupon\StoreCouponSendRepository;
+use app\common\repositories\store\coupon\StoreCouponUserRepository;
+use ln\interfaces\JobInterface;
+use think\facade\Cache;
+
+class MerchantSendCouponJob implements JobInterface
+{
+
+    public function fire($job, $sendId)
+    {
+        $storeCouponSendRepository = app()->make(StoreCouponSendRepository::class);
+        $send = $storeCouponSendRepository->get((int)$sendId);
+        if (!$send || $send->status == 1) {
+            return $job->delete();
+        }
+        $cacheKey = '_send_coupon' . $sendId;
+        $cache = Cache::store('file');
+        if (!$cache->has($cacheKey)) {
+            $send->status = -1;
+            return $job->delete();
+        }
+        $storeCouponRepository = app()->make(StoreCouponRepository::class);
+        $storeCouponUserRepository = app()->make(StoreCouponUserRepository::class);
+        $coupon = $storeCouponRepository->get($send->coupon_id);
+        if (!$coupon) {
+            $send->status = -1;
+            return $job->delete();
+        }
+        $uids = $cache->get($cacheKey);
+        do {
+            $install = [];
+            foreach (array_splice($uids, -30) as $k => $uid) {
+                $data = $storeCouponRepository->createData($coupon, $uid);
+                $data['send_id'] = $sendId;
+                $install[] = $data;
+            }
+            try {
+                $storeCouponUserRepository->insertAll($install);
+            } catch (\Exception $e) {
+            }
+            usleep(100);
+        } while (count($uids));
+        $send->status = 1;
+        $send->save();
+        return $job->delete();
+    }
+
+    public function failed($data)
+    {
+        // TODO: Implement failed() method.
+    }
+}

+ 34 - 0
ln/jobs/OrderProfitsharingJob.php

@@ -0,0 +1,34 @@
+<?php
+
+
+namespace ln\jobs;
+
+
+use app\common\repositories\store\order\StoreOrderProfitsharingRepository;
+use ln\interfaces\JobInterface;
+use think\facade\Log;
+
+class OrderProfitsharingJob implements JobInterface
+{
+
+    public function fire($job, $id)
+    {
+        $make = app()->make(StoreOrderProfitsharingRepository::class);
+        $profitsharing = $make->get((int)$id);
+        if (!$profitsharing || $profitsharing->status != 0) {
+            $job->delete();
+            return;
+        }
+        try {
+            $make->profitsharing($profitsharing);
+        } catch (\Exception $e) {
+            Log::info('自动分账失败:' . $e->getMessage());
+        }
+        $job->delete();
+    }
+
+    public function failed($data)
+    {
+        // TODO: Implement failed() method.
+    }
+}

+ 61 - 0
ln/jobs/OrderReplyJob.php

@@ -0,0 +1,61 @@
+<?php
+
+
+namespace ln\jobs;
+
+
+use app\common\repositories\store\order\StoreOrderRepository;
+use app\common\repositories\store\order\StoreOrderStatusRepository;
+use app\common\repositories\store\product\ProductReplyRepository;
+use ln\interfaces\JobInterface;
+use think\facade\Db;
+use think\facade\Log;
+use think\facade\Queue;
+
+class OrderReplyJob implements JobInterface
+{
+
+    public function fire($job, $orderId)
+    {
+        $storeOrderRepository = app()->make(StoreOrderRepository::class);
+        $productReplyRepository = app()->make(ProductReplyRepository::class);
+        $order = $storeOrderRepository->getWhere(['order_id' => $orderId, 'status' => 2]);
+        if ($order) {
+            $data = ['comment' => '系统默认好评', 'product_score' => 5, 'service_score' => 5, 'postage_score' => 5, 'rate' => 5, 'sort' =>0];
+            $data['uid'] = $order->uid;
+            $data['nickname'] = $order->user ? $order->user['nickname'] : '****';
+            $data['avatar'] = $order->user ? $order->user['avatar'] : '';
+            $data['mer_id'] = $order->mer_id;
+            $ids = [];
+            try {
+                Db::transaction(function () use ($productReplyRepository, $order, &$ids, $data) {
+                    foreach ($order->orderProduct as $orderProduct) {
+                        if ($orderProduct->is_reply) continue;
+                        $data['order_product_id'] = $orderProduct['order_product_id'];
+                        $data['product_type'] = $orderProduct['cart_info']['product']['product_type']??0;
+                        $ids[] = $data['product_id'] = $orderProduct['product_id'];
+                        $data['unique'] = $orderProduct['cart_info']['productAttr']['unique'];
+                        $productReplyRepository->create($data);
+                        $orderProduct->is_reply = 1;
+                        $orderProduct->save();
+                    }
+                    $order->status = 3;
+                    $order->save();
+                    //TODO 交易完成
+                    app()->make(StoreOrderStatusRepository::class)->status($order->order_id, 'auto_over', '交易完成');
+                });
+                foreach ($ids as $id) {
+                    Queue::push(UpdateProductReplyJob::class, $id);
+                }
+            } catch (\Exception $e) {
+                Log::error($orderId . '自动评价商品失败' . $e->getMessage());
+            }
+        }
+        $job->delete();
+    }
+
+    public function failed($data)
+    {
+        // TODO: Implement failed() method.
+    }
+}

+ 33 - 0
ln/jobs/PayGiveCouponJob.php

@@ -0,0 +1,33 @@
+<?php
+
+
+namespace ln\jobs;
+
+
+use app\common\repositories\store\coupon\StoreCouponRepository;
+use ln\interfaces\JobInterface;
+use think\facade\Log;
+
+class PayGiveCouponJob implements JobInterface
+{
+    public function fire($job, $data)
+    {
+        $storeCouponRepository = app()->make(StoreCouponRepository::class);
+        $coupons = $storeCouponRepository->getGiveCoupon($data['ids']);
+        foreach ($coupons as $coupon) {
+            if ($coupon->is_limited && 0 == $coupon->remain_count)
+                continue;
+            try {
+                $storeCouponRepository->sendCoupon($coupon, $data['uid'], 'buy');
+            } catch (\Exception $e) {
+                Log::info('自动发放买赠优惠券:' . $e->getMessage());
+            }
+        }
+        $job->delete();
+    }
+
+    public function failed($data)
+    {
+        // TODO: Implement failed() method.
+    }
+}

+ 39 - 0
ln/jobs/SendNewPeopleCouponJob.php

@@ -0,0 +1,39 @@
+<?php
+
+
+namespace ln\jobs;
+
+
+use app\common\repositories\store\coupon\StoreCouponRepository;
+use app\common\repositories\store\coupon\StoreCouponUserRepository;
+use app\common\repositories\user\UserRepository;
+use ln\interfaces\JobInterface;
+use think\facade\Log;
+
+class SendNewPeopleCouponJob implements JobInterface
+{
+
+    public function fire($job, $uid)
+    {
+        if (!app()->make(UserRepository::class)->exists($uid))
+            return $job->delete();
+
+        $storeCouponRepository = app()->make(StoreCouponRepository::class);
+        $newPeopleCoupon = $storeCouponRepository->newPeopleCoupon();
+        foreach ($newPeopleCoupon as $coupon) {
+            if ($coupon->is_limited && 0 == $coupon->remain_count)
+                continue;
+            try {
+                $storeCouponRepository->sendCoupon($coupon, $uid, 'new');
+            } catch (\Exception $e) {
+                Log::info('自定发放优惠券:' . $e->getMessage());
+            }
+        }
+        $job->delete();
+    }
+
+    public function failed($data)
+    {
+        // TODO: Implement failed() method.
+    }
+}

+ 38 - 0
ln/jobs/SendNewsJob.php

@@ -0,0 +1,38 @@
+<?php
+
+
+namespace ln\jobs;
+
+
+use app\common\repositories\user\UserRepository;
+use app\common\repositories\wechat\WechatUserRepository;
+use ln\interfaces\JobInterface;
+use ln\services\WechatService;
+use think\queue\Job;
+
+class SendNewsJob implements JobInterface
+{
+
+    public function fire($job, $data)
+    {
+        $wechatUserRepository = app()->make(WechatUserRepository::class);
+        [$id, $news] = $data;
+        $wechatUid = app()->make(UserRepository::class)->uidByWechatUserId(intval($id));
+
+        if (!$wechatUid || !($openId = $wechatUserRepository->idByOpenId((int)$wechatUid))) {
+            $job->delete();
+            return;
+        }
+        try {
+            WechatService::create()->staffTo($openId, WechatService::newsMessage($news));
+        } catch (\Exception $e) {
+            $job->failed($e);
+        }
+        $job->delete();
+    }
+
+    public function failed($data)
+    {
+        // TODO: Implement failed() method.
+    }
+}

+ 37 - 0
ln/jobs/SendSmsJob.php

@@ -0,0 +1,37 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+
+namespace ln\jobs;
+
+
+use ln\interfaces\JobInterface;
+use think\facade\Log;
+
+class SendSmsJob implements JobInterface
+{
+
+    public function fire($job, $data)
+    {
+        try {
+           // YunxinSmsService::sendMessage($data['tempId'], $data['id']);
+        } catch (\Exception $e) {
+            Log::info('发送短信失败' . var_export($data, 1) . $e->getMessage());
+        }
+        $job->delete();
+    }
+
+    public function failed($data)
+    {
+        // TODO: Implement failed() method.
+    }
+}

+ 37 - 0
ln/jobs/SendTemplateMessageJob.php

@@ -0,0 +1,37 @@
+<?php
+
+
+
+namespace ln\jobs;
+
+use ln\interfaces\JobInterface;
+use think\facade\Log;
+use think\queue\Job;
+use ln\services\WechatTemplateService;
+use app\common\repositories\user\UserRepository;
+use ln\services\WechatTemplateMessageService;
+
+class SendTemplateMessageJob implements JobInterface
+{
+
+    public function fire($job, $data)
+    {
+        $make = app()->make(WechatTemplateMessageService::class);
+        try{
+            $make->sendTemplate($data);
+        }catch (\Exception $e){
+            Log::info('公众号消息模板:' . $e->getMessage());
+        }
+        try{
+            $make->subscribeSendTemplate($data);
+        }catch (\Exception $e){
+            Log::info('小程序消息模板:' . $e->getMessage());
+        }
+        $job->delete();
+    }
+
+    public function failed($data)
+    {
+        // TODO: Implement failed() method.
+    }
+}

+ 27 - 0
ln/jobs/SpreadsheetExcelJob.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace ln\jobs;
+
+use ln\interfaces\JobInterface;
+use think\facade\Log;
+use think\queue\Job;
+use ln\services\ExcelService;
+
+class SpreadsheetExcelJob implements JobInterface
+{
+
+    public function fire($job, $data)
+    {
+        try{
+            app()->make(ExcelService::class)->getAll($data);
+        }catch (\Exception $e){
+            Log::info('导出文件:'.$data['type'].'; error : ' . $e->getMessage());
+        }
+        $job->delete();
+    }
+
+    public function failed($data)
+    {
+        // TODO: Implement failed() method.
+    }
+}

+ 41 - 0
ln/jobs/UpdateProductReplyJob.php

@@ -0,0 +1,41 @@
+<?php
+
+
+
+namespace ln\jobs;
+
+
+use app\common\repositories\store\product\ProductReplyRepository;
+use app\common\repositories\store\product\ProductRepository;
+use app\common\repositories\system\merchant\MerchantRepository;
+use ln\interfaces\JobInterface;
+
+class UpdateProductReplyJob implements JobInterface
+{
+
+    public function fire($job, $productId)
+    {
+        $productReplyRepository = app()->make(ProductReplyRepository::class);
+
+        $total = $productReplyRepository->productTotalRate($productId);
+        if (!$total) return $job->delete();
+        if(!$total['total_rate']) {
+            $rate = 5;
+        } else {
+            $rate = bcdiv($total['total_rate'], $total['total_count'], 1);
+        }
+        app()->make(ProductRepository::class)->update($productId, [
+            'rate' => $rate,
+            'reply_count' => $total['total_count']
+        ]);
+        $data = $productReplyRepository->getWhere(['product_id' => $productId], 'mer_id');
+        $merchantRate = $productReplyRepository->merchantTotalRate($data['mer_id']);
+        app()->make(MerchantRepository::class)->update($data['mer_id'], $merchantRate);
+        $job->delete();
+    }
+
+    public function failed($data)
+    {
+        // TODO: Implement failed() method.
+    }
+}

+ 45 - 0
ln/jobs/UserBrokerageLevelJob.php

@@ -0,0 +1,45 @@
+<?php
+
+
+
+
+namespace ln\jobs;
+
+
+use app\common\repositories\user\UserBrokerageRepository;
+use app\common\repositories\user\UserRepository;
+use ln\interfaces\JobInterface;
+use think\facade\Log;
+
+class UserBrokerageLevelJob implements JobInterface
+{
+    public function fire($job, $data)
+    {
+        try {
+            $user = app()->make(UserRepository::class)->get($data['uid']);
+            if ($user) {
+                $flag = true;
+                if ($data['type'] == 'spread_money') {
+                    $user->spread_pay_price = bcadd($user->spread_pay_price, $data['inc'], 2);
+                } else if ($data['type'] == 'spread_pay_num') {
+                    $user->spread_pay_count = bcadd($user->spread_pay_count, $data['inc'], 0);
+                } else {
+                    $flag = false;
+                }
+                if ($flag) {
+                    $user->save();
+                }
+            }
+            if ($user && $user->is_promoter) {
+                app()->make(UserBrokerageRepository::class)->inc($user, $data['type'], $data['inc']);
+            }
+        } catch (\Exception $e) {
+            Log::info('分销等级同步失败: ' . var_export($data, 1) . $e->getMessage());
+        }
+        $job->delete();
+    }
+
+    public function failed($data)
+    {
+    }
+}

+ 28 - 0
ln/jobs/UserHistoryJob.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace ln\jobs;
+
+
+use ln\interfaces\JobInterface;
+use think\facade\Log;
+use think\queue\Job;
+use app\common\repositories\store\product\ProductRepository;
+
+class UserHistoryJob implements JobInterface
+{
+
+    public function fire($job, $data)
+    {
+        try{
+            app()->make(ProductRepository::class)->checkProductByExtension();
+            $job->delete();
+        }catch (\Exception $exception){
+            Log::info(var_export($exception, 1));
+        }
+    }
+
+    public function failed($data)
+    {
+        // TODO: Implement failed() method.
+    }
+}

+ 39 - 0
ln/listens/AuthCancelPresellOrderListen.php

@@ -0,0 +1,39 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+
+namespace ln\listens;
+
+
+use app\common\repositories\store\order\PresellOrderRepository;
+use ln\interfaces\ListenerInterface;
+use ln\services\TimerService;
+use think\facade\Log;
+
+class AuthCancelPresellOrderListen extends TimerService implements ListenerInterface
+{
+
+    public function handle($event): void
+    {
+        $this->tick(1000 * 60 * 1.5, function () {
+            $presellOrderRepository = app()->make(PresellOrderRepository::class);
+            $ids = $presellOrderRepository->getTimeOutIds(date('Y-m-d H:i:s'));
+            foreach ($ids as $id) {
+                try {
+                    $presellOrderRepository->cancel($id);
+                } catch (\Exception $e) {
+                    Log::info('自动关闭尾款订单失败' . var_export($id, 1));
+                }
+            }
+        });
+    }
+}

+ 39 - 0
ln/listens/AuthTakeOrderListen.php

@@ -0,0 +1,39 @@
+<?php
+
+
+
+
+namespace ln\listens;
+
+
+use app\common\repositories\store\order\StoreOrderRepository;
+use app\common\repositories\store\order\StoreOrderStatusRepository;
+use ln\interfaces\ListenerInterface;
+use ln\jobs\OrderReplyJob;
+use ln\services\TimerService;
+use think\facade\Log;
+use think\facade\Queue;
+
+class AuthTakeOrderListen extends TimerService implements ListenerInterface
+{
+
+    public function handle($event): void
+    {
+        $this->tick(1000 * 60 * 60, function () {
+            $storeOrderStatusRepository = app()->make(StoreOrderStatusRepository::class);
+            $storeOrderRepository = app()->make(StoreOrderRepository::class);
+            request()->clearCache();
+            $timer = ((int)systemConfig('auto_take_order_timer')) ?: 15;
+            $time = date('Y-m-d H:i:s', strtotime("- $timer day"));
+            $ids = $storeOrderStatusRepository->getTimeoutDeliveryOrder($time);
+            foreach ($ids as $id) {
+                try {
+                    $storeOrderRepository->takeOrder($id);
+                    Queue::push(OrderReplyJob::class, $id);
+                } catch (\Exception $e) {
+                    Log::error('自动收货失败:' . $e->getMessage());
+                }
+            }
+        });
+    }
+}

+ 31 - 0
ln/listens/AutoCancelGroupOrderListen.php

@@ -0,0 +1,31 @@
+<?php
+
+namespace ln\listens;
+
+
+use app\common\repositories\store\order\StoreGroupOrderRepository;
+use crmeb\interfaces\ListenerInterface;
+use crmeb\services\TimerService;
+use think\facade\Log;
+
+class AutoCancelGroupOrderListen extends TimerService implements ListenerInterface
+{
+
+    public function handle($event): void
+    {
+        $this->tick(60000, function () {
+            $storeGroupOrderRepository = app()->make(StoreGroupOrderRepository::class);
+            request()->clearCache();
+            $timer = ((int)systemConfig('auto_close_order_timer')) ?: 15;
+            $time = date('Y-m-d H:i:s', strtotime("- $timer minutes"));
+            $groupOrderIds = $storeGroupOrderRepository->getTimeOutIds($time);
+            foreach ($groupOrderIds as $id) {
+                try {
+                    $storeGroupOrderRepository->cancel($id);
+                } catch (\Exception $e) {
+                    Log::info('自动关闭订单失败' . var_export($id, 1));
+                }
+            }
+        });
+    }
+}

+ 87 - 0
ln/listens/AutoClearIntegralListen.php

@@ -0,0 +1,87 @@
+<?php
+
+
+
+namespace ln\listens;
+
+
+use app\common\model\user\User;
+use app\common\repositories\store\IntegralRepository;
+use app\common\repositories\user\UserBillRepository;
+use app\common\repositories\user\UserRepository;
+use ln\interfaces\ListenerInterface;
+use ln\jobs\ClearUserIntegralJob;
+use ln\jobs\SendSmsJob;
+use ln\services\TimerService;
+
+use think\facade\Cache;
+use think\facade\Db;
+use think\facade\Queue;
+
+class AutoClearIntegralListen extends TimerService implements ListenerInterface
+{
+
+    public function handle($event): void
+    {
+        //TODO 自动解冻积分
+        $this->tick(1000 * 60 * 20, function () {
+            request()->clearCache();
+            if (!systemConfig('integral_status')) return;
+            $make = app()->make(IntegralRepository::class);
+            $end = $make->getTimeoutDay();
+            if ($end == strtotime(date('Y-m-d') . ' 00:00:00')) {
+                $start = $make->getInvalidDay();
+                $make->clearTimeoutDay();
+                if ($start) {
+                    $startTime = date('Y-m-d H:i:s', $start);
+                    $endTime = date('Y-m-d H:i:s', $end);
+                    User::getDB()->where('integral', '>', 0)->field('uid')->chunk(1000, function ($users) use ($startTime, $endTime) {
+                        foreach ($users as $user) {
+                            $uid = $user['uid'];
+                            Queue::later(1800, ClearUserIntegralJob::class, compact('uid', 'startTime', 'endTime'));
+                        }
+                        usleep(100);
+                    });
+                }
+            } else if ($end < strtotime('+15 day')) {
+                $make1 = app()->make(UserBillRepository::class);
+                $invalidDay = $make->getInvalidDay();
+                $cache = Cache::store('file');
+                $checkKey = 'integral_check';
+                if ($cache->has($checkKey)) {
+                    return;
+                }
+                $endTime = $end;
+                $startTime = date('Y-m-d H:i:s', $invalidDay);
+                User::getDB()->where('integral', '>', 0)->where('phone', '<>', '')->field('uid,phone,integral')->chunk(1000, function ($users) use ($endTime, $startTime, $invalidDay, $end, $make1, $cache) {
+                    foreach ($users as $user) {
+                        $cacheKey = 'integral_sms' . $user['uid'];
+                        if ($cache->has($cacheKey)) {
+                            continue;
+                        }
+                        $integral = $user['integral'];
+                        if ($integral > 0 && $invalidDay) {
+                            $validIntegral = $make1->validIntegral($user['uid'], $startTime, $endTime);
+                            if ($integral > $validIntegral) {
+                                $nextClearIntegral = (int)bcsub($integral, $validIntegral, 0);
+                                $cache->set($cacheKey, 1, 3600 * 24 * 20);
+                                Queue::push(SendSmsJob::class, [
+                                    'tempId' => 'INTEGRAL_INVALID',
+                                    'id' => [
+                                        'integral' => $nextClearIntegral,
+                                        'phone' => $user['phone'],
+                                        'date' => $endTime
+                                    ]
+                                ]);
+                                continue;
+                            }
+                        }
+                        $cache->set($cacheKey, 1, 3600 * 24 * 2);
+                    }
+                    usleep(200);
+                });
+                $cache->set($checkKey, 1, 3600 * 24 * 1);
+            }
+        });
+    }
+}

+ 28 - 0
ln/listens/AutoOrderProfitsharingListen.php

@@ -0,0 +1,28 @@
+<?php
+
+
+namespace ln\listens;
+
+
+use app\common\repositories\store\order\StoreOrderProfitsharingRepository;
+use ln\interfaces\ListenerInterface;
+use ln\jobs\OrderProfitsharingJob;
+use ln\services\TimerService;
+use think\facade\Queue;
+
+class AutoOrderProfitsharingListen extends TimerService implements ListenerInterface
+{
+
+    public function handle($event): void
+    {
+        $this->tick(1000 * 60 * 20, function () {
+            request()->clearCache();
+            $day = (int)systemConfig('sys_refund_timer') ?: 15;
+            $time = strtotime('-' . $day . ' day');
+            $ids = app()->make(StoreOrderProfitsharingRepository::class)->getAutoProfitsharing(date('Y-m-d H:i:s', $time));
+            foreach ($ids as $id) {
+                Queue::push(OrderProfitsharingJob::class, $id);
+            }
+        });
+    }
+}

+ 28 - 0
ln/listens/AutoOrderReplyListen.php

@@ -0,0 +1,28 @@
+<?php
+
+
+
+namespace ln\listens;
+
+
+use app\common\repositories\store\order\StoreOrderRepository;
+use ln\interfaces\ListenerInterface;
+use ln\jobs\OrderReplyJob;
+use ln\services\TimerService;
+use think\facade\Queue;
+
+class AutoOrderReplyListen extends TimerService implements ListenerInterface
+{
+
+    public function handle($event): void
+    {
+        $this->tick(1000 * 60 * 60, function () {
+            $storeOrderRepository = app()->make(StoreOrderRepository::class);
+            $time = date('Y-m-d H:i:s', strtotime('- 7 day'));
+            $ids = $storeOrderRepository->getFinishTimeoutIds($time);
+            foreach ($ids as $id) {
+                Queue::push(OrderReplyJob::class, $id);
+            }
+        });
+    }
+}

+ 32 - 0
ln/listens/AutoSendPayOrderSmsListen.php

@@ -0,0 +1,32 @@
+<?php
+
+
+
+namespace ln\listens;
+
+
+use app\common\repositories\store\order\StoreGroupOrderRepository;
+use ln\interfaces\ListenerInterface;
+use ln\jobs\SendSmsJob;
+use ln\services\TimerService;
+use think\facade\Queue;
+
+class AutoSendPayOrderSmsListen extends TimerService implements ListenerInterface
+{
+
+    public function handle($event): void
+    {
+        $this->tick(1000 * 60 * 5, function () {
+            $storeGroupOrderRepository = app()->make(StoreGroupOrderRepository::class);
+            $time = date('Y-m-d H:i:s', strtotime("- 10 minutes"));
+            $groupOrderIds = $storeGroupOrderRepository->getTimeOutIds($time, true);
+            foreach ($groupOrderIds as $id) {
+                Queue::push(SendSmsJob::class, [
+                    'tempId' => 'ORDER_PAY_FALSE',
+                    'id' => $id
+                ]);
+                $storeGroupOrderRepository->isRemind($id);
+            }
+        });
+    }
+}

+ 41 - 0
ln/listens/AutoUnLockBrokerageListen.php

@@ -0,0 +1,41 @@
+<?php
+
+
+
+namespace ln\listens;
+
+
+use app\common\repositories\user\UserBillRepository;
+use ln\interfaces\ListenerInterface;
+use ln\services\TimerService;
+use think\facade\Db;
+
+class AutoUnLockBrokerageListen extends TimerService implements ListenerInterface
+{
+
+    public function handle($event): void
+    {
+        //TODO 自动解冻佣金
+        $this->tick(1000 * 60 * 20, function () {
+            $userBill = app()->make(UserBillRepository::class);
+            request()->clearCache();
+            $timer = ((int)systemConfig('lock_brokerage_timer'));
+            $time = date('Y-m-d H:i:s', $timer ? strtotime("- $timer day") : time());
+            $bills = $userBill->getTimeoutBrokerageBill($time);
+            Db::transaction(function () use ($userBill, $bills) {
+                foreach ($bills as $bill) {
+                    if ($bill->number > 0) {
+                        $brokerage = bcsub($bill->number, $userBill->refundBrokerage($bill->link_id, $bill->uid), 2);
+                        if ($brokerage > 0) {
+                            $bill->user->brokerage_price = bcadd($bill->user->brokerage_price, $brokerage, 2);
+                            $bill->user->save();
+                        }
+                    }
+                    $bill->status = 1;
+                    $bill->balance = $bill->user->brokerage_price;
+                    $bill->save();
+                }
+            });
+        });
+    }
+}

+ 42 - 0
ln/listens/AutoUnLockIntegralListen.php

@@ -0,0 +1,42 @@
+<?php
+
+
+
+namespace crmeb\listens;
+
+
+use app\common\repositories\user\UserBillRepository;
+use ln\interfaces\ListenerInterface;
+use ln\services\TimerService;
+use Swoole\Timer;
+use think\facade\Db;
+
+class AutoUnLockIntegralListen extends TimerService implements ListenerInterface
+{
+
+    public function handle($event): void
+    {
+        //TODO 自动解冻积分
+        $this->tick(1000 * 60 * 20, function () {
+            $userBill = app()->make(UserBillRepository::class);
+            request()->clearCache();
+            $timer = ((int)systemConfig('integral_freeze'));
+            $time = date('Y-m-d H:i:s', $timer ? strtotime("- $timer day") : time());
+            $bills = $userBill->getTimeoutIntegralBill($time);
+            Db::transaction(function () use ($userBill, $bills) {
+                foreach ($bills as $bill) {
+                    if ($bill->number > 0) {
+                        $integral = bcsub($bill->number, $userBill->refundIntegral($bill->link_id, $bill->uid), 2);
+                        if ($integral > 0) {
+                            $bill->user->integral = bcadd($bill->user->integral, $integral, 2);
+                            $bill->user->save();
+                        }
+                    }
+                    $bill->status = 1;
+                    $bill->balance = $bill->user->integral;
+                    $bill->save();
+                }
+            });
+        });
+    }
+}

+ 45 - 0
ln/listens/AutoUnlockMerchantMoneyListen.php

@@ -0,0 +1,45 @@
+<?php
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+
+namespace crmeb\listens;
+
+
+use app\common\repositories\system\merchant\MerchantRepository;
+use app\common\repositories\user\UserBillRepository;
+use crmeb\interfaces\ListenerInterface;
+use crmeb\services\TimerService;
+use think\facade\Db;
+
+class AutoUnlockMerchantMoneyListen extends TimerService implements ListenerInterface
+{
+    public function handle($event): void
+    {
+        $this->tick(1000 * 60 * 20, function () {
+            request()->clearCache();
+            $userBill = app()->make(UserBillRepository::class);
+            $timer = ((int)systemConfig('mer_lock_time'));
+            $time = date('Y-m-d H:i:s', $timer ? strtotime("- $timer day") : time());
+            $bills = $userBill->getTimeoutMerchantMoneyBill($time);
+            $merchant = app()->make(MerchantRepository::class);
+            foreach ($bills as $bill) {
+                $money = bcsub($bill->number, $userBill->refundMerchantMoney($bill->link_id, $bill->type, $bill->mer_id), 2);
+                Db::transaction(function () use ($bill, $merchant, $money) {
+                    if ($money > 0) {
+                        $merchant->addMoney($bill->mer_id, $money);
+                    }
+                    $bill->status = 1;
+                    $bill->save();
+                });
+            }
+        });
+    }
+}

+ 31 - 0
ln/listens/CreateTimerListen.php

@@ -0,0 +1,31 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+
+namespace crmeb\listens;
+
+use crmeb\interfaces\ListenerInterface;
+use Swoole\Process;
+use Swoole\Server;
+
+class CreateTimerListen implements ListenerInterface
+{
+
+    public function handle($event): void
+    {
+        $process = new Process(function () {
+            app()->event->trigger('create_timer');
+        }, false, 0, true);
+
+        app()->make(Server::class)->addProcess($process);
+    }
+}

+ 38 - 0
ln/listens/ExcelFileDelListen.php

@@ -0,0 +1,38 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+namespace crmeb\listens;
+
+use app\common\repositories\store\ExcelRepository;
+use crmeb\services\TimerService;
+use Swoole\Timer;
+use think\facade\Log;
+use crmeb\interfaces\ListenerInterface;
+
+class ExcelFileDelListen extends TimerService implements ListenerInterface
+{
+    public function handle($event): void
+    {
+        $this->tick(1000 * 60 * 60, function () {
+            $make = app()->make(ExcelRepository::class);
+            $time = date('Y-m-d H:i:s', strtotime("-" . 3 . " day"));
+            $data = $make->getDelByTime($time);
+            foreach ($data as $id => $path) {
+                try {
+                    $make->del($id, $path);
+                } catch (\Exception $e) {
+                    Log::info('自动删除导出文件失败' . var_export($id, true));
+                }
+            }
+        });
+    }
+}

+ 32 - 0
ln/listens/GuaranteeCountListen.php

@@ -0,0 +1,32 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+namespace crmeb\listens;
+
+use crmeb\interfaces\ListenerInterface;
+use crmeb\jobs\GauaranteeCountJob;
+use crmeb\services\TimerService;
+use think\facade\Log;
+
+class GuaranteeCountListen extends TimerService implements ListenerInterface
+{
+    public function handle($event): void
+    {
+        $this->tick(1000 * 60 * 15, function () {
+            try {
+                queue(GauaranteeCountJob::class,[]);
+            } catch (\Exception $e) {
+                Log::info('自动更新保障服务数量失败' . var_export($e, true));
+            }
+        });
+    }
+}

+ 31 - 0
ln/listens/InitSwooleLockListen.php

@@ -0,0 +1,31 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+
+namespace crmeb\listens;
+
+
+use crmeb\interfaces\ListenerInterface;
+use Swoole\Lock;
+
+class InitSwooleLockListen implements ListenerInterface
+{
+
+    public function handle($event): void
+    {
+        $GLOBALS['_swoole_order_lock'] = [];
+        $locks = array_merge(['default'], config('swoole.locks'));
+        foreach ($locks as $lock) {
+            $GLOBALS['_swoole_order_lock'][$lock] = new Lock(SWOOLE_MUTEX);
+        }
+    }
+}

+ 40 - 0
ln/listens/MerchantApplyMentsCheckListen.php

@@ -0,0 +1,40 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+
+namespace crmeb\listens;
+
+use app\common\repositories\system\merchant\MerchantApplymentsRepository;
+use crmeb\services\TimerService;
+use Swoole\Timer;
+use think\facade\Log;
+use crmeb\interfaces\ListenerInterface;
+
+class MerchantApplyMentsCheckListen extends TimerService implements ListenerInterface
+{
+    public function handle($event): void
+    {
+        //申请状态: 0.平台未提交,-1.平台驳回,10.平台提交审核中,11.需用户操作 ,20.已完成,30.已冻结,40.驳回
+        $make =  app()->make(MerchantApplymentsRepository::class);
+
+        $this->tick(1000 * 60 * 30, function () use($make) {
+            $ret = $make->getSearch(['is_del' => 0])->where('status','in',[10,11,30])->select();
+            try {
+                foreach ($ret as $item) {
+                    $make->check($item['mer_id']);
+                }
+            } catch (\Exception $e) {
+                Log::info('自动查询分账商户审核失败' . date('Y-m-d H:i:s', time()));
+            }
+        });
+    }
+}

+ 35 - 0
ln/listens/ProductGroupStatusCheckListen.php

@@ -0,0 +1,35 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+
+namespace crmeb\listens;
+
+use crmeb\services\TimerService;
+use Swoole\Timer;
+use think\facade\Log;
+use crmeb\interfaces\ListenerInterface;
+use app\common\repositories\store\product\ProductGroupBuyingRepository;
+
+class ProductGroupStatusCheckListen extends TimerService implements ListenerInterface
+{
+    public function handle($event): void
+    {
+        $this->tick(1000 * 60, function () {
+            $make = app()->make(ProductGroupBuyingRepository::class);
+            try {
+                $make->checkStatus(null);
+            } catch (\Exception $e) {
+                Log::info('自动检测拼团结束失败' . date('Y-m-d H:i:s', time()));
+            }
+        });
+    }
+}

+ 46 - 0
ln/listens/ProductPresellStatusListen.php

@@ -0,0 +1,46 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+
+namespace crmeb\listens;
+
+use app\common\repositories\store\order\PresellOrderRepository;
+use app\common\repositories\store\product\ProductPresellRepository;
+use crmeb\jobs\CheckProductPresellJob;
+use crmeb\jobs\SendSmsJob;
+use crmeb\services\TimerService;
+use Swoole\Timer;
+use think\facade\Log;
+use crmeb\interfaces\ListenerInterface;
+use think\facade\Queue;
+
+class ProductPresellStatusListen extends TimerService implements ListenerInterface
+{
+    public function handle($event): void
+    {
+        $this->tick(1000 * 300, function () {
+            try {
+                Queue::push(CheckProductPresellJob::class, []);
+            } catch (\Exception $e) {
+                Log::info('自动更新失败');
+            }
+            try {
+                $ids = app()->make(PresellOrderRepository::class)->sendSmsIds(date('Y-m-d H'));
+                foreach ($ids as $id) {
+                    Queue::push(SendSmsJob::class, ['tempId' => 'PAY_PRESELL_CODE', 'id' => (int)$id]);
+                }
+            } catch (\Exception $e) {
+                Log::info('预售短信通知失败');
+            }
+        });
+    }
+}

+ 41 - 0
ln/listens/RefundOrderAgreeListen.php

@@ -0,0 +1,41 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+
+namespace crmeb\listens;
+
+use crmeb\services\TimerService;
+use Swoole\Timer;
+use think\facade\Log;
+use crmeb\interfaces\ListenerInterface;
+use app\common\repositories\store\order\StoreRefundOrderRepository;
+
+class RefundOrderAgreeListen extends TimerService implements ListenerInterface
+{
+    public function handle($event): void
+    {
+        $this->tick(1000 * 60 * 5, function () {
+            $make = app()->make(StoreRefundOrderRepository::class);
+            request()->clearCache();
+            $merAgree = systemConfig('mer_refund_order_agree') ?? 7;
+            $time = date('Y-m-d H:i:s', strtotime('-' . $merAgree . ' day'));
+            $data = $make->getTimeOutIds($time);
+            foreach ($data as $id) {
+                try {
+                    $make->adminRefund($id, 0);
+                } catch (\Exception $e) {
+                    Log::info('自动退款失败' . var_export($id, true));
+                }
+            }
+        });
+    }
+}

+ 44 - 0
ln/listens/SeckillTImeCheckListen.php

@@ -0,0 +1,44 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+
+namespace crmeb\listens;
+
+use crmeb\services\TimerService;
+use Swoole\Timer;
+use think\facade\Log;
+use crmeb\interfaces\ListenerInterface;
+use app\common\repositories\store\StoreSeckillActiveRepository;
+use app\common\repositories\store\product\ProductAssistRepository;
+use app\common\repositories\store\product\ProductGroupRepository;
+use app\common\repositories\store\product\ProductPresellRepository;
+
+class SeckillTImeCheckListen extends TimerService implements ListenerInterface
+{
+    public function handle($event): void
+    {
+        $this->tick(1000 * 60, function () {
+            $make = app()->make(StoreSeckillActiveRepository::class);
+            $make_1 = app()->make(ProductAssistRepository::class);
+            $make_2 = app()->make(ProductPresellRepository::class);
+            $make_3 = app()->make(ProductGroupRepository::class);
+            try {
+                $make->valActiveStatus();
+                $make_1->valActiveStatus();
+                $make_2->valActiveStatus();
+                $make_3->valActiveStatus();
+            } catch (\Exception $e) {
+                Log::info('自动检测秒杀结束失败' . date('Y-m-d H:i:s', time()));
+            }
+        });
+    }
+}

+ 164 - 0
ln/listens/SwooleTaskListen.php

@@ -0,0 +1,164 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+
+namespace crmeb\listens;
+
+
+use app\common\repositories\store\service\StoreServiceLogRepository;
+use app\common\repositories\system\admin\AdminLogRepository;
+use app\common\repositories\user\UserRepository;
+use app\common\repositories\user\UserVisitRepository;
+use app\webscoket\Manager;
+use crmeb\interfaces\ListenerInterface;
+use crmeb\jobs\SendNewsJob;
+use Swoole\Server;
+use Swoole\Server\Task;
+use think\facade\Queue;
+
+class SwooleTaskListen implements ListenerInterface
+{
+    /**
+     * @var Task
+     */
+    protected $task;
+
+    public function handle($task): void
+    {
+        request()->clearCache();
+        $this->task = $task;
+        if (method_exists($this, $task->data['type']))
+            $this->{$task->data['type']}($task->data['data']);
+    }
+
+    public function message(array $data)
+    {
+        $server = app()->make(Server::class);
+        $storeServiceLogRepository = app()->make(StoreServiceLogRepository::class);
+        $uid = is_array($data['uid']) ? $data['uid'] : [$data['uid']];
+        $except = $data['except'] ?? [];
+        if (!count($uid) && $data['type'] != 'user') {
+            $fds = $data['type'] == 'mer' ? Manager::merFd($data['mer_id'] ?? 0) : Manager::userFd(0);
+            foreach ($fds as $fd) {
+                if (!in_array($fd, $except) && $server->isEstablished($fd) && $server->exist($fd))
+                    $server->push((int)$fd, json_encode($data['data']));
+            }
+        } else {
+            foreach ($uid as $id) {
+                $fds = Manager::userFd(array_search($data['type'], Manager::USER_TYPE), $id);
+                foreach ($fds as $fd) {
+                    if (!in_array($fd, $except) && $server->isEstablished($fd) && $server->exist($fd) && ($data['from'] !== 'user' || $storeServiceLogRepository->getChat('fd_' . $fd, true) == $data['data']['data']['mer_id']))
+                        $server->push((int)$fd, json_encode($data['data']));
+                }
+            }
+        }
+    }
+
+    /**
+     * //TODO 用户给客服发送消息
+     *
+     * @param array $data
+     * @author xaboy
+     * @day 2020/6/15
+     */
+    public function chatToService(array $data)
+    {
+        $serviceLogRepository = app()->make(StoreServiceLogRepository::class);
+        if ($serviceLogRepository->getChat($data['uid'] . $data['data']['mer_id'], true) == $data['data']['uid']) {
+            $this->message([
+                'uid' => $data['uid'],
+                'type' => 'user',
+                'from' => 'user',
+                'data' => ['type' => 'chat', 'data' => $data['data']],
+                'except' => $data['except'] ?? []
+            ]);
+            $serviceLogRepository->serviceRead($data['data']['mer_id'], $data['data']['uid'], $data['data']['service_id']);
+        } else {
+            //TODO 客服消息提醒
+            Queue::push(SendNewsJob::class, [
+                $data['uid'],
+                [
+                    'title' => '收到用户【' . app()->make(UserRepository::class)->getUsername($data['data']['uid']) . '】的咨询消息,请及时查看',
+                    'description' => $data['data'],
+                    'url' => rtrim(systemConfig('site_url'), '/') . '/pages/chat/customer_list/chat?userId=' . $data['data']['uid'] . '&mer_id=' . $data['data']['mer_id'],
+                    'image' => rtrim(systemConfig('site_url'), '/') . '/static/service_wechat_msg.jpg'
+                ]
+            ]);
+        }
+    }
+
+    /**
+     * //TODO 客服给用户发送消息
+     * @param array $data
+     * @author xaboy
+     * @day 2020/6/15
+     */
+    public function chatToUser(array $data)
+    {
+        $serviceLogRepository = app()->make(StoreServiceLogRepository::class);
+        if ($serviceLogRepository->getChat($data['uid']) == $data['data']['mer_id']) {
+            $this->message([
+                'uid' => $data['uid'],
+                'type' => 'user',
+                'from' => 'service',
+                'data' => ['type' => 'chat', 'data' => $data['data']],
+                'except' => $data['except'] ?? []
+            ]);
+            $serviceLogRepository->userRead($data['data']['mer_id'], $data['data']['uid']);
+        } else {
+
+            //TODO 用户消息提醒
+            Queue::push(SendNewsJob::class, [
+                $data['uid'],
+                [
+                    'title' => '您收到新的消息,请及时查看',
+                    'description' => $data['data'],
+                    'url' => rtrim(systemConfig('site_url'), '/') . '/pages/chat/customer_list/chat?mer_id=' . $data['data']['mer_id'],
+                    'image' => rtrim(systemConfig('site_url'), '/') . '/static/service_wechat_msg.jpg'
+                ]
+            ]);
+        }
+    }
+
+    public function admin(array $data)
+    {
+        $this->message([
+                'uid' => $data['uid'] ?? [],
+                'type' => 'admin',
+                'data' => $data['data']
+            ]
+        );
+    }
+
+    public function merchant(array $data)
+    {
+        $this->message([
+                'uid' => $data['uid'] ?? [],
+                'mer_id' => $data['mer_id'],
+                'type' => 'mer',
+                'data' => $data['data']
+            ]
+        );
+    }
+
+    public function visit(array $data)
+    {
+        /** @var UserVisitRepository $make */
+        $make = app()->make(UserVisitRepository::class);
+        $make->create($data);
+    }
+
+    public function log(array $data)
+    {
+        app()->make(AdminLogRepository::class)->create($data['merId'], $data['result']);
+    }
+}

+ 26 - 0
ln/listens/SwooleWorkerExitListen.php

@@ -0,0 +1,26 @@
+<?php
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+
+namespace crmeb\listens;
+
+
+use crmeb\interfaces\ListenerInterface;
+use Swoole\Timer;
+
+class SwooleWorkerExitListen implements ListenerInterface
+{
+
+    public function handle($event): void
+    {
+        Timer::clearAll();
+    }
+}

+ 54 - 0
ln/listens/SyncBroadcastStatusListen.php

@@ -0,0 +1,54 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+
+namespace crmeb\listens;
+
+
+use app\common\repositories\store\broadcast\BroadcastGoodsRepository;
+use app\common\repositories\store\broadcast\BroadcastRoomRepository;
+use crmeb\interfaces\ListenerInterface;
+use crmeb\services\TimerService;
+use Swoole\Timer;
+use think\facade\Cache;
+use think\facade\Log;
+
+class SyncBroadcastStatusListen extends TimerService implements ListenerInterface
+{
+
+    public function handle($event): void
+    {
+        $this->tick(1000 * 60 * 5, function () {
+            $broadcastGoodsRepository = app()->make(BroadcastGoodsRepository::class);
+            try {
+                $broadcastGoodsRepository->syncGoodStatus();
+            } catch (\Exception $e) {
+                Log::error('同步直播商品:' . $e->getMessage());
+            }
+        });
+
+        $this->tick(1000 * 60 * 5, function () {
+            if (Cache::has('_sys_break_b_room')) {
+                return;
+            }
+            $broadcastRoomRepository = app()->make(BroadcastRoomRepository::class);
+            try {
+                $broadcastRoomRepository->syncRoomStatus();
+            } catch (\Exception $e) {
+                if ($e instanceof \EasyWeChat\Core\Exceptions\HttpException && $e->getCode() == '48001') {
+                    Cache::set('_sys_break_b_room', 1, 3600);
+                }
+                Log::error('同步直播间:' . $e->getMessage());
+            }
+        });
+    }
+}

+ 42 - 0
ln/listens/SyncSmsResultCodeListen.php

@@ -0,0 +1,42 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+
+namespace crmeb\listens;
+
+
+use app\common\repositories\system\sms\SmsRecordRepository;
+use crmeb\interfaces\ListenerInterface;
+use crmeb\services\TimerService;
+use crmeb\services\YunxinSmsService;
+use Swoole\Timer;
+
+class SyncSmsResultCodeListen extends TimerService implements ListenerInterface
+{
+
+    public function handle($event): void
+    {
+        $this->tick(1000 * 60 * 5, function () {
+            $smsRecordRepository = app()->make(SmsRecordRepository::class);
+            $time = date('Y-m-d H:i:s', strtotime("- 10 minutes"));
+            $ids = $smsRecordRepository->getTimeOutIds($time);
+            if (count($ids)) return;
+            $list = (array)YunxinSmsService::create()->getStatus($ids);
+            foreach ($list as $item) {
+                if (isset($item['id'])) {
+                    if ($item['resultcode'] == '' || $item['resultcode'] == null) $item['resultcode'] = 134;
+                    $smsRecordRepository->updateRecordStatus($item['id'], $item['resultcode']);
+                }
+            }
+        });
+    }
+}

+ 32 - 0
ln/listens/SyncSpreadStatusListen.php

@@ -0,0 +1,32 @@
+<?php
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+
+namespace crmeb\listens;
+
+
+use app\common\repositories\user\UserRepository;
+use crmeb\interfaces\ListenerInterface;
+use crmeb\services\TimerService;
+use crmeb\services\YunxinSmsService;
+use Swoole\Timer;
+
+class SyncSpreadStatusListen extends TimerService implements ListenerInterface
+{
+
+    public function handle($event): void
+    {
+        $this->tick(1000 * 10, function () {
+            request()->clearCache();
+            app()->make(UserRepository::class)->syncSpreadStatus();
+        });
+    }
+}

+ 17 - 0
ln/listens/pay/MealSuccessListen.php

@@ -0,0 +1,17 @@
+<?php
+
+
+
+namespace ln\listens\pay;
+
+use app\common\repositories\system\serve\ServeOrderRepository;
+use ln\interfaces\ListenerInterface;
+
+class MealSuccessListen implements ListenerInterface
+{
+
+    public function handle($data): void
+    {
+        app()->make(ServeOrderRepository::class)->paySuccess($data);
+    }
+}

+ 27 - 0
ln/listens/pay/OrderPaySuccessListen.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace crmeb\listens\pay;
+
+
+use app\common\repositories\store\order\StoreGroupOrderRepository;
+use app\common\repositories\store\order\StoreOrderRepository;
+use ln\interfaces\ListenerInterface;
+
+class OrderPaySuccessListen implements ListenerInterface
+{
+
+    public function handle($data): void
+    {
+        $orderSn = $data['order_sn'];
+        $is_combine = $data['is_combine'] ?? 0;
+        $groupOrder = app()->make(StoreGroupOrderRepository::class)->getWhere(['group_order_sn' => $orderSn]);
+        if (!$groupOrder || $groupOrder->paid == 1) return;
+        $orders = [];
+        if ($is_combine) {
+            foreach ($data['data']['sub_orders'] as $order) {
+                $orders[$order['out_trade_no']] = $order;
+            }
+        }
+        app()->make(StoreOrderRepository::class)->paySuccess($groupOrder, $is_combine, $orders);
+    }
+}

+ 27 - 0
ln/listens/pay/PresellPaySuccessListen.php

@@ -0,0 +1,27 @@
+<?php
+
+
+namespace ln\listens\pay;
+
+
+use app\common\repositories\store\order\PresellOrderRepository;
+use ln\interfaces\ListenerInterface;
+
+class PresellPaySuccessListen implements ListenerInterface
+{
+
+    public function handle($data): void
+    {
+        $orderSn = $data['order_sn'];
+        $is_combine = $data['is_combine'] ?? 0;
+        $order = app()->make(PresellOrderRepository::class)->getWhere(['presell_order_sn' => $orderSn]);
+        if (!$order || $order->paid == 1) return;
+        $orders = [];
+        if ($is_combine) {
+            foreach ($data['data']['sub_orders'] as $_order) {
+                $orders[$_order['out_trade_no']] = $_order;
+            }
+        }
+        app()->make(PresellOrderRepository::class)->paySuccess($order, $is_combine, $orders);
+    }
+}

+ 19 - 0
ln/listens/pay/UserRechargeSuccessListen.php

@@ -0,0 +1,19 @@
+<?php
+
+
+
+namespace ln\listens\pay;
+
+
+use app\common\repositories\user\UserRechargeRepository;
+use ln\interfaces\ListenerInterface;
+
+class UserRechargeSuccessListen implements ListenerInterface
+{
+
+    public function handle($data): void
+    {
+        $orderSn = $data['order_sn'];
+        app()->make(UserRechargeRepository::class)->paySuccess($orderSn);
+    }
+}

+ 169 - 0
ln/services/AccessTokenServeService.php

@@ -0,0 +1,169 @@
+<?php
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+namespace crmeb\services;
+
+use think\exception\ValidateException;
+use think\facade\Cache;
+
+/**
+ * Class AccessTokenServeService
+ * @package crmeb\services
+ */
+class AccessTokenServeService extends HttpService
+{
+    /**
+     * 配置
+     * @var string
+     */
+    protected $account;
+
+    /**
+     * @var string
+     */
+    protected $secret;
+
+    /**
+     * @var Cache|null
+     */
+    protected $cache;
+
+    /**
+     * @var string
+     */
+    protected $accessToken;
+
+    /**
+     * @var string
+     */
+    protected $cacheTokenPrefix = "_crmeb_plat";
+
+    /**
+     * @var string
+     */
+    protected $apiHost = 'http://sms.crmeb.net/api/';
+
+    /**
+     * 登录接口
+     */
+    const USER_LOGIN = "user/login";
+
+
+    /**
+     * AccessTokenServeService constructor.
+     * @param string $account
+     * @param string $secret
+     * @param Cache|null $cache
+     */
+    public function __construct(string $account, string $secret, $cache = null)
+    {
+        $this->account = $account;
+        $this->secret = $secret;
+    }
+
+    /**
+     * 获取配置
+     * @return array
+     */
+    public function getConfig()
+    {
+        return [
+            'account' => $this->account,
+            'secret' => $this->secret
+        ];
+    }
+
+    /**
+     * 获取缓存token
+     * @return mixed
+     * @throws \Psr\SimpleCache\InvalidArgumentException
+     */
+    public function getToken()
+    {
+        $accessTokenKey = md5($this->account . '_' . $this->secret . $this->cacheTokenPrefix);
+        $cacheToken = Cache::get($accessTokenKey);
+        if (!$cacheToken) {
+            $getToken = $this->getTokenFromServer();
+            Cache::set($accessTokenKey, $getToken['access_token'], 300);
+            $cacheToken = $getToken['access_token'];
+        }
+        $this->accessToken = $cacheToken;
+
+        return $cacheToken;
+
+    }
+
+    /**
+     * 从服务器获取token
+     * @return mixed
+     */
+    public function getTokenFromServer()
+    {
+        $params = [
+            'account' => $this->account,
+            'secret' => $this->secret,
+        ];
+        if (!$this->account || !$this->secret) {
+            throw new ValidateException('请先登录一号通平台!');
+        }
+        $response = $this->postRequest($this->get(self::USER_LOGIN), $params);
+        $response = json_decode($response, true);
+        if (!$response) {
+            throw new ValidateException('获取token失败');
+        }
+        if ($response['status'] === 200) {
+            return $response['data'];
+        } else {
+            throw new ValidateException($response['msg']);
+        }
+    }
+
+    /**
+     * 请求
+     * @param string $url
+     * @param array $data
+     * @param string $method
+     * @param bool $isHeader
+     * @return array|mixed
+     */
+    public function httpRequest(string $url, array $data = [], string $method = 'POST', bool $isHeader = true)
+    {
+        $header = [];
+        if ($isHeader) {
+            $this->getToken();
+            if (!$this->accessToken) {
+                throw new ValidateException('配置已更改或token已失效');
+            }
+            $header = ['Authorization:Bearer-' . $this->accessToken];
+        }
+
+        $res = $this->request($this->get($url), $method, $data, $header);
+        if (!$res) {
+            throw new ValidateException('平台错误:发生异常,请稍后重试');
+
+        }
+        $result = json_decode($res, true) ?: false;
+        if (!isset($result['status']) || $result['status'] != 200) {
+            throw new ValidateException(isset($result['msg']) ? '平台错误:' . $result['msg'] : '平台错误:发生异常,请稍后重试');
+        }
+        return $result['data'] ?? [];
+
+    }
+
+    /**
+     * @param string $apiUrl
+     * @return string
+     */
+    public function get(string $apiUrl = '')
+    {
+        return $this->apiHost . $apiUrl;
+    }
+}

+ 148 - 0
ln/services/AlipayService.php

@@ -0,0 +1,148 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+
+namespace crmeb\services;
+
+
+use crmeb\services\alipay\AlipayNotify;
+use Payment\Client;
+use Payment\Proxies\AlipayProxy;
+use think\exception\ValidateException;
+use think\facade\Route;
+
+class AlipayService
+{
+    /**
+     * @var Client
+     */
+    protected $application;
+
+    /**
+     * @var array
+     */
+    protected $config;
+
+    public function __construct(array $config)
+    {
+        $this->config = $config;
+        $this->application = new Client(Client::ALIPAY, $config);
+    }
+
+    public static function create($type = '')
+    {
+        return new self(self::getConfig($type));
+    }
+
+    public static function getConfig($type = '')
+    {
+        $config = systemConfig(['site_url', 'alipay_app_id', 'alipay_public_key', 'alipay_private_key', 'alipay_open']);
+        if (!$config['alipay_open']) throw new ValidateException('支付宝支付未开启');
+        $siteUrl = $config['site_url'];
+        return [
+            'app_id' => $config['alipay_app_id'],
+            'sign_type' => 'RSA2', // RSA  RSA2
+            'limit_pay' => [
+//                'balance',// 余额
+//                'moneyFund',// 余额宝
+//                'debitCardExpress',// 	借记卡快捷
+                //'creditCard',//信用卡
+                //'creditCardExpress',// 信用卡快捷
+                //'creditCardCartoon',//信用卡卡通
+                //'credit_group',// 信用支付类型(包含信用卡卡通、信用卡快捷、花呗、花呗分期)
+            ], // 用户不可用指定渠道支付当有多个渠道时用“,”分隔
+
+            // 支付宝公钥字符串
+            'ali_public_key' => $config['alipay_public_key'],
+            // 自己生成的密钥字符串
+            'rsa_private_key' => $config['alipay_private_key'],
+            'notify_url' => rtrim($siteUrl, '/') . Route::buildUrl('alipayNotify', ['type' => $type])->build(),
+            'return_url' => $siteUrl,
+        ];
+    }
+
+    public function qrPaymentPrepare($out_trade_no, $total_fee, $body, $detail = '')
+    {
+        $data = [
+            'body' => $detail ?: $body,
+            'subject' => $body,
+            'trade_no' => $out_trade_no,
+            'amount' => floatval($total_fee),
+            'time_expire' => time() + (15 * 60),
+            'return_params' => $out_trade_no,
+        ];
+        try {
+            $res = $this->application->pay(Client::ALI_CHANNEL_QR, $data);
+        } catch (\Exception $e) {
+            throw new ValidateException('支付宝支付错误返回:' . $e->getMessage());
+        }
+        return $res['qr_code'];
+    }
+
+    public function appPaymentPrepare($out_trade_no, $total_fee, $body, $detail = '')
+    {
+        $data = [
+            'body' => $detail ?: $body,
+            'subject' => $body,
+            'trade_no' => $out_trade_no,
+            'amount' => floatval($total_fee),
+            'time_expire' => time() + (15 * 60),
+            'goods_type' => 1,
+            'return_params' => $out_trade_no,
+        ];
+        try {
+            $res = $this->application->pay(Client::ALI_CHANNEL_APP, $data);
+        } catch (\Exception $e) {
+            throw new ValidateException('支付宝支付错误返回:' . $e->getMessage());
+        }
+        return $res;
+    }
+
+    public function wapPaymentPrepare($out_trade_no, $total_fee, $body, $return_url = '', $detail = '')
+    {
+        $data = [
+            'body' => $detail ?: $body,
+            'subject' => $body,
+            'trade_no' => $out_trade_no,
+            'amount' => floatval($total_fee),
+            'time_expire' => time() + (15 * 60),
+            'goods_type' => 1,
+            'return_params' => $out_trade_no,
+        ];
+        $config = AlipayProxy::$config;
+        if ($return_url)
+            $config->offsetSet('return_url', $return_url);
+        $data['quit_url'] = $config->get('return_url');
+        try {
+            $res = $this->application->pay(Client::ALI_CHANNEL_WAP, $data);
+        } catch (\Exception $e) {
+            throw new ValidateException('支付宝支付错误返回:' . $e->getMessage());
+        }
+        return $res;
+    }
+
+    public function payOrderRefund($trade_sn, array $data)
+    {
+        $data = [
+            'trade_no' => $trade_sn,
+            'refund_fee' => floatval($data['refund_price']),
+            'reason' => $data['refund_id'],
+            'refund_no' => $data['refund_id'],
+        ];
+        return $this->application->refund($data);
+    }
+
+    public function notify($type)
+    {
+        $this->application->notify(new AlipayNotify($type));
+    }
+}

+ 133 - 0
ln/services/ApiResponseService.php

@@ -0,0 +1,133 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+
+namespace crmeb\services;
+
+use think\contract\Arrayable;
+use think\response\Json;
+
+class ApiResponseService
+{
+    protected $response;
+
+    const DEFAULT_SUCCESS_MESSAGE = 'success';
+    const DEFAULT_FAIL_MESSAGE = 'fail';
+
+    const DEFAULT_SUCCESS_CODE = 200;
+    const DEFAULT_FAIL_CODE = 400;
+
+    public function __construct(Json $response)
+    {
+        $this->response = $response;
+    }
+
+    public function code(int $code)
+    {
+        $this->response->code($code);
+
+        return $this;
+    }
+
+    /**
+     * @param $data
+     * @return array|string|null
+     */
+    private function parseData($data)
+    {
+        if ($data instanceof Arrayable)
+            return $data->toArray();
+        else
+            return $data;
+    }
+
+    /**
+     * @param int $status
+     * @param string $message
+     * @param array|Arrayable|null $data
+     * @return Json
+     */
+    public function make(int $status, string $message, $data = null): Json
+    {
+        $content = compact('status', 'message');
+        if (!is_null($data))
+            $content['data'] = $this->parseData($data);
+        $this->response->data($content);
+        return $this->response;
+    }
+
+    /**
+     * @param string|array|Arrayable $message
+     * @param array|Arrayable|null $data
+     * @return Json
+     */
+    public function success($message = self::DEFAULT_SUCCESS_MESSAGE, $data = null)
+    {
+        $message = $this->parseData($message);
+        if (is_array($message)) {
+            $data = $message;
+            $message = self::DEFAULT_SUCCESS_MESSAGE;
+        } else {
+            $data = $this->parseData($data);
+        }
+        return $this->make(self::DEFAULT_SUCCESS_CODE, $message, $data);
+    }
+
+    /**
+     * @param string|array|Arrayable $message
+     * @param array|Arrayable|null $data
+     * @return Json
+     */
+    public function fail($message = self::DEFAULT_FAIL_MESSAGE, $data = null)
+    {
+        $message = $this->parseData($message);
+        if (is_array($message)) {
+            $data = $message;
+            $message = self::DEFAULT_FAIL_MESSAGE;
+        } else {
+            $data = $this->parseData($data);
+        }
+        return $this->make(self::DEFAULT_FAIL_CODE, $message, $data);
+    }
+
+    /**
+     * @param $status
+     * @param string|array|Arrayable $message
+     * @param array|Arrayable $result
+     * @return Json
+     */
+    public function status($status, $message, $result = [])
+    {
+        $message = $this->parseData($message);
+        if (is_array($message)) {
+            $result = $message;
+            $message = self::DEFAULT_SUCCESS_MESSAGE;
+        } else {
+            $result = $this->parseData($result);
+        }
+        return $this->make(self::DEFAULT_SUCCESS_CODE, $message, compact('status', 'result'));
+    }
+
+    /**
+     * @param string $type
+     * @param $data
+     * @return Json
+     * @author xaboy
+     * @day 2020/6/13
+     */
+    public function message(string $type, $data)
+    {
+        $this->response->data(compact('type', 'data'));
+        return $this->response;
+    }
+
+}

+ 72 - 0
ln/services/BaseExpress.php

@@ -0,0 +1,72 @@
+<?php
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+namespace crmeb\services;
+
+use crmeb\basic\BaseStorage;
+
+/**
+ * Class BaseExpress
+ * @package crmeb\basic
+ */
+abstract class BaseExpress extends BaseStorage
+{
+
+    /**
+     * access_token
+     * @var null
+     */
+    protected $accessToken = NULL;
+
+
+    public function __construct(string $name, AccessTokenServeService $accessTokenServeService, string $configFile)
+    {
+        parent::__construct($name, [], $configFile);
+        $this->accessToken = $accessTokenServeService;
+    }
+
+    /**
+     * 初始化
+     * @param array $config
+     * @return mixed|void
+     */
+    protected function initialize(array $config = [])
+    {
+//        parent::initialize($config);
+    }
+
+
+    /**
+     * 开通服务
+     * @return mixed
+     */
+    abstract public function open();
+
+    /**物流追踪
+     * @return mixed
+     */
+    abstract public function query(string $num, string $com = '');
+
+    /**电子面单
+     * @return mixed
+     */
+    abstract public function dump($merId,$data);
+
+    /**快递公司
+     * @return mixed
+     */
+//    abstract public function express($type, $page, $limit);
+
+    /**面单模板
+     * @return mixed
+     */
+    abstract public function temp(string $com);
+}

+ 62 - 0
ln/services/BaseProduct.php

@@ -0,0 +1,62 @@
+<?php
+// +----------------------------------------------------------------------
+// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
+// +----------------------------------------------------------------------
+// | Author: CRMEB Team <admin@crmeb.com>
+// +----------------------------------------------------------------------
+
+namespace crmeb\services;
+
+use crmeb\basic\BaseStorage;
+use crmeb\services\AccessTokenServeService;
+
+/**
+ * Class BaseProduct
+ * @package crmeb\basic
+ */
+abstract class BaseProduct extends BaseStorage
+{
+
+    /**
+     * access_token
+     * @var null
+     */
+    protected $accessToken = NULL;
+
+    /**
+     * BaseProduct constructor.
+     * @param string $name
+     * @param AccessTokenServeService $accessTokenServeService
+     * @param string $configFile
+     */
+    public function __construct(string $name, AccessTokenServeService $accessTokenServeService, string $configFile)
+    {
+        parent::__construct($name, [], $configFile);
+        $this->accessToken = $accessTokenServeService;
+    }
+
+    /**
+     * 初始化
+     * @param array $config
+     * @return mixed|void
+     */
+    protected function initialize(array $config = [])
+    {
+//        parent::initialize($config);
+    }
+
+    /**
+     * 开通服务
+     * @return mixed
+     */
+    abstract public function open();
+
+    /**复制商品
+     * @return mixed
+     */
+    abstract public function goods(string $url);
+}

Some files were not shown because too many files changed in this diff