王大坤 1 year ago
parent
commit
4122133d42
100 changed files with 23114 additions and 1 deletions
  1. 136 1
      README.md
  2. 12 0
      app/Auth.php
  3. 44 0
      app/Console/Commands/AnJuKePicker.php
  4. 243 0
      app/Console/Commands/DataSeeder.php
  5. 47 0
      app/Console/Commands/DongFangDiPicker.php
  6. 64 0
      app/Console/Commands/UserRepair.php
  7. 185 0
      app/Console/Commands/importMap.php
  8. 41 0
      app/Console/Kernel.php
  9. 45 0
      app/Exceptions/Handler.php
  10. 170 0
      app/Helper/AttachmentHelper.php
  11. 65 0
      app/Helper/JpushHelper.php
  12. 31 0
      app/Helper/LogHelper.php
  13. 196 0
      app/Helper/PayHelper.php
  14. 332 0
      app/Helper/function.php
  15. 42 0
      app/Http/Controllers/Controller.php
  16. 39 0
      app/Http/Controllers/V1/ArticleController.php
  17. 87 0
      app/Http/Controllers/V1/AttachmentController.php
  18. 262 0
      app/Http/Controllers/V1/AuthController.php
  19. 33 0
      app/Http/Controllers/V1/BaseConfigController.php
  20. 83 0
      app/Http/Controllers/V1/Controller.php
  21. 78 0
      app/Http/Controllers/V1/EmailController.php
  22. 60 0
      app/Http/Controllers/V1/IndexController.php
  23. 436 0
      app/Http/Controllers/V1/PayController.php
  24. 46 0
      app/Http/Controllers/V1/RegionController.php
  25. 54 0
      app/Http/Controllers/V1/SettingsController.php
  26. 68 0
      app/Http/Controllers/V1/SmsController.php
  27. 209 0
      app/Http/Controllers/V1/UserController.php
  28. 71 0
      app/Http/Kernel.php
  29. 21 0
      app/Http/Middleware/Authenticate.php
  30. 17 0
      app/Http/Middleware/EncryptCookies.php
  31. 17 0
      app/Http/Middleware/PreventRequestsDuringMaintenance.php
  32. 32 0
      app/Http/Middleware/RedirectIfAuthenticated.php
  33. 19 0
      app/Http/Middleware/TrimStrings.php
  34. 20 0
      app/Http/Middleware/TrustHosts.php
  35. 23 0
      app/Http/Middleware/TrustProxies.php
  36. 17 0
      app/Http/Middleware/VerifyCsrfToken.php
  37. 95 0
      app/Models/AccountLog.php
  38. 14 0
      app/Models/Article.php
  39. 21 0
      app/Models/BaseAttachment.php
  40. 82 0
      app/Models/BaseConfig.php
  41. 28 0
      app/Models/BaseDistrict.php
  42. 14 0
      app/Models/Help.php
  43. 11 0
      app/Models/MailCode.php
  44. 86 0
      app/Models/Order.php
  45. 11 0
      app/Models/Region.php
  46. 57 0
      app/Models/Setting.php
  47. 15 0
      app/Models/SmsRecord.php
  48. 61 0
      app/Models/User.php
  49. 19 0
      app/Models/UserFeedback.php
  50. 49 0
      app/Providers/AppServiceProvider.php
  51. 30 0
      app/Providers/AuthServiceProvider.php
  52. 21 0
      app/Providers/BroadcastServiceProvider.php
  53. 32 0
      app/Providers/EventServiceProvider.php
  54. 63 0
      app/Providers/RouteServiceProvider.php
  55. 222 0
      app/Services/AliYunIotServer.php
  56. 25 0
      app/Services/Api/ErrorMsgServive.php
  57. 112 0
      app/Services/Api/SortService.php
  58. 162 0
      app/Services/Api/UserService.php
  59. 170 0
      app/Services/AttachmentServer.php
  60. 197 0
      app/Services/Base/ErrorCode.php
  61. 104 0
      app/Services/EasyCtidService.php
  62. 291 0
      app/Services/FriendCircleService.php
  63. 85 0
      app/Services/Hero.php
  64. 277 0
      app/Services/JPushService.php
  65. 36 0
      app/Services/Location.php
  66. 19 0
      app/Services/Location/LocationProvider.php
  67. 27 0
      app/Services/Location/QQMapProvider.php
  68. 11 0
      app/Services/Payment/PaymentProvider.php
  69. 129 0
      app/Services/Payment/WeChatPay.php
  70. 14 0
      app/Services/RedisService.php
  71. 183 0
      app/Services/SmsServer.php
  72. 199 0
      app/Services/TencentImAccountService.php
  73. 218 0
      app/Services/TencentImFriendService.php
  74. 261 0
      app/Services/TencentImGroupService.php
  75. 58 0
      app/Services/TencentImService.php
  76. 566 0
      app/Services/ToolServer.php
  77. 60 0
      app/libs/PreInstall.php
  78. 59 0
      app/libs/cache/redis/Redis.php
  79. 66 0
      app/libs/helpers/Curl.php
  80. 421 0
      app/libs/helpers/Excel.php
  81. 388 0
      app/libs/helpers/Helper.php
  82. 111 0
      app/libs/helpers/LogHelper.php
  83. 52 0
      app/libs/helpers/Response.php
  84. 38 0
      app/libs/middleware/ApiLogs.php
  85. 25 0
      app/libs/middleware/CheckAuth.php
  86. 20 0
      app/libs/preinstall/database.php
  87. 9 0
      app/libs/preinstall/redis.php
  88. 8 0
      app/libs/preinstall/wechat.php
  89. 139 0
      app/libs/wechat/auth/Gateways/Base.php
  90. 220 0
      app/libs/wechat/auth/Gateways/General.php
  91. 205 0
      app/libs/wechat/auth/Gateways/Mini.php
  92. 41 0
      app/libs/wechat/auth/WeChat.php
  93. 53 0
      artisan
  94. 55 0
      bootstrap/app.php
  95. 2 0
      bootstrap/cache/.gitignore
  96. 90 0
      composer.json
  97. 12803 0
      composer.lock
  98. 360 0
      config/admin.php
  99. 232 0
      config/api.php
  100. 237 0
      config/app.php

+ 136 - 1
README.md

xqd
@@ -1,2 +1,137 @@
-# new_api
 
+### 项目概要
+该项目为  思维定制基础API标准 
+
+接口文档https://console-docs.apipost.cn/preview/ec5add2de84f3f15/7f7e45104ec643f0
+
+技术说明 https://docs.qq.com/doc/DVUxlS1FrWVJYcmtG 
+
+```
+
+## 技术架构
+
+* PHP >8.0.0
+* MySQL >5.6.0
+* Nginx >1.12.0
+* Laravel 8.x (8.0)
+* PHP扩展安装fileinfo, redis, 删除禁用函数 putenv,proc_open
+##安装
+1. git clone 到本地
+2. 执行 composer install (导入sql创建好数据库)
+3. 配置 .env 中数据库连接信息,没有.env请复制.env.example命名为.env
+4. 执行 php artisan key:generate
+执行 php artisan migrate (可忽略)
+执行 php artisan db:seed (可忽略)
+
+## Dcat-Admin 资源发布
+```
+$ php artisan admin:publish
+$ php artisan admin:install
+```
+
+
+## 创建 JWT secret
+```
+$ php artisan jwt:secret
+
+```
+
+## 安装第三方组件
+
+>注意:可以自定义 [`composer`](https://mirrors.aliyun.com/composer/) 镜像,加快拉取速度
+
+```
+composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
+
+```
+
+## 短信
+$result = SmsService::send($request->mobile, $request->event, [], $user);
+## 邮箱
+1. Mail::raw($notice, function ($message) use ($email) {
+2. $message->subject(trans('api.MAILBOX_VALIDATION_NOTIFICATION'));
+    $message->to($email);
+3. 邮箱配置
+   MAIL_MAILER=smtp
+   MAIL_HOST=ssl://smtp.163.com
+   MAIL_PORT=465
+   MAIL_USERNAME=youxiang@163.com
+   MAIL_PASSWORD=VIBTDHQAYLKJYIGC
+   MAIL_ENCRYPTION=
+   MAIL_FROM_ADDRESS=youxiang@163.com
+   MAIL_FROM_NAME="${APP_NAME}"
+});
+## 文件上传
+$api->post('attachment/upload', ['uses' => 'AttachmentController@upload',]);
+
+### 创建目录
+
+> 注意:git clone 从仓库拉取的代码,可能会存在 storage 目录缺失的问题,需要手动创建
+
+```
+$ mkdir -p storage/{app,debugbar,framework,logs}
+$ mkdir -p storage/framework/{cache,sessions,testing,views}
+
+```
+
+```
+$ chmod -R 777 storage bootstrap/cache
+```
+
+## 创建 storage 到 public 的软链接
+
+> 注意:如果是 Docker 环境,此步骤必须在容器内执行
+
+```
+$ php artisan storage:link
+```
+
+### 数据迁移
+
+> 注意:如果是 Docker 环境,此步骤必须在容器内执行
+> 注意:原始SQL 迁移文件不在本项目
+
+```
+$ php artisan migrate
+```
+
+## 其它第三方包 PHP 扩展包视频教程 https://learnku.com/courses/laravel-package/2019
+
+# Dcat-admin-packages 开源扩展包列表
+
+- [changzhong/extension-iframe-tabs](https://github.com/changzhong/extension-iframe-tabs) dcat-admin iframe多窗口扩展
+- [celaraze/mellita](https://github.com/IronnMan/mellita) Mellita 可以使任何 Laravel 应用具备 SaaS 能力,只需要简单的 composer 安装以及极其少量的改动。无论你是打算使用 Laravel 项目开发新项目,还是将已经付出努力的项目转化为 SaaS 架构,都可以轻松实现。
+- [deatil/dcat-login-captcha](https://github.com/deatil/dcat-login-captcha) Dcat-admin 登陆验证码
+- [guanguans/dcat-login-captcha](https://github.com/guanguans/dcat-login-captcha) Dcat-admin 登录验证码
+- [deatil/dcat-form-media](https://github.com/deatil/dcat-form-media) Dcat-admin 表单媒体拓展
+- [jqhph/dcat-admin-ueditor](https://github.com/jqhph/dcat-admin-ueditor) Ueditor是一个Dcat Admin的扩展包,集成百度在线编辑器,支持附件上传等功能。
+- [celaraze/dcat-extension-plus](https://github.com/celaraze/dcat-extension-plus) 为 DcatAdmin 后台添加增强配置的功能。修改过程利用 DcatAdmin 自带的 admin_setting() 方法实现,不会硬编码修改任何 config 文件或者 .env 文件。
+- [super-eggs/dcat-distpicker](https://github.com/super-eggs/dcat-distpicker) Distpicker是一个中国省市区三级联动选择组件,这个包是基于 Distpicker 的 dcat-admin 扩展,用来将 Distpicker 集成进 dcat-admin的表单中。
+- [lty5240/dcat-easy-sku](https://github.com/lty5240/dcat-easy-sku) 基于Dcat Admin的Sku插件
+- [Abbotton/dcat-admin-setting-extension](https://github.com/Abbotton/dcat-admin-setting-extension) Dcat Admin系统配置插件
+- [dcat-admin/form-step](https://github.com/dcat-admin/form-step) Dcat Admin 分步表单扩展
+- [mosiboom/dcat-iframe-tab](https://github.com/mosiboom/dcat-iframe-tab) 这个扩展包基于laravel框架和dcat-admin框架,为解决dcat-admin没有自带兼容iframe架构。使用此扩展包可以构建出一个iframe架构并带有标签页管理的后台框架。
+- [tanmotop/dcat-admin-permission-plus](https://github.com/tanmotop/dcat-admin-permission-plus) dcat-admin extension permission-plus
+- [ArrowJustDoIt/dcat-admin-crontab-extension](https://github.com/ArrowJustDoIt/dcat-admin-crontab-extension) Crontab是一个dcat-admin后台的定时任务扩展插件,你可以通过此插件定时执行shell、sql以及访问指定链接
+- [Lichmaker/ladder-admin](https://github.com/Lichmaker/ladder-admin) 基于dcat-admin编写的v2ray管理后台
+- [dcat-admin/operation-log](https://github.com/dcat-admin/operation-log) Dcat Admin 操作日志扩展
+- [Sparkinzy/dcat-kindeditor](https://github.com/Sparkinzy/dcat-kindeditor) dcat-admin扩展kindeditor5.0.1
+- [asundust/dcat-auth-captcha](https://github.com/asundust/dcat-auth-captcha) dcat-admin登陆 滑动验证插件 多平台支持
+- [jyiL/log-viewer](https://github.com/jyiL/log-viewer) 错误日志查看
+- [nealwon/dcat-admin-echarts](https://github.com/nealwon/dcat-admin-echarts) dcat admin echarts extension
+- [nivin-studio/dcat-ext-taskscheduling](https://github.com/nivin-studio/dcat-ext-taskscheduling) 一个Dcat Admin的定时任务可视化管理的插件
+- [Death-Satan/dcat-env](https://github.com/Death-Satan/dcat-env) Dcat Admin Extension edit env file
+- [puzzle9/dact-admin-wang-editor](https://github.com/puzzle9/dact-admin-wang-editor) Dcat Admin扩展 - WangEditor
+- [dairidong/dcat-media-manager](https://github.com/dairidong/dcat-media-manager) Dcat Admin的文件管理扩展(源于 Laravel Admin 的相同扩展)
+- [TyrantG/dcat-admin-braft-editor](https://github.com/TyrantG/dcat-admin-braft-editor) Dcat Admin扩展 - Braft Editor编辑器
+- [dcat-phper/dcat-extension-gallery](https://gitee.com/dcat-phper/dcat-extension-gallery) dcat-admin 预览图片扩展,支持多图,放大、缩小、旋转等
+- [slowlyo/dcat-amis](https://gitee.com/slowlyo/dcat-amis) Dcat Admin 的 amis组件扩展, 可以在 dcat 中轻松使用 amis 组件, 让你开发自定义页面变得更简单
+- [sparkinzy/dcat-distpicker](https://github.com/Sparkinzy/dcat-distpicker) Distpicker 是一个中国省市区三级联动选择组件
+- [sparkinzy/dcat-extension-client](https://github.com/Sparkinzy/dcat-extension-client) Dcat Admin 非官方应用市场,让扩展不再难找
+
+# Dcat-admin 应用
+- [nxcrm](https://github.com/shebaoting/nxcrm) 基于laravel的客户管理系统(CRM)
+- [laravel-box](https://gitee.com/dcat-phper/laravel-box) 整合laravel、dcat-admin、jwt、iseed、easy-wechat 、laravel-debugbar 等后台应用的开发包。管理后台开发所需的都在这里,省去配置步骤,开箱即用。
+- [chemex](https://github.com/celaraze/chemex) 咖啡壶是一个免费、开源、高效且漂亮的运维资产管理平台。
+- [Discover](https://github.com/youyingxiang/Discover) Discover 是一个基于 Dcat-admin 开发的进销存系统
+- [saas-skeleton](https://github.com/Abbotton/saas-skeleton) 基于 Laravel & Dcat Admin 构建的 SAAS 后台脚手架

+ 12 - 0
app/Auth.php

xqd
@@ -0,0 +1,12 @@
+<?php
+
+namespace App;
+
+class Auth
+{
+    public static $user     = null;
+    public static $userId   = null;
+
+    public static $admin    = null;
+    public static $adminId  = null;
+}

+ 44 - 0
app/Console/Commands/AnJuKePicker.php

xqd
@@ -0,0 +1,44 @@
+<?php
+
+namespace App\Console\Commands;
+
+use Illuminate\Console\Command;
+
+class AnJuKePicker extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'picker:anjuke';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = 'Command description';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return mixed
+     */
+    public function handle()
+    {
+        //
+        $picker = new \App\Http\Controllers\Service\AnJuKePicker();
+        $picker->startPick();
+    }
+}

+ 243 - 0
app/Console/Commands/DataSeeder.php

xqd
@@ -0,0 +1,243 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\Model\AccountInfo;
+use App\Model\Appeals;
+use App\Model\BaseArea;
+use App\Model\WithdrawInfo;
+use App\Model\DeliverInfo;
+use App\Model\DeviceInfo;
+use App\Model\DeviceToUser;
+use App\Model\RechargeInfo;
+use App\Model\TransportInfo;
+use App\Model\UserInfo;
+use Faker\Generator;
+use Illuminate\Console\Command;
+
+/**
+ * 数据填充器
+ * Class DataSeeder
+ * @package App\Console\Commands
+ */
+
+class DataSeeder extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'data:seeder';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = 'Command description';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return mixed
+     */
+    public function handle()
+    {
+        //用户表数据填充300条
+
+
+
+        $faker_zh = \Faker\Factory::create('zh_CN');
+        $faker_en = \Faker\Factory::create();
+
+
+
+
+
+
+
+        $cities = BaseArea::where('pid','510117')->with(['communities'=>function($query){
+            $query->select(['area_id','id']);
+        }])->get(['id'])->toArray();
+        $area_ids = [];
+        $communities_ids =[];
+        $city_max = 0;
+        $com_max = 0;
+         foreach ($cities as $city){
+             $area_ids[]= $city['id'];
+             $city_max ++;
+             foreach ($city['communities'] as $community){
+                 $communities_ids[] = $community['id'];
+                 $com_max++;
+             }
+
+        }
+
+
+
+
+
+
+
+
+            $us = UserInfo::all(['id','role'])->toArray();
+            $user_common = [];
+            $user_agent = [];
+            $user_agent_user = [];
+            foreach ($us as $u){
+                if ($u['role'] == UserInfo::Role_Common)
+                    $user_common[] = $u['id'];
+                if ($u['role'] == UserInfo::Role_Agent)
+                    $user_agent[] = $u['id'];
+                if ($u['role'] == UserInfo::Role_Agent_User)
+                    $user_agent_user[] = $u['id'];
+            }
+
+            $us = DeviceInfo::all(['id'])->toArray();
+
+            $device_ids =[];
+            $device_max = 0;
+            foreach ($us as $u){
+                $device_max ++;
+                $device_ids[] = $u['id'];
+            }
+
+
+        for ($i = 0;$i<2000;$i++){
+            echo "第{$i}个投放记录开始创建\r\n";
+            $tempRow = [];
+            $tempRow['device_id'] = $device_ids[rand(0,$device_max-1)];
+            $tempRow['user_id'] = $user_common[rand(0,count($user_common)-1)];
+            $tempRow['no'] = strtoupper(uniqid());
+            $tempRow['weight'] = rand(1,99999);
+            $tempRow['money'] = rand(0,1000);
+            $tempRow['finished_at'] = date('Y-m-d H:i:s');
+            $tempRow['status'] = rand(1,3);
+            $tempRow['created_at'] = date('Y-m-d H:i:s',strtotime("-".rand(1,365)." days"));
+            DeliverInfo::create($tempRow);
+        }
+
+
+
+
+
+        for ($i = 0;$i<2000;$i++){
+            echo "第{$i}个收运记录开始创建\r\n";
+            $tempRow = [];
+            $tempRow['device_id'] = $device_ids[rand(0,$device_max-1)];
+            $tempRow['user_id'] = $user_agent_user[rand(0,count($user_agent_user)-1)];
+            $tempRow['no'] = strtoupper(uniqid());
+            $tempRow['weight'] = rand(1,999999);
+            $tempRow['money'] = rand(0,1000);
+            $tempRow['created_at'] = date('Y-m-d H:i:s',strtotime("-".rand(1,365)." days"));
+            $tempRow['status'] = rand(1,2);
+            TransportInfo::create($tempRow);
+        }
+
+        $banks = array(
+            '渤海银行',
+            '广发银行',
+            '国家开发银行',
+            '恒丰银行',
+            '华夏银行',
+            '交通银行',
+            '平安银行',
+            '上海浦东发展银行',
+            '兴业银行',
+            '招商银行',
+            '浙商银行',
+            '中国工商银行',
+            '中国光大银行',
+            '中国建设银行',
+            '中国民生银行',
+            '中国农业银行',
+            '中国银行',
+            '中国邮政储蓄银行',
+            '中信银行',
+        );
+
+
+        for ($i = 0;$i<2000;$i++){
+            echo "第{$i}个提现记录开始创建\r\n";
+            $tempRow = [];
+            $tempRow['user_id'] = $user_common[rand(0,count($user_common)-1)];
+            $tempRow['order_no'] = strtoupper(uniqid());
+            $tempRow['money'] = rand(0,3000);
+            $tempRow['poundage'] = rand(0,200);
+            $tempRow['pay_money'] = $tempRow['money']-$tempRow['poundage'];
+            $tempRow['paid_at'] = date('Y-m-d H:i:s');
+            $tempRow['bank_card'] = $faker_zh->phoneNumber;
+            $tempRow['bank_name'] = $banks[rand(0,count($banks)-1)];
+            $tempRow['name'] = $faker_zh->name;
+            $tempRow['mobile'] = $faker_zh->phoneNumber;
+            $tempRow['ali_account'] = $faker_zh->phoneNumber;
+            $tempRow['ali_name'] = $faker_zh->name;
+            $tempRow['status'] = rand(0,1);
+            $tempRow['type'] = rand(0,2);
+            $tempRow['created_at'] = date('Y-m-d H:i:s',strtotime("-".rand(1,365)." days"));
+            $tempRow['reason'] = $faker_en->company;
+            WithdrawInfo::create($tempRow);
+        }
+
+        for ($i = 0;$i<2000;$i++){
+            echo "第{$i}个充值记录开始创建\r\n";
+            $tempRow = [];
+            $tempRow['user_id'] =  $user_common[rand(0,count($user_common)-1)];
+            $tempRow['order_no'] = strtoupper(uniqid());
+            $tempRow['money'] = rand(0,1000);
+            $tempRow['type'] =rand(0,1);
+            $tempRow['created_at'] = date('Y-m-d H:i:s',strtotime("-".rand(1,365)." days"));
+
+            $tempRow['finished_at'] = date('Y-m-d H:i:s',strtotime("-".rand(1,365)." days"));
+            $tempRow['status'] = rand(0,1);
+            RechargeInfo::create($tempRow);
+        }
+
+
+
+        for ($i = 0;$i<2000;$i++){
+            echo "第{$i}个余额记录开始创建\r\n";
+            $tempRow = [];
+            $tempRow['user_id'] =  $user_common[rand(0,count($user_common)-1)];
+            $tempRow['method'] = rand(1,6);
+            $s = [-1,1];
+            $tempRow['admin_id'] = $s[rand(0,1)];
+            $tempRow['balance'] = rand(10,1000);
+            $tempRow['money'] =rand(10,1000);
+            $tempRow['detail'] = $faker_en->text;
+
+            AccountInfo::create($tempRow);
+        }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    }
+}

+ 47 - 0
app/Console/Commands/DongFangDiPicker.php

xqd
@@ -0,0 +1,47 @@
+<?php
+
+namespace App\Console\Commands;
+
+use Illuminate\Console\Command;
+
+class DongFangDiPicker extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'picker:dfd';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = '懂房帝';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return mixed
+     */
+    public function handle()
+    {
+        //
+        $dfd = new \App\Http\Controllers\Service\DongFangDiPicker();
+        $dfd->startPick();
+
+
+
+    }
+}

+ 64 - 0
app/Console/Commands/UserRepair.php

xqd
@@ -0,0 +1,64 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\Model\AccountInfo;
+use App\Model\DeliverInfo;
+use App\Model\RechargeInfo;
+use App\Model\UserInfo;
+use Illuminate\Console\Command;
+
+class UserRepair extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'user:reset';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = '测试用户数据重置';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return mixed
+     */
+    public function handle()
+    {
+        //TODO 10465 宣传员展示不删除
+        $ids = [9997,10025,10318,10340,10024,10572,10517,10690,10538,10533,10044,10679,10347,10142,10190,10329,11036,11460,10004,10045,10446,12000,12031];
+        foreach ($ids as $id){
+            $user = UserInfo::where(['id'=>$id])->first();
+            if(empty($user)){continue;}
+            $user_arr = [];
+            //echo '用户id:'.$id.'  角色'.$user->role.PHP_EOL;
+            if(!in_array($user->role,$user_arr)){
+                $user_arr[] = $user->role;
+            }
+            DeliverInfo::where(['user_id'=>$id])->delete();
+            AccountInfo::where(['user_id'=>$id])->delete();
+            RechargeInfo::where(['user_id'=>$id])->delete();
+            $data['account']=0;
+            if($user->role == 2){
+                $data['agent_account'] = 0;
+            }
+            UserInfo::where(['id'=>$id])->update($data);
+        }
+    }
+}

+ 185 - 0
app/Console/Commands/importMap.php

xqd
@@ -0,0 +1,185 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\Model\BaseArea;
+use App\Model\BaseAreaNew;
+use Faker\Provider\Base;
+use Illuminate\Console\Command;
+use Overtrue\Pinyin\Pinyin;
+
+class importMap extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'import:map';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = 'Command description';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return mixed
+     */
+    public function handle()
+    {
+    //    $data = json_decode(file_get_contents(public_path('docs/maps.txt')),true);
+
+        $total = [];
+
+//        foreach ($data['plist']['dict']['key'] as $value){
+//            $prefix = substr($value,0,6);
+//            $name = str_replace($prefix,'',$value);
+//            $total[substr($prefix,0,2)] = ['pid'=>$prefix,'name'=>$name];
+//        }
+//
+//
+//
+//
+//
+//
+//     foreach ($data['plist']['dict']['dict'] as $datum){
+//             foreach ($datum['key'] as $vv){
+//                     $g2_prefix = substr($vv,0,6);
+//                     $g2_prefix_half = substr($vv,0,2);
+//                     $name = str_replace($g2_prefix,'',$vv);
+//                     $total[substr($g2_prefix,0,4)] = ['pid'=>$g2_prefix,'name'=>$name];
+//         }
+//     }
+//
+//
+//        foreach ($data['plist']['dict']['dict'] as $datum){
+//            foreach ($datum['array'] as $vv){
+//                foreach ($vv['string'] as $vvv){
+//
+//                    $g2_prefix = substr($vvv,0,6);
+//                    $g2_prefix_half = substr($vvv,0,2);
+//                    $g2_prefix_3 = substr($vvv,0,4);
+//                    $name = str_replace($g2_prefix,'',$vvv);
+//                    $total[substr($g2_prefix,0,5)] = ['pid'=>$g2_prefix,'name'=>$name];
+//
+//                }
+//            }
+//        }
+//
+//
+//
+//
+//
+//
+//
+//        $res = BaseAreaNew::find($g2_prefix);
+//        if ($res)
+//            continue;
+//        $id = BaseAreaNew::insert([
+//            'name'=>$name,
+//            'pid'=>$total[$g2_prefix_3]['pid'],
+//            'id'=>$g2_prefix,
+//            'short_name'=>$name,
+//            'grade'=>3,
+//            'city_code'=>0,
+//            'zip_code'=>0,
+//            'merger_name'=>$total[$g2_prefix_half]['name'].','.$total[$g2_prefix_3]['name'].','.$name,
+//            'lng'=>0,
+//            'lat'=>0,
+//            'pinyin'=>'',
+//        ]);
+//
+//
+//     $dd = scandir(public_path('docs/town'));
+//
+//     $arr = array_map(function ($v){
+//         return str_replace('.json','',$v);
+//     },$dd);
+//     unset($dd);
+//     $ds = BaseAreaNew::whereIn('id',$arr)->get(['id','name','merger_name']);
+//
+//
+//     foreach ($ds as $d){
+//         $dds = json_decode(file_get_contents(public_path('docs/town/'.$d->id.'.json')),true);
+//         foreach ($dds as $k =>$v){
+//
+//             $res = BaseAreaNew::find($k);
+//        if ($res)
+//            continue;
+//        $id = BaseAreaNew::insert([
+//            'name'=>$v,
+//            'pid'=>$d->id,
+//            'id'=>$k,
+//            'short_name'=>$v,
+//            'grade'=>4,
+//            'city_code'=>0,
+//            'zip_code'=>0,
+//            'merger_name'=>$d->merger_name.','.$v,
+//            'lng'=>0,
+//            'lat'=>0,
+//            'pinyin'=>'',
+//        ]);
+//
+//        echo "{$v}:{$k} ³É¹¦µ¼ÈëÁË£¡\r\n";
+//
+//         }
+
+
+        $i = 0;
+        $maps =  BaseArea::where('relation','')->get(['pid','id']);
+
+        foreach ($maps as $map) {
+            $i++;
+            echo "Deal:{$i}\r\n";
+            $relation = ["1"];
+            $pid = $map->pid;
+            if ($pid == 1)
+                $map->update(['relation' => implode(',',$relation)]);
+
+            $relation[] = $map->id;
+            while ($pid!=1){
+                $area = BaseArea::find($pid);
+                if ($area){
+                    $relation[] = $pid;
+                    $pid = $area->pid;
+                }
+            }
+            $str = implode(',',$relation);
+
+            $map->update(['relation' => $str]);
+            echo "{$str}\r\n";
+
+
+
+
+        }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    }
+}

+ 41 - 0
app/Console/Kernel.php

xqd
@@ -0,0 +1,41 @@
+<?php
+
+namespace App\Console;
+
+use Illuminate\Console\Scheduling\Schedule;
+use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
+
+class Kernel extends ConsoleKernel
+{
+    /**
+     * The Artisan commands provided by your application.
+     *
+     * @var array
+     */
+    protected $commands = [
+        //
+    ];
+
+    /**
+     * Define the application's command schedule.
+     *
+     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
+     * @return void
+     */
+    protected function schedule(Schedule $schedule)
+    {
+        // $schedule->command('inspire')->hourly();
+    }
+
+    /**
+     * Register the commands for the application.
+     *
+     * @return void
+     */
+    protected function commands()
+    {
+        $this->load(__DIR__.'/Commands');
+
+        require base_path('routes/console.php');
+    }
+}

+ 45 - 0
app/Exceptions/Handler.php

xqd
@@ -0,0 +1,45 @@
+<?php
+
+namespace App\Exceptions;
+
+use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
+use Throwable;
+
+class Handler extends ExceptionHandler
+{
+    /**
+     * A list of the exception types that are not reported.
+     *
+     * @var array
+     */
+    protected $dontReport = [
+        //
+    ];
+
+    /**
+     * A list of the inputs that are never flashed for validation exceptions.
+     *
+     * @var array
+     */
+    protected $dontFlash = [
+        'current_password',
+        'password',
+        'password_confirmation',
+    ];
+
+    /**
+     * Register the exception handling callbacks for the application.
+     *
+     * @return void
+     */
+    public function register()
+    {
+        $this->reportable(function (Throwable $e) {
+            //
+        });
+    }
+
+
+
+
+}

+ 170 - 0
app/Helper/AttachmentHelper.php

xqd
@@ -0,0 +1,170 @@
+<?php
+
+namespace App\Helper;
+
+use App\Models\SystemConfig;
+use FFMpeg;
+use Illuminate\Http\Request;
+use Illuminate\Http\UploadedFile;
+use Illuminate\Support\Facades\Storage;
+use OSS\OssClient;
+use PHPUnit\Util\Exception;
+use Symfony\Component\HttpFoundation\File\Exception\FileException;
+use App\Services\Base\ErrorCode;
+use App\Models\BaseAttachment;
+
+trait AttachmentHelper
+{
+
+    public function __construct()
+    {
+        //在 .env 文件里配置下面可测试文件上传OSS
+        //ALI_OSS_ACCESS_ID=LTAI5tHMYxyoEkmGqQZjbpmk
+        //ALI_OSS_ACCESS_KEY=Fqj8J1JH0yyRpLvOjNFj5usjvfvHns
+        //ALI_OSS_BUCKET=zhengda
+        //ALI_OSS_ENDPOINT=oss-cn-chengdu.aliyuncs.com
+
+        $this->fileDriver = env('FILESYSTEM_DRIVER');
+        $this->bucket = env('ALI_OSS_BUCKET');
+        $this->accessId = env('ALI_OSS_ACCESS_ID');
+        $this->accessKey = env('ALI_OSS_ACCESS_KEY');
+        $this->endPoint = env('ALI_OSS_ENDPOINT');
+        $this->ossClient = new OssClient($this->accessId, $this->accessKey, $this->endPoint);
+    }
+
+    /**
+     * @param Request $request
+     * @param $key
+     * @param string $tag
+     * @param float|int $size
+     * @param array $mimeType
+     * @return array|mixed
+     * @throws \Exception
+     */
+    public function uploadAttachment(Request $request, $key, $tag = 'files', $size = 200 * 1024 * 1024, array $mimeType = [])
+    {
+        if ($request->hasFile($key)) {
+            $files = $request->file($key);
+            if ($files === null) {
+                throw new \Exception(trans('api.ATTACHMENT_FILE_NULL'));
+            }
+            if ($files instanceof UploadedFile) {
+                $files = [$files];
+            }
+            $result = [];
+            foreach ($files as $idx => $file) {
+                if (!$file->isValid()) {
+                    throw new \Exception(trans('api.ATTACHMENT_TYPE_ERROR'));
+                    continue;
+                }
+                $fileSize = $file->getSize();
+                if ($fileSize > $size) {
+                    throw new \Exception(trans('api.ATTACHMENT_SIZE_EXCEEDED'));
+                    continue;
+                }
+                $fileMimeType = $file->getMimeType();
+                if (!empty($mimeType) && !in_array($fileMimeType, $mimeType)) {
+                    throw new \Exception(trans('api.ATTACHMENT_TYPE_ERROR'));
+                    continue;
+                }
+                $clientName = $file->getClientOriginalName();
+                $md5 = md5($clientName . time());
+                $md5_filename = $md5 . '.' . $file->getClientOriginalExtension();
+                try {
+                    //本地上传
+                    if (env('FILESYSTEM_DRIVER') == 'local') {
+                        $rel_path = '/upload/' . $tag . '/' . date('Ymd');
+                        $path = public_path() . $rel_path;
+                        if (!file_exists($path)) {
+                            if (!@mkdir($path, 0755, true)) {
+                                throw new \Exception(trans('api.ATTACHMENT_MAKE_FOLDER_ERROR'));
+                            }
+                        }
+                        $file->move($path, $md5_filename);
+                        $realPath = $path . '/' . $md5_filename;
+                        $urlPath = $rel_path . '/' . $md5_filename;
+                        if ($fileMimeType == "video/mp4" || $fileMimeType == "video/quicktime") {
+                            $ffmpeg = FFMpeg\FFMpeg::create(array(
+                                'ffmpeg.binaries' => '/usr/bin/ffmpeg',
+                                'ffprobe.binaries' => '/usr/bin/ffprobe'
+                            ));
+                            $video = $ffmpeg->open($realPath);
+                            $vpath = public_path() . '/upload/vpic/';
+                            if (!file_exists($vpath)) {
+                                if (!@mkdir($vpath, 0755, true)) {
+                                    return trans('api.ATTACHMENT_MAKE_FOLDER_ERROR');
+                                }
+                            }
+                            $pic = $vpath . $md5 . '.jpg';
+                            $video->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(1))->save($pic);
+                        }
+                        $result[$idx] = 'http://' . $_SERVER['HTTP_HOST'] . $urlPath;
+
+                    } elseif (env('FILESYSTEM_DRIVER') == 'oss') {
+
+                        $tmppath  = $file->getRealPath(); //获取上传图片的临时地址
+                        $fileName = date('YmdHis') .rand(10000, 99999). '.' . $file->getClientOriginalExtension(); //生成文件名
+                        $pathName = $tag . '/' . date('Y-m') . '/' . $fileName;
+                        $upResult = $this->ossClient->uploadFile($this->bucket, $pathName, $tmppath, ['ContentType' => $file->getClientMimeType()]); //上传图片到阿里云OSS
+                        $url = $upResult['info']['url'];
+                        $realPath = $url;
+                        $urlPath  = $url;
+                        $result[$idx] = $url;
+                    }
+                    //将上传的图片存入到数据表作为记录
+                    $attachment = new BaseAttachment();
+                    $attachment->name = $clientName;
+                    $attachment->md5  = $md5;
+                    $attachment->path = $realPath;
+                    $attachment->url  = $urlPath;
+                    $attachment->size = $fileSize;
+                    $attachment->file_type = $fileMimeType;
+                    if (!$attachment->save()) {
+                        @unlink($realPath);
+                        throw new \Exception(trans('api.ATTACHMENT_SAVE_ERROR'));
+                    }
+                } catch (FileException $e) {
+                    throw new \Exception(trans('api.ATTACHMENT_UPLOAD_INVALID'));
+                }
+            }
+            if (count($result) == 1) {
+                return array_shift($result);
+            }
+            return $result;
+        } else {
+            throw new \Exception(trans('api.ATTACHMENT_UPLOAD_INVALID'));
+        }
+    }
+
+    /**
+     * 删除附件
+     *
+     * @param $picUrl 图片地址
+     * @return int 错误码or 0(成功)
+     */
+    public function deleteAttachment($picUrl)
+    {
+        if ($this->fileDriver == 'local') {
+            $attachment = BaseAttachment::where(['path' => $picUrl])->first();
+            if (!$attachment) {
+                return false;
+            }
+            if (file_exists($attachment->path)) {
+                if (@unlink($attachment->path)) {
+                    if (!$attachment->delete()) {
+                        return false;
+                    }
+                } else {
+                    return false;
+                }
+            } else {
+                return false;
+            }
+        } elseif ($this->fileDriver == 'oss') {
+            $this->ossClient->deleteObject($this->bucket, $picUrl);
+        }
+
+        return true;
+    }
+
+}

+ 65 - 0
app/Helper/JpushHelper.php

xqd
@@ -0,0 +1,65 @@
+<?php
+namespace App\Helper;
+
+use JPush\Client as JPush;
+use App\Models\UserInfoModel;
+
+trait JpushHelper
+{
+    public function jPush($title,$content='',$userid=0,$type=0,$id=0) {
+        $app_key = '69838317211448192366f9d8';
+        $master_secret = 'f202d10301151e1816b49e55';
+        $client = new JPush($app_key, $master_secret, storage_path('logs/jpush.log'));
+
+        \Log::info('jpush start!');
+//        $push = new Push;
+//        $push->title = $title;
+//        $push->content = $content;
+//        $push->user_id = $userid;
+//        $res=$push->save();
+//        if($userid){
+            $user = UserInfoModel::find($userid);
+//        }
+        if($user&&$user->jpush){
+            $regId = array($user->jpush);
+            $options = array(
+                'apns_production' => true,
+            );
+            try {
+                $pusher = $client->push();
+                $pusher->setPlatform(['ios', 'android']);
+//                $pusher->addAllAudience();
+                $pusher->addRegistrationId($regId);
+                if($type!=0&&$id!=0){
+                    $pusher->androidNotification($title,[
+                        'title' => $content,
+                        'content_type' => 'text',
+                        'extras' => [
+                            'type' => $type,
+                            'id' => $id,
+                        ]
+                    ]);
+                    $pusher->iosNotification($title, [
+                        'sound' => 'sound',
+                        'badge' => '+1',
+                        'extras' => [
+                            'type' => $type,
+                            'id' => $id,
+                        ]
+                    ]);
+                }
+                $pusher->setNotificationAlert($title);
+                $pusher->options($options);
+                $pusher->send();
+                \Log::info('jpush send!');
+            } catch (\JPush\Exceptions\APIConnectionException $e) {
+                // try something here
+                \Log::error($e);
+            } catch (\JPush\Exceptions\APIRequestException $e) {
+                // try something here
+                \Log::error($e);
+            }
+        }
+    }
+
+}

+ 31 - 0
app/Helper/LogHelper.php

xqd
@@ -0,0 +1,31 @@
+<?php
+namespace App\Helper;
+
+use App\Models\AccountLog;
+
+trait LogHelper
+{
+    /**
+     * account log记录
+     * @param $data
+     * @return AccountLog
+     * @throws \Exception
+     */
+    private function logAccount($fromType, $fromId, $fromName, $fromAmount,  $op, $toType, $toId, $toName, $toAmount,$transactionId='',$avatar='') {
+        return AccountLog::create([
+            'from_type'     => $fromType,
+            'from_id'       => $fromId,
+            'from_name'     => $fromName,
+            'from_amount'   => $fromAmount,
+            'op'            => $op,
+            'to_type'       => $toType,
+            'to_id'         => $toId,
+            'to_name'       => $toName,
+            'to_amount'     => $toAmount,
+            'transaction_id'  => $transactionId,
+            'avatar'        => $avatar,
+        ]);
+    }
+
+
+}

+ 196 - 0
app/Helper/PayHelper.php

xqd
@@ -0,0 +1,196 @@
+<?php
+namespace App\Helper;
+
+use Omnipay\Omnipay;
+use App\Models\OrderInfoModel;
+use Config, Request,QrCode;
+
+trait PayHelper
+{
+    private function prepare() {
+//        Pingpp::setApiKey(env('PINGPP_APP_KEY'));
+//        Pingpp::setPrivateKeyPath(config_path() . 'ppp_pri_key.pem');
+    }
+
+    /**
+     * 验签
+     * @param $data
+     * @param $sig
+     * @return int
+     */
+    public function checkPppSignature($data, $sig) {
+        $pubKey = file_get_contents(config_path() . 'ppp_pub_key.pem');
+        return openssl_verify($data, $sig, $pubKey, 'sha256');
+    }
+
+    private function saveOrder($data) {
+        $order = new OrderInfoModel();
+        $order->code            = $data['code'];
+        $order->transaction_id  = $data['transaction_id'];
+        $order->user_id         = $data['user_id'];
+        $order->goods_id        = $data['goods_id'];
+        $order->price           = $data['price'];
+        $order->number          = $data['number'];
+        $order->amount          = $data['amount'];
+        $order->pay_type        = $data['pay_type'];
+        if (isset($data['ext_info'])) {
+            $order->ext_info = $data['ext_info'];
+        }
+
+        if ($order->save()) {
+            return $order->find($order->id);
+        }
+        return false;
+    }
+
+    public function createAlipayCharge($data, $profile = 'alipay') {
+        $gateways = Config::get('laravel-omnipay.gateways');
+        if (array_key_exists($profile, $gateways)) {
+            $config = $gateways[$profile];
+        } else {
+            \Log::error('alipay: 不支持的支付类型, ' . $profile);
+            return false;
+        }
+        $gateway = Omnipay::create($config['driver']);
+        $gateway->setEnvironment($config['options']['environment']);
+        $gateway->setAppId($config['options']['appid']);
+        $gateway->setEncryptKey($config['options']['encrypt_key']);
+        $gateway->setPrivateKey($config['options']['prikey']);
+        $gateway->setAlipayPublicKey($config['options']['ali_pubkey']);
+        $gateway->setNotifyUrl($config['options']['notify_url']);
+
+        $goodsTypes = OrderInfoModel::getAllGoodsTypes();
+        if (!isset($data['subject'])) {
+            $data['subject'] = sprintf("瞄喵%s充值%d", $goodsTypes[$data['goods']], $data['number']);
+        }
+        if (!isset($data['goods_id'])) {
+            $data['goods_id'] = 0;
+        }
+        $data['transaction_id'] = date('YmdHis') . mt_rand(1000, 9999);
+        $data['code'] = 'ALIPAY_' . $data['transaction_id'];
+        $data['price'] = 1;
+        $data['amount'] = $data['number'] * $data['price']*100;
+        $data['pay_type'] = OrderInfoModel::PAY_TYPE_ALIPAY;
+
+        $request = $gateway->purchase();
+        $request->setBizContent([
+            'subject'      => $data['subject'],
+            'out_trade_no' => $data['transaction_id'],
+            'total_amount' => round($data['amount'] / 100, 2),
+            'product_code' => 'QUICK_MSECURITY_PAY',//固定值
+        ]);
+        if ($profile == 'alipay_f2f') {
+            $request->setBizContent([
+                'subject'      => $data['subject'],
+                'out_trade_no' => $data['transaction_id'],
+                'total_amount' => round($data['amount'] / 100, 2),
+            ]);
+        }
+//        dd($request);
+
+        $response = $request->send();
+
+        if ($response->isSuccessful()) {
+            if ($profile == 'alipay_app' || $profile == 'alipay') {
+                $orderString = $response->getOrderString();
+            }
+            if ($profile == 'alipay_f2f') {
+                $code_url = $response->getQrCode();
+                $code_path = public_path('qrcodes/'.$data['code'].'.png');
+                QrCode::format('png')->size(500)->generate($code_url,$code_path);
+                $orderString =  env('APP_URL').'/qrcodes/'.$data['code'].'.png';
+            }
+            \Log::info("支付宝生成订返回:".$orderString);
+
+            //写订单
+            $order = $this->saveOrder($data);
+            if ($order !== false) {
+                $result = $order->toArray();
+                $result['orderString'] = $orderString;
+                return $result;
+            }
+            \Log::error('save order failed');
+            return false;
+        } else {
+            \Log::error('alipay response failed'.$response->getMessage());
+            return false;
+        }
+    }
+
+    public function createWechatpayCharge($data, $profile = 'wechatpay') {
+        $gateways = Config::get('laravel-omnipay.gateways');
+        if (array_key_exists($profile, $gateways)) {
+            $config = $gateways[$profile];
+        } else {
+            \Log::error('wechatpay: 不支持的支付设置, ' . $profile);
+            return false;
+        }
+
+        $gateway = Omnipay::create($config['driver']);
+//        $gateway->setEnvironment('sandbox');
+        $gateway->setAppId($config['options']['appid']);
+        $gateway->setMchId($config['options']['merchant_id']);
+        $gateway->setApiKey($config['options']['apikey']);
+        $gateway->setNotifyUrl($config['options']['notify_url']);
+
+        $goodsTypes = OrderInfoModel::getAllGoodsTypes();
+        if (!isset($data['subject'])) {
+            $data['subject'] = sprintf("瞄喵%s充值%d", $goodsTypes[$data['goods']], $data['number']);
+        }
+        if (!isset($data['goods_id'])) {
+            $data['goods_id'] = 0;
+        }
+        $data['transaction_id'] = date('YmdHis') . mt_rand(1000, 9999);
+        $data['code'] = 'WECHATPAY_' . $data['transaction_id'];
+        $data['price'] = 1;
+        $data['amount'] = $data['number'] * $data['price']*100;
+        $data['pay_type'] = OrderInfoModel::PAY_TYPE_WECHATPAY;
+
+        $order = [
+            'body'              => $data['subject'],
+            'out_trade_no'      => $data['transaction_id'],
+            'total_fee'         => $data['amount'],
+            'spbill_create_ip'  => Request::ip(),
+            'fee_type'          => 'CNY'
+        ];
+
+        $request  = $gateway->purchase($order);
+        $response = $request->send();
+
+//        dd($response);
+
+        if ($response->isSuccessful()) {
+            if ($profile == 'wechatpay_app' || $profile == 'wechatpay') {
+                $orderString = $response->getAppOrderData();
+            }
+//            if ($profile == 'wechatpay_native') {
+//                $code_url = $response->getCodeUrl();
+//                $code_path = public_path('qrcodes/'.$data['code'].'.png');
+//                QrCode::format('png')->size(500)->generate($code_url,$code_path);
+//                $orderString =  env('APP_URL').'/qrcodes/'.$data['code'].'.png';
+//            }
+            \Log::debug($orderString);
+
+            //写订单
+            $order = $this->saveOrder($data);
+            if ($order !== false) {
+                $result = $order->toArray();
+                $result['orderString'] = $orderString;
+                return $result;
+            }
+            \Log::error('save order failed');
+            return false;
+        } else {
+            \Log::error($response->getData());
+            return false;
+        }
+
+        //available methods
+//        $response->isSuccessful();
+//        $response->getData(); //For debug
+//        $response->getAppOrderData(); //For WechatPay_App
+//        $response->getJsOrderData(); //For WechatPay_Js
+//        $response->getCodeUrl(); //For Native Trade Type
+    }
+
+}

+ 332 - 0
app/Helper/function.php

xqd
@@ -0,0 +1,332 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: pijh
+ * Date: 2017/8/20
+ * Time: 00:33
+ */
+
+
+use Illuminate\Support\Arr;
+use \Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Storage;
+
+if (! function_exists('user_admin_config')) {
+    function user_admin_config($key = null, $value = null)
+    {
+        $session = session();
+
+        if (! $config = $session->get('admin.config')) {
+            $config = config('admin');
+
+            $config['lang'] = config('app.locale');
+        }
+
+        if (is_array($key)) {
+            // 保存
+            foreach ($key as $k => $v) {
+                Arr::set($config, $k, $v);
+            }
+
+            $session->put('admin.config', $config);
+
+            return;
+        }
+
+        if ($key === null) {
+            return $config;
+        }
+
+        return Arr::get($config, $key, $value);
+    }
+}
+
+//生成随机码
+function create_invite_code() {
+    $code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+    $rand = $code[rand(0,25)]
+        .strtoupper(dechex(date('m')))
+        .date('d')
+        .substr(time(),-5)
+        .substr(microtime(),2,5)
+        .sprintf('%02d',rand(0,99));
+    for(
+        $a = md5( $rand, true ),
+        $s = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
+        $d = '',
+        $f = 0;
+        $f < 6;
+        $g = ord( $a[ $f ] ),
+        $d .= $s[ ( $g ^ ord( $a[ $f + 8 ] ) ) - $g & 0x1F ],
+        $f++
+    );
+    return $d;
+}
+
+/**
+ * 时间格式化(时间戳)
+ * @param $ptime
+ * @return false|string
+ */
+function uc_time_ago($ptime)
+{
+    date_default_timezone_set('PRC');
+    $etime = time() - $ptime;
+    switch ($etime) {
+        case $etime <= 60:
+            $msg = '刚刚';
+            break;
+        case $etime > 60 && $etime <= 60 * 60:
+            $msg = floor($etime / 60) . '分钟前';
+            break;
+        case $etime > 60 * 60 && $etime <= 24 * 60 * 60:
+            $msg = date('Ymd', $ptime) == date('Ymd', time()) ? '今天 ' . date('H:i', $ptime) : '昨天 ' . date('H:i', $ptime);
+            break;
+        case $etime > 24 * 60 * 60 && $etime <= 2 * 24 * 60 * 60:
+            $msg = date('Ymd', $ptime) + 1 == date('Ymd', time()) ? '昨天 ' . date('H:i', $ptime) : '前天 ' . date('H:i', $ptime);
+            break;
+        case $etime > 2 * 24 * 60 * 60 && $etime <= 12 * 30 * 24 * 60 * 60:
+            $msg = date('Y', $ptime) == date('Y', time()) ? date('m-d H:i', $ptime) : date('Y-m-d H:i', $ptime);
+            break;
+        default:
+            $msg = date('Y-m-d H:i', $ptime);
+    }
+    return $msg;
+}
+
+
+
+/**
+ * 获取IP地址归属地
+ * @param $ip
+ * @return string
+ */
+function get_ip_address($ip)
+{
+    if ('127.0.0.1' == $ip) return 'Localhost';
+    $url = 'http://ip.taobao.com/service/getIpInfo.php?ip=' . $ip;
+    $ch = curl_init($url);
+    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
+    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 获取数据返回
+    $location = curl_exec($ch);
+    $location = json_decode($location, true);
+    curl_close($ch);
+
+    if (false != $location && 0 === $location['code']) {
+        return $location['data']['region'] . $location['data']['city'] . $location['data']['county'] . '・' . $location['data']['isp'];
+    } else {
+        return 'unknown';
+    }
+
+}
+
+/**
+ * 递归查询获取分类树结构
+ * @param $data
+ * @param int $pid
+ * @param int $level
+ * @param array $tree
+ * @param string $pidField
+ * @param string $showField
+ * @return array
+ */
+function get_tree_list(&$data, $pid = 0, $level = 0, &$tree = [], $pidField = 'pid', $showField = 'name')
+{
+    foreach ($data as $key => &$value) {
+        if ($value[$pidField] == $pid) {
+            $value['level'] = $level;
+            $value['level'] && $value[$showField] = '&nbsp;' . $value[$showField];
+            $value[$showField] = str_repeat('ㅡ', $value['level']) . $value[$showField];
+            $tree[] = $value;
+            unset($data[$key]);
+            get_tree_list($data, $value['id'], $level + 1, $tree);
+        }
+    }
+    unset($value);
+
+    return $tree;
+}
+
+/**
+ * 递归查询获取分类树结构带child
+ * @param $data
+ * @param int $pid
+ * @param int $level
+ * @param string $pidField
+ * @return array
+ */
+function get_tree_list_with_child(&$data, $pid = 0, $level = 0, $pidField = 'pid')
+{
+    $tree = [];
+    foreach ($data as $key => &$value) {
+        if ($value[$pidField] == $pid) {
+            $value['level'] = $level;
+            $value['child'] = get_tree_list_with_child($data, $value['id'], $level + 1);
+            $tree[] = $value;
+            unset($data[$key]);
+        }
+    }
+    unset($value);
+
+    return $tree;
+}
+
+/**
+ * 打印sql语句,在sql语句之前调用
+ */
+function dump_sql()
+{
+    \DB::listen(function ($query) {
+        $bindings = $query->bindings;
+        $i = 0;
+        $rawSql = preg_replace_callback('/\?/', function ($matches) use ($bindings, &$i) {
+            $item = isset($bindings[$i]) ? $bindings[$i] : $matches[0];
+            $i++;
+            return gettype($item) == 'string' ? "'$item'" : $item;
+        }, $query->sql);
+        echo $rawSql . "\n<br /><br />\n";
+    });
+}
+
+function create_guid($namespace = null)
+{
+    static $guid = '';
+    $uid = uniqid("", true);
+
+    $data = $namespace;
+    $data .= $_SERVER ['REQUEST_TIME'];     // 请求那一刻的时间戳
+    $data .= $_SERVER ['HTTP_USER_AGENT'];  // 获取访问者在用什么操作系统
+    $data .= $_SERVER ['SERVER_ADDR'];      // 服务器IP
+    $data .= $_SERVER ['SERVER_PORT'];      // 端口号
+    $data .= $_SERVER ['REMOTE_ADDR'];      // 远程IP
+    $data .= $_SERVER ['REMOTE_PORT'];      // 端口信息
+
+    $hash = strtoupper(hash('ripemd128', $uid . $guid . md5($data)));
+    $guid = substr($hash, 0, 8);
+
+    return $guid;
+}
+
+function create_order_number()
+{
+    return date('Ymd') . str_pad(mt_rand(1, 999999), 6, '0', STR_PAD_LEFT);
+}
+
+/**
+ * curl 请求
+ * @param $url
+ * @param null $header
+ * @param null $data
+ * @return mixed
+ */
+function curlRequest($url, $header = null, $data = null)
+{
+    $ch = curl_init();
+    curl_setopt($ch, CURLOPT_URL, $url);
+    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+    curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
+    curl_setopt($ch, CURLOPT_HEADER, 1);
+    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
+    if ($data) {
+        curl_setopt($ch, CURLOPT_POST, 1);
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
+    }
+    if ($header) {
+        curl_setopt($ch, CURLOPT_HEADER, $header);
+    }
+    $ret = curl_exec($ch);
+    curl_close($ch);
+
+    return $ret;
+}
+
+/**
+ * 数字金额转换成中文大写金额的函数
+ * @param $num
+ * @return string
+ */
+function cny($num)
+{
+
+    $c1 = "零壹贰叁肆伍陆柒捌玖";
+    $c2 = "分角元拾佰仟万拾佰仟亿";
+    $num = round($num, 2);
+    $num = $num * 100;
+    if (strlen($num) > 10) {
+        return "数据太长,没有这么大的钱吧,检查下";
+    }
+    $i = 0;
+    $c = "";
+    while (1) {
+        if ($i == 0) {
+            $n = substr($num, strlen($num) - 1, 1);
+        } else {
+            $n = $num % 10;
+        }
+        $p1 = substr($c1, 3 * $n, 3);
+        $p2 = substr($c2, 3 * $i, 3);
+        if ($n != '0' || ($n == '0' && ($p2 == '亿' || $p2 == '万' || $p2 == '元'))) {
+            $c = $p1 . $p2 . $c;
+        } else {
+            $c = $p1 . $c;
+        }
+        $i = $i + 1;
+        $num = $num / 10;
+        $num = (int)$num;
+        if ($num == 0) {
+            break;
+        }
+    }
+    $j = 0;
+    $slen = strlen($c);
+    while ($j < $slen) {
+        $m = substr($c, $j, 6);
+        if ($m == '零元' || $m == '零万' || $m == '零亿' || $m == '零零') {
+            $left = substr($c, 0, $j);
+            $right = substr($c, $j + 3);
+            $c = $left . $right;
+            $j = $j - 3;
+            $slen = $slen - 3;
+        }
+        $j = $j + 3;
+    }
+
+    if (substr($c, strlen($c) - 3, 3) == '零') {
+        $c = substr($c, 0, strlen($c) - 3);
+    }
+    if (empty($c)) {
+        return "零元整";
+    } else {
+        return $c . "整";
+    }
+}
+
+if (!function_exists('valid_url')) {
+    /**
+     * 路径助手函数
+     * @param $url
+     * @param null $disk_name
+     * @param false $temp
+     * @param null|DateTimeInterface  $expiration
+     * @return string|null
+     */
+    function valid_url($url, $disk_name = null, $temp = false, $expiration = null)
+    {
+        if (is_null($url)) {
+            return null;
+        }
+
+        if (filter_var($url, FILTER_VALIDATE_URL)) {
+            return $url;
+        }
+
+        if ($temp) {
+            $expiration = $expiration ?: now()->addMinutes(30);
+            return Storage::disk($disk_name)->temporaryUrl($url, $expiration);
+        }
+
+        return Storage::disk($disk_name)->url($url);
+    }
+}
+

+ 42 - 0
app/Http/Controllers/Controller.php

xqd
@@ -0,0 +1,42 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
+use Illuminate\Foundation\Bus\DispatchesJobs;
+use Illuminate\Foundation\Validation\ValidatesRequests;
+use Illuminate\Routing\Controller as BaseController;
+use Illuminate\Http\Request;
+
+class Controller extends BaseController
+{
+    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
+
+    /**
+     * Validate the given request with the given rules.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  array  $rules
+     * @param  array  $messages
+     * @param  array  $customAttributes
+     * @return array
+     *
+     * @throws \Illuminate\Validation\ValidationException
+     */
+    public function validate(Request $request, array $rules,
+                             array $messages = [], array $customAttributes = [])
+    {
+        $validate = [];
+        foreach ($rules as $k => $v){
+            $tmp = explode('|', $k);
+            $validate[$tmp[0]] = $v;
+            if (!empty($tmp[1]) && empty($customAttributes[$tmp[0]])){
+                $customAttributes[$tmp[0]] = $tmp[1];
+            }
+        }
+
+        return $this->getValidationFactory()->make(
+            $request->all(), $validate, $messages, $customAttributes
+        )->validate();
+    }
+}

+ 39 - 0
app/Http/Controllers/V1/ArticleController.php

xqd
@@ -0,0 +1,39 @@
+<?php
+
+namespace App\Http\Controllers\V1;
+
+use App\Models\Help;
+use App\Models\Region;
+use Illuminate\Http\Request;
+use App\Models\Advertise;
+use App\Models\Setting;
+use Hamcrest\Type\IsString;
+use Illuminate\Support\Facades\Redis;
+use Illuminate\Support\Facades\Validator;
+
+class ArticleController extends Controller
+{
+    //帮助类型
+    public function helpList()
+    {
+        $list = Help::query()->select('id', 'title')->get();
+
+        if($list->isEmpty()){
+            return [];
+        }
+        $list = $list->toArray();
+
+        return $this->success($list);
+    }
+
+    //帮助类答案
+    public function answer(Request $request)
+    {
+        $info = Help::query()->where('id', $request->id)->first();
+        $info->look_num = $info->look_num +1;
+        $info->save();
+
+        return $this->success($info);
+    }
+
+}

+ 87 - 0
app/Http/Controllers/V1/AttachmentController.php

xqd
@@ -0,0 +1,87 @@
+<?php
+
+namespace App\Http\Controllers\V1;
+
+use Illuminate\Http\Request;
+//use App\Helper\AttachmentHelper;
+use App\Services\Base\ErrorCode;
+use App\Services\AttachmentServer;
+use Illuminate\Support\Facades\Validator;
+
+
+class AttachmentController extends Controller
+{
+    //use AttachmentHelper;
+
+    /**
+     * * 可能出现的错误代码:
+     *    200     SAVE_USER_FAILED                保存用户数据失败
+     *    201     ATTACHMENT_MKDIR_FAILED         创建附件目录失败
+     *    202     ATTACHMENT_UPLOAD_INVALID       上传附件文件无效
+     *    203     ATTACHMENT_SAVE_FAILED          保存附件失败
+     *    204     ATTACHMENT_MOVE_FAILED          移动附件失败
+     *    205     ATTACHMENT_DELETE_FAILED        删除附件文件失败
+     *    206     ATTACHMENT_RECORD_DELETE_FAILED 删除附件记录失败
+     *    1000    CLIENT_WRONG_PARAMS             传入参数不正确
+     *    1101    INCORRECT_VERIFY_CODE           输入验证码错误
+     *    1105    USER_DOES_NOT_EXIST             用户不存在
+     *    1200    ATTACHMENT_UPLOAD_FAILED        附件上传失败
+     *    1201    ATTACHMENT_SIZE_EXCEEDED        附件大小超过限制
+     *    1202    ATTACHMENT_MIME_NOT_ALLOWED     附件类型不允许
+     *    1203    ATTACHMENT_NOT_EXIST            附件不存在
+     * @param Request $request
+     * @return \Illuminate\Http\JsonResponse
+     */
+    public function upload(Request $request)
+    {
+        try {
+            $validator = Validator::make($request->all(),
+                [
+                    'tag' => 'required|alpha_dash',
+                ], [
+                    'tag.required' => 'tag必填',
+                    'tag.alpha_dash' => 'tag只能为字母数字中/下划线',
+                ]
+            );
+            if ($validator->fails()) {
+                throw new \Exception($validator->messages()->first());
+            }
+            $result = (new AttachmentServer())->uploadAttachment($request, $request->post('file'), $request->post('tag'), 10 * 1024 * 1024, [
+                'image/jpeg',
+                'image/png',
+                'image/gif',
+                'video/mp4',
+            ]);
+        } catch (\Exception $exception) {
+            return $this->error($exception->getMessage());
+        }
+        return $this->success(['file' => $result], 0, trans("api.UPLOAD_SUCCESS"));
+    }
+
+    /**
+     * @param Request $request
+     * @return \Illuminate\Http\JsonResponse
+     * parse_url($url);
+     * array (
+            'scheme' => 'https',
+            'host'   => 'zhengda.oss-cn-chengdu.aliyuncs.com',
+            'path'   => '/api_avatar/2022-07/14/1271657787068220714.jpeg',
+       )
+     */
+    public function delete(Request $request)
+    {
+        $picUrl = $request->pic_url;
+        if(empty($picUrl)){
+            return $this->error('路径必填!');
+        }
+        $arr  = parse_url($picUrl);
+        $path = substr($arr['path'], 1);
+        $result = (new AttachmentServer())->deleteAttachment($path);
+        if ($result) {
+            return $this->success([]);
+        } else {
+            return $this->error('',ErrorCode::ATTACHMENT_DELETE_FAILED);
+        }
+    }
+
+}

+ 262 - 0
app/Http/Controllers/V1/AuthController.php

xqd
@@ -0,0 +1,262 @@
+<?php
+
+namespace App\Http\Controllers\V1;
+
+use App\Models\Job;
+use App\Models\User;
+use App\Services\Api\ErrorMsgServive;
+use App\Services\Api\UserService;
+use App\Services\JPushService;
+use App\Services\SmsServer;
+use Cache;
+use EasyWeChat\Factory;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\DB;
+use Laravel\Socialite\Facades\Socialite;
+use PHPUnit\Util\Exception;
+use Illuminate\Support\Facades\Validator;
+
+class AuthController extends Controller
+{
+    public function __construct()
+    {
+        $this->wxConfig = ['app_id' => env("WECHAT_MINI_PROGRAM_APPID"), 'secret' => env("WECHAT_MINI_PROGRAM_SECRET"), 'response_type' => 'array'];
+    }
+
+    //注册
+    public function register(Request $request)
+    {
+        $mobile   = $request->input('mobile', '');
+        $password = $request->input('password', '');
+
+        $validator = Validator::make($request->all(), [
+            'mobile' => 'required',
+            'password' => 'required|min:6',
+        ]);
+        if ($validator->fails()) {
+            return $this->error($validator->errors()->first());
+        }
+        if (UserService::checkUserByMobile($mobile)) {
+            return $this->error('手机号已被占用');
+        }
+
+        try { //手机验证码验证
+           if (\App::environment('production')){
+             SmsServer::checkSmsCodeByVerifyKey($mobile, $request->code);
+           }
+        } catch (Exception $exception) {
+            return $this->error($exception->getMessage());
+        }
+
+        $user = \App::make('getUserInstance'); //在 app/Providers/AppServiceProvider.php 里面可以创一个单例模式
+        $user->nickname = 'User' . mb_substr($mobile, 0, 6);
+        $user->avatar = '';
+        $user->mobile = $mobile;
+        $user->password = $password; //这个不是直接存密码,User模型中使用了修改器
+        //$user->register_ip = request()->ip();
+        $user->save();
+
+        return $this->success('创建成功!');
+    }
+
+    //账号密码登录
+    public function login(Request $request)
+    {
+        $account = $request->input('account');
+        $password = $request->input('password');
+        $jpush_reg_id = $request->input('jpush_reg_id');
+
+        if (!$user = User::query()->where(['mobile' => $account])->orWhere(['email' => $account])->first()) {
+            return $this->error('账号不存在');
+        }
+        $credentials1 = ['mobile' => $account, 'password' => $password];
+        $credentials2 = ['email' => $account, 'password' => $password];
+        if (!auth('api')->attempt($credentials1) && !auth('api')->attempt($credentials2)) {
+            return $this->error('密码错误!');
+        }
+        $data = $this->doLogin($user, $jpush_reg_id);
+
+        return $this->success($data);
+    }
+
+    //短信验证码登录
+    public function loginBySmsCode(Request $request)
+    {
+        try {
+            if (!$user = User::query()->where(['mobile' => $request->mobile])->first()) {
+              return $this->error('账号不存在');
+            }
+            //手机验证码验证
+            SmsServer::checkSmsCodeByVerifyKey($request->mobile, $request->smsCode);
+            //如果登录类型和 openid 不为空
+            $type = $request->type;
+            if (isset($type) && !empty($type)) {
+                if ($type == 'weixin') {
+                    if ($user->wx_openid != '') {
+                      return $this->error('已经绑定微信');
+                    }
+                    $user->wx_openid = $request->openid;
+                    $user->save();
+                }
+            }
+            $data = $this->doLogin($request->mobile, $request->post('jpush_reg_id', ''));
+        } catch (\Exception $exception) {
+            return $this->error($exception);
+        }
+        return $this->success($data);
+    }
+
+    //APP第三方授权登录(微信)
+    public function authLogin(Request $request)
+    {
+        try {
+            $socialite = Socialite::driver('weixin')->stateless()->user();
+            $user = User::query()->where('open_id', $socialite->getId())->first();
+            if (!$user) {
+                $data['open_id'] = $socialite->getId();
+                $data['user'] = [];
+            } else {
+                $account = $user->mobile ?: $user->email;
+                $data = $this->doLogin($account, $request->post('jpush_reg_id', ''));
+            }
+        } catch (Exception $exception) {
+            ErrorMsgServive::write($exception, requst()->url());
+            return $this->error('微信授权登录出错~');
+        }
+        return $this->success($data);
+    }
+
+    //微信小程序登录(微信)
+    public function miniProgram(Request $request)
+    {
+        try {
+            $mini = Factory::miniProgram($this->wxConfig);
+            $newMini = $mini->auth->session($request->input('code'));
+
+            $iv = $request->input('iv');
+            $encryptData = $request->input('encryptData');
+            $decryptedData = $mini->encryptor->decryptData($newMini['session_key'], $iv, $encryptData);
+            $openId = $decryptedData['openid'];
+            $user = User::query()->where('open_id', $openId)->first();
+            if (!$user) {
+                $data['open_id'] = $openId;
+                $data['user'] = [];
+            } else {
+                $account = $user->mobile ?: $user->email;
+                $data = $this->doLogin($account, $request->post('jpush_reg_id', ''));
+            }
+        } catch (Exception $exception) {
+            ErrorMsgServive::write($exception, requst()->url());
+            return $this->error('微信授权登录出错~');
+        }
+        return $this->success($data);
+    }
+
+    //微信小程序获取手机号
+    public function decryptPhone(Request $request)
+    {
+        $user = auth('api')->user();
+        try {
+            $mini = Factory::miniProgram($this->wxConfig);
+            $newMini = $mini->auth->session($request->input('code'));
+
+            $iv = $request->input('iv');
+            $encryptData = $request->input('encryptData');
+            $decryptedData = $mini->encryptor->decryptData($newMini['session_key'], $iv, $encryptData);
+
+            $user = User::query()->where('id', $user->id)->first();
+            $user->mobile = $decryptedData['purePhoneNumber'];
+            $user->save();
+        } catch (\Exception $exception) {
+            ErrorMsgServive::write($exception, requst()->url());
+            return $this->error('获取手机号出错~');
+        }
+        return $this->success();
+    }
+
+    //H5 应用进行微信授权登录
+    public function h5Oauth()
+    {
+
+    }
+
+    //微信小程序 code
+    public function miniCode()
+    {
+
+    }
+
+    //执行登录
+    public function doLogin($user, $jpush_reg_id = null)
+    {
+        if (!empty($jpush_reg_id)) {
+            //清除登陆过本设备的账号设备id
+            User::query()->where('jpush_reg_id', $jpush_reg_id)->update(['jpush_reg_id' => '']);
+            //当前登录用户绑定设备
+            $user->jpush_reg_id = $jpush_reg_id;
+            //清除别名
+            JPushService::deleteAlias('user_id_' . $user->id);
+            //设置极光推送别名
+            JPushService::updateAlias($user->jpush_reg_id, 'user_id_' . $user->id);
+        }
+        $user->online = 1;
+        $user->last_login_time = date('Y-m-d H:i:s');
+        $user->last_login_ip = request()->ip();
+        if (!$user->save()) {
+            return $this->error('数据保存失败');
+        }
+        $token = Auth::guard('api')->fromUser($user);
+        $userInfo = UserService::getUserInfoById($user->id);
+        $data = [
+            'token' => "Bearer " . $token,
+            'user_info' => $userInfo,
+        ];
+
+        return $data;
+    }
+
+    //用户是否存在
+    public function isUserExist($account)
+    {
+        $user = User::where(['mobile' => $account])
+            ->orWhere(['email' => $account])
+            ->first();
+        if (!$user) {
+            return false;
+        }
+        return $user;
+    }
+
+    //忘记密码
+    public function forgetPassword(Request $request)
+    {
+        if ($request->new_password != $request->confirm_password) {
+            return $this->error('两次密码不一致');
+        }
+        try {
+            $user = User::find($this->user->id);
+            //手机验证码验证
+            SmsServer::checkSmsCodeByVerifyKey($user->mobile, $request->smsCode);
+        } catch (Exception $exception) {
+            return $this->error($exception->getMessage());
+        }
+        $user->password = $request->new_password;
+        $user->save();
+
+        return $this->success();
+    }
+
+    //退出
+    public function logout()
+    {
+        $user = auth('api')->user();
+        //清空极光别名
+        JPushService::updateAlias($user->jpush_reg_id, '');
+        $user->online = 0;
+        $user->save();
+        auth('api')->logout();
+
+        return $this->success();
+    }
+}

+ 33 - 0
app/Http/Controllers/V1/BaseConfigController.php

xqd
@@ -0,0 +1,33 @@
+<?php
+
+namespace App\Http\Controllers\V1;
+
+use App\Models\BaseConfig;
+
+class BaseConfigController extends Controller
+{
+    /**
+     * UserController constructor.
+     */
+    public function __construct()
+    {
+        $this->middleware('check', ['except' => ['index']]);
+    }
+
+    /**
+     * 获取配置
+     * @return \Illuminate\Http\JsonResponse
+     */
+    public function index()
+    {
+        $lang = request('lang', 'cn');
+        $group = request('group');
+        if (!$group) {
+            return json(201, trans("api.Parameter", [], $lang));
+        }
+        $key = request('key', '');
+        $arr = BaseConfig::get($group, $key, "");
+
+        return json(200,'BaseConfig Info', $arr);
+    }
+}

+ 83 - 0
app/Http/Controllers/V1/Controller.php

xqd
@@ -0,0 +1,83 @@
+<?php
+
+namespace App\Http\Controllers\V1;
+
+use Dingo\Api\Routing\Helpers;
+use Illuminate\Foundation\Bus\DispatchesJobs;
+use Illuminate\Routing\Controller as BaseController;
+use Illuminate\Foundation\Validation\ValidatesRequests;
+use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
+use App\Services\Base\ErrorCode;
+use Request, Auth, Log;
+
+class Controller extends BaseController
+{
+    use AuthorizesRequests, DispatchesJobs, ValidatesRequests, Helpers;
+
+    //验证器错误信息返回
+    public function validatorError($arr, $code = 0, $msg = '')
+    {   
+        //写入日志
+        Log::info($arr);
+        //获取返回信息
+        foreach ($arr as $val){
+            if($val&&$msg==''){
+                $msg = $val;
+            }
+        }
+        //组装状态码和返回信息
+        $res = [
+            'code' => $code,
+            'msg'  => $msg ?? '',
+            'data' => null
+        ];
+        //json返回数据和状态码
+        return response()->json($res);
+    }
+
+    //通用输出方法
+    public function output($data=[], $code = 0, $msg = '')
+    {
+        $ret = $this->makeApiData($data, $code, $msg);
+        return response()->json($ret);
+    }
+
+    //正确返回
+    public function success($data=[], $code = 0, $msg = '')
+    {   
+        //是否有成功时返回的信息
+        if (!$msg) $msg = trans('api.SUCCESS');
+        //组装状态码返回信息等数据
+        $ret = $this->makeApiData($data, $code, $msg);
+        //返回json数据
+        return response()->json($ret);
+    }
+
+    //错误返回
+    public function error($msg = '', $code = 1,  $data = null)
+    {
+        $ret = $this->makeApiData($data, $code, $msg);
+        return response()->json($ret);
+    }
+
+    //生成返回数据
+    private function makeApiData($data, $code = 0, $message = '')
+    {
+        //判断状态码是否正常和返回信息是否为空
+        if ($code !== 0 && empty($message)) {
+            //输出错误码对应的错误信息
+            $message = ErrorCode::message($code);
+        } else if ($code == 0 && empty($message)) {
+            //输出成功信息
+            $message = 'success';
+        }
+        //组装数据
+        $ret = [
+            'code' => $code,
+            'msg'  => $message,
+            'data' => $data
+        ];
+        //返回数据
+        return $ret;
+    }
+}

+ 78 - 0
app/Http/Controllers/V1/EmailController.php

xqd
@@ -0,0 +1,78 @@
+<?php
+
+namespace App\Http\Controllers\V1;
+
+use Illuminate\Http\Request;
+use Illuminate\Support\Carbon;
+use Illuminate\Support\Facades\Mail;
+use App\Models\MailCode;
+use Illuminate\Support\Facades\Validator;
+
+class EmailController extends Controller
+{
+    /**
+     发送邮箱验证码
+     在 .env 文件配置如下,可测试邮件发送(最好自己申请一个邮箱获取信息)
+     MAIL_MAILER=smtp
+     MAIL_HOST=ssl://smtp.163.com
+     MAIL_PORT=465
+     MAIL_USERNAME=18738190585@163.com
+     MAIL_PASSWORD=VIBTDHQAYLKJYIGC
+     MAIL_ENCRYPTION=
+     MAIL_FROM_ADDRESS=18738190585@163.com
+     MAIL_FROM_NAME="${APP_NAME}"
+     *
+     * @param Request $request
+     * @return \Illuminate\Http\JsonResponse
+     */
+    public function sendEmailCode(Request $request)
+    {
+        $email = $request->input('email');
+
+        $validator = Validator::make($request->all(), [
+            'email' => 'required|email',
+        ]);
+        if ($validator->fails()) {
+            return $this->error($validator->errors()->first());
+        }
+        $code = rand(1000, 9999);
+        $notice = '本次验证码是' . '【 ' . $code . ' 】 ' . '有效期 5 分钟';
+        $subject = '邮箱验证通知';
+        try {
+            Mail::raw($notice, function ($message) use ($email, $subject) {
+                $message->subject($subject);
+                $message->to($email);
+            });
+            $mailCode = new MailCode();
+            $mailCode->account = $email;
+            $mailCode->code = $code;
+            $mailCode->state = 0;
+            $mailCode->created_at = date('Y-m-d H:i:s');
+            $mailCode->save();
+            return $this->success();
+        } catch (\Exception $e) {
+            return $this->error($e->getMessage());
+        }
+    }
+
+    //判断邮箱验证码 5分钟有效期 (这不是个API接口:哪里需要就放到哪里验证)
+    public static function isEmailCodeRight($email, $code)
+    {
+        $result = MailCode::query()
+            ->where('account', $email)
+            ->where('code', $code)
+            ->where('state', 0)
+            ->where('created_at', '>', Carbon::now()->subMinutes(5))
+            ->orderBy('id', 'desc')
+            ->first();
+
+        if (!$result) {
+            return false;
+        }
+        $result->state = 1; //验证通过就失效
+        $result->save();
+
+        return true;
+    }
+
+}

+ 60 - 0
app/Http/Controllers/V1/IndexController.php

xqd
@@ -0,0 +1,60 @@
+<?php
+
+namespace App\Http\Controllers\V1;
+
+use App\Auth;
+use App\libs\helpers\Curl;
+use App\libs\helpers\LogHelper;
+use App\libs\wechat\auth\WeChat;
+use App\Models\Help;
+use App\Models\Region;
+use Illuminate\Http\Request;
+use App\Models\Setting;
+use Illuminate\Support\Facades\Redis;
+use App\libs\helpers\Response;
+
+class IndexController extends Controller
+{
+    private $code = '_Index';
+
+    /**
+     * 首页
+     *
+     * @return \Illuminate\Http\JsonResponse
+     */
+    public function index(){
+        try {
+            $weChat = WeChat::General();
+            $userInfo = $weChat->auth('snsapi_userinfo');
+            var_dump($userInfo);
+            return  Response::success();
+        }catch (\Exception $exception){
+            LogHelper::exceptionLog($exception,$this->code);
+            return  Response::fail($exception->getMessage());
+        }
+    }
+    //隐私政策
+    public function privacyPolice()
+    {
+        $info = Setting::where('key', 'privacy')->where('is_delete', 0)->select('title', 'key', 'value')->first();
+
+        return $this->success($info);
+    }
+
+    //用户协议
+    public function userAgreement()
+    {
+        $info = Setting::where('key', 'agreement')->where('is_delete', 0)->select('title', 'key', 'value')->first();
+
+        return $this->success($info);
+    }
+
+    //关于我们
+    public function aboutus()
+    {
+        $info = Setting::where('key', 'aboutus')->where('is_delete', 0)->select('title', 'key', 'value')->first();
+
+        return $this->success($info);
+    }
+
+}

+ 436 - 0
app/Http/Controllers/V1/PayController.php

xqd
@@ -0,0 +1,436 @@
+<?php
+
+namespace App\Http\Controllers\V1;
+
+use Omnipay\Omnipay;
+use App\Helper\LogHelper;
+use App\Helper\PayHelper;
+use App\Helper\JpushHelper;
+use App\Models\User;
+use App\Models\order;
+use App\Models\AccountLog;
+use App\Services\Base\ErrorCode;
+use Illuminate\Support\Facades\Request;
+use Illuminate\Support\Facades\Validator;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Config;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Log;
+
+
+class PayController extends Controller
+{
+    use PayHelper, LogHelper,JpushHelper;
+
+    public function alipayNotify() {
+        $rawInfo = Request::all();
+        Log::info('aliplay callback');
+        Log::info($rawInfo);
+
+        $config = Config::get('laravel-omnipay.gateways.alipay');
+
+        $gateway = Omnipay::create($config['driver']);
+        print_r($gateway);exit;
+        $gateway->setEnvironment($config['options']['environment']);
+        $gateway->setAppId($config['options']['appid']);
+        $gateway->setEncryptKey($config['options']['encrypt_key']);
+        $gateway->setPrivateKey($config['options']['prikey']);
+        $gateway->setAlipayPublicKey($config['options']['ali_pubkey']);
+        $gateway->setNotifyUrl($config['options']['notify_url']);
+
+        $request = $gateway->completePurchase();
+        $request->setParams($rawInfo);//Optional
+
+        try {
+            $response = $request->send();
+
+            if($response->isPaid()){
+              echo 1;exit;
+//                 Log::info('支付成功');
+
+//                 $out_trade_no = $rawInfo['out_trade_no'];
+//                 $order = Order::where('transaction_id', '=', $out_trade_no)->first();
+//                 if (!$order) {
+//                     Log::error('找不到订单' . $out_trade_no);
+//                     return 'fail';
+//                 }
+//                 $master_amount =  $order->number;
+//                 $slave_amount = 0;
+//                 if (!empty($order->ext_info)) {
+//                     $extInfo = json_decode($order->ext_info, true);
+//                     if ($extInfo !== null) {
+//                         $cc = $extInfo['cc_bonus'];
+//                         $master_amount = round(($cc / 100) * $order->number);
+//                         $slave_amount = $order->number - $master_amount;
+//                     }
+//                 }
+//                 $tp = '';
+// //                $u = null;
+//                 if ($order->user_type == Order::USER_TYPE_MERCHANT) {
+//                     $tp = 'Merchant';
+// //                    $u = Merchant::find($order->user_id);
+//                 } elseif ($order->user_type == Order::USER_TYPE_MEMBER) {
+//                     $tp = 'Member';
+//                     //Not handled here
+//                 }
+//                 $u = User::find($order->user_id);
+//                 if (!$u) {
+//                     Log::error('用户不存在' . $order->user_type . ', ' . $order->user_id);
+//                     return 'success';
+//                 }
+
+//                 DB::beginTransaction();
+
+//                 if ($order->goods_type == Order::GOODS_TYPE_BALANCE||$order->goods_type == Order::GOODS_TYPE_COSUME) {
+//                     $cType = AccountLog::TYPE_BALANCE;
+// //                    $u->account_balance += $order->number;
+//                     $u->balance += $master_amount;
+//                 } elseif ($order->goods_type == Order::GOODS_TYPE_CREDIT) {
+//                     $cType = AccountLog::TYPE_CREDIT;
+// //                    $u->credit_balance += $order->number;
+//                     $u->credit += $master_amount;
+//                 } else {
+//                     Log::error('商品不存在' . $order->goods_type);
+//                     return 'success';
+//                 }
+//                 Log::info('支付金额 '.$master_amount);
+//                 if ($u->save()) {
+
+//                     //更新订单状态
+//                     $order->status = Order::STATUS_FINISHED;
+//                     $order->save();
+
+//                     //记日志
+//                     $amount = $rawInfo['total_amount'] * 100;
+//                     $_ops = AccountLog::getAllop();
+//                     $this->logAccount($tp, $u->id, $u->name,
+//                             AccountLog::OP_CHARGE, $cType, $master_amount,
+//                             AccountLog::DIRECTION_INC, $cType == AccountLog::TYPE_BALANCE ? $u->balance : $u->credit, AccountLog::CHANNEL_ALIPAY);
+
+//                     Log::info('支付完成');
+
+//                 } else {
+//                     DB::rollBack();
+//                     Log::error('保存数据失败');
+//                 }
+
+//                 DB::commit();
+
+//                 return 'success';
+            }else{
+                Log::error('支付失败');
+
+                return 'fail';
+            }
+        } catch (\Exception $e) {
+            Log::error('支付异常' . $e->getMessage());
+
+            return 'fail';
+        }
+
+    }
+
+    public function wechatpayNotify() {
+        Log::debug('wechatpay callback');
+//        Log::debug(Request::all());
+
+        $config = Config::get('laravel-omnipay.gateways.wechatpay');
+
+        $gateway = Omnipay::create("WechatPay");
+//        $gateway->setEnvironment('sandbox');
+        $gateway->setAppId($config['options']['appid']);
+        $gateway->setMchId($config['options']['merchant_id']);
+        $gateway->setApiKey($config['options']['apikey']);
+
+        $response = $gateway->completePurchase([
+            'request_params' => file_get_contents('php://input')
+        ])->send();
+        try {
+            if ($response->isPaid()) {
+                //pay success
+                // $rawInfo = $response->getRequestData();
+                // Log::debug($rawInfo);
+                // Log::info('支付成功');
+
+                // $out_trade_no = $rawInfo['out_trade_no'];
+                // $order = order::where('transaction_id', '=', $out_trade_no)->first();
+                // if (!$order) {
+                //     Log::error('找不到订单' . $out_trade_no);
+                //     return 'fail';
+                // }
+                // $u = User::find($order->user_id);
+                // if (!$u) {
+                //     Log::error('用户不存在' . $order->user_id . ', ' . $order->user_id);
+                //     return 'success';
+                // }
+
+                // DB::beginTransaction();
+                // $u->coin += $order->number;
+                // if ($u->save()) {
+
+                //     //更新订单状态
+                //     $order->status = order::STATUS_FINISHED;
+                //     $order->save();
+
+                //     //记日志
+                //     $_types = AccountLog::getAllType();
+                //     $_ops = AccountLog::getAllop();
+                //     $this->logAccount($_types[AccountLog::TYPE_CASH], $u->id, $u->name,$order->amount,
+                //         $_ops[AccountLog::OP_CHARGE],
+                //         $_types[AccountLog::TYPE_COIN], $u->id,$u->name,$order->amount,$out_trade_no,'http://miao.beiyuesi.com/base/img/wechat.png');
+
+                //     Log::info('支付完成');
+
+                // } else {
+                //     DB::rollBack();
+                //     Log::error('保存数据失败');
+                // }
+
+                // DB::commit();
+
+                // return 'success';
+            }else{
+                //pay fail
+                Log::error($response->getData());
+                return 'fail';
+            }
+
+        } catch (\Exception $e) {
+            Log::error('支付异常' . $e->getMessage());
+
+            return 'fail';
+        }
+    }
+
+
+
+    /**
+     * @api {post} /api/pay/charge 充值
+     * @apiDescription 充值(向平台充值)
+     * @apiGroup User
+     * @apiPermission Passport
+     * @apiVersion 0.1.0
+     * @apiParam {int}  [goods=1]   充值商品(1:梦想币)
+     * @apiParam {int}  number      充值数量,人民币,以分表示
+     * @apiParam {int}  type        支付类型(1:支付宝,2:微信支付)
+     * @apiSuccessExample {json} Success-Response:
+     * HTTP/1.1 200 OK
+     * {
+     *     "state": true,
+     *     "code": 0,
+     *     "message": "",
+     *     "data": {
+     *         "id": 2,
+     *         "code": "ALIPAY_201610231314145719",
+     *         "transaction_id": "201610231314145719",
+     *         "user_type": 2,
+     *         "user_id": 1,
+     *         "goods_type": 1,
+     *         "price": 1,
+     *         "number": 1,
+     *         "amount": 1,
+     *         "pay_type": 1,
+     *         "status": 0,
+     *         "created_at": "2016-10-23 13:14:14",
+     *         "updated_at": "2016-10-23 13:14:14",
+     *         "orderString": "alipay_sdk=lokielse%2Fomnipay-alipay&app_id=2016091201894867&biz_content=%7B%22subject%22%3A%22%5Cu7532%5Cu8c61%5Cu8054%5Cu5408-%5Cu4f59%5Cu989d%5Cu5145%5Cu503c%22%2C%22out_trade_no%22%3A%22201610231314145719%22%2C%22total_amount%22%3A0.01%2C%22product_code%22%3A1%7D&charset=UTF-8&format=JSON&method=alipay.trade.app.pay&notify_url=http%3A%2F%2Fweb%2Fapi%2Fpay%2Falipay%2Fnotify&sign_type=RSA&timestamp=2016-10-23+13%3A14%3A14&version=1.0&sign=oxKM0qGMHLWDlMrXHIiy9%2Fk2BXJq3rC3RKdmcfFwkBJVRXvtG6cBoAYPll6VxJYOMQWeu78Ibfov%2FxIVCuN9yUfzEiokfQrzBoptc94bCQ5k0pNyJcSdgezOUKHB12P5Zmm3Hd6AAbGRDV9UCaLVz0wYkFJPrCyUv1ZfhrM%2BBqc%3D"
+     *     }
+     * }
+     * @apiErrorExample {json} Error-Response:
+     * HTTP/1.1 400 Bad Request
+     * {
+     *     "state": false,
+     *     "code": 1000,
+     *     "message": "传入参数不正确",
+     *     "data": null or []
+     * }
+     * 可能出现的错误代码:
+     * 1000    CLIENT_WRONG_PARAMS             传入参数不正确
+     */
+    public function charge(Request $request)
+    {
+        $goodsTypes = order::getAllGoodsTypes();
+        $gTypes = array_keys($goodsTypes);
+        $payTypes = order::getAllPayTypes();
+        $pTypes = array_keys($payTypes);
+        $validator = Validator::make($data = $request->all(),
+            [
+                'number' => 'required|integer|min:1',
+                'type' => 'required|in:' . join(',', $pTypes),
+                'goods' => 'in:' . join(',', $gTypes),
+            ],
+            [
+                'number.required' => '请输入梦想币数量',
+                'number.integer' => '梦想币数量必须为整数',
+                'number.min' => '充值梦想币数量至少为1',
+                'type.required' => '支付类型必填',
+                'type.in' => '支付类型非法',
+                'goods.in' => '充值商品非法',
+            ]
+        );
+
+        if ($validator->fails()) {
+            return $this->validatorError($validator->messages()->all(), ErrorCode::CLIENT_WRONG_PARAMS);
+        }
+
+        $user = Auth::guard('api')->user();
+        $data['goods_id'] = 1;
+        if (!isset($data['goods'])) {//默认充余额
+            $data['goods'] = order::GOODS_TYPE_COIN;
+        }
+        $data['user_id'] = $user->id;
+        if ($data['type'] == order::PAY_TYPE_ALIPAY) {
+            $result = $this->createAlipayCharge($data);
+        } else {
+            $result = $this->createWechatpayCharge($data);
+        }
+
+        if ($result === false) {
+            return $this->error(ErrorCode::ORDER_GENERATE_FAILED);
+        }
+        //log
+//        $data['amount'] = $data['number'];
+//        $this->chargeLog('Merchant', $merchant->id, $merchant->name,
+//            'balance', $data['amount'], 'balance', $data['amount'],
+//            'Merchant', $user->id, $merchant->name);
+
+        return $this->api($result);
+    }
+
+    /**
+     * @api {post} /api/pay/order_status 订单状态查询
+     * @apiDescription 订单状态查询
+     * @apiGroup User
+     * @apiPermission Passport
+     * @apiVersion 0.1.0
+     * @apiParam {int}  [goods=1]   充值商品(1:梦想币)
+     * @apiParam {int}  number      充值数量,人民币,以分表示
+     * @apiParam {int}  type        支付类型(1:支付宝,2:微信支付)
+     * @apiSuccessExample {json} Success-Response:
+     * HTTP/1.1 200 OK
+     * {
+     *     "state": true,
+     *     "code": 0,
+     *     "message": "",
+     *     "data": {
+     *         "id": 2,
+     *         "code": "ALIPAY_201610231314145719",
+     *         "transaction_id": "201610231314145719",
+     *         "user_type": 2,
+     *         "user_id": 1,
+     *         "goods_type": 1,
+     *         "price": 1,
+     *         "number": 1,
+     *         "amount": 1,
+     *         "pay_type": 1,
+     *         "status": 0,
+     *         "created_at": "2016-10-23 13:14:14",
+     *         "updated_at": "2016-10-23 13:14:14",
+     *         "orderString": "alipay_sdk=lokielse%2Fomnipay-alipay&app_id=2016091201894867&biz_content=%7B%22subject%22%3A%22%5Cu7532%5Cu8c61%5Cu8054%5Cu5408-%5Cu4f59%5Cu989d%5Cu5145%5Cu503c%22%2C%22out_trade_no%22%3A%22201610231314145719%22%2C%22total_amount%22%3A0.01%2C%22product_code%22%3A1%7D&charset=UTF-8&format=JSON&method=alipay.trade.app.pay&notify_url=http%3A%2F%2Fweb%2Fapi%2Fpay%2Falipay%2Fnotify&sign_type=RSA&timestamp=2016-10-23+13%3A14%3A14&version=1.0&sign=oxKM0qGMHLWDlMrXHIiy9%2Fk2BXJq3rC3RKdmcfFwkBJVRXvtG6cBoAYPll6VxJYOMQWeu78Ibfov%2FxIVCuN9yUfzEiokfQrzBoptc94bCQ5k0pNyJcSdgezOUKHB12P5Zmm3Hd6AAbGRDV9UCaLVz0wYkFJPrCyUv1ZfhrM%2BBqc%3D"
+     *     }
+     * }
+     * @apiErrorExample {json} Error-Response:
+     * HTTP/1.1 400 Bad Request
+     * {
+     *     "state": false,
+     *     "code": 1000,
+     *     "message": "传入参数不正确",
+     *     "data": null or []
+     * }
+     * 可能出现的错误代码:
+     * 1000    CLIENT_WRONG_PARAMS             传入参数不正确
+     */
+
+    public function orderStatus(Request $request)
+    {
+
+        $validator = Validator::make($data = $request->all(),
+            [
+                'number' => 'required|integer|min:1',
+                'type' => 'required|in:' . join(',', $pTypes),
+                'goods' => 'in:' . join(',', $gTypes),
+            ],
+            [
+                'number.required' => '请输入梦想币数量',
+                'number.integer' => '梦想币数量必须为整数',
+                'number.min' => '充值梦想币数量至少为1',
+                'type.required' => '支付类型必填',
+                'type.in' => '支付类型非法',
+                'goods.in' => '充值商品非法',
+            ]
+        );
+
+        if ($validator->fails()) {
+            return $this->validatorError($validator->messages()->all(), ErrorCode::CLIENT_WRONG_PARAMS);
+        }
+        $order = new order();
+        $order->code            = $data['code'];
+        $order->transaction_id  = $data['transaction_id'];
+        $order->user_id         = $data['user_id'];
+        $order->goods_id        = $data['goods_id'];
+        $order->price           = $data['price'];
+        $order->number          = $data['number'];
+        $order->amount          = $data['amount'];
+        $order->pay_type        = $data['pay_type'];
+        if (isset($data['ext_info'])) {
+            $order->ext_info = $data['ext_info'];
+        }
+
+        if ($order->save()) {
+            return $order->find($order->id);
+        }
+        return $this->api('');
+    }
+
+    public function orderIos(Request $request)
+    {
+
+        $validator = Validator::make($data = $request->all(),
+            [
+                'number' => 'required',
+            ],
+            [
+                'number.required' => '请输入产品ID',
+            ]
+        );
+
+        if ($validator->fails()) {
+            return $this->validatorError($validator->messages()->all(), ErrorCode::CLIENT_WRONG_PARAMS);
+        }
+//        $order = new order();
+
+        Log::info($data['number']);
+
+        $AppleProducts = order::getAllAppleProducts();
+        $coin = 0 ;
+        if(isset($AppleProducts[$data['number']])){
+            $coin = $AppleProducts[$data['number']];
+        }
+//        $order->code            = $data['code'];
+//        $order->transaction_id  = $data['transaction_id'];
+//        $order->user_id         = $data['user_id'];
+//        $order->goods_id        = $data['goods_id'];
+//        $order->price           = $data['price'];
+//        $order->number          = $data['number'];
+//        $order->amount          = $data['amount'];
+//        $order->pay_type        = $data['pay_type'];
+
+        //更新订单状态
+//        $order->status = order::STATUS_FINISHED;
+//        $order->save();
+
+        $u = Auth::guard('api')->user();
+        $u->coin += $coin;
+        $u->save();
+        //记日志
+        $_types = AccountLog::getAllType();
+        $_ops = AccountLog::getAllop();
+        $this->logAccount($_types[AccountLog::TYPE_CASH], $u->id, $u->name,$coin,
+            $_ops[AccountLog::OP_CHARGE],
+            $_types[AccountLog::TYPE_COIN], $u->id,$u->name,$coin,$data['number'],'http://miao.beiyuesi.com/base/img/apple.png');
+
+        Log::info('支付完成');
+
+        return $this->api('');
+    }
+}

+ 46 - 0
app/Http/Controllers/V1/RegionController.php

xqd
@@ -0,0 +1,46 @@
+<?php
+
+namespace App\Http\Controllers\V1;
+
+use App\Models\Help;
+use App\Models\Region;
+use Illuminate\Http\Request;
+use App\Models\Advertise;
+use App\Models\Setting;
+use Hamcrest\Type\IsString;
+use Illuminate\Support\Facades\Redis;
+use Illuminate\Support\Facades\Validator;
+
+class RegionController extends Controller
+{
+    //全国地区
+    public function allRegion()
+    {
+        $regionList = Redis::get('all_region');
+        if(!empty($regionList)){
+            return $this->success(json_decode($regionList, true));
+        }
+
+        $list = Region::query()
+            ->where('type', 1)
+            ->select('code', 'full_name')
+            ->get()
+            ->toArray();
+
+        foreach ($list as $key => $val) {
+            $cityList = Region::query()->where('parent_code', $val['code'])->select('code', 'full_name')->get()->toArray();
+            foreach ($cityList as $k => $v) {
+                $areaList = Region::query()->where('parent_code', $v['code'])->select('code', 'full_name')->get()->toArray();
+                $v['area_list'] = $areaList;
+                $cityList[$k] = $v;
+            }
+            $val['city_list'] = $cityList;
+            $list[$key] = $val;
+        }
+
+        Redis::setex('all_region', 24*3600, json_encode($list));
+
+        return $this->success($list);
+    }
+
+}

+ 54 - 0
app/Http/Controllers/V1/SettingsController.php

xqd
@@ -0,0 +1,54 @@
+<?php
+
+namespace App\Http\Controllers\V1;
+
+use App\Models\Help;
+use App\Models\Region;
+use Illuminate\Http\Request;
+use App\Models\Advertise;
+use App\Models\Setting;
+use Hamcrest\Type\IsString;
+use Illuminate\Support\Facades\Redis;
+use Illuminate\Support\Facades\Validator;
+
+class SettingsController extends Controller
+{
+    //获取前端配置
+    public function get(Request $request)
+    {
+        $tags = $request->input('tags');
+        $key = $request->input('key');
+        $is_string = $request->input('is_string');
+        
+        if($request->filled('tags')){
+          $ret = Setting::get($tags);
+        }
+        if($request->filled('tags','key')){
+          $ret = Setting::get($tags,$key);
+        }
+        if($request->filled('tags','key','is_string')){
+          $ret = Setting::get($tags,$key,$is_string);
+        }
+        return $this->output($ret);
+    }
+
+    //设置用户配置信息
+    public function set(Request $request)
+    {
+        $tags = $request->input('tags', '');
+        $key = $request->input('key', '');
+        $value = $request->input('value', '');
+
+        $validator = Validator::make($request->all(), [
+            'tags' => 'required',
+            'key' => 'required',
+            'value' => 'required',
+        ]);
+        if ($validator->fails()) {
+            return $this->error($validator->errors()->first());
+        }
+        $ret = Setting::set($tags,$key,$value);
+        return $this->output($ret);
+    }
+    
+}

+ 68 - 0
app/Http/Controllers/V1/SmsController.php

xqd
@@ -0,0 +1,68 @@
+<?php
+
+namespace App\Http\Controllers\V1;
+
+use App\Models\User;
+use App\Services\Api\ErrorMsgServive;
+use App\Services\SmsServer;
+use Illuminate\Http\Request;
+use Illuminate\Support\Carbon;
+use Illuminate\Support\Facades\Mail;
+use App\Models\MailCode;
+use Illuminate\Support\Facades\Validator;
+use libphonenumber\PhoneNumberUtil;
+
+class SmsController extends Controller
+{
+    //发送短信验证码
+    public function send(Request $request)
+    {
+        $checkResult = $this->checkMobile($request->mobile);
+
+        if ($checkResult['prefix'] == '-1') { //手机号不合法
+            return $this->error('手机号不合法');
+        }
+        $request->event = $request->event ?: 'login';
+        if ($request->event == "forget") {
+            if (!User::where(['mobile' => $request->mobile])->first()) {
+                return $this->error('手机号未注册');
+            }
+        }
+        $prefix = $checkResult['prefix'];
+        $result = SmsServer::send($request->mobile, $request->event, $prefix);
+        if (isset($result['error'])) {
+            return $this->error('短信发送失败');
+        }
+        $data = [
+            'smsCode' => $result['smsCode'], //注意:实际不适合把验证码返回,主要是开发方便测试,生产环境请变为 ""
+        ];
+        return $this->success($data);
+    }
+
+
+    /**
+     * @param $mobile
+     * @return array
+     * 验证手机号是否合法(支持全球手机号验证)$phoneUtil->parse($mobile, "CN"),两个参数:(要验证的手机号,国家区号)
+     * 国际区号映射关系在 vendor\giggsey\libphonenumber-for-php\src\CountryCodeToRegionCodeMap.php
+     * 可以 在 PhoneNumberUtil::getInstance() 方法中 点击 CountryCodeToRegionCodeMap::$countryCodeToRegionCodeMap 跳过去
+     */
+    public static function checkMobile($mobile)
+    {
+        $phoneUtil = PhoneNumberUtil::getInstance();
+        try {
+            $cnNumberProto = $phoneUtil->parse($mobile, "CN"); //大陆
+            $prefix = '-1';
+            if ($isValid_CN = $phoneUtil->isValidNumber($cnNumberProto)) {
+                $prefix = '86';
+            }
+            $checkResult = [
+                'prefix' => $prefix
+            ];
+            return $checkResult;
+        } catch (\libphonenumber\NumberParseException $exception) {
+            ErrorMsgServive::write($exception, request()->url());
+        }
+    }
+
+}

+ 209 - 0
app/Http/Controllers/V1/UserController.php

xqd
@@ -0,0 +1,209 @@
+<?php
+
+namespace App\Http\Controllers\V1;
+
+
+use App\Models\User;
+use App\Models\UserFeedback;
+use App\Services\Api\SortService;
+use App\Services\Api\UserService;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Validator;
+use App\Services\Base\ErrorCode;
+use PHPUnit\Util\Exception;
+use App\Services\SmsServer;
+
+class UserController extends Controller
+{
+    public function __construct()
+    {
+        $this->user = auth('api')->user();
+        $this->userId = $this->user ? $this->user->id : 0;
+
+        //如果用户被删除,会自动退出登录
+        if (!empty($this->user->deleted_at)) {
+            $this->user->online = 0;
+            $this->user->save();
+            auth('api')->logout();
+        }
+    }
+    /**
+     * 获取用户列表
+     */
+    public function index(Request $request)
+    {
+        $validator = Validator::make($request->all(), [
+            'nickname' => 'required',
+        ]);
+        if($validator->fails()){
+            return $this->error($validator->errors()->first(),ErrorCode::PARAMS_ERROR);
+        }
+        $search  = ['keyword'=>'1'];
+
+        $where   = ['nickname' => $request->nickname];
+        $orderby = ['id'=>'desc','created_at'=>'desc'];
+        $pagesize = 10;
+
+        $list = (new UserService())->search($search,$where,$orderby,$pagesize);
+        return $this->success($list);
+    }
+    /**
+     * 获取用户详情
+     */
+    public function show(Request $request,$id)
+    {
+        $info = (new UserService())->show($id);
+        return $this->success($info);
+    }
+    /**
+     * 新增用户
+     */
+    public function create(Request $request)
+    {
+        $validator = Validator::make($request->all(), [
+            'nickname' => 'required',
+            'avatar' => 'required',
+            'password' => 'required',
+            'email' => 'required',
+            'mobile' => 'required',
+        ]);
+        if($validator->fails()){
+            return $this->error($validator->errors()->first(),ErrorCode::PARAMS_ERROR);
+        }
+        $res = (new UserService())->create($request->all());
+        return $this->success($res);
+    }
+
+    /**
+     * 更新用户
+     */
+    public function update(Request $request,$id)
+    {
+        $validator = Validator::make($request->all(), [
+            'nickname' => 'required',
+            'avatar' => 'required',
+            'password' => 'required',
+            'email' => 'required',
+            'mobile' => 'required',
+        ]);
+        if($validator->fails()){
+            return $this->error($validator->errors()->first(),ErrorCode::PARAMS_ERROR);
+        }
+        $res = (new UserService())->update($id,$request->all());
+        return $this->success($res);
+    }
+    
+    /**
+     * 删除用户
+     */
+    public function destroy(Request $request,$id)
+    {
+        $res = (new UserService())->destroy($id);
+        return $this->success($res);
+    }
+
+    /**
+     * 更新用户头像
+     */
+    public function avatar(Request $request,$id)
+    {
+        $validator = Validator::make($request->all(), [
+            'avatar' => 'required',
+        ]);
+        if($validator->fails()){
+            return $this->error($validator->errors()->first(),ErrorCode::PARAMS_ERROR);
+        }
+        $res = (new UserService())->update($id,$request->all());
+        return $this->success($id);
+    }
+    //问题反馈
+    public function feedback(Request $request)
+    {
+        $content  = $request->input('content');
+        $file_url = $request->input('file_url', '');
+
+        $validator = Validator::make($request->all(), [
+            'content' => 'required|min:2|max:200',
+        ]);
+        if($validator->fails()){
+            return $this->error($validator->errors()->first());
+        }
+
+        $feedback = new UserFeedback();
+        $feedback->user_id = $this->userId;
+        $feedback->content = $content;
+        $feedback->file = !empty($file_url) ? json_encode($file_url) : '';
+        $feedback->save();
+
+        return $this->success();
+    }
+
+    //按照首字母进行分组排序,类似手机通讯录(注意:get()后面直接 ->toArray()在数据为空的时候导致报错)
+    public function groupByInitial(Request $request)
+    {
+        $keyword = $request->input('keyword', '');
+
+        $list = User::query()
+            ->select('id', 'name', 'avatar')
+            ->when($keyword, function ($query, $keyword){
+                $query->where('name', 'like', '%'.$keyword.'%');
+            })
+            ->whereNotNull('name')
+            ->whereNull('deleted_at')
+            ->get();
+
+        if($list->isNotEmpty()){
+            $list = $list->toArray();
+            $list = SortService::getResultList($list);
+        }else{
+            $list = [];
+        }
+
+        return $this->success($list);
+    }
+
+    //绑定或解绑 手机号
+    public function bindMobile(Request $request)
+    {
+        try {
+            if(!$this->isAllowUnbound()){
+              return $this->output([],ErrorCode::NOT_ALLOW);
+            }
+            $user = User::find($this->user->id);
+            if (!empty($user->mobile)) { //要解绑
+                $user->mobile = '';
+            } else { //要绑定
+                $user->mobile = $request->mobile;
+            }
+            SmsServer::checkSmsCodeByVerifyKey($request->mobile, $request->smsCode);
+            if (!$user->save()) {
+              return $this->output([],ErrorCode::DATA_SAVE_FALSE);
+            }
+        } catch (\Exception $exception) {
+            return $this->error($exception->getMessage());
+        }
+
+        return $this->success();
+    }
+
+    //判断是否允许解绑
+    public function isAllowUnbound()
+    {
+        $user = $this->user;
+        $n = 0;
+        if(!empty($user->mobile)){
+            $n++;
+        }
+        if(!empty($user->email)){
+            $n++;
+        }
+        if(!empty($user->open_id)){
+            $n++;
+        }
+        if($n==1){
+            return false;
+        }
+        return true;
+    }
+
+}

+ 71 - 0
app/Http/Kernel.php

xqd
@@ -0,0 +1,71 @@
+<?php
+
+namespace App\Http;
+
+use App\libs\middleware\CheckAuth;
+use App\libs\middleware\ApiLogs;
+use Illuminate\Foundation\Http\Kernel as HttpKernel;
+
+class Kernel extends HttpKernel
+{
+    /**
+     * The application's global HTTP middleware stack.
+     *
+     * These middleware are run during every request to your application.
+     *
+     * @var array
+     */
+    protected $middleware = [
+        // \App\Http\Middleware\TrustHosts::class,
+        \App\Http\Middleware\TrustProxies::class,
+        \Fruitcake\Cors\HandleCors::class,
+        \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
+        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
+        \App\Http\Middleware\TrimStrings::class,
+        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
+    ];
+
+    /**
+     * The application's route middleware groups.
+     *
+     * @var array
+     */
+    protected $middlewareGroups = [
+        'web' => [
+            \App\Http\Middleware\EncryptCookies::class,
+            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
+            \Illuminate\Session\Middleware\StartSession::class,
+            // \Illuminate\Session\Middleware\AuthenticateSession::class,
+            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
+            \App\Http\Middleware\VerifyCsrfToken::class,
+            \Illuminate\Routing\Middleware\SubstituteBindings::class,
+        ],
+
+        'api' => [
+            // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
+            'throttle:api',
+            \Illuminate\Routing\Middleware\SubstituteBindings::class,
+        ],
+    ];
+
+    /**
+     * The application's route middleware.
+     *
+     * These middleware may be assigned to groups or used individually.
+     *
+     * @var array
+     */
+    protected $routeMiddleware = [
+        'auth' => \App\Http\Middleware\Authenticate::class,
+        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
+        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
+        'can' => \Illuminate\Auth\Middleware\Authorize::class,
+        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
+        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
+        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
+        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
+        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
+        'apiLogs' => ApiLogs::class,
+        'checkAuth' => CheckAuth::class
+    ];
+}

+ 21 - 0
app/Http/Middleware/Authenticate.php

xqd
@@ -0,0 +1,21 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Auth\Middleware\Authenticate as Middleware;
+
+class Authenticate extends Middleware
+{
+    /**
+     * Get the path the user should be redirected to when they are not authenticated.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return string|null
+     */
+    protected function redirectTo($request)
+    {
+        if (! $request->expectsJson()) {
+            return route('login');
+        }
+    }
+}

+ 17 - 0
app/Http/Middleware/EncryptCookies.php

xqd
@@ -0,0 +1,17 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;
+
+class EncryptCookies extends Middleware
+{
+    /**
+     * The names of the cookies that should not be encrypted.
+     *
+     * @var array
+     */
+    protected $except = [
+        //
+    ];
+}

+ 17 - 0
app/Http/Middleware/PreventRequestsDuringMaintenance.php

xqd
@@ -0,0 +1,17 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance as Middleware;
+
+class PreventRequestsDuringMaintenance extends Middleware
+{
+    /**
+     * The URIs that should be reachable while maintenance mode is enabled.
+     *
+     * @var array
+     */
+    protected $except = [
+        //
+    ];
+}

+ 32 - 0
app/Http/Middleware/RedirectIfAuthenticated.php

xqd
@@ -0,0 +1,32 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use App\Providers\RouteServiceProvider;
+use Closure;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+
+class RedirectIfAuthenticated
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \Closure  $next
+     * @param  string|null  ...$guards
+     * @return mixed
+     */
+    public function handle(Request $request, Closure $next, ...$guards)
+    {
+        $guards = empty($guards) ? [null] : $guards;
+
+        foreach ($guards as $guard) {
+            if (Auth::guard($guard)->check()) {
+                return redirect(RouteServiceProvider::HOME);
+            }
+        }
+
+        return $next($request);
+    }
+}

+ 19 - 0
app/Http/Middleware/TrimStrings.php

xqd
@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware;
+
+class TrimStrings extends Middleware
+{
+    /**
+     * The names of the attributes that should not be trimmed.
+     *
+     * @var array
+     */
+    protected $except = [
+        'current_password',
+        'password',
+        'password_confirmation',
+    ];
+}

+ 20 - 0
app/Http/Middleware/TrustHosts.php

xqd
@@ -0,0 +1,20 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Http\Middleware\TrustHosts as Middleware;
+
+class TrustHosts extends Middleware
+{
+    /**
+     * Get the host patterns that should be trusted.
+     *
+     * @return array
+     */
+    public function hosts()
+    {
+        return [
+            $this->allSubdomainsOfApplicationUrl(),
+        ];
+    }
+}

+ 23 - 0
app/Http/Middleware/TrustProxies.php

xqd
@@ -0,0 +1,23 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Http\Middleware\TrustProxies as Middleware;
+use Illuminate\Http\Request;
+
+class TrustProxies extends Middleware
+{
+    /**
+     * The trusted proxies for this application.
+     *
+     * @var array|string|null
+     */
+    protected $proxies;
+
+    /**
+     * The headers that should be used to detect proxies.
+     *
+     * @var int
+     */
+    protected $headers = Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO | Request::HEADER_X_FORWARDED_AWS_ELB;
+}

+ 17 - 0
app/Http/Middleware/VerifyCsrfToken.php

xqd
@@ -0,0 +1,17 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
+
+class VerifyCsrfToken extends Middleware
+{
+    /**
+     * The URIs that should be excluded from CSRF verification.
+     *
+     * @var array
+     */
+    protected $except = [
+        //
+    ];
+}

+ 95 - 0
app/Models/AccountLog.php

xqd
@@ -0,0 +1,95 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class AccountLog extends Model
+{
+    public $table = 'account_logs';
+
+    protected $fillable = [
+        'from_type',
+        'from_name',
+        'to_type',
+        'from_id',
+        'to_id',
+        'to_name',
+        'op',
+        'from_amount',
+        'to_amount',
+        'transaction_id',
+        'avatar',
+        'channel',
+        'title',
+        'dream_id',
+        'note',
+    ];
+    //交易行为定义
+    const OP_CHARGE         = 'CHARGE';
+    const OP_SUPPORT        = 'SUPPORT';
+    const OP_WITHDRAW       = 'WITHDRAW';
+    const OP_DREAM          = 'DREAM';
+
+    //货币类型定义
+    const TYPE_BALANCE      = 1;
+    const TYPE_COIN         = 2;
+    const TYPE_CASH         = 3;
+
+    //交易渠道定义
+    const CHANNEL_PLATFORM  = 'platform';
+    const CHANNEL_ALIPAY    = 'alipay';
+    const CHANNEL_WECHATPAY = 'wechatpay';
+
+//    //交易方向
+//    const DIRECTION_INC     = 1; //增加
+//    const DIRECTION_DEC     = 2; //减少
+
+    //交易行为枚举
+    private static $_op = [
+        self::OP_CHARGE         => '充值',
+        self::OP_SUPPORT        => '支持梦想',
+        self::OP_WITHDRAW       => '提现',
+        self::OP_DREAM          => '梦想结束',
+    ];
+
+    //货币类型枚举
+    private static $_type = [
+        self::TYPE_BALANCE      => '余额',
+        self::TYPE_COIN         => '梦想币',
+        self::TYPE_CASH         => '现金',
+    ];
+
+    //交易渠道枚举
+    private static $_channels = [
+        self::CHANNEL_PLATFORM  => '平台内交易',
+        self::CHANNEL_ALIPAY    => '支付宝',
+        self::CHANNEL_WECHATPAY => '微信支付',
+    ];
+
+//    // 交易流向
+//    private static $_direction = [
+//        self::DIRECTION_INC => '收入',
+//        self::DIRECTION_DEC => '支出'
+//    ];
+
+    // 获取所有操作
+    public static function getAllop() {
+        return self::$_op;
+    }
+
+    // 获取所有类型
+    public static function getAllType() {
+        return self::$_type;
+    }
+
+    //获取所有渠道
+    public static function getAllChannels() {
+        return self::$_channels;
+    }
+
+    // 获取交易流向
+    public static function getAllDirections() {
+        return self::$_direction;
+    }
+}

+ 14 - 0
app/Models/Article.php

xqd
@@ -0,0 +1,14 @@
+<?php
+
+namespace App\Models;
+
+use Dcat\Admin\Traits\HasDateTimeFormatter;
+
+use Illuminate\Database\Eloquent\Model;
+
+class Article extends Model
+{
+	use HasDateTimeFormatter;
+    protected $table = 'article';
+    
+}

+ 21 - 0
app/Models/BaseAttachment.php

xqd
@@ -0,0 +1,21 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class BaseAttachment extends Model
+{
+    //
+    /**
+     * 数据表名
+     *
+     * @var string
+     *
+     */
+    protected $table = 'base_attachments';
+    /**
+     * 主键
+     */
+    protected $primaryKey = 'id';
+}

+ 82 - 0
app/Models/BaseConfig.php

xqd
@@ -0,0 +1,82 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * Class System_Config
+ * @package App
+ */
+
+class BaseConfig extends Model
+{
+    //
+    protected $table = "base_config";
+    protected $guarded = [];
+    static $groups = [
+        'ali_config'=>'阿里云',
+        'wechat_config'=>'微信',
+        'system_config'=>'系统设置',
+        'put_config'=>'投放设置',
+        'fetch_config'=>'清运设置',
+        'cash_config'=>'提现设置',
+        'assistant_setting'=>'协管员提现设置',
+    ];
+    const Field_textarea = 0,
+          Filed_richText = 1,
+          Field_Json = 2,
+          Field_Switch = 3,
+          Field_Time = 4,
+          Field_File = 5,
+          Field_Checkbox = 6,
+          Field_Json_Array = 7;
+
+    private static $_fieldType = [
+        self::Field_textarea =>'纯文本',
+        self::Filed_richText =>'富文本',
+        self::Field_Json =>'JSON',
+        self::Field_Switch =>'开关',
+        self::Field_Time =>'时间',
+        self::Field_File =>'文件',
+        self::Field_Checkbox =>'选择框',
+        self::Field_Json_Array =>'数组JSON',
+    ];
+
+    protected static function getType(){
+        return self::$_fieldType;
+    }
+
+    /**
+     * @param String $group
+     * @param String $key
+     * @param String $default
+     * @return array|String
+     */
+    public static function get(string $group, string $key = '', string $default = "")
+    {
+        $query = self::where('group', $group);
+        if ($key) {
+            $res = $query->where('key', $key)->first(['value'])->value ?? $default;
+            return $res;
+        } else {
+            $res =  $query->get(['key', 'value']);
+            $arr = [];
+            foreach ($res as $index => $item) {
+                $arr[$item['key']] = $item['value'];
+            }
+            return $arr;
+        }
+    }
+
+    /**
+     * @param String $group
+     * @param String $key
+     * @param String $value
+     * @return int
+     */
+    public static function set(string $group, string $key, string $value)
+    {
+        return self::where([['group', $group], ['key', $key]])->update(['value' => $value]);
+    }
+}

+ 28 - 0
app/Models/BaseDistrict.php

xqd
@@ -0,0 +1,28 @@
+<?php
+
+namespace App\Model;
+
+use Illuminate\Database\Eloquent\Model;
+
+class BaseDistrict extends Model
+{
+    //
+    protected $table = "base_district";
+    protected $guarded = [];
+
+
+    public function province()
+    {
+        return $this->belongsTo(BaseDistrict::class,'pid','id');
+    }
+
+    public function city()
+    {
+        return $this->belongsTo(BaseDistrict::class,'pid','id');
+    }
+
+//    public function communities()
+//    {
+//        return $this->hasMany(Communities::class,'area_id','id');
+//    }
+}

+ 14 - 0
app/Models/Help.php

xqd
@@ -0,0 +1,14 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class Help extends Model
+{
+    use HasFactory;
+
+    const CREATED_AT = null;
+    const UPDATED_AT = null;
+}

+ 11 - 0
app/Models/MailCode.php

xqd
@@ -0,0 +1,11 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class MailCode extends Model
+{
+    use HasFactory;
+}

+ 86 - 0
app/Models/Order.php

xqd
@@ -0,0 +1,86 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class Order extends Model
+{
+    //
+    protected $table = 'order';
+    protected $primaryKey = 'id';
+
+    //用户类型定义
+//    const USER_TYPE_USER    = 1;
+
+    //用户类型枚举
+//    private static $_user_types = [
+//        self::USER_TYPE_USER    => '会员',
+//    ];
+
+    //商品类型定义
+    const GOODS_TYPE_COIN  = 1;
+//    const GOODS_TYPE_COSUME   = 3;
+
+    //商品类型枚举
+    private static $_goods_types = [
+        self::GOODS_TYPE_COIN    => '梦想币',
+//        self::GOODS_TYPE_COSUME     => '续消现金',
+    ];
+
+    //支付类型定义
+    const PAY_TYPE_ALIPAY     = 1;
+    const PAY_TYPE_WECHATPAY  = 2;
+
+    //支付类型枚举
+    private static $_pay_types = [
+        self::PAY_TYPE_ALIPAY       => '支付宝',
+        self::PAY_TYPE_WECHATPAY    => '微信支付',
+//        self::PAY_TYPE_UNIONPAY     => '银联支付',
+    ];
+
+    //苹果支付金额
+    private static $_apple_products = [
+        self::Apple_Product1      => 6,
+        self::Apple_Product2      => 6,
+        self::Apple_Product3      => 50,
+        self::Apple_Product4      => 188,
+        self::Apple_Product5      => 898,
+    ];
+
+    //苹果支付类型
+    const Apple_Product1    = 'apple10000';
+    const Apple_Product2    = 'apple10001';
+    const Apple_Product3    = 'apple102';
+    const Apple_Product4    = 'apple103';
+    const Apple_Product5    = 'apple104';
+
+    //订单状态定义
+    const STATUS_PENDING    = 0;
+    const STATUS_FINISHED   = 1;
+    const STATUS_CANCELED   = 2;
+
+    //订单状态枚举
+    private static $_status = [
+        self::STATUS_PENDING    => '待处理',
+        self::STATUS_FINISHED   => '已完成',
+        self::STATUS_CANCELED   => '已取消',
+    ];
+
+
+    public static function getAllGoodsTypes() {
+        return self::$_goods_types;
+    }
+
+    public static function getAllStatus() {
+        return self::$_status;
+    }
+
+    public static function getAllPayTypes() {
+        return self::$_pay_types;
+    }
+
+    public static function getAllAppleProducts() {
+        return self::$_apple_products;
+    }
+}

+ 11 - 0
app/Models/Region.php

xqd
@@ -0,0 +1,11 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class Region extends Model
+{
+    use HasFactory;
+}

+ 57 - 0
app/Models/Setting.php

xqd
@@ -0,0 +1,57 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class Setting extends Model
+{
+    use HasFactory;
+
+    protected $table = 'base_settings';
+
+    //todo 对数据库做简单的封装 get和set(管理端会用到)  加缓存
+    /**
+     * @param String $tags
+     * @param String $key
+     * @param String $default
+     * @return array|String
+     */
+    public static function get(string $tags, string $key = '', bool $is_string = false)
+    {
+        if($tags){
+          $map[] = ['tags','=',$tags];
+        }
+        if($key){
+          $map[] = ['key','=',$key];
+        }
+        $map[] = ['is_delete','=',0];
+        if($is_string){
+          $list = self::where($map)->select('title', 'key', 'value','tags')->get();
+          $settings = [];
+          foreach($list as $key=>&$val){
+            $settings[$val['tags']][] = $val;
+          }
+        }else{
+          $list = self::where($map)->select('title', 'key', 'value','tags')->get()->toArray();
+          $settings = [];
+          foreach($list as $key=>&$val){
+            $val['value'] = json_decode($val['value']);
+            $settings[$val['tags']][] = $val;
+          }
+        }
+        return $settings;
+    }
+
+    /**
+     * @param String $tags
+     * @param String $key
+     * @param String $value
+     * @return int
+     */
+    public static function set(string $tags, string $key, string $value)
+    {
+        return self::where([['tags', $tags], ['key', $key]])->update(['value' => $value]);
+    }
+}

+ 15 - 0
app/Models/SmsRecord.php

xqd
@@ -0,0 +1,15 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class SmsRecord extends Model
+{
+    //
+    protected $table = "sms_records";
+    protected $guarded = [];
+    protected $casts = [
+        'sms_result' => 'array',
+    ];
+}

+ 61 - 0
app/Models/User.php

xqd
@@ -0,0 +1,61 @@
+<?php
+
+namespace App\Models;
+
+use Dcat\Admin\Traits\HasDateTimeFormatter;
+use Illuminate\Database\Eloquent\SoftDeletes;
+use Illuminate\Foundation\Auth\User as Authenticatable;
+use Illuminate\Notifications\Notifiable;
+use PHPOpenSourceSaver\JWTAuth\Contracts\JWTSubject;
+
+class User extends Authenticatable implements JWTSubject
+{
+    use Notifiable,HasDateTimeFormatter,SoftDeletes;
+
+    /**
+     * The attributes that are mass assignable.
+     *
+     * @var array
+     */
+    protected $fillable = [
+        'nickname',
+        'email',
+        'avatar',
+        'password',
+        'mobile',
+        'open_id',
+        'union_id'
+    ];
+    //protected $guarded = [];
+    /**
+     * The attributes that should be hidden for arrays.
+     *
+     * @var array
+     */
+    // protected $hidden = [
+    //     'password',
+    //     'remember_token',
+    // ];
+
+    public function getJWTIdentifier()
+    {
+        return $this->getKey(); // TODO: Implement getJWTIdentifier() method.
+    }
+
+    public function getJWTCustomClaims()
+    {
+        return [
+            'role' => 'user'
+        ];  // TODO: Implement getJWTCustomClaims() method.
+    }
+
+    /**
+     * 设置密码加密
+     * @param $value
+     * @return string
+     */
+    public function setPasswordAttribute($value)
+    {
+        $this->attributes['password'] = bcrypt($value);
+    }
+}

+ 19 - 0
app/Models/UserFeedback.php

xqd
@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Models;
+
+use Dcat\Admin\Traits\HasDateTimeFormatter;
+
+use Illuminate\Database\Eloquent\Model;
+
+class UserFeedback extends Model
+{
+	use HasDateTimeFormatter;
+
+    protected $table = 'user_feedback';
+
+    public function user()
+    {
+        return $this->belongsTo(User::class,'user_id','id');
+    }
+}

+ 49 - 0
app/Providers/AppServiceProvider.php

xqd
@@ -0,0 +1,49 @@
+<?php
+
+namespace App\Providers;
+
+use App\Models\User;
+use Illuminate\Support\ServiceProvider;
+use Prettus\Repository\Providers\RepositoryServiceProvider;
+
+class AppServiceProvider extends ServiceProvider
+{
+    /**
+     * Register any application services.
+     *
+     * @return void
+     */
+    public function register()
+    {
+        $this->app->register(RepositoryServiceProvider::class);
+        $this->app->singleton('getUserInstance', function (){
+            return new User();
+        });
+    }
+
+    /**
+     * Bootstrap any application services.
+     *
+     * @return void
+     */
+    public function boot()
+    {
+        \Schema::defaultStringLength(191);
+        // 打印所有sql
+        if(config('app.db_log')) {
+            \DB::listen(function($query) {
+                // 先替换sql中的 % 避免 vsprintf 当成参数解析报错  Too few arguments
+                $tmp = str_replace('%', '(no-vsprintf)', $query->sql);
+                // \Log::info($tmp);
+                $tmp = str_replace('?', '"'.'%s'.'"', $tmp);
+                // \Log::info($tmp);
+                $tmp = vsprintf($tmp, $query->bindings);
+                $tmp = str_replace("\\","",$tmp);
+                // 还原 %
+                $tmp = str_replace('(no-vsprintf)', '%', $tmp);
+                \Log::info($tmp);
+                //Log::info($tmp."\n\n\t");
+           });
+       }
+    }
+}

+ 30 - 0
app/Providers/AuthServiceProvider.php

xqd
@@ -0,0 +1,30 @@
+<?php
+
+namespace App\Providers;
+
+use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
+use Illuminate\Support\Facades\Gate;
+
+class AuthServiceProvider extends ServiceProvider
+{
+    /**
+     * The policy mappings for the application.
+     *
+     * @var array
+     */
+    protected $policies = [
+        // 'App\Models\Model' => 'App\Policies\ModelPolicy',
+    ];
+
+    /**
+     * Register any authentication / authorization services.
+     *
+     * @return void
+     */
+    public function boot()
+    {
+        $this->registerPolicies();
+
+        //
+    }
+}

+ 21 - 0
app/Providers/BroadcastServiceProvider.php

xqd
@@ -0,0 +1,21 @@
+<?php
+
+namespace App\Providers;
+
+use Illuminate\Support\Facades\Broadcast;
+use Illuminate\Support\ServiceProvider;
+
+class BroadcastServiceProvider extends ServiceProvider
+{
+    /**
+     * Bootstrap any application services.
+     *
+     * @return void
+     */
+    public function boot()
+    {
+        Broadcast::routes();
+
+        require base_path('routes/channels.php');
+    }
+}

+ 32 - 0
app/Providers/EventServiceProvider.php

xqd
@@ -0,0 +1,32 @@
+<?php
+
+namespace App\Providers;
+
+use Illuminate\Auth\Events\Registered;
+use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
+use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
+use Illuminate\Support\Facades\Event;
+
+class EventServiceProvider extends ServiceProvider
+{
+    /**
+     * The event listener mappings for the application.
+     *
+     * @var array
+     */
+    protected $listen = [
+        Registered::class => [
+            SendEmailVerificationNotification::class,
+        ],
+    ];
+
+    /**
+     * Register any events for your application.
+     *
+     * @return void
+     */
+    public function boot()
+    {
+        //
+    }
+}

+ 63 - 0
app/Providers/RouteServiceProvider.php

xqd
@@ -0,0 +1,63 @@
+<?php
+
+namespace App\Providers;
+
+use Illuminate\Cache\RateLimiting\Limit;
+use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\RateLimiter;
+use Illuminate\Support\Facades\Route;
+
+class RouteServiceProvider extends ServiceProvider
+{
+    /**
+     * The path to the "home" route for your application.
+     *
+     * This is used by Laravel authentication to redirect users after login.
+     *
+     * @var string
+     */
+    public const HOME = '/home';
+
+    /**
+     * The controller namespace for the application.
+     *
+     * When present, controller route declarations will automatically be prefixed with this namespace.
+     *
+     * @var string|null
+     */
+    // protected $namespace = 'App\\Http\\Controllers';
+
+    /**
+     * Define your route model bindings, pattern filters, etc.
+     *
+     * @return void
+     */
+    public function boot()
+    {
+        $this->configureRateLimiting();
+
+        $this->routes(function () {
+            Route::prefix('api')
+                ->middleware('api')
+                ->namespace($this->namespace)
+                ->group(base_path('routes/api.php'));
+
+            Route::middleware('web')
+                ->namespace($this->namespace)
+                ->group(base_path('routes/web.php'));
+        });
+    }
+
+    /**
+     * Configure the rate limiters for the application.
+     *
+     * @return void
+     */
+    protected function configureRateLimiting()
+    {
+        RateLimiter::for('api', function (Request $request) {
+            return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip());
+        });
+    }
+}

+ 222 - 0
app/Services/AliYunIotServer.php

xqd
@@ -0,0 +1,222 @@
+<?php
+
+namespace App\Server;
+
+use AlibabaCloud\Client\AlibabaCloud;
+use AlibabaCloud\Client\Exception\ClientException;
+use AlibabaCloud\Client\Exception\ServerException;
+use Illuminate\Support\Facades\Log;
+
+class AliYunIotServer
+{
+
+    protected $errMsg;
+    private $appKey;
+    private $appSecret;
+    private $regionId;
+
+    const DISABLE = 0;
+    const ENABLE = 1;
+
+    /**
+     * AliYunIotServer constructor.
+     * @param string $appKey
+     * @param string $appSecret
+     * @param string $regionId
+     */
+    public function __construct(string $appKey, string $appSecret, string $regionId = 'cn-hangzhou')
+    {
+        $this->appKey = $appKey;
+        $this->appSecret = $appSecret;
+        $this->regionId = $regionId;
+    }
+
+    /**
+     * 获取服务列表
+     * @param int $pageSize
+     * @param int $currentPage
+     * @return array|string
+     */
+    public function getProductList(int $pageSize = 5, int $currentPage = 1)
+    {
+        $params = [
+            'RegionId' => $this->regionId,
+            'PageSize' => "$pageSize",
+            'CurrentPage' => "$currentPage",
+        ];
+        return $this->AliCurl("post", "QueryProductList", $params);
+    }
+
+    /**
+     * 获取设备列表
+     * @param string $productKey
+     * @param int $pageSize
+     * @param int $currentPage
+     * @return array|string
+     */
+    public function getDeviceList(string $productKey, int $pageSize = 5, int $currentPage = 1)
+    {
+        $params = [
+            'RegionId' => $this->regionId,
+            'PageSize' => "$pageSize",
+            'ProductKey' => "$productKey",
+            'CurrentPage' => "$currentPage",
+        ];
+        return $this->AliCurl("post", "QueryDevice", $params);
+    }
+
+    /**
+     * 获取设备属性
+     * @param string $iotId
+     * @param string $iotInstanceId
+     * @return array|string
+     */
+    public function getDeviceProperty(string $iotId, string $iotInstanceId = '')
+    {
+        $params['IotId'] = $iotId;
+        $params['RegionId'] = $this->regionId;
+        /*foreach ($identifier as $key => $val) {
+            $params['Identifier.' . ($key + 1)] = $val;
+        }*/
+        if ($iotInstanceId) {
+            $params['IotInstanceId'] = $iotInstanceId;
+        }
+        return $this->AliCurl("post", "QueryDevicePropertyStatus", $params);
+    }
+
+    /**
+     * 获取设备状态
+     * @param string $iotId
+     * @param string $iotInstanceId
+     * @return array|string
+     */
+    public function getDeviceStatus(string $iotId, string $iotInstanceId = '')
+    {
+        $params['IotId'] = $iotId;
+        $params['RegionId'] = $this->regionId;
+        /*foreach ($identifier as $key => $val) {
+            $params['Identifier.' . ($key + 1)] = $val;
+        }*/
+        if ($iotInstanceId) {
+            $params['IotInstanceId'] = $iotInstanceId;
+        }
+        return $this->AliCurl("post", "GetDeviceStatus", $params);
+    }
+
+    /**
+     * 设置设备属性
+     * @param string $iotId
+     * @param array $property
+     * @param string $iotInstanceId
+     * @return array|string
+     */
+    public function setDeviceProperty(string $iotId, array $property, string $iotInstanceId = '')
+    {
+        /*if ($this->checkProperty($property)) {
+            return $this->errMsg;
+        }*/
+        $params['Items'] = json_encode($property);
+        //dd($params);
+        Log::info("手动上报设备属性" . $params['Items']);
+        $params['IotId'] = $iotId;
+        if ($iotInstanceId) {
+            $params['IotInstanceId'] = $iotInstanceId;
+        }
+        //dd($params);
+        return $this->AliCurl("post", "SetDeviceProperty", $params);
+    }
+
+    /**
+     * 调用设备服务
+     * @param string $iotId
+     * @param string $identifier
+     * @param object $args
+     * @param string $iotInstanceId
+     * @return array|string
+     */
+    public function invokeThingService(string $iotId, string $identifier, object $args, string $iotInstanceId = '')
+    {
+        $params['IotId'] = $iotId;
+        $params['Identifier'] = $identifier;
+        $params['Args'] = json_encode($args);
+        if ($iotInstanceId) {
+            $params['IotInstanceId'] = $iotInstanceId;
+        }
+        return $this->AliCurl("post", "InvokeThingService", $params);
+    }
+
+    /**
+     * 禁用&解禁设备
+     * @param int $status
+     * @param string $iotId
+     * @param string $iotInstanceId
+     * @return array|string
+     */
+    public function switchDevice(int $status, string $iotId, string $iotInstanceId = '')
+    {
+        $params['IotId'] = $iotId;
+        if ($iotInstanceId) {
+            $params['IotInstanceId'] = $iotInstanceId;
+        }
+        if ($status == self::DISABLE) {
+            return $this->AliCurl("post", "DisableThing", $params);
+        } else if ($status == self::ENABLE) {
+            return $this->AliCurl("post", "EnableThing", $params);
+        }
+    }
+
+    /**
+     * @param string $method
+     * @param string $action
+     * @param array $params
+     * @return array|string
+     */
+    private function AliCurl(string $method, string $action, array $params = [])
+    {
+        try {
+            AlibabaCloud::accessKeyClient($this->appKey, $this->appSecret)
+                ->regionId($this->regionId)
+                ->asDefaultClient();
+            $result = AlibabaCloud::rpc()
+                ->product('Iot')
+                // ->scheme('https') // https | http
+                ->version('2018-01-20')
+                ->action($action)
+                ->method(strtoupper($method))
+                ->host('iot.cn-shanghai.aliyuncs.com')
+                ->options([
+                    'query' => $params
+                ])
+                ->request();
+            return $result->toarray();
+        } catch (ClientException $e) {
+            return $e->getErrorMessage() . PHP_EOL;
+        } catch (ServerException $e) {
+            return $e->getErrorMessage() . PHP_EOL;
+        }
+    }
+
+    /**
+     * @param array $params
+     * @return bool
+     */
+    protected function checkProperty(array $params)
+    {
+        $initialProperty = ['LockSwitch' => 'is_bool'];
+        foreach ($params as $key => $val) {
+            if (!isset($initialProperty[$key])) {
+                $this->errMsg = '该属性未定义';
+                return false;
+            }
+            if ($initialProperty[$key]($val)) {
+                $this->errMsg = '该属性数据类型异常';
+                return false;
+            }
+            if ($val == '' || $val == [] || $val == null) {
+                $this->errMsg = '属性不能为空';
+                return false;
+            }
+        }
+        return true;
+    }
+}

+ 25 - 0
app/Services/Api/ErrorMsgServive.php

xqd
@@ -0,0 +1,25 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 22/05/10
+ * Time: 9:45
+ */
+
+namespace App\Services\Api;
+
+
+
+use Illuminate\Support\Facades\Log;
+
+class ErrorMsgServive
+{
+    public static function write($exception, $url)
+    {
+        Log::error('errorUrl : '.$url);
+        Log::error('errorFile: '.$exception->getFile());
+        Log::error('errorLine: '.$exception->getLine());
+        Log::error('errorMsg : '.$exception->getMessage());
+        Log::error('--------------------------------');
+    }
+}

+ 112 - 0
app/Services/Api/SortService.php

xqd
@@ -0,0 +1,112 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 21/11/23
+ * Time: 19:05
+ */
+
+namespace App\Services\Api;
+
+class SortService
+{
+    // $list 二维数组
+    public static function getResultList($list)
+    {
+        return self::groupByFirstLetter($list);
+    }
+
+    protected static function groupByFirstLetter($list)
+    {
+        $r_list = [];
+        foreach ($list as $key => $val) {
+            $letter = self::firstChar($val['name']);
+            $val['letter'] = $letter;
+            $r_list[$letter][] = $val;
+        }
+        foreach ($r_list as $k => $v) {
+            $r_list[$k] = self::listSortBy($v, 'name');
+        }
+        ksort($r_list);
+        $r_list = array_values($r_list);
+
+        return $r_list;
+    }
+
+    protected static function listSortBy($list, $field)
+    {
+        $arr = $result = [];
+        foreach ($list as $key => $val) {
+            $arr[$key] = &$val[$field];
+        }
+        asort($arr);
+        foreach ($arr as $k => $v) {
+            $result[] = &$list[$k];
+        }
+        return $result;
+    }
+
+    public static function firstChar($s)
+    {
+        $s0 = mb_substr($s, 0, 3); //获取名字的姓
+        $s = iconv('UTF-8', 'gb2312', $s0); //将UTF-8转换成GB2312编码
+
+        if (ord($s0) > 128) { //汉字开头,汉字没有以U、V开头的
+            $asc = ord($s[0]) * 256 + ord($s[0]) - 65536;
+            if ($asc >= -20319 and $asc <= -20284) return "A";
+            if ($asc >= -20283 and $asc <= -19776) return "B";
+            if ($asc >= -19775 and $asc <= -19219) return "C";
+            if ($asc >= -19218 and $asc <= -18711) return "D";
+            if ($asc >= -18710 and $asc <= -18527) return "E";
+            if ($asc >= -18526 and $asc <= -18240) return "F";
+            if ($asc >= -18239 and $asc <= -17760) return "G";
+            if ($asc >= -17759 and $asc <= -17248) return "H";
+            if ($asc >= -17247 and $asc <= -17418) return "I";
+            if ($asc >= -17417 and $asc <= -16475) return "J";
+            if ($asc >= -16474 and $asc <= -16213) return "K";
+            if ($asc >= -16212 and $asc <= -15641) return "L";
+            if ($asc >= -15640 and $asc <= -15166) return "M";
+            if ($asc >= -15165 and $asc <= -14923) return "N";
+            if ($asc >= -14922 and $asc <= -14915) return "O";
+            if ($asc >= -14914 and $asc <= -14631) return "P";
+            if ($asc >= -14630 and $asc <= -14150) return "Q";
+            if ($asc >= -14149 and $asc <= -14091) return "R";
+            if ($asc >= -14090 and $asc <= -13319) return "S";
+            if ($asc >= -13318 and $asc <= -12839) return "T";
+            if ($asc >= -12838 and $asc <= -12557) return "W";
+            if ($asc >= -12556 and $asc <= -11848) return "X";
+            if ($asc >= -11847 and $asc <= -11056) return "Y";
+            if ($asc >= -11055 and $asc <= -10247) return "Z";
+        } else if (ord($s) >= 48 and ord($s) <= 57) { //数字开头
+            switch (iconv_substr($s, 0, 1, 'utf-8')) {
+                case 1:
+                    return "Y";
+                case 2:
+                    return "E";
+                case 3:
+                    return "S";
+                case 4:
+                    return "S";
+                case 5:
+                    return "W";
+                case 6:
+                    return "L";
+                case 7:
+                    return "Q";
+                case 8:
+                    return "B";
+                case 9:
+                    return "J";
+                case 0:
+                    return "L";
+            }
+        } else if (ord($s) >= 65 and ord($s) <= 90) { //大写英文开头
+            return substr($s, 0, 1);
+        } else if (ord($s) >= 97 and ord($s) <= 122) { //小写英文开头
+            return strtoupper(substr($s, 0, 1));
+        } else {
+            return iconv_substr($s0, 0, 1, 'utf-8');
+        }
+    }
+
+}

+ 162 - 0
app/Services/Api/UserService.php

xqd
@@ -0,0 +1,162 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 22/04/26
+ * Time: 14:41
+ */
+
+namespace App\Services\Api;
+
+use App\Models\User;
+
+class UserService
+{
+   /**
+     * 模型
+     *
+     * @var object
+     * 
+     */
+    private $Model;
+
+    /**
+     * 初始化
+     * @access public
+     */
+    public function __construct()
+    {
+      if( ! $this->Model) $this->Model = new User;
+    }
+
+    public function search(array $search,array $where = [],array $orderby=['id'=>'desc'],$pagesize=10)
+    {
+        //查询
+        $currentQuery = $this->Model;
+        if(isset($search['keyword']) && ! empty($search['keyword'])) {
+            $keywords = '%' . $search['keyword'] . '%';
+            $currentQuery = $currentQuery->where(function ($query) use ($keywords) {
+                $query->where('id'  , 'like', $keywords)
+                ->orwhere('nickname', 'like', $keywords)
+                ->orwhere('password', 'like', $keywords)
+                ->orwhere('email', 'like', $keywords)
+                ->orwhere('mobile', 'like', $keywords);
+            });
+        }
+
+        //条件
+        if($where && is_array($where)){
+            foreach ($where as $field => $value){
+              $currentQuery = $currentQuery->where($field, $value);
+            }
+        }
+        //排序
+        if($orderby && is_array($orderby)){
+            foreach ($orderby as $field => $value){
+                $currentQuery = $currentQuery->orderBy($field, $value);
+            }
+        }
+        
+        $currentQuery = $currentQuery->paginate($pagesize);
+        $currentQuery->makeHidden('password','deleted_at');
+
+        return $currentQuery;
+    }
+
+    //查询用户信息
+    public function show($id) {
+        return $this->Model->findOrFail($id);
+    }
+
+    /**
+     * 添加
+     * @param unknown $data
+     */
+    public function create($data)
+    {
+        return $this->Model->create($data);
+    }
+
+    /**
+     * 更新
+     * @param unknown $id
+     * @param unknown $data
+     */
+    public function update($id,$data)
+    {
+        $obj = $this->Model->findOrFail($id);
+        if(!$obj) {
+            return false;
+        }
+        $ok = $obj->update($data);
+        return $ok;
+    }
+    /**
+     * 更新状态
+     */
+    public function updateStatus($id,$status) {
+        $data = $this->Model->findOrFail($id);
+        $data->status = $status;
+        return $data->save();
+    }
+
+    /**
+     * 删除
+     * @param unknown $id
+     */
+    public function destroy($id)
+    { 
+        $data = $this->Model->findOrFail($id);
+        $data->deleted_at = date('Y-m-d H:i:s');
+        return $data->save();
+    }
+
+    //获取用户信息(需要更多信息的话在这里追加)
+    public static function getUserInfoById($id)
+    {
+        $info = User::query()->where('id', $id)->whereNull('deleted_at')->first();
+        $info->makeHidden(['updated_at', 'deleted_at']);
+
+        $info = !empty($info) ? $info->toArray() : [];
+
+        return $info;
+    }
+
+    //通过手机号查用户
+    public static function checkUserByMobile($mobile)
+    {
+        $user = User::where('mobile', $mobile)->whereNull('deleted_at')->first();
+        if ($user) {
+            return true;
+        }
+
+        return false;
+    }
+
+    //通过邮箱查找用户
+    public static function checkUserByEmail($email)
+    {
+        $user = User::where('email', $email)->whereNull('deleted_at')->first();
+        if ($user) {
+            return true;
+        }
+
+        return false;
+    }
+
+    //收藏数+1
+    public static function collectNumInc($userId)
+    {
+        User::query()->where('id', $userId)->increment('collect_num');
+    }
+
+    //收藏数-1
+    public static function collectNumDec($userId)
+    {
+        User::query()->where('id', $userId)->decrement('collect_num');
+    }
+
+
+
+
+}

+ 170 - 0
app/Services/AttachmentServer.php

xqd
@@ -0,0 +1,170 @@
+<?php
+
+namespace App\Services;
+
+use App\Models\SystemConfig;
+use FFMpeg;
+use Illuminate\Http\Request;
+use Illuminate\Http\UploadedFile;
+use Illuminate\Support\Facades\Storage;
+use OSS\OssClient;
+use PHPUnit\Util\Exception;
+use Symfony\Component\HttpFoundation\File\Exception\FileException;
+use App\Services\Base\ErrorCode;
+use App\Models\BaseAttachment;
+
+class AttachmentServer
+{
+
+    public function __construct()
+    {
+        //在 .env 文件里配置下面可测试文件上传OSS
+        //ALI_OSS_ACCESS_ID=LTAI5tHMYxyoEkmGqQZjbpmk
+        //ALI_OSS_ACCESS_KEY=Fqj8J1JH0yyRpLvOjNFj5usjvfvHns
+        //ALI_OSS_BUCKET=zhengda
+        //ALI_OSS_ENDPOINT=oss-cn-chengdu.aliyuncs.com
+
+        $this->fileDriver = env('FILESYSTEM_DRIVER');
+        $this->bucket = env('ALI_OSS_BUCKET');
+        $this->accessId = env('ALI_OSS_ACCESS_ID');
+        $this->accessKey = env('ALI_OSS_ACCESS_KEY');
+        $this->endPoint = env('ALI_OSS_ENDPOINT');
+        $this->ossClient = new OssClient($this->accessId, $this->accessKey, $this->endPoint);
+    }
+
+    /**
+     * @param Request $request
+     * @param $key
+     * @param string $tag
+     * @param float|int $size
+     * @param array $mimeType
+     * @return array|mixed
+     * @throws \Exception
+     */
+    public function uploadAttachment(Request $request, $key, $tag = 'files', $size = 200 * 1024 * 1024, array $mimeType = [])
+    {
+        if ($request->hasFile($key)) {
+            $files = $request->file($key);
+            if ($files === null) {
+                throw new \Exception(trans('api.ATTACHMENT_FILE_NULL'));
+            }
+            if ($files instanceof UploadedFile) {
+                $files = [$files];
+            }
+            $result = [];
+            foreach ($files as $idx => $file) {
+                if (!$file->isValid()) {
+                    throw new \Exception(trans('api.ATTACHMENT_TYPE_ERROR'));
+                    continue;
+                }
+                $fileSize = $file->getSize();
+                if ($fileSize > $size) {
+                    throw new \Exception(trans('api.ATTACHMENT_SIZE_EXCEEDED'));
+                    continue;
+                }
+                $fileMimeType = $file->getMimeType();
+                if (!empty($mimeType) && !in_array($fileMimeType, $mimeType)) {
+                    throw new \Exception(trans('api.ATTACHMENT_TYPE_ERROR'));
+                    continue;
+                }
+                $clientName = $file->getClientOriginalName();
+                $md5 = md5($clientName . time());
+                $md5_filename = $md5 . '.' . $file->getClientOriginalExtension();
+                try {
+                    //本地上传
+                    if (env('FILESYSTEM_DRIVER') == 'local') {
+                        $rel_path = '/upload/' . $tag . '/' . date('Ymd');
+                        $path = public_path() . $rel_path;
+                        if (!file_exists($path)) {
+                            if (!@mkdir($path, 0755, true)) {
+                                throw new \Exception(trans('api.ATTACHMENT_MAKE_FOLDER_ERROR'));
+                            }
+                        }
+                        $file->move($path, $md5_filename);
+                        $realPath = $path . '/' . $md5_filename;
+                        $urlPath = $rel_path . '/' . $md5_filename;
+                        if ($fileMimeType == "video/mp4" || $fileMimeType == "video/quicktime") {
+                            $ffmpeg = FFMpeg\FFMpeg::create(array(
+                                'ffmpeg.binaries' => '/usr/bin/ffmpeg',
+                                'ffprobe.binaries' => '/usr/bin/ffprobe'
+                            ));
+                            $video = $ffmpeg->open($realPath);
+                            $vpath = public_path() . '/upload/vpic/';
+                            if (!file_exists($vpath)) {
+                                if (!@mkdir($vpath, 0755, true)) {
+                                    return trans('api.ATTACHMENT_MAKE_FOLDER_ERROR');
+                                }
+                            }
+                            $pic = $vpath . $md5 . '.jpg';
+                            $video->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(1))->save($pic);
+                        }
+                        $result[$idx] = 'http://' . $_SERVER['HTTP_HOST'] . $urlPath;
+
+                    } elseif (env('FILESYSTEM_DRIVER') == 'oss') {
+
+                        $tmppath  = $file->getRealPath(); //获取上传图片的临时地址
+                        $fileName = date('YmdHis') .rand(10000, 99999). '.' . $file->getClientOriginalExtension(); //生成文件名
+                        $pathName = $tag . '/' . date('Y-m') . '/' . $fileName;
+                        $upResult = $this->ossClient->uploadFile($this->bucket, $pathName, $tmppath, ['ContentType' => $file->getClientMimeType()]); //上传图片到阿里云OSS
+                        $url = $upResult['info']['url'];
+                        $realPath = $url;
+                        $urlPath  = $url;
+                        $result[$idx] = $url;
+                    }
+                    //将上传的图片存入到数据表作为记录
+                    $attachment = new BaseAttachment();
+                    $attachment->name = $clientName;
+                    $attachment->md5  = $md5;
+                    $attachment->path = $realPath;
+                    $attachment->url  = $urlPath;
+                    $attachment->size = $fileSize;
+                    $attachment->file_type = $fileMimeType;
+                    if (!$attachment->save()) {
+                        @unlink($realPath);
+                        throw new \Exception(trans('api.ATTACHMENT_SAVE_ERROR'));
+                    }
+                } catch (FileException $e) {
+                    throw new \Exception(trans('api.ATTACHMENT_UPLOAD_INVALID'));
+                }
+            }
+            if (count($result) == 1) {
+                return array_shift($result);
+            }
+            return $result;
+        } else {
+            throw new \Exception(trans('api.ATTACHMENT_UPLOAD_INVALID'));
+        }
+    }
+
+    /**
+     * 删除附件
+     *
+     * @param $picUrl 图片地址
+     * @return int 错误码or 0(成功)
+     */
+    public function deleteAttachment($picUrl)
+    {
+        if ($this->fileDriver == 'local') {
+            $attachment = BaseAttachment::where(['path' => $picUrl])->first();
+            if (!$attachment) {
+                return false;
+            }
+            if (file_exists($attachment->path)) {
+                if (@unlink($attachment->path)) {
+                    if (!$attachment->delete()) {
+                        return false;
+                    }
+                } else {
+                    return false;
+                }
+            } else {
+                return false;
+            }
+        } elseif ($this->fileDriver == 'oss') {
+            $this->ossClient->deleteObject($this->bucket, $picUrl);
+        }
+
+        return true;
+    }
+
+}

+ 197 - 0
app/Services/Base/ErrorCode.php

xqd
@@ -0,0 +1,197 @@
+<?php
+/**
+ *------------------------------------------------------
+ * BaseProcess.php
+ *------------------------------------------------------
+ *
+ * @author    Mike
+ * @date      2016/5/26 11:17
+ * @version   V1.0
+ *
+ */
+
+namespace App\Services\Base;
+
+final class ErrorCode
+{
+    /**
+     * 上传附件相关
+     */
+     const ATTACHMENT_SAVE_FAILED = 603;
+     const ATTACHMENT_UPLOAD_INVALID = 602;
+     const ATTACHMENT_SIZE_EXCEEDED = 1201;
+     const ATTACHMENT_RECORD_DELETE_FAILED = 606;
+     const ATTACHMENT_DELETE_FAILED = 605;
+
+    /**
+     * 通用常量
+     */
+    const NOT_LOGIN = 100;
+    const NOT_ALLOW = 112;  
+    const PARAMS_ERROR = 101;
+    const REGISTER_FALSE = 102;
+    const REGISTER_CONFIRM_FALSE = 103;
+    const DATA_SAVE_FALSE = 104;
+    //const MODULE_IS_NOT_USE = 105;
+    const NEED_CONFIGURE = 106;
+    const DATA_NOT_FOUND = 107;
+    const DATA_DECODE_FAILURE = 108;
+    const VERIFY_CODE_FALSE = 109;
+    const MOBILE_CODE_FALSE = 110;
+    const ILLEGAL_OPERATION = 111;
+
+    /**
+     * 微信常量
+     */
+    const WECHAT_CONFIG_LACK = 201;
+    const GET_OPENID_FALSE = 202;
+    const SESSION_KEY_INVALID = 203;
+
+    /**
+     * 定位服务常量
+     */
+    //const LOCATION_FALSE = 301;
+
+    const CONFIGURE_SMS_TEMPLATE = 401;
+    const SMS_AUTH_FAILED = 402;
+    const SMS_RETURN_ERROR = 403;
+
+
+    //const USER_IN_BLACK_LIST = 501;
+    const USER_NO_AUTH = 502;
+    //const USER_TRANSPORT_NO_AUTH = 503;
+    //const USER_ACCOUNT_NOT_ENOUGH = 504;
+    //const USER_IDENTIFY_NOT_ALLOW = 505;
+    //const USER_FREEZE_ERROR = 506;
+    //const USER_IS_APPLY = 507;
+
+    const CONFIG_ALI_PRODUCT_KEY_NEED = 601;
+
+    const DEVICE_NOT_FOUND = 701;
+    const DEVICE_INFO_ERROR = 702;
+    const DEVICE_NORMAL_ERROR = 703;
+    const DEVICE_NET_ERROR = 704;
+
+    /**
+     * 订单常量
+     */
+    const ORDER_CREATE_ERROR = 801;
+    //const RECHARGE_WECHAT_FAILURE = 802;
+
+    /**
+     * 提现常量
+     */
+    //const CASH_NEED_CONFIG = 901;
+    //const CASH_METHOD_NOT_ALLOW = 902;
+    //const CASH_TIMES_OUT = 903;
+    //const CASH_MONEY_FEW = 904;
+    //const CASH_MONEY_NO_ENOUGH = 905;
+    //const CASH_MONEY_MAX = 906;
+
+    // const ATTACHMENT_NOT_EXIST = 1203;
+    // const ATTACHMENT_MIME_NOT_ALLOWED = 1202;
+    // const MERCHANT_CREDIT_NOT_ENOUGH = 1304;
+    // const MEMBER_CREDIT_NOT_ENOUGH = 1305;
+    // const MERCHANT_NOT_EXIST = 1300;
+    // const FAVORITE_NOT_EXIST = 1900;
+    // const MERCHANT_ADD_MEMBER_FAILED = 1301;
+    // const MERCHANT_STATUS_NOT_OK = 1302;
+    // const BALANCE_NOT_ENOUGH = 1303;
+    // const MERCHANT_BALANCE_NOT_ENOUGH = 1311;
+    // const PAY_TYPE_UNSUPPORTED = 2000;
+    // const MEMBER_NOT_EXIST = 1500;
+    // const COIN_NOT_ENOUGH = 1501;
+
+    //const CANT_ADD_SERVICE_SAME_MERCHANT = 1405;
+    //const SERVICE_STATUS_INVALID_CHANGE = 1406;
+    //const SERVICE_COST_OVERFLOW_BALANCE = 1407;
+    //const CREATE_SERVICE_OVER_MAX = 1408;
+    //const OPERATION_FAILED = 700;
+    //const REMOVE_MODEL_FAILED = 701;
+    // const MODEL_NOT_EXIST = 702;
+    // const ATTACHMENT_UPLOAD_FAILED = 1200;
+    // const PROTO_PATH_NOT_EXIST = 100;
+    // const PROTO_TRY_TO_SET_VALUE_ON_NULL = 101;
+    // const CONNET_NOT_EXIST = 1700;
+    // const ORDER_GENERATE_FAILED = 1800;
+    // const CONSUME_LOG_NOT_EXIST = 1600;
+    // const SERVICE_CODE_FAILED= 1610;
+    // const PHONE_NUMBER_ALREADY_REGISTERED = 1100;
+    //const INCORRECT_VERIFY_CODE = 1101;
+    //const INCORRECT_USER_OR_PASS = 1102;
+    //const VERIFY_CODE_TOO_MUCH = 1103;
+    //const LOGOUT_FAILED = 1104;
+    //const USER_DOES_NOT_EXIST = 1105;
+    //const USER_DOES_EXIST = 1106;
+    // const DELETE_OP_FAILED = 1001;
+    // const CLIENT_WRONG_PARAMS = 1000;
+    // const DREAM_NOT_EXIST = 1308;
+    // const LOCK_USER = 1309;
+    // const LOGIN_FAILED = 1311;
+    // const KEY_ERROR = 1310;
+    // const SUP_TOP = 1410;
+    // const SUP_ERROR = 1411;
+    // const DREAM_STATUS = 1412;
+    // const OPERATION_SUCCESS = 200;
+    // const INTERACTION_NOT_EXIST = 2001;
+    // const NOT_ROOT = 2002;
+
+
+    //错误常量枚举
+    private static $_msg = [
+        self::NOT_LOGIN => '用户未登录',
+        self::NOT_ALLOW => '不允许绑定',
+        self::PARAMS_ERROR => '参数异常',
+        self::WECHAT_CONFIG_LACK => '微信参数未配置',
+        self::GET_OPENID_FALSE => 'openId获取失败',
+        self::REGISTER_FALSE => '注册失败',
+        self::REGISTER_CONFIRM_FALSE => '用户验证失败',
+        self::DATA_SAVE_FALSE => '数据保存失败',
+        //self::MODULE_IS_NOT_USE => '模块未安装,请检查后台配置',
+        self::CONFIGURE_SMS_TEMPLATE => '请先配置短信模板',
+        self::SMS_AUTH_FAILED => '短信授权错误',
+        self::SMS_RETURN_ERROR => '短信返回错误',
+        self::NEED_CONFIGURE => '请先至后台配置',
+        //self::USER_IN_BLACK_LIST => '用户被拉入黑名单',
+        self::USER_NO_AUTH => '用户无权限',
+        self::CONFIG_ALI_PRODUCT_KEY_NEED => '请在后台配置阿里云物联网产品key',
+        self::DEVICE_NOT_FOUND => '设备不存在',
+        self::DEVICE_INFO_ERROR => '设备信息异常',
+        self::DEVICE_NORMAL_ERROR => '设备故障请联系客服!',
+        self::ORDER_CREATE_ERROR => '订单创建失败',
+        //self::RECHARGE_WECHAT_FAILURE => '微信充值创建订单失败',
+        self::DATA_NOT_FOUND => '数据不存在',
+        //self::CASH_NEED_CONFIG => '请先填写提现配置',
+        //self::CASH_METHOD_NOT_ALLOW => '无效的提现方式',
+        //self::CASH_MONEY_FEW => '提现金额必须大于最小设置金额',
+        //self::CASH_TIMES_OUT => '当日提现次数达到上限',
+        //self::CASH_MONEY_NO_ENOUGH => '余额不足',
+        self::DATA_DECODE_FAILURE => '解密失败',
+        self::MOBILE_CODE_FALSE => '请先获取验证码',
+        self::VERIFY_CODE_FALSE => '验证码错误',
+        self::SESSION_KEY_INVALID => 'sessionKey无效',
+        self::ILLEGAL_OPERATION => '非法操作',
+        //self::USER_IDENTIFY_NOT_ALLOW => '请先通过身份审核!',
+        //self::USER_FREEZE_ERROR => '用户被冻结!',
+        //self::USER_IS_APPLY => '用户加盟审核中!',
+        //self::USER_ACCOUNT_NOT_ENOUGH => '用户余额不足!',
+        self::DEVICE_NET_ERROR => '设备无网络!',
+        //self::USER_TRANSPORT_NO_AUTH => '用户无收运权限!',
+        //self::CASH_MONEY_MAX => '系统当日提现金额达到上限!',
+        self::ATTACHMENT_SAVE_FAILED => '附件保存失败',
+        self::ATTACHMENT_UPLOAD_INVALID => '附件上传非法',
+        self::ATTACHMENT_SIZE_EXCEEDED => '附件大小超出限制',
+        self::ATTACHMENT_RECORD_DELETE_FAILED => '附件记录删除失败',
+        self::ATTACHMENT_DELETE_FAILED => '附件删除失败'
+    ];
+
+    public static function message($code)
+    {
+        if (isset(self::$_msg[$code])) {
+            return self::$_msg[$code];
+        } else {
+            return null;
+        }
+    }
+
+}

+ 104 - 0
app/Services/EasyCtidService.php

xqd
@@ -0,0 +1,104 @@
+<?php
+
+namespace App\Services;
+
+use App\Traits\EasyCtid;
+
+class EasyCtidService
+{
+    use EasyCtid;
+
+    public function verify(string $realName, string $idNo, string $photoData)
+    {
+        // 签名私钥
+        $pri = 'MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJtxSZ+l/BxsPQtzdVW+RMeGpjMJGoGXzSNQiPsXQdL0Apo72aXpRLizn6BNNexrO12WwfIKUlUzZ5WrUKvyQzKTwbKL2PWL7FCWdcqgi1KJ9tygfolGuSqLaY1lTB1HubSuLaTbpmiS5Khjdwkpg5VAZH2sFhz8hKfc1ir5tBFfAgMBAAECgYBo7pwFwtYjFcpLvaBaxnvFuZbeYunay+/2Q/qEjhmoX4KWPYranlL+4HsEirq5I1ZLAmdgjikwTOhDOAfYW02Se3+sproTyqAy3/qimk/MqbW/bT6whfYocZlZbnCdgeaPK+xyhRDYPDrRGCmiYLbuDdflSX3aNkbgFMNhRAuIKQJBANrxMQUMxiNe15zqq9b9Owm6hFWCQvFzBlHBebaQUge+lK4g6WIm0L7mfeXuo2Fc0M8j++hukxsmFhSpTDXv/JUCQQC1wKTy+MXaX3YXkoYKrfywbdMJMr0OdfboJ7KcEmaOZ6N6XGXrHS437lOUkIk6VCEEFB+v1b1YOS5O+vwVFyUjAkBG5NSPowxBhcNhXyeXbNYCF3AkVBKjJjDEplZoBCFbup1gKO4JRzJOrknT+0rSCwDeIfO+1pcxskpyFEPGL1hlAkBOduV/M6EO/mlYEdymXaiabj9OWEZAKPM4FHNKZ7M4xUtRNvSVBRr/8HbKy39C3DEItrtbSNYecUkptbcAT+arAkEAlCqVfwydy7oM7+lPU39jmPv6Mkj1I0qc/x+j2jp8gkJj91pogQOzQQd/wpNywYDCORD2r84lPyK+JrP+OjODQw==';
+
+        // 加密公钥
+        $pub = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCl23X1jCttl9A93NT1Uev8/5rXZezm83BwbJKQQFi8onP7lBRTBQh8/ahyhMX8Qc2QKEq4/t58Q0NVZE2/Yb8OqZk4LEu1pCt2ra57DSvgMQ41oxDere4kyTYAqFuMJoQQgEmyYpzpHQu1GlSYRtbJ3Oxd/JqHfOSjPVYJaDEBswIDAQAB';
+
+        // 基本信息
+        $orgCode = '29fb7b4673014b0da0833dafbcec9848';
+        $appId = '1212';
+        $userId = '123';
+        $appName = 'dddd';
+        $readCardCtrlVer = '0400.0001.0101.0006';
+        $authCodeCtrlVer = '0400.0001.0101.0006';
+        $photoCtrlVer = '0400.0001.0101.0006';
+
+        // 请求模式
+        $authMode = '0x42';
+        $bizType = 6000;
+        $applyData = '';
+
+        $bizData = array('authMode' => $authMode, 'applyData' => $applyData, 'appName' => $appName
+        , 'readCardCtrlVer' => $readCardCtrlVer, 'authCodeCtrlVer' => $authCodeCtrlVer, 'photoCtrlVer' => $photoCtrlVer);
+
+        // 填充bizPckage
+        $bizPackage = array('orgCode' => $orgCode, 'appId' => $appId, 'userId' => $userId, 'bizType' => $bizType, 'bizData' => $bizData);
+
+        // 生成bizPackage的json字符串
+        $bizPackage = json_encode($bizPackage,JSON_UNESCAPED_SLASHES);
+
+        // 对bizPackage进行签名,并使用base64编码
+        $sign = $this->getSign($bizPackage, $pri);
+        //echo $sign;
+        $sign = base64_encode($sign);
+
+        // 生成完整请求参数
+        $reqContent = array('bizPackage' => $bizPackage, 'sign' => $sign);
+        $reqContent = json_encode($reqContent,JSON_UNESCAPED_SLASHES);
+
+//        echo "======================== 申请一包:========================\n" . $reqContent . "\n";
+        $result = $this->request_by_curl("http://api.easyctid.cn/v1/apply", $reqContent);
+//        echo "结果:\n" . $result . "\n";
+//        echo "======================== 请求结束 ========================\n";
+
+        // 将一包返回json字符串转为普通参数
+        $result = json_decode($result, true);
+        // 获取bsn、randomNumber
+        $bizPackage = json_decode($result['bizPackage'], true);
+        $bizData = $bizPackage['bizData'];
+        $bsn = $bizData['bsn'];
+        $randomNumber = $bizData['randomNumber'];
+
+//        echo "获取到参数:\n" . "bsn: " . $bsn . "\n" . "随机数: " . $randomNumber . "\n";
+
+//        echo "======================== 一包结束 ========================\n\n\n";
+
+        // ------------------------------------ 二包 --------------------------------------
+        // 两项信息
+//        $realName = '张三';
+//        $idNo = '110101200001011297';
+
+        $authApplyRetainData = array('name' => $realName, 'idNo' => $idNo);
+        // 转为json
+        $authApplyRetainData = json_encode($authApplyRetainData,JSON_UNESCAPED_SLASHES);
+        // 加密
+        $authApplyRetainData = $this->encrypt($authApplyRetainData, $pub);
+        // 使用base64编码
+        $authApplyRetainData = base64_encode($authApplyRetainData);
+
+        // 填充bizData
+        $bizData = array('authMode' => $authMode, 'appName' => $appName, 'authApplyRetainData' => $authApplyRetainData, 'photoData' => $photoData);
+        // 填充bizPckage
+        $bizPackage = array('orgCode' => $orgCode, 'appId' => $appId, 'userId' => $userId, 'bizType' => $bizType, 'bizData' => $bizData
+        , 'bsn' => $bsn, 'randomNumber' => $randomNumber);
+
+        // 生成bizPackage的json字符串
+        $bizPackage = json_encode($bizPackage,JSON_UNESCAPED_SLASHES);
+
+        // 对bizPackage进行签名,并使用base64编码
+        $sign = $this->getSign($bizPackage, $pri);
+        $sign = base64_encode($sign);
+
+        // 生成完整请求参数
+        $reqContent = array('bizPackage' => $bizPackage, 'sign' => $sign);
+        $reqContent = json_encode($reqContent,JSON_UNESCAPED_SLASHES);
+
+//        echo "======================== 请求二包:========================\n" . $reqContent . "\n";
+        $result = $this->request_by_curl("http://api.easyctid.cn/ctid/v1/verification", $reqContent);
+        $result = json_decode($result, TRUE);
+        $result = json_decode($result['bizPackage'],TRUE);
+        return $result;
+    }
+}

+ 291 - 0
app/Services/FriendCircleService.php

xqd
@@ -0,0 +1,291 @@
+<?php
+
+// +----------------------------------------------------------------------
+// | Created by PhpStorm.
+// +----------------------------------------------------------------------
+// | user : JYF
+// +----------------------------------------------------------------------
+// | blog :
+// +----------------------------------------------------------------------
+// | email: 1749934563@qq.com
+// +----------------------------------------------------------------------
+// | Date : 2021/2/19
+// +----------------------------------------------------------------------
+
+
+namespace App\Services;
+
+
+use App\Constants\FriendCircleConst;
+use App\Exceptions\FriendCircleException;
+use App\Http\Params\FriendCircleParam;
+use App\Http\Params\FriendCircleCommentParam;
+use App\Http\Params\FriendCircleLikeRecordParam;
+use App\Models\FriendCircle;
+use App\Models\FriendCircleComment;
+use App\Models\FriendCircleLikeRecord;
+
+class FriendCircleService
+{
+    /**
+     * 圈子动态列表
+     * @param int $uid
+     * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
+     * @author JYF 2021/2/19 15:48
+     */
+    public function circleLists(int $uid)
+    {
+
+        //当前用户加的好友id
+        $userFriendList = UserFriendService::getFriendAllByUid($uid);
+        $userFriendId = array_column($userFriendList,'friend_user_id');
+        array_push($userFriendId,$uid);//自己发布的也可以看
+        //当前用户被加的好友权限信息
+        $friendUserList = UserFriendService::getFriendAllByFriendUserId($uid);
+        $wh_group_id_arr = array_column($friendUserList,'wh_group_id','user_id');
+
+        $lists = FriendCircle::query()
+            ->with(['users'=>function($query){
+                $query->select('id','nick_name_id','avatar');
+            }])
+            ->where('status',FriendCircleConst::STATUS_PUB)
+            ->whereIn('user_id',$userFriendId)//好友发布的动态
+            ->orderByDesc('id')
+            ->paginate(request('perPage',10));
+
+        $nick_name_id_arr = [];
+        foreach ($lists->toArray()['data'] as $k => $item){
+            if(isset($item['users']['id'])) {
+                $nick_name_id_arr[] = $item['users']['id'];
+            }
+        }
+
+        //处理用户昵称
+        /** @var  $userService \App\Services\UserService */
+        $userService = resolve('\App\Services\UserService');
+        $list_nick_name = $userService->selectUserNickNameById($nick_name_id_arr);
+
+        foreach ($lists as $k => &$val){
+            $val['users']['nick_name'] = $list_nick_name[$val['users']['nick_name_id'] ?? 0] ?? '';
+            $val['img_url_list'] = explode(',',$val['img_url']);
+
+            //判断查看权限
+            $user_id = $val['user_id'];
+            $wh_group_id = $wh_group_id_arr[$user_id] ?? 0;
+            $look_type_arr = explode(',',$val['look_type']);
+            $is_look = false;//是否有权限查看,自己发布的有权限查看
+            if(in_array($wh_group_id,$look_type_arr) || $user_id == $uid){
+                $is_look = true;
+            }
+            $val['is_look'] = $is_look;
+
+        }
+        return $lists;
+    }
+
+    /**
+     * 圈子动态发布
+     * @param FriendCircleParam $circleParam
+     * @return mixed
+     * @author JYF 2021/2/19 16:49
+     */
+    public function circlePub(FriendCircleParam $circleParam)
+    {
+        $data = [
+            'user_id'=>$circleParam->user_id,
+            'content'=>$circleParam->content,
+            'img_url'=>$circleParam->img_url ? implode(',',$circleParam->img_url) : '',
+            'look_type'=>$circleParam->look_type ? implode(',',$circleParam->look_type) : 0 ,
+            'status'=>FriendCircleConst::STATUS_PUB,//预留状态
+        ];
+
+        return FriendCircle::create($data);
+    }
+
+    /**
+     * 圈子动态点赞操作
+     * @param FriendCircleLikeRecordParam $recordParam
+     * @return bool
+     * @throws FriendCircleException
+     * @author JYF 2021/2/19 17:38
+     */
+    public function circleLike(FriendCircleLikeRecordParam $recordParam)
+    {
+        //TODO 点赞有并发,在用redis处理
+
+        if(empty($recordParam->circle_id)){
+            throw new FriendCircleException('参数错误~');
+        }
+
+        //动态是否存在
+        $circleInfo = $this->getCircleInfo($recordParam->circle_id);
+        if(empty($circleInfo)){
+            throw new FriendCircleException('动态不存在~');
+        }
+        //有无权限给此动态点赞,加了好友才可以点赞
+        $isUserFriend = $this->isUserFriend($recordParam->input_uid,$recordParam->circle_id);
+        if(false === $isUserFriend){
+            throw new FriendCircleException('不是好友不能点赞哦~');
+        }
+        //是否已经点赞
+        $isLikeCircle = $this->isLikeCircle($recordParam->input_uid,$recordParam->circle_id);
+        if(!empty($isLikeCircle)){
+            throw new FriendCircleException('您已经点过赞了哦~');
+        }
+        //记录点赞
+        $data = [
+            'circle_id'=>$recordParam->circle_id,
+            'input_uid'=>$recordParam->input_uid,
+        ];
+        FriendCircleLikeRecord::create($data);
+        //总点赞量+1
+        FriendCircle::query()->where('id',$recordParam->circle_id)->increment('like_num',1);
+        return true;
+    }
+
+    /**
+     * 点赞记录
+     * @param int $uid
+     * @param int $circle_id
+     * @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model|object|null
+     * @author JYF 2021/2/19 17:33
+     */
+    public function isLikeCircle(int $uid,int $circle_id)
+    {
+        $where = [];
+        $where[] = ['circle_id','=',$circle_id];
+        $where[] = ['input_uid','=',$uid];
+        return FriendCircleLikeRecord::query()->where($where)->first();
+    }
+
+    /**
+     * @param int $circle_id
+     * @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model|object|null
+     * @author JYF 2021/2/19 17:33
+     */
+    public function getCircleInfo(int $circle_id)
+    {
+        $where = [];
+        $where[] = ['id','=',$circle_id];
+        return FriendCircle::query()->where($where)->first();
+    }
+
+    /**
+     * 简单验证下是否是好友关系
+     * @param int $uid
+     * @param int $circle_id
+     * @return bool
+     * @author JYF 2021/2/19 17:24
+     */
+    public function isUserFriend(int $uid,int $circle_id)
+    {
+        $circleInfo = $this->getCircleInfo($circle_id);
+        if(empty($circleInfo)){
+            return false;
+        }
+        $circle_uid = $circleInfo->user_id;
+        //获取是否是好友关系
+        $userFriendInfo = UserFriendService::getFriendRelation($uid,$circle_uid);
+        if(empty($userFriendInfo)){
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * 发布评论
+     * @param FriendCircleCommentParam $circleCommentParam
+     * @return mixed
+     * @throws FriendCircleException
+     * @author JYF 2021/2/19 17:53
+     */
+    public function circlePubComment(FriendCircleCommentParam $circleCommentParam)
+    {
+        if(empty($circleCommentParam->circle_id)){
+            throw new FriendCircleException('参数错误~');
+        }
+
+        if(empty($circleCommentParam->content)){
+            throw new FriendCircleException('请输入内容~');
+        }
+        $circleInfo = $this->getCircleInfo($circleCommentParam->circle_id);
+        if(empty($circleInfo)){
+            throw new FriendCircleException('此动态不存在~');
+        }
+
+        $isUserFriend = $this->isUserFriend($circleCommentParam->input_uid,$circleCommentParam->circle_id);
+        if(false === $isUserFriend){
+            throw new FriendCircleException('不是好友不能评论哦~');
+        }
+
+        //记录评论
+        $data = [
+            'circle_id'=>$circleCommentParam->circle_id,
+            'input_uid'=>$circleCommentParam->input_uid,
+            'content'=>$circleCommentParam->content,
+        ];
+        return FriendCircleComment::create($data);
+    }
+
+    /**
+     * @param FriendCircleParam $circleParam
+     * @return int
+     * @throws FriendCircleException
+     * @author JYF 2021/2/19 18:07
+     */
+    public function delCircle(FriendCircleParam $circleParam)
+    {
+        if(empty($circleParam->id)){
+            throw new FriendCircleException('参数错误~');
+        }
+        return FriendCircle::destroy($circleParam->id);
+    }
+
+    /**
+     * @param FriendCircleCommentParam $circleCommentParam
+     * @return int
+     * @throws FriendCircleException
+     * @author JYF 2021/2/19 18:08
+     */
+    public function delCircleComment(FriendCircleCommentParam $circleCommentParam)
+    {
+        if(empty($circleCommentParam->id)){
+            throw new FriendCircleException('参数错误~');
+        }
+        return FriendCircleComment::destroy($circleCommentParam->id);
+    }
+
+    /**
+     * @param int $circle_id
+     * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
+     * @author JYF 2021/2/19 18:27
+     */
+    public function circleCommentList(int $circle_id)
+    {
+        $lists = FriendCircleComment::query()
+            ->with(['users'=>function($query){
+                $query->select('id','nick_name_id','avatar');
+            }])
+            ->where('circle_id',$circle_id)
+            ->orderByDesc('id')
+            ->paginate(request('perPage', 10));
+
+        $nick_name_id_arr = [];
+        foreach ($lists->toArray()['data'] as $k => $item){
+            if(isset($item['users']['id'])) {
+                $nick_name_id_arr[] = $item['users']['id'];
+            }
+        }
+
+        //处理用户昵称
+        /** @var  $userService \App\Services\UserService */
+        $userService = resolve('\App\Services\UserService');
+        $list_nick_name = $userService->selectUserNickNameById($nick_name_id_arr);
+
+        foreach ($lists as $k => &$val){
+            $val['users']['nick_name'] = $list_nick_name[$val['users']['nick_name_id'] ?? 0] ?? '';
+        }
+
+        return $lists;
+    }
+}

+ 85 - 0
app/Services/Hero.php

xqd
@@ -0,0 +1,85 @@
+<?php
+
+namespace App\Server;
+
+class Hero
+{
+    public $pre = null;
+    public $no;
+    public $name;
+    public $next = null;
+
+    public function __construct($no = '', $name = '')
+    {
+        $this->no = $no;
+        $this->name = $name;
+    }
+
+    public static function addHero($head, $hero)
+    {
+        $cur = $head;
+        $isExist = false;
+        //判断目前这个链表是否为空
+        if ($cur->next == null) {
+            $cur->next = $hero;
+            $hero->pre = $cur;
+        } else {
+            //如果不是空节点,则安排名来添加
+            //找到添加的位置
+
+            while ($cur->next != null) {
+                if ($cur->next->no > $hero->no) {
+                    break;
+                } else if ($cur->next->no == $hero->no) {
+                    $isExist = true;
+                    echo "<br>不能添加相同的编号";
+                }
+                $cur = $cur->next;
+            }
+            if (!$isExist) {
+                if ($cur->next != null) {
+                    $hero->next = $cur->next;
+                }
+                $hero->pre = $cur;
+                if ($cur->next != null) {
+                    $hero->next->pre = $hero;
+                }
+                $cur->next = $hero;
+            }
+        }
+    }
+
+    //遍历
+    public static function showHero($head)
+    {
+        $cur = $head;
+        while ($cur->next != null) {
+            echo "<br>编号:" . $cur->next->no . "名字:" . $cur->next->name;
+            $cur = $cur->next;
+        }
+    }
+
+    public static function delHero($head, $herono)
+    {
+        $cur = $head;
+        $isFind = false;
+        while ($cur != null) {
+            if ($cur->no == $herono) {
+                $isFind = true;
+                break;
+            }
+            //继续找
+            $cur = $cur->next;
+        }
+        if ($isFind) {
+            if ($cur->next != null) {
+                $cur->next_pre = $cur->pre;
+            }
+            $cur->pre->next = $cur->next;
+        } else {
+            echo "<br>没有找到目标";
+        }
+    }
+}
+
+

+ 277 - 0
app/Services/JPushService.php

xqd
@@ -0,0 +1,277 @@
+<?php
+
+
+namespace App\Services;
+
+
+use Illuminate\Support\Facades\Log;
+use JPush\Client;
+use PHPUnit\Util\Exception;
+
+class JPushService
+{
+    protected static $client = null;
+
+    //推送类型
+    const PUSH_TYPE_ALL = 1;
+    const PUSH_TYPE_TAG = 2;
+    const PUSH_TYPE_ALIAS = 3;
+    const PUSH_TYPE_REG_ID = 4;
+    const JG_YJDL_POST_URL = 'https://api.verification.jpush.cn/v1/web/loginTokenVerify';
+
+    private function __construct()
+    {
+    }
+
+    private function __clone()
+    {
+    }
+
+    /**
+     * 获取实例
+     */
+    public static function getInstance()
+    {
+        if (!self::$client) {
+            self::$client = new Client(config('jpush.app_key'), config('jpush.master_secret'), null);
+        }
+        return self::$client;
+    }
+
+    /**
+     * 给android或ios推送消息
+     */
+    public static function pushNotify($params)
+    {
+        //推送平台
+        $platform = $params['platform'] ?? 'all';
+        //推送标题
+        $title = $params['title'] ?? '';
+        //推送内容
+        $content = $params['content'] ?? '';
+        //通知栏样式ID
+        $builder_id = $params['builder_id'] ?? 0;
+        //附加字段
+        $extras = $params['extras'] ?? '';
+        //推送类型
+        $type = $params['type'] ?? '';
+
+        //推送目标(注册ID)
+        $reg_id = $params['reg_id'] ?? '';
+        //推送目标(标签)
+        $tag = $params['tag'] ?? '';
+        //推送目标(别名)
+        $alias = $params['alias'] ?? '';
+
+        $large_icon = $params['image'] ?? '';
+
+        try {
+            $push = self::getInstance()->push();
+
+            //设置平台
+            $push->setPlatform($platform);
+
+            switch ($type) {
+                case self::PUSH_TYPE_ALL:
+                    $push->addAllAudience();
+                    break;
+                case self::PUSH_TYPE_TAG:
+                    $push->addTag($tag);
+                    break;
+                case self::PUSH_TYPE_ALIAS:
+                    $push->addAlias($alias);
+                    break;
+                case self::PUSH_TYPE_REG_ID:
+                    $push->addRegistrationId($reg_id);
+                    break;
+            }
+
+            $push->androidNotification($content, [
+                'title' => $title,
+                'builder_id' => $builder_id,
+                'extras' => $extras,
+                'large_icon' => $large_icon
+            ])->iosNotification($content, [
+                'sound' => 'sound',
+                'badge' => '+1',
+                'extras' => $extras,
+//                'large_icon' => $params['image']
+            ])->options([
+                'apns_production' => config('jpush.apns_production', true),
+                //表示离线消息保留时长(秒)
+                'time_to_live' => 86400,
+            ]);
+
+            $response = $push->send();
+
+            if ($response['http_code'] != 200) {
+                Log::channel('jpush')->error(json_encode($response, JSON_UNESCAPED_UNICODE));
+            }
+
+            return $response;
+        } catch (\Throwable $e) {
+            Log::channel('jpush')->error(json_encode([
+                'file' => $e->getFile(),
+                'line' => $e->getLine(),
+                'message' => $e->getMessage(),
+                'params' => $params,
+            ], JSON_UNESCAPED_UNICODE));
+        }
+    }
+
+    /**
+     * 获取指定设备的别名和标签
+     */
+    public static function getDevices($reg_id)
+    {
+        $response = self::getInstance()->device()->getDevices($reg_id);
+
+        if ($response['http_code'] == 200) {
+            return $response['body'];
+        }
+
+        return [];
+    }
+
+    /**
+     * 给指定设备添加标签
+     */
+    public static function addTags($reg_id, $tags = [])
+    {
+        $response = self::getInstance()->device()->addTags($reg_id, $tags);
+
+        if ($response['http_code'] == 200) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 清空指定设备的标签
+     */
+    public static function clearTags($reg_id)
+    {
+        $response = self::getInstance()->device()->clearTags($reg_id);
+
+        if ($response['http_code'] == 200) {
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * 清空指定设备的标签
+     */
+    public static function removeTags($reg_id, $tags = [])
+    {
+        $response = self::getInstance()->device()->removeTags($reg_id, $tags);
+
+        if ($response['http_code'] == 200) {
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * 更新指定设备的别名
+     */
+    public static function updateAlias($reg_id, $alias)
+    {
+        $response = self::getInstance()->device()->updateAlias($reg_id, $alias);
+
+        if ($response['http_code'] == 200) {
+            return true;
+        }
+
+        return false;
+    }
+
+
+    /**
+     * jgOpensslPrivateDecrypt($encrypted)     (加密) 手机号码解密获取手机号
+     * @param   $encrypted        string       (加密) 手机号码
+     * @param
+     *
+     * @return              string         手机号|false
+     *  err:错误信息
+     *
+     */
+    public static function jgOpensslPrivateDecrypt($encrypted){
+        $prefix = '-----BEGIN RSA PRIVATE KEY-----';
+        $suffix = '-----END RSA PRIVATE KEY-----';
+        $result = '';
+
+        $prikey = config('jpush.jg_yjdl_private_rsa');
+
+        $key = $prefix . "\n" . $prikey . "\n" . $suffix;//拼接换行符
+        $r = openssl_private_decrypt(base64_decode($encrypted), $result, openssl_pkey_get_private($key));
+        if($r){
+            return $result;
+        }else{
+            return false;
+            throw new Exception("解密失败");
+        }
+
+    }
+
+    /**
+     * jgLoginTokenVerify($token)         提交loginToken,验证后返回手机号码(加密)
+     * @param   $token        string       认证SDK获取到的loginToken
+     * @param   $exId         开发者自定义的id,非必填
+     *
+     * @return              array         手机号
+     *  err:错误信息
+     *
+     */
+    public static function jgLoginTokenVerify($token,$exId)
+    {
+        $host    =  self::JG_YJDL_POST_URL;
+        $method  = "POST";
+//        $appcode = VERIFY_APPCODE;
+        $headers = array();
+        array_push($headers, "Authorization: Basic " .base64_encode(config('jpush.app_key').':'.config('jpush.master_secret')));
+        //根据API的要求,定义相对应的Content-Type
+        array_push($headers, "Content-Type".":"."application/json");
+
+        $data = json_encode(["loginToken"=>$token,"exId"=>$exId]);
+
+        $curl = curl_init();
+        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
+        curl_setopt($curl, CURLOPT_URL, $host);
+        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
+        curl_setopt($curl, CURLOPT_FAILONERROR, false);
+        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
+        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
+        //设定返回信息中是否包含响应信息头,启用时会将头文件的信息作为数据流输出,true 表示输出信息头, false表示不输出信息头
+        //如果需要将字符串转成json,请将 CURLOPT_HEADER 设置成 false
+        curl_setopt($curl, CURLOPT_HEADER, false);
+
+        $ret = curl_exec($curl);
+        $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
+
+        // file_put_contents(PATH_USER_JG_LOGIN_LOG.date('Y-m-d').'.log', date('Y-m-d H:i:s').$ret.PHP_EOL,FILE_APPEND);//写入文件 常量需要自己在定义
+        $ret  = json_decode($ret,true);
+        if ($ret['code'] == 8000) {
+//            if($ret['exID']!=$exId){
+//                throw new Exception("exID 返回与发送不一致");
+//            }
+        } else {
+
+            //throw new Exception($ret['code'].":请重试");
+            throw new Exception($ret['code'].':'.$ret['content']);
+        }
+        return $ret;
+    }
+
+
+//通过别名发送:
+//JPushService::pushNotify([
+    //'title' => '测试',
+    //'content' => '测试',
+    //'alias' => 'user_id_' . $user_id,
+    //'extras' => $extras,
+    //'type' => JPushService::PUSH_TYPE_ALIAS,
+//]);
+}

+ 36 - 0
app/Services/Location.php

xqd
@@ -0,0 +1,36 @@
+<?php
+
+namespace App\Server;
+
+use App\Server\Location\LocationProvider;
+
+class Location
+{
+    private $appKey;
+    private $locate;
+
+    public function __construct($appKey)
+    {
+        $this->appKey = $appKey;
+    }
+
+    /**
+     * @param AddressProvider $data
+     * @param string $location
+     * @return string|array
+     */
+    public function getCity(AddressProvider $data, string $location)
+    {
+        $data->setKey($this->appKey);
+        $type = $data->getType();
+        $res = $data->locateToAddress(['location' => $location, 'get_poi' => 1]);
+        if ($res['status'] != 0) {
+            return $res;
+        }
+        $city = '';
+        if ($type == 'qq') {
+            $city = $res['result']['address_component']['city'];
+        }
+        return $city;
+    }
+}

+ 19 - 0
app/Services/Location/LocationProvider.php

xqd
@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Server\Location;
+
+abstract class LocationProvider
+{
+    protected $appKey;
+
+    public function setKey(string $key)
+    {
+        $this->appKey = $key;
+    }
+
+    abstract public function getType();
+
+    abstract public function addressToLocate();
+
+    abstract public function locateToAddress(array $params);
+}

+ 27 - 0
app/Services/Location/QQMapProvider.php

xqd
@@ -0,0 +1,27 @@
+<?php
+
+namespace App\Server\Location;
+
+use App\Server\ToolServer;
+
+class QQMapProvider extends AddressProvider
+{
+    private $type = 'qq';
+
+    public function addressToLocate()
+    {
+
+    }
+
+    public function locateToAddress(array $params)
+    {
+        $params['key'] = $this->appKey;
+        $url = "https://apis.map.qq.com/ws/geocoder/v1/";
+        return $data = ToolServer::curl('get', $url, $params, false, true);
+    }
+
+    public function getType()
+    {
+        return $this->type;
+    }
+}

+ 11 - 0
app/Services/Payment/PaymentProvider.php

xqd
@@ -0,0 +1,11 @@
+<?php
+
+namespace App\Server\Payment;
+
+abstract class PaymentProvider
+{
+    abstract public function init();
+    abstract public function pay(string $out_trade_no, string $openId, int $money, string $title);
+    abstract public function cash(string $partner_trade_no, string $open_id, float $money);
+    abstract public function refund();
+}

+ 129 - 0
app/Services/Payment/WeChatPay.php

xqd
@@ -0,0 +1,129 @@
+<?php
+
+namespace App\Server\Payment;
+
+use App\Model\BaseConfig;
+use EasyWeChat\Factory;
+use GuzzleHttp\Exception\GuzzleException;
+use Illuminate\Support\Facades\Log;
+use PHPUnit\Util\Exception;
+
+/**
+ * Class WeChatPay
+ * @package App\Server\Payment
+ * @property \EasyWeChat\Payment\Application $app
+ */
+class WeChatPay extends PaymentProvider
+{
+    private $app;
+
+    public function init()
+    {
+        $pay_config = BaseConfig::get('wechat_config');
+       // try {
+        $config = [
+            'app_id'             => $pay_config['appId'],
+            'mch_id'             => $pay_config['mchId'],
+            'key'                => $pay_config['key'],   // API 密钥
+            'cert_path'          => storage_path('app/public/apiclient_cert.pem'), // XXX: 绝对路径!!!!
+            'key_path'           => storage_path('app/public/apiclient_key.pem'),      // XXX: 绝对路径!!!!
+            'notify_url'         => $pay_config['notifyUrl'] ?? env('APP_URL') . '/api/wxPayNotify',     // 你也可以在下单时单独设置来想覆盖它
+           // 'notify_url'         => $pay_config['notifyUrl'],     // 你也可以在下单时单独设置来想覆盖它
+        ];
+        /*} catch (\Exception $e) {
+            throw new \Exception('微信支付初始化失败:' . $e->getMessage());
+        }*/
+        $this->app = Factory::payment($config);
+        if (!$this->app) {
+            throw new \Exception('微信支付初始化失败,请检查配置');
+        }
+        if (isset($pay_config['is_sub']) && $pay_config['is_sub'] == 1) {
+            $this->setSub();
+        }
+    }
+
+    public function getApp()
+    {
+        return $this->app;
+    }
+
+    private function setSub()
+    {
+        $subMchId = BaseConfig::get('wechat_config', 'subMchId', '');
+        $subAppId = BaseConfig::get('wechat_config', 'subAppId', '');
+        $this->app->setSubMerchant($subMchId, $subAppId);
+    }
+
+    /**
+     * 统一下单接口
+     * @param string $out_trade_no
+     * @param string $openId
+     * @param float $money
+     * @param string $title
+     * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string
+     */
+    public function pay(string $out_trade_no, string $openId, int $money, string $title = '余额充值')
+    {
+        try {
+            $result = $this->app->order->unify([
+                'body' => $title,
+                'out_trade_no' => $out_trade_no,
+                'total_fee' => $money,
+                'trade_type' => 'JSAPI', // 请对应换成你的支付方式对应的值类型
+                'openid' => $openId,
+            ]);
+            if ($result['return_code'] == "FAIL") {
+                return ['code' => 1, 'message' => "【微信支付】{$result['return_msg']}"];
+            } else {
+                $jssdk = $this->app->jssdk;
+                $config = $jssdk->sdkConfig($result['prepay_id']);
+                return ['code' => 0, 'data' => $config];
+            }
+        } catch (\Exception $e) {
+            return ['code' => 1, 'message' => $e->getMessage()];
+        } catch (GuzzleException $e) {
+            return ['code' => 2, 'message' => $e->getMessage()];
+        }
+    }
+
+    /**
+     * 用户提现
+     * @param string $partner_trade_no
+     * @param string $open_id
+     * @param float $money
+     * @return array|\EasyWeChat\Kernel\Support\Collection|object|\Psr\Http\Message\ResponseInterface|string
+     */
+    public function cash(string $partner_trade_no, string $open_id, float $money)
+    {
+        try {
+            $result = $this->app->transfer->toBalance([
+                'partner_trade_no' => $partner_trade_no, // 商户订单号,需保持唯一性(只能是字母或者数字,不能包含有符号)
+                'openid' => $open_id,
+                'check_name' => 'NO_CHECK', // NO_CHECK:不校验真实姓名, FORCE_CHECK:强校验真实姓名
+               // 're_user_name' => $real_name, // 如果 check_name 设置为FORCE_CHECK,则必填用户真实姓名
+                'amount' => intval($money), // 企业付款金额,单位为分
+                'desc' => '用户提现', // 企业付款操作说明信息。必填
+            ]);
+            if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') {
+                return ['code' => 0, 'message' => 'success'];
+            } else {
+                Log::error("微信零钱提现金额:".$money."错误:".json_encode($result));
+                return ['code' => 3, 'message' => ''];
+            }
+        } catch (\Exception $e) {
+            return ['code' => 1, 'message' => $e->getMessage()];
+        } catch (GuzzleException $e) {
+            return ['code' => 2, 'message' => $e->getMessage()];
+        }
+    }
+
+    public function payNotify()
+    {
+
+    }
+
+    public function refund()
+    {
+        // TODO: Implement refund() method.
+    }
+}

+ 14 - 0
app/Services/RedisService.php

xqd
@@ -0,0 +1,14 @@
+<?php
+
+namespace App\Services;
+
+use Illuminate\Support\Facades\Redis;
+
+class RedisService
+{
+    //这不是一个必须的方法,如果不理解其中的含义,完全可以在你的代码中使用  Illuminate\Support\Facades\Redis; 进行 redis 的各种操作
+    static public function redis(string $connection = 'cache')
+    {
+        return Redis::connection($connection);
+    }
+}

+ 183 - 0
app/Services/SmsServer.php

xqd
@@ -0,0 +1,183 @@
+<?php
+
+namespace App\Services;
+
+use App\Exceptions\SmsException;
+use Illuminate\Support\Facades\Redis;
+use PHPUnit\Util\Exception;
+use App\Models\SmsRecord;
+use Illuminate\Support\Str;
+use Overtrue\EasySms\EasySms;
+//use Overtrue\EasySms\Exceptions\Exception;
+use Overtrue\EasySms\Exceptions\NoGatewayAvailableException;
+
+class SmsServer
+{
+    const EVENT_LOGIN = 100;
+    const DEFAULT_SMS_CODE_LENGTH = 4;
+    const DEFAULT_SMS_CODE_EXP_TIME = 5*60;
+    const EVENTS_TO_TEMPLATE = [
+        '63' => [ //菲律宾
+            'login' => 'SMS_234414831',
+            'forget' => 'SMS_234414831',
+        ],
+        '86' => [ //中国
+            //'login'  => 'SMS_137515003',
+            //'forget' => 'SMS_137515003',
+            'login' => 'SMS_227262168',
+            'forget' => 'SMS_227262168',
+        ],
+    ];
+
+    const EVENT_ITEM_FUNCTION = [
+    
+    ];
+
+    /**
+     * 获取easySms配置
+     * @return \Illuminate\Config\Repository|\Illuminate\Contracts\Foundation\Application|mixed
+     */
+    static public function getEasySmsConfig()
+    {
+        return config('easysms');
+    }
+
+    /**
+     * 获取 easySms 实例
+     * @return EasySms
+     */
+    static public function easySms()
+    {
+        return new EasySms(self::getEasySmsConfig());
+    }
+
+    static public function send(int $mobile, string $event, int $prefix)
+    {
+        try {
+            $templateId = self::getTemplateIdByEvent($prefix, $event);
+            $smsCode = self::getSmsCode();
+            //注意! 实际发送的电话号码,要加 国际号码前缀
+            $result = self::easySms()->send($prefix.$mobile, [
+                'template' => $templateId,
+                'content' => 'null',
+                'data' => [
+                    'code' => $smsCode,
+                    'expTime' => 5,
+                ]
+            ]);
+            //缓存验证码
+            self::cacheSmsCodeByVerifyKey($mobile, $smsCode);
+            //存入发送记录
+            self::storeSmsRecord($prefix, $mobile, $event, $smsCode, '', $result);
+            return [
+                'smsCode' => $smsCode
+            ];
+
+        } catch (SmsException $e) {
+            return ['error' => $e->getMessage()];
+        } catch (NoGatewayAvailableException $e) {
+            return ['error' => trans('api.SMS_SENDING_FAILED')];
+        } catch (Exception $e) {
+            return ['error' => trans('api.SMS_SENDING_FAILED')];
+        }
+    }
+
+    /**
+     * 生成随机字符串用户校验验证码
+     * @param int $length
+     * @return string
+     */
+    static public function getVerifyKey(int $length = 10)
+    {
+        return Str::random($length);
+    }
+
+    /**
+     * 生成短信验证码
+     * @param int $length
+     * @return int
+     */
+    static public function getSmsCode($length = self::DEFAULT_SMS_CODE_LENGTH)
+    {
+        return rand(1000, 9999);
+    }
+
+    /**
+     * @param string $mobile
+     * @param string $smsCode
+     * @return bool
+     */
+    static public function checkSmsCodeByVerifyKey(string $mobile, string $smsCode)
+    {
+        $CacheSmsCode = Redis::get('smsCode:verifyCode' . $mobile);
+        if (empty($CacheSmsCode)) {
+            throw new Exception('验证码过期或已失效');
+        }
+        if ($smsCode != $CacheSmsCode) {
+            throw new Exception('验证码错误');
+        }
+        Redis::del('smsCode:verifyCode' . $mobile);
+
+        return true;
+    }
+
+
+    /**
+     * 缓存短信验证码
+     * @param int $mobile
+     * @param string $smsCode
+     * @param int $expTime
+     * @return mixed
+     */
+    static public function cacheSmsCodeByVerifyKey(int $mobile, string $smsCode, int $expTime = self::DEFAULT_SMS_CODE_EXP_TIME)
+    {
+        return Redis::setex('smsCode:verifyCode' . $mobile, $expTime, $smsCode);
+    }
+
+    /**
+     * 根据事件获取 短信模板ID
+     * @param string $event
+     * @return string
+     * @throws SmsException
+     */
+    static public function getTemplateIdByEvent($prefix, string $event)
+    {
+        //self::verifySmsEvent($event);
+        return self::EVENTS_TO_TEMPLATE[$prefix][$event];
+    }
+
+    /**
+     * 验证发送事件
+     * @param string $event
+     * @return bool
+     * @throws SmsException
+     */
+    static public function verifySmsEvent(string $event)
+    {
+        if (!array_key_exists($event, self::EVENTS_TO_TEMPLATE)) {
+            throw new Exception(trans('api.WRONG_EVENT_TYPE'));
+        }
+        return true;
+    }
+
+    /**
+     * 将发送记录存到数据库以便调试
+     * @param string $prefix
+     * @param int $mobile
+     * @param string $event
+     * @param string $smsCode
+     * @param $sendResult
+     * @return mixed
+     */
+    static public function storeSmsRecord(string $prefix, int $mobile, string $event, string $smsCode, $sendResult)
+    {
+        return SmsRecord::create([
+            'prefix' => $prefix,
+            'mobile' => $mobile,
+            'event' => $event,
+            'sms_code' => $smsCode,
+            'verify_key' => '',
+            'sms_result' => $sendResult
+        ]);
+    }
+}

+ 199 - 0
app/Services/TencentImAccountService.php

xqd
@@ -0,0 +1,199 @@
+<?php
+
+namespace App\Services;
+
+use App\Exceptions\TencentImAccountException;
+use App\Models\User;
+use App\Traits\TencentIm;
+use Illuminate\Support\Arr;
+
+class TencentImAccountService
+{
+    use TencentIm;
+
+    const IM_IDENTIFIER_PREFIX = 'IM_USER_';
+    const TENCENT_REST_APIS = [
+        'accountImport' => 'v4/im_open_login_svc/account_import',  //导入单个帐号
+        'multiAccountImport' => 'v4/im_open_login_svc/multiaccount_import', //导入多个帐号
+        'accountDelete' => 'v4/im_open_login_svc/account_delete',  //删除帐号
+        'accountCheck' => 'v4/im_open_login_svc/account_check',    //查询帐号是否已导入IM
+        'kick' => 'v4/im_open_login_svc/kick',  //失效帐号登录态
+        'queryState' => 'v4/openim/querystate', //查询帐号在线状态
+    ];
+
+    /**
+     * 导入单个账号
+     * @param User $user
+     * @return string
+     * @throws TencentImAccountException
+     * @throws \App\Exceptions\TencentImException
+     * @throws \GuzzleHttp\Exception\GuzzleException
+     */
+    public function accountImport(User $user)
+    {
+        $this->restApiName = self::TENCENT_REST_APIS['accountImport'];
+        $baseApiHost = $this->getTencentImRestApiBaseHost();
+        $params = [
+            'Identifier' => self::IM_IDENTIFIER_PREFIX . $user->id,
+//            'Nick' => $user->nickname ?? null,
+//            'FaceUrl' => valid_url($user->avatar)
+        ];
+        if ($user->nickname) {
+            $params = Arr::add($params, 'Nick', $user->nickName);
+        }
+        if ($user->avatar) {
+            $params = Arr::add($params, 'FaceUrl', $user->avatar);
+        }
+        $apiResult = $this->requestApi($baseApiHost, $params);
+        self::verifyApiResult($apiResult);
+        return self::IM_IDENTIFIER_PREFIX . $user->id;
+    }
+
+    /**
+     * 导入多个账号
+     * @param array $accounts
+     * @return array|string[]
+     * @throws TencentImAccountException
+     * @throws \App\Exceptions\TencentImException
+     * @throws \GuzzleHttp\Exception\GuzzleException
+     */
+    public function multiAccountImport(array $accounts)
+    {
+        $this->restApiName = self::TENCENT_REST_APIS['multiAccountImport'];
+        $baseApiHost = $this->getTencentImRestApiBaseHost();
+        $accounts = array_unique(array_filter($accounts));
+
+        $this->verifyRestApiMaxItem($accounts);
+
+        $accounts = array_map(function ($value) {
+            return self::IM_IDENTIFIER_PREFIX . $value;
+        }, $accounts);
+        $params = [
+            'Accounts' => $accounts,
+        ];
+        $apiResult = $this->requestApi($baseApiHost, $params);
+        self::verifyApiResult($apiResult);
+        return $accounts;
+    }
+
+    /**
+     * 删除账号
+     * @param array $accounts
+     * @return bool
+     * @throws TencentImAccountException
+     * @throws \App\Exceptions\TencentImException
+     * @throws \GuzzleHttp\Exception\GuzzleException
+     */
+    public function accountDelete(array $accounts)
+    {
+        $this->restApiName = self::TENCENT_REST_APIS['accountDelete'];
+        $baseApiHost = $this->getTencentImRestApiBaseHost();
+        $accounts = array_unique(array_filter($accounts));
+
+        $this->verifyRestApiMaxItem($accounts);
+
+        $accounts = array_map(function ($value) {
+            $UserID = $value;
+            return compact('UserID');
+        }, $accounts);
+        $params = [
+            'DeleteItem' => $accounts
+        ];
+        $apiResult = $this->requestApi($baseApiHost, $params);
+        self::verifyApiResult($apiResult);
+        return true;
+    }
+
+    /**
+     * 查询帐号是否已导入IM
+     * @param array $accounts
+     * @return mixed
+     * @throws TencentImAccountException
+     * @throws \App\Exceptions\TencentImException
+     * @throws \GuzzleHttp\Exception\GuzzleException
+     */
+    public function accountCheck(array $accounts)
+    {
+        $this->restApiName = self::TENCENT_REST_APIS['accountCheck'];
+        $baseApiHost = $this->getTencentImRestApiBaseHost();
+        $accounts = array_unique(array_filter($accounts));
+
+        $this->verifyRestApiMaxItem($accounts);
+
+        $accounts = array_map(function ($value) {
+            $UserID = $value;
+            return compact('UserID');
+        }, $accounts);
+        $params = [
+            'CheckItem' => $accounts
+        ];
+        $apiResult = $this->requestApi($baseApiHost, $params);
+        self::verifyApiResult($apiResult);
+        return $apiResult['ResultItem'];
+    }
+
+
+    /**
+     * 强制下线
+     * @param string $identifier
+     * @return bool
+     * @throws TencentImAccountException
+     * @throws \App\Exceptions\TencentImException
+     * @throws \GuzzleHttp\Exception\GuzzleException
+     */
+    public function kick(string $identifier)
+    {
+        $this->restApiName = self::TENCENT_REST_APIS['kick'];
+        $baseApiHost = $this->getTencentImRestApiBaseHost();
+        $params = ['Identifier' => $identifier];
+        $apiResult = $this->requestApi($baseApiHost, $params);
+        self::verifyApiResult($apiResult);
+        return true;
+    }
+
+
+    /**
+     * 获取用户当前的登录状态
+     * @param array $accounts
+     * @param bool $isDetail
+     * @return mixed
+     * @throws TencentImAccountException
+     * @throws \App\Exceptions\TencentImException
+     * @throws \GuzzleHttp\Exception\GuzzleException
+     */
+    public function queryState(array $accounts, bool $isDetail = false)
+    {
+        $this->restApiName = self::TENCENT_REST_APIS['queryState'];
+        $baseApiHost = $this->getTencentImRestApiBaseHost();
+        $accounts = array_unique(array_filter($accounts));
+
+        $this->verifyRestApiMaxItem($accounts);
+
+        $params = [
+            'To_Account' => $accounts
+        ];
+        $apiResult = $this->requestApi($baseApiHost, $params);
+        self::verifyApiResult($apiResult);
+        return $apiResult['QueryResult'];
+    }
+
+    /**
+     * 验证接口返回
+     * @param $apiResult
+     * @return bool
+     * @throws TencentImAccountException
+     */
+    static public function verifyApiResult($apiResult)
+    {
+        if (!is_array($apiResult)) {
+            throw new TencentImAccountException('IM 请求失败');
+        }
+        if (count(array_diff(['ActionStatus', 'ErrorCode', 'ErrorInfo'], array_keys($apiResult))) > 0) {
+            throw new TencentImAccountException('IM 接口返回异常');
+        }
+        if (($apiResult['ActionStatus'] != 'OK') || ($apiResult['ErrorCode'] != 0)) {
+            throw new TencentImAccountException('操作失败:   ' . $apiResult['ErrorInfo']);
+        }
+        return true;
+    }
+}

+ 218 - 0
app/Services/TencentImFriendService.php

xqd
@@ -0,0 +1,218 @@
+<?php
+
+namespace App\Services;
+
+use App\Exceptions\TencentImFriendException;
+use App\Models\User;
+use App\Models\UserFriendApplyRecord;
+use App\Traits\TencentIm;
+use Illuminate\Support\Arr;
+use Illuminate\Support\Facades\DB;
+
+class TencentImFriendService
+{
+    use TencentIm;
+
+    const ADD_FRIEND_TYPE_SINGLE = 'Add_Type_Single';   //表示单向加好友
+    const ADD_FRIEND_TYPE_BOTH = 'Add_Type_Both';   //表示双向加好友
+    const IM_IDENTIFIER_PREFIX = 'IM_USER_';
+
+    const CHECK_FRIEND_TYPE_SINGLE = 'CheckResult_Type_Single'; //只会检查 From_Account 的好友表中是否有 To_Account,不会检查 To_Account 的好友表中是否有 From_Account
+    const CHECK_FRIEND_TYPE_BOTH = 'CheckResult_Type_Both'; //既会检查 From_Account 的好友表中是否有 To_Account,也会检查 To_Account 的好友表中是否有 From_Account
+
+    const ADD_FRIEND_ADD_SOURCE_TYPE_ADDRESS_BOOK = 'AddSource_Type_100';   //加好友来源 通讯录
+
+    const TENCENT_REST_APIS = [
+        'friendAddItem' => 'v4/sns/friend_add',   //单个添加好友,
+        'friendGet' => 'v4/sns/friend_get', //拉取好友,
+        'friendCheck' => 'v4/sns/friend_check', //校验好友
+    ];
+
+    static public function verifyUserApplyFriendExists(User $fromUser, User $toUser)
+    {
+
+    }
+
+    //添加好友记录
+    public function addApplyFriendRecord(User $user, array $options = [])
+    {
+        try {
+            DB::beginTransaction();
+
+            $toUser = User::find($options['to_user_id']);
+
+            if (!$toUser) {
+                throw new TencentImFriendException('好友账号不存在');
+            }
+
+            //检测是否已经有记录
+
+            $friendApplyRecordModel = UserFriendApplyRecord::query()
+                ->where(['from_user_id' => $user->id, 'to_user_id' => $toUser->id])
+                ->latest()
+                ->first();
+
+
+            if ($friendApplyRecordModel) {
+                if (UserFriendApplyRecord::APPLY_STATUS_100 === $friendApplyRecordModel->apply_status) {
+                    throw new TencentImFriendException('已发出好友添加申请,请勿重复操作');
+                }
+
+                if (UserFriendApplyRecord::APPLY_STATUS_101 === $friendApplyRecordModel->apply_status) {
+                    throw new TencentImFriendException('已经是好友关系,请勿重复操作');
+                }
+
+                if (UserFriendApplyRecord::APPLY_STATUS_101 === $friendApplyRecordModel->apply_status) {
+                    throw new TencentImFriendException('已经是好友关系,请勿重复操作');
+                }
+            }
+
+
+            if (!$friendApplyRecordModel) {
+                $friendApplyRecordModel = new UserFriendApplyRecord();
+            }
+
+            //添加发起申请记录
+            $applyData = [
+                'from_user_id' => $user->id,
+                'to_user_id' => $toUser->id,
+                'type' => UserFriendApplyRecord::APPLY_TYPE_100,
+                'apply_status' => UserFriendApplyRecord::APPLY_STATUS_102,
+                'apply_raw_data' => [
+                    'remark' => $options['remark'] ?? '',
+                    'group' => $options['group_id'] ?? '',
+                ],
+            ];
+
+            $friendApplyRecordModel->fill($applyData);
+
+            //添加接收
+
+            if (!$friendApplyRecordModel->save()) {
+                throw new \Exception('写入好友申请记录失败');
+            }
+            DB::commit();
+            return $friendApplyRecordModel;
+        } catch (\Exception $e) {
+            DB::rollBack();
+            return ['error' => $e->getMessage()];
+        } catch (TencentImFriendException $e) {
+            DB::rollBack();
+            return ['error' => $e->getMessage()];
+        }
+
+    }
+
+    /**
+     * 发起添加 IM 好友  (单个用户)
+     * @param string $fromAccount
+     * @param string $toAccount
+     * @param array $options
+     * @return \Psr\Http\Message\ResponseInterface
+     * @throws TencentImFriendException
+     * @throws \App\Exceptions\TencentImAccountException
+     * @throws \App\Exceptions\TencentImException
+     * @throws \GuzzleHttp\Exception\GuzzleException
+     */
+    public function friendAddItem(string $fromAccount, string $toAccount, array $options = [])
+    {
+        //TODO 请求添加好友前先拉取好友状态
+
+        $this->restApiName = self::TENCENT_REST_APIS['friendAddItem'];
+        $baseApiHost = $this->getTencentImRestApiBaseHost();
+        $params = self::prepareFriendAddItemOptions($fromAccount, $toAccount, $options);
+        $apiResult = $this->requestApi($baseApiHost, $params);
+        self::verifyApiResult($apiResult);
+        if ($apiResult['ResultItem'][0]['ResultInfo'] || ($apiResult['ResultItem'][0]['ResultCode'] != 0)) {
+            throw new TencentImFriendException('添加好友失败:  ' . $apiResult['ResultItem'][0]['ResultInfo']);
+        }
+        return $apiResult;
+    }
+
+    //拉取好友
+    public function friendGet(string $fromAccount, int $pageStartIndex = 0)
+    {
+        $this->restApiName = self::TENCENT_REST_APIS['friendGet'];
+        $baseApiHost = $this->getTencentImRestApiBaseHost();
+        $params = [
+            'From_Account' => $fromAccount,
+            'StartIndex' => $pageStartIndex,
+            'StandardSequence' => $StandardSequence ?? 0,
+            'CustomSequence' => $CustomSequence ?? 0
+        ];
+        $apiResult = $this->requestApi($baseApiHost, $params);
+        dd($apiResult);
+    }
+
+    //检验好友
+    public function friendCheck(string $fromAccount, array $toAccounts, string $checkType = self::ADD_FRIEND_TYPE_BOTH)
+    {
+        $this->restApiName = self::TENCENT_REST_APIS['friendCheck'];
+        $baseApiHost = $this->getTencentImRestApiBaseHost();
+        $params = [
+            'From_Account' => $fromAccount,
+            'To_Account' => $toAccounts,
+            'CheckType' => 'CheckResult_Type_Both'
+        ];
+        $apiResult = $this->requestApi($baseApiHost, $params);
+        self::verifyApiResult($apiResult);
+        return $apiResult;
+    }
+
+
+    /**
+     * 构建添加好友api 请求数组
+     * @param string $fromAccount 需要添加好友的用户IM id
+     * @param string $toAccount 被申请添加好友的用户IM id
+     * @param array $options
+     * @param string $options ['AddType']  加好友方式
+     * @param string $options ['AddSource'] 好友来源
+     * @param string $options ['ForceAddFlags'] 管理员强制加好友标记:1表示强制加好友,0表示常规加好友方式
+     * @param string $options ['Remark'] 好友备注
+     * @param string $options ['AddWording'] 形成好友关系时的附言信息
+     * @param string $options ['GroupName'] 分组信息,添加好友时只允许设置一个分组
+     * @return array
+     */
+    static public function prepareFriendAddItemOptions(string $fromAccount, string $toAccount, array $options)
+    {
+        // string $addType = self::ADD_FRIEND_TYPE_BOTH,
+        // string $addSource = self::ADD_FRIEND_ADD_SOURCE_TYPE_ADDRESS_BOOK,
+        // string $remark = '',
+        // bool $forceAddFlags = false
+        $result = [
+            'From_Account' => $fromAccount,
+//            'AddSource' => $options['AddSource'] ?? self::ADD_FRIEND_ADD_SOURCE_TYPE_ADDRESS_BOOK,  //好友来源
+            'AddType' => $options['AddType'] ?? self::ADD_FRIEND_TYPE_BOTH, //加好友方式
+            'ForceAddFlags' => empty($options['ForceAddFlags']) ? 0 : ($options['ForceAddFlags'] ? 1 : 0),         //管理员强制加好友标记:1表示强制加好友,0表示常规加好友方式
+        ];
+
+        $AddFriendItem = [];
+        $AddFriendItem['To_Account'] = $toAccount;
+        //好友来源
+        $AddFriendItem['AddSource'] = $options['AddSource'] ?? self::ADD_FRIEND_ADD_SOURCE_TYPE_ADDRESS_BOOK;
+
+        //好友备注
+        if (!empty($options['Remark'])) {
+            $AddFriendItem['Remark'] = $options['Remark'];
+        }
+
+        //形成好友关系时的附言信息
+        if (!empty($options['AddWording'])) {
+            $AddFriendItem['AddWording'] = $options['AddWording'];
+        }
+
+        //分组信息,添加好友时只允许设置一个分组
+        if (!empty($options['GroupName'])) {
+            $AddFriendItem['GroupName'] = $options['GroupName'] ? 1 : 0;
+        }
+
+        $result['AddFriendItem'][] = $AddFriendItem;
+
+        unset($options);
+        unset($AddFriendItem);
+        return $result;
+
+    }
+
+
+}

+ 261 - 0
app/Services/TencentImGroupService.php

xqd
@@ -0,0 +1,261 @@
+<?php
+
+namespace App\Services;
+
+use App\Exceptions\TencentImException;
+use App\Exceptions\TencentImGroupException;
+use App\Models\TencentImGroup;
+use App\Traits\TencentIm;
+use Carbon\Carbon;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Log;
+use phpDocumentor\Reflection\Types\Self_;
+
+class TencentImGroupService
+{
+    use TencentIm;
+
+    const TENCENT_REST_APIS = [
+        'createGroup' => 'v4/group_open_http_svc/create_group',     //创建群组 支持同时创建多个
+        'getGroupList' => 'v4/group_open_http_svc/get_appid_group_list', //获取app中所有群组
+    ];
+
+
+    const IM_GROUP_RAW_TYPE_PUBLIC = 'Public';  //陌生人社交群
+    const IM_GROUP_RAW_TYPE_Private = 'Private';  //即 Work,好友工作群
+    const IM_GROUP_RAW_TYPE_ChatRoom = 'ChatRoom';  //即 Meeting,会议群
+    const IM_GROUP_RAW_TYPE_AVChatRoom = 'AVChatRoom';  //直播群
+
+    const IM_GROUP_RAW_TYPE_TIPS = [
+        self::IM_GROUP_RAW_TYPE_PUBLIC => '陌生人交友群',
+        self::IM_GROUP_RAW_TYPE_Private => '好友工作群',
+        self::IM_GROUP_RAW_TYPE_ChatRoom => '会议群',
+        self::IM_GROUP_RAW_TYPE_AVChatRoom => '直播群',
+    ];
+
+    /**
+     * 获取所有 APP 中的群组
+     * @param int $limit
+     * @param int $next
+     * @return \Psr\Http\Message\ResponseInterface
+     * @throws \App\Exceptions\TencentImAccountException
+     * @throws \App\Exceptions\TencentImException
+     * @throws \GuzzleHttp\Exception\GuzzleException
+     */
+    public function getGroupList(int $limit = 10000, int $next = 0)
+    {
+        $this->restApiName = self::TENCENT_REST_APIS['getGroupList'];
+        $baseApiHost = $this->getTencentImRestApiBaseHost();
+        $params = [
+            'Limit' => $limit,
+            'Next' => $next
+        ];
+        $apiResult = $this->requestApi($baseApiHost, $params);
+        self::verifyApiResult($apiResult);
+        return $apiResult;
+
+    }
+
+    /**
+     * 验证类型是否存在
+     * @param string $groupType
+     * @return bool
+     * @throws TencentImGroupException
+     */
+    static public function verifyImGroupType(string $groupType)
+    {
+        if (!array_key_exists($groupType, TencentImGroup::IM_GROUP_RAW_TYPE_TIPS)) {
+            throw new TencentImGroupException('群类型不存在');
+        }
+        return true;
+    }
+
+    /**
+     * 验证当日建群上限,并返回当前可以添加的数量
+     * @return int
+     * @throws TencentImGroupException
+     */
+    static public function verifyToDayCreateCount()
+    {
+        if (TencentImGroup::getToDayCreateCount() >= TencentImGroup::IM_GROUP_CREATE_DAY_MAX) {
+            throw new TencentImGroupException('单日新建群组上限为: ' . TencentImGroup::IM_GROUP_CREATE_DAY_MAX);
+        }
+        return (TencentImGroup::IM_GROUP_CREATE_DAY_MAX - TencentImGroup::getToDayCreateCount());
+    }
+
+    /**
+     * 验证当月建群上限,并返回可以添加的数量
+     * @return int
+     * @throws TencentImGroupException
+     */
+    static public function verifyMonthCreateCount()
+    {
+        if (TencentImGroup::getMonthCreateCount() >= TencentImGroup::IM_GROUP_CREATE_MONTH_MAX) {
+            throw new TencentImGroupException('单月新建群组上限为: ' . TencentImGroup::IM_GROUP_CREATE_MONTH_MAX);
+        }
+        return (TencentImGroup::IM_GROUP_CREATE_MONTH_MAX - TencentImGroup::getMonthCreateCount());
+    }
+
+    /**
+     * 验证是否可以添加群
+     * @param int $groupCount
+     * @throws TencentImGroupException
+     */
+    static public function verifyIsCreateGroup(int $groupCount)
+    {
+        //验证单次最低
+        if ($groupCount < TencentImGroup::IM_GROUP_ONCE_CREATE_MIN) {
+            throw new TencentImGroupException('单次添加最低' . TencentImGroup::IM_GROUP_ONCE_CREATE_MIN . ' 个群');
+        }
+
+        //验证单次最多
+        if ($groupCount > TencentImGroup::IM_GROUP_ONCE_CREATE_MAX) {
+            throw new TencentImGroupException('单次添加最多' . TencentImGroup::IM_GROUP_ONCE_CREATE_MAX . ' 个群');
+        }
+        //验证当天添加群数量
+        $canToDayCount = self::verifyToDayCreateCount();
+        //验证当月添加上限
+        $canMonthCount = self::verifyMonthCreateCount();
+
+        if ($groupCount > $canToDayCount) {
+            throw new TencentImGroupException('当前创建数量超过日上限,当日还可创建 ' . $canToDayCount . '个');
+        }
+
+        if ($groupCount > $canMonthCount) {
+            throw new TencentImGroupException('当前创建数量超过月上限,当月还可创建 ' . $canMonthCount . '个');
+        }
+        return true;
+    }
+
+    /**
+     *
+     * @param int $groupCount
+     * @param string $groupType
+     * @throws TencentImGroupException
+     * @throws \App\Exceptions\TencentImException
+     */
+    public function createGroups(int $groupCount, string $groupType = TencentImGroup::DEFAULT_IM_RAW_GROUP_TYPE)
+    {
+
+
+        try {
+
+            //验证群类型是否存在
+            self::verifyImGroupType($groupType);
+
+            //是否可以创建群
+            self::verifyIsCreateGroup($groupCount);
+
+            DB::beginTransaction();
+
+            $this->restApiName = self::TENCENT_REST_APIS['createGroup'];
+            $baseApiHost = $this->getTencentImRestApiBaseHost();
+
+            //TODO 做单点登录,避免并发
+            $groupStartIndex = TencentImGroup::getGroupIndex();
+
+            $groupEndIndex = $groupStartIndex + $groupCount;
+            for ($i = $groupStartIndex; $i < $groupEndIndex; $i++) {
+                $item = [
+                    //TODO 新建群默认群主为APP管理员
+                    'Owner_Account' => config('im.identifier'),
+                    'Type' => TencentImGroup::IM_GROUP_RAW_TYPE_ChatRoom,
+                    'Name' => (string)$i,
+                ];
+                $apiResult = $this->requestApi($baseApiHost, $item);
+                self::verifyApiResult($apiResult);
+                $item['GroupId'] = $apiResult['GroupId'];
+                $item['groupIndex'] = $i;
+                $params[] = $item;
+
+            }
+            unset($item);
+
+            if (count($params) != $groupCount) {
+                throw new TencentImGroupException('添加群组失败!');
+            }
+
+            $params = array_map(function ($value) {
+                return [
+                    'group_name' => $value['Name'],
+                    'im_group_raw_id' => $value['GroupId'] ?? $value['groupIndex'],
+                    'group_owner_user_id' => null,
+                    'im_group_owner_raw_user_id' => $value['Owner_Account'],
+                    'group_type' => null,
+                    'im_group_raw_type' => $value['Type'],
+                    'is_use' => TencentImGroup::UN_USE,
+                    'bind_system_im_group_id' => null,
+                    'group_index' => $value['groupIndex'] ?? 0,
+                    'created_at' => Carbon::now(),
+                    'updated_at' => Carbon::now(),
+                ];
+            }, $params);
+
+            if (!TencentImGroup::insert($params)) {
+                Log::log(date('Y-m-d H:i:s', time()) . '创建IM群组,写入系统记录失败', $params);
+                throw new TencentImGroupException('创建IM群写入系统记录失败,请联系管理员检查');
+            }
+
+            DB::commit();
+            return true;
+        } catch (TencentImGroupException $e) {
+            DB::rollBack();
+            return ['error' => $e->getMessage()];
+        } catch (TencentImException  $e) {
+            DB::rollBack();
+            dd($e);
+            return ['error' => $e->getMessage()];
+        } catch (\Exception $e) {
+            DB::rollBack();
+            dd($e);
+            return ['error' => $e->getMessage()];
+        }
+
+
+    }
+
+    public function createGroup(array $createData)
+    {
+        $this->restApiName = self::TENCENT_REST_APIS['createGroup'];
+        $baseApiHost = $this->getTencentImRestApiBaseHost();
+
+        //TODO 做单点登录,避免并发
+        $params = [
+            //TODO 新建群默认群主为APP管理员
+            'Owner_Account' => config('im.identifier'),
+            'Type' => TencentImGroup::IM_GROUP_RAW_TYPE_ChatRoom,
+            'Name' => TencentImGroup::getGroupIndex(),
+        ];
+
+        $apiResult = $this->requestApi($baseApiHost, $params);
+
+
+        dd($apiResult);
+    }
+
+
+    /**
+     * 构建添加群数组
+     * @param int $groupCount
+     * @return mixed
+     */
+    private function generateCreateGroupData(int $groupCount)
+    {
+        $groupStartIndex = TencentImGroup::getGroupIndex();
+        $groupEndIndex = $groupStartIndex + $groupCount;
+        for ($i = $groupStartIndex; $i < $groupEndIndex; $i++) {
+            $item = [
+                //TODO 新建群默认群主为APP管理员
+                'Owner_Account' => config('im.identifier'),
+                'Type' => TencentImGroup::IM_GROUP_RAW_TYPE_ChatRoom,
+                'Name' => $i,
+            ];
+            $this->createGroup($item);
+            $params[] = $item;
+
+        }
+        unset($item);
+        return $params;
+    }
+
+}

+ 58 - 0
app/Services/TencentImService.php

xqd
@@ -0,0 +1,58 @@
+<?php
+
+namespace App\Services;
+
+use App\Exceptions\TencentImException;
+use App\Models\User;
+use App\Traits\TencentIm;
+use GuzzleHttp\Client;
+use Illuminate\Support\Arr;
+use Tencent\TLSSigAPIv2;
+
+class TencentImService
+{
+
+    use TencentIm;
+
+
+    const TENCENT_REST_APIS = [
+        'account_import' => 'v4/im_open_login_svc/account_import',  //导入单个帐号
+        'multiaccount_import' => 'v4/im_open_login_svc/multiaccount_import', //导入多个帐号
+        'account_delete' => 'v4/im_open_login_svc/account_delete',  //删除帐号
+        'account_check' => 'v4/im_open_login_svc/account_check',    //查询帐号
+        'kick' => 'v4/im_open_login_svc/kick',  //失效帐号登录态
+        'querystate' => 'v4/openim/querystate', //查询帐号在线状态
+        'sendmsg' => 'v4/openim/sendmsg',   //单发单聊消息
+        'batchsendmsg' => '	v4/openim/batchsendmsg',   //批量发单聊消息
+        'importmsg' => 'v4/openim/importmsg',   //导入单聊消息
+        'admin_getroammsg' => 'v4/openim/admin_getroammsg',   //查询单聊消息
+        'admin_msgwithdraw' => 'v4/openim/admin_msgwithdraw',   //撤回单聊消息
+        'admin_set_msg_read' => '	v4/openim/admin_set_msg_read',   //设置单聊消息已读
+        'all_member_push/im_push' => 'v4/all_member_push/im_push',   //全员推送
+        'all_member_push/im_set_attr_name' => 'v4/all_member_push/im_set_attr_name',   //设置应用属性名称
+        'sns/friend_add' => 'v4/sns/friend_add',   //添加好友
+        'sns/friend_import' => 'v4/sns/friend_import',   //导入好友
+        'sns/friend_update' => 'v4/sns/friend_update',   //更新好友
+        'sns/friend_delete' => 'v4/sns/friend_delete',   //删除好友
+        'sns/friend_delete_all' => 'v4/sns/friend_delete_all',   //删除所有好友
+        'sns/friend_check' => 'v4/sns/friend_check',   //校验好友
+        'sns/friend_get' => 'v4/sns/friend_get',   //拉取好友
+        'sns/friend_get_list' => 'v4/sns/friend_get_list',   //拉取指定好友
+        'sns/black_list_add' => 'v4/sns/black_list_add',   //添加黑名单
+        'sns/black_list_delete' => 'v4/sns/black_list_delete',   //删除黑名单
+        'sns/black_list_get' => 'v4/sns/black_list_get',   //拉取黑名单
+        'sns/black_list_check' => 'v4/sns/black_list_check',   //校验黑名单
+        'group_open_http_svc/create_group' => 'v4/group_open_http_svc/create_group',   //创建群组
+        'group_open_http_svc/get_group_info' => 'v4/group_open_http_svc/get_group_info',   //获取群详细资料
+        'group_open_http_svc/modify_group_base_info' => 'v4/group_open_http_svc/modify_group_base_info',   //修改群基础资料
+        'group_open_http_svc/add_group_member' => 'v4/group_open_http_svc/add_group_member',   //
+
+    ];
+
+    public function registerItemAccountByUser()
+    {
+
+    }
+
+
+}

+ 566 - 0
app/Services/ToolServer.php

xqd
@@ -0,0 +1,566 @@
+<?php
+
+namespace App\Server;
+use Illuminate\Support\Arr;
+use \Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Storage;
+class ToolServer
+{
+    /**
+     * curl 请求工具
+     * @param string $method
+     * @param string $url
+     * @param array $params
+     * @param bool $json
+     * @param bool $isDecode
+     * @return bool|mixed|string
+     */
+    public static function curl(string $method, string $url, array $params = [], bool $json = false, bool $isDecode = false)
+    {
+        $method = strtoupper($method);
+        $ch = curl_init();
+        curl_setopt($ch, CURLOPT_HEADER, 0);
+        if ($method == 'GET') {
+            $url_params = '';
+            foreach ($params as $key => $val) {
+                if (empty($url_params)) {
+                    $url_params .= '?';
+                } else {
+                    $url_params .= '&';
+                }
+                $url_params .= $key . '=' . $val;
+            }
+            if (!empty($url_params)) {
+                $url .= $url_params;
+            }
+            curl_setopt($ch, CURLOPT_URL, $url);
+            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+        } elseif ($method == 'POST') {
+            curl_setopt($ch, CURLOPT_URL, $url);
+            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+            curl_setopt($ch, CURLOPT_POST, 1);
+            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
+            if ($json == true) {
+                $params = json_encode($params, JSON_UNESCAPED_UNICODE);
+                $len = strlen($params);
+                $headers = array("Content-type: application/json;charset=UTF-8","Content-Length: $len");
+                curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
+            } else {
+                $params =  http_build_query($params);
+            }
+            curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
+        }
+        $data = curl_exec($ch);
+        curl_close($ch);
+        if ($isDecode) {
+            $data = json_decode($data, true);
+        }
+        return $data;
+    }
+
+    /**
+     * 自动收起距离单位
+     * @param float $distance
+     * @return float|int|string
+     */
+    public static function distance(float $distance)
+    {
+        if ($distance == -1) {
+            return -1;
+        }
+        if ($distance > 1000) {
+            $distance = round($distance / 1000, 2) . 'km';
+        } else {
+            $distance .= 'm';
+        }
+        return $distance;
+    }
+
+    /**
+     * 获取地址距离
+     * @param array $from [起点坐标(经纬度),例如:array(118.012951,36.810024)]
+     * @param array $to [终点坐标(经纬度)]
+     * @param bool $km 是否以公里为单位 false:米 true:公里(千米)
+     * @param int $decimal $decimal   精度 保留小数位数
+     * @return int|string 距离数值
+     */
+    public static function getDistance(array $from, array $to, bool $km = true, int $decimal = 2)
+    {
+        sort($from);
+        sort($to);
+        $EARTH_RADIUS = 6370.996; // 地球半径系数
+
+        $distance = $EARTH_RADIUS * 2 * asin(sqrt(pow(sin(($from[0] * pi() / 180 - $to[0] * pi() / 180) / 2), 2) + cos($from[0] * pi() / 180) * cos($to[0] * pi() / 180) * pow(sin(($from[1] * pi() / 180 - $to[1] * pi() / 180) / 2), 2))) * 1000;
+
+        if ($km) {
+            $distance = $distance / 1000;
+        }
+
+        return round($distance, $decimal);
+    }
+
+    /**
+     * 加密(可对接java)
+     * @param array $data
+     * @param string $key
+     * @param string $secret
+     * @return string
+     */
+    public static function encodeOld(array $data, string $key, string $secret)
+    {
+
+        $plaintext  = urldecode(http_build_query($data)) . '@';
+        $key = strtoupper(md5($key . $secret));
+        $size = 16;
+        $iv = str_repeat("\0", $size);
+        $padding = $size - strlen($plaintext) % $size;
+        $plaintext .= str_repeat(chr($padding), $padding);
+        $encrypted = openssl_encrypt($plaintext, 'AES-192-CBC', base64_decode($key), OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);
+        return base64_encode($encrypted);
+    }
+
+    /**
+     * 加密
+     * @param array $data
+     * @param string $key
+     * @return string
+     */
+    public static function encode(array $data, string $key)
+    {
+        //数据集合转化字符串  再加个 @
+        $plaintext  = urldecode(http_build_query($data)) . '@';
+        //md5 加密 key
+        $key_md5 = $key;
+        $size = 16;
+        //生成 16 位偏移量
+        //$iv = str_repeat("\0", $size);
+        $iv = "0987654321098765";
+        // 使用 PKCS5Padding 填充
+        $padding = $size - strlen($plaintext) % $size;
+        $plaintext .= str_repeat(chr($padding), $padding);
+        $encrypted = openssl_encrypt($plaintext, 'AES-128-CBC', $key_md5, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);
+        return base64_encode($encrypted);
+    }
+
+    public static function encodeStr(string $data, string $key)
+    {
+        //数据集合转化字符串  再加个 @
+        $plaintext = $data . '@';
+        //md5 加密 key
+        $key_md5 = $key;
+        $size = 16;
+        //生成 16 位偏移量
+        $iv = str_repeat("\0", $size);
+        //$iv = "0987654321098765";
+        // 使用 PKCS5Padding 填充
+        $padding = $size - strlen($plaintext) % $size;
+        $plaintext .= str_repeat(chr($padding), $padding);
+        $encrypted = openssl_encrypt($plaintext, 'AES-128-CBC', $key_md5, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);
+        return base64_encode($encrypted);
+    }
+
+    /**
+     * 解密(可对接java)
+     * @param string $content
+     * @param string $key
+     * @return array
+     */
+    public static function decode(string $content, string $key)
+    {
+        $key_md5 = $key;
+        $size = 16;
+        //$iv = str_repeat("\0", $size);
+        $iv = "0987654321098765";
+        $decrypted = openssl_decrypt(base64_decode($content), 'AES-128-CBC', $key_md5, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);
+        $data_decode = explode('@', $decrypted);
+        //$data = [];
+        //parse_str($data_decode[0], $data);
+        return json_decode($data_decode[0], true);
+    }
+
+    /**
+     * 解密(php)
+     * @param string $content
+     * @param string $key
+     * @param string $secret
+     * @return mixed
+     */
+    public static function decodeOld(string $content, string $key, string $secret)
+    {
+        $key = strtoupper(md5($key . $secret));
+        $size = 16;
+        $iv = str_repeat("\0", $size);
+        $decrypted = openssl_decrypt(base64_decode($content), 'AES-192-CBC', base64_decode($key), OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);
+        $data_decode = explode('@', $decrypted);
+        //$data = [];
+        //parse_str($data_decode[0], $data);
+        //return $data;
+        return json_decode($data_decode[0], true);
+    }
+
+    public static function toStr($bytes)
+    {
+        $str = '';
+        foreach ($bytes as $ch) {
+            //dd(chr($ch));
+            try {
+                $str .= chr($ch);
+            } catch (\Exception $e) {
+                dd(chr($ch));
+            }
+
+        }
+
+        return $str;
+    }
+
+    /**
+     * 签名算法
+     * @param array $params
+     * @param string $secret
+     * @return array
+     */
+    public static function sign(array $params, string $secret)
+    {
+        $p = ksort($params);
+        $str = '';
+        if ($p) {
+            foreach ($params as $key => $items) {
+                $str .= "{$key}";
+                $str .= "=";
+                $str .= "{$items}";
+                $str .= "&";
+            }
+        }
+        $string = substr($str, 0, -1);
+        //$string = "appKey=$this->appKey&nonce=$this->nonce&timestamp=$this->timestamp";
+        $stringSignTemp = "$string&secret=$secret";
+        //echo $stringSignTemp;
+        $sign = strtoupper(MD5($stringSignTemp));
+
+        $params['sign'] = $sign;
+        return $params;
+    }
+
+    /**
+     * 
+     * @param string $key
+     * @param string $value
+     * @return array
+     */
+    public static function user_admin_config($key = null, $value = null)
+    {
+        $session = session();
+
+        if (! $config = $session->get('admin.config')) {
+            $config = config('admin');
+
+            $config['lang'] = config('app.locale');
+        }
+
+        if (is_array($key)) {
+            // 保存
+            foreach ($key as $k => $v) {
+                Arr::set($config, $k, $v);
+            }
+
+            $session->put('admin.config', $config);
+
+            return;
+        }
+
+        if ($key === null) {
+            return $config;
+        }
+
+        return Arr::get($config, $key, $value);
+    }
+    /**
+     * 生成随机码
+     * @return string
+     */
+    public static function create_invite_code() {
+        $code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+        $rand = $code[rand(0,25)]
+            .strtoupper(dechex(date('m')))
+            .date('d')
+            .substr(time(),-5)
+            .substr(microtime(),2,5)
+            .sprintf('%02d',rand(0,99));
+        for(
+            $a = md5( $rand, true ),
+            $s = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
+            $d = '',
+            $f = 0;
+            $f < 6;
+            $g = ord( $a[ $f ] ),
+            $d .= $s[ ( $g ^ ord( $a[ $f + 8 ] ) ) - $g & 0x1F ],
+            $f++
+        );
+        return $d;
+    }
+    
+    /**
+     * 时间格式化(时间戳)
+     * @param $ptime
+     * @return false|string
+     */
+    public static function uc_time_ago($ptime)
+    {
+        date_default_timezone_set('PRC');
+        $etime = time() - $ptime;
+        switch ($etime) {
+            case $etime <= 60:
+                $msg = '刚刚';
+                break;
+            case $etime > 60 && $etime <= 60 * 60:
+                $msg = floor($etime / 60) . '分钟前';
+                break;
+            case $etime > 60 * 60 && $etime <= 24 * 60 * 60:
+                $msg = date('Ymd', $ptime) == date('Ymd', time()) ? '今天 ' . date('H:i', $ptime) : '昨天 ' . date('H:i', $ptime);
+                break;
+            case $etime > 24 * 60 * 60 && $etime <= 2 * 24 * 60 * 60:
+                $msg = date('Ymd', $ptime) + 1 == date('Ymd', time()) ? '昨天 ' . date('H:i', $ptime) : '前天 ' . date('H:i', $ptime);
+                break;
+            case $etime > 2 * 24 * 60 * 60 && $etime <= 12 * 30 * 24 * 60 * 60:
+                $msg = date('Y', $ptime) == date('Y', time()) ? date('m-d H:i', $ptime) : date('Y-m-d H:i', $ptime);
+                break;
+            default:
+                $msg = date('Y-m-d H:i', $ptime);
+        }
+        return $msg;
+    }
+
+    /**
+     * 获取IP地址归属地
+     * @param $ip
+     * @return string
+     */
+    public static function get_ip_address($ip)
+    {
+        if ('127.0.0.1' == $ip) return 'Localhost';
+        $url = 'http://ip.taobao.com/service/getIpInfo.php?ip=' . $ip;
+        $ch = curl_init($url);
+        curl_setopt($ch, CURLOPT_TIMEOUT, 10);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 获取数据返回
+        $location = curl_exec($ch);
+        $location = json_decode($location, true);
+        curl_close($ch);
+
+        if (false != $location && 0 === $location['code']) {
+            return $location['data']['region'] . $location['data']['city'] . $location['data']['county'] . '・' . $location['data']['isp'];
+        } else {
+            return 'unknown';
+        }
+
+    }
+
+    /**
+     * 递归查询获取分类树结构
+     * @param $data
+     * @param int $pid
+     * @param int $level
+     * @param array $tree
+     * @param string $pidField
+     * @param string $showField
+     * @return array
+     */
+    public static function get_tree_list(&$data, $pid = 0, $level = 0, &$tree = [], $pidField = 'pid', $showField = 'name')
+    {
+        foreach ($data as $key => &$value) {
+            if ($value[$pidField] == $pid) {
+                $value['level'] = $level;
+                $value['level'] && $value[$showField] = '&nbsp;' . $value[$showField];
+                $value[$showField] = str_repeat('ㅡ', $value['level']) . $value[$showField];
+                $tree[] = $value;
+                unset($data[$key]);
+                self::get_tree_list($data, $value['id'], $level + 1, $tree);
+            }
+        }
+        unset($value);
+
+        return $tree;
+    }
+
+    /**
+     * 递归查询获取分类树结构带child
+     * @param $data
+     * @param int $pid
+     * @param int $level
+     * @param string $pidField
+     * @return array
+     */
+    public static function get_tree_list_with_child(&$data, $pid = 0, $level = 0, $pidField = 'pid')
+    {
+        $tree = [];
+        foreach ($data as $key => &$value) {
+            if ($value[$pidField] == $pid) {
+                $value['level'] = $level;
+                $value['child'] = self::get_tree_list_with_child($data, $value['id'], $level + 1);
+                $tree[] = $value;
+                unset($data[$key]);
+            }
+        }
+        unset($value);
+
+        return $tree;
+    }
+
+    /**
+     * 打印sql语句,在sql语句之前调用
+     */
+    public static function dump_sql()
+    {
+        \DB::listen(function ($query) {
+            $bindings = $query->bindings;
+            $i = 0;
+            $rawSql = preg_replace_callback('/\?/', function ($matches) use ($bindings, &$i) {
+                $item = isset($bindings[$i]) ? $bindings[$i] : $matches[0];
+                $i++;
+                return gettype($item) == 'string' ? "'$item'" : $item;
+            }, $query->sql);
+            echo $rawSql . "\n<br /><br />\n";
+        });
+    }
+
+    public static function create_guid($namespace = null)
+    {
+        static $guid = '';
+        $uid = uniqid("", true);
+
+        $data = $namespace;
+        $data .= $_SERVER ['REQUEST_TIME'];     // 请求那一刻的时间戳
+        $data .= $_SERVER ['HTTP_USER_AGENT'];  // 获取访问者在用什么操作系统
+        $data .= $_SERVER ['SERVER_ADDR'];      // 服务器IP
+        $data .= $_SERVER ['SERVER_PORT'];      // 端口号
+        $data .= $_SERVER ['REMOTE_ADDR'];      // 远程IP
+        $data .= $_SERVER ['REMOTE_PORT'];      // 端口信息
+
+        $hash = strtoupper(hash('ripemd128', $uid . $guid . md5($data)));
+        $guid = substr($hash, 0, 8);
+
+        return $guid;
+    }
+
+    public static function create_order_number()
+    {
+        return date('Ymd') . str_pad(mt_rand(1, 999999), 6, '0', STR_PAD_LEFT);
+    }
+
+    /**
+     * curl 请求
+     * @param $url
+     * @param null $header
+     * @param null $data
+     * @return mixed
+     */
+    public static function curlRequest($url, $header = null, $data = null)
+    {
+        $ch = curl_init();
+        curl_setopt($ch, CURLOPT_URL, $url);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+        curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
+        curl_setopt($ch, CURLOPT_HEADER, 1);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
+        if ($data) {
+            curl_setopt($ch, CURLOPT_POST, 1);
+            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
+        }
+        if ($header) {
+            curl_setopt($ch, CURLOPT_HEADER, $header);
+        }
+        $ret = curl_exec($ch);
+        curl_close($ch);
+
+        return $ret;
+    }
+
+    /**
+     * 数字金额转换成中文大写金额的函数
+     * @param $num
+     * @return string
+     */
+    public static function cny($num)
+    {
+
+        $c1 = "零壹贰叁肆伍陆柒捌玖";
+        $c2 = "分角元拾佰仟万拾佰仟亿";
+        $num = round($num, 2);
+        $num = $num * 100;
+        if (strlen($num) > 10) {
+            return "数据太长,没有这么大的钱吧,检查下";
+        }
+        $i = 0;
+        $c = "";
+        while (1) {
+            if ($i == 0) {
+                $n = substr($num, strlen($num) - 1, 1);
+            } else {
+                $n = $num % 10;
+            }
+            $p1 = substr($c1, 3 * $n, 3);
+            $p2 = substr($c2, 3 * $i, 3);
+            if ($n != '0' || ($n == '0' && ($p2 == '亿' || $p2 == '万' || $p2 == '元'))) {
+                $c = $p1 . $p2 . $c;
+            } else {
+                $c = $p1 . $c;
+            }
+            $i = $i + 1;
+            $num = $num / 10;
+            $num = (int)$num;
+            if ($num == 0) {
+                break;
+            }
+        }
+        $j = 0;
+        $slen = strlen($c);
+        while ($j < $slen) {
+            $m = substr($c, $j, 6);
+            if ($m == '零元' || $m == '零万' || $m == '零亿' || $m == '零零') {
+                $left = substr($c, 0, $j);
+                $right = substr($c, $j + 3);
+                $c = $left . $right;
+                $j = $j - 3;
+                $slen = $slen - 3;
+            }
+            $j = $j + 3;
+        }
+
+        if (substr($c, strlen($c) - 3, 3) == '零') {
+            $c = substr($c, 0, strlen($c) - 3);
+        }
+        if (empty($c)) {
+            return "零元整";
+        } else {
+            return $c . "整";
+        }
+    }
+
+    /**
+     * 路径助手函数
+     * @param $url
+     * @param null $disk_name
+     * @param false $temp
+     * @param null|DateTimeInterface  $expiration
+     * @return string|null
+     */
+    public static function valid_url($url, $disk_name = null, $temp = false, $expiration = null)
+    {
+        if (is_null($url)) {
+            return null;
+        }
+
+        if (filter_var($url, FILTER_VALIDATE_URL)) {
+            return $url;
+        }
+
+        if ($temp) {
+            $expiration = $expiration ?: now()->addMinutes(30);
+            return Storage::disk($disk_name)->temporaryUrl($url, $expiration);
+        }
+
+        return Storage::disk($disk_name)->url($url);
+    }
+}

+ 60 - 0
app/libs/PreInstall.php

xqd
@@ -0,0 +1,60 @@
+<?php
+
+namespace App\libs;
+
+use Illuminate\Support\Env;
+use Illuminate\Support\Facades\Config;
+use Symfony\Component\HttpFoundation\File\Exception\FileException;
+
+/**
+ * @desc    预设文件加载
+ * @package lc
+ */
+Class PreInstall
+{
+    private static $data = [];
+
+    /**
+     * @desc    获得配置
+     * @param   string $type 扩展名称
+     * @return  array|mixed
+     */
+    public static function config(string $type)
+    {
+        $id = Env::get($type . '.id', Config::get('lc.' . $type . '.id'));
+        if (!$id) {
+            return [];
+        }
+        return self::get($type, $id);
+    }
+
+    /**
+     * @desc    获取指定配置
+     * @param   string      $type   扩展名称
+     * @param   string|null $id     指定id
+     * @return  array|mixed
+     */
+    public static function get(string $type, string $id = null)
+    {
+        if (!isset($data[$type])) {
+            self::load($type);
+        }
+        if (!isset(self::$data[$type])) {
+            return [];
+        }
+        $data = self::$data[$type];
+        if ($id) {
+            return isset($data[$id]) ? $data[$id] : [];
+        }
+        return $data;
+    }
+
+    private static function load($type)
+    {
+        $file = __DIR__ . '/preinstall/' . $type . '.php';
+        if (!file_exists($file)) {
+            throw new FileException('SWDZ预设文件不存在:' . $file);
+        }
+        self::$data[$type] = include $file;
+    }
+}

+ 59 - 0
app/libs/cache/redis/Redis.php

xqd
@@ -0,0 +1,59 @@
+<?php
+
+namespace App\libs\cache\redis;
+use App\libs\PreInstall;
+use Illuminate\Support\Env;
+use Illuminate\Support\Facades\Config;
+
+class Redis
+{
+    private $host = '127.0.0.1';
+    private $port = 6379;
+    private $redis;
+    private static $instance;
+
+    private function __construct()
+    {
+        $redis  = new \Redis();
+        $config = [
+            'host'  => Env::get('redis.host', $this->host),
+            'port'  => Env::get('redis.port', $this->port),
+            'pwd'   => Env::get('redis.pwd', '')
+        ];
+        $config = array_merge($config, PreInstall::config('redis'));
+        $redis->connect($config['host'], $config['port']);
+        if (!empty($config['pwd'])) {
+            $redis->auth($config['pwd']);
+        }
+        $this->redis = $redis;
+        $this->redis->select(Config::get('lc.redis.db'));
+    }
+
+    public static function instance()
+    {
+        if (!self::$instance) {
+            self::$instance = new self();
+        }
+        return self::$instance;
+    }
+
+    /**
+     * 同步锁
+     * 上锁成功返回true
+     * 当存在锁(即上锁失败)返回false
+     * @param string $key 锁定的标识
+     * @param string $value 锁定值
+     * @param int $ex 锁释放时间,超时自动释放锁
+     * @return bool
+     */
+    public function lock($key, $value, $ex = 3)
+    {
+        return $this->redis->set($key, $value, ['nx', 'ex' => $ex]);
+    }
+
+    public function __call($name, $arguments)
+    {
+        return call_user_func_array([$this->redis, $name], $arguments);
+    }
+}
+

+ 66 - 0
app/libs/helpers/Curl.php

xqd
@@ -0,0 +1,66 @@
+<?php
+
+namespace App\libs\helpers;
+
+class Curl
+{
+    /*
+     * @desc    curl请求
+     * @param   $url
+     * @param   string  $method
+     * @param   mixed   $header
+     * @param   string  $data
+     * @return  bool|mixed
+     */
+    public static function requestCurl($url, $method = 'GET', $header = [], $data = '')
+    {
+        $ch = curl_init();
+        if ($header) {
+            curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
+        }
+        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
+        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
+        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
+        curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
+        if ($method == 'POST') {
+            curl_setopt($ch, CURLOPT_POST, true);
+            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
+            curl_setopt($ch, CURLOPT_URL, $url);
+        } else {
+            if ($data) {
+                $url = $url . '?' . $data;
+            }
+            curl_setopt($ch, CURLOPT_URL, $url);
+        }
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+        $result = curl_exec($ch);
+        if (curl_errno($ch)) {
+            curl_close($ch);
+            $errorNo = curl_errno($ch);
+            $error   = curl_error($ch);
+            throw new \Exception('curl出错,错误码: ' . $errorNo . ',错误信息:' . $error);
+        } else {
+            curl_close($ch);
+            return $result;
+        }
+    }
+
+    /**
+     * @desc 获取IP
+     */
+    private static function ip()
+    {
+        $ip = "unknown";
+        if (getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
+            $ip = getenv('HTTP_CLIENT_IP');
+        } elseif (getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
+            $ip = getenv('HTTP_X_FORWARDED_FOR');
+        } elseif (getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
+            $ip = getenv('REMOTE_ADDR');
+        } elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
+            $ip = $_SERVER['REMOTE_ADDR'];
+        }
+        return preg_match('/[\d\.]{7,15}/', $ip, $matches) ? $matches[0] : $ip;
+    }
+}

+ 421 - 0
app/libs/helpers/Excel.php

xqd
@@ -0,0 +1,421 @@
+<?php
+
+
+namespace App\libs\helpers;
+
+
+use PhpOffice\PhpSpreadsheet\Spreadsheet;
+use PhpOffice\PhpSpreadsheet\Style\Alignment;
+use PhpOffice\PhpSpreadsheet\Style\Border;
+use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
+use PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing;
+class Excel
+{
+    /**
+     * 初始实例化
+     * @var Spreadsheet|null
+     */
+    private $excel = null;
+
+
+    /**
+     * 导出暂存地址
+     * @var string
+     */
+    private $path  = '';
+
+
+    /**
+     * 定义表格格子   最高到AG
+     * @var string[]
+     */
+    private $ziMu = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','AA','AB','AC','AD','AE','AF','AG'];
+
+
+    /**
+     * 标题
+     * @var array
+     */
+    private $title = [];
+
+
+    /**
+     * 导入数据源
+     * @var array
+     */
+    private $data  = [];
+
+
+    /**
+     * 默认域名
+     * @var string
+     */
+    private $defaultDomain = 'https://yxd.wangkuncheng.cn';
+    /**
+     * 是否自动换行
+     * @var bool
+     */
+    private $setWrapText = true;
+
+
+    /**
+     * 导出表格名称
+     * @var string
+     */
+    private $excelName = '';
+
+
+    /**
+     * 实例化
+     * @var Spreadsheet|null
+     */
+    private $spreadsheet = null;
+
+
+    /**
+     * 是否输出导出地址
+     *
+     * @var bool
+     */
+    private $isExportPath = false;
+
+
+    /**
+     * 导出的地址
+     * @var string
+     */
+    public $exportPath = '';
+
+
+    /**
+     * 项目编号
+     * @var string
+     */
+    private $projectName = '';
+
+
+    /**
+     * 项目导出文件暂存地址
+     * @var string
+     */
+    private $projectExcelPath = '';
+
+
+    /**
+     * 是否开本地地址
+     *
+     * @var bool
+     */
+    private $isLocalhost = false;
+
+    /**
+     * 格式是否为图片
+     *
+     * @var array
+     */
+    private $ceilImage   = [];
+
+
+    /**
+     * 格式图片样式
+     *
+     * @var array
+     */
+    private $ceilImageStyle = [];
+    /**
+     * 初始化
+     *
+     * @param string $project       项目文件名   例如
+     * @param string $path          路径地址
+     * @param array $data           表数据
+     * @param array $title          表头
+     * Excel constructor.
+     */
+    public function __construct(string $project = '', string $path = '', array $data = [], array $title = [])
+    {
+        $this->spreadsheet          = new Spreadsheet();
+        $this->excel                = $this->spreadsheet->getActiveSheet();
+        $this->path                 = $_SERVER['DOCUMENT_ROOT'].'/'.$project.'/'.$path;
+        $this->projectName          = $project;
+        $this->projectExcelPath     = $path;
+        $this->data                 = $data;
+        $this->title                = $title;
+//        exec("chmod 777 ".$this->path,$output,$status);
+    }
+
+
+    /**
+     * 设置表格名称
+     *
+     * @param string $excelName
+     * @return $this
+     */
+    public function setExcelName(string $excelName = ''){
+        $this->excelName   = $excelName;
+        return $this;
+    }
+
+
+    /**
+     * 设置是否导出地址
+     *
+     * @param bool $isExportPath
+     */
+    public function setIsExportPath(bool $isExportPath)
+    {
+        $this->isExportPath = $isExportPath;
+        return $this;
+    }
+
+
+    /**
+     * 设置是否开启本地
+     *
+     * @param bool $isLocalhost   是否开启  true   false
+     * @param string $localhostPath   本地域名地址  如果域名下一级目录不能直接直接对应项目名称 请传入域名下的相对路径
+     */
+    public function setIsLocalhost(bool $isLocalhost ,string $localhostPath)
+    {
+        $this->defaultDomain = $localhostPath;
+        $this->isLocalhost   = $isLocalhost;
+        return $this;
+    }
+
+
+    /**
+     * 设置边框
+     *
+     * @throws \PhpOffice\PhpSpreadsheet\Exception
+     */
+    public function borderThin(){
+        $this->excel->getStyle($this->getRange())->getBorders()->getAllBorders()->setBorderStyle(Border::BORDER_THIN);
+        return $this;
+    }
+
+
+    /**
+     * 设置自动换行
+     *
+     * @param bool $wrap
+     * @return $this
+     */
+    public function setAutoWrapText(bool $wrap = true){
+        $this->setWrapText = $wrap;
+        return $this;
+    }
+
+
+    /**
+     * 设置行宽
+     * 数据示例:['rowName'=>'A','value'=>50]
+     *
+     * @param array $data
+     * @return $this
+     */
+    public function setRowWidth(array $data = []){
+        foreach ($data as $value){
+            $this->excel->getColumnDimension($value['rowName'])->setWidth($value['value']);
+        }
+        return $this;
+    }
+
+
+    /**
+     * 设置行高:两种形式
+     * 1.整数:则默认设置全部行高
+     * 2.数组:单独设置每一行行高
+     *        数组格式[30,30] 一维数组形式传入值即可 如果传入数组count小于data数据count   那么剩余的  默认30行高
+     *
+     * @param int $height
+     * @return $this
+     */
+    public function setRowHeight($height = 30){
+        $index = 2;
+        for ($i = 0; $i < count($this->data); $i++){
+            $this->excel->getRowDimension($index)->setRowHeight(is_array($height) ? ($height[$i] ?? 30) : $height);
+            $index++;
+        }
+        return $this;
+    }
+
+
+    /**
+     * 设置全局居中
+     *
+     * @return $this
+     */
+    public function setCenter(){
+        $this->excel->getStyle($this->getRange())->applyFromArray([
+            'alignment' => [
+                'horizontal'    => Alignment::HORIZONTAL_CENTER,// 水平居中
+                'vertical'      => Alignment::VERTICAL_CENTER //垂直居中
+            ]
+        ]);
+        return $this;
+    }
+
+
+    /**
+     * 保存并导出
+     *
+     * @param array $data
+     * @return $this
+     */
+    public function save(){
+        $this->setWrap();
+        $this->setCellValue();
+        $this->exportData();
+        $writer = new Xlsx($this->spreadsheet);
+        if (empty($this->excelName)){
+            $this->excelName = date('Y-m-d');
+        }
+        $writer->save($this->path.'/'.$this->excelName . '.xlsx');
+        if ($this->isExportPath){
+            $this->exportPath = $this->defaultDomain.'/'.$this->projectName.'/'.$this->projectExcelPath.'/'.$this->excelName . '.xlsx';
+        }else{
+            header("Location: ".$this->defaultDomain.'/'.$this->projectName.'/'.$this->projectExcelPath.'/'.$this->excelName . '.xlsx');
+        }
+        return $this;
+    }
+
+
+    /**
+     * 创建图片
+     * @param string $ceil
+     * @param string $url
+     * @throws \PhpOffice\PhpSpreadsheet\Exception
+     */
+    private function setImage(string $url = '',string $ceil = ''){
+        if (!empty($url)){
+//            $src = imagecreatefromstring(file_get_contents($url));
+            $exp = explode('/',$url);
+//            $url = '/www/wwwroot/1001/1001-staff/uploads/'.$exp[5].$exp[6];
+//            $url = 'E:\SiWeiDingZhi\1001\1001-staff\uploads/'.$exp[5].'/'.$exp[6];
+            $url = '/www/wwwroot/1001/1001-staff/uploads/'.$exp[5].'/'.$exp[6];
+            $src = imagecreatefromstring(file_get_contents($url));
+            list($src_w, $src_h) = getimagesize($url);
+            $img = imagecreatetruecolor($src_w,$src_h);
+            imagecopymerge($img,$src,0,0,0,0,$src_w,$src_h,100);
+            $drawing = new MemoryDrawing();
+            $drawing->setName($url);
+            $drawing->setDescription($url);
+            $drawing->setCoordinates($ceil);
+            $drawing->setImageResource($img);
+            $drawing->setHeight(80);
+            $drawing->setOffsetX(10);
+            $drawing->setOffsetY(10);
+            $drawing->setRenderingFunction(MemoryDrawing::RENDERING_JPEG);
+            $drawing->setMimeType(MemoryDrawing::MIMETYPE_DEFAULT);
+            if (!empty($this->ceilImageStyle)){
+                $ceilText = substr($ceil,0,1);
+                if (!empty($this->ceilImageStyle[$ceilText])){
+                    $drawing->setHeight($this->ceilImageStyle[$ceilText]['height']);
+                    $drawing->setWidth($this->ceilImageStyle[$ceilText]['width']);
+                    $drawing->setOffsetX($this->ceilImageStyle[$ceilText]['OffsetX']);
+                    $drawing->setOffsetY($this->ceilImageStyle[$ceilText]['OffsetY']);
+                }
+            }
+            $drawing->setWorksheet($this->spreadsheet->getActiveSheet());
+        }
+    }
+
+
+    /**
+     * 设置格子是否导出为图片
+     *
+     * @param array $images
+     * @return $this
+     */
+    public function setExportCeilImage(array $images = []){
+
+        if (count($images) != count($images,1)){
+            foreach ($images ?? [] as $v){
+                $this->ceilImage[] =  key($images);
+                next($images);
+            }
+            $this->ceilImageStyle = $images;
+        }else{
+            $this->ceilImage = $images;
+        }
+        return $this;
+    }
+
+
+    /**
+     * 设置导出数据
+     *
+     */
+    private function exportData(){
+        $index = 2;
+        $keyName = $this->getArrayKey();
+        for ($i = 0;$i < count($this->data);$i++){
+            for ($j = 0;$j < count($this->title);$j++){
+                if (in_array($this->ziMu[$j],$this->ceilImage)){
+                    if (!empty($this->data[$i][$keyName[$j]])){
+
+                        $this->setImage($this->data[$i][$keyName[$j]],$this->ziMu[$j] . $index);
+                    }
+                }else{
+                    $this->excel->setCellValue($this->ziMu[$j] . $index, $this->data[$i][$keyName[$j]]);
+                }
+            }
+            $index++;
+        }
+    }
+
+
+    /**
+     * 获取数组指针
+     *
+     * @return array
+     */
+    private function getArrayKey(){
+        $result = [];
+        if (empty($this->data)){
+            throw new \think\Exception('传入表数据为空', 40004);
+        }
+        for ($i=0,$len=count($this->data[0]); $i<$len; $i++) {
+            $result[] =  key($this->data[0]);
+            next($this->data[0]);
+        }
+        return $result;
+    }
+
+
+    /**
+     * 设置自动换行
+     *
+     */
+    private function setWrap(){
+        if ($this->setWrapText){
+            $this->excel->getStyle($this->getRange())->getAlignment()->setWrapText(true);
+        }
+    }
+
+
+    /**
+     * 获取数据范围值
+     *
+     * @return string
+     */
+    private function getRange(){
+        if(empty($this->title) || empty($this->data)){
+            throw new \think\Exception('初始化请传入数据', 40006);
+        }
+        return 'A1:'.$this->ziMu[count($this->title) - 1].(count($this->data) + 1);
+    }
+
+
+    /**
+     * 设置表头
+     *
+     */
+    private function setCellValue(){
+        if (empty($this->title)){
+            throw new \think\Exception('传入表头为空', 40005);
+        }
+        foreach ($this->title as $key=>$value){
+            $this->excel->setCellValue($this->ziMu[$key].'1', $this->title[$key]);
+        }
+    }
+}

+ 388 - 0
app/libs/helpers/Helper.php

xqd
@@ -0,0 +1,388 @@
+<?php
+
+namespace App\libs\helpers;
+
+use app\Auth;
+use App\libs\cache\redis\Redis;
+use Illuminate\Support\Facades\Config;
+use Illuminate\Support\Facades\DB;
+
+class Helper
+{
+    /**
+     * @desc    过滤emoji表情
+     * @param   $str
+     * @return  null|string|string[]
+     */
+    public static function filterEmoji($str)
+    {
+        return preg_replace_callback('/./u', function (array $match) {
+            return strlen($match[0]) >= 4 ? '' : $match[0];
+        }, $str);
+    }
+
+    /**
+     * @desc    字节转换
+     * @param   int $numSize
+     * @return  string
+     */
+    public static function sizeConvert(int $numSize)
+    {
+        if ($numSize >= 1073741824) {
+            $charSize = round($numSize / pow(1024, 3) * 100) / 100 . ' GB';
+        } elseif ($numSize >= 1048576) {
+            //转成MB
+            $charSize = round($numSize / pow(1024, 2) * 100) / 100 . ' MB';
+        } elseif ($numSize >= 1024) {
+            //转成KB
+            $charSize = round($numSize / 1024 * 100) / 100 . ' KB';
+        } else {
+            //不转换直接输出
+            $charSize = $numSize . ' B';
+        }
+        return $charSize;
+    }
+
+    /**
+     * @desc    数字单位转换
+     * @param   int $number
+     * @return  string
+     */
+    public static function numberConvert(int $number)
+    {
+        if ($number >= 1000 && $number < 10000) {
+            $number = sprintf('%.1f', $number / 1000) . ' K';
+        } elseif ($number >= 10000) {
+            $number = sprintf('%.1f', $number / 10000) . ' W';
+        } elseif ($number >= 1000000) {
+            $number = sprintf('%.1f', $number / 10000) . ' M';
+        }
+        return $number;
+    }
+
+    /**
+     * @desc    生成 hash token
+     * @param   string $value
+     * @return  mixed
+     */
+    public static function hashToken(string $value)
+    {
+        $hash  = hash_hmac('sha1', $value . mt_rand() . time(), mt_rand(), true);
+        $token = str_replace('=', '', strtr(base64_encode($hash), '+/', '-_'));
+
+        return $token;
+    }
+
+    /**
+     * @desc    是否微信环境
+     * @return  bool|mixed
+     */
+    public static function isWeixin()
+    {
+        return strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false ? true : false;
+    }
+
+    /**
+     * @desc    ssl 加密
+     * @param   $str    待加密字符
+     * @param   string  $key    加密key
+     * @param   string  $iv     偏移iv
+     * @return  string
+     */
+    public static function encrypt($str, $key = 'cdlchdwxcdh5', $iv = 'cdlchd0123456789')
+    {
+        return bin2hex(openssl_encrypt($str, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv));
+    }
+
+    /**
+     * @desc    ssl 解密
+     * @param   $str    待解密字符
+     * @param   string  $key    加密key
+     * @param   string  $iv     偏移iv
+     * @return  string
+     */
+    public static function decrypt($str, $key = 'cdlchdwxcdh5', $iv = 'cdlchd0123456789')
+    {
+        return openssl_decrypt(hex2bin($str), 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
+    }
+
+    /**
+     * @desc    记录日志
+     * @param   array $data
+     * @param   string $remarks
+     */
+    public static function apiLogs(array $data, string $remarks = '')
+    {
+        $request = \request();
+        $data = [
+            'token'      => $request->header('token', null),
+            'uid'        => Auth::$userId,
+            'url'        => $request->url(),
+            'controller' => $request->controller(),
+            'func'       => $request->action(),
+            'method'     => $request->method(),
+            'ip'         => $request->ip(),
+            'params'     => json_encode($data, 256),
+            'remarks'    => $remarks,
+            'day'        => strtotime('today'),
+            'create'     => time()
+        ];
+        $rdsConf = Config::get('lc.redis');
+        if ($rdsConf['log_open']) {
+            $redis = Redis::instance();
+            $redis->select($rdsConf['db']);
+            $redis->rPush(env('id') . '_apilogs', json_encode($data, 256));
+        } else {
+            Db::name('api_logs')->insert($data);
+        }
+    }
+
+    /**
+     * @desc 	将xml转为array
+     * @param 	$xml
+     * @return 	array
+     * @throws 	\Exception
+     */
+    public static function xmlToArray($xml)
+    {
+        if (!$xml) {
+            throw new \Exception('xml数据异常!');
+        }
+        //禁止引用外部xml实体
+        libxml_disable_entity_loader(true);
+        $data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
+        return $data;
+    }
+
+    /**
+     * @desc    输出xml字符
+     * @param   array $data
+     * @return  string
+     * @throws 	\Exception
+     */
+    public static function arrayToXml($data)
+    {
+        if (!is_array($data) || count($data) <= 0) {
+            throw new \Exception('数组数据异常!');
+        }
+
+        $xml = '<xml>';
+        foreach ($data as $key => $val) {
+            if (is_numeric($val)) {
+                $xml .= '<' . $key . '>' . $val . '</' . $key . '>';
+            } else {
+                $xml .= '<' . $key . '><![CDATA[' . $val . ']]></' . $key . '>';
+            }
+        }
+        $xml .= '</xml>';
+        return $xml;
+    }
+
+    /**
+     * @desc	按字典序生成签名
+     * @param 	array $data 签名数据
+     * @param 	string $key 前面key
+     * @return 	string
+     */
+    public static function makeSign(array $data, string $key)
+    {
+        // 1. 按字典序排序参数
+        ksort($data);
+        $string = self::signUrlParams($data);
+        // 2. 在string后加入KEY
+        $string = $string . '&key=' . $key;
+        // 3. MD5加密
+        $string = md5($string);
+        // 4. 所有字符转为大写
+        return strtoupper($string);
+    }
+
+    /**
+     * @desc	签名格式化成url参数
+     * @param 	array $params 格式化参数
+     * @return 	string
+     */
+    private static function signUrlParams(array $params)
+    {
+        $buff = '';
+        foreach ($params as $k => $v) {
+            if ($k != 'sign' && $v != '' && !is_array($v)) {
+                $buff .= $k . '=' . $v . '&';
+            }
+        }
+
+        $buff = trim($buff, '&');
+        return $buff;
+    }
+
+    /**
+     * @desc 获取毫秒级别的时间戳
+     */
+    public static function millisecond()
+    {
+        // 获取毫秒的时间戳
+        $time   = explode(' ', microtime());
+        $time   = $time[1] . ($time[0] * 1000);
+        $time2  = explode('.', $time);
+        $time   = $time2[0];
+
+        return $time;
+    }
+
+    /**
+     * @desc	产生随机字符串,不长于32位
+     * @param 	int $length
+     * @return 	string 产生的随机字符串
+     */
+    public static function generateNonceStr($length = 32)
+    {
+        $chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
+        $str   = '';
+        for ($i = 0; $i < $length; $i++) {
+            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
+        }
+        return $str;
+    }
+
+    /**
+     * @desc    对emoji表情转义
+     * @param   $str
+     * @return  string
+     */
+    public static function emojiEncode($str)
+    {
+        $strEncode = '';
+
+        $length = mb_strlen($str, 'utf-8');
+
+        for ($i = 0; $i < $length; $i++) {
+            $tmpStr = mb_substr($str, $i, 1, 'utf-8');
+            if (strlen($tmpStr) >= 4) {
+                $strEncode .= '[[EMOJI:' . rawurlencode($tmpStr) . ']]';
+            } else {
+                $strEncode .= $tmpStr;
+            }
+        }
+        return $strEncode;
+    }
+
+    /**
+     * @desc    对emoji表情转反义
+     * @param   $str
+     * @return  string|string[]|null
+     */
+    public static function emojiDecode($str)
+    {
+        return preg_replace_callback('|\[\[EMOJI:(.*?)\]\]|', function ($matches) {
+            return rawurldecode($matches[1]);
+        }, $str);
+    }
+
+    /**
+     * @desc    判断请求机型
+     * @return  string
+     */
+    public static function deviceType()
+    {
+        $agent = strtolower($_SERVER['HTTP_USER_AGENT']);
+        $type  = 'other';
+        //分别进行判断
+        if (strpos($agent, 'iphone') || strpos($agent, 'ipad')) {
+            $type = 'ios';
+        }
+        if (strpos($agent, 'android')) {
+            $type = 'android';
+        }
+        return $type;
+    }
+
+    /**
+     * @desc    记录日志
+     * @param   string      $filename   文件名
+     * @param   string      $log        日志内容
+     * @param   float|int   $fileSize   文件日志大小,默认最大2M,超过则重命名
+     */
+    public static function log(string $filename, string $log, $fileSize = 2 * 1024 * 1024)
+    {
+        $path = dirname($filename);
+        if (!is_dir($path)) {
+            mkdir($path, 0755, true);
+        }
+
+        if (is_file($filename) && floor($fileSize) <= filesize($filename)) {
+            try {
+                rename($filename, dirname($filename) . DIRECTORY_SEPARATOR . time() . '-' . basename($filename));
+            } catch (\Exception $e) {
+                //
+            }
+        }
+
+        error_log($log, 3, $filename);
+    }
+
+    /**
+     * 求两点之间的距离
+     * @param $thisLongitude 当前经度
+     * @param $thisLatitude 当前纬度
+     * @param $stayLongitude 待计算经度
+     * @param $stayLatitude 待计算纬度
+     * @param int $unit 单位,1米,2千米
+     * @param int $decimals 保留小数点几位
+     * @return string
+     */
+    public static function calculateDistance($thisLongitude, $thisLatitude, $stayLongitude, $stayLatitude, $unit = 1, $decimals = 0)
+    {
+        // 原始坐标纬度弧度 deg2rad()函数将角度转换为弧度
+        $oriLatRad = deg2rad($thisLatitude);
+        // 新坐标纬度弧度
+        $newLatRad = deg2rad($stayLatitude);
+        // 坐标纬度弧度差
+        $diffLatRad = deg2rad($thisLatitude) - deg2rad($stayLatitude);
+
+        // 经度弧度差
+        $diffLngRad = deg2rad($thisLongitude) - deg2rad($stayLongitude);
+
+        // sin 求正弦值 参数单位为弧度 sin(2) => 0.90929742682568
+        // cos 求余弦值 参数单位为弧度 cos(0.2) => 0.98006657784124
+        // sqrt 求平方根 sqrt(2) => 1.4142135623731
+        // asin 求反正弦 参数单位为弧度 asin(2) => 1.4142135623731
+        // pow 求幂 pow(2, 2) => 4
+        $distance = 2 * asin(sqrt(pow(sin($diffLatRad / 2), 2) + cos($oriLatRad) * cos($newLatRad) * pow(sin($diffLngRad / 2), 2))) * 6378.137 * 1000;
+        if ($unit == 2) {
+            $distance = $distance / 1000;
+        }
+
+        return number_format($distance, $decimals);
+    }
+
+    /**
+     * 导出csv数据
+     * @param $title 表名
+     * @param $cell 表头
+     * @param $data 数据
+     * @param null $closure
+     */
+    public static function exportCsv($title, $cell, $data, $closure = null)
+    {
+        set_time_limit(0);
+        ini_set('memory_limit', '1024M');
+        $output = fopen('php://output', 'w') or die("can't open php://output");
+        if (ob_get_contents()) {
+            ob_clean();
+        }
+        header("Content-Type: application/force-download");
+        header("Content-type: text/csv;charset=utf-8");
+        header("Content-Disposition: attachment; filename=" . $title . ".csv");
+        echo chr(0xEF) . chr(0xBB) . chr(0xBF);
+        fputcsv($output, $cell);
+        foreach ($data as $v) {
+            if ($closure instanceof \Closure) {
+                $v = $closure($v);
+            }
+            fputcsv($output, array_values($v));
+        }
+        fclose($output) or die("can't close php://output");
+        exit;
+    }
+
+}

+ 111 - 0
app/libs/helpers/LogHelper.php

xqd
@@ -0,0 +1,111 @@
+<?php
+
+namespace App\libs\helpers;
+
+use App\libs\cache\redis\Redis;
+use Illuminate\Support\Facades\Config;
+use Illuminate\Support\Facades\DB;
+use app\Auth;
+
+/**
+ * 日志统计类
+ *
+ * @package lc\helpers
+ */
+class LogHelper
+{
+
+    /**
+     * 记录 exception 日志
+     *
+     * @param $exception
+     * @param $errCode
+     * @return void
+     */
+    public static function exceptionLog($exception, $errCode)
+    {
+        $names = explode('@',request()->route()->getAction()['controller']);
+        $data = [
+            'token'      => request()->header('token', null),
+            'uid'        => Auth::$userId ? Auth::$userId : Auth::$adminId,
+            'code'       => $errCode,
+            'controller' => $names[0],
+            'func'       =>  $names[1],
+            'method'     => request()->method(),
+            'ip'         => request()->ip(),
+            'params'     => json_encode([
+                'message'   => $exception->getMessage(),
+                'code'      => $exception->getCode(),
+                'line'      => $exception->getLine(),
+                'file'      => $exception->getFile()
+            ], JSON_UNESCAPED_UNICODE),
+            'day'        => strtotime('today'),
+            'created_at' => time()
+        ];
+        Db::table('exception_logs')->insert($data);
+    }
+
+    /**
+     * 记录第三方日志
+     *
+     * @param string $type 日志类型
+     * @param string $funcName 调用方法
+     * @param array $bodyParams 请求 body 参数
+     * @param array $response 返回数据
+     * @param array $headers 请求头
+     * @param array $params 请求 query 参数
+     */
+    public static function thirdLog(string $type, string $funcName, array $bodyParams, array $response, array $headers = [], array $params = [])
+    {
+        $data = [
+            'uid'           => Auth::$userId ? Auth::$userId : Auth::$adminId,
+            'type'          => $type,
+            'func_name'     => $funcName,
+            'headers'       => json_encode($headers, JSON_UNESCAPED_UNICODE),
+            'params'        => json_encode($params, JSON_UNESCAPED_UNICODE),
+            'body'          => json_encode($bodyParams, JSON_UNESCAPED_UNICODE),
+            'response'      => Helper::filterEmoji(json_encode($response, JSON_UNESCAPED_UNICODE)),
+            'created_at'    => time(),
+        ];
+
+        Db::table('third_logs')->insert($data);
+    }
+
+    /**
+     * 记录用户日志
+     *
+     * @param string $event 用户事件
+     * @param string $remark 备注
+     * @param array $moreInfo 数据信息
+     */
+    public static function userLog(string $event, string $remark, array $moreInfo)
+    {
+        $data = [
+            'uid'           => Auth::$userId ? Auth::$userId : Auth::$adminId,
+            'event'         => $event,
+            'remark'        => $remark,
+            'more_info'     => json_encode($moreInfo, JSON_UNESCAPED_UNICODE),
+            'created_at'    => time()
+        ];
+        Db::table('user_logs')->insert($data);
+    }
+
+    /**
+     * 数据记录
+     *
+     * @param $field
+     * @param int $cnt
+     */
+    public static function record($field, $cnt = 1)
+    {
+        $hour = strtotime(date('Y-m-d H:00:00'));
+        $res  = Db::name('record')->where(['hour' => $hour])->inc($field, $cnt)->update();
+        if (!$res) {
+            Db::table('record')
+                ->insert([
+                    'hour'  => $hour,
+                    $field  => $cnt
+                ]);
+        }
+    }
+}

+ 52 - 0
app/libs/helpers/Response.php

xqd
@@ -0,0 +1,52 @@
+<?php
+
+namespace App\libs\helpers;
+
+class Response
+{
+    /**
+     * 成功返回
+     *
+     * @param $data
+     * @param $message
+     * @return \Illuminate\Http\JsonResponse
+     */
+    public static function success($data = '', $message = 'Success')
+    {
+        return response()->json(['code' => 0, 'message' => $message, 'data' => $data]);
+    }
+
+    /**
+     * 失败返回
+     *
+     * @param $message
+     * @return \Illuminate\Http\JsonResponse
+     */
+    public static function fail($message = 'Fail')
+    {
+        return response()->json(['code' => 1000, 'message' => $message, 'data' => '']);
+    }
+
+    /**
+     * 自定义返回
+     *
+     * @param $code
+     * @param $message
+     * @param $data
+     * @return \Illuminate\Http\JsonResponse
+     */
+    public static function defined($code, $message, $data = '')
+    {
+        return response()->json(['code' => $code, 'message' => $message, 'data' => $data]);
+    }
+
+    /**
+     * 鉴权未登录
+     *
+     * @return \Illuminate\Http\JsonResponse
+     */
+    public static function unLogin()
+    {
+        return response()->json(['code' => 1001, 'message' => '请先登录,再进行操作', 'data' => '']);
+    }
+}

+ 38 - 0
app/libs/middleware/ApiLogs.php

xqd
@@ -0,0 +1,38 @@
+<?php
+
+namespace App\libs\middleware;
+
+use Closure;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+use Symfony\Component\HttpFoundation\Response;
+
+class ApiLogs
+{
+    /**
+     * 处理传入请求。
+     *
+     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
+     */
+    public function handle(Request $request, Closure $next): Response
+    {
+        $this->user = auth('api')->user();
+        $this->userId = $this->user ? $this->user->id : 0;
+        $data = $request->all();
+        $names = explode('@',$request->route()->getAction()['controller']);
+        $data = [
+            'token'      => $request->header('token', null),
+            'user_id'    => $this->userId ?? 0,
+            'url'        => $request->url(),
+            'controller' => $names[0],
+            'func'       =>  $names[1],
+            'method'     => $request->method(),
+            'ip'         => $request->ip(),
+            'params'     => json_encode($data, 256),
+            'day'        => strtotime('today'),
+            'created_at' => time()
+        ];
+        Db::table('api_logs')->insert($data);
+        return $next($request);
+    }
+}

+ 25 - 0
app/libs/middleware/CheckAuth.php

xqd
@@ -0,0 +1,25 @@
+<?php
+
+namespace App\libs\middleware;
+
+use App\Auth;
+use Closure;
+use Illuminate\Http\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+class CheckAuth
+{
+    /**
+     * 处理传入请求。
+     *
+     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
+     */
+    public function handle(Request $request, Closure $next): Response
+    {
+        $this->user = auth('api')->user();
+        $this->userId = $this->user ? $this->user->id : 0;
+        Auth::$user = $this->user;
+        Auth::$userId = $this->userId;
+        return $next($request);
+    }
+}

+ 20 - 0
app/libs/preinstall/database.php

xqd
@@ -0,0 +1,20 @@
+<?php
+
+return [
+    'test' => [
+        'hostname'  => 'localhost',
+        'database'  => 'yxd',
+        'username'  => 'root',
+        'password'  => 'root',
+        'hostport'  => '3306',
+        'charset'   => 'utf8'
+    ],
+    'main' => [
+        'hostname'  => 'localhost',
+        'database'  => 'yxd',
+        'username'  => 'root',
+        'password'  => '121357f8f8b41802',
+        'hostport'  => '3306',
+        'charset'   => 'utf8'
+    ]
+];

+ 9 - 0
app/libs/preinstall/redis.php

xqd
@@ -0,0 +1,9 @@
+<?php
+
+return [
+    'local' => [
+        'host'  => '127.0.0.1',
+        'port'  => 6379,
+        'pwd'   => 'wdk123456'
+    ],
+];

+ 8 - 0
app/libs/preinstall/wechat.php

xqd
@@ -0,0 +1,8 @@
+<?php
+
+return [
+    '2945' => [
+        'pt_appid' => 'wxe579d35335a46343',
+        'pt_secret' => '030c2ce0d396a27163467554924fde05'
+    ]
+];

+ 139 - 0
app/libs/wechat/auth/Gateways/Base.php

xqd
@@ -0,0 +1,139 @@
+<?php
+
+namespace App\libs\wechat\auth\Gateways;
+
+use Illuminate\Support\Facades\Config;
+use swdz\helpers\Helper;
+use Illuminate\Support\Facades\DB;
+use \Illuminate\Support\Facades\Cookie;
+
+class Base
+{
+    protected $config = [];
+
+    public function __construct()
+    {
+        $this->config = Config::get('swdz.wechat');
+    }
+
+    /**
+     * @desc    快速授权
+     * @param   string      $scope
+     * @param   string|null $redirect
+     * @return  mixed
+     */
+    public function auth(string $scope = 'snsapi_userinfo', string $redirect = null)
+    {
+        $code = request()->get('code', null);
+        if (!$code) {
+            header('Location: ' . $this->authUrl($scope, $redirect));
+            exit();
+        }
+
+        $openInfo = $this->code2Openid($code);
+        if (isset($openInfo['errcode']) && in_array($openInfo['errcode'], [40163, 40029])) {
+            header('Location: ' . $this->authUrl($scope, $redirect));
+            exit();
+        }
+        if (isset($openInfo['errcode'])) {
+            exit($openInfo['errmsg']);
+        }
+        if ($scope == 'snsapi_userinfo') {
+            $userInfo = $this->userSimpleInfo($openInfo['access_token'], $openInfo['openid']);
+        } else {
+            $userInfo['openid'] = $openInfo['openid'];
+        }
+        $baseTable = $this->config['appid'] . '_user';
+        $userId = Db::table($baseTable)->where('openid', $userInfo['openid'])->value('user_id');
+        if (empty($userId)) {
+            $userId = Db::table($baseTable)
+                ->insertGetId([
+                    'openid'        => $userInfo['openid'],
+                    'unionid'       => $userInfo['unionid'] ?? '',
+                    'nickname'      => $userInfo['nickname'] ?? '',
+                    'headimgurl'    => $userInfo['headimgurl'] ?? '',
+                    'sex'           => $userInfo['sex'] ?? '',
+                    'country'       => $userInfo['country'] ?? '',
+                    'province'      => $userInfo['province'] ?? '',
+                    'city'          => $userInfo['city'] ?? '',
+                    'language'      => $userInfo['language'] ?? '',
+                    'created_at'    => time()
+                ]);
+        }
+        $userInfo['user_id'] = $userId;
+        return $userInfo;
+    }
+
+    /**
+     * @desc    获取jssdk
+     * @param   string $url 需要授权的地址
+     * @param   array $api 开放接口列表
+     * @param   array $tag 开发能力列表
+     * @return  array
+     */
+    public function jssdk(string $url, $api = [], $tag = [])
+    {
+        $jsApiList = array_merge($api, [
+            'checkJsApi',
+            'onMenuShareTimeline',
+            'onMenuShareAppMessage',
+            'onMenuShareQQ',
+            'onMenuShareWeibo',
+            'hideMenuItems',
+            'showMenuItems',
+            'hideAllNonBaseMenuItem',
+            'getLocalImgData',
+            'chooseImage'
+        ]);
+        $openTagList = array_merge($tag, ['wx-open-launch-weapp', 'wx-open-launch-app']);
+        $jsApiTicket = $this->jsApiTicket();
+        $timestamp   = time();
+        $nonceStr    = uniqid();
+
+        return [
+            'debug'         => false,
+            'appId'         => $this->config['appid'],
+            'timestamp'     => $timestamp,
+            'nonceStr'      => $nonceStr,
+            'signature'     => sha1('jsapi_ticket=' . $jsApiTicket . '&noncestr=' . $nonceStr . '&timestamp=' . $timestamp . '&url=' . $url),
+            'jsApiList'     => $jsApiList,
+            'openTagList'   => $openTagList
+        ];
+    }
+
+    /**
+     * @desc    获取授权地址
+     * @param   string $scope 授权方式 snsapi_base|snsapi_userinfo
+     * @param   string|null $redirect
+     * @return  string
+     */
+    public function authUrl(string $scope = 'snsapi_userinfo', string $redirect = null): string {}
+
+    /**
+     * @desc    使用授权code换取openid
+     * @param   string $code
+     * @return  array
+     */
+    public function code2Openid(string $code): array {}
+
+    /**
+     * @desc    获取用户基础信息
+     * @param   string $accessToken
+     * @param   string $openid
+     * @return  array
+     */
+    public function userSimpleInfo(string $accessToken, string $openid): array {}
+
+    /**
+     * @desc    获取用户详细信息
+     * @param   string $openid
+     * @return  array
+     */
+    public function userDetailInfo(string $openid): array {}
+
+    /**
+     * @desc    获取 JSAPI TICKET
+     * @return  string
+     */
+    public function jsApiTicket() {}
+}

+ 220 - 0
app/libs/wechat/auth/Gateways/General.php

xqd
@@ -0,0 +1,220 @@
+<?php
+
+namespace App\libs\wechat\auth\Gateways;
+
+use Illuminate\Support\Facades\Redis;
+use App\libs\helpers\Curl;
+use Illuminate\Support\Facades\DB;
+
+class General extends Base
+{
+    private $appId;
+    private $secret;
+
+    public function __construct()
+    {
+        parent::__construct();
+
+        $this->appId  = $this->config['appid'];
+        $this->secret = $this->config['secret'];
+    }
+
+    /**
+     * @link    第一步 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
+     * @desc    获取授权地址
+     * @param   string      $scope      授权类型snsapi_base|snsapi_userinfo
+     * @param   string|null $redirect   授权回跳地址
+     * @return  string
+     */
+    public function authUrl(string $scope = 'snsapi_base', string $redirect = null): string
+    {
+        $redirect = $redirect ? $redirect : "https://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";
+        $query = http_build_query([
+            'appid'         => $this->appId,
+            'redirect_uri'  => $redirect,
+            'response_type' => 'code',
+            'scope'         => $scope
+        ]);
+        return "https://open.weixin.qq.com/connect/oauth2/authorize?{$query}#wechat_redirect";
+    }
+
+    /**
+     * @link    第二步 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
+     * @desc    使用授权code换取openid
+     * @param   string $code
+     * @return  array
+     */
+    public function code2Openid(string $code): array
+    {
+        $url = 'https://api.weixin.qq.com/sns/oauth2/access_token';
+        $res = Curl::requestCurl($url, 'GET', [], http_build_query([
+            'appid'      => $this->appId,
+            'secret'     => $this->secret,
+            'code'       => $code,
+            'grant_type' => 'authorization_code'
+        ]));
+
+        return $res ? json_decode($res, true) : [];
+    }
+
+    /**
+     * @link    第四步 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
+     * @desc    获取用户信息
+     * @param   string    $accessToken
+     * @param   string    $openid
+     * @return  bool|mixed|string
+     */
+    public function userSimpleInfo(string $accessToken, string $openid): array
+    {
+        $url = 'https://api.weixin.qq.com/sns/userinfo';
+        $res = Curl::requestCurl($url, 'GET', [], http_build_query([
+            'access_token'  => $accessToken,
+            'openid'        => $openid,
+            'lang'          => 'zh_CN',
+        ]));
+
+        return $res ? json_decode($res, true) : [];
+    }
+
+    /**
+     * @link    https://developers.weixin.qq.com/doc/offiaccount/User_Management/Get_users_basic_information_UnionID.html#UinonId
+     * @desc    获取用户详细信息
+     * @param   string $openid
+     * @return  array
+     */
+    public function userDetailInfo(string $openid): array
+    {
+        $url = 'https://api.weixin.qq.com/cgi-bin/user/info';
+        $res = Curl::requestCurl($url, 'GET', [], http_build_query([
+            'access_token'  => $this->accessToken(),
+            'openid'        => $openid,
+            'lang'          => 'zh_CN',
+        ]));
+
+        return $res ? json_decode($res, true) : [];
+    }
+
+    /**
+     * @link    附录1-JS-SDK使用权限签名算法 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html
+     * @desc    获取 JSAPI TICKET
+     * @param   int $repeatCnt
+     * @return  string
+     */
+    public function jsApiTicket(&$repeatCnt = 1): string
+    {
+        $drive = $this->config['token_drive'] ?? 'redis';
+        $key   = 'wechat_' . $this->appId . '_jsApiTicket';
+        switch ($drive) {
+            case 'redis':
+                $redis = Redis::instance();
+                $redis->select(15);
+
+                $ticket = $redis->get($key);
+                break;
+            case 'db':
+            default:
+                $ticket = Db::table('configs')->where('c_key', $key)->where('c_expired > ' . time())->value('c_value');
+                break;
+        }
+        if ($ticket) {
+            return $ticket;
+        }
+
+        $url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket';
+        $res = Curl::requestCurl($url, 'GET', [], http_build_query([
+            'access_token'  => $this->accessToken(),
+            'type'          => 'jsapi'
+        ]));
+        $data = json_decode($res, true);
+        if (isset($data['ticket'])) {
+            $ticket = $data['ticket'];
+            switch ($drive) {
+                case 'redis':
+                    $redis->setex($key, 7000, $ticket);
+                    break;
+                case 'db':
+                default:
+                    Db::table('configs')
+                        ->where('c_key', $key)
+                        ->update([
+                            'c_value'   => $ticket,
+                            'c_expired' => time() + 7000,
+                            'c_updated' => date('Y-m-d H:i:s')
+                        ]);
+                    break;
+            }
+
+            return $ticket;
+        } else {
+            if ($repeatCnt <= 3) {
+                $repeatCnt++;
+                return $this->jsApiTicket($repeatCnt);
+            } else {
+                return $data['errcode'];
+            }
+        }
+    }
+
+    /**
+     * @link    https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html
+     * @desc    获取全局唯一接口调用凭据
+     * @param   int $repeatCnt
+     * @return  string
+     */
+    public function accessToken(&$repeatCnt = 1)
+    {
+        $drive = $this->config['token_drive'] ?? 'redis';
+        $key   = 'wechat_' . $this->appId . '_accessToken';
+        switch ($drive) {
+            case 'redis':
+                $redis = Redis::instance();
+                $redis->select(15);
+
+                $token = $redis->get($key);
+                break;
+            case 'db':
+            default:
+                $token = Db::table('configs')->where('c_key', $key)->where('c_expired > ' . time())->value('c_value');
+                break;
+        }
+        if ($token) {
+            return $token;
+        }
+
+        $url = 'https://api.weixin.qq.com/cgi-bin/token';
+        $res = Curl::requestCurl($url, 'GET', [], http_build_query([
+            'grant_type' => 'client_credential',
+            'appid'      => $this->appId,
+            'secret'     => $this->secret
+        ]));
+
+        $data = json_decode($res, true);
+        if (isset($data['access_token'])) {
+            $token = $data['access_token'];
+            switch ($drive) {
+                case 'redis':
+                    $redis->setex($key, 7000, $token);
+                    break;
+                case 'db':
+                default:
+                    Db::table('configs')
+                        ->where('c_key', $key)
+                        ->update([
+                            'c_value'   => $token,
+                            'c_expired' => time() + 7000,
+                            'c_updated' => date('Y-m-d H:i:s')
+                        ]);
+                    break;
+            }
+
+            return $token;
+        } else {
+            if ($repeatCnt <= 3) {
+                $repeatCnt++;
+                return $this->accessToken($repeatCnt);
+            } else {
+                return $data['errcode'];
+            }
+        }
+    }
+}

+ 205 - 0
app/libs/wechat/auth/Gateways/Mini.php

xqd
@@ -0,0 +1,205 @@
+<?php
+
+namespace App\libs\wechat\auth\Gateways;
+
+use App\libs\cache\redis\Redis;
+use App\libs\helpers\Curl;
+use Illuminate\Support\Facades\DB;
+
+/**
+ * @desc    微信小程序类
+ * @package lc\wechat\auth\Gateways
+ */
+class Mini extends Base
+{
+    private $appId;
+    private $secret;
+
+    public function __construct()
+    {
+        parent::__construct();
+
+        $this->appId  = $this->config['appid'];
+        $this->secret = $this->config['secret'];
+    }
+
+    /**
+     * @link    https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html
+     * @desc    使用授权code换取openid
+     * @param   string $code
+     * @return  array
+     */
+    public function code2Openid(string $code): array
+    {
+        $url = 'https://api.weixin.qq.com/sns/jscode2session';
+        $res = Curl::requestCurl($url, 'GET', [], http_build_query([
+            'appid'      => $this->appId,
+            'secret'     => $this->secret,
+            'js_code'    => $code,
+            'grant_type' => 'authorization_code'
+        ]));
+        return $res ? json_decode($res, true) : [];
+    }
+
+    /**
+     * @link    https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html
+     * @desc    解密小程序信息
+     * @param   string $sessionKey      session_key
+     * @param   string $encryptedData   加密字符
+     * @param   string $iv              偏移量
+     * @return  array
+     */
+    public function decrypt($sessionKey, $encryptedData, $iv): array
+    {
+        if (strlen($iv) != 24) {
+            // 偏移量错误
+            return ['code' => 41002, 'data' => '', 'msg'  => 'iv解密失败'];
+        }
+        if (strlen($sessionKey) != 24) {
+            // sessionkey 错误
+            return ['code' => 41001, 'data' => '', 'msg'  => 'sessionKey解密失败'];
+        }
+
+        $data = openssl_decrypt(base64_decode($encryptedData), 'AES-128-CBC', base64_decode($sessionKey), OPENSSL_RAW_DATA, base64_decode($iv));
+        if (!$data) {
+            return ['code' => 41001, 'data' => '', 'msg'  => '解密失败'];
+        }
+        $userInfo = json_decode($data, true);
+        if ($userInfo['watermark']['appid'] != $this->appId) {
+            return ['code' => 41003, 'data' => '', 'msg'  => 'appid不匹配'];
+        }
+
+        $userInfo['nickName'] = !empty($userInfo['nickName']) ? $userInfo['nickName'] : '';
+        return ['code' => 0, 'data' => $userInfo, 'msg'  => 'success'];
+    }
+
+    /**
+     * @link    https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.createQRCode.html
+     * @desc    获取小程序码(限量)
+     * @param   string  $path   页面路径
+     * @param   int     $width  二维码宽度
+     *
+     */
+    public function qrcode(string $path, $width = 430)
+    {
+        $params = ['path' => $path, 'width' => $width];
+        $url = 'https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=' . $this->accessToken();
+        return Curl::requestCurl($url, 'POST', [], json_encode($params));
+    }
+
+    /**
+     * @link    https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.getUnlimited.html
+     * @desc    获取小程序码(不限量)
+     * @param   string  $scene 场景值
+     * @param   array   $extra 额外参数,详见
+     * @return  bool|mixed|string
+     */
+    public function qrcodeUnlimited(string $scene, $extra = [])
+    {
+        $params = array_merge($extra, ['scene' => $scene]);
+        $url = 'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=' . $this->accessToken();
+        return Curl::requestCurl($url, 'POST', [], json_encode($params));
+    }
+
+    /**
+     * @link    https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/url-link/urllink.generate.html
+     * @desc    生成短链接
+     * @param   array $params
+     * @return  bool|string
+     */
+    public function urlLink(array $params)
+    {
+        $url = 'https://api.weixin.qq.com/wxa/generate_urllink?access_token=' . $this->accessToken();
+        return Curl::requestCurl($url, 'POST', [], json_encode($params));
+    }
+
+    /**
+     * @link    https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html
+     * @desc    发送模板消息
+     * @param   string  $openid     小程序openid
+     * @param   string  $template   模板ID
+     * @param   array   $data       小程序数据
+     * @param   string  $page       跳转页面
+     * @param   string  $state      小程序状态
+     * @return  bool|mixed
+     */
+    public function sendMiniMsg(string $openid, string $template, array $data, string $page = null, string $state = 'normal'): array
+    {
+        $params = [
+            'touser'        => $openid,
+            'template_id'   => $template,
+            'miniprogram_state' => $state,
+            'data'          => $data
+        ];
+        if ($page) {
+            $params['page'] = $page;
+        }
+        $url = 'https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=' . $this->accessToken();
+        $res = Curl::requestCurl($url, 'POST', [], json_encode($params));
+
+        return $res ? json_decode($res, true) : [];
+    }
+
+    /**
+     * @link    https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html
+     * @desc    获取全局唯一接口调用凭据
+     * @param   int $repeatCnt
+     * @return  string
+     */
+    public function accessToken(&$repeatCnt = 0)
+    {
+        $drive = $this->config['token_drive'] ?? 'redis';
+        $key   = 'mini_' . $this->appId . '_accessToken';
+        switch ($drive) {
+            case 'redis':
+                $redis = Redis::instance();
+                $redis->select(15);
+
+                $token = $redis->get($key);
+                break;
+            case 'db':
+            default:
+                $token = Db::table('configs')->where('c_key', $key)->where('c_expired > ' . time())->value('c_value');
+                break;
+        }
+        if ($token) {
+            return $token;
+        }
+
+        $url = 'https://api.weixin.qq.com/cgi-bin/token';
+        $res = Curl::requestCurl($url, 'GET', [], http_build_query([
+            'grant_type' => 'client_credential',
+            'appid'      => $this->appId,
+            'secret'     => $this->secret
+        ]));
+
+        $data = json_decode($res, true);
+        if (isset($data['access_token'])) {
+            $token = $data['access_token'];
+            switch ($drive) {
+                case 'redis':
+                    $redis->setex($key, 7000, $token);
+                    break;
+                case 'db':
+                default:
+                    Db::table('configs')
+                        ->where('c_key', $key)
+                        ->update([
+                            'c_value'   => $token,
+                            'c_expired' => time() + 7000,
+                            'c_updated' => date('Y-m-d H:i:s')
+                        ]);
+                    break;
+            }
+
+            return $token;
+        } else {
+            if ($repeatCnt <= 3) {
+                $repeatCnt++;
+                return $this->accessToken($repeatCnt);
+            } else {
+                return $data['errcode'];
+            }
+        }
+    }
+}

+ 41 - 0
app/libs/wechat/auth/WeChat.php

xqd
@@ -0,0 +1,41 @@
+<?php
+
+namespace App\libs\wechat\auth;
+use Prophecy\Exception\Doubler\ClassNotFoundException;
+
+/**
+ * @desc
+ * @method  static \swdz\wechat\auth\Gateways\General     General
+ * @method  static \swdz\wechat\auth\Gateways\Mini        Mini
+ * @package lc\wechat\auth
+ */
+class WeChat
+{
+    /**
+     * @param $method
+     * @return mixed
+     */
+    private static function make($method)
+    {
+        $value = ucwords(str_replace(['-', '_'], ' ', $method));
+
+        $gateway = __NAMESPACE__ . '\\Gateways\\' . $value;
+
+        if (class_exists($gateway)) {
+            return new $gateway();
+        }
+
+        throw new ClassNotFoundException("Gateway [{$method}] Not Exists",$gateway);
+    }
+
+    /**
+     * @desc
+     * @param   string  $method
+     * @param   array   $arguments
+     * @return  mixed
+     */
+    public static function __callStatic($method, $arguments)
+    {
+        return self::make($method, ...$arguments);
+    }
+}

+ 53 - 0
artisan

xqd
@@ -0,0 +1,53 @@
+#!/usr/bin/env php
+<?php
+
+define('LARAVEL_START', microtime(true));
+
+/*
+|--------------------------------------------------------------------------
+| Register The Auto Loader
+|--------------------------------------------------------------------------
+|
+| Composer provides a convenient, automatically generated class loader
+| for our application. We just need to utilize it! We'll require it
+| into the script here so that we do not have to worry about the
+| loading of any of our classes manually. It's great to relax.
+|
+*/
+
+require __DIR__.'/vendor/autoload.php';
+
+$app = require_once __DIR__.'/bootstrap/app.php';
+
+/*
+|--------------------------------------------------------------------------
+| Run The Artisan Application
+|--------------------------------------------------------------------------
+|
+| When we run the console application, the current CLI command will be
+| executed in this console and the response sent back to a terminal
+| or another output device for the developers. Here goes nothing!
+|
+*/
+
+$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
+
+$status = $kernel->handle(
+    $input = new Symfony\Component\Console\Input\ArgvInput,
+    new Symfony\Component\Console\Output\ConsoleOutput
+);
+
+/*
+|--------------------------------------------------------------------------
+| Shutdown The Application
+|--------------------------------------------------------------------------
+|
+| Once Artisan has finished running, we will fire off the shutdown events
+| so that any final work may be done by the application before we shut
+| down the process. This is the last thing to happen to the request.
+|
+*/
+
+$kernel->terminate($input, $status);
+
+exit($status);

+ 55 - 0
bootstrap/app.php

xqd
@@ -0,0 +1,55 @@
+<?php
+
+/*
+|--------------------------------------------------------------------------
+| Create The Application
+|--------------------------------------------------------------------------
+|
+| The first thing we will do is create a new Laravel application instance
+| which serves as the "glue" for all the components of Laravel, and is
+| the IoC container for the system binding all of the various parts.
+|
+*/
+
+$app = new Illuminate\Foundation\Application(
+    $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
+);
+
+/*
+|--------------------------------------------------------------------------
+| Bind Important Interfaces
+|--------------------------------------------------------------------------
+|
+| Next, we need to bind some important interfaces into the container so
+| we will be able to resolve them when needed. The kernels serve the
+| incoming requests to this application from both the web and CLI.
+|
+*/
+
+$app->singleton(
+    Illuminate\Contracts\Http\Kernel::class,
+    App\Http\Kernel::class
+);
+
+$app->singleton(
+    Illuminate\Contracts\Console\Kernel::class,
+    App\Console\Kernel::class
+);
+
+$app->singleton(
+    Illuminate\Contracts\Debug\ExceptionHandler::class,
+    App\Exceptions\Handler::class
+);
+
+/*
+|--------------------------------------------------------------------------
+| Return The Application
+|--------------------------------------------------------------------------
+|
+| This script returns the application instance. The instance is given to
+| the calling script so we can separate the building of the instances
+| from the actual running of the application and sending responses.
+|
+*/
+
+return $app;

+ 2 - 0
bootstrap/cache/.gitignore

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

+ 90 - 0
composer.json

xqd
@@ -0,0 +1,90 @@
+{
+    "name": "laravel/laravel",
+    "type": "project",
+    "description": "The Laravel Framework.",
+    "keywords": ["framework", "laravel"],
+    "license": "MIT",
+    "require": {
+        "php": "^7.3|^8.0",
+        "alibabacloud/iot": "^1.8",
+        "api-ecosystem-for-laravel/dingo-api": "^v3.1.1",
+        "dcat/easy-excel": "^1.0",
+        "dcat/laravel-admin": "2.*",
+        "fruitcake/laravel-cors": "^2.0",
+        "giggsey/libphonenumber-for-php": "^8.12",
+        "guzzlehttp/guzzle": "^7.0.1",
+        "iidestiny/laravel-filesystem-oss": "2.1",
+        "jormin/laravel-ddoc": "^1.1",
+        "jpush/jpush": "^3.6",
+        "laravel/framework": "^8.0",
+        "laravel/sanctum": "^2.11",
+        "laravel/tinker": "^2.5",
+        "nesbot/carbon": "^2.52",
+        "overtrue/easy-sms": "^2.1",
+        "overtrue/laravel-lang": "^3.0",
+        "overtrue/laravel-wechat": "^5.1",
+        "php-open-source-saver/jwt-auth": "^1.4",
+        "prettus/l5-repository": "^2.7",
+        "socialiteproviders/facebook": "^4.1",
+        "socialiteproviders/weixin": "^4.1",
+        "stomp-php/stomp-php": "^5.0",
+        "tencent/tls-sig-api-v2": "1.0",
+        "tencentcloud/tencentcloud-sdk-php": "^3.0",
+        "ext-curl": "*",
+        "ext-json": "*",
+        "ext-openssl": "*"
+    },
+    "require-dev": {
+        "facade/ignition": "^2.5",
+        "fakerphp/faker": "^1.9.1",
+        "laravel/sail": "^1.0.1",
+        "mockery/mockery": "^1.4.2",
+        "nunomaduro/collision": "^5.0",
+        "phpunit/phpunit": "^9.3.3"
+    },
+    "autoload": {
+        "psr-4": {
+            "App\\": "app/",
+            "Database\\Factories\\": "database/factories/",
+            "Database\\Seeders\\": "database/seeders/"
+        },
+        "files": [
+            "app/Helper/function.php"
+        ]
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "Tests\\": "tests/"
+        }
+    },
+    "scripts": {
+        "post-autoload-dump": [
+            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
+            "@php artisan package:discover --ansi"
+        ],
+        "post-update-cmd": [
+            "@php artisan vendor:publish --tag=laravel-assets --ansi"
+        ],
+        "post-root-package-install": [
+            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
+        ],
+        "post-create-project-cmd": [
+            "@php artisan key:generate --ansi"
+        ]
+    },
+    "extra": {
+        "laravel": {
+            "dont-discover": []
+        }
+    },
+    "config": {
+        "optimize-autoloader": true,
+        "preferred-install": "dist",
+        "sort-packages": true,
+        "allow-plugins": {
+            "easywechat-composer/easywechat-composer": true
+        }
+    },
+    "minimum-stability": "dev",
+    "prefer-stable": true
+}

+ 12803 - 0
composer.lock

xqd
@@ -0,0 +1,12803 @@
+{
+    "_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": "6e0b786508e1c727d1348603ea294a65",
+    "packages": [
+        {
+            "name": "adbario/php-dot-notation",
+            "version": "2.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/adbario/php-dot-notation.git",
+                "reference": "39ece8d385ce2f5e03718c693932d83ab0cb5972"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/adbario/php-dot-notation/zipball/39ece8d385ce2f5e03718c693932d83ab0cb5972",
+                "reference": "39ece8d385ce2f5e03718c693932d83ab0cb5972",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "php": "^5.5 || ^7.0 || ^8.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8|^5.7|^6.6|^7.5|^8.5|^9.5",
+                "squizlabs/php_codesniffer": "^3.6"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/helpers.php"
+                ],
+                "psr-4": {
+                    "Adbar\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Riku Särkinen",
+                    "email": "riku@adbar.io"
+                }
+            ],
+            "description": "PHP dot notation access to arrays",
+            "homepage": "https://github.com/adbario/php-dot-notation",
+            "keywords": [
+                "ArrayAccess",
+                "dotnotation"
+            ],
+            "support": {
+                "issues": "https://github.com/adbario/php-dot-notation/issues",
+                "source": "https://github.com/adbario/php-dot-notation/tree/2.3.0"
+            },
+            "time": "2022-07-12T02:52:50+00:00"
+        },
+        {
+            "name": "alibabacloud/client",
+            "version": "1.5.31",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/aliyun/openapi-sdk-php-client.git",
+                "reference": "19224d92fe27ab8ef501d77d4891e7660bc023c1"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/aliyun/openapi-sdk-php-client/zipball/19224d92fe27ab8ef501d77d4891e7660bc023c1",
+                "reference": "19224d92fe27ab8ef501d77d4891e7660bc023c1",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "adbario/php-dot-notation": "^2.2",
+                "clagiordano/weblibs-configmanager": "^1.0",
+                "danielstjules/stringy": "^3.1",
+                "ext-curl": "*",
+                "ext-json": "*",
+                "ext-libxml": "*",
+                "ext-mbstring": "*",
+                "ext-openssl": "*",
+                "ext-simplexml": "*",
+                "ext-xmlwriter": "*",
+                "guzzlehttp/guzzle": "^6.3|^7.0",
+                "mtdowling/jmespath.php": "^2.5",
+                "php": ">=5.5"
+            },
+            "require-dev": {
+                "composer/composer": "^1.8",
+                "drupal/coder": "^8.3",
+                "ext-dom": "*",
+                "ext-pcre": "*",
+                "ext-sockets": "*",
+                "ext-spl": "*",
+                "league/climate": "^3.2.4",
+                "mikey179/vfsstream": "^1.6",
+                "monolog/monolog": "^1.24",
+                "phpunit/phpunit": "^5.7.27|^6.1",
+                "psr/cache": "^1.0",
+                "symfony/dotenv": "^3.4",
+                "symfony/var-dumper": "^3.4"
+            },
+            "suggest": {
+                "ext-sockets": "To use client-side monitoring"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/Functions.php"
+                ],
+                "psr-4": {
+                    "AlibabaCloud\\Client\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Alibaba Cloud SDK",
+                    "email": "sdk-team@alibabacloud.com",
+                    "homepage": "http://www.alibabacloud.com"
+                }
+            ],
+            "description": "Alibaba Cloud Client for PHP - Use Alibaba Cloud in your PHP project",
+            "homepage": "https://www.alibabacloud.com/",
+            "keywords": [
+                "alibaba",
+                "alibabacloud",
+                "aliyun",
+                "client",
+                "cloud",
+                "library",
+                "sdk",
+                "tool"
+            ],
+            "support": {
+                "issues": "https://github.com/aliyun/openapi-sdk-php-client/issues",
+                "source": "https://github.com/aliyun/openapi-sdk-php-client"
+            },
+            "time": "2021-05-13T06:26:38+00:00"
+        },
+        {
+            "name": "alibabacloud/iot",
+            "version": "1.8.958",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/alibabacloud-sdk-php/iot.git",
+                "reference": "1be6b0444e6eeba93ad8bf1eef0f1afe2b477bea"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/alibabacloud-sdk-php/iot/zipball/1be6b0444e6eeba93ad8bf1eef0f1afe2b477bea",
+                "reference": "1be6b0444e6eeba93ad8bf1eef0f1afe2b477bea",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "alibabacloud/client": "^1.5",
+                "php": ">=5.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "AlibabaCloud\\Iot\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Alibaba Cloud SDK",
+                    "email": "sdk-team@alibabacloud.com",
+                    "homepage": "http://www.alibabacloud.com"
+                }
+            ],
+            "description": "Alibaba Cloud Iot SDK for PHP",
+            "homepage": "https://www.alibabacloud.com/",
+            "keywords": [
+                "alibaba",
+                "alibabacloud",
+                "aliyun",
+                "cloud",
+                "iot",
+                "library",
+                "sdk"
+            ],
+            "support": {
+                "issues": "https://github.com/alibabacloud-sdk-php/iot/issues",
+                "source": "https://github.com/alibabacloud-sdk-php/iot"
+            },
+            "time": "2021-04-29T09:15:22+00:00"
+        },
+        {
+            "name": "aliyuncs/oss-sdk-php",
+            "version": "v2.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/aliyun/aliyun-oss-php-sdk.git",
+                "reference": "f0413667d765855eb0aaa728b596801464ffdb06"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/aliyun/aliyun-oss-php-sdk/zipball/f0413667d765855eb0aaa728b596801464ffdb06",
+                "reference": "f0413667d765855eb0aaa728b596801464ffdb06",
+                "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.5.0"
+            },
+            "time": "2022-05-13T07:41:28+00:00"
+        },
+        {
+            "name": "api-ecosystem-for-laravel/dingo-api",
+            "version": "v3.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/api-ecosystem-for-laravel/dingo-api.git",
+                "reference": "ac4de98c1a7b1f533d31623a3df1a17abf0af23e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/api-ecosystem-for-laravel/dingo-api/zipball/ac4de98c1a7b1f533d31623a3df1a17abf0af23e",
+                "reference": "ac4de98c1a7b1f533d31623a3df1a17abf0af23e",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "dingo/blueprint": "^0.4",
+                "illuminate/routing": "^7.0|^8.0",
+                "illuminate/support": "^7.0|^8.0",
+                "league/fractal": "^0.19",
+                "php": "^7.2.5|^8.0"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "~2",
+                "illuminate/auth": "^7.0|^8.0",
+                "illuminate/cache": "^7.0|^8.0",
+                "illuminate/console": "^7.0|^8.0",
+                "illuminate/database": "^7.0|^8.0",
+                "illuminate/events": "^7.0|^8.0",
+                "illuminate/filesystem": "^7.0|^8.0",
+                "illuminate/log": "^7.0|^8.0",
+                "illuminate/pagination": "^7.0|^8.0",
+                "laravel/lumen-framework": "^7.0|^8.0",
+                "mockery/mockery": "~1.0",
+                "php-open-source-saver/jwt-auth": "^1.4",
+                "phpunit/phpunit": "^8.5|^9.0",
+                "squizlabs/php_codesniffer": "~2.0"
+            },
+            "suggest": {
+                "php-open-source-saver/jwt-auth": "Protect your API with JSON Web Tokens."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0-dev"
+                },
+                "laravel": {
+                    "providers": [
+                        "Dingo\\Api\\Provider\\LaravelServiceProvider"
+                    ],
+                    "aliases": {
+                        "API": "Dingo\\Api\\Facade\\API"
+                    }
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/helpers.php"
+                ],
+                "psr-4": {
+                    "Dingo\\Api\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Jason Lewis",
+                    "email": "jason.lewis1991@gmail.com"
+                }
+            ],
+            "description": "A RESTful API package for the Laravel and Lumen frameworks.",
+            "keywords": [
+                "api",
+                "dingo",
+                "laravel",
+                "restful"
+            ],
+            "support": {
+                "issues": "https://github.com/api-ecosystem-for-laravel/dingo-api/issues",
+                "source": "https://github.com/api-ecosystem-for-laravel/dingo-api/tree/v3.1.1"
+            },
+            "time": "2022-01-30T13:37:55+00:00"
+        },
+        {
+            "name": "asm89/stack-cors",
+            "version": "v2.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/asm89/stack-cors.git",
+                "reference": "73e5b88775c64ccc0b84fb60836b30dc9d92ac4a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/asm89/stack-cors/zipball/73e5b88775c64ccc0b84fb60836b30dc9d92ac4a",
+                "reference": "73e5b88775c64ccc0b84fb60836b30dc9d92ac4a",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.2|^8.0",
+                "symfony/http-foundation": "^4|^5|^6",
+                "symfony/http-kernel": "^4|^5|^6"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^7|^9",
+                "squizlabs/php_codesniffer": "^3.5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.1-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Asm89\\Stack\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Alexander",
+                    "email": "iam.asm89@gmail.com"
+                }
+            ],
+            "description": "Cross-origin resource sharing library and stack middleware",
+            "homepage": "https://github.com/asm89/stack-cors",
+            "keywords": [
+                "cors",
+                "stack"
+            ],
+            "support": {
+                "issues": "https://github.com/asm89/stack-cors/issues",
+                "source": "https://github.com/asm89/stack-cors/tree/v2.1.1"
+            },
+            "time": "2022-01-18T09:12:03+00:00"
+        },
+        {
+            "name": "barryvdh/laravel-snappy",
+            "version": "v0.4.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/barryvdh/laravel-snappy.git",
+                "reference": "1903ab84171072b6bff8d98eb58d38b2c9aaf645"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/barryvdh/laravel-snappy/zipball/1903ab84171072b6bff8d98eb58d38b2c9aaf645",
+                "reference": "1903ab84171072b6bff8d98eb58d38b2c9aaf645",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "illuminate/filesystem": "^5.5|^6|^7|^8",
+                "illuminate/support": "^5.5|^6|^7|^8",
+                "knplabs/knp-snappy": "^1",
+                "php": ">=7"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "0.4-dev"
+                },
+                "laravel": {
+                    "providers": [
+                        "Barryvdh\\Snappy\\ServiceProvider"
+                    ],
+                    "aliases": {
+                        "PDF": "Barryvdh\\Snappy\\Facades\\SnappyPdf",
+                        "SnappyImage": "Barryvdh\\Snappy\\Facades\\SnappyImage"
+                    }
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Barryvdh\\Snappy\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Barry vd. Heuvel",
+                    "email": "barryvdh@gmail.com"
+                }
+            ],
+            "description": "Snappy PDF/Image for Laravel",
+            "keywords": [
+                "image",
+                "laravel",
+                "pdf",
+                "snappy",
+                "wkhtmltoimage",
+                "wkhtmltopdf"
+            ],
+            "support": {
+                "issues": "https://github.com/barryvdh/laravel-snappy/issues",
+                "source": "https://github.com/barryvdh/laravel-snappy/tree/master"
+            },
+            "time": "2020-09-07T12:33:10+00:00"
+        },
+        {
+            "name": "box/spout",
+            "version": "v3.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/box/spout.git",
+                "reference": "9bdb027d312b732515b884a341c0ad70372c6295"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/box/spout/zipball/9bdb027d312b732515b884a341c0ad70372c6295",
+                "reference": "9bdb027d312b732515b884a341c0ad70372c6295",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-xmlreader": "*",
+                "ext-zip": "*",
+                "php": ">=7.2.0"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^2",
+                "phpunit/phpunit": "^8"
+            },
+            "suggest": {
+                "ext-iconv": "To handle non UTF-8 CSV files (if \"php-intl\" is not already installed or is too limited)",
+                "ext-intl": "To handle non UTF-8 CSV files (if \"iconv\" is not already installed)"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Box\\Spout\\": "src/Spout"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Adrien Loison",
+                    "email": "adrien@box.com"
+                }
+            ],
+            "description": "PHP Library to read and write spreadsheet files (CSV, XLSX and ODS), in a fast and scalable way",
+            "homepage": "https://www.github.com/box/spout",
+            "keywords": [
+                "OOXML",
+                "csv",
+                "excel",
+                "memory",
+                "odf",
+                "ods",
+                "office",
+                "open",
+                "php",
+                "read",
+                "scale",
+                "spreadsheet",
+                "stream",
+                "write",
+                "xlsx"
+            ],
+            "support": {
+                "issues": "https://github.com/box/spout/issues",
+                "source": "https://github.com/box/spout/tree/v3.3.0"
+            },
+            "abandoned": true,
+            "time": "2021-05-14T21:18:09+00:00"
+        },
+        {
+            "name": "brick/math",
+            "version": "0.9.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/brick/math.git",
+                "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/brick/math/zipball/ca57d18f028f84f777b2168cd1911b0dee2343ae",
+                "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "php": "^7.1 || ^8.0"
+            },
+            "require-dev": {
+                "php-coveralls/php-coveralls": "^2.2",
+                "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.0",
+                "vimeo/psalm": "4.9.2"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Brick\\Math\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Arbitrary-precision arithmetic library",
+            "keywords": [
+                "Arbitrary-precision",
+                "BigInteger",
+                "BigRational",
+                "arithmetic",
+                "bigdecimal",
+                "bignum",
+                "brick",
+                "math"
+            ],
+            "support": {
+                "issues": "https://github.com/brick/math/issues",
+                "source": "https://github.com/brick/math/tree/0.9.3"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/BenMorel",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/brick/math",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2021-08-15T20:50:18+00:00"
+        },
+        {
+            "name": "clagiordano/weblibs-configmanager",
+            "version": "v1.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/clagiordano/weblibs-configmanager.git",
+                "reference": "5c8ebcc62782313b1278afe802b120d18c07a059"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/clagiordano/weblibs-configmanager/zipball/5c8ebcc62782313b1278afe802b120d18c07a059",
+                "reference": "5c8ebcc62782313b1278afe802b120d18c07a059",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.4"
+            },
+            "require-dev": {
+                "clagiordano/phpunit-result-printer": "^1",
+                "phpunit/phpunit": "^4.8"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "clagiordano\\weblibs\\configmanager\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "LGPL-3.0-or-later"
+            ],
+            "authors": [
+                {
+                    "name": "Claudio Giordano",
+                    "email": "claudio.giordano@autistici.org",
+                    "role": "Developer"
+                }
+            ],
+            "description": "weblibs-configmanager is a tool library for easily read and access to php config array file and direct read/write configuration file / object",
+            "keywords": [
+                "clagiordano",
+                "configuration",
+                "manager",
+                "tool",
+                "weblibs"
+            ],
+            "support": {
+                "issues": "https://github.com/clagiordano/weblibs-configmanager/issues",
+                "source": "https://github.com/clagiordano/weblibs-configmanager/tree/v1.2.0"
+            },
+            "time": "2021-05-18T17:55:57+00:00"
+        },
+        {
+            "name": "danielstjules/stringy",
+            "version": "3.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/danielstjules/Stringy.git",
+                "reference": "df24ab62d2d8213bbbe88cc36fc35a4503b4bd7e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/danielstjules/Stringy/zipball/df24ab62d2d8213bbbe88cc36fc35a4503b4bd7e",
+                "reference": "df24ab62d2d8213bbbe88cc36fc35a4503b4bd7e",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.4.0",
+                "symfony/polyfill-mbstring": "~1.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/Create.php"
+                ],
+                "psr-4": {
+                    "Stringy\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Daniel St. Jules",
+                    "email": "danielst.jules@gmail.com",
+                    "homepage": "http://www.danielstjules.com"
+                }
+            ],
+            "description": "A string manipulation library with multibyte support",
+            "homepage": "https://github.com/danielstjules/Stringy",
+            "keywords": [
+                "UTF",
+                "helpers",
+                "manipulation",
+                "methods",
+                "multibyte",
+                "string",
+                "utf-8",
+                "utility",
+                "utils"
+            ],
+            "support": {
+                "issues": "https://github.com/danielstjules/Stringy/issues",
+                "source": "https://github.com/danielstjules/Stringy"
+            },
+            "time": "2017-06-12T01:10:27+00:00"
+        },
+        {
+            "name": "dcat/easy-excel",
+            "version": "1.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/jqhph/easy-excel.git",
+                "reference": "20ee838b07f1f5d9c075b84e6f4807cbb21c44b0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/jqhph/easy-excel/zipball/20ee838b07f1f5d9c075b84e6f4807cbb21c44b0",
+                "reference": "20ee838b07f1f5d9c075b84e6f4807cbb21c44b0",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "box/spout": "~3",
+                "league/flysystem": "~1|~2|~3",
+                "php": ">=7.1.0"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^2",
+                "phpunit/phpunit": "~7|~8.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Dcat\\EasyExcel\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "jqh",
+                    "email": "841324345@qq.com"
+                }
+            ],
+            "description": "使用简单实用的语义化接口快速读写Excel文件",
+            "homepage": "https://github.com/jqhph/easy-excel",
+            "keywords": [
+                "box spout",
+                "csv",
+                "easy excel",
+                "excel",
+                "ods",
+                "office",
+                "read",
+                "spreadsheet",
+                "stream",
+                "xlsx"
+            ],
+            "support": {
+                "issues": "https://github.com/jqhph/easy-excel/issues",
+                "source": "https://github.com/jqhph/easy-excel/tree/1.1.0"
+            },
+            "time": "2022-03-03T03:04:13+00:00"
+        },
+        {
+            "name": "dcat/laravel-admin",
+            "version": "2.2.2-beta",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/jqhph/dcat-admin.git",
+                "reference": "150f46486871b5ca57992f7eed3787e0c1c49bef"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/jqhph/dcat-admin/zipball/150f46486871b5ca57992f7eed3787e0c1c49bef",
+                "reference": "150f46486871b5ca57992f7eed3787e0c1c49bef",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "doctrine/dbal": "^2.6|^3.0",
+                "laravel/framework": "~5.5|~6.0|~7.0|~8.0|~9.0",
+                "php": ">=7.1.0",
+                "spatie/eloquent-sortable": "3.*|4.*"
+            },
+            "require-dev": {
+                "fzaninotto/faker": "^1.4",
+                "laravel/dusk": "~5.9|~6",
+                "mockery/mockery": "^1.0",
+                "phpstan/phpstan": "^0.12.0",
+                "phpunit/phpunit": "^7.5|~9"
+            },
+            "type": "library",
+            "extra": {
+                "laravel": {
+                    "providers": [
+                        "Dcat\\Admin\\AdminServiceProvider"
+                    ]
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/Support/helpers.php"
+                ],
+                "psr-4": {
+                    "Dcat\\Admin\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "jqh",
+                    "email": "841324345@qq.com"
+                }
+            ],
+            "description": "dcat admin",
+            "homepage": "https://github.com/jqhph/dcat-admin",
+            "keywords": [
+                "admin",
+                "dcat",
+                "form",
+                "grid",
+                "laravel",
+                "laravel admin"
+            ],
+            "support": {
+                "issues": "https://github.com/jqhph/dcat-admin/issues",
+                "source": "https://github.com/jqhph/dcat-admin/tree/2.2.2-beta"
+            },
+            "time": "2022-06-27T14:42:39+00:00"
+        },
+        {
+            "name": "dflydev/dot-access-data",
+            "version": "v3.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/dflydev/dflydev-dot-access-data.git",
+                "reference": "0992cc19268b259a39e86f296da5f0677841f42c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/0992cc19268b259a39e86f296da5f0677841f42c",
+                "reference": "0992cc19268b259a39e86f296da5f0677841f42c",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.1 || ^8.0"
+            },
+            "require-dev": {
+                "phpstan/phpstan": "^0.12.42",
+                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3",
+                "scrutinizer/ocular": "1.6.0",
+                "squizlabs/php_codesniffer": "^3.5",
+                "vimeo/psalm": "^3.14"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Dflydev\\DotAccessData\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Dragonfly Development Inc.",
+                    "email": "info@dflydev.com",
+                    "homepage": "http://dflydev.com"
+                },
+                {
+                    "name": "Beau Simensen",
+                    "email": "beau@dflydev.com",
+                    "homepage": "http://beausimensen.com"
+                },
+                {
+                    "name": "Carlos Frutos",
+                    "email": "carlos@kiwing.it",
+                    "homepage": "https://github.com/cfrutos"
+                },
+                {
+                    "name": "Colin O'Dell",
+                    "email": "colinodell@gmail.com",
+                    "homepage": "https://www.colinodell.com"
+                }
+            ],
+            "description": "Given a deep data structure, access data by dot notation.",
+            "homepage": "https://github.com/dflydev/dflydev-dot-access-data",
+            "keywords": [
+                "access",
+                "data",
+                "dot",
+                "notation"
+            ],
+            "support": {
+                "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues",
+                "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.1"
+            },
+            "time": "2021-08-13T13:06:58+00:00"
+        },
+        {
+            "name": "dingo/blueprint",
+            "version": "v0.4.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/dingo/blueprint.git",
+                "reference": "e3a8f19ae10716670079c3c162540756dbd20a88"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/dingo/blueprint/zipball/e3a8f19ae10716670079c3c162540756dbd20a88",
+                "reference": "e3a8f19ae10716670079c3c162540756dbd20a88",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "doctrine/annotations": "~1.2",
+                "illuminate/filesystem": "^7.0|^8.0",
+                "illuminate/support": "^7.0|^8.0",
+                "php": "^7.2.5|^8.0",
+                "phpdocumentor/reflection-docblock": "^3.1 || ^4.1 || ^5"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^6.5|^8.3|^9.0",
+                "squizlabs/php_codesniffer": "~2.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "0.2-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Dingo\\Blueprint\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Jason Lewis",
+                    "email": "jason.lewis1991@gmail.com"
+                }
+            ],
+            "description": "API Blueprint documentation generator.",
+            "keywords": [
+                "api",
+                "blueprint",
+                "dingo",
+                "docs",
+                "laravel"
+            ],
+            "support": {
+                "issues": "https://github.com/dingo/blueprint/issues",
+                "source": "https://github.com/dingo/blueprint/tree/v0.4.3"
+            },
+            "time": "2021-04-30T11:20:38+00:00"
+        },
+        {
+            "name": "doctrine/annotations",
+            "version": "1.13.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/annotations.git",
+                "reference": "648b0343343565c4a056bfc8392201385e8d89f0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/annotations/zipball/648b0343343565c4a056bfc8392201385e8d89f0",
+                "reference": "648b0343343565c4a056bfc8392201385e8d89f0",
+                "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": "^1.4.10 || ^1.8.0",
+                "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5",
+                "symfony/cache": "^4.4 || ^5.2",
+                "vimeo/psalm": "^4.10"
+            },
+            "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.3"
+            },
+            "time": "2022-07-02T10:48:51+00:00"
+        },
+        {
+            "name": "doctrine/cache",
+            "version": "2.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/cache.git",
+                "reference": "1ca8f21980e770095a31456042471a57bc4c68fb"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb",
+                "reference": "1ca8f21980e770095a31456042471a57bc4c68fb",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "~7.1 || ^8.0"
+            },
+            "conflict": {
+                "doctrine/common": ">2.2,<2.4"
+            },
+            "require-dev": {
+                "cache/integration-tests": "dev-master",
+                "doctrine/coding-standard": "^9",
+                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+                "psr/cache": "^1.0 || ^2.0 || ^3.0",
+                "symfony/cache": "^4.4 || ^5.4 || ^6",
+                "symfony/var-exporter": "^4.4 || ^5.4 || ^6"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache"
+                }
+            },
+            "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": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.",
+            "homepage": "https://www.doctrine-project.org/projects/cache.html",
+            "keywords": [
+                "abstraction",
+                "apcu",
+                "cache",
+                "caching",
+                "couchdb",
+                "memcached",
+                "php",
+                "redis",
+                "xcache"
+            ],
+            "support": {
+                "issues": "https://github.com/doctrine/cache/issues",
+                "source": "https://github.com/doctrine/cache/tree/2.2.0"
+            },
+            "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%2Fcache",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-05-20T20:07:39+00:00"
+        },
+        {
+            "name": "doctrine/dbal",
+            "version": "3.3.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/dbal.git",
+                "reference": "9f79d4650430b582f4598fe0954ef4d52fbc0a8a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/dbal/zipball/9f79d4650430b582f4598fe0954ef4d52fbc0a8a",
+                "reference": "9f79d4650430b582f4598fe0954ef4d52fbc0a8a",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "composer-runtime-api": "^2",
+                "doctrine/cache": "^1.11|^2.0",
+                "doctrine/deprecations": "^0.5.3|^1",
+                "doctrine/event-manager": "^1.0",
+                "php": "^7.3 || ^8.0",
+                "psr/cache": "^1|^2|^3",
+                "psr/log": "^1|^2|^3"
+            },
+            "require-dev": {
+                "doctrine/coding-standard": "9.0.0",
+                "jetbrains/phpstorm-stubs": "2022.1",
+                "phpstan/phpstan": "1.7.13",
+                "phpstan/phpstan-strict-rules": "^1.2",
+                "phpunit/phpunit": "9.5.20",
+                "psalm/plugin-phpunit": "0.16.1",
+                "squizlabs/php_codesniffer": "3.7.0",
+                "symfony/cache": "^5.2|^6.0",
+                "symfony/console": "^2.7|^3.0|^4.0|^5.0|^6.0",
+                "vimeo/psalm": "4.23.0"
+            },
+            "suggest": {
+                "symfony/console": "For helpful console commands such as SQL execution and import of files."
+            },
+            "bin": [
+                "bin/doctrine-dbal"
+            ],
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\DBAL\\": "src"
+                }
+            },
+            "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"
+                }
+            ],
+            "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.",
+            "homepage": "https://www.doctrine-project.org/projects/dbal.html",
+            "keywords": [
+                "abstraction",
+                "database",
+                "db2",
+                "dbal",
+                "mariadb",
+                "mssql",
+                "mysql",
+                "oci8",
+                "oracle",
+                "pdo",
+                "pgsql",
+                "postgresql",
+                "queryobject",
+                "sasql",
+                "sql",
+                "sqlite",
+                "sqlserver",
+                "sqlsrv"
+            ],
+            "support": {
+                "issues": "https://github.com/doctrine/dbal/issues",
+                "source": "https://github.com/doctrine/dbal/tree/3.3.7"
+            },
+            "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%2Fdbal",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-06-13T21:43:03+00:00"
+        },
+        {
+            "name": "doctrine/deprecations",
+            "version": "v1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/deprecations.git",
+                "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de",
+                "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.1|^8.0"
+            },
+            "require-dev": {
+                "doctrine/coding-standard": "^9",
+                "phpunit/phpunit": "^7.5|^8.5|^9.5",
+                "psr/log": "^1|^2|^3"
+            },
+            "suggest": {
+                "psr/log": "Allows logging deprecations via PSR-3 logger implementation"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.",
+            "homepage": "https://www.doctrine-project.org/",
+            "support": {
+                "issues": "https://github.com/doctrine/deprecations/issues",
+                "source": "https://github.com/doctrine/deprecations/tree/v1.0.0"
+            },
+            "time": "2022-05-02T15:47:09+00:00"
+        },
+        {
+            "name": "doctrine/event-manager",
+            "version": "1.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/event-manager.git",
+                "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/event-manager/zipball/41370af6a30faa9dc0368c4a6814d596e81aba7f",
+                "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.1 || ^8.0"
+            },
+            "conflict": {
+                "doctrine/common": "<2.9@dev"
+            },
+            "require-dev": {
+                "doctrine/coding-standard": "^6.0",
+                "phpunit/phpunit": "^7.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Common\\": "lib/Doctrine/Common"
+                }
+            },
+            "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"
+                },
+                {
+                    "name": "Marco Pivetta",
+                    "email": "ocramius@gmail.com"
+                }
+            ],
+            "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.",
+            "homepage": "https://www.doctrine-project.org/projects/event-manager.html",
+            "keywords": [
+                "event",
+                "event dispatcher",
+                "event manager",
+                "event system",
+                "events"
+            ],
+            "support": {
+                "issues": "https://github.com/doctrine/event-manager/issues",
+                "source": "https://github.com/doctrine/event-manager/tree/1.1.x"
+            },
+            "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%2Fevent-manager",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-05-29T18:28:51+00:00"
+        },
+        {
+            "name": "doctrine/inflector",
+            "version": "2.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/inflector.git",
+                "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89",
+                "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89",
+                "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": "^8.2",
+                "phpstan/phpstan": "^0.12",
+                "phpstan/phpstan-phpunit": "^0.12",
+                "phpstan/phpstan-strict-rules": "^0.12",
+                "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0",
+                "vimeo/psalm": "^4.10"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Inflector\\": "lib/Doctrine/Inflector"
+                }
+            },
+            "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": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.",
+            "homepage": "https://www.doctrine-project.org/projects/inflector.html",
+            "keywords": [
+                "inflection",
+                "inflector",
+                "lowercase",
+                "manipulation",
+                "php",
+                "plural",
+                "singular",
+                "strings",
+                "uppercase",
+                "words"
+            ],
+            "support": {
+                "issues": "https://github.com/doctrine/inflector/issues",
+                "source": "https://github.com/doctrine/inflector/tree/2.0.4"
+            },
+            "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%2Finflector",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2021-10-22T20:16:43+00:00"
+        },
+        {
+            "name": "doctrine/lexer",
+            "version": "1.2.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/lexer.git",
+                "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229",
+                "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.1 || ^8.0"
+            },
+            "require-dev": {
+                "doctrine/coding-standard": "^9.0",
+                "phpstan/phpstan": "^1.3",
+                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+                "vimeo/psalm": "^4.11"
+            },
+            "type": "library",
+            "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.3"
+            },
+            "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": "2022-02-28T11:07:21+00:00"
+        },
+        {
+            "name": "dragonmantank/cron-expression",
+            "version": "v3.3.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/dragonmantank/cron-expression.git",
+                "reference": "be85b3f05b46c39bbc0d95f6c071ddff669510fa"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/be85b3f05b46c39bbc0d95f6c071ddff669510fa",
+                "reference": "be85b3f05b46c39bbc0d95f6c071ddff669510fa",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.2|^8.0",
+                "webmozart/assert": "^1.0"
+            },
+            "replace": {
+                "mtdowling/cron-expression": "^1.0"
+            },
+            "require-dev": {
+                "phpstan/extension-installer": "^1.0",
+                "phpstan/phpstan": "^1.0",
+                "phpstan/phpstan-webmozart-assert": "^1.0",
+                "phpunit/phpunit": "^7.0|^8.0|^9.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Cron\\": "src/Cron/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Chris Tankersley",
+                    "email": "chris@ctankersley.com",
+                    "homepage": "https://github.com/dragonmantank"
+                }
+            ],
+            "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due",
+            "keywords": [
+                "cron",
+                "schedule"
+            ],
+            "support": {
+                "issues": "https://github.com/dragonmantank/cron-expression/issues",
+                "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/dragonmantank",
+                    "type": "github"
+                }
+            ],
+            "time": "2022-01-18T15:43:28+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": "egulias/email-validator",
+            "version": "2.1.25",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/egulias/EmailValidator.git",
+                "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0dbf5d78455d4d6a41d186da50adc1122ec066f4",
+                "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "doctrine/lexer": "^1.0.1",
+                "php": ">=5.5",
+                "symfony/polyfill-intl-idn": "^1.10"
+            },
+            "require-dev": {
+                "dominicsayers/isemail": "^3.0.7",
+                "phpunit/phpunit": "^4.8.36|^7.5.15",
+                "satooshi/php-coveralls": "^1.0.1"
+            },
+            "suggest": {
+                "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Egulias\\EmailValidator\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Eduardo Gulias Davis"
+                }
+            ],
+            "description": "A library for validating emails against several RFCs",
+            "homepage": "https://github.com/egulias/EmailValidator",
+            "keywords": [
+                "email",
+                "emailvalidation",
+                "emailvalidator",
+                "validation",
+                "validator"
+            ],
+            "support": {
+                "issues": "https://github.com/egulias/EmailValidator/issues",
+                "source": "https://github.com/egulias/EmailValidator/tree/2.1.25"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/egulias",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-12-29T14:50:06+00:00"
+        },
+        {
+            "name": "fruitcake/laravel-cors",
+            "version": "v2.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/fruitcake/laravel-cors.git",
+                "reference": "783a74f5e3431d7b9805be8afb60fd0a8f743534"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/fruitcake/laravel-cors/zipball/783a74f5e3431d7b9805be8afb60fd0a8f743534",
+                "reference": "783a74f5e3431d7b9805be8afb60fd0a8f743534",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "asm89/stack-cors": "^2.0.1",
+                "illuminate/contracts": "^6|^7|^8|^9",
+                "illuminate/support": "^6|^7|^8|^9",
+                "php": ">=7.2"
+            },
+            "require-dev": {
+                "laravel/framework": "^6|^7.24|^8",
+                "orchestra/testbench-dusk": "^4|^5|^6|^7",
+                "phpunit/phpunit": "^6|^7|^8|^9",
+                "squizlabs/php_codesniffer": "^3.5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.1-dev"
+                },
+                "laravel": {
+                    "providers": [
+                        "Fruitcake\\Cors\\CorsServiceProvider"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Fruitcake\\Cors\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fruitcake",
+                    "homepage": "https://fruitcake.nl"
+                },
+                {
+                    "name": "Barry vd. Heuvel",
+                    "email": "barryvdh@gmail.com"
+                }
+            ],
+            "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Laravel application",
+            "keywords": [
+                "api",
+                "cors",
+                "crossdomain",
+                "laravel"
+            ],
+            "support": {
+                "issues": "https://github.com/fruitcake/laravel-cors/issues",
+                "source": "https://github.com/fruitcake/laravel-cors/tree/v2.2.0"
+            },
+            "funding": [
+                {
+                    "url": "https://fruitcake.nl",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/barryvdh",
+                    "type": "github"
+                }
+            ],
+            "time": "2022-02-23T14:25:13+00:00"
+        },
+        {
+            "name": "giggsey/libphonenumber-for-php",
+            "version": "8.12.50",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/giggsey/libphonenumber-for-php.git",
+                "reference": "526c4b7f6d5e173770d8645e76340d7eb25dc348"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/526c4b7f6d5e173770d8645e76340d7eb25dc348",
+                "reference": "526c4b7f6d5e173770d8645e76340d7eb25dc348",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "giggsey/locale": "^1.7|^2.0",
+                "php": ">=5.3.2",
+                "symfony/polyfill-mbstring": "^1.17"
+            },
+            "require-dev": {
+                "pear/pear-core-minimal": "^1.9",
+                "pear/pear_exception": "^1.0",
+                "pear/versioncontrol_git": "^0.5",
+                "phing/phing": "^2.7",
+                "php-coveralls/php-coveralls": "^1.0|^2.0",
+                "symfony/console": "^2.8|^3.0|^v4.4|^v5.2",
+                "symfony/phpunit-bridge": "^4.2 || ^5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "8.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "libphonenumber\\": "src/"
+                },
+                "exclude-from-classmap": [
+                    "/src/data/",
+                    "/src/carrier/data/",
+                    "/src/geocoding/data/",
+                    "/src/timezone/data/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Joshua Gigg",
+                    "email": "giggsey@gmail.com",
+                    "homepage": "https://giggsey.com/"
+                }
+            ],
+            "description": "PHP Port of Google's libphonenumber",
+            "homepage": "https://github.com/giggsey/libphonenumber-for-php",
+            "keywords": [
+                "geocoding",
+                "geolocation",
+                "libphonenumber",
+                "mobile",
+                "phonenumber",
+                "validation"
+            ],
+            "support": {
+                "irc": "irc://irc.appliedirc.com/lobby",
+                "issues": "https://github.com/giggsey/libphonenumber-for-php/issues",
+                "source": "https://github.com/giggsey/libphonenumber-for-php"
+            },
+            "time": "2022-06-09T14:55:00+00:00"
+        },
+        {
+            "name": "giggsey/locale",
+            "version": "2.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/giggsey/Locale.git",
+                "reference": "9c1dca769253f6a3e81f9a5c167f53b6a54ab635"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/giggsey/Locale/zipball/9c1dca769253f6a3e81f9a5c167f53b6a54ab635",
+                "reference": "9c1dca769253f6a3e81f9a5c167f53b6a54ab635",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2"
+            },
+            "require-dev": {
+                "ext-json": "*",
+                "pear/pear-core-minimal": "^1.9",
+                "pear/pear_exception": "^1.0",
+                "pear/versioncontrol_git": "^0.5",
+                "phing/phing": "^2.7",
+                "php-coveralls/php-coveralls": "^2.0",
+                "phpunit/phpunit": "^8.5|^9.5",
+                "symfony/console": "^5.0",
+                "symfony/filesystem": "^5.0",
+                "symfony/finder": "^5.0",
+                "symfony/process": "^5.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Giggsey\\Locale\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Joshua Gigg",
+                    "email": "giggsey@gmail.com",
+                    "homepage": "https://giggsey.com/"
+                }
+            ],
+            "description": "Locale functions required by libphonenumber-for-php",
+            "support": {
+                "issues": "https://github.com/giggsey/Locale/issues",
+                "source": "https://github.com/giggsey/Locale/tree/2.2"
+            },
+            "time": "2022-04-06T07:33:59+00:00"
+        },
+        {
+            "name": "graham-campbell/result-type",
+            "version": "v1.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/GrahamCampbell/Result-Type.git",
+                "reference": "0690bde05318336c7221785f2a932467f98b64ca"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/0690bde05318336c7221785f2a932467f98b64ca",
+                "reference": "0690bde05318336c7221785f2a932467f98b64ca",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.0 || ^8.0",
+                "phpoption/phpoption": "^1.8"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "GrahamCampbell\\ResultType\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                }
+            ],
+            "description": "An Implementation Of The Result Type",
+            "keywords": [
+                "Graham Campbell",
+                "GrahamCampbell",
+                "Result Type",
+                "Result-Type",
+                "result"
+            ],
+            "support": {
+                "issues": "https://github.com/GrahamCampbell/Result-Type/issues",
+                "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.0.4"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/GrahamCampbell",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2021-11-21T21:41:47+00:00"
+        },
+        {
+            "name": "guzzlehttp/guzzle",
+            "version": "7.4.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/guzzle.git",
+                "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1dd98b0564cb3f6bd16ce683cb755f94c10fbd82",
+                "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "guzzlehttp/promises": "^1.5",
+                "guzzlehttp/psr7": "^1.9 || ^2.4",
+                "php": "^7.2.5 || ^8.0",
+                "psr/http-client": "^1.0",
+                "symfony/deprecation-contracts": "^2.2 || ^3.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 || ^2.0 || ^3.0"
+            },
+            "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.4-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/functions_include.php"
+                ],
+                "psr-4": {
+                    "GuzzleHttp\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                },
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "Jeremy Lindblom",
+                    "email": "jeremeamia@gmail.com",
+                    "homepage": "https://github.com/jeremeamia"
+                },
+                {
+                    "name": "George Mponos",
+                    "email": "gmponos@gmail.com",
+                    "homepage": "https://github.com/gmponos"
+                },
+                {
+                    "name": "Tobias Nyholm",
+                    "email": "tobias.nyholm@gmail.com",
+                    "homepage": "https://github.com/Nyholm"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com",
+                    "homepage": "https://github.com/sagikazarmark"
+                },
+                {
+                    "name": "Tobias Schultze",
+                    "email": "webmaster@tubo-world.de",
+                    "homepage": "https://github.com/Tobion"
+                }
+            ],
+            "description": "Guzzle is a PHP HTTP client library",
+            "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.4.5"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/GrahamCampbell",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/Nyholm",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-06-20T22:16:13+00:00"
+        },
+        {
+            "name": "guzzlehttp/promises",
+            "version": "1.5.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/promises.git",
+                "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da",
+                "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da",
+                "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.5-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/functions_include.php"
+                ],
+                "psr-4": {
+                    "GuzzleHttp\\Promise\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                },
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "Tobias Nyholm",
+                    "email": "tobias.nyholm@gmail.com",
+                    "homepage": "https://github.com/Nyholm"
+                },
+                {
+                    "name": "Tobias Schultze",
+                    "email": "webmaster@tubo-world.de",
+                    "homepage": "https://github.com/Tobion"
+                }
+            ],
+            "description": "Guzzle promises library",
+            "keywords": [
+                "promise"
+            ],
+            "support": {
+                "issues": "https://github.com/guzzle/promises/issues",
+                "source": "https://github.com/guzzle/promises/tree/1.5.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/GrahamCampbell",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/Nyholm",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2021-10-22T20:56:57+00:00"
+        },
+        {
+            "name": "guzzlehttp/psr7",
+            "version": "2.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/psr7.git",
+                "reference": "13388f00956b1503577598873fffb5ae994b5737"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/psr7/zipball/13388f00956b1503577598873fffb5ae994b5737",
+                "reference": "13388f00956b1503577598873fffb5ae994b5737",
+                "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.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Psr7\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                },
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "George Mponos",
+                    "email": "gmponos@gmail.com",
+                    "homepage": "https://github.com/gmponos"
+                },
+                {
+                    "name": "Tobias Nyholm",
+                    "email": "tobias.nyholm@gmail.com",
+                    "homepage": "https://github.com/Nyholm"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com",
+                    "homepage": "https://github.com/sagikazarmark"
+                },
+                {
+                    "name": "Tobias Schultze",
+                    "email": "webmaster@tubo-world.de",
+                    "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.4.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/GrahamCampbell",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/Nyholm",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-06-20T21:43:11+00:00"
+        },
+        {
+            "name": "h4cc/wkhtmltopdf-amd64",
+            "version": "0.12.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/h4cc/wkhtmltopdf-amd64.git",
+                "reference": "4e2ab2d032a5d7fbe2a741de8b10b8989523c95b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/h4cc/wkhtmltopdf-amd64/zipball/4e2ab2d032a5d7fbe2a741de8b10b8989523c95b",
+                "reference": "4e2ab2d032a5d7fbe2a741de8b10b8989523c95b",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "bin": [
+                "bin/wkhtmltopdf-amd64"
+            ],
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "h4cc\\WKHTMLToPDF\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "LGPL Version 3"
+            ],
+            "authors": [
+                {
+                    "name": "Julius Beckmann",
+                    "email": "github@h4cc.de"
+                }
+            ],
+            "description": "Convert html to pdf using webkit (qtwebkit). Static linked linux binary for amd64 systems.",
+            "homepage": "http://wkhtmltopdf.org/",
+            "keywords": [
+                "binary",
+                "convert",
+                "pdf",
+                "snapshot",
+                "thumbnail",
+                "wkhtmltopdf"
+            ],
+            "support": {
+                "issues": "https://github.com/h4cc/wkhtmltopdf-amd64/issues",
+                "source": "https://github.com/h4cc/wkhtmltopdf-amd64/tree/master"
+            },
+            "time": "2018-01-15T06:57:33+00:00"
+        },
+        {
+            "name": "h4cc/wkhtmltopdf-i386",
+            "version": "0.12.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/h4cc/wkhtmltopdf-i386.git",
+                "reference": "da14486ec8eba1873b026b56126ed02d2f2ae5e3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/h4cc/wkhtmltopdf-i386/zipball/da14486ec8eba1873b026b56126ed02d2f2ae5e3",
+                "reference": "da14486ec8eba1873b026b56126ed02d2f2ae5e3",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "bin": [
+                "bin/wkhtmltopdf-i386"
+            ],
+            "type": "library",
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "LGPL Version 3"
+            ],
+            "authors": [
+                {
+                    "name": "Julius Beckmann",
+                    "email": "github@h4cc.de"
+                }
+            ],
+            "description": "Convert html to pdf using webkit (qtwebkit). Static linked linux binary for i386 systems.",
+            "homepage": "http://wkhtmltopdf.org/",
+            "keywords": [
+                "binary",
+                "convert",
+                "pdf",
+                "snapshot",
+                "thumbnail",
+                "wkhtmltopdf"
+            ],
+            "support": {
+                "issues": "https://github.com/h4cc/wkhtmltopdf-i386/issues",
+                "source": "https://github.com/h4cc/wkhtmltopdf-i386/tree/master"
+            },
+            "time": "2018-01-15T07:18:15+00:00"
+        },
+        {
+            "name": "iidestiny/flysystem-oss",
+            "version": "2.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/iiDestiny/flysystem-oss.git",
+                "reference": "c943ce550e973129955275bb17e8182fe8a74020"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/iiDestiny/flysystem-oss/zipball/c943ce550e973129955275bb17e8182fe8a74020",
+                "reference": "c943ce550e973129955275bb17e8182fe8a74020",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "aliyuncs/oss-sdk-php": "^2.4",
+                "ext-curl": "*",
+                "ext-json": "*",
+                "ext-openssl": "*",
+                "league/flysystem": "^1.0",
+                "nesbot/carbon": "^1.24.1 || ^2.0",
+                "php": "^7.0 || ^8.0"
+            },
+            "require-dev": {
+                "mockery/mockery": "^1.2",
+                "phpunit/phpunit": "^6.5",
+                "symfony/var-dumper": "^3.4"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Iidestiny\\Flysystem\\Oss\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "iidestiny",
+                    "email": "iidestiny@vip.qq.com"
+                }
+            ],
+            "description": "Flysystem adapter for the Oss storage.",
+            "keywords": [
+                "alioss",
+                "laravel",
+                "oss",
+                "阿里oss"
+            ],
+            "support": {
+                "issues": "https://github.com/iiDestiny/flysystem-oss/issues",
+                "source": "https://github.com/iiDestiny/flysystem-oss/tree/2.7"
+            },
+            "time": "2021-06-14T10:18:58+00:00"
+        },
+        {
+            "name": "iidestiny/laravel-filesystem-oss",
+            "version": "2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/iiDestiny/laravel-filesystem-oss.git",
+                "reference": "ae3cd6fd3cd727eedda0e2bcd0403a6d79fe4223"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/iiDestiny/laravel-filesystem-oss/zipball/ae3cd6fd3cd727eedda0e2bcd0403a6d79fe4223",
+                "reference": "ae3cd6fd3cd727eedda0e2bcd0403a6d79fe4223",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "iidestiny/flysystem-oss": "~2.0",
+                "php": "^7.0|^8.0"
+            },
+            "type": "library",
+            "extra": {
+                "laravel": {
+                    "providers": [
+                        "Iidestiny\\LaravelFilesystemOss\\OssStorageServiceProvider"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Iidestiny\\LaravelFilesystemOss\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "iidestiny",
+                    "email": "iidestiny@vip.qq.com"
+                }
+            ],
+            "description": "Oss storage filesystem for Laravel.",
+            "support": {
+                "issues": "https://github.com/iiDestiny/laravel-filesystem-oss/issues",
+                "source": "https://github.com/iiDestiny/laravel-filesystem-oss/tree/2.1"
+            },
+            "time": "2020-11-30T06:17:22+00:00"
+        },
+        {
+            "name": "jormin/laravel-ddoc",
+            "version": "v1.1.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/jormin/laravel-ddoc.git",
+                "reference": "d7608d3395f7fd1085a3ce7b82441d2360769c77"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/jormin/laravel-ddoc/zipball/d7608d3395f7fd1085a3ce7b82441d2360769c77",
+                "reference": "d7608d3395f7fd1085a3ce7b82441d2360769c77",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "barryvdh/laravel-snappy": "^0.4.0",
+                "h4cc/wkhtmltopdf-amd64": "0.12.x",
+                "h4cc/wkhtmltopdf-i386": "0.12.x",
+                "php": ">=5.6",
+                "wemersonjanuario/wkhtmltopdf-windows": "0.12.x"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0||~5.0",
+                "squizlabs/php_codesniffer": "^2.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1.x-dev"
+                },
+                "laravel": {
+                    "providers": [
+                        "Jormin\\DDoc\\DDocServiceProvider"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Jormin\\DDoc\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jormin",
+                    "email": "jorminxee@gmail.com",
+                    "homepage": "https://blog.lerzen.com",
+                    "role": "Developer"
+                }
+            ],
+            "description": "每次开发项目时,总是会被要求提供数据字典,每次手动写文档太累了,所以写了这个扩展,自动读取数据库信息并显示在网页上,支持导出Html和PDF文件。",
+            "homepage": "https://github.com/jormin/laravel-ddoc",
+            "keywords": [
+                "DDoc",
+                "Jormin",
+                "laravel"
+            ],
+            "support": {
+                "issues": "https://github.com/jormin/laravel-ddoc/issues",
+                "source": "https://github.com/jormin/laravel-ddoc/tree/v1.1.5"
+            },
+            "time": "2021-09-07T04:26:43+00:00"
+        },
+        {
+            "name": "jpush/jpush",
+            "version": "v3.6.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/jpush/jpush-api-php-client.git",
+                "reference": "ebb191e8854a35c3fb7a6626028b3a23132cbe2c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/jpush/jpush-api-php-client/zipball/ebb191e8854a35c3fb7a6626028b3a23132cbe2c",
+                "reference": "ebb191e8854a35c3fb7a6626028b3a23132cbe2c",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-curl": "*",
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "JPush\\": "src/JPush/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "JPush",
+                    "email": "support@jpush.cn",
+                    "homepage": "https://www.jpush.cn/",
+                    "role": "Developer"
+                }
+            ],
+            "description": "JPush API PHP Client",
+            "homepage": "https://github.com/jpush/jpush-api-php-client",
+            "support": {
+                "issues": "https://github.com/jpush/jpush-api-php-client/issues",
+                "source": "https://github.com/jpush/jpush-api-php-client/tree/v3.6.8"
+            },
+            "time": "2021-08-12T07:43:39+00:00"
+        },
+        {
+            "name": "knplabs/knp-snappy",
+            "version": "v1.4.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/KnpLabs/snappy.git",
+                "reference": "5126fb5b335ec929a226314d40cd8dad497c3d67"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/KnpLabs/snappy/zipball/5126fb5b335ec929a226314d40cd8dad497c3d67",
+                "reference": "5126fb5b335ec929a226314d40cd8dad497c3d67",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1",
+                "psr/log": "^1.0||^2.0||^3.0",
+                "symfony/process": "~3.4||~4.3||~5.0||~6.0"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^2.16||^3.0",
+                "pedrotroller/php-cs-custom-fixer": "^2.19",
+                "phpstan/phpstan": "^0.12.7",
+                "phpstan/phpstan-phpunit": "^0.12.6",
+                "phpunit/phpunit": "~7.4||~8.5"
+            },
+            "suggest": {
+                "h4cc/wkhtmltoimage-amd64": "Provides wkhtmltoimage-amd64 binary for Linux-compatible machines, use version `~0.12` as dependency",
+                "h4cc/wkhtmltoimage-i386": "Provides wkhtmltoimage-i386 binary for Linux-compatible machines, use version `~0.12` as dependency",
+                "h4cc/wkhtmltopdf-amd64": "Provides wkhtmltopdf-amd64 binary for Linux-compatible machines, use version `~0.12` as dependency",
+                "h4cc/wkhtmltopdf-i386": "Provides wkhtmltopdf-i386 binary for Linux-compatible machines, use version `~0.12` as dependency",
+                "wemersonjanuario/wkhtmltopdf-windows": "Provides wkhtmltopdf executable for Windows, use version `~0.12` as dependency"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Knp\\Snappy\\": "src/Knp/Snappy"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "KNP Labs Team",
+                    "homepage": "http://knplabs.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://github.com/KnpLabs/snappy/contributors"
+                }
+            ],
+            "description": "PHP library allowing thumbnail, snapshot or PDF generation from a url or a html page. Wrapper for wkhtmltopdf/wkhtmltoimage.",
+            "homepage": "http://github.com/KnpLabs/snappy",
+            "keywords": [
+                "knp",
+                "knplabs",
+                "pdf",
+                "snapshot",
+                "thumbnail",
+                "wkhtmltopdf"
+            ],
+            "support": {
+                "issues": "https://github.com/KnpLabs/snappy/issues",
+                "source": "https://github.com/KnpLabs/snappy/tree/v1.4.1"
+            },
+            "time": "2022-01-07T13:03:38+00:00"
+        },
+        {
+            "name": "laravel-lang/lang",
+            "version": "3.0.62",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Laravel-Lang/lang.git",
+                "reference": "fcb8cec051b175278e0a9efa440f0b1033d12dd7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Laravel-Lang/lang/zipball/fcb8cec051b175278e0a9efa440f0b1033d12dd7",
+                "reference": "fcb8cec051b175278e0a9efa440f0b1033d12dd7",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^2.10"
+            },
+            "suggest": {
+                "ablunier/laravel-lang-installer": "Command for easily add languages to a Laravel project",
+                "andrey-helldar/laravel-lang-publisher": "Easy installation and update of translation files for your project",
+                "arcanedev/laravel-lang": "Translations manager and checker for Laravel 5",
+                "overtrue/laravel-lang": "Command to add languages in your project"
+            },
+            "type": "library",
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "caouecs",
+                    "email": "caouecs@caouecs.net"
+                }
+            ],
+            "description": "Languages for Laravel",
+            "keywords": [
+                "lang",
+                "languages",
+                "laravel",
+                "lpm"
+            ],
+            "support": {
+                "issues": "https://github.com/Laravel-Lang/lang/issues",
+                "source": "https://github.com/Laravel-Lang/lang/tree/3.0.62"
+            },
+            "time": "2019-03-17T10:36:46+00:00"
+        },
+        {
+            "name": "laravel/framework",
+            "version": "v8.83.19",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/laravel/framework.git",
+                "reference": "4264f2ee12330bdb1be050998f58ba7271236395"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/laravel/framework/zipball/4264f2ee12330bdb1be050998f58ba7271236395",
+                "reference": "4264f2ee12330bdb1be050998f58ba7271236395",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "doctrine/inflector": "^1.4|^2.0",
+                "dragonmantank/cron-expression": "^3.0.2",
+                "egulias/email-validator": "^2.1.10",
+                "ext-json": "*",
+                "ext-mbstring": "*",
+                "ext-openssl": "*",
+                "laravel/serializable-closure": "^1.0",
+                "league/commonmark": "^1.3|^2.0.2",
+                "league/flysystem": "^1.1",
+                "monolog/monolog": "^2.0",
+                "nesbot/carbon": "^2.53.1",
+                "opis/closure": "^3.6",
+                "php": "^7.3|^8.0",
+                "psr/container": "^1.0",
+                "psr/log": "^1.0|^2.0",
+                "psr/simple-cache": "^1.0",
+                "ramsey/uuid": "^4.2.2",
+                "swiftmailer/swiftmailer": "^6.3",
+                "symfony/console": "^5.4",
+                "symfony/error-handler": "^5.4",
+                "symfony/finder": "^5.4",
+                "symfony/http-foundation": "^5.4",
+                "symfony/http-kernel": "^5.4",
+                "symfony/mime": "^5.4",
+                "symfony/process": "^5.4",
+                "symfony/routing": "^5.4",
+                "symfony/var-dumper": "^5.4",
+                "tijsverkoyen/css-to-inline-styles": "^2.2.2",
+                "vlucas/phpdotenv": "^5.4.1",
+                "voku/portable-ascii": "^1.6.1"
+            },
+            "conflict": {
+                "tightenco/collect": "<5.5.33"
+            },
+            "provide": {
+                "psr/container-implementation": "1.0",
+                "psr/simple-cache-implementation": "1.0"
+            },
+            "replace": {
+                "illuminate/auth": "self.version",
+                "illuminate/broadcasting": "self.version",
+                "illuminate/bus": "self.version",
+                "illuminate/cache": "self.version",
+                "illuminate/collections": "self.version",
+                "illuminate/config": "self.version",
+                "illuminate/console": "self.version",
+                "illuminate/container": "self.version",
+                "illuminate/contracts": "self.version",
+                "illuminate/cookie": "self.version",
+                "illuminate/database": "self.version",
+                "illuminate/encryption": "self.version",
+                "illuminate/events": "self.version",
+                "illuminate/filesystem": "self.version",
+                "illuminate/hashing": "self.version",
+                "illuminate/http": "self.version",
+                "illuminate/log": "self.version",
+                "illuminate/macroable": "self.version",
+                "illuminate/mail": "self.version",
+                "illuminate/notifications": "self.version",
+                "illuminate/pagination": "self.version",
+                "illuminate/pipeline": "self.version",
+                "illuminate/queue": "self.version",
+                "illuminate/redis": "self.version",
+                "illuminate/routing": "self.version",
+                "illuminate/session": "self.version",
+                "illuminate/support": "self.version",
+                "illuminate/testing": "self.version",
+                "illuminate/translation": "self.version",
+                "illuminate/validation": "self.version",
+                "illuminate/view": "self.version"
+            },
+            "require-dev": {
+                "aws/aws-sdk-php": "^3.198.1",
+                "doctrine/dbal": "^2.13.3|^3.1.4",
+                "filp/whoops": "^2.14.3",
+                "guzzlehttp/guzzle": "^6.5.5|^7.0.1",
+                "league/flysystem-cached-adapter": "^1.0",
+                "mockery/mockery": "^1.4.4",
+                "orchestra/testbench-core": "^6.27",
+                "pda/pheanstalk": "^4.0",
+                "phpunit/phpunit": "^8.5.19|^9.5.8",
+                "predis/predis": "^1.1.9",
+                "symfony/cache": "^5.4"
+            },
+            "suggest": {
+                "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).",
+                "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.198.1).",
+                "brianium/paratest": "Required to run tests in parallel (^6.0).",
+                "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.4).",
+                "ext-bcmath": "Required to use the multiple_of validation rule.",
+                "ext-ftp": "Required to use the Flysystem FTP driver.",
+                "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().",
+                "ext-memcached": "Required to use the memcache cache driver.",
+                "ext-pcntl": "Required to use all features of the queue worker.",
+                "ext-posix": "Required to use all features of the queue worker.",
+                "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).",
+                "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).",
+                "filp/whoops": "Required for friendly error pages in development (^2.14.3).",
+                "guzzlehttp/guzzle": "Required to use the HTTP Client, Mailgun mail driver and the ping methods on schedules (^6.5.5|^7.0.1).",
+                "laravel/tinker": "Required to use the tinker console command (^2.0).",
+                "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).",
+                "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).",
+                "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).",
+                "mockery/mockery": "Required to use mocking (^1.4.4).",
+                "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).",
+                "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).",
+                "phpunit/phpunit": "Required to use assertions and run tests (^8.5.19|^9.5.8).",
+                "predis/predis": "Required to use the predis connector (^1.1.9).",
+                "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).",
+                "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0|^5.0|^6.0|^7.0).",
+                "symfony/cache": "Required to PSR-6 cache bridge (^5.4).",
+                "symfony/filesystem": "Required to enable support for relative symbolic links (^5.4).",
+                "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0).",
+                "wildbit/swiftmailer-postmark": "Required to use Postmark mail driver (^3.0)."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "8.x-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/Illuminate/Collections/helpers.php",
+                    "src/Illuminate/Events/functions.php",
+                    "src/Illuminate/Foundation/helpers.php",
+                    "src/Illuminate/Support/helpers.php"
+                ],
+                "psr-4": {
+                    "Illuminate\\": "src/Illuminate/",
+                    "Illuminate\\Support\\": [
+                        "src/Illuminate/Macroable/",
+                        "src/Illuminate/Collections/"
+                    ]
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "taylor@laravel.com"
+                }
+            ],
+            "description": "The Laravel Framework.",
+            "homepage": "https://laravel.com",
+            "keywords": [
+                "framework",
+                "laravel"
+            ],
+            "support": {
+                "issues": "https://github.com/laravel/framework/issues",
+                "source": "https://github.com/laravel/framework"
+            },
+            "time": "2022-07-13T13:23:09+00:00"
+        },
+        {
+            "name": "laravel/sanctum",
+            "version": "v2.15.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/laravel/sanctum.git",
+                "reference": "31fbe6f85aee080c4dc2f9b03dc6dd5d0ee72473"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/laravel/sanctum/zipball/31fbe6f85aee080c4dc2f9b03dc6dd5d0ee72473",
+                "reference": "31fbe6f85aee080c4dc2f9b03dc6dd5d0ee72473",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "illuminate/console": "^6.9|^7.0|^8.0|^9.0",
+                "illuminate/contracts": "^6.9|^7.0|^8.0|^9.0",
+                "illuminate/database": "^6.9|^7.0|^8.0|^9.0",
+                "illuminate/support": "^6.9|^7.0|^8.0|^9.0",
+                "php": "^7.2|^8.0"
+            },
+            "require-dev": {
+                "mockery/mockery": "^1.0",
+                "orchestra/testbench": "^4.0|^5.0|^6.0|^7.0",
+                "phpunit/phpunit": "^8.0|^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.x-dev"
+                },
+                "laravel": {
+                    "providers": [
+                        "Laravel\\Sanctum\\SanctumServiceProvider"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Laravel\\Sanctum\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "taylor@laravel.com"
+                }
+            ],
+            "description": "Laravel Sanctum provides a featherweight authentication system for SPAs and simple APIs.",
+            "keywords": [
+                "auth",
+                "laravel",
+                "sanctum"
+            ],
+            "support": {
+                "issues": "https://github.com/laravel/sanctum/issues",
+                "source": "https://github.com/laravel/sanctum"
+            },
+            "time": "2022-04-08T13:39:49+00:00"
+        },
+        {
+            "name": "laravel/serializable-closure",
+            "version": "v1.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/laravel/serializable-closure.git",
+                "reference": "09f0e9fb61829f628205b7c94906c28740ff9540"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/09f0e9fb61829f628205b7c94906c28740ff9540",
+                "reference": "09f0e9fb61829f628205b7c94906c28740ff9540",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.3|^8.0"
+            },
+            "require-dev": {
+                "pestphp/pest": "^1.18",
+                "phpstan/phpstan": "^0.12.98",
+                "symfony/var-dumper": "^5.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Laravel\\SerializableClosure\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "taylor@laravel.com"
+                },
+                {
+                    "name": "Nuno Maduro",
+                    "email": "nuno@laravel.com"
+                }
+            ],
+            "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.",
+            "keywords": [
+                "closure",
+                "laravel",
+                "serializable"
+            ],
+            "support": {
+                "issues": "https://github.com/laravel/serializable-closure/issues",
+                "source": "https://github.com/laravel/serializable-closure"
+            },
+            "time": "2022-05-16T17:09:47+00:00"
+        },
+        {
+            "name": "laravel/socialite",
+            "version": "v5.5.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/laravel/socialite.git",
+                "reference": "68afb03259b82d898c68196cbcacd48596a9dd72"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/laravel/socialite/zipball/68afb03259b82d898c68196cbcacd48596a9dd72",
+                "reference": "68afb03259b82d898c68196cbcacd48596a9dd72",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "guzzlehttp/guzzle": "^6.0|^7.0",
+                "illuminate/http": "^6.0|^7.0|^8.0|^9.0",
+                "illuminate/support": "^6.0|^7.0|^8.0|^9.0",
+                "league/oauth1-client": "^1.0",
+                "php": "^7.2|^8.0"
+            },
+            "require-dev": {
+                "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0",
+                "mockery/mockery": "^1.0",
+                "orchestra/testbench": "^4.0|^5.0|^6.0|^7.0",
+                "phpunit/phpunit": "^8.0|^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.x-dev"
+                },
+                "laravel": {
+                    "providers": [
+                        "Laravel\\Socialite\\SocialiteServiceProvider"
+                    ],
+                    "aliases": {
+                        "Socialite": "Laravel\\Socialite\\Facades\\Socialite"
+                    }
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Laravel\\Socialite\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "taylor@laravel.com"
+                }
+            ],
+            "description": "Laravel wrapper around OAuth 1 & OAuth 2 libraries.",
+            "homepage": "https://laravel.com",
+            "keywords": [
+                "laravel",
+                "oauth"
+            ],
+            "support": {
+                "issues": "https://github.com/laravel/socialite/issues",
+                "source": "https://github.com/laravel/socialite"
+            },
+            "time": "2022-03-10T15:26:19+00:00"
+        },
+        {
+            "name": "laravel/tinker",
+            "version": "v2.7.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/laravel/tinker.git",
+                "reference": "dff39b661e827dae6e092412f976658df82dbac5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/laravel/tinker/zipball/dff39b661e827dae6e092412f976658df82dbac5",
+                "reference": "dff39b661e827dae6e092412f976658df82dbac5",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "illuminate/console": "^6.0|^7.0|^8.0|^9.0",
+                "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0",
+                "illuminate/support": "^6.0|^7.0|^8.0|^9.0",
+                "php": "^7.2.5|^8.0",
+                "psy/psysh": "^0.10.4|^0.11.1",
+                "symfony/var-dumper": "^4.3.4|^5.0|^6.0"
+            },
+            "require-dev": {
+                "mockery/mockery": "~1.3.3|^1.4.2",
+                "phpunit/phpunit": "^8.5.8|^9.3.3"
+            },
+            "suggest": {
+                "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0)."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.x-dev"
+                },
+                "laravel": {
+                    "providers": [
+                        "Laravel\\Tinker\\TinkerServiceProvider"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Laravel\\Tinker\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "taylor@laravel.com"
+                }
+            ],
+            "description": "Powerful REPL for the Laravel framework.",
+            "keywords": [
+                "REPL",
+                "Tinker",
+                "laravel",
+                "psysh"
+            ],
+            "support": {
+                "issues": "https://github.com/laravel/tinker/issues",
+                "source": "https://github.com/laravel/tinker/tree/v2.7.2"
+            },
+            "time": "2022-03-23T12:38:24+00:00"
+        },
+        {
+            "name": "lcobucci/clock",
+            "version": "2.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/lcobucci/clock.git",
+                "reference": "fb533e093fd61321bfcbac08b131ce805fe183d3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/lcobucci/clock/zipball/fb533e093fd61321bfcbac08b131ce805fe183d3",
+                "reference": "fb533e093fd61321bfcbac08b131ce805fe183d3",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^8.0",
+                "stella-maris/clock": "^0.1.4"
+            },
+            "require-dev": {
+                "infection/infection": "^0.26",
+                "lcobucci/coding-standard": "^8.0",
+                "phpstan/extension-installer": "^1.1",
+                "phpstan/phpstan": "^0.12",
+                "phpstan/phpstan-deprecation-rules": "^0.12",
+                "phpstan/phpstan-phpunit": "^0.12",
+                "phpstan/phpstan-strict-rules": "^0.12",
+                "phpunit/phpunit": "^9.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Lcobucci\\Clock\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Luís Cobucci",
+                    "email": "lcobucci@gmail.com"
+                }
+            ],
+            "description": "Yet another clock abstraction",
+            "support": {
+                "issues": "https://github.com/lcobucci/clock/issues",
+                "source": "https://github.com/lcobucci/clock/tree/2.2.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/lcobucci",
+                    "type": "github"
+                },
+                {
+                    "url": "https://www.patreon.com/lcobucci",
+                    "type": "patreon"
+                }
+            ],
+            "time": "2022-04-19T19:34:17+00:00"
+        },
+        {
+            "name": "lcobucci/jwt",
+            "version": "4.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/lcobucci/jwt.git",
+                "reference": "55564265fddf810504110bd68ca311932324b0e9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/lcobucci/jwt/zipball/55564265fddf810504110bd68ca311932324b0e9",
+                "reference": "55564265fddf810504110bd68ca311932324b0e9",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-mbstring": "*",
+                "ext-openssl": "*",
+                "lcobucci/clock": "^2.0",
+                "php": "^7.4 || ^8.0"
+            },
+            "require-dev": {
+                "infection/infection": "^0.20",
+                "lcobucci/coding-standard": "^6.0",
+                "mikey179/vfsstream": "^1.6",
+                "phpbench/phpbench": "^0.17",
+                "phpstan/extension-installer": "^1.0",
+                "phpstan/phpstan": "^0.12",
+                "phpstan/phpstan-deprecation-rules": "^0.12",
+                "phpstan/phpstan-phpunit": "^0.12",
+                "phpstan/phpstan-strict-rules": "^0.12",
+                "phpunit/php-invoker": "^3.1",
+                "phpunit/phpunit": "^9.4"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Lcobucci\\JWT\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Luís Cobucci",
+                    "email": "lcobucci@gmail.com",
+                    "role": "Developer"
+                }
+            ],
+            "description": "A simple library to work with JSON Web Token and JSON Web Signature",
+            "keywords": [
+                "JWS",
+                "jwt"
+            ],
+            "support": {
+                "issues": "https://github.com/lcobucci/jwt/issues",
+                "source": "https://github.com/lcobucci/jwt/tree/4.0.4"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/lcobucci",
+                    "type": "github"
+                },
+                {
+                    "url": "https://www.patreon.com/lcobucci",
+                    "type": "patreon"
+                }
+            ],
+            "time": "2021-09-28T19:18:28+00:00"
+        },
+        {
+            "name": "league/commonmark",
+            "version": "2.3.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/thephpleague/commonmark.git",
+                "reference": "0da1dca5781dd3cfddbe328224d9a7a62571addc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/0da1dca5781dd3cfddbe328224d9a7a62571addc",
+                "reference": "0da1dca5781dd3cfddbe328224d9a7a62571addc",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-mbstring": "*",
+                "league/config": "^1.1.1",
+                "php": "^7.4 || ^8.0",
+                "psr/event-dispatcher": "^1.0",
+                "symfony/deprecation-contracts": "^2.1 || ^3.0",
+                "symfony/polyfill-php80": "^1.16"
+            },
+            "require-dev": {
+                "cebe/markdown": "^1.0",
+                "commonmark/cmark": "0.30.0",
+                "commonmark/commonmark.js": "0.30.0",
+                "composer/package-versions-deprecated": "^1.8",
+                "embed/embed": "^4.4",
+                "erusev/parsedown": "^1.0",
+                "ext-json": "*",
+                "github/gfm": "0.29.0",
+                "michelf/php-markdown": "^1.4",
+                "nyholm/psr7": "^1.5",
+                "phpstan/phpstan": "^0.12.88 || ^1.0.0",
+                "phpunit/phpunit": "^9.5.5",
+                "scrutinizer/ocular": "^1.8.1",
+                "symfony/finder": "^5.3",
+                "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0",
+                "unleashedtech/php-coding-standard": "^3.1",
+                "vimeo/psalm": "^4.7.3"
+            },
+            "suggest": {
+                "symfony/yaml": "v2.3+ required if using the Front Matter extension"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "2.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "League\\CommonMark\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Colin O'Dell",
+                    "email": "colinodell@gmail.com",
+                    "homepage": "https://www.colinodell.com",
+                    "role": "Lead Developer"
+                }
+            ],
+            "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)",
+            "homepage": "https://commonmark.thephpleague.com",
+            "keywords": [
+                "commonmark",
+                "flavored",
+                "gfm",
+                "github",
+                "github-flavored",
+                "markdown",
+                "md",
+                "parser"
+            ],
+            "support": {
+                "docs": "https://commonmark.thephpleague.com/",
+                "forum": "https://github.com/thephpleague/commonmark/discussions",
+                "issues": "https://github.com/thephpleague/commonmark/issues",
+                "rss": "https://github.com/thephpleague/commonmark/releases.atom",
+                "source": "https://github.com/thephpleague/commonmark"
+            },
+            "funding": [
+                {
+                    "url": "https://www.colinodell.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://www.paypal.me/colinpodell/10.00",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/colinodell",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/league/commonmark",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-06-07T21:28:26+00:00"
+        },
+        {
+            "name": "league/config",
+            "version": "v1.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/thephpleague/config.git",
+                "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/thephpleague/config/zipball/a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e",
+                "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "dflydev/dot-access-data": "^3.0.1",
+                "nette/schema": "^1.2",
+                "php": "^7.4 || ^8.0"
+            },
+            "require-dev": {
+                "phpstan/phpstan": "^0.12.90",
+                "phpunit/phpunit": "^9.5.5",
+                "scrutinizer/ocular": "^1.8.1",
+                "unleashedtech/php-coding-standard": "^3.1",
+                "vimeo/psalm": "^4.7.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.2-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "League\\Config\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Colin O'Dell",
+                    "email": "colinodell@gmail.com",
+                    "homepage": "https://www.colinodell.com",
+                    "role": "Lead Developer"
+                }
+            ],
+            "description": "Define configuration arrays with strict schemas and access values with dot notation",
+            "homepage": "https://config.thephpleague.com",
+            "keywords": [
+                "array",
+                "config",
+                "configuration",
+                "dot",
+                "dot-access",
+                "nested",
+                "schema"
+            ],
+            "support": {
+                "docs": "https://config.thephpleague.com/",
+                "issues": "https://github.com/thephpleague/config/issues",
+                "rss": "https://github.com/thephpleague/config/releases.atom",
+                "source": "https://github.com/thephpleague/config"
+            },
+            "funding": [
+                {
+                    "url": "https://www.colinodell.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://www.paypal.me/colinpodell/10.00",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/colinodell",
+                    "type": "github"
+                }
+            ],
+            "time": "2021-08-14T12:15:32+00:00"
+        },
+        {
+            "name": "league/flysystem",
+            "version": "1.1.9",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/thephpleague/flysystem.git",
+                "reference": "094defdb4a7001845300334e7c1ee2335925ef99"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/094defdb4a7001845300334e7c1ee2335925ef99",
+                "reference": "094defdb4a7001845300334e7c1ee2335925ef99",
+                "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.9"
+            },
+            "funding": [
+                {
+                    "url": "https://offset.earth/frankdejonge",
+                    "type": "other"
+                }
+            ],
+            "time": "2021-12-09T09:40:50+00:00"
+        },
+        {
+            "name": "league/fractal",
+            "version": "0.19.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/thephpleague/fractal.git",
+                "reference": "06dc15f6ba38f2dde2f919d3095d13b571190a7c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/thephpleague/fractal/zipball/06dc15f6ba38f2dde2f919d3095d13b571190a7c",
+                "reference": "06dc15f6ba38f2dde2f919d3095d13b571190a7c",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.4"
+            },
+            "require-dev": {
+                "doctrine/orm": "^2.5",
+                "illuminate/contracts": "~5.0",
+                "mockery/mockery": "~0.9",
+                "pagerfanta/pagerfanta": "~1.0.0",
+                "phpunit/phpunit": "^4.8.35 || ^7.5",
+                "squizlabs/php_codesniffer": "~1.5|~2.0|~3.4",
+                "zendframework/zend-paginator": "~2.3"
+            },
+            "suggest": {
+                "illuminate/pagination": "The Illuminate Pagination component.",
+                "pagerfanta/pagerfanta": "Pagerfanta Paginator",
+                "zendframework/zend-paginator": "Zend Framework Paginator"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "0.13-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "League\\Fractal\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Phil Sturgeon",
+                    "email": "me@philsturgeon.uk",
+                    "homepage": "http://philsturgeon.uk/",
+                    "role": "Developer"
+                }
+            ],
+            "description": "Handle the output of complex data structures ready for API output.",
+            "homepage": "http://fractal.thephpleague.com/",
+            "keywords": [
+                "api",
+                "json",
+                "league",
+                "rest"
+            ],
+            "support": {
+                "issues": "https://github.com/thephpleague/fractal/issues",
+                "source": "https://github.com/thephpleague/fractal/tree/0.19.2"
+            },
+            "time": "2020-01-24T23:17:29+00:00"
+        },
+        {
+            "name": "league/mime-type-detection",
+            "version": "1.11.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/thephpleague/mime-type-detection.git",
+                "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ff6248ea87a9f116e78edd6002e39e5128a0d4dd",
+                "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd",
+                "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": "^3.2",
+                "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.11.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/frankdejonge",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/league/flysystem",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-04-17T13:12:02+00:00"
+        },
+        {
+            "name": "league/oauth1-client",
+            "version": "v1.10.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/thephpleague/oauth1-client.git",
+                "reference": "d6365b901b5c287dd41f143033315e2f777e1167"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/thephpleague/oauth1-client/zipball/d6365b901b5c287dd41f143033315e2f777e1167",
+                "reference": "d6365b901b5c287dd41f143033315e2f777e1167",
+                "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",
+                "guzzlehttp/psr7": "^1.7|^2.0",
+                "php": ">=7.1||>=8.0"
+            },
+            "require-dev": {
+                "ext-simplexml": "*",
+                "friendsofphp/php-cs-fixer": "^2.17",
+                "mockery/mockery": "^1.3.3",
+                "phpstan/phpstan": "^0.12.42",
+                "phpunit/phpunit": "^7.5||9.5"
+            },
+            "suggest": {
+                "ext-simplexml": "For decoding XML-based responses."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev",
+                    "dev-develop": "2.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "League\\OAuth1\\Client\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ben Corlett",
+                    "email": "bencorlett@me.com",
+                    "homepage": "http://www.webcomm.com.au",
+                    "role": "Developer"
+                }
+            ],
+            "description": "OAuth 1.0 Client Library",
+            "keywords": [
+                "Authentication",
+                "SSO",
+                "authorization",
+                "bitbucket",
+                "identity",
+                "idp",
+                "oauth",
+                "oauth1",
+                "single sign on",
+                "trello",
+                "tumblr",
+                "twitter"
+            ],
+            "support": {
+                "issues": "https://github.com/thephpleague/oauth1-client/issues",
+                "source": "https://github.com/thephpleague/oauth1-client/tree/v1.10.1"
+            },
+            "time": "2022-04-15T14:02:14+00:00"
+        },
+        {
+            "name": "monolog/monolog",
+            "version": "2.7.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Seldaek/monolog.git",
+                "reference": "5579edf28aee1190a798bfa5be8bc16c563bd524"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Seldaek/monolog/zipball/5579edf28aee1190a798bfa5be8bc16c563bd524",
+                "reference": "5579edf28aee1190a798bfa5be8bc16c563bd524",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2",
+                "psr/log": "^1.0.1 || ^2.0 || ^3.0"
+            },
+            "provide": {
+                "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0"
+            },
+            "require-dev": {
+                "aws/aws-sdk-php": "^2.4.9 || ^3.0",
+                "doctrine/couchdb": "~1.0@dev",
+                "elasticsearch/elasticsearch": "^7 || ^8",
+                "ext-json": "*",
+                "graylog2/gelf-php": "^1.4.2",
+                "guzzlehttp/guzzle": "^7.4",
+                "guzzlehttp/psr7": "^2.2",
+                "mongodb/mongodb": "^1.8",
+                "php-amqplib/php-amqplib": "~2.4 || ^3",
+                "php-console/php-console": "^3.1.3",
+                "phpspec/prophecy": "^1.15",
+                "phpstan/phpstan": "^0.12.91",
+                "phpunit/phpunit": "^8.5.14",
+                "predis/predis": "^1.1",
+                "rollbar/rollbar": "^1.3 || ^2 || ^3",
+                "ruflin/elastica": "^7",
+                "swiftmailer/swiftmailer": "^5.3|^6.0",
+                "symfony/mailer": "^5.4 || ^6",
+                "symfony/mime": "^5.4 || ^6"
+            },
+            "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-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler",
+                "ext-mbstring": "Allow to work properly with unicode symbols",
+                "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)",
+                "ext-openssl": "Required to send log messages using SSL",
+                "ext-sockets": "Allow sending log messages to a Syslog server (via UDP 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.7.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/Seldaek",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-06-09T08:59:12+00:00"
+        },
+        {
+            "name": "mtdowling/jmespath.php",
+            "version": "2.6.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/jmespath/jmespath.php.git",
+                "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/9b87907a81b87bc76d19a7fb2d61e61486ee9edb",
+                "reference": "9b87907a81b87bc76d19a7fb2d61e61486ee9edb",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^5.4 || ^7.0 || ^8.0",
+                "symfony/polyfill-mbstring": "^1.17"
+            },
+            "require-dev": {
+                "composer/xdebug-handler": "^1.4 || ^2.0",
+                "phpunit/phpunit": "^4.8.36 || ^7.5.15"
+            },
+            "bin": [
+                "bin/jp.php"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.6-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/JmesPath.php"
+                ],
+                "psr-4": {
+                    "JmesPath\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                }
+            ],
+            "description": "Declaratively specify how to extract elements from a JSON document",
+            "keywords": [
+                "json",
+                "jsonpath"
+            ],
+            "support": {
+                "issues": "https://github.com/jmespath/jmespath.php/issues",
+                "source": "https://github.com/jmespath/jmespath.php/tree/2.6.1"
+            },
+            "time": "2021-06-14T00:11:39+00:00"
+        },
+        {
+            "name": "namshi/jose",
+            "version": "7.2.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/namshi/jose.git",
+                "reference": "89a24d7eb3040e285dd5925fcad992378b82bcff"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/namshi/jose/zipball/89a24d7eb3040e285dd5925fcad992378b82bcff",
+                "reference": "89a24d7eb3040e285dd5925fcad992378b82bcff",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-date": "*",
+                "ext-hash": "*",
+                "ext-json": "*",
+                "ext-pcre": "*",
+                "ext-spl": "*",
+                "php": ">=5.5",
+                "symfony/polyfill-php56": "^1.0"
+            },
+            "require-dev": {
+                "phpseclib/phpseclib": "^2.0",
+                "phpunit/phpunit": "^4.5|^5.0",
+                "satooshi/php-coveralls": "^1.0"
+            },
+            "suggest": {
+                "ext-openssl": "Allows to use OpenSSL as crypto engine.",
+                "phpseclib/phpseclib": "Allows to use Phpseclib as crypto engine, use version ^2.0."
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Namshi\\JOSE\\": "src/Namshi/JOSE/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Alessandro Nadalin",
+                    "email": "alessandro.nadalin@gmail.com"
+                },
+                {
+                    "name": "Alessandro Cinelli (cirpo)",
+                    "email": "alessandro.cinelli@gmail.com"
+                }
+            ],
+            "description": "JSON Object Signing and Encryption library for PHP.",
+            "keywords": [
+                "JSON Web Signature",
+                "JSON Web Token",
+                "JWS",
+                "json",
+                "jwt",
+                "token"
+            ],
+            "support": {
+                "issues": "https://github.com/namshi/jose/issues",
+                "source": "https://github.com/namshi/jose/tree/master"
+            },
+            "time": "2016-12-05T07:27:31+00:00"
+        },
+        {
+            "name": "nesbot/carbon",
+            "version": "2.59.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/briannesbitt/Carbon.git",
+                "reference": "a9000603ea337c8df16cc41f8b6be95a65f4d0f5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/a9000603ea337c8df16cc41f8b6be95a65f4d0f5",
+                "reference": "a9000603ea337c8df16cc41f8b6be95a65f4d0f5",
+                "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 || ^6.0"
+            },
+            "require-dev": {
+                "doctrine/dbal": "^2.0 || ^3.0",
+                "doctrine/orm": "^2.7",
+                "friendsofphp/php-cs-fixer": "^3.0",
+                "kylekatarnls/multi-tester": "^2.0",
+                "ondrejmirtes/better-reflection": "*",
+                "phpmd/phpmd": "^2.9",
+                "phpstan/extension-installer": "^1.0",
+                "phpstan/phpstan": "^0.12.99 || ^1.7.14",
+                "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6",
+                "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20",
+                "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": {
+                "docs": "https://carbon.nesbot.com/docs",
+                "issues": "https://github.com/briannesbitt/Carbon/issues",
+                "source": "https://github.com/briannesbitt/Carbon"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sponsors/kylekatarnls",
+                    "type": "github"
+                },
+                {
+                    "url": "https://opencollective.com/Carbon#sponsor",
+                    "type": "opencollective"
+                },
+                {
+                    "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-06-29T21:43:55+00:00"
+        },
+        {
+            "name": "nette/schema",
+            "version": "v1.2.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/nette/schema.git",
+                "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/nette/schema/zipball/9a39cef03a5b34c7de64f551538cbba05c2be5df",
+                "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "nette/utils": "^2.5.7 || ^3.1.5 ||  ^4.0",
+                "php": ">=7.1 <8.2"
+            },
+            "require-dev": {
+                "nette/tester": "^2.3 || ^2.4",
+                "phpstan/phpstan-nette": "^0.12",
+                "tracy/tracy": "^2.7"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.2-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause",
+                "GPL-2.0-only",
+                "GPL-3.0-only"
+            ],
+            "authors": [
+                {
+                    "name": "David Grudl",
+                    "homepage": "https://davidgrudl.com"
+                },
+                {
+                    "name": "Nette Community",
+                    "homepage": "https://nette.org/contributors"
+                }
+            ],
+            "description": "📐 Nette Schema: validating data structures against a given Schema.",
+            "homepage": "https://nette.org",
+            "keywords": [
+                "config",
+                "nette"
+            ],
+            "support": {
+                "issues": "https://github.com/nette/schema/issues",
+                "source": "https://github.com/nette/schema/tree/v1.2.2"
+            },
+            "time": "2021-10-15T11:40:02+00:00"
+        },
+        {
+            "name": "nette/utils",
+            "version": "v3.2.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/nette/utils.git",
+                "reference": "0af4e3de4df9f1543534beab255ccf459e7a2c99"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/nette/utils/zipball/0af4e3de4df9f1543534beab255ccf459e7a2c99",
+                "reference": "0af4e3de4df9f1543534beab255ccf459e7a2c99",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2 <8.2"
+            },
+            "conflict": {
+                "nette/di": "<3.0.6"
+            },
+            "require-dev": {
+                "nette/tester": "~2.0",
+                "phpstan/phpstan": "^1.0",
+                "tracy/tracy": "^2.3"
+            },
+            "suggest": {
+                "ext-gd": "to use Image",
+                "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()",
+                "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()",
+                "ext-json": "to use Nette\\Utils\\Json",
+                "ext-mbstring": "to use Strings::lower() etc...",
+                "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()",
+                "ext-xml": "to use Strings::length() etc. when mbstring is not available"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.2-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause",
+                "GPL-2.0-only",
+                "GPL-3.0-only"
+            ],
+            "authors": [
+                {
+                    "name": "David Grudl",
+                    "homepage": "https://davidgrudl.com"
+                },
+                {
+                    "name": "Nette Community",
+                    "homepage": "https://nette.org/contributors"
+                }
+            ],
+            "description": "🛠  Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.",
+            "homepage": "https://nette.org",
+            "keywords": [
+                "array",
+                "core",
+                "datetime",
+                "images",
+                "json",
+                "nette",
+                "paginator",
+                "password",
+                "slugify",
+                "string",
+                "unicode",
+                "utf-8",
+                "utility",
+                "validation"
+            ],
+            "support": {
+                "issues": "https://github.com/nette/utils/issues",
+                "source": "https://github.com/nette/utils/tree/v3.2.7"
+            },
+            "time": "2022-01-24T11:29:14+00:00"
+        },
+        {
+            "name": "nikic/php-parser",
+            "version": "v4.14.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/nikic/PHP-Parser.git",
+                "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1",
+                "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-tokenizer": "*",
+                "php": ">=7.0"
+            },
+            "require-dev": {
+                "ircmaxell/php-yacc": "^0.0.7",
+                "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
+            },
+            "bin": [
+                "bin/php-parse"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.9-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "PhpParser\\": "lib/PhpParser"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Nikita Popov"
+                }
+            ],
+            "description": "A PHP parser written in PHP",
+            "keywords": [
+                "parser",
+                "php"
+            ],
+            "support": {
+                "issues": "https://github.com/nikic/PHP-Parser/issues",
+                "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0"
+            },
+            "time": "2022-05-31T20:59:12+00:00"
+        },
+        {
+            "name": "opis/closure",
+            "version": "3.6.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/opis/closure.git",
+                "reference": "3d81e4309d2a927abbe66df935f4bb60082805ad"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/opis/closure/zipball/3d81e4309d2a927abbe66df935f4bb60082805ad",
+                "reference": "3d81e4309d2a927abbe66df935f4bb60082805ad",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^5.4 || ^7.0 || ^8.0"
+            },
+            "require-dev": {
+                "jeremeamia/superclosure": "^2.0",
+                "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.6.x-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "functions.php"
+                ],
+                "psr-4": {
+                    "Opis\\Closure\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Marius Sarca",
+                    "email": "marius.sarca@gmail.com"
+                },
+                {
+                    "name": "Sorin Sarca",
+                    "email": "sarca_sorin@hotmail.com"
+                }
+            ],
+            "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.",
+            "homepage": "https://opis.io/closure",
+            "keywords": [
+                "anonymous functions",
+                "closure",
+                "function",
+                "serializable",
+                "serialization",
+                "serialize"
+            ],
+            "support": {
+                "issues": "https://github.com/opis/closure/issues",
+                "source": "https://github.com/opis/closure/tree/3.6.3"
+            },
+            "time": "2022-01-27T09:35:39+00:00"
+        },
+        {
+            "name": "overtrue/easy-sms",
+            "version": "2.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/overtrue/easy-sms.git",
+                "reference": "4bbbbef4fa192ed23a60bbafc3217bccb6af824f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/overtrue/easy-sms/zipball/4bbbbef4fa192ed23a60bbafc3217bccb6af824f",
+                "reference": "4bbbbef4fa192ed23a60bbafc3217bccb6af824f",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "guzzlehttp/guzzle": "^6.2 || ^7.0",
+                "php": ">=5.6"
+            },
+            "require-dev": {
+                "brainmaestro/composer-git-hooks": "^2.8",
+                "jetbrains/phpstorm-attributes": "^1.0",
+                "mockery/mockery": "~1.3.3 || ^1.4.2",
+                "phpunit/phpunit": "^5.7 || ^7.5 || ^8.5.19 || ^9.5.8"
+            },
+            "type": "library",
+            "extra": {
+                "hooks": {
+                    "pre-commit": [
+                        "composer check-style",
+                        "composer psalm",
+                        "composer test"
+                    ],
+                    "pre-push": [
+                        "composer check-style"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Overtrue\\EasySms\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "overtrue",
+                    "email": "i@overtrue.me"
+                }
+            ],
+            "description": "The easiest way to send short message.",
+            "support": {
+                "issues": "https://github.com/overtrue/easy-sms/issues",
+                "source": "https://github.com/overtrue/easy-sms/tree/2.1.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/overtrue",
+                    "type": "github"
+                }
+            ],
+            "time": "2022-03-03T01:00:29+00:00"
+        },
+        {
+            "name": "overtrue/laravel-lang",
+            "version": "3.0.19",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/overtrue/laravel-lang.git",
+                "reference": "fb6de57a454792833c96ffdcd4999c90468deb89"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/overtrue/laravel-lang/zipball/fb6de57a454792833c96ffdcd4999c90468deb89",
+                "reference": "fb6de57a454792833c96ffdcd4999c90468deb89",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "laravel-lang/lang": "~3.0"
+            },
+            "type": "library",
+            "extra": {
+                "laravel": {
+                    "providers": [
+                        "Overtrue\\LaravelLang\\TranslationServiceProvider"
+                    ]
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/helpers.php"
+                ],
+                "psr-4": {
+                    "Overtrue\\LaravelLang\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "overtrue",
+                    "email": "anzhengchao@gmail.com"
+                }
+            ],
+            "description": "List of 52 languages for Laravel 5",
+            "keywords": [
+                "languages",
+                "laravel",
+                "overtrue"
+            ],
+            "support": {
+                "issues": "https://github.com/overtrue/laravel-lang/issues",
+                "source": "https://github.com/overtrue/laravel-lang/tree/3.0.19"
+            },
+            "funding": [
+                {
+                    "url": "https://www.patreon.com/overtrue",
+                    "type": "patreon"
+                }
+            ],
+            "time": "2021-04-28T03:36:48+00:00"
+        },
+        {
+            "name": "overtrue/laravel-wechat",
+            "version": "5.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/overtrue/laravel-wechat.git",
+                "reference": "1bc59aa52cf6bae2f4f388e9f20f7893305f2fe8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/overtrue/laravel-wechat/zipball/1bc59aa52cf6bae2f4f388e9f20f7893305f2fe8",
+                "reference": "1bc59aa52cf6bae2f4f388e9f20f7893305f2fe8",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "illuminate/container": "^5.1 || ^6.0 || ^7.0 || ^8.0",
+                "overtrue/wechat": "^4.0"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^2.16",
+                "laravel/framework": "^8.5"
+            },
+            "type": "library",
+            "extra": {
+                "laravel": {
+                    "providers": [
+                        "Overtrue\\LaravelWeChat\\ServiceProvider"
+                    ],
+                    "aliases": {
+                        "EasyWeChat": "Overtrue\\LaravelWeChat\\Facade"
+                    }
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Overtrue\\LaravelWeChat\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "overtrue",
+                    "email": "anzhengchao@gmail.com"
+                }
+            ],
+            "description": "微信 SDK for Laravel",
+            "keywords": [
+                "laravel",
+                "sdk",
+                "wechat",
+                "weixin"
+            ],
+            "support": {
+                "issues": "https://github.com/overtrue/laravel-wechat/issues",
+                "source": "https://github.com/overtrue/laravel-wechat/tree/5.1.0"
+            },
+            "time": "2020-09-27T08:32:30+00:00"
+        },
+        {
+            "name": "overtrue/socialite",
+            "version": "2.0.24",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/overtrue/socialite.git",
+                "reference": "ee7e7b000ec7d64f2b8aba1f6a2eec5cdf3f8bec"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/overtrue/socialite/zipball/ee7e7b000ec7d64f2b8aba1f6a2eec5cdf3f8bec",
+                "reference": "ee7e7b000ec7d64f2b8aba1f6a2eec5cdf3f8bec",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "guzzlehttp/guzzle": "^5.0|^6.0|^7.0",
+                "php": ">=5.6",
+                "symfony/http-foundation": "^2.7|^3.0|^4.0|^5.0"
+            },
+            "require-dev": {
+                "mockery/mockery": "~1.2",
+                "phpunit/phpunit": "^6.0|^7.0|^8.0|^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 that extracts from laravel/socialite.",
+            "keywords": [
+                "login",
+                "oauth",
+                "qq",
+                "social",
+                "wechat",
+                "weibo"
+            ],
+            "support": {
+                "issues": "https://github.com/overtrue/socialite/issues",
+                "source": "https://github.com/overtrue/socialite/tree/2.0.24"
+            },
+            "funding": [
+                {
+                    "url": "https://www.patreon.com/overtrue",
+                    "type": "patreon"
+                }
+            ],
+            "time": "2021-05-13T16:04:48+00:00"
+        },
+        {
+            "name": "overtrue/wechat",
+            "version": "4.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/w7corp/easywechat.git",
+                "reference": "04a940f97d6812a67bb8d5f2dbaebf9ad78ae776"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/w7corp/easywechat/zipball/04a940f97d6812a67bb8d5f2dbaebf9ad78ae776",
+                "reference": "04a940f97d6812a67bb8d5f2dbaebf9ad78ae776",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "easywechat-composer/easywechat-composer": "^1.1",
+                "ext-fileinfo": "*",
+                "ext-openssl": "*",
+                "ext-simplexml": "*",
+                "guzzlehttp/guzzle": "^6.2 || ^7.0",
+                "monolog/monolog": "^1.22 || ^2.0",
+                "overtrue/socialite": "~2.0",
+                "php": ">=7.2",
+                "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": {
+                "friendsofphp/php-cs-fixer": "^2.15",
+                "mikey179/vfsstream": "^1.6",
+                "mockery/mockery": "^1.2.3",
+                "phpstan/phpstan": "^0.12.0",
+                "phpunit/phpunit": "^7.5"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/Kernel/Support/Helpers.php",
+                    "src/Kernel/Helpers.php"
+                ],
+                "psr-4": {
+                    "EasyWeChat\\": "src/"
+                }
+            },
+            "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/4.5.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/overtrue",
+                    "type": "github"
+                }
+            ],
+            "time": "2021-12-27T13:56:47+00:00"
+        },
+        {
+            "name": "php-open-source-saver/jwt-auth",
+            "version": "1.4.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/PHP-Open-Source-Saver/jwt-auth.git",
+                "reference": "5fd8c185453d875835c24d4ce50be7396af6ae14"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/PHP-Open-Source-Saver/jwt-auth/zipball/5fd8c185453d875835c24d4ce50be7396af6ae14",
+                "reference": "5fd8c185453d875835c24d4ce50be7396af6ae14",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "illuminate/auth": "^6|^7|^8.67|^9",
+                "illuminate/contracts": "^6|^7|^8.67|^9",
+                "illuminate/http": "^6|^7|^8.67|^9",
+                "illuminate/support": "^6|^7|^8.67|^9",
+                "lcobucci/jwt": "^4.0",
+                "namshi/jose": "^7.0",
+                "nesbot/carbon": "^1.0|^2.0",
+                "php": "^7.4|^8.0"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^3",
+                "illuminate/console": "^6|^7|^8.67|^9",
+                "illuminate/routing": "^6|^7|^8.67|^9",
+                "mockery/mockery": "^1.4.4",
+                "orchestra/testbench": "^4.18|^5.8|^6.3|^7",
+                "phpstan/phpstan": "^1",
+                "phpunit/phpunit": "^8.5|^9.4",
+                "rector/rector": "^0.12.4",
+                "vlucas/phpdotenv": "^5.2.0",
+                "yoast/phpunit-polyfills": "^1.0.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-develop": "1.0-dev"
+                },
+                "laravel": {
+                    "aliases": {
+                        "JWTAuth": "PHPOpenSourceSaver\\JWTAuth\\Facades\\JWTAuth",
+                        "JWTFactory": "PHPOpenSourceSaver\\JWTAuth\\Facades\\JWTFactory"
+                    },
+                    "providers": [
+                        "PHPOpenSourceSaver\\JWTAuth\\Providers\\LaravelServiceProvider"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "PHPOpenSourceSaver\\JWTAuth\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Sean Tymon",
+                    "email": "tymon148@gmail.com",
+                    "homepage": "https://tymon.xyz",
+                    "role": "Forked package creator | Developer"
+                },
+                {
+                    "name": "Eric Schricker",
+                    "email": "eric.schricker@adiutabyte.de",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Fabio William Conceição",
+                    "email": "messhias@gmail.com",
+                    "role": "Developer"
+                }
+            ],
+            "description": "JSON Web Token Authentication for Laravel and Lumen",
+            "homepage": "https://github.com/PHP-Open-Source-Saver/jwt-auth",
+            "keywords": [
+                "Authentication",
+                "JSON Web Token",
+                "auth",
+                "jwt",
+                "laravel"
+            ],
+            "support": {
+                "issues": "https://github.com/PHP-Open-Source-Saver/jwt-auth/issues",
+                "source": "https://github.com/PHP-Open-Source-Saver/jwt-auth"
+            },
+            "time": "2022-04-22T06:31:30+00:00"
+        },
+        {
+            "name": "phpdocumentor/reflection-common",
+            "version": "2.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+                "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+                "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.2 || ^8.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-2.x": "2.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "phpDocumentor\\Reflection\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jaap van Otterdijk",
+                    "email": "opensource@ijaap.nl"
+                }
+            ],
+            "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+            "homepage": "http://www.phpdoc.org",
+            "keywords": [
+                "FQSEN",
+                "phpDocumentor",
+                "phpdoc",
+                "reflection",
+                "static analysis"
+            ],
+            "support": {
+                "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
+                "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
+            },
+            "time": "2020-06-27T09:03:43+00:00"
+        },
+        {
+            "name": "phpdocumentor/reflection-docblock",
+            "version": "5.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+                "reference": "622548b623e81ca6d78b721c5e029f4ce664f170"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170",
+                "reference": "622548b623e81ca6d78b721c5e029f4ce664f170",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-filter": "*",
+                "php": "^7.2 || ^8.0",
+                "phpdocumentor/reflection-common": "^2.2",
+                "phpdocumentor/type-resolver": "^1.3",
+                "webmozart/assert": "^1.9.1"
+            },
+            "require-dev": {
+                "mockery/mockery": "~1.3.2",
+                "psalm/phar": "^4.8"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "phpDocumentor\\Reflection\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Mike van Riel",
+                    "email": "me@mikevanriel.com"
+                },
+                {
+                    "name": "Jaap van Otterdijk",
+                    "email": "account@ijaap.nl"
+                }
+            ],
+            "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+            "support": {
+                "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
+                "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0"
+            },
+            "time": "2021-10-19T17:43:47+00:00"
+        },
+        {
+            "name": "phpdocumentor/type-resolver",
+            "version": "1.6.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpDocumentor/TypeResolver.git",
+                "reference": "77a32518733312af16a44300404e945338981de3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3",
+                "reference": "77a32518733312af16a44300404e945338981de3",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.2 || ^8.0",
+                "phpdocumentor/reflection-common": "^2.0"
+            },
+            "require-dev": {
+                "ext-tokenizer": "*",
+                "psalm/phar": "^4.8"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-1.x": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "phpDocumentor\\Reflection\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Mike van Riel",
+                    "email": "me@mikevanriel.com"
+                }
+            ],
+            "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
+            "support": {
+                "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
+                "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1"
+            },
+            "time": "2022-03-15T21:29:03+00:00"
+        },
+        {
+            "name": "phpoption/phpoption",
+            "version": "1.8.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/schmittjoh/php-option.git",
+                "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15",
+                "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.0 || ^8.0"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.4.1",
+                "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "PhpOption\\": "src/PhpOption/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Johannes M. Schmitt",
+                    "email": "schmittjoh@gmail.com",
+                    "homepage": "https://github.com/schmittjoh"
+                },
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                }
+            ],
+            "description": "Option Type for PHP",
+            "keywords": [
+                "language",
+                "option",
+                "php",
+                "type"
+            ],
+            "support": {
+                "issues": "https://github.com/schmittjoh/php-option/issues",
+                "source": "https://github.com/schmittjoh/php-option/tree/1.8.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/GrahamCampbell",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2021-12-04T23:24:31+00:00"
+        },
+        {
+            "name": "pimple/pimple",
+            "version": "v3.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/silexphp/Pimple.git",
+                "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed",
+                "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "psr/container": "^1.1 || ^2.0"
+            },
+            "require-dev": {
+                "symfony/phpunit-bridge": "^5.4@dev"
+            },
+            "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.5.0"
+            },
+            "time": "2021-10-28T11:13:42+00:00"
+        },
+        {
+            "name": "prettus/l5-repository",
+            "version": "2.8.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/andersao/l5-repository.git",
+                "reference": "bdaf12dcf1fcc2637ccbe06999f789a9ff522fea"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/andersao/l5-repository/zipball/bdaf12dcf1fcc2637ccbe06999f789a9ff522fea",
+                "reference": "bdaf12dcf1fcc2637ccbe06999f789a9ff522fea",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "illuminate/config": "~5.0|~6.0|~7.0|^8.0|^9.0",
+                "illuminate/console": "~5.0|~6.0|~7.0|^8.0|^9.0",
+                "illuminate/database": "~5.0|~6.0|~7.0|^8.0|^9.0",
+                "illuminate/filesystem": "~5.0|~6.0|~7.0|^8.0|^9.0",
+                "illuminate/http": "~5.0|~6.0|~7.0|^8.0|^9.0",
+                "illuminate/pagination": "~5.0|~6.0|~7.0|^8.0|^9.0",
+                "illuminate/support": "~5.0|~6.0|~7.0|^8.0|^9.0",
+                "illuminate/validation": "~5.0|~6.0|~7.0|^8.0|^9.0",
+                "prettus/laravel-validation": "~1.1|~1.2|~1.3|~1.4"
+            },
+            "suggest": {
+                "league/fractal": "Required to use the Fractal Presenter (0.12.*).",
+                "prettus/laravel-validation": "Required to provide easy validation with the repository (1.1.*)",
+                "robclancy/presenter": "Required to use the Presenter Model (1.3.*)"
+            },
+            "type": "library",
+            "extra": {
+                "laravel": {
+                    "providers": [
+                        "Prettus\\Repository\\Providers\\RepositoryServiceProvider"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Prettus\\Repository\\": "src/Prettus/Repository/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Anderson Andrade",
+                    "email": "contato@andersonandra.de",
+                    "homepage": "http://andersonandra.de",
+                    "role": "Developer"
+                }
+            ],
+            "description": "Laravel 5|6|7|8|9 - Repositories to  the database layer",
+            "homepage": "http://andersao.github.io/l5-repository",
+            "keywords": [
+                "cache",
+                "eloquent",
+                "laravel",
+                "model",
+                "repository"
+            ],
+            "support": {
+                "docs": "http://andersao.github.io/l5-repository",
+                "email": "contato@andersonandra.de",
+                "issues": "https://github.com/andersao/l5-repository/issues",
+                "source": "https://github.com/andersao/l5-repository",
+                "wiki": "https://github.com/andersao/l5-repository"
+            },
+            "time": "2022-02-21T11:19:35+00:00"
+        },
+        {
+            "name": "prettus/laravel-validation",
+            "version": "1.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/andersao/laravel-validator.git",
+                "reference": "45d6b64e35d966aa0866d6f5fd22ecbb33ea41d9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/andersao/laravel-validator/zipball/45d6b64e35d966aa0866d6f5fd22ecbb33ea41d9",
+                "reference": "45d6b64e35d966aa0866d6f5fd22ecbb33ea41d9",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "illuminate/support": "~5.4|^6.0|^7.0|^8.0|^9.0",
+                "illuminate/validation": "~5.4|^6.0|^7.0|^8.0|^9.0",
+                "php": ">=5.4.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Prettus\\Validator\\": "src/Prettus/Validator/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "authors": [
+                {
+                    "name": "Anderson Andrade",
+                    "email": "contato@andersonandra.de",
+                    "homepage": "http://andersonandra.de",
+                    "role": "Developer"
+                }
+            ],
+            "description": "Laravel Validation Service",
+            "homepage": "http://andersao.github.io/laravel-validation",
+            "keywords": [
+                "laravel",
+                "service",
+                "validation"
+            ],
+            "support": {
+                "docs": "http://andersao.github.io/laravel-validation",
+                "email": "contato@andersonandra.de",
+                "issues": "https://github.com/andersao/laravel-validation/issues",
+                "source": "https://github.com/andersao/laravel-validation",
+                "wiki": "https://github.com/andersao/laravel-validation"
+            },
+            "time": "2022-02-21T11:18:30+00:00"
+        },
+        {
+            "name": "psr/cache",
+            "version": "2.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/cache.git",
+                "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/cache/zipball/213f9dbc5b9bfbc4f8db86d2838dc968752ce13b",
+                "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=8.0.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": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for caching libraries",
+            "keywords": [
+                "cache",
+                "psr",
+                "psr-6"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/cache/tree/2.0.0"
+            },
+            "time": "2021-02-03T23:23:37+00:00"
+        },
+        {
+            "name": "psr/container",
+            "version": "1.1.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/container.git",
+                "reference": "513e0666f7216c7459170d56df27dfcefe1689ea"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea",
+                "reference": "513e0666f7216c7459170d56df27dfcefe1689ea",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.4.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.2"
+            },
+            "time": "2021-11-05T16:50:12+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": "2.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/log.git",
+                "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376",
+                "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=8.0.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Log\\": "src"
+                }
+            },
+            "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/2.0.0"
+            },
+            "time": "2021-07-14T16:41:46+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": "psy/psysh",
+            "version": "v0.11.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/bobthecow/psysh.git",
+                "reference": "3f5b5f8aaa979fbd0d1783173f4c82ad529fe621"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/bobthecow/psysh/zipball/3f5b5f8aaa979fbd0d1783173f4c82ad529fe621",
+                "reference": "3f5b5f8aaa979fbd0d1783173f4c82ad529fe621",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "ext-tokenizer": "*",
+                "nikic/php-parser": "^4.0 || ^3.1",
+                "php": "^8.0 || ^7.0.8",
+                "symfony/console": "^6.0 || ^5.0 || ^4.0 || ^3.4",
+                "symfony/var-dumper": "^6.0 || ^5.0 || ^4.0 || ^3.4"
+            },
+            "conflict": {
+                "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.2"
+            },
+            "suggest": {
+                "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)",
+                "ext-pdo-sqlite": "The doc command requires SQLite to work.",
+                "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.",
+                "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history."
+            },
+            "bin": [
+                "bin/psysh"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "0.11.x-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/functions.php"
+                ],
+                "psr-4": {
+                    "Psy\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Justin Hileman",
+                    "email": "justin@justinhileman.info",
+                    "homepage": "http://justinhileman.com"
+                }
+            ],
+            "description": "An interactive shell for modern PHP.",
+            "homepage": "http://psysh.org",
+            "keywords": [
+                "REPL",
+                "console",
+                "interactive",
+                "shell"
+            ],
+            "support": {
+                "issues": "https://github.com/bobthecow/psysh/issues",
+                "source": "https://github.com/bobthecow/psysh/tree/v0.11.6"
+            },
+            "time": "2022-07-03T16:40:23+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": "ramsey/collection",
+            "version": "1.2.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/ramsey/collection.git",
+                "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/ramsey/collection/zipball/cccc74ee5e328031b15640b51056ee8d3bb66c0a",
+                "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.3 || ^8",
+                "symfony/polyfill-php81": "^1.23"
+            },
+            "require-dev": {
+                "captainhook/captainhook": "^5.3",
+                "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
+                "ergebnis/composer-normalize": "^2.6",
+                "fakerphp/faker": "^1.5",
+                "hamcrest/hamcrest-php": "^2",
+                "jangregor/phpstan-prophecy": "^0.8",
+                "mockery/mockery": "^1.3",
+                "phpspec/prophecy-phpunit": "^2.0",
+                "phpstan/extension-installer": "^1",
+                "phpstan/phpstan": "^0.12.32",
+                "phpstan/phpstan-mockery": "^0.12.5",
+                "phpstan/phpstan-phpunit": "^0.12.11",
+                "phpunit/phpunit": "^8.5 || ^9",
+                "psy/psysh": "^0.10.4",
+                "slevomat/coding-standard": "^6.3",
+                "squizlabs/php_codesniffer": "^3.5",
+                "vimeo/psalm": "^4.4"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Ramsey\\Collection\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ben Ramsey",
+                    "email": "ben@benramsey.com",
+                    "homepage": "https://benramsey.com"
+                }
+            ],
+            "description": "A PHP library for representing and manipulating collections.",
+            "keywords": [
+                "array",
+                "collection",
+                "hash",
+                "map",
+                "queue",
+                "set"
+            ],
+            "support": {
+                "issues": "https://github.com/ramsey/collection/issues",
+                "source": "https://github.com/ramsey/collection/tree/1.2.2"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/ramsey",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/ramsey/collection",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2021-10-10T03:01:02+00:00"
+        },
+        {
+            "name": "ramsey/uuid",
+            "version": "4.3.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/ramsey/uuid.git",
+                "reference": "8505afd4fea63b81a85d3b7b53ac3cb8dc347c28"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/ramsey/uuid/zipball/8505afd4fea63b81a85d3b7b53ac3cb8dc347c28",
+                "reference": "8505afd4fea63b81a85d3b7b53ac3cb8dc347c28",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "brick/math": "^0.8 || ^0.9",
+                "ext-ctype": "*",
+                "ext-json": "*",
+                "php": "^8.0",
+                "ramsey/collection": "^1.0"
+            },
+            "replace": {
+                "rhumsaa/uuid": "self.version"
+            },
+            "require-dev": {
+                "captainhook/captainhook": "^5.10",
+                "captainhook/plugin-composer": "^5.3",
+                "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
+                "doctrine/annotations": "^1.8",
+                "ergebnis/composer-normalize": "^2.15",
+                "mockery/mockery": "^1.3",
+                "moontoast/math": "^1.1",
+                "paragonie/random-lib": "^2",
+                "php-mock/php-mock": "^2.2",
+                "php-mock/php-mock-mockery": "^1.3",
+                "php-parallel-lint/php-parallel-lint": "^1.1",
+                "phpbench/phpbench": "^1.0",
+                "phpstan/extension-installer": "^1.0",
+                "phpstan/phpstan": "^0.12",
+                "phpstan/phpstan-mockery": "^0.12",
+                "phpstan/phpstan-phpunit": "^0.12",
+                "phpunit/phpunit": "^8.5 || ^9",
+                "slevomat/coding-standard": "^7.0",
+                "squizlabs/php_codesniffer": "^3.5",
+                "vimeo/psalm": "^4.9"
+            },
+            "suggest": {
+                "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.",
+                "ext-ctype": "Enables faster processing of character classification using ctype functions.",
+                "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.",
+                "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.",
+                "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter",
+                "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type."
+            },
+            "type": "library",
+            "extra": {
+                "captainhook": {
+                    "force-install": true
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/functions.php"
+                ],
+                "psr-4": {
+                    "Ramsey\\Uuid\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).",
+            "keywords": [
+                "guid",
+                "identifier",
+                "uuid"
+            ],
+            "support": {
+                "issues": "https://github.com/ramsey/uuid/issues",
+                "source": "https://github.com/ramsey/uuid/tree/4.3.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/ramsey",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-03-27T21:42:02+00:00"
+        },
+        {
+            "name": "socialiteproviders/facebook",
+            "version": "4.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/SocialiteProviders/Facebook.git",
+                "reference": "9b94a9334b5d0f61de8f5a20928d63d4d8f4e00d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/SocialiteProviders/Facebook/zipball/9b94a9334b5d0f61de8f5a20928d63d4d8f4e00d",
+                "reference": "9b94a9334b5d0f61de8f5a20928d63d4d8f4e00d",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "php": "^7.2 || ^8.0",
+                "socialiteproviders/manager": "~4.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "SocialiteProviders\\Facebook\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Oleksandr Prypkhan (Alex Wells)",
+                    "email": "autaut03@googlemail.com"
+                }
+            ],
+            "description": "Facebook (facebook.com) OAuth2 Provider for Laravel Socialite",
+            "support": {
+                "source": "https://github.com/SocialiteProviders/Facebook/tree/4.1.0"
+            },
+            "time": "2020-12-01T23:10:59+00:00"
+        },
+        {
+            "name": "socialiteproviders/manager",
+            "version": "v4.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/SocialiteProviders/Manager.git",
+                "reference": "4e63afbd26dc45ff263591de2a0970436a6a0bf9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/4e63afbd26dc45ff263591de2a0970436a6a0bf9",
+                "reference": "4e63afbd26dc45ff263591de2a0970436a6a0bf9",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "illuminate/support": "^6.0 || ^7.0 || ^8.0 || ^9.0",
+                "laravel/socialite": "~4.0 || ~5.0",
+                "php": "^7.2 || ^8.0"
+            },
+            "require-dev": {
+                "mockery/mockery": "^1.2",
+                "phpunit/phpunit": "^6.0 || ^9.0"
+            },
+            "type": "library",
+            "extra": {
+                "laravel": {
+                    "providers": [
+                        "SocialiteProviders\\Manager\\ServiceProvider"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "SocialiteProviders\\Manager\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Andy Wendt",
+                    "email": "andy@awendt.com"
+                },
+                {
+                    "name": "Anton Komarev",
+                    "email": "a.komarev@cybercog.su"
+                },
+                {
+                    "name": "Miguel Piedrafita",
+                    "email": "soy@miguelpiedrafita.com"
+                },
+                {
+                    "name": "atymic",
+                    "email": "atymicq@gmail.com",
+                    "homepage": "https://atymic.dev"
+                }
+            ],
+            "description": "Easily add new or override built-in providers in Laravel Socialite.",
+            "homepage": "https://socialiteproviders.com",
+            "keywords": [
+                "laravel",
+                "manager",
+                "oauth",
+                "providers",
+                "socialite"
+            ],
+            "support": {
+                "issues": "https://github.com/socialiteproviders/manager/issues",
+                "source": "https://github.com/socialiteproviders/manager"
+            },
+            "time": "2022-01-23T22:40:23+00:00"
+        },
+        {
+            "name": "socialiteproviders/weixin",
+            "version": "4.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/SocialiteProviders/Weixin.git",
+                "reference": "4f5ca3ee25e1a46e0dc6bb00bd6ba77f344e340f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/SocialiteProviders/Weixin/zipball/4f5ca3ee25e1a46e0dc6bb00bd6ba77f344e340f",
+                "reference": "4f5ca3ee25e1a46e0dc6bb00bd6ba77f344e340f",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-json": "*",
+                "php": "^7.2 || ^8.0",
+                "socialiteproviders/manager": "~4.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "SocialiteProviders\\Weixin\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "xyxu",
+                    "email": "techxu@gmail.com"
+                },
+                {
+                    "name": "xiami",
+                    "email": "jhdxr@php.net"
+                }
+            ],
+            "description": "Weixin OAuth2 Provider for Laravel Socialite",
+            "support": {
+                "source": "https://github.com/SocialiteProviders/Weixin/tree/4.1.0"
+            },
+            "time": "2020-12-01T23:10:59+00:00"
+        },
+        {
+            "name": "spatie/eloquent-sortable",
+            "version": "4.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/spatie/eloquent-sortable.git",
+                "reference": "64a3365c0d5a7b4a1837b2f29d01ee4c578c416a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/spatie/eloquent-sortable/zipball/64a3365c0d5a7b4a1837b2f29d01ee4c578c416a",
+                "reference": "64a3365c0d5a7b4a1837b2f29d01ee4c578c416a",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "illuminate/database": "^8.0|^9.0",
+                "illuminate/support": "^8.0|^9.0",
+                "php": "^8.0",
+                "spatie/laravel-package-tools": "^1.9"
+            },
+            "require-dev": {
+                "orchestra/testbench": "^6.0|^7.0",
+                "phpunit/phpunit": "^9.5"
+            },
+            "type": "library",
+            "extra": {
+                "laravel": {
+                    "providers": [
+                        "Spatie\\EloquentSortable\\EloquentSortableServiceProvider"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Spatie\\EloquentSortable\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Freek Van der Herten",
+                    "email": "freek@spatie.be"
+                }
+            ],
+            "description": "Sortable behaviour for eloquent models",
+            "homepage": "https://github.com/spatie/eloquent-sortable",
+            "keywords": [
+                "behaviour",
+                "eloquent",
+                "laravel",
+                "model",
+                "sort",
+                "sortable"
+            ],
+            "support": {
+                "issues": "https://github.com/spatie/eloquent-sortable/issues",
+                "source": "https://github.com/spatie/eloquent-sortable/tree/4.0.1"
+            },
+            "funding": [
+                {
+                    "url": "https://spatie.be/open-source/support-us",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/spatie",
+                    "type": "github"
+                }
+            ],
+            "time": "2022-01-21T08:32:41+00:00"
+        },
+        {
+            "name": "spatie/laravel-package-tools",
+            "version": "1.12.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/spatie/laravel-package-tools.git",
+                "reference": "09f80fa240d44fafb1c70657c74ee44ffa929357"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/09f80fa240d44fafb1c70657c74ee44ffa929357",
+                "reference": "09f80fa240d44fafb1c70657c74ee44ffa929357",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "illuminate/contracts": "^7.0|^8.0|^9.0",
+                "php": "^7.4|^8.0"
+            },
+            "require-dev": {
+                "mockery/mockery": "^1.4",
+                "orchestra/testbench": "^5.0|^6.23|^7.0",
+                "phpunit/phpunit": "^9.4",
+                "spatie/test-time": "^1.2"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Spatie\\LaravelPackageTools\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Freek Van der Herten",
+                    "email": "freek@spatie.be",
+                    "role": "Developer"
+                }
+            ],
+            "description": "Tools for creating Laravel packages",
+            "homepage": "https://github.com/spatie/laravel-package-tools",
+            "keywords": [
+                "laravel-package-tools",
+                "spatie"
+            ],
+            "support": {
+                "issues": "https://github.com/spatie/laravel-package-tools/issues",
+                "source": "https://github.com/spatie/laravel-package-tools/tree/1.12.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/spatie",
+                    "type": "github"
+                }
+            ],
+            "time": "2022-06-28T14:29:26+00:00"
+        },
+        {
+            "name": "stella-maris/clock",
+            "version": "0.1.4",
+            "source": {
+                "type": "git",
+                "url": "https://gitlab.com/stella-maris/clock.git",
+                "reference": "8a0a967896df4c63417385dc69328a0aec84d9cf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://gitlab.com/api/v4/projects/stella-maris%2Fclock/repository/archive.zip?sha=8a0a967896df4c63417385dc69328a0aec84d9cf",
+                "reference": "8a0a967896df4c63417385dc69328a0aec84d9cf",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.0|^8.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "StellaMaris\\Clock\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Andreas Heigl",
+                    "role": "Maintainer"
+                }
+            ],
+            "description": "A pre-release of the proposed PSR-20 Clock-Interface",
+            "homepage": "https://gitlab.com/stella-maris/clock",
+            "keywords": [
+                "clock",
+                "datetime",
+                "point in time",
+                "psr20"
+            ],
+            "support": {
+                "issues": "https://gitlab.com/stella-maris/clock/-/issues",
+                "source": "https://gitlab.com/stella-maris/clock/-/tree/0.1.4"
+            },
+            "time": "2022-04-17T14:12:26+00:00"
+        },
+        {
+            "name": "stomp-php/stomp-php",
+            "version": "5.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/stomp-php/stomp-php.git",
+                "reference": "50f6e6e9aa1ba4696faa40cd1cbe180a96679f98"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/stomp-php/stomp-php/zipball/50f6e6e9aa1ba4696faa40cd1cbe180a96679f98",
+                "reference": "50f6e6e9aa1ba4696faa40cd1cbe180a96679f98",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.3|^8.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Stomp\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Dejan Bosnanac",
+                    "email": "dejan@nighttale.net",
+                    "homepage": "http://www.nighttale.net"
+                },
+                {
+                    "name": "Sören Rohweder",
+                    "email": "s.rohweder@blage.net",
+                    "homepage": "http://www.monofone.de"
+                },
+                {
+                    "name": "Jens Radtke",
+                    "email": "swefl@fin-sn.de",
+                    "homepage": "http://www.fin-sn.de"
+                }
+            ],
+            "description": "stomp support for PHP",
+            "homepage": "http://github.com/stomp-php/stomp-php",
+            "keywords": [
+                "activeMQ",
+                "apollomq",
+                "jms",
+                "messaging",
+                "rabbitmq",
+                "stomp"
+            ],
+            "support": {
+                "issues": "https://github.com/stomp-php/stomp-php/issues",
+                "source": "https://github.com/stomp-php/stomp-php/tree/5.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/jmglsn",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/staabm",
+                    "type": "github"
+                }
+            ],
+            "time": "2021-02-02T19:25:59+00:00"
+        },
+        {
+            "name": "swiftmailer/swiftmailer",
+            "version": "v6.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/swiftmailer/swiftmailer.git",
+                "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/8a5d5072dca8f48460fce2f4131fcc495eec654c",
+                "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "egulias/email-validator": "^2.0|^3.1",
+                "php": ">=7.0.0",
+                "symfony/polyfill-iconv": "^1.0",
+                "symfony/polyfill-intl-idn": "^1.10",
+                "symfony/polyfill-mbstring": "^1.0"
+            },
+            "require-dev": {
+                "mockery/mockery": "^1.0",
+                "symfony/phpunit-bridge": "^4.4|^5.4"
+            },
+            "suggest": {
+                "ext-intl": "Needed to support internationalized email addresses"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "6.2-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "lib/swift_required.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Chris Corbyn"
+                },
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Swiftmailer, free feature-rich PHP mailer",
+            "homepage": "https://swiftmailer.symfony.com",
+            "keywords": [
+                "email",
+                "mail",
+                "mailer"
+            ],
+            "support": {
+                "issues": "https://github.com/swiftmailer/swiftmailer/issues",
+                "source": "https://github.com/swiftmailer/swiftmailer/tree/v6.3.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/swiftmailer/swiftmailer",
+                    "type": "tidelift"
+                }
+            ],
+            "abandoned": "symfony/mailer",
+            "time": "2021-10-18T15:26:12+00:00"
+        },
+        {
+            "name": "symfony/cache",
+            "version": "v5.4.10",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/cache.git",
+                "reference": "c4e387b739022fd4b20abd8edb2143c44c5daa14"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/cache/zipball/c4e387b739022fd4b20abd8edb2143c44c5daa14",
+                "reference": "c4e387b739022fd4b20abd8edb2143c44c5daa14",
+                "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|^3",
+                "symfony/polyfill-php73": "^1.9",
+                "symfony/polyfill-php80": "^1.16",
+                "symfony/service-contracts": "^1.1|^2|^3",
+                "symfony/var-exporter": "^4.4|^5.0|^6.0"
+            },
+            "conflict": {
+                "doctrine/dbal": "<2.13.1",
+                "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|2.0",
+                "symfony/cache-implementation": "1.0|2.0"
+            },
+            "require-dev": {
+                "cache/integration-tests": "dev-master",
+                "doctrine/cache": "^1.6|^2.0",
+                "doctrine/dbal": "^2.13.1|^3.0",
+                "predis/predis": "^1.1",
+                "psr/simple-cache": "^1.0|^2.0",
+                "symfony/config": "^4.4|^5.0|^6.0",
+                "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+                "symfony/filesystem": "^4.4|^5.0|^6.0",
+                "symfony/http-kernel": "^4.4|^5.0|^6.0",
+                "symfony/messenger": "^4.4|^5.0|^6.0",
+                "symfony/var-dumper": "^4.4|^5.0|^6.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.4.10"
+            },
+            "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": "2022-06-19T12:03:50+00:00"
+        },
+        {
+            "name": "symfony/cache-contracts",
+            "version": "v2.5.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/cache-contracts.git",
+                "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/64be4a7acb83b6f2bf6de9a02cee6dad41277ebc",
+                "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc",
+                "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.5-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.5.2"
+            },
+            "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": "2022-01-02T09:53:40+00:00"
+        },
+        {
+            "name": "symfony/console",
+            "version": "v5.4.10",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/console.git",
+                "reference": "4d671ab4ddac94ee439ea73649c69d9d200b5000"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/console/zipball/4d671ab4ddac94ee439ea73649c69d9d200b5000",
+                "reference": "4d671ab4ddac94ee439ea73649c69d9d200b5000",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "symfony/deprecation-contracts": "^2.1|^3",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/polyfill-php73": "^1.9",
+                "symfony/polyfill-php80": "^1.16",
+                "symfony/service-contracts": "^1.1|^2|^3",
+                "symfony/string": "^5.1|^6.0"
+            },
+            "conflict": {
+                "psr/log": ">=3",
+                "symfony/dependency-injection": "<4.4",
+                "symfony/dotenv": "<5.1",
+                "symfony/event-dispatcher": "<4.4",
+                "symfony/lock": "<4.4",
+                "symfony/process": "<4.4"
+            },
+            "provide": {
+                "psr/log-implementation": "1.0|2.0"
+            },
+            "require-dev": {
+                "psr/log": "^1|^2",
+                "symfony/config": "^4.4|^5.0|^6.0",
+                "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+                "symfony/event-dispatcher": "^4.4|^5.0|^6.0",
+                "symfony/lock": "^4.4|^5.0|^6.0",
+                "symfony/process": "^4.4|^5.0|^6.0",
+                "symfony/var-dumper": "^4.4|^5.0|^6.0"
+            },
+            "suggest": {
+                "psr/log": "For using the console logger",
+                "symfony/event-dispatcher": "",
+                "symfony/lock": "",
+                "symfony/process": ""
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Console\\": ""
+                },
+                "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": "Eases the creation of beautiful and testable command line interfaces",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "cli",
+                "command line",
+                "console",
+                "terminal"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/console/tree/v5.4.10"
+            },
+            "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": "2022-06-26T13:00:04+00:00"
+        },
+        {
+            "name": "symfony/css-selector",
+            "version": "v6.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/css-selector.git",
+                "reference": "1955d595c12c111629cc814d3f2a2ff13580508a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/css-selector/zipball/1955d595c12c111629cc814d3f2a2ff13580508a",
+                "reference": "1955d595c12c111629cc814d3f2a2ff13580508a",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=8.0.2"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\CssSelector\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Jean-François Simon",
+                    "email": "jeanfrancois.simon@sensiolabs.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Converts CSS selectors to XPath expressions",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/css-selector/tree/v6.0.3"
+            },
+            "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": "2022-01-02T09:55:41+00:00"
+        },
+        {
+            "name": "symfony/deprecation-contracts",
+            "version": "v3.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/deprecation-contracts.git",
+                "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
+                "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=8.0.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.0-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/v3.0.2"
+            },
+            "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": "2022-01-02T09:55:41+00:00"
+        },
+        {
+            "name": "symfony/error-handler",
+            "version": "v5.4.9",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/error-handler.git",
+                "reference": "c116cda1f51c678782768dce89a45f13c949455d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/error-handler/zipball/c116cda1f51c678782768dce89a45f13c949455d",
+                "reference": "c116cda1f51c678782768dce89a45f13c949455d",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "psr/log": "^1|^2|^3",
+                "symfony/var-dumper": "^4.4|^5.0|^6.0"
+            },
+            "require-dev": {
+                "symfony/deprecation-contracts": "^2.1|^3",
+                "symfony/http-kernel": "^4.4|^5.0|^6.0",
+                "symfony/serializer": "^4.4|^5.0|^6.0"
+            },
+            "bin": [
+                "Resources/bin/patch-type-declarations"
+            ],
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\ErrorHandler\\": ""
+                },
+                "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 manage errors and ease debugging PHP code",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/error-handler/tree/v5.4.9"
+            },
+            "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": "2022-05-21T13:57:48+00:00"
+        },
+        {
+            "name": "symfony/event-dispatcher",
+            "version": "v5.4.9",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/event-dispatcher.git",
+                "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc",
+                "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "symfony/deprecation-contracts": "^2.1|^3",
+                "symfony/event-dispatcher-contracts": "^2|^3",
+                "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|^6.0",
+                "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+                "symfony/error-handler": "^4.4|^5.0|^6.0",
+                "symfony/expression-language": "^4.4|^5.0|^6.0",
+                "symfony/http-foundation": "^4.4|^5.0|^6.0",
+                "symfony/service-contracts": "^1.1|^2|^3",
+                "symfony/stopwatch": "^4.4|^5.0|^6.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.4.9"
+            },
+            "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": "2022-05-05T16:45:39+00:00"
+        },
+        {
+            "name": "symfony/event-dispatcher-contracts",
+            "version": "v3.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/event-dispatcher-contracts.git",
+                "reference": "7bc61cc2db649b4637d331240c5346dcc7708051"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7bc61cc2db649b4637d331240c5346dcc7708051",
+                "reference": "7bc61cc2db649b4637d331240c5346dcc7708051",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=8.0.2",
+                "psr/event-dispatcher": "^1"
+            },
+            "suggest": {
+                "symfony/event-dispatcher-implementation": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.0-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/v3.0.2"
+            },
+            "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": "2022-01-02T09:55:41+00:00"
+        },
+        {
+            "name": "symfony/finder",
+            "version": "v5.4.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/finder.git",
+                "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/9b630f3427f3ebe7cd346c277a1408b00249dad9",
+                "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "symfony/deprecation-contracts": "^2.1|^3",
+                "symfony/polyfill-php80": "^1.16"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Finder\\": ""
+                },
+                "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": "Finds files and directories via an intuitive fluent interface",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/finder/tree/v5.4.8"
+            },
+            "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": "2022-04-15T08:07:45+00:00"
+        },
+        {
+            "name": "symfony/http-foundation",
+            "version": "v5.4.10",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/http-foundation.git",
+                "reference": "e7793b7906f72a8cc51054fbca9dcff7a8af1c1e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e7793b7906f72a8cc51054fbca9dcff7a8af1c1e",
+                "reference": "e7793b7906f72a8cc51054fbca9dcff7a8af1c1e",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "symfony/deprecation-contracts": "^2.1|^3",
+                "symfony/polyfill-mbstring": "~1.1",
+                "symfony/polyfill-php80": "^1.16"
+            },
+            "require-dev": {
+                "predis/predis": "~1.0",
+                "symfony/cache": "^4.4|^5.0|^6.0",
+                "symfony/expression-language": "^4.4|^5.0|^6.0",
+                "symfony/mime": "^4.4|^5.0|^6.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.4.10"
+            },
+            "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": "2022-06-19T13:13:40+00:00"
+        },
+        {
+            "name": "symfony/http-kernel",
+            "version": "v5.4.10",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/http-kernel.git",
+                "reference": "255ae3b0a488d78fbb34da23d3e0c059874b5948"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/255ae3b0a488d78fbb34da23d3e0c059874b5948",
+                "reference": "255ae3b0a488d78fbb34da23d3e0c059874b5948",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "psr/log": "^1|^2",
+                "symfony/deprecation-contracts": "^2.1|^3",
+                "symfony/error-handler": "^4.4|^5.0|^6.0",
+                "symfony/event-dispatcher": "^5.0|^6.0",
+                "symfony/http-foundation": "^5.3.7|^6.0",
+                "symfony/polyfill-ctype": "^1.8",
+                "symfony/polyfill-php73": "^1.9",
+                "symfony/polyfill-php80": "^1.16"
+            },
+            "conflict": {
+                "symfony/browser-kit": "<5.4",
+                "symfony/cache": "<5.0",
+                "symfony/config": "<5.0",
+                "symfony/console": "<4.4",
+                "symfony/dependency-injection": "<5.3",
+                "symfony/doctrine-bridge": "<5.0",
+                "symfony/form": "<5.0",
+                "symfony/http-client": "<5.0",
+                "symfony/mailer": "<5.0",
+                "symfony/messenger": "<5.0",
+                "symfony/translation": "<5.0",
+                "symfony/twig-bridge": "<5.0",
+                "symfony/validator": "<5.0",
+                "twig/twig": "<2.13"
+            },
+            "provide": {
+                "psr/log-implementation": "1.0|2.0"
+            },
+            "require-dev": {
+                "psr/cache": "^1.0|^2.0|^3.0",
+                "symfony/browser-kit": "^5.4|^6.0",
+                "symfony/config": "^5.0|^6.0",
+                "symfony/console": "^4.4|^5.0|^6.0",
+                "symfony/css-selector": "^4.4|^5.0|^6.0",
+                "symfony/dependency-injection": "^5.3|^6.0",
+                "symfony/dom-crawler": "^4.4|^5.0|^6.0",
+                "symfony/expression-language": "^4.4|^5.0|^6.0",
+                "symfony/finder": "^4.4|^5.0|^6.0",
+                "symfony/http-client-contracts": "^1.1|^2|^3",
+                "symfony/process": "^4.4|^5.0|^6.0",
+                "symfony/routing": "^4.4|^5.0|^6.0",
+                "symfony/stopwatch": "^4.4|^5.0|^6.0",
+                "symfony/translation": "^4.4|^5.0|^6.0",
+                "symfony/translation-contracts": "^1.1|^2|^3",
+                "twig/twig": "^2.13|^3.0.4"
+            },
+            "suggest": {
+                "symfony/browser-kit": "",
+                "symfony/config": "",
+                "symfony/console": "",
+                "symfony/dependency-injection": ""
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\HttpKernel\\": ""
+                },
+                "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 a structured process for converting a Request into a Response",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/http-kernel/tree/v5.4.10"
+            },
+            "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": "2022-06-26T16:57:59+00:00"
+        },
+        {
+            "name": "symfony/mime",
+            "version": "v5.4.10",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/mime.git",
+                "reference": "02265e1e5111c3cd7480387af25e82378b7ab9cc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/mime/zipball/02265e1e5111c3cd7480387af25e82378b7ab9cc",
+                "reference": "02265e1e5111c3cd7480387af25e82378b7ab9cc",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "symfony/deprecation-contracts": "^2.1|^3",
+                "symfony/polyfill-intl-idn": "^1.10",
+                "symfony/polyfill-mbstring": "^1.0",
+                "symfony/polyfill-php80": "^1.16"
+            },
+            "conflict": {
+                "egulias/email-validator": "~3.0.0",
+                "phpdocumentor/reflection-docblock": "<3.2.2",
+                "phpdocumentor/type-resolver": "<1.4.0",
+                "symfony/mailer": "<4.4"
+            },
+            "require-dev": {
+                "egulias/email-validator": "^2.1.10|^3.1",
+                "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
+                "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+                "symfony/property-access": "^4.4|^5.1|^6.0",
+                "symfony/property-info": "^4.4|^5.1|^6.0",
+                "symfony/serializer": "^5.2|^6.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Mime\\": ""
+                },
+                "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": "Allows manipulating MIME messages",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "mime",
+                "mime-type"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/mime/tree/v5.4.10"
+            },
+            "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": "2022-06-09T12:22:40+00:00"
+        },
+        {
+            "name": "symfony/polyfill-ctype",
+            "version": "v1.26.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-ctype.git",
+                "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4",
+                "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "provide": {
+                "ext-ctype": "*"
+            },
+            "suggest": {
+                "ext-ctype": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.26-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Ctype\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Gert de Pagter",
+                    "email": "BackEndTea@gmail.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for ctype functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "ctype",
+                "polyfill",
+                "portable"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.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": "2022-05-24T11:49:31+00:00"
+        },
+        {
+            "name": "symfony/polyfill-iconv",
+            "version": "v1.26.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-iconv.git",
+                "reference": "143f1881e655bebca1312722af8068de235ae5dc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/143f1881e655bebca1312722af8068de235ae5dc",
+                "reference": "143f1881e655bebca1312722af8068de235ae5dc",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "provide": {
+                "ext-iconv": "*"
+            },
+            "suggest": {
+                "ext-iconv": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.26-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Iconv\\": ""
+                }
+            },
+            "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 Iconv extension",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "iconv",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-iconv/tree/v1.26.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": "2022-05-24T11:49:31+00:00"
+        },
+        {
+            "name": "symfony/polyfill-intl-grapheme",
+            "version": "v1.26.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+                "reference": "433d05519ce6990bf3530fba6957499d327395c2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2",
+                "reference": "433d05519ce6990bf3530fba6957499d327395c2",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "suggest": {
+                "ext-intl": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.26-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+                }
+            },
+            "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 intl's grapheme_* functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "grapheme",
+                "intl",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.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": "2022-05-24T11:49:31+00:00"
+        },
+        {
+            "name": "symfony/polyfill-intl-idn",
+            "version": "v1.26.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-intl-idn.git",
+                "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/59a8d271f00dd0e4c2e518104cc7963f655a1aa8",
+                "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1",
+                "symfony/polyfill-intl-normalizer": "^1.10",
+                "symfony/polyfill-php72": "^1.10"
+            },
+            "suggest": {
+                "ext-intl": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.26-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Intl\\Idn\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Laurent Bassin",
+                    "email": "laurent@bassin.info"
+                },
+                {
+                    "name": "Trevor Rowbotham",
+                    "email": "trevor.rowbotham@pm.me"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "idn",
+                "intl",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.26.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": "2022-05-24T11:49:31+00:00"
+        },
+        {
+            "name": "symfony/polyfill-intl-normalizer",
+            "version": "v1.26.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+                "reference": "219aa369ceff116e673852dce47c3a41794c14bd"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd",
+                "reference": "219aa369ceff116e673852dce47c3a41794c14bd",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "suggest": {
+                "ext-intl": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.26-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+                },
+                "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 for intl's Normalizer class and related functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "intl",
+                "normalizer",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.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": "2022-05-24T11:49:31+00:00"
+        },
+        {
+            "name": "symfony/polyfill-mbstring",
+            "version": "v1.26.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-mbstring.git",
+                "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
+                "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "provide": {
+                "ext-mbstring": "*"
+            },
+            "suggest": {
+                "ext-mbstring": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.26-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Mbstring\\": ""
+                }
+            },
+            "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.26.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": "2022-05-24T11:49:31+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php56",
+            "version": "v1.20.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php56.git",
+                "reference": "54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675",
+                "reference": "54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "metapackage",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.20-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-php56/tree/v1.20.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": "2020-10-23T14:02:19+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php72",
+            "version": "v1.26.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php72.git",
+                "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/bf44a9fd41feaac72b074de600314a93e2ae78e2",
+                "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2",
+                "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.26-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php72\\": ""
+                }
+            },
+            "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.26.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": "2022-05-24T11:49:31+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php73",
+            "version": "v1.26.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php73.git",
+                "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85",
+                "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85",
+                "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.26-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php73\\": ""
+                },
+                "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.26.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": "2022-05-24T11:49:31+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php80",
+            "version": "v1.26.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php80.git",
+                "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace",
+                "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace",
+                "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.26-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php80\\": ""
+                },
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ion Bazan",
+                    "email": "ion.bazan@gmail.com"
+                },
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.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": "2022-05-10T07:21:04+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php81",
+            "version": "v1.26.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php81.git",
+                "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/13f6d1271c663dc5ae9fb843a8f16521db7687a1",
+                "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1",
+                "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.26-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php81\\": ""
+                },
+                "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 8.1+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-php81/tree/v1.26.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": "2022-05-24T11:49:31+00:00"
+        },
+        {
+            "name": "symfony/process",
+            "version": "v5.4.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/process.git",
+                "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/process/zipball/597f3fff8e3e91836bb0bd38f5718b56ddbde2f3",
+                "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "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/v5.4.8"
+            },
+            "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": "2022-04-08T05:07:18+00:00"
+        },
+        {
+            "name": "symfony/psr-http-message-bridge",
+            "version": "v2.1.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/psr-http-message-bridge.git",
+                "reference": "22b37c8a3f6b5d94e9cdbd88e1270d96e2f97b34"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/22b37c8a3f6b5d94e9cdbd88e1270d96e2f97b34",
+                "reference": "22b37c8a3f6b5d94e9cdbd88e1270d96e2f97b34",
+                "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 || ^6.0"
+            },
+            "require-dev": {
+                "nyholm/psr7": "^1.1",
+                "psr/log": "^1.1 || ^2 || ^3",
+                "symfony/browser-kit": "^4.4 || ^5.0 || ^6.0",
+                "symfony/config": "^4.4 || ^5.0 || ^6.0",
+                "symfony/event-dispatcher": "^4.4 || ^5.0 || ^6.0",
+                "symfony/framework-bundle": "^4.4 || ^5.0 || ^6.0",
+                "symfony/http-kernel": "^4.4 || ^5.0 || ^6.0",
+                "symfony/phpunit-bridge": "^5.4@dev || ^6.0"
+            },
+            "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.2"
+            },
+            "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-11-05T13:13:39+00:00"
+        },
+        {
+            "name": "symfony/routing",
+            "version": "v5.4.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/routing.git",
+                "reference": "e07817bb6244ea33ef5ad31abc4a9288bef3f2f7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/routing/zipball/e07817bb6244ea33ef5ad31abc4a9288bef3f2f7",
+                "reference": "e07817bb6244ea33ef5ad31abc4a9288bef3f2f7",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "symfony/deprecation-contracts": "^2.1|^3",
+                "symfony/polyfill-php80": "^1.16"
+            },
+            "conflict": {
+                "doctrine/annotations": "<1.12",
+                "symfony/config": "<5.3",
+                "symfony/dependency-injection": "<4.4",
+                "symfony/yaml": "<4.4"
+            },
+            "require-dev": {
+                "doctrine/annotations": "^1.12",
+                "psr/log": "^1|^2|^3",
+                "symfony/config": "^5.3|^6.0",
+                "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+                "symfony/expression-language": "^4.4|^5.0|^6.0",
+                "symfony/http-foundation": "^4.4|^5.0|^6.0",
+                "symfony/yaml": "^4.4|^5.0|^6.0"
+            },
+            "suggest": {
+                "symfony/config": "For using the all-in-one router or any loader",
+                "symfony/expression-language": "For using expression matching",
+                "symfony/http-foundation": "For using a Symfony Request object",
+                "symfony/yaml": "For using the YAML loader"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Routing\\": ""
+                },
+                "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": "Maps an HTTP request to a set of configuration variables",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "router",
+                "routing",
+                "uri",
+                "url"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/routing/tree/v5.4.8"
+            },
+            "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": "2022-04-18T21:45:37+00:00"
+        },
+        {
+            "name": "symfony/service-contracts",
+            "version": "v2.5.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/service-contracts.git",
+                "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c",
+                "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "psr/container": "^1.1",
+                "symfony/deprecation-contracts": "^2.1|^3"
+            },
+            "conflict": {
+                "ext-psr": "<1.1|>=2"
+            },
+            "suggest": {
+                "symfony/service-implementation": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "2.5-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.5.2"
+            },
+            "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": "2022-05-30T19:17:29+00:00"
+        },
+        {
+            "name": "symfony/string",
+            "version": "v6.0.10",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/string.git",
+                "reference": "1b3adf02a0fc814bd9118d7fd68a097a599ebc27"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/string/zipball/1b3adf02a0fc814bd9118d7fd68a097a599ebc27",
+                "reference": "1b3adf02a0fc814bd9118d7fd68a097a599ebc27",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=8.0.2",
+                "symfony/polyfill-ctype": "~1.8",
+                "symfony/polyfill-intl-grapheme": "~1.0",
+                "symfony/polyfill-intl-normalizer": "~1.0",
+                "symfony/polyfill-mbstring": "~1.0"
+            },
+            "conflict": {
+                "symfony/translation-contracts": "<2.0"
+            },
+            "require-dev": {
+                "symfony/error-handler": "^5.4|^6.0",
+                "symfony/http-client": "^5.4|^6.0",
+                "symfony/translation-contracts": "^2.0|^3.0",
+                "symfony/var-exporter": "^5.4|^6.0"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "Resources/functions.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Component\\String\\": ""
+                },
+                "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 object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "grapheme",
+                "i18n",
+                "string",
+                "unicode",
+                "utf-8",
+                "utf8"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/string/tree/v6.0.10"
+            },
+            "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": "2022-06-26T16:34:50+00:00"
+        },
+        {
+            "name": "symfony/translation",
+            "version": "v6.0.9",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/translation.git",
+                "reference": "9ba011309943955a3807b8236c17cff3b88f67b6"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/translation/zipball/9ba011309943955a3807b8236c17cff3b88f67b6",
+                "reference": "9ba011309943955a3807b8236c17cff3b88f67b6",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=8.0.2",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/translation-contracts": "^2.3|^3.0"
+            },
+            "conflict": {
+                "symfony/config": "<5.4",
+                "symfony/console": "<5.4",
+                "symfony/dependency-injection": "<5.4",
+                "symfony/http-kernel": "<5.4",
+                "symfony/twig-bundle": "<5.4",
+                "symfony/yaml": "<5.4"
+            },
+            "provide": {
+                "symfony/translation-implementation": "2.3|3.0"
+            },
+            "require-dev": {
+                "psr/log": "^1|^2|^3",
+                "symfony/config": "^5.4|^6.0",
+                "symfony/console": "^5.4|^6.0",
+                "symfony/dependency-injection": "^5.4|^6.0",
+                "symfony/finder": "^5.4|^6.0",
+                "symfony/http-client-contracts": "^1.1|^2.0|^3.0",
+                "symfony/http-kernel": "^5.4|^6.0",
+                "symfony/intl": "^5.4|^6.0",
+                "symfony/polyfill-intl-icu": "^1.21",
+                "symfony/service-contracts": "^1.1.2|^2|^3",
+                "symfony/yaml": "^5.4|^6.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/v6.0.9"
+            },
+            "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": "2022-05-06T14:27:17+00:00"
+        },
+        {
+            "name": "symfony/translation-contracts",
+            "version": "v3.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/translation-contracts.git",
+                "reference": "acbfbb274e730e5a0236f619b6168d9dedb3e282"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/acbfbb274e730e5a0236f619b6168d9dedb3e282",
+                "reference": "acbfbb274e730e5a0236f619b6168d9dedb3e282",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=8.0.2"
+            },
+            "suggest": {
+                "symfony/translation-implementation": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.0-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/v3.0.2"
+            },
+            "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": "2022-06-27T17:10:44+00:00"
+        },
+        {
+            "name": "symfony/var-dumper",
+            "version": "v5.4.9",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/var-dumper.git",
+                "reference": "af52239a330fafd192c773795520dc2dd62b5657"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/af52239a330fafd192c773795520dc2dd62b5657",
+                "reference": "af52239a330fafd192c773795520dc2dd62b5657",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.2.5",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/polyfill-php80": "^1.16"
+            },
+            "conflict": {
+                "phpunit/phpunit": "<5.4.3",
+                "symfony/console": "<4.4"
+            },
+            "require-dev": {
+                "ext-iconv": "*",
+                "symfony/console": "^4.4|^5.0|^6.0",
+                "symfony/process": "^4.4|^5.0|^6.0",
+                "symfony/uid": "^5.1|^6.0",
+                "twig/twig": "^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/v5.4.9"
+            },
+            "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": "2022-05-21T10:24:18+00:00"
+        },
+        {
+            "name": "symfony/var-exporter",
+            "version": "v6.0.9",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/var-exporter.git",
+                "reference": "51c9947398d4f87f0b5a861999534a95afcd971e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/var-exporter/zipball/51c9947398d4f87f0b5a861999534a95afcd971e",
+                "reference": "51c9947398d4f87f0b5a861999534a95afcd971e",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=8.0.2"
+            },
+            "require-dev": {
+                "symfony/var-dumper": "^5.4|^6.0"
+            },
+            "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/v6.0.9"
+            },
+            "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": "2022-05-21T13:33:31+00:00"
+        },
+        {
+            "name": "tencent/tls-sig-api-v2",
+            "version": "v1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/tencentyun/tls-sig-api-v2-php.git",
+                "reference": "af947437779ac6f18233e24c3e12ad5dae866a9f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/tencentyun/tls-sig-api-v2-php/zipball/af947437779ac6f18233e24c3e12ad5dae866a9f",
+                "reference": "af947437779ac6f18233e24c3e12ad5dae866a9f",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Tencent\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "weijunyi",
+                    "email": "weijunyi@tencent.com",
+                    "role": "Developer"
+                }
+            ],
+            "description": "tls-sig-api-v2 适用于腾讯云通信生成用户账号签名。",
+            "homepage": "https://github.com/tencentyun/tls-sig-api-v2-php",
+            "keywords": [
+                "im",
+                "tencent"
+            ],
+            "support": {
+                "issues": "https://github.com/tencentyun/tls-sig-api-v2-php/issues",
+                "source": "https://github.com/tencentyun/tls-sig-api-v2-php/tree/v1.0"
+            },
+            "time": "2019-06-20T08:42:03+00:00"
+        },
+        {
+            "name": "tencentcloud/tencentcloud-sdk-php",
+            "version": "3.0.671",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/TencentCloud/tencentcloud-sdk-php.git",
+                "reference": "c3de84ff705dc58e186d65865870cab712cfbdb7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/TencentCloud/tencentcloud-sdk-php/zipball/c3de84ff705dc58e186d65865870cab712cfbdb7",
+                "reference": "c3de84ff705dc58e186d65865870cab712cfbdb7",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "guzzlehttp/guzzle": "^6.3 || ^7.0",
+                "php": ">=5.6.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "TencentCloud\\": "./src/TencentCloud"
+                },
+                "classmap": [
+                    "src/QcloudApi/QcloudApi.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "coolli",
+                    "email": "tencentcloudapi@tencent.com",
+                    "homepage": "https://cloud.tencent.com/document/sdk/PHP",
+                    "role": "Developer"
+                }
+            ],
+            "description": "TencentCloudApi php sdk",
+            "homepage": "https://github.com/TencentCloud/tencentcloud-sdk-php",
+            "support": {
+                "issues": "https://github.com/TencentCloud/tencentcloud-sdk-php/issues",
+                "source": "https://github.com/TencentCloud/tencentcloud-sdk-php/tree/3.0.671"
+            },
+            "time": "2022-07-13T23:02:46+00:00"
+        },
+        {
+            "name": "tijsverkoyen/css-to-inline-styles",
+            "version": "2.2.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git",
+                "reference": "da444caae6aca7a19c0c140f68c6182e337d5b1c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/da444caae6aca7a19c0c140f68c6182e337d5b1c",
+                "reference": "da444caae6aca7a19c0c140f68c6182e337d5b1c",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-libxml": "*",
+                "php": "^5.5 || ^7.0 || ^8.0",
+                "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.2.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "TijsVerkoyen\\CssToInlineStyles\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Tijs Verkoyen",
+                    "email": "css_to_inline_styles@verkoyen.eu",
+                    "role": "Developer"
+                }
+            ],
+            "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.",
+            "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles",
+            "support": {
+                "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues",
+                "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.4"
+            },
+            "time": "2021-12-08T09:12:39+00:00"
+        },
+        {
+            "name": "vlucas/phpdotenv",
+            "version": "v5.4.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/vlucas/phpdotenv.git",
+                "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/264dce589e7ce37a7ba99cb901eed8249fbec92f",
+                "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-pcre": "*",
+                "graham-campbell/result-type": "^1.0.2",
+                "php": "^7.1.3 || ^8.0",
+                "phpoption/phpoption": "^1.8",
+                "symfony/polyfill-ctype": "^1.23",
+                "symfony/polyfill-mbstring": "^1.23.1",
+                "symfony/polyfill-php80": "^1.23.1"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.4.1",
+                "ext-filter": "*",
+                "phpunit/phpunit": "^7.5.20 || ^8.5.21 || ^9.5.10"
+            },
+            "suggest": {
+                "ext-filter": "Required to use the boolean validator."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Dotenv\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                },
+                {
+                    "name": "Vance Lucas",
+                    "email": "vance@vancelucas.com",
+                    "homepage": "https://github.com/vlucas"
+                }
+            ],
+            "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.",
+            "keywords": [
+                "dotenv",
+                "env",
+                "environment"
+            ],
+            "support": {
+                "issues": "https://github.com/vlucas/phpdotenv/issues",
+                "source": "https://github.com/vlucas/phpdotenv/tree/v5.4.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/GrahamCampbell",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2021-12-12T23:22:04+00:00"
+        },
+        {
+            "name": "voku/portable-ascii",
+            "version": "1.6.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/voku/portable-ascii.git",
+                "reference": "87337c91b9dfacee02452244ee14ab3c43bc485a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/voku/portable-ascii/zipball/87337c91b9dfacee02452244ee14ab3c43bc485a",
+                "reference": "87337c91b9dfacee02452244ee14ab3c43bc485a",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.0.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0"
+            },
+            "suggest": {
+                "ext-intl": "Use Intl for transliterator_transliterate() support"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "voku\\": "src/voku/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Lars Moelleken",
+                    "homepage": "http://www.moelleken.org/"
+                }
+            ],
+            "description": "Portable ASCII library - performance optimized (ascii) string functions for php.",
+            "homepage": "https://github.com/voku/portable-ascii",
+            "keywords": [
+                "ascii",
+                "clean",
+                "php"
+            ],
+            "support": {
+                "issues": "https://github.com/voku/portable-ascii/issues",
+                "source": "https://github.com/voku/portable-ascii/tree/1.6.1"
+            },
+            "funding": [
+                {
+                    "url": "https://www.paypal.me/moelleken",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/voku",
+                    "type": "github"
+                },
+                {
+                    "url": "https://opencollective.com/portable-ascii",
+                    "type": "open_collective"
+                },
+                {
+                    "url": "https://www.patreon.com/voku",
+                    "type": "patreon"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-01-24T18:55:24+00:00"
+        },
+        {
+            "name": "webmozart/assert",
+            "version": "1.11.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/webmozarts/assert.git",
+                "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991",
+                "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-ctype": "*",
+                "php": "^7.2 || ^8.0"
+            },
+            "conflict": {
+                "phpstan/phpstan": "<0.12.20",
+                "vimeo/psalm": "<4.6.1 || 4.6.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^8.5.13"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.10-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Webmozart\\Assert\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@gmail.com"
+                }
+            ],
+            "description": "Assertions to validate method input/output with nice error messages.",
+            "keywords": [
+                "assert",
+                "check",
+                "validate"
+            ],
+            "support": {
+                "issues": "https://github.com/webmozarts/assert/issues",
+                "source": "https://github.com/webmozarts/assert/tree/1.11.0"
+            },
+            "time": "2022-06-03T18:03:27+00:00"
+        },
+        {
+            "name": "wemersonjanuario/wkhtmltopdf-windows",
+            "version": "0.12.2.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/wemersonjanuario/wkhtmltopdf-windows.git",
+                "reference": "90fcd3487cad5931287742113c449b926e9e48d8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/wemersonjanuario/wkhtmltopdf-windows/zipball/90fcd3487cad5931287742113c449b926e9e48d8",
+                "reference": "90fcd3487cad5931287742113c449b926e9e48d8",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "suggest": {
+                "h4cc/wkhtmltopdf-amd64": "*",
+                "h4cc/wkhtmltopdf-i386": "*",
+                "wemersonjanuario/laravelpdf": "1.0.*"
+            },
+            "bin": [
+                "bin/32bit/wkhtmltopdf.exe",
+                "bin/32bit/wkhtmltoimage.exe",
+                "bin/64bit/wkhtmltopdf.exe",
+                "bin/64bit/wkhtmltoimage.exe"
+            ],
+            "type": "library",
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "LGPL Version 3"
+            ],
+            "authors": [
+                {
+                    "name": "Wemerson Januario",
+                    "email": "wemerson.januario@gmail.com",
+                    "homepage": "http://wemersonjanuario.com.br"
+                }
+            ],
+            "description": "Convert html to pdf using webkit (qtwebkit). Static linked windows binary for 32 bit and 64 bit systems.",
+            "homepage": "http://wkhtmltopdf.org/",
+            "keywords": [
+                "binary",
+                "convert",
+                "htmltoimage",
+                "htmltopdf",
+                "pdf",
+                "snapshot",
+                "thumbnail",
+                "wkhtmltopdf"
+            ],
+            "support": {
+                "issues": "https://github.com/wemersonjanuario/wkhtmltopdf-windows/issues?state=open",
+                "source": "https://github.com/wemersonjanuario/wkhtmltopdf-windows/tree/master"
+            },
+            "time": "2015-06-30T20:19:22+00:00"
+        }
+    ],
+    "packages-dev": [
+        {
+            "name": "doctrine/instantiator",
+            "version": "1.4.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/instantiator.git",
+                "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc",
+                "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.1 || ^8.0"
+            },
+            "require-dev": {
+                "doctrine/coding-standard": "^9",
+                "ext-pdo": "*",
+                "ext-phar": "*",
+                "phpbench/phpbench": "^0.16 || ^1",
+                "phpstan/phpstan": "^1.4",
+                "phpstan/phpstan-phpunit": "^1",
+                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+                "vimeo/psalm": "^4.22"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Marco Pivetta",
+                    "email": "ocramius@gmail.com",
+                    "homepage": "https://ocramius.github.io/"
+                }
+            ],
+            "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+            "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
+            "keywords": [
+                "constructor",
+                "instantiate"
+            ],
+            "support": {
+                "issues": "https://github.com/doctrine/instantiator/issues",
+                "source": "https://github.com/doctrine/instantiator/tree/1.4.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%2Finstantiator",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-03-03T08:28:38+00:00"
+        },
+        {
+            "name": "facade/flare-client-php",
+            "version": "1.9.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/facade/flare-client-php.git",
+                "reference": "b2adf1512755637d0cef4f7d1b54301325ac78ed"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/facade/flare-client-php/zipball/b2adf1512755637d0cef4f7d1b54301325ac78ed",
+                "reference": "b2adf1512755637d0cef4f7d1b54301325ac78ed",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "facade/ignition-contracts": "~1.0",
+                "illuminate/pipeline": "^5.5|^6.0|^7.0|^8.0",
+                "php": "^7.1|^8.0",
+                "symfony/http-foundation": "^3.3|^4.1|^5.0",
+                "symfony/mime": "^3.4|^4.0|^5.1",
+                "symfony/var-dumper": "^3.4|^4.0|^5.0"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^2.14",
+                "phpunit/phpunit": "^7.5.16",
+                "spatie/phpunit-snapshot-assertions": "^2.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/helpers.php"
+                ],
+                "psr-4": {
+                    "Facade\\FlareClient\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Send PHP errors to Flare",
+            "homepage": "https://github.com/facade/flare-client-php",
+            "keywords": [
+                "exception",
+                "facade",
+                "flare",
+                "reporting"
+            ],
+            "support": {
+                "issues": "https://github.com/facade/flare-client-php/issues",
+                "source": "https://github.com/facade/flare-client-php/tree/1.9.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/spatie",
+                    "type": "github"
+                }
+            ],
+            "time": "2021-09-13T12:16:46+00:00"
+        },
+        {
+            "name": "facade/ignition",
+            "version": "2.17.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/facade/ignition.git",
+                "reference": "6acd82e986a2ecee89e2e68adfc30a1936d1ab7c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/facade/ignition/zipball/6acd82e986a2ecee89e2e68adfc30a1936d1ab7c",
+                "reference": "6acd82e986a2ecee89e2e68adfc30a1936d1ab7c",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-curl": "*",
+                "ext-json": "*",
+                "ext-mbstring": "*",
+                "facade/flare-client-php": "^1.9.1",
+                "facade/ignition-contracts": "^1.0.2",
+                "illuminate/support": "^7.0|^8.0",
+                "monolog/monolog": "^2.0",
+                "php": "^7.2.5|^8.0",
+                "symfony/console": "^5.0",
+                "symfony/var-dumper": "^5.0"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^2.14",
+                "livewire/livewire": "^2.4",
+                "mockery/mockery": "^1.3",
+                "orchestra/testbench": "^5.0|^6.0",
+                "psalm/plugin-laravel": "^1.2"
+            },
+            "suggest": {
+                "laravel/telescope": "^3.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.x-dev"
+                },
+                "laravel": {
+                    "providers": [
+                        "Facade\\Ignition\\IgnitionServiceProvider"
+                    ],
+                    "aliases": {
+                        "Flare": "Facade\\Ignition\\Facades\\Flare"
+                    }
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/helpers.php"
+                ],
+                "psr-4": {
+                    "Facade\\Ignition\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A beautiful error page for Laravel applications.",
+            "homepage": "https://github.com/facade/ignition",
+            "keywords": [
+                "error",
+                "flare",
+                "laravel",
+                "page"
+            ],
+            "support": {
+                "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction",
+                "forum": "https://twitter.com/flareappio",
+                "issues": "https://github.com/facade/ignition/issues",
+                "source": "https://github.com/facade/ignition"
+            },
+            "time": "2022-06-30T18:26:59+00:00"
+        },
+        {
+            "name": "facade/ignition-contracts",
+            "version": "1.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/facade/ignition-contracts.git",
+                "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/3c921a1cdba35b68a7f0ccffc6dffc1995b18267",
+                "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.3|^8.0"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^v2.15.8",
+                "phpunit/phpunit": "^9.3.11",
+                "vimeo/psalm": "^3.17.1"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Facade\\IgnitionContracts\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Freek Van der Herten",
+                    "email": "freek@spatie.be",
+                    "homepage": "https://flareapp.io",
+                    "role": "Developer"
+                }
+            ],
+            "description": "Solution contracts for Ignition",
+            "homepage": "https://github.com/facade/ignition-contracts",
+            "keywords": [
+                "contracts",
+                "flare",
+                "ignition"
+            ],
+            "support": {
+                "issues": "https://github.com/facade/ignition-contracts/issues",
+                "source": "https://github.com/facade/ignition-contracts/tree/1.0.2"
+            },
+            "time": "2020-10-16T08:27:54+00:00"
+        },
+        {
+            "name": "fakerphp/faker",
+            "version": "v1.19.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/FakerPHP/Faker.git",
+                "reference": "d7f08a622b3346766325488aa32ddc93ccdecc75"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/d7f08a622b3346766325488aa32ddc93ccdecc75",
+                "reference": "d7f08a622b3346766325488aa32ddc93ccdecc75",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.1 || ^8.0",
+                "psr/container": "^1.0 || ^2.0",
+                "symfony/deprecation-contracts": "^2.2 || ^3.0"
+            },
+            "conflict": {
+                "fzaninotto/faker": "*"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.4.1",
+                "doctrine/persistence": "^1.3 || ^2.0",
+                "ext-intl": "*",
+                "symfony/phpunit-bridge": "^4.4 || ^5.2"
+            },
+            "suggest": {
+                "doctrine/orm": "Required to use Faker\\ORM\\Doctrine",
+                "ext-curl": "Required by Faker\\Provider\\Image to download images.",
+                "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.",
+                "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.",
+                "ext-mbstring": "Required for multibyte Unicode string functionality."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "v1.19-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Faker\\": "src/Faker/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "François Zaninotto"
+                }
+            ],
+            "description": "Faker is a PHP library that generates fake data for you.",
+            "keywords": [
+                "data",
+                "faker",
+                "fixtures"
+            ],
+            "support": {
+                "issues": "https://github.com/FakerPHP/Faker/issues",
+                "source": "https://github.com/FakerPHP/Faker/tree/v1.19.0"
+            },
+            "time": "2022-02-02T17:38:57+00:00"
+        },
+        {
+            "name": "filp/whoops",
+            "version": "2.14.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/filp/whoops.git",
+                "reference": "a63e5e8f26ebbebf8ed3c5c691637325512eb0dc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/filp/whoops/zipball/a63e5e8f26ebbebf8ed3c5c691637325512eb0dc",
+                "reference": "a63e5e8f26ebbebf8ed3c5c691637325512eb0dc",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^5.5.9 || ^7.0 || ^8.0",
+                "psr/log": "^1.0.1 || ^2.0 || ^3.0"
+            },
+            "require-dev": {
+                "mockery/mockery": "^0.9 || ^1.0",
+                "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3",
+                "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0"
+            },
+            "suggest": {
+                "symfony/var-dumper": "Pretty print complex values better with var-dumper available",
+                "whoops/soap": "Formats errors as SOAP responses"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.7-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Whoops\\": "src/Whoops/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Filipe Dobreira",
+                    "homepage": "https://github.com/filp",
+                    "role": "Developer"
+                }
+            ],
+            "description": "php error handling for cool kids",
+            "homepage": "https://filp.github.io/whoops/",
+            "keywords": [
+                "error",
+                "exception",
+                "handling",
+                "library",
+                "throwable",
+                "whoops"
+            ],
+            "support": {
+                "issues": "https://github.com/filp/whoops/issues",
+                "source": "https://github.com/filp/whoops/tree/2.14.5"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/denis-sokolov",
+                    "type": "github"
+                }
+            ],
+            "time": "2022-01-07T12:00:00+00:00"
+        },
+        {
+            "name": "hamcrest/hamcrest-php",
+            "version": "v2.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hamcrest/hamcrest-php.git",
+                "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3",
+                "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^5.3|^7.0|^8.0"
+            },
+            "replace": {
+                "cordoval/hamcrest-php": "*",
+                "davedevelopment/hamcrest-php": "*",
+                "kodova/hamcrest-php": "*"
+            },
+            "require-dev": {
+                "phpunit/php-file-iterator": "^1.4 || ^2.0",
+                "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.1-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "hamcrest"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "description": "This is the PHP port of Hamcrest Matchers",
+            "keywords": [
+                "test"
+            ],
+            "support": {
+                "issues": "https://github.com/hamcrest/hamcrest-php/issues",
+                "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1"
+            },
+            "time": "2020-07-09T08:09:16+00:00"
+        },
+        {
+            "name": "laravel/sail",
+            "version": "v1.14.11",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/laravel/sail.git",
+                "reference": "6edf45a247b3688e0d07e149570a62fd9bc11c73"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/laravel/sail/zipball/6edf45a247b3688e0d07e149570a62fd9bc11c73",
+                "reference": "6edf45a247b3688e0d07e149570a62fd9bc11c73",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "illuminate/console": "^8.0|^9.0",
+                "illuminate/contracts": "^8.0|^9.0",
+                "illuminate/support": "^8.0|^9.0",
+                "php": "^7.3|^8.0"
+            },
+            "bin": [
+                "bin/sail"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                },
+                "laravel": {
+                    "providers": [
+                        "Laravel\\Sail\\SailServiceProvider"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Laravel\\Sail\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "taylor@laravel.com"
+                }
+            ],
+            "description": "Docker files for running a basic Laravel application.",
+            "keywords": [
+                "docker",
+                "laravel"
+            ],
+            "support": {
+                "issues": "https://github.com/laravel/sail/issues",
+                "source": "https://github.com/laravel/sail"
+            },
+            "time": "2022-06-13T18:32:48+00:00"
+        },
+        {
+            "name": "mockery/mockery",
+            "version": "1.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/mockery/mockery.git",
+                "reference": "c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/mockery/mockery/zipball/c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac",
+                "reference": "c10a5f6e06fc2470ab1822fa13fa2a7380f8fbac",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "hamcrest/hamcrest-php": "^2.0.1",
+                "lib-pcre": ">=7.0",
+                "php": "^7.3 || ^8.0"
+            },
+            "conflict": {
+                "phpunit/phpunit": "<8.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^8.5 || ^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Mockery": "library/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Pádraic Brady",
+                    "email": "padraic.brady@gmail.com",
+                    "homepage": "http://blog.astrumfutura.com"
+                },
+                {
+                    "name": "Dave Marshall",
+                    "email": "dave.marshall@atstsolutions.co.uk",
+                    "homepage": "http://davedevelopment.co.uk"
+                }
+            ],
+            "description": "Mockery is a simple yet flexible PHP mock object framework",
+            "homepage": "https://github.com/mockery/mockery",
+            "keywords": [
+                "BDD",
+                "TDD",
+                "library",
+                "mock",
+                "mock objects",
+                "mockery",
+                "stub",
+                "test",
+                "test double",
+                "testing"
+            ],
+            "support": {
+                "issues": "https://github.com/mockery/mockery/issues",
+                "source": "https://github.com/mockery/mockery/tree/1.5.0"
+            },
+            "time": "2022-01-20T13:18:17+00:00"
+        },
+        {
+            "name": "myclabs/deep-copy",
+            "version": "1.11.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/myclabs/DeepCopy.git",
+                "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614",
+                "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.1 || ^8.0"
+            },
+            "conflict": {
+                "doctrine/collections": "<1.6.8",
+                "doctrine/common": "<2.13.3 || >=3,<3.2.2"
+            },
+            "require-dev": {
+                "doctrine/collections": "^1.6.8",
+                "doctrine/common": "^2.13.3 || ^3.2.2",
+                "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/DeepCopy/deep_copy.php"
+                ],
+                "psr-4": {
+                    "DeepCopy\\": "src/DeepCopy/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Create deep copies (clones) of your objects",
+            "keywords": [
+                "clone",
+                "copy",
+                "duplicate",
+                "object",
+                "object graph"
+            ],
+            "support": {
+                "issues": "https://github.com/myclabs/DeepCopy/issues",
+                "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0"
+            },
+            "funding": [
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-03-03T13:19:32+00:00"
+        },
+        {
+            "name": "nunomaduro/collision",
+            "version": "v5.11.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/nunomaduro/collision.git",
+                "reference": "8b610eef8582ccdc05d8f2ab23305e2d37049461"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/nunomaduro/collision/zipball/8b610eef8582ccdc05d8f2ab23305e2d37049461",
+                "reference": "8b610eef8582ccdc05d8f2ab23305e2d37049461",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "facade/ignition-contracts": "^1.0",
+                "filp/whoops": "^2.14.3",
+                "php": "^7.3 || ^8.0",
+                "symfony/console": "^5.0"
+            },
+            "require-dev": {
+                "brianium/paratest": "^6.1",
+                "fideloper/proxy": "^4.4.1",
+                "fruitcake/laravel-cors": "^2.0.3",
+                "laravel/framework": "8.x-dev",
+                "nunomaduro/larastan": "^0.6.2",
+                "nunomaduro/mock-final-classes": "^1.0",
+                "orchestra/testbench": "^6.0",
+                "phpstan/phpstan": "^0.12.64",
+                "phpunit/phpunit": "^9.5.0"
+            },
+            "type": "library",
+            "extra": {
+                "laravel": {
+                    "providers": [
+                        "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "NunoMaduro\\Collision\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nuno Maduro",
+                    "email": "enunomaduro@gmail.com"
+                }
+            ],
+            "description": "Cli error handling for console/command-line PHP applications.",
+            "keywords": [
+                "artisan",
+                "cli",
+                "command-line",
+                "console",
+                "error",
+                "handling",
+                "laravel",
+                "laravel-zero",
+                "php",
+                "symfony"
+            ],
+            "support": {
+                "issues": "https://github.com/nunomaduro/collision/issues",
+                "source": "https://github.com/nunomaduro/collision"
+            },
+            "funding": [
+                {
+                    "url": "https://www.paypal.com/paypalme/enunomaduro",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/nunomaduro",
+                    "type": "github"
+                },
+                {
+                    "url": "https://www.patreon.com/nunomaduro",
+                    "type": "patreon"
+                }
+            ],
+            "time": "2022-01-10T16:22:52+00:00"
+        },
+        {
+            "name": "phar-io/manifest",
+            "version": "2.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phar-io/manifest.git",
+                "reference": "97803eca37d319dfa7826cc2437fc020857acb53"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53",
+                "reference": "97803eca37d319dfa7826cc2437fc020857acb53",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-phar": "*",
+                "ext-xmlwriter": "*",
+                "phar-io/version": "^3.0.1",
+                "php": "^7.2 || ^8.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Arne Blankerts",
+                    "email": "arne@blankerts.de",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Sebastian Heuer",
+                    "email": "sebastian@phpeople.de",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "Developer"
+                }
+            ],
+            "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+            "support": {
+                "issues": "https://github.com/phar-io/manifest/issues",
+                "source": "https://github.com/phar-io/manifest/tree/2.0.3"
+            },
+            "time": "2021-07-20T11:28:43+00:00"
+        },
+        {
+            "name": "phar-io/version",
+            "version": "3.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phar-io/version.git",
+                "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+                "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": "^7.2 || ^8.0"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Arne Blankerts",
+                    "email": "arne@blankerts.de",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Sebastian Heuer",
+                    "email": "sebastian@phpeople.de",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "Developer"
+                }
+            ],
+            "description": "Library for handling version information and constraints",
+            "support": {
+                "issues": "https://github.com/phar-io/version/issues",
+                "source": "https://github.com/phar-io/version/tree/3.2.1"
+            },
+            "time": "2022-02-21T01:04:05+00:00"
+        },
+        {
+            "name": "phpspec/prophecy",
+            "version": "v1.15.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpspec/prophecy.git",
+                "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13",
+                "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "doctrine/instantiator": "^1.2",
+                "php": "^7.2 || ~8.0, <8.2",
+                "phpdocumentor/reflection-docblock": "^5.2",
+                "sebastian/comparator": "^3.0 || ^4.0",
+                "sebastian/recursion-context": "^3.0 || ^4.0"
+            },
+            "require-dev": {
+                "phpspec/phpspec": "^6.0 || ^7.0",
+                "phpunit/phpunit": "^8.0 || ^9.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Prophecy\\": "src/Prophecy"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Konstantin Kudryashov",
+                    "email": "ever.zet@gmail.com",
+                    "homepage": "http://everzet.com"
+                },
+                {
+                    "name": "Marcello Duarte",
+                    "email": "marcello.duarte@gmail.com"
+                }
+            ],
+            "description": "Highly opinionated mocking framework for PHP 5.3+",
+            "homepage": "https://github.com/phpspec/prophecy",
+            "keywords": [
+                "Double",
+                "Dummy",
+                "fake",
+                "mock",
+                "spy",
+                "stub"
+            ],
+            "support": {
+                "issues": "https://github.com/phpspec/prophecy/issues",
+                "source": "https://github.com/phpspec/prophecy/tree/v1.15.0"
+            },
+            "time": "2021-12-08T12:19:24+00:00"
+        },
+        {
+            "name": "phpunit/php-code-coverage",
+            "version": "9.2.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+                "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f",
+                "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-libxml": "*",
+                "ext-xmlwriter": "*",
+                "nikic/php-parser": "^4.13.0",
+                "php": ">=7.3",
+                "phpunit/php-file-iterator": "^3.0.3",
+                "phpunit/php-text-template": "^2.0.2",
+                "sebastian/code-unit-reverse-lookup": "^2.0.2",
+                "sebastian/complexity": "^2.0",
+                "sebastian/environment": "^5.1.2",
+                "sebastian/lines-of-code": "^1.0.3",
+                "sebastian/version": "^3.0.1",
+                "theseer/tokenizer": "^1.2.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3"
+            },
+            "suggest": {
+                "ext-pcov": "*",
+                "ext-xdebug": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "9.2-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+            "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+            "keywords": [
+                "coverage",
+                "testing",
+                "xunit"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
+                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2022-03-07T09:28:20+00:00"
+        },
+        {
+            "name": "phpunit/php-file-iterator",
+            "version": "3.0.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+                "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
+                "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+            "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+            "keywords": [
+                "filesystem",
+                "iterator"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
+                "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2021-12-02T12:48:52+00:00"
+        },
+        {
+            "name": "phpunit/php-invoker",
+            "version": "3.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-invoker.git",
+                "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+                "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "ext-pcntl": "*",
+                "phpunit/phpunit": "^9.3"
+            },
+            "suggest": {
+                "ext-pcntl": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Invoke callables with a timeout",
+            "homepage": "https://github.com/sebastianbergmann/php-invoker/",
+            "keywords": [
+                "process"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
+                "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-09-28T05:58:55+00:00"
+        },
+        {
+            "name": "phpunit/php-text-template",
+            "version": "2.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-text-template.git",
+                "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+                "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Simple template engine.",
+            "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+            "keywords": [
+                "template"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+                "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T05:33:50+00:00"
+        },
+        {
+            "name": "phpunit/php-timer",
+            "version": "5.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-timer.git",
+                "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+                "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Utility class for timing",
+            "homepage": "https://github.com/sebastianbergmann/php-timer/",
+            "keywords": [
+                "timer"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+                "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T13:16:10+00:00"
+        },
+        {
+            "name": "phpunit/phpunit",
+            "version": "9.5.21",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/phpunit.git",
+                "reference": "0e32b76be457de00e83213528f6bb37e2a38fcb1"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0e32b76be457de00e83213528f6bb37e2a38fcb1",
+                "reference": "0e32b76be457de00e83213528f6bb37e2a38fcb1",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "doctrine/instantiator": "^1.3.1",
+                "ext-dom": "*",
+                "ext-json": "*",
+                "ext-libxml": "*",
+                "ext-mbstring": "*",
+                "ext-xml": "*",
+                "ext-xmlwriter": "*",
+                "myclabs/deep-copy": "^1.10.1",
+                "phar-io/manifest": "^2.0.3",
+                "phar-io/version": "^3.0.2",
+                "php": ">=7.3",
+                "phpspec/prophecy": "^1.12.1",
+                "phpunit/php-code-coverage": "^9.2.13",
+                "phpunit/php-file-iterator": "^3.0.5",
+                "phpunit/php-invoker": "^3.1.1",
+                "phpunit/php-text-template": "^2.0.3",
+                "phpunit/php-timer": "^5.0.2",
+                "sebastian/cli-parser": "^1.0.1",
+                "sebastian/code-unit": "^1.0.6",
+                "sebastian/comparator": "^4.0.5",
+                "sebastian/diff": "^4.0.3",
+                "sebastian/environment": "^5.1.3",
+                "sebastian/exporter": "^4.0.3",
+                "sebastian/global-state": "^5.0.1",
+                "sebastian/object-enumerator": "^4.0.3",
+                "sebastian/resource-operations": "^3.0.3",
+                "sebastian/type": "^3.0",
+                "sebastian/version": "^3.0.2"
+            },
+            "require-dev": {
+                "phpspec/prophecy-phpunit": "^2.0.1"
+            },
+            "suggest": {
+                "ext-soap": "*",
+                "ext-xdebug": "*"
+            },
+            "bin": [
+                "phpunit"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "9.5-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/Framework/Assert/Functions.php"
+                ],
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "The PHP Unit Testing framework.",
+            "homepage": "https://phpunit.de/",
+            "keywords": [
+                "phpunit",
+                "testing",
+                "xunit"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+                "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.21"
+            },
+            "funding": [
+                {
+                    "url": "https://phpunit.de/sponsors.html",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2022-06-19T12:14:25+00:00"
+        },
+        {
+            "name": "sebastian/cli-parser",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/cli-parser.git",
+                "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+                "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library for parsing CLI options",
+            "homepage": "https://github.com/sebastianbergmann/cli-parser",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
+                "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-09-28T06:08:49+00:00"
+        },
+        {
+            "name": "sebastian/code-unit",
+            "version": "1.0.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/code-unit.git",
+                "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
+                "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Collection of value objects that represent the PHP code units",
+            "homepage": "https://github.com/sebastianbergmann/code-unit",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/code-unit/issues",
+                "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T13:08:54+00:00"
+        },
+        {
+            "name": "sebastian/code-unit-reverse-lookup",
+            "version": "2.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+                "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+                "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Looks up which function or method a line of code belongs to",
+            "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
+                "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-09-28T05:30:19+00:00"
+        },
+        {
+            "name": "sebastian/comparator",
+            "version": "4.0.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/comparator.git",
+                "reference": "55f4261989e546dc112258c7a75935a81a7ce382"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382",
+                "reference": "55f4261989e546dc112258c7a75935a81a7ce382",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.3",
+                "sebastian/diff": "^4.0",
+                "sebastian/exporter": "^4.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                },
+                {
+                    "name": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
+                {
+                    "name": "Volker Dusch",
+                    "email": "github@wallbash.com"
+                },
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@2bepublished.at"
+                }
+            ],
+            "description": "Provides the functionality to compare PHP values for equality",
+            "homepage": "https://github.com/sebastianbergmann/comparator",
+            "keywords": [
+                "comparator",
+                "compare",
+                "equality"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/comparator/issues",
+                "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T15:49:45+00:00"
+        },
+        {
+            "name": "sebastian/complexity",
+            "version": "2.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/complexity.git",
+                "reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
+                "reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "nikic/php-parser": "^4.7",
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library for calculating the complexity of PHP code units",
+            "homepage": "https://github.com/sebastianbergmann/complexity",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/complexity/issues",
+                "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T15:52:27+00:00"
+        },
+        {
+            "name": "sebastian/diff",
+            "version": "4.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/diff.git",
+                "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
+                "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3",
+                "symfony/process": "^4.2 || ^5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                },
+                {
+                    "name": "Kore Nordmann",
+                    "email": "mail@kore-nordmann.de"
+                }
+            ],
+            "description": "Diff implementation",
+            "homepage": "https://github.com/sebastianbergmann/diff",
+            "keywords": [
+                "diff",
+                "udiff",
+                "unidiff",
+                "unified diff"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/diff/issues",
+                "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T13:10:38+00:00"
+        },
+        {
+            "name": "sebastian/environment",
+            "version": "5.1.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/environment.git",
+                "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7",
+                "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3"
+            },
+            "suggest": {
+                "ext-posix": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.1-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Provides functionality to handle HHVM/PHP environments",
+            "homepage": "http://www.github.com/sebastianbergmann/environment",
+            "keywords": [
+                "Xdebug",
+                "environment",
+                "hhvm"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/environment/issues",
+                "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2022-04-03T09:37:03+00:00"
+        },
+        {
+            "name": "sebastian/exporter",
+            "version": "4.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/exporter.git",
+                "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9",
+                "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.3",
+                "sebastian/recursion-context": "^4.0"
+            },
+            "require-dev": {
+                "ext-mbstring": "*",
+                "phpunit/phpunit": "^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                },
+                {
+                    "name": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
+                {
+                    "name": "Volker Dusch",
+                    "email": "github@wallbash.com"
+                },
+                {
+                    "name": "Adam Harvey",
+                    "email": "aharvey@php.net"
+                },
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@gmail.com"
+                }
+            ],
+            "description": "Provides the functionality to export PHP variables for visualization",
+            "homepage": "https://www.github.com/sebastianbergmann/exporter",
+            "keywords": [
+                "export",
+                "exporter"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/exporter/issues",
+                "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2021-11-11T14:18:36+00:00"
+        },
+        {
+            "name": "sebastian/global-state",
+            "version": "5.0.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/global-state.git",
+                "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2",
+                "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.3",
+                "sebastian/object-reflector": "^2.0",
+                "sebastian/recursion-context": "^4.0"
+            },
+            "require-dev": {
+                "ext-dom": "*",
+                "phpunit/phpunit": "^9.3"
+            },
+            "suggest": {
+                "ext-uopz": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Snapshotting of global state",
+            "homepage": "http://www.github.com/sebastianbergmann/global-state",
+            "keywords": [
+                "global state"
+            ],
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/global-state/issues",
+                "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2022-02-14T08:28:10+00:00"
+        },
+        {
+            "name": "sebastian/lines-of-code",
+            "version": "1.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+                "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+                "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "nikic/php-parser": "^4.6",
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library for counting the lines of code in PHP source code",
+            "homepage": "https://github.com/sebastianbergmann/lines-of-code",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
+                "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-11-28T06:42:11+00:00"
+        },
+        {
+            "name": "sebastian/object-enumerator",
+            "version": "4.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+                "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
+                "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.3",
+                "sebastian/object-reflector": "^2.0",
+                "sebastian/recursion-context": "^4.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+            "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
+                "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T13:12:34+00:00"
+        },
+        {
+            "name": "sebastian/object-reflector",
+            "version": "2.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/object-reflector.git",
+                "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+                "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Allows reflection of object attributes, including inherited and non-public ones",
+            "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
+                "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T13:14:26+00:00"
+        },
+        {
+            "name": "sebastian/recursion-context",
+            "version": "4.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/recursion-context.git",
+                "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172",
+                "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                },
+                {
+                    "name": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
+                {
+                    "name": "Adam Harvey",
+                    "email": "aharvey@php.net"
+                }
+            ],
+            "description": "Provides functionality to recursively process PHP variables",
+            "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
+                "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T13:17:30+00:00"
+        },
+        {
+            "name": "sebastian/resource-operations",
+            "version": "3.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/resource-operations.git",
+                "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
+                "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Provides a list of PHP built-in functions that operate on resources",
+            "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
+                "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-09-28T06:45:17+00:00"
+        },
+        {
+            "name": "sebastian/type",
+            "version": "3.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/type.git",
+                "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b233b84bc4465aff7b57cf1c4bc75c86d00d6dad",
+                "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Collection of value objects that represent the types of the PHP type system",
+            "homepage": "https://github.com/sebastianbergmann/type",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/type/issues",
+                "source": "https://github.com/sebastianbergmann/type/tree/3.0.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2022-03-15T09:54:48+00:00"
+        },
+        {
+            "name": "sebastian/version",
+            "version": "3.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/version.git",
+                "reference": "c6c1022351a901512170118436c764e473f6de8c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
+                "reference": "c6c1022351a901512170118436c764e473f6de8c",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "php": ">=7.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+            "homepage": "https://github.com/sebastianbergmann/version",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/version/issues",
+                "source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-09-28T06:39:44+00:00"
+        },
+        {
+            "name": "theseer/tokenizer",
+            "version": "1.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/theseer/tokenizer.git",
+                "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
+                "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
+                "shasum": "",
+                "mirrors": [
+                    {
+                        "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+                        "preferred": true
+                    }
+                ]
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-tokenizer": "*",
+                "ext-xmlwriter": "*",
+                "php": "^7.2 || ^8.0"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Arne Blankerts",
+                    "email": "arne@blankerts.de",
+                    "role": "Developer"
+                }
+            ],
+            "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+            "support": {
+                "issues": "https://github.com/theseer/tokenizer/issues",
+                "source": "https://github.com/theseer/tokenizer/tree/1.2.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/theseer",
+                    "type": "github"
+                }
+            ],
+            "time": "2021-07-28T10:34:58+00:00"
+        }
+    ],
+    "aliases": [],
+    "minimum-stability": "dev",
+    "stability-flags": [],
+    "prefer-stable": true,
+    "prefer-lowest": false,
+    "platform": {
+        "php": "^7.3|^8.0"
+    },
+    "platform-dev": [],
+    "plugin-api-version": "2.1.0"
+}

+ 360 - 0
config/admin.php

xqd
@@ -0,0 +1,360 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | dcat-admin name
+    |--------------------------------------------------------------------------
+    |
+    | This value is the name of dcat-admin, This setting is displayed on the
+    | login page.
+    |
+    */
+    'name' => '管理后台',
+
+    /*
+    |--------------------------------------------------------------------------
+    | dcat-admin logo
+    |--------------------------------------------------------------------------
+    |
+    | The logo of all admin pages. You can also set it as an image by using a
+    | `img` tag, eg '<img src="http://logo-url" alt="Admin logo">'.
+    |
+    */
+    'logo' => '<img src="/vendor/dcat-admin/images/logo.png" width="35"> &nbsp;管理后台',
+
+    /*
+    |--------------------------------------------------------------------------
+    | dcat-admin mini logo
+    |--------------------------------------------------------------------------
+    |
+    | The logo of all admin pages when the sidebar menu is collapsed. You can
+    | also set it as an image by using a `img` tag, eg
+    | '<img src="http://logo-url" alt="Admin logo">'.
+    |
+    */
+    'logo-mini' => '<img src="/vendor/dcat-admin/images/logo.png">',
+
+    /*
+     |--------------------------------------------------------------------------
+     | User default avatar
+     |--------------------------------------------------------------------------
+     |
+     | Set a default avatar for newly created users.
+     |
+     */
+    'default_avatar' => '@admin/images/default-avatar.jpg',
+
+    /*
+    |--------------------------------------------------------------------------
+    | dcat-admin route settings
+    |--------------------------------------------------------------------------
+    |
+    | The routing configuration of the admin page, including the path prefix,
+    | the controller namespace, and the default middleware. If you want to
+    | access through the root path, just set the prefix to empty string.
+    |
+    */
+    'route' => [
+        'domain' => env('ADMIN_ROUTE_DOMAIN'),
+
+        'prefix' => env('ADMIN_ROUTE_PREFIX', 'admin'),
+
+        'namespace' => 'App\\Admin\\Controllers',
+
+        'middleware' => ['web', 'admin'],
+
+        'enable_session_middleware' => false,
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | dcat-admin install directory
+    |--------------------------------------------------------------------------
+    |
+    | The installation directory of the controller and routing configuration
+    | files of the administration page. The default is `app/Admin`, which must
+    | be set before running `artisan admin::install` to take effect.
+    |
+    */
+    'directory' => app_path('Admin'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | dcat-admin html title
+    |--------------------------------------------------------------------------
+    |
+    | Html title for all pages.
+    |
+    */
+    'title' => '管理',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Assets hostname
+    |--------------------------------------------------------------------------
+    |
+   */
+    'assets_server' => env('ADMIN_ASSETS_SERVER'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Access via `https`
+    |--------------------------------------------------------------------------
+    |
+    | If your page is going to be accessed via https, set it to `true`.
+    |
+    */
+    'https' => env('ADMIN_HTTPS', true),
+
+    /*
+    |--------------------------------------------------------------------------
+    | dcat-admin auth setting
+    |--------------------------------------------------------------------------
+    |
+    | Authentication settings for all admin pages. Include an authentication
+    | guard and a user provider setting of authentication driver.
+    |
+    | You can specify a controller for `login` `logout` and other auth routes.
+    |
+    */
+    'auth' => [
+        'enable' => true,
+
+        'controller' => App\Admin\Controllers\AuthController::class,
+
+        'guard' => 'admin',
+
+        'guards' => [
+            'admin' => [
+                'driver'   => 'session',
+                'provider' => 'admin',
+            ],
+        ],
+
+        'providers' => [
+            'admin' => [
+                'driver' => 'eloquent',
+                'model'  => Dcat\Admin\Models\Administrator::class,
+            ],
+        ],
+
+        // Add "remember me" to login form
+        'remember' => true,
+
+        // All method to path like: auth/users/*/edit
+        // or specific method to path like: get:auth/users.
+        'except' => [
+            'auth/login',
+            'auth/logout',
+        ],
+
+        'enable_session_middleware' => false,
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | The global Grid setting
+    |--------------------------------------------------------------------------
+    */
+    'grid' => [
+
+        // The global Grid action display class.
+        'grid_action_class' => Dcat\Admin\Grid\Displayers\DropdownActions::class,
+
+        // The global Grid batch action display class.
+        'batch_action_class' => Dcat\Admin\Grid\Tools\BatchActions::class,
+
+        // The global Grid pagination display class.
+        'paginator_class' => Dcat\Admin\Grid\Tools\Paginator::class,
+
+        'actions' => [
+            'view' => Dcat\Admin\Grid\Actions\Show::class,
+            'edit' => Dcat\Admin\Grid\Actions\Edit::class,
+            'quick_edit' => Dcat\Admin\Grid\Actions\QuickEdit::class,
+            'delete' => Dcat\Admin\Grid\Actions\Delete::class,
+            'batch_delete' => Dcat\Admin\Grid\Tools\BatchDelete::class,
+        ],
+
+        // The global Grid column selector setting.
+        'column_selector' => [
+            'store' => Dcat\Admin\Grid\ColumnSelector\SessionStore::class,
+            'store_params' => [
+                'driver' => 'file',
+            ],
+        ],
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | dcat-admin helpers setting.
+    |--------------------------------------------------------------------------
+    */
+    'helpers' => [
+        'enable' => true,
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | dcat-admin permission setting
+    |--------------------------------------------------------------------------
+    |
+    | Permission settings for all admin pages.
+    |
+    */
+    'permission' => [
+        // Whether enable permission.
+        'enable' => true,
+
+        // All method to path like: auth/users/*/edit
+        // or specific method to path like: get:auth/users.
+        'except' => [
+            '/',
+            'auth/login',
+            'auth/logout',
+            'auth/setting',
+        ],
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | dcat-admin menu setting
+    |--------------------------------------------------------------------------
+    |
+    */
+    'menu' => [
+        'cache' => [
+            // enable cache or not
+            'enable' => false,
+            'store'  => 'file',
+        ],
+
+        // Whether enable menu bind to a permission.
+        'bind_permission' => true,
+
+        // Whether enable role bind to menu.
+        'role_bind_menu' => true,
+
+        // Whether enable permission bind to menu.
+        'permission_bind_menu' => true,
+
+        'default_icon' => 'feather icon-circle',
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | dcat-admin upload setting
+    |--------------------------------------------------------------------------
+    |
+    | File system configuration for form upload files and images, including
+    | disk and upload path.
+    |
+    */
+    'upload' => [
+
+         // Disk in `config/filesystem.php`.
+        // 'disk' => 'admin',
+        'disk' => 'oss',
+
+        // Image and file upload path under the disk above.
+        'directory' => [
+            'image' => 'golf/images',
+            'file'  => 'golf/files',
+        ],
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | dcat-admin database settings
+    |--------------------------------------------------------------------------
+    |
+    | Here are database settings for dcat-admin builtin model & tables.
+    |
+    */
+    'database' => [
+
+        // Database connection for following tables.
+        'connection' => '',
+
+        // User tables and model.
+        'users_table' => 'admin_users',
+        'users_model' => Dcat\Admin\Models\Administrator::class,
+
+        // Role table and model.
+        'roles_table' => 'admin_roles',
+        'roles_model' => Dcat\Admin\Models\Role::class,
+
+        // Permission table and model.
+        'permissions_table' => 'admin_permissions',
+        'permissions_model' => Dcat\Admin\Models\Permission::class,
+
+        // Menu table and model.
+        'menu_table' => 'admin_menu',
+        'menu_model' => Dcat\Admin\Models\Menu::class,
+
+        // Pivot table for table above.
+        'role_users_table'       => 'admin_role_users',
+        'role_permissions_table' => 'admin_role_permissions',
+        'role_menu_table'        => 'admin_role_menu',
+        'permission_menu_table'  => 'admin_permission_menu',
+        'settings_table'         => 'admin_settings',
+        'extensions_table'       => 'admin_extensions',
+        'extension_histories_table' => 'admin_extension_histories',
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application layout
+    |--------------------------------------------------------------------------
+    |
+    | This value is the layout of admin pages.
+    */
+    'layout' => [
+        // default, blue, blue-light, green
+        'color' => 'default',
+
+        // sidebar-separate
+        'body_class' => [],
+
+        'horizontal_menu' => false,
+
+        'sidebar_collapsed' => false,
+
+        // light, primary, dark
+        'sidebar_style' => 'light',
+
+        'dark_mode_switch' => false,
+
+        // bg-primary, bg-info, bg-warning, bg-success, bg-danger, bg-dark
+        'navbar_color' => '',
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | The exception handler class
+    |--------------------------------------------------------------------------
+    |
+    */
+    'exception_handler' => Dcat\Admin\Exception\Handler::class,
+
+    /*
+    |--------------------------------------------------------------------------
+    | Enable default breadcrumb
+    |--------------------------------------------------------------------------
+    |
+    | Whether enable default breadcrumb for every page content.
+    */
+    'enable_default_breadcrumb' => true,
+
+    /*
+    |--------------------------------------------------------------------------
+    | Extension
+    |--------------------------------------------------------------------------
+    */
+    'extension' => [
+        // When you use command `php artisan admin:ext-make` to generate extensions,
+        // the extension files will be generated in this directory.
+        'dir' => base_path('dcat-admin-extensions'),
+    ],
+];

+ 232 - 0
config/api.php

xqd
@@ -0,0 +1,232 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Standards Tree
+    |--------------------------------------------------------------------------
+    |
+    | Versioning an API with Dingo revolves around content negotiation and
+    | custom MIME types. A custom type will belong to one of three
+    | standards trees, the Vendor tree (vnd), the Personal tree
+    | (prs), and the Unregistered tree (x).
+    |
+    | By default the Unregistered tree (x) is used, however, should you wish
+    | to you can register your type with the IANA. For more details:
+    | https://tools.ietf.org/html/rfc6838
+    |
+    */
+
+    'standardsTree' => env('API_STANDARDS_TREE', 'x'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | API Subtype
+    |--------------------------------------------------------------------------
+    |
+    | Your subtype will follow the standards tree you use when used in the
+    | "Accept" header to negotiate the content type and version.
+    |
+    | For example: Accept: application/x.SUBTYPE.v1+json
+    |
+    */
+
+    'subtype' => env('API_SUBTYPE', ''),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default API Version
+    |--------------------------------------------------------------------------
+    |
+    | This is the default version when strict mode is disabled and your API
+    | is accessed via a web browser. It's also used as the default version
+    | when generating your APIs documentation.
+    |
+    */
+
+    'version' => env('API_VERSION', 'v1'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default API Prefix
+    |--------------------------------------------------------------------------
+    |
+    | A default prefix to use for your API routes so you don't have to
+    | specify it for each group.
+    |
+    */
+
+    'prefix' => env('API_PREFIX', null),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default API Domain
+    |--------------------------------------------------------------------------
+    |
+    | A default domain to use for your API routes so you don't have to
+    | specify it for each group.
+    |
+    */
+
+    'domain' => env('API_DOMAIN', null),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Name
+    |--------------------------------------------------------------------------
+    |
+    | When documenting your API using the API Blueprint syntax you can
+    | configure a default name to avoid having to manually specify
+    | one when using the command.
+    |
+    */
+
+    'name' => env('API_NAME', null),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Conditional Requests
+    |--------------------------------------------------------------------------
+    |
+    | Globally enable conditional requests so that an ETag header is added to
+    | any successful response. Subsequent requests will perform a check and
+    | will return a 304 Not Modified. This can also be enabled or disabled
+    | on certain groups or routes.
+    |
+    */
+
+    'conditionalRequest' => env('API_CONDITIONAL_REQUEST', true),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Strict Mode
+    |--------------------------------------------------------------------------
+    |
+    | Enabling strict mode will require clients to send a valid Accept header
+    | with every request. This also voids the default API version, meaning
+    | your API will not be browsable via a web browser.
+    |
+    */
+
+    'strict' => env('API_STRICT', false),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Debug Mode
+    |--------------------------------------------------------------------------
+    |
+    | Enabling debug mode will result in error responses caused by thrown
+    | exceptions to have a "debug" key that will be populated with
+    | more detailed information on the exception.
+    |
+    */
+
+    'debug' => env('API_DEBUG', false),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Generic Error Format
+    |--------------------------------------------------------------------------
+    |
+    | When some HTTP exceptions are not caught and dealt with the API will
+    | generate a generic error response in the format provided. Any
+    | keys that aren't replaced with corresponding values will be
+    | removed from the final response.
+    |
+    */
+
+    'errorFormat' => [
+        'message' => ':message',
+        'errors' => ':errors',
+        'code' => ':code',
+        'status_code' => ':status_code',
+        'debug' => ':debug',
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | API Middleware
+    |--------------------------------------------------------------------------
+    |
+    | Middleware that will be applied globally to all API requests.
+    |
+    */
+
+    'middleware' => [
+
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Authentication Providers
+    |--------------------------------------------------------------------------
+    |
+    | The authentication providers that should be used when attempting to
+    | authenticate an incoming API request.
+    |
+    */
+
+    'auth' => [
+        'jwt' => 'Dingo\Api\Auth\Provider\JWT',
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Throttling / Rate Limiting
+    |--------------------------------------------------------------------------
+    |
+    | Consumers of your API can be limited to the amount of requests they can
+    | make. You can create your own throttles or simply change the default
+    | throttles.
+    |
+    */
+
+    'throttling' => [
+
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Response Transformer
+    |--------------------------------------------------------------------------
+    |
+    | Responses can be transformed so that they are easier to format. By
+    | default a Fractal transformer will be used to transform any
+    | responses prior to formatting. You can easily replace
+    | this with your own transformer.
+    |
+    */
+
+    'transformer' => env('API_TRANSFORMER', Dingo\Api\Transformer\Adapter\Fractal::class),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Response Formats
+    |--------------------------------------------------------------------------
+    |
+    | Responses can be returned in multiple formats by registering different
+    | response formatters. You can also customize an existing response
+    | formatter with a number of options to configure its output.
+    |
+    */
+
+    'defaultFormat' => env('API_DEFAULT_FORMAT', 'json'),
+
+    'formats' => [
+
+        'json' => Dingo\Api\Http\Response\Format\Json::class,
+
+    ],
+
+    'formatsOptions' => [
+
+        'json' => [
+            'pretty_print' => env('API_JSON_FORMAT_PRETTY_PRINT_ENABLED', false),
+            'indent_style' => env('API_JSON_FORMAT_INDENT_STYLE', 'space'),
+            'indent_size'  => env('API_JSON_FORMAT_INDENT_SIZE', 2),
+        ],
+
+    ],
+
+];

+ 237 - 0
config/app.php

xqd
@@ -0,0 +1,237 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application Name
+    |--------------------------------------------------------------------------
+    |
+    | This value is the name of your application. This value is used when the
+    | framework needs to place the application's name in a notification or
+    | any other location as required by the application or its packages.
+    |
+    */
+
+    'name' => env('APP_NAME', 'Laravel'),
+
+    'db_log' => env('APP_DB_LOG', false),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application Environment
+    |--------------------------------------------------------------------------
+    |
+    | This value determines the "environment" your application is currently
+    | running in. This may determine how you prefer to configure various
+    | services the application utilizes. Set this in your ".env" file.
+    |
+    */
+
+    'env' => env('APP_ENV', 'production'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application Debug Mode
+    |--------------------------------------------------------------------------
+    |
+    | When your application is in debug mode, detailed error messages with
+    | stack traces will be shown on every error that occurs within your
+    | application. If disabled, a simple generic error page is shown.
+    |
+    */
+
+    'debug' => (bool) env('APP_DEBUG', false),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application URL
+    |--------------------------------------------------------------------------
+    |
+    | This URL is used by the console to properly generate URLs when using
+    | the Artisan command line tool. You should set this to the root of
+    | your application so that it is used when running Artisan tasks.
+    |
+    */
+
+    'url' => env('APP_URL', 'http://localhost'),
+
+    'asset_url' => env('ASSET_URL', null),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application Timezone
+    |--------------------------------------------------------------------------
+    |
+    | Here you may specify the default timezone for your application, which
+    | will be used by the PHP date and date-time functions. We have gone
+    | ahead and set this to a sensible default for you out of the box.
+    |
+    */
+
+    'timezone' => 'Asia/Shanghai',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application Locale Configuration
+    |--------------------------------------------------------------------------
+    |
+    | The application locale determines the default locale that will be used
+    | by the translation service provider. You are free to set this value
+    | to any of the locales which will be supported by the application.
+    |
+    */
+
+    'locale' => 'zh-CN',
+    'locales' => ['cn', 'en', 'zh-CN', 'zh_CN', 'zh_TW'],  //包含的语言种类
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application Fallback Locale
+    |--------------------------------------------------------------------------
+    |
+    | The fallback locale determines the locale to use when the current one
+    | is not available. You may change the value to correspond to any of
+    | the language folders that are provided through your application.
+    |
+    */
+
+    'fallback_locale' => 'zh-CN',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Faker Locale
+    |--------------------------------------------------------------------------
+    |
+    | This locale will be used by the Faker PHP library when generating fake
+    | data for your database seeds. For example, this will be used to get
+    | localized telephone numbers, street address information and more.
+    |
+    */
+
+    'faker_locale' => 'zh-CN',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Encryption Key
+    |--------------------------------------------------------------------------
+    |
+    | This key is used by the Illuminate encrypter service and should be set
+    | to a random, 32 character string, otherwise these encrypted strings
+    | will not be safe. Please do this before deploying an application!
+    |
+    */
+
+    'key' => env('APP_KEY'),
+
+    'cipher' => 'AES-256-CBC',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Autoloaded Service Providers
+    |--------------------------------------------------------------------------
+    |
+    | The service providers listed here will be automatically loaded on the
+    | request to your application. Feel free to add your own services to
+    | this array to grant expanded functionality to your applications.
+    |
+    */
+
+    'providers' => [
+
+        /*
+         * Laravel Framework Service Providers...
+         */
+        Illuminate\Auth\AuthServiceProvider::class,
+        Illuminate\Broadcasting\BroadcastServiceProvider::class,
+        Illuminate\Bus\BusServiceProvider::class,
+        Illuminate\Cache\CacheServiceProvider::class,
+        Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
+        Illuminate\Cookie\CookieServiceProvider::class,
+        Illuminate\Database\DatabaseServiceProvider::class,
+        Illuminate\Encryption\EncryptionServiceProvider::class,
+        Illuminate\Filesystem\FilesystemServiceProvider::class,
+        Illuminate\Foundation\Providers\FoundationServiceProvider::class,
+        Illuminate\Hashing\HashServiceProvider::class,
+        Illuminate\Mail\MailServiceProvider::class,
+        Illuminate\Notifications\NotificationServiceProvider::class,
+        Illuminate\Pagination\PaginationServiceProvider::class,
+        Illuminate\Pipeline\PipelineServiceProvider::class,
+        Illuminate\Queue\QueueServiceProvider::class,
+        Illuminate\Redis\RedisServiceProvider::class,
+        Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
+        Illuminate\Session\SessionServiceProvider::class,
+        Illuminate\Translation\TranslationServiceProvider::class,
+        Illuminate\Validation\ValidationServiceProvider::class,
+        Illuminate\View\ViewServiceProvider::class,
+
+        /*
+         * Package Service Providers...
+         */
+
+        /*
+         * Application Service Providers...
+         */
+        App\Providers\AppServiceProvider::class,
+        App\Providers\AuthServiceProvider::class,
+        // App\Providers\BroadcastServiceProvider::class,
+        App\Providers\EventServiceProvider::class,
+        App\Providers\RouteServiceProvider::class,
+
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Class Aliases
+    |--------------------------------------------------------------------------
+    |
+    | This array of class aliases will be registered when this application
+    | is started. However, feel free to register as many as you wish as
+    | the aliases are "lazy" loaded so they don't hinder performance.
+    |
+    */
+
+    'aliases' => [
+
+        'App' => Illuminate\Support\Facades\App::class,
+        'Arr' => Illuminate\Support\Arr::class,
+        'Artisan' => Illuminate\Support\Facades\Artisan::class,
+        'Auth' => Illuminate\Support\Facades\Auth::class,
+        'Blade' => Illuminate\Support\Facades\Blade::class,
+        'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
+        'Bus' => Illuminate\Support\Facades\Bus::class,
+        'Cache' => Illuminate\Support\Facades\Cache::class,
+        'Config' => Illuminate\Support\Facades\Config::class,
+        'Cookie' => Illuminate\Support\Facades\Cookie::class,
+        'Crypt' => Illuminate\Support\Facades\Crypt::class,
+        'Date' => Illuminate\Support\Facades\Date::class,
+        'DB' => Illuminate\Support\Facades\DB::class,
+        'Eloquent' => Illuminate\Database\Eloquent\Model::class,
+        'Event' => Illuminate\Support\Facades\Event::class,
+        'File' => Illuminate\Support\Facades\File::class,
+        'Gate' => Illuminate\Support\Facades\Gate::class,
+        'Hash' => Illuminate\Support\Facades\Hash::class,
+        'Http' => Illuminate\Support\Facades\Http::class,
+        'Lang' => Illuminate\Support\Facades\Lang::class,
+        'Log' => Illuminate\Support\Facades\Log::class,
+        'Mail' => Illuminate\Support\Facades\Mail::class,
+        'Notification' => Illuminate\Support\Facades\Notification::class,
+        'Password' => Illuminate\Support\Facades\Password::class,
+        'Queue' => Illuminate\Support\Facades\Queue::class,
+        'RateLimiter' => Illuminate\Support\Facades\RateLimiter::class,
+        'Redirect' => Illuminate\Support\Facades\Redirect::class,
+        // 'Redis' => Illuminate\Support\Facades\Redis::class,
+        'Request' => Illuminate\Support\Facades\Request::class,
+        'Response' => Illuminate\Support\Facades\Response::class,
+        'Route' => Illuminate\Support\Facades\Route::class,
+        'Schema' => Illuminate\Support\Facades\Schema::class,
+        'Session' => Illuminate\Support\Facades\Session::class,
+        'Storage' => Illuminate\Support\Facades\Storage::class,
+        'Str' => Illuminate\Support\Str::class,
+        'URL' => Illuminate\Support\Facades\URL::class,
+        'Validator' => Illuminate\Support\Facades\Validator::class,
+        'View' => Illuminate\Support\Facades\View::class,
+
+    ],
+
+];

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