Browse Source

提交完整代码

tushan 1 year ago
parent
commit
11c1a7a154
100 changed files with 4545 additions and 0 deletions
  1. 14 0
      .gitignore
  2. 32 0
      LICENSE.txt
  3. 2 0
      README.md
  4. 26 0
      app/AppService.php
  5. 151 0
      app/BaseController.php
  6. 58 0
      app/ExceptionHandle.php
  7. 16 0
      app/Request.php
  8. 31 0
      app/common.php
  9. 41 0
      app/controller/Admin.php
  10. 205 0
      app/controller/Api.php
  11. 42 0
      app/controller/Config.php
  12. 27 0
      app/controller/Index.php
  13. 69 0
      app/controller/Link.php
  14. 91 0
      app/controller/LinkStore.php
  15. 95 0
      app/controller/Note.php
  16. 40 0
      app/controller/Setting.php
  17. 51 0
      app/controller/Tabbar.php
  18. 119 0
      app/controller/User.php
  19. 177 0
      app/controller/admin/Index.php
  20. 17 0
      app/event.php
  21. 10 0
      app/middleware.php
  22. 18 0
      app/model/ConfigModel.php
  23. 18 0
      app/model/HistoryModel.php
  24. 18 0
      app/model/LinkModel.php
  25. 17 0
      app/model/LinkStoreModel.php
  26. 13 0
      app/model/NoteModel.php
  27. 45 0
      app/model/SettingModel.php
  28. 18 0
      app/model/TabbarModel.php
  29. 12 0
      app/model/TokenModel.php
  30. 13 0
      app/model/UserModel.php
  31. 10 0
      app/provider.php
  32. 9 0
      app/service.php
  33. 63 0
      composer.json
  34. 2125 0
      composer.lock
  35. 37 0
      config/app.php
  36. 39 0
      config/cache.php
  37. 9 0
      config/console.php
  38. 20 0
      config/cookie.php
  39. 68 0
      config/database.php
  40. 24 0
      config/filesystem.php
  41. 27 0
      config/lang.php
  42. 45 0
      config/log.php
  43. 8 0
      config/middleware.php
  44. 45 0
      config/route.php
  45. 19 0
      config/session.php
  46. 10 0
      config/trace.php
  47. 25 0
      config/view.php
  48. 10 0
      extend/Axios.php
  49. 32 0
      extend/Mail.php
  50. 73 0
      extend/NetworkSpeedMonitor.php
  51. 177 0
      extend/Upgrade2.php
  52. 104 0
      install.sql
  53. 1 0
      public/dist/assets/360.1696777084030.svg
  54. 1 0
      public/dist/assets/about.1696777084030.css
  55. 1 0
      public/dist/assets/about.1696777084030.js
  56. 1 0
      public/dist/assets/about.1696777084030.svg
  57. 1 0
      public/dist/assets/add.1696777084030.svg
  58. 1 0
      public/dist/assets/addicon.1696777084030.css
  59. 1 0
      public/dist/assets/addicon.1696777084030.js
  60. 1 0
      public/dist/assets/appSide.1696777084030.css
  61. 0 0
      public/dist/assets/appSide.1696777084030.js
  62. 1 0
      public/dist/assets/appstore.1696777084030.svg
  63. 1 0
      public/dist/assets/baidu.1696777084030.svg
  64. BIN
      public/dist/assets/baidudev.1696777084030.png
  65. 1 0
      public/dist/assets/bing.1696777084030.svg
  66. 0 0
      public/dist/assets/boy.1696777084030.svg
  67. 1 0
      public/dist/assets/class.1696777084030.svg
  68. 0 0
      public/dist/assets/clienthome.1696777084030.svg
  69. 1 0
      public/dist/assets/close.1696777084030.svg
  70. 1 0
      public/dist/assets/controller.1696777084030.css
  71. 0 0
      public/dist/assets/controller.1696777084030.js
  72. 0 0
      public/dist/assets/cover.1696777084030.svg
  73. 1 0
      public/dist/assets/custom.1696777084030.css
  74. 0 0
      public/dist/assets/custom.1696777084030.js
  75. 1 0
      public/dist/assets/custom.1696777084030.svg
  76. 1 0
      public/dist/assets/del.1696777084030.svg
  77. 1 0
      public/dist/assets/deskTopMouse.1696777084030.css
  78. 1 0
      public/dist/assets/deskTopMouse.1696777084030.js
  79. 1 0
      public/dist/assets/edit.1696777084030.js
  80. 14 0
      public/dist/assets/edit.1696777084030.svg
  81. 1 0
      public/dist/assets/google.1696777084030.svg
  82. 0 0
      public/dist/assets/href.1696777084030.js
  83. 0 0
      public/dist/assets/iconGroup.1696777084030.css
  84. 1 0
      public/dist/assets/iconGroup.1696777084030.js
  85. 1 0
      public/dist/assets/iconGroupBox.1696777084030.css
  86. 0 0
      public/dist/assets/iconGroupBox.1696777084030.js
  87. 0 0
      public/dist/assets/index.1696777084030.css
  88. 0 0
      public/dist/assets/index.1696777084030.js
  89. 0 0
      public/dist/assets/index.16967770840302.css
  90. 7 0
      public/dist/assets/index.16967770840302.js
  91. 0 0
      public/dist/assets/index.16967770840303.css
  92. 0 0
      public/dist/assets/index.16967770840303.js
  93. 0 0
      public/dist/assets/index.16967770840304.css
  94. 14 0
      public/dist/assets/index.16967770840304.js
  95. 13 0
      public/dist/assets/jquery.1696777084030.js
  96. 0 0
      public/dist/assets/kong.1696777084030.svg
  97. 6 0
      public/dist/assets/lajitong.1696777084030.svg
  98. 1 0
      public/dist/assets/layout.1696777084030.css
  99. 1 0
      public/dist/assets/layout.1696777084030.js
  100. 1 0
      public/dist/assets/layout.1696777084030.svg

+ 14 - 0
.gitignore

@@ -0,0 +1,14 @@
+/.idea
+/.vscode
+*.log
+.env
+storage
+/runtime/
+private.key
+publickey.key
+/config/jsonConfig/siteConfig.json
+/.well-known
+public/.user.ini
+public/images
+public/installed.lock
+.user.ini

+ 32 - 0
LICENSE.txt

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

+ 2 - 0
README.md

@@ -0,0 +1,2 @@
+# 这是一个社区版本的Mtab书签
+社区分支

+ 26 - 0
app/AppService.php

@@ -0,0 +1,26 @@
+<?php
+declare (strict_types=1);
+
+namespace app;
+
+use think\Service;
+
+/**
+ * 应用服务类
+ */
+class AppService extends Service
+{
+    public function register()
+    {
+        // 服务注册
+        if (!file_exists(public_path() . 'installed.lock')) {//如果没有安装的就提示安装
+            header("Location:/install.php");
+            exit();
+        }
+    }
+
+    public function boot()
+    {
+        // 服务启动
+    }
+}

+ 151 - 0
app/BaseController.php

@@ -0,0 +1,151 @@
+<?php
+/*
+ * @description: 
+ * @Date: 2022-09-26 17:52:37
+ * @LastEditTime: 2022-09-26 20:28:17
+ */
+
+declare(strict_types=1);
+
+namespace app;
+
+use app\model\SettingModel;
+use app\model\TokenModel;
+use app\model\UserModel;
+
+;
+
+use think\App;
+use think\db\exception\DataNotFoundException;
+use think\db\exception\DbException;
+use think\db\exception\ModelNotFoundException;
+use think\Model;
+
+/**
+ * 控制器基础类
+ */
+class BaseController
+{
+    /**
+     * Request实例
+     * @var \think\Request
+     */
+    protected $request;
+
+    /**
+     * 应用实例
+     * @var \think\App
+     */
+    protected $app;
+
+    /**
+     * 是否批量验证
+     * @var bool
+     */
+    protected $batchValidate = false;
+
+    /**
+     * 控制器中间件
+     * @var array
+     */
+    protected $middleware = [];
+
+    /**
+     * 构造方法
+     * @access public
+     * @param App $app 应用对象
+     */
+    protected $user_temp = false;
+    private $SettingConfig = false;
+
+    public function __construct(App $app)
+    {
+
+        $this->app = $app;
+        $this->request = $this->app->request;
+        // 控制器初始化
+        $this->initialize();
+    }
+
+    // 初始化
+    protected function initialize()
+    {
+    }
+
+    //系统设置项
+    public function Setting($key = false, $def = false, $emptyReplace = false)
+    {
+        if ($this->SettingConfig === false) {
+            $this->SettingConfig = SettingModel::Config();
+        }
+        if ($key) {
+            if (isset($this->SettingConfig[$key])) {
+                if ($emptyReplace && empty($this->SettingConfig[$key])) {
+                    return $def;
+                }
+                return $this->SettingConfig[$key];
+            }
+            return $def;
+        }
+        return $this->SettingConfig;
+    }
+
+    /**
+     * @description :用户信息获取
+     * @param false $must 是否强制验证,true则强制验证程序退出
+     * @return TokenModel|array|bool|mixed|Model|void
+     * @throws DataNotFoundException
+     * @throws DbException
+     * @throws ModelNotFoundException
+     */
+    public function getUser(bool $must = false)
+    {
+        $id = $this->request->header("Userid");
+        $token = $this->request->header("Token", '');
+        if ($id && $token) {
+            if ($this->user_temp) return $this->user_temp;
+            $user = TokenModel::where("user_id", $id)->where('token', $token)->field("user_id,token,create_time")->cache('user.' . $id, 300)->find();
+            if ($user) {
+                if ((time() - $user['create_time']) > (864000)) { //token定时15天清理一次,10-15天内如果使用了则重新计算时间
+                    $user->create_time = time();
+                    $user->save();
+                }
+                $this->user_temp = $user;
+                return $user;
+            }
+        }
+        if ($must) {
+            $this->error("请登录后操作")->send();
+            exit();
+        }
+        return false;
+    }
+
+    //admin认证
+    public function getAdmin()
+    {
+        $user = $this->getUser(true);
+        $info = UserModel::where('id', $user['user_id'])->where("manager", 1)->find();
+        if ($info) {
+            return $info;
+        }
+        $this->error('not permission')->send();
+        exit();
+    }
+
+    public function success($msg, $data = []): \think\response\Json
+    {
+        if (is_array($msg)) {
+            return json(['msg' => "", "code" => 1, "data" => $msg]);
+        }
+        return json(['msg' => $msg, "code" => 1, "data" => $data]);
+    }
+
+    public function error($msg, $data = []): \think\response\Json
+    {
+        if (is_array($msg)) {
+            return json(['msg' => "", "code" => 0, "data" => $msg]);
+        }
+        return json(['msg' => $msg, "code" => 0, "data" => $data]);
+    }
+}

+ 58 - 0
app/ExceptionHandle.php

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

+ 16 - 0
app/Request.php

@@ -0,0 +1,16 @@
+<?php
+
+namespace app;
+
+
+class Request extends \think\Request
+{
+
+    function __construct()
+    {
+        parent::__construct();
+        header('Access-Control-Allow-Origin:*');
+        header('Access-Control-Allow-Headers:*');
+        header('Access-Control-Allow-Methods:*');
+    }
+}

+ 31 - 0
app/common.php

@@ -0,0 +1,31 @@
+<?php
+// 应用公共文件
+function validateEmail($email): bool
+{
+    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
+        return false;
+    } else {
+        return true;
+    }
+}
+
+function uuid(): string
+{
+    $chars = md5(uniqid(mt_rand(), true));
+    return substr($chars, 0, 8) . '-'
+        . substr($chars, 8, 4) . '-'
+        . substr($chars, 12, 4) . '-'
+        . substr($chars, 16, 4) . '-'
+        . substr($chars, 20, 12);
+}
+
+function renderToken($t = 'tab'): string
+{
+    $s = uuid() . strval(time()) . $t;
+    return md5($s);
+}
+
+function joinPath($path1, $path2)
+{
+    return preg_replace("#//#", "/", $path1 . $path2);
+}

+ 41 - 0
app/controller/Admin.php

@@ -0,0 +1,41 @@
+<?php
+
+namespace app\controller;
+
+use app\BaseController;
+use app\model\UserModel;
+use GuzzleHttp\Exception\GuzzleException;
+use think\facade\Log;
+
+class Admin extends BaseController
+{
+    public function UserList(): \think\response\Json
+    {
+        $this->getAdmin();
+        $limit = $this->request->all('limit', 50);
+        $search = $this->request->post('search');
+        $sql = [];
+        if (isset($search['mail']) && mb_strlen($search['mail']) > 0) {
+            $sql['mail'] = $search['mail'];
+        }
+        $user = UserModel::where($sql)->withoutField('password')->order("id", 'desc')->paginate($limit);
+        return $this->success('ok', $user);
+    }
+
+    function userUpdate(): \think\response\Json
+    {
+        $this->getAdmin();
+        $id = $this->request->post('id');
+        $user = UserModel::where('id', $id)->find();
+        $data = $this->request->post();
+        if (!$user) {
+            return $this->error('用户不存在');
+        }
+        //如果字段中的password有内容则md5加密后保存
+        if (isset($data['password']) && mb_strlen($data['password']) > 0) {
+            $data['password'] = md5($data['password']);
+        }
+        $user->save($data);
+        return $this->success('ok');
+    }
+}

+ 205 - 0
app/controller/Api.php

@@ -0,0 +1,205 @@
+<?php
+
+namespace app\controller;
+
+use app\BaseController;
+use app\model\SettingModel;
+use GuzzleHttp\Client;
+use GuzzleHttp\Exception\RequestException;
+use PHPHtmlParser\Dom;
+use think\facade\Cache;
+use think\facade\Filesystem;
+use think\helper\Str;
+
+class Api extends BaseController
+{
+    public function site(): \think\response\Json
+    {
+        return $this->success("ok", [
+            'email' => $this->Setting('email', '')
+        ]);
+    }
+
+    public function background()
+    {
+        $bg = $this->Setting('backgroundImage');
+        if ($bg) {
+            return redirect($bg, 302);
+        }
+        return download("static/background.jpeg",);
+    }
+
+    //获取邮件验证码
+    function getMailCode(): \think\response\Json
+    {
+        $mail = $this->request->post("mail", false);
+        $code = rand(100000, 999999);
+        if ($mail) {
+            if (Cache::get('code' . $mail)) {
+                return $this->success("请勿频繁获取验证码");
+            }
+            $status = \Mail::send($mail, "<h2>您的验证码是: <b style='color:#1d5cdc'>$code</b></h2>");
+            if ($status) {
+                Cache::set('code' . $mail, $code, 60);
+                return $this->success("发送成功");
+            }
+        }
+        return $this->error('发送失败');
+    }
+
+    function getIcon(): \think\response\Json
+    {
+        $avatar = $this->request->post('avatar');
+        if ($avatar) {
+            $remote_avatar = $this->Setting("remote_avatar", "https://avatar.mtab.cc/6.x/thumbs/png?seed=", true);
+            $str = $this->downloadFile($remote_avatar . $avatar, md5($avatar) . '.png');
+            return $this->success(['src' => $str]);
+        }
+        $url = $this->request->post('url', false);
+        $icon = "";
+        $cdn = $this->Setting('assets_host', '');
+        if ($url) {
+            $urlInfo = parse_url($url);
+            $host = $urlInfo['host'] ?? $urlInfo['path'];
+            $title = '';
+            $scheme = "https";
+            if (isset($urlInfo['scheme'])) {
+                $scheme = $urlInfo["scheme"];
+            }
+            $realUrl = $scheme . "://" . $host;
+            $client = new Client();
+            $response = $client->get($realUrl);
+            $status = $response->getStatusCode();
+            if ($status == 200) {
+                $body = $response->getBody()->getContents();
+                $dom = new Dom();
+                $dom->loadStr($body);
+                $title = $dom->find('title');
+                if (count($title) > 0) {
+                    $title = $title->innerText;
+                }
+                try {
+                    $list = $dom->find('[rel="icon"]');
+                    if (count($list) > 0) {
+                        $icon = $list->href;
+                        if (preg_match('/\.(png|jpg|jpeg|ico|svg )$/', $icon, $matches)) {
+                            $fileFormat = $matches[1];
+                            $iconInfo = parse_url($icon);
+                            if (!isset($iconInfo['scheme'])) {
+                                $icon = $realUrl . $icon;
+                            }
+                            $icon = $this->downloadFile($icon, md5($realUrl) . '.' . $fileFormat);
+                            if ($icon) {
+                                $icon = $cdn . $icon;
+                            }
+                        } else {
+                            $icon = '';
+                        }
+
+                    }
+                } catch (\ErrorException $e) {
+                }
+            }
+            if (strlen($icon) == 0) {
+                $client = new Client();
+                $response = $client->get($realUrl . '/favicon.ico');
+                $status = $response->getStatusCode();
+                if ($status == 200) {
+                    $icon = $realUrl . '/favicon.ico';
+                    $icon = $this->downloadFile($icon, md5($realUrl) . ".ico");
+                    if ($icon) {
+                        $icon = $cdn . $icon;
+                    }
+                }
+            }
+            if (strlen($icon) > 0) {
+                return $this->success(['src' => $icon, 'name' => $title]);
+            }
+        }
+        return $this->error('no');
+    }
+
+    private function downloadFile($url, $name)
+    {
+        $client = new Client();
+        $path = '/images/' . date('Y/m/d/');
+        $remotePath = public_path() . $path;
+        $downloadPath = $remotePath . $name;
+        if (!is_dir($remotePath)) {
+            mkdir($remotePath, 0755, true);
+        }
+        try {
+            $response = $client->request('GET', $url, [
+                'sink' => $downloadPath
+            ]);
+            return $path . $name;
+        } catch (RequestException $e) {
+        }
+        return false;
+    }
+
+    function renderIco(): \think\Response
+    {
+        $send = $this->request->get('seed');
+        $client = new Client();
+        $remote_avatar = $this->Setting('remote_avatar', 'https://avatar.mtab.cc/6.x/thumbs/png?seed=', true);
+        $response = $client->get($remote_avatar . urlencode($send), [
+            'stream' => true,
+            'timeout' => 10,
+        ]);
+        return response($response->getBody(), 200, ['Content-Type' => 'image/png']);
+    }
+
+    function upload(): \think\response\Json
+    {
+        $file = $this->request->file('file');
+        if (empty($file)) {
+            return $this->error('not File');
+        }
+        if ($file->getSize() > 1024 * 1024 * 5) {
+            return $this->error('max fileSize is 5M');
+        }
+        if (in_array(strtolower($file->getOriginalExtension()), ['png', 'jpg', 'jpeg', 'webp'])) {
+            // 验证文件并保存
+            try {
+                // 构建保存路径
+                $savePath = '/images/' . date('Y/m/d');
+                $hash = Str::random(32);
+                $fileName = $hash . '.' . $file->getOriginalExtension();
+                $filePath = Filesystem::disk('images')->putFileAs($savePath, $file, $fileName);
+                $cdn = $this->Setting('assets_host', '/', true);
+                return $this->success(['url' => $cdn . $filePath]);
+            } catch (\think\exception\ValidateException $e) {
+                // 验证失败,给出错误提示
+                // ...
+            }
+        }
+        return $this->error('上传失败');
+    }
+
+    function AdminUpload(): \think\response\Json
+    {
+        $this->getAdmin();
+        $file = $this->request->file('file');
+        if (empty($file)) {
+            return $this->error('not File');
+        }
+        if ($file->getSize() > 1024 * 1024 * 5) {
+            return $this->error('max fileSize is 5M');
+        }
+        // 验证文件并保存
+        try {
+            // 构建保存路径
+            $savePath = '/images/' . date('Y/m/d');
+            $hash = Str::random(32);
+            $fileName = $hash . '.' . $file->getOriginalExtension();
+            $filePath = Filesystem::disk('images')->putFileAs($savePath, $file, $fileName);
+            $cdn = $this->Setting('assets_host', '/', true);
+            return $this->success(['url' => $cdn . $filePath]);
+        } catch (\think\exception\ValidateException $e) {
+            // 验证失败,给出错误提示
+            // ...
+        }
+        return $this->error('上传失败');
+    }
+}

+ 42 - 0
app/controller/Config.php

@@ -0,0 +1,42 @@
+<?php
+
+
+namespace app\controller;
+
+
+use app\BaseController;
+use app\model\ConfigModel;
+
+class Config extends BaseController
+{
+    public function update(): \think\response\Json
+    {
+        $user = $this->getUser(true);
+        if ($user) {
+            $config = $this->request->post("config", []);
+            if ($config) {
+                $is = ConfigModel::where("user_id", $user['user_id'])->find();
+                if ($is) {
+                    $is->config = $config;
+                    $is->save();
+                } else {
+                    ConfigModel::create(["user_id" => $user['user_id'], "config" => $config]);
+                }
+                return $this->success('ok');
+            }
+        }
+        return $this->error('保存失败');
+    }
+
+    public function get(): \think\response\Json
+    {
+        $user = $this->getUser();
+        if ($user) {
+            $data = ConfigModel::find($user['user_id']);
+            if ($data) {
+                return $this->success("ok", $data['config']);
+            }
+        }
+        return $this->error('not Config');
+    }
+}

+ 27 - 0
app/controller/Index.php

@@ -0,0 +1,27 @@
+<?php
+namespace app\controller;
+use app\BaseController;
+use app\model\SettingModel;
+use GuzzleHttp\Exception\GuzzleException;
+use think\exception\ErrorException;
+use think\facade\Cache;
+use think\facade\View;
+use think\Request;
+class Index extends BaseController
+{
+    function index(Request $request, $s = ''): string
+    {
+        $title = SettingModel::Config('title','Mtab书签');
+        View::assign("title",$title);
+        View::assign("keywords",SettingModel::Config('keywords','Mtab书签'));
+        View::assign("description",SettingModel::Config('description','Mtab书签'));
+        return View::fetch("dist/index.html");
+    }
+
+    function favicon(): \think\response\File
+    {
+        //从配置中获取logo
+        $favicon = $this->Setting('logo');
+        return download(public_path() . $favicon);
+    }
+}

+ 69 - 0
app/controller/Link.php

@@ -0,0 +1,69 @@
+<?php
+
+namespace app\controller;
+
+use app\BaseController;
+use app\model\HistoryModel;
+use app\model\LinkModel;
+use app\model\SettingModel;
+use app\model\TabbarModel;
+
+class Link extends BaseController
+{
+    public function update(): \think\response\Json
+    {
+        $user = $this->getUser(true);
+        if ($user) {
+            $link = $this->request->post("link", []);
+            if ($link) {
+                $is = LinkModel::where("user_id", $user['user_id'])->find();
+                if ($is) {
+                    $is->link = $link;
+                    $is->save();
+                } else {
+                    LinkModel::create(["user_id" => $user['user_id'], "link" => $link]);
+                }
+                HistoryModel::create(["user_id" => $user['user_id'], "link" => $link]); //历史记录备份,用于用户误操作回复用途
+                return $this->success('ok');
+            }
+        }
+        return $this->error('保存失败');
+    }
+
+    public function get(): \think\response\Json
+    {
+        $user = $this->getUser();
+        if ($user) {
+            $data = LinkModel::find($user['user_id']);
+            if ($data) {
+                return $this->success('ok', $data['link']);
+            }
+        }
+        $config = $this->Setting("defaultTab", '/static/defaultTab.json', true);
+        if ($config) {
+            $fp = joinPath(public_path(), $config);
+            if (file_exists($fp)) {
+                $file = file_get_contents($fp);
+                $json = json_decode($file, true);
+                return $this->success('ok', $json['link'] ?? []);
+            }
+        }
+        return $this->success('ok', []);
+    }
+
+    public function reset(): \think\response\Json
+    {
+        $user = $this->getUser();
+        if ($user) {
+            $data = LinkModel::find($user['user_id']);
+            if ($data) {
+                $data->delete();
+            }
+            $data = TabbarModel::find($user['user_id']);
+            if ($data) {
+                $data->delete();
+            }
+        }
+        return $this->success('ok');
+    }
+}

+ 91 - 0
app/controller/LinkStore.php

@@ -0,0 +1,91 @@
+<?php
+
+namespace app\controller;
+
+use app\BaseController;
+use app\model\LinkStoreModel;
+use think\facade\Db;
+
+class LinkStore extends BaseController
+{
+    public function list(): \think\response\Json
+    {
+        $limit = $this->request->post('limit', 15);
+        $name = $this->request->post('name', false);
+        $area = $this->request->post('area', false);
+        $sql = [];
+        if ($name) {
+            $sql[] = ['name', 'like', "%" . $name . "%"];
+        }
+        $list = LinkStoreModel::where($sql);
+        //area需要使用find_in_set来匹配
+        if ($area) {
+            $list = $list->whereRaw("find_in_set('$area',area)");
+        }
+        $list = $list->order("hot", 'desc')->paginate($limit);
+        return $this->success('ok', $list);
+    }
+
+    private function update(): \think\response\Json
+    {
+        $data = $this->request->post("form");
+        $info = LinkStoreModel::where("id", $data['id'])->update($data);
+        return $this->success('修改成功', $info);
+    }
+
+    public function add(): \think\response\Json
+    {
+        $admin = $this->getAdmin();
+        $data = $this->request->post('form');
+        if ($data) {
+            if (isset($data['id']) && $data['id']) { //更新
+                return $this->update();
+            } else {
+                $data['create_time'] = date("Y-m-d H:i:s");
+                $info = (new \app\model\LinkStoreModel)->insert($data);
+                return $this->success('添加成功', $info);
+            }
+        }
+        return $this->error('缺少数据');
+    }
+
+    public function getIcon(): \think\response\Json
+    {
+        $url = $this->request->post('url', false);
+
+        if ($url) {
+            if (mb_substr($url, 0, 4) == 'tab:') {
+            } else {
+                if (mb_substr($url, 0, 4) != 'http') {
+                    $url = 'https://' . $url;
+                }
+                $url = parse_url($url);
+                $url = $url['host'];
+            }
+            $data = LinkStoreModel::whereRaw("FIND_IN_SET('$url',domain)")->find();
+            if ($data) {
+                return $this->success('ok', $data);
+            }
+        }
+        return $this->error('no', '未查询到相关信息');
+    }
+
+    function install_num(): \think\response\Json
+    {
+        $id = $this->request->post('id', false);
+        //给标签+=1
+        $res = Db::table("linkstore")->where('id', $id)->inc('install_num')->update();
+        if ($res) {
+            return $this->success('ok');
+        }
+        return $this->error('fail');
+    }
+
+    public function del(): \think\response\Json
+    {
+        $this->getAdmin();
+        $ids = $this->request->post('ids', []);
+        LinkStoreModel::where("id", 'in', $ids)->delete();
+        return $this->success('删除成功');
+    }
+}

+ 95 - 0
app/controller/Note.php

@@ -0,0 +1,95 @@
+<?php
+
+
+namespace app\controller;
+
+
+use app\BaseController;
+use think\Exception;
+
+class Note extends BaseController
+{
+    //获取列表
+    public function get(): \think\response\Json
+    {
+        $user = $this->getUser();
+        $sort = $this->request->get('sort', 'desc');
+        $limit = $this->request->get('limit', 999999);
+        if (!$user) {
+            return $this->success('', []);
+        }
+        $data = (new \app\model\NoteModel)->where("user_id", $user['user_id'])->field('user_id,id,title,create_time,update_time')->order('id', $sort)->limit($limit)->select();
+        return $this->success('ok', $data);
+    }
+
+    //获取文本
+    public function getText(): \think\Response
+    {
+        $user = $this->getUser(true);
+        $id = $this->request->get('id');
+        $data = (new \app\model\NoteModel)->where("user_id", $user['user_id'])->field("text,id")->where('id', $id)->find();
+        try {
+            return response($data['text']);
+        } catch (Exception $e) {
+            return response('');
+        }
+    }
+
+    //删除
+    public function del(): \think\response\Json
+    {
+        $user = $this->getUser(true);
+        $id = $this->request->get('id');
+        $data = (new \app\model\NoteModel)->where("user_id", $user['user_id'])->where('id', $id)->delete();
+        return $this->success('删除成功', $data);
+    }
+
+    //添加内容
+    public function add(): \think\response\Json
+    {
+        $user = $this->getUser(true);
+        $title = $this->request->post('title', '');
+        $text = $this->request->post('text', '');
+        $id = $this->request->post('id', false);
+        if ($id != '') {
+            return $this->update();
+        }
+        $data = array(
+            "user_id" => $user['user_id'],
+            "text" => $text,
+            "title" => $title,
+            "create_time" => date("Y-m-d H:i:s"),
+            "update_time" => date("Y-m-d H:i:s"),
+        );
+        $status = (new \app\model\NoteModel)->insertGetId($data);
+        if ($status) {
+            $data['id'] = $status;
+            return $this->success("创建成功", $data);
+        }
+        return $this->error('失败');
+    }
+
+    //更新内容
+    public function update(): \think\response\Json
+    {
+        $user = $this->getUser(true);
+        $id = $this->request->post('id', false);
+        if (!$id) {
+            return $this->error('no');
+        }
+        $title = $this->request->post('title', '');
+        $text = $this->request->post('text', '');
+        $data = array(
+            "user_id" => $user['user_id'],
+            "text" => $text,
+            "title" => $title,
+            "update_time" => date("Y-m-d H:i:s"),
+        );
+        $status = (new \app\model\NoteModel)->where("id", $id)->where('user_id', $user['user_id'])->update($data);
+        if ($status) {
+            $data['id'] = $id;
+            return $this->success("修改", $data);
+        }
+        return $this->error('失败');
+    }
+}

+ 40 - 0
app/controller/Setting.php

@@ -0,0 +1,40 @@
+<?php
+
+
+namespace app\controller;
+
+
+use app\BaseController;
+use app\model\SettingModel;
+use think\facade\Cache;
+use think\facade\Db;
+
+class Setting extends BaseController
+{
+    function saveSetting(): \think\response\Json
+    {
+        $this->getAdmin();
+        $list = $this->request->post('form');
+        $tmp = [];
+        foreach ($list as $key => $value) {
+            $tmp[] = [
+                'keys' => $key,
+                'value' => $value
+            ];
+        }
+        Db::table('setting')->replace()->insertAll($tmp);
+        $config = array_column($tmp, 'value', 'keys');
+        Cache::set('webConfig', $config, 300);
+        return $this->success('ok');
+    }
+
+    function getSetting(): \think\response\Json
+    {
+        $admin = $this->getAdmin();
+        $info = SettingModel::Config();
+        if ($info) {
+            return $this->success('ok', $info);
+        }
+        return $this->error('empty');
+    }
+}

+ 51 - 0
app/controller/Tabbar.php

@@ -0,0 +1,51 @@
+<?php
+
+
+namespace app\controller;
+
+
+use app\BaseController;
+use app\model\TabbarModel;
+
+class Tabbar extends BaseController
+{
+    public function update(): \think\response\Json
+    {
+        $user = $this->getUser(true);
+        if ($user) {
+            $tabbar = $this->request->post("tabbar", []);
+            if (is_array($tabbar)) {
+                $is = TabbarModel::where("user_id", $user['user_id'])->find();
+                if ($is) {
+                    $is->tabs = $tabbar;
+                    $is->save();
+                } else {
+                    TabbarModel::create(["user_id" => $user['user_id'], "tabs" => $tabbar]);
+                }
+                return $this->success('ok');
+            }
+        }
+        return $this->error('保存失败');
+    }
+
+    public function get(): \think\response\Json
+    {
+        $user = $this->getUser();
+        if ($user) {
+            $data = TabbarModel::find($user['user_id']);
+            if ($data) {
+                return $this->success('ok', $data['tabs']);
+            }
+        }
+        $config = $this->Setting('defaultTab', '/static/defaultTab.json', true);
+        if ($config) {
+            $fp = joinPath(public_path(), $config);
+            if (file_exists($fp)) {
+                $file = file_get_contents($fp);
+                $json = json_decode($file, true);
+                return $this->success('ok', $json['tabbar'] ?? []);
+            }
+        }
+        return $this->success('ok', []);
+    }
+}

+ 119 - 0
app/controller/User.php

@@ -0,0 +1,119 @@
+<?php
+
+
+namespace app\controller;
+
+use app\BaseController;
+use app\model\TokenModel;
+use app\model\UserModel;
+use think\facade\Cache;
+
+class User extends BaseController
+{
+    public function login(): \think\response\Json
+    {
+        $user = $this->request->post('username', '0');
+        $pass = $this->request->post('password', '0');
+        $info = UserModel::where("mail", $user)->field('id,mail,password,login_fail_count,login_ip,login_time')->find();
+
+        if (Cache::get('login.' . $user)) {
+            return $this->error("账号已被安全锁定,您可以修改密码然后登录");
+        }
+        if (!$info) {
+            return $this->error("账号不存在");
+        }
+        if ($info['login_fail_count'] == 10) {
+            Cache::set('login.' . $user, 'lock', 7200);
+            $info->login_fail_count = 0;
+            $info->save();
+            return $this->error("账号已被锁定2小时");
+        }
+        if ($info['password'] != md5($pass)) {
+            $info->login_fail_count += 1;
+            $info->save();
+            return $this->error("账号不存在或密码错误");
+        }
+        $token = renderToken($user);
+        $agent = $this->request->header("User-Agent");
+        $agent = mb_substr($agent, 0, 250);
+        $auth = ["user_id" => $info['id'], 'token' => $token, 'create_time' => time(), 'ip' => $this->request->ip(), 'user_agent' => $agent];
+        $add = TokenModel::insert($auth);
+        unset($auth['user_agent']);
+        unset($auth['ip']);
+        $info->login_ip = $this->request->ip();
+        $info->login_time = date("Y-m-d H:i:s");
+        $info->login_fail_count = 0;//登陆成功将失败次数归零
+        $info->save();
+        return $this->success("登录成功", $auth);
+    }
+
+    function register(): \think\response\Json
+    {
+        $user = $this->request->post('username', false);
+        $pass = $this->request->post('password', false);
+        $code = $this->request->post('code', '0000');
+        if ($user && $pass) {
+            if (!validateEmail($user)) {
+                return $this->error("邮箱格式错误");
+            }
+            if (strlen($pass) < 6) {
+                return $this->error("密码过短");
+            }
+            $cacheCode = Cache::get("code" . $user);
+            if (!$cacheCode && $cacheCode != $code) {
+                return $this->error('验证码错误');
+            }
+            if (UserModel::where("mail", $user)->field("id,mail")->find()) {
+                return $this->error("账号已存在");
+            }
+            $add = UserModel::insert(["mail" => $user, "password" => md5($pass), "create_time" => date('Y-m-d H:i:s'),'register_ip'=>$this->request->ip()]);
+            if ($add) {
+                Cache::delete("code" . $user);
+                return $this->success("ok");
+            }
+        }
+        return $this->error('注册失败');
+    }
+
+    public function forgetPass(): \think\response\Json
+    {
+        $user = $this->request->post('username', false);
+        $pass = $this->request->post('password', false);
+        $code = $this->request->post('code', '0000');
+        if ($user && $pass) {
+            if (!validateEmail($user)) {
+                return $this->error("邮箱格式错误");
+            }
+            if (strlen($pass) < 6) {
+                return $this->error("密码过短");
+            }
+            $info = UserModel::where("mail", $user)->field("id,mail")->find();
+            if (!$info) {
+                return $this->error("账号不存在");
+            }
+            $cacheCode = Cache::get("code" . $user);
+            if ($cacheCode && $cacheCode == $code) {
+                $info->password = md5($pass);
+                $add = $info->save();
+                if ($add) {
+                    TokenModel::where("user_id", $info['id'])->delete(); //删除所有登录记录
+                    Cache::delete('login.' . $user);
+                    return $this->success("ok");
+                }
+            } else {
+                return $this->error('验证码错误');
+            }
+        }
+        return $this->error('修改失败');
+    }
+
+    public function get(): \think\response\Json
+    {
+        $info = $this->getUser(true);
+        if ($info) {
+            $info = UserModel::field('id,mail,manager')->find($info['user_id']);
+            return $this->success('ok', $info);
+        }
+        return $this->error('获取失败');
+    }
+}

+ 177 - 0
app/controller/admin/Index.php

@@ -0,0 +1,177 @@
+<?php
+
+namespace app\controller\admin;
+
+use app\BaseController;
+use app\model\LinkStoreModel;
+use app\model\SettingModel;
+use app\model\UserModel;
+use DateInterval;
+use DatePeriod;
+use DateTime;
+use think\facade\Db;
+
+//use Upgrade;
+
+class Index extends BaseController
+{
+    public string $authService = "http://auth.mtab.cc";
+    public string $authCode = '';
+
+    function setSubscription(): \think\response\Json
+    {
+        $code = $this->request->post("code", "");
+        if (trim($code)) {
+            Db::table('setting')->replace()->insert(['keys' => 'authCode', 'value' => $code]);
+            SettingModel::refreshSetting();
+        }
+        return $this->success("ok");
+    }
+
+    private function initAuth()
+    {
+        $authCode = $this->Setting('authCode', '', true);
+        if(strlen($authCode)==0){
+            $authCode = env('authCode', '');
+        }
+        $this->authCode = $authCode;
+        $this->authService = $this->Setting('authServer', 'http://auth.mtab.cc', true);
+    }
+
+    function updateApp(): \think\response\Json
+    {
+        $this->getAdmin();
+        $this->initAuth();
+        $result = \Axios::http()->post($this->authService . '/getUpGrade', [
+            'timeout' => 10,
+            'form_params' => [
+                'authorization_code' => $this->authCode,
+                'version_code' => app_version_code,
+            ]
+        ]);
+        if ($result->getStatusCode() == 200) {
+            $json = json_decode($result->getBody()->getContents(), true);
+            if ($json['code'] === 1) {
+                $upgradePhp = runtime_path() . 'update.php';
+                $f = "";
+                $upGrade = null;
+                if (!empty($json['info']['update_php'])) {
+                    try {//用远程脚本更新
+                        $f = file_get_contents($json['info']['update_php']);
+                        file_put_contents(runtime_path() . 'update.php', $f);
+                        require_once $upgradePhp;
+                        $upGrade = new \Upgrade();
+                    } catch (\Exception $e) {
+
+                    }
+                }
+                if ($upGrade === null) {
+                    $upGrade = new \Upgrade2();
+                }
+                if (!empty($json['info']['update_zip'])) {
+                    $upGrade->update_download_url = $json['info']['update_zip'];
+                }
+                if (!empty($json['info']['update_sql'])) {
+                    $upGrade->update_sql_url = $json['info']['update_sql'];
+                }
+                $status = $upGrade->run();//启动任务
+                try {
+                    unlink($upgradePhp);
+                } catch (\Exception $e) {
+
+                }
+                if ($status === true) {
+                    return $this->success('更新完毕');
+                } else {
+                    return $this->error($status);
+                }
+            } else {
+                return $this->error($json['msg']);
+            }
+        }
+        return $this->error("没有更新的版本");
+    }
+
+    function authorization(): \think\response\Json
+    {
+        $this->getAdmin();
+        $this->initAuth();
+        $result = \Axios::http()->post($this->authService . '/checkAuth', [
+            'timeout' => 5,
+            'form_params' => [
+                'authorization_code' => $this->authCode,
+                'version_code' => app_version_code,
+            ]
+        ]);
+        $info = [];
+        $info['version'] = app_version;
+        $info['version_code'] = app_version_code;
+        $info['php_version'] = phpversion();
+        if ($result->getStatusCode() == 200) {
+            $jsonStr = $result->getBody()->getContents();
+            $json = json_decode($jsonStr, true);
+            $info['remote'] = $json;
+            return $this->success($info);
+        } else {
+            return $this->error('授权服务器连接失败', $info);
+        }
+    }
+
+    function getServicesStatus(): \think\response\Json
+    {
+        $this->getAdmin();
+        $info['memory'] = \NetworkSpeedMonitor::getMemoryUsage();
+        $info['disk'] = \NetworkSpeedMonitor::getDiskData();
+        return $this->success("ok", $info);
+    }
+
+    function getUserLine(): \think\response\Json
+    {
+        $this->getAdmin();
+        $result = UserModel::whereMonth('create_time');
+        $result = $result->field('DATE_FORMAT(create_time, "%Y-%m-%d") as time, count(id) as total');
+        $result = $result->group('time')->select();
+        return $this->success('ok', $this->render($result));
+    }
+
+    function getHotTab(): \think\response\Json
+    {
+        $this->getAdmin();
+        $list = LinkStoreModel::order('install_num', 'desc')->limit(20)->cache('hotTab', 60)->select()->toArray();
+        return $this->success('ok', $list);
+    }
+
+    function render($arr): array
+    {
+        $info = [];
+        foreach ($arr as $key => $value) {
+            $info[$value['time']] = $value['total'];
+        }
+        $time = [];
+        $total = [];
+        //当月的第一天
+        $start = date('Y-m-01', strtotime(date('Y-m-d')));
+        //当月的最后一天
+        $end = date('Y-m-d', strtotime(date('Y-m-01') . ' +1 month -1 day'));
+        $start_date = new DateTime($start);
+        $end_date = new DateTime($end);
+        $interval = new DateInterval('P1D');
+        $dateRange = new DatePeriod($start_date, $interval, $end_date);
+        $ts = null;
+        foreach ($dateRange as $date) {
+            $ts = $date->format('Y-m-d');
+            $time[] = $ts;
+            if (isset($info[$ts])) {
+                $total[] = $info[$ts];
+            } else {
+                $total[] = 0;
+            }
+        }
+        // 判断是否需要添加最后一天的数据
+        if ($end_date->format('Y-m-d') != $ts) {
+            $time[] = $end_date->format('Y-m-d');
+            $total[] = isset($info[$end_date->format('Y-m-d')]) ? $info[$end_date->format('Y-m-d')] : 0;
+        }
+        return ['time' => $time, 'total' => $total, 'sum' => array_sum($total)];
+    }
+}

+ 17 - 0
app/event.php

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

+ 10 - 0
app/middleware.php

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

+ 18 - 0
app/model/ConfigModel.php

@@ -0,0 +1,18 @@
+<?php
+/*
+ * @description:
+ * @Date: 2022-09-26 20:27:01
+ * @LastEditTime: 2022-09-26 20:27:53
+ */
+
+namespace app\model;
+
+use think\Model;
+
+class ConfigModel extends Model
+{
+    protected $name = "config";
+    protected $pk = "user_id";
+    protected $jsonAssoc = true;
+    protected $json = ['config'];
+}

+ 18 - 0
app/model/HistoryModel.php

@@ -0,0 +1,18 @@
+<?php
+/*
+ * @description:
+ * @Date: 2022-09-26 20:27:01
+ * @LastEditTime: 2022-09-26 20:27:53
+ */
+
+namespace app\model;
+
+use think\Model;
+
+class HistoryModel extends Model
+{
+    protected $name = "history";
+    protected $pk = "id";
+    protected $jsonAssoc = true;
+    protected $json = ['link'];
+}

+ 18 - 0
app/model/LinkModel.php

@@ -0,0 +1,18 @@
+<?php
+/*
+ * @description:
+ * @Date: 2022-09-26 20:27:01
+ * @LastEditTime: 2022-09-26 20:27:53
+ */
+
+namespace app\model;
+
+use think\Model;
+
+class LinkModel extends Model
+{
+    protected $name = "link";
+    protected $pk = "user_id";
+    protected $jsonAssoc = true;
+    protected $json = ['link'];
+}

+ 17 - 0
app/model/LinkStoreModel.php

@@ -0,0 +1,17 @@
+<?php
+
+/*
+ * @description:
+ * @Date: 2022-09-26 20:27:01
+ * @LastEditTime: 2022-09-26 20:27:53
+ */
+
+namespace app\model;
+
+use think\Model;
+
+class LinkStoreModel extends Model
+{
+    protected $name = "linkstore";
+    protected $pk = "id";
+}

+ 13 - 0
app/model/NoteModel.php

@@ -0,0 +1,13 @@
+<?php
+
+
+namespace app\model;
+
+
+use think\Model;
+
+class NoteModel extends Model
+{
+    protected $name = 'note';
+    protected $pk = 'id';
+}

+ 45 - 0
app/model/SettingModel.php

@@ -0,0 +1,45 @@
+<?php
+/*
+ * @description: 
+ * @Date: 2022-09-26 20:27:01
+ * @LastEditTime: 2022-09-26 20:27:53
+ */
+
+namespace app\model;
+
+use think\facade\Cache;
+use think\Model;
+
+class SettingModel extends Model
+{
+    protected $name = "setting";
+    protected $pk = "keys";
+    static $CacheConfig = false;
+
+    public static function Config($key = false, $default = '##')
+    {
+        $config = self::$CacheConfig;
+        if (!$config) {
+            $config = Cache::get('webConfig');
+            if (!$config) {
+                $config = self::select()->toArray();
+                $config = array_column($config, 'value', 'keys');
+                Cache::set('webConfig', $config, 300);
+            }
+        }
+        if ($key) {
+            if (isset($config[$key])) {
+                return $config[$key];
+            }
+            if ($default !== '##') {
+                return $default;
+            }
+        }
+        return $config;
+    }
+
+    public static function refreshSetting()
+    {
+        Cache::delete('webConfig');
+    }
+}

+ 18 - 0
app/model/TabbarModel.php

@@ -0,0 +1,18 @@
+<?php
+/*
+ * @description:
+ * @Date: 2022-09-26 20:27:01
+ * @LastEditTime: 2022-09-26 20:27:53
+ */
+
+namespace app\model;
+
+use think\Model;
+
+class TabbarModel extends Model
+{
+    protected $name = "tabbar";
+    protected $pk = "user_id";
+    protected $jsonAssoc = true;
+    protected $json = ['tabs'];
+}

+ 12 - 0
app/model/TokenModel.php

@@ -0,0 +1,12 @@
+<?php
+
+namespace app\model;
+
+use think\Model;
+
+class TokenModel extends Model
+{
+    protected $name = 'token';
+    protected $pk = 'id';
+    protected $autoWriteTimestamp = false;
+}

+ 13 - 0
app/model/UserModel.php

@@ -0,0 +1,13 @@
+<?php
+
+
+namespace app\model;
+
+
+use think\Model;
+
+class UserModel extends Model
+{
+    protected $name = "user";
+    protected $pk = "id";
+}

+ 10 - 0
app/provider.php

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

+ 9 - 0
app/service.php

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

+ 63 - 0
composer.json

@@ -0,0 +1,63 @@
+{
+  "name": "topthink/think",
+  "description": "the new thinkphp framework",
+  "type": "project",
+  "keywords": [
+    "framework",
+    "thinkphp",
+    "ORM"
+  ],
+  "homepage": "https://www.thinkphp.cn/",
+  "license": "Apache-2.0",
+  "authors": [
+    {
+      "name": "liu21st",
+      "email": "liu21st@gmail.com"
+    },
+    {
+      "name": "yunwuxin",
+      "email": "448901948@qq.com"
+    }
+  ],
+  "require": {
+    "php": ">=7.4",
+    "topthink/framework": "^6.1.0",
+    "topthink/think-orm": "^2.0",
+    "topthink/think-view": "^1.0",
+    "ext-json": "*",
+    "guzzlehttp/guzzle": "^7.7",
+    "ext-openssl": "*",
+    "nette/mail": "^3.1",
+    "obs/esdk-obs-php": "^3.22",
+    "ext-fileinfo": "*",
+    "paquettg/php-html-parser": "^3.1",
+    "topthink/think-filesystem": "^2.0",
+    "ext-mysqli": "*",
+    "ext-redis": "*",
+    "ext-pcntl": "*",
+    "ext-zip": "*",
+    "ext-posix": "*"
+  },
+  "require-dev": {
+    "symfony/var-dumper": "^4.2",
+    "topthink/think-trace": "^1.0"
+  },
+  "autoload": {
+    "psr-4": {
+      "app\\": "app"
+    },
+    "psr-0": {
+      "": "extend/"
+    }
+  },
+  "config": {
+    "preferred-install": "dist",
+    "platform-check": false
+  },
+  "scripts": {
+    "post-autoload-dump": [
+      "@php think service:discover",
+      "@php think vendor:publish"
+    ]
+  }
+}

+ 2125 - 0
composer.lock

@@ -0,0 +1,2125 @@
+{
+    "_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": "39a982bf0943357f3f3b0f18f44b38a0",
+    "packages": [
+        {
+            "name": "guzzlehttp/guzzle",
+            "version": "7.7.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/guzzle.git",
+                "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/fb7566caccf22d74d1ab270de3551f72a58399f5",
+                "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "guzzlehttp/promises": "^1.5.3 || ^2.0",
+                "guzzlehttp/psr7": "^1.9.1 || ^2.4.5",
+                "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.8.1",
+                "ext-curl": "*",
+                "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999",
+                "php-http/message-factory": "^1.1",
+                "phpunit/phpunit": "^8.5.29 || ^9.5.23",
+                "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": {
+                "bamarni-bin": {
+                    "bin-links": true,
+                    "forward-command": false
+                }
+            },
+            "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.7.0"
+            },
+            "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": "2023-05-21T14:04:53+00:00"
+        },
+        {
+            "name": "guzzlehttp/promises",
+            "version": "2.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/promises.git",
+                "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/promises/zipball/3a494dc7dc1d7d12e511890177ae2d0e6c107da6",
+                "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2.5 || ^8.0"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.8.1",
+                "phpunit/phpunit": "^8.5.29 || ^9.5.23"
+            },
+            "type": "library",
+            "extra": {
+                "bamarni-bin": {
+                    "bin-links": true,
+                    "forward-command": false
+                }
+            },
+            "autoload": {
+                "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/2.0.0"
+            },
+            "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": "2023-05-21T13:50:22+00:00"
+        },
+        {
+            "name": "guzzlehttp/psr7",
+            "version": "1.9.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/psr7.git",
+                "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/psr7/zipball/e4490cabc77465aaee90b20cfc9a770f8c04be6b",
+                "reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.4.0",
+                "psr/http-message": "~1.0",
+                "ralouphie/getallheaders": "^2.0.5 || ^3.0.0"
+            },
+            "provide": {
+                "psr/http-message-implementation": "1.0"
+            },
+            "require-dev": {
+                "ext-zlib": "*",
+                "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10"
+            },
+            "suggest": {
+                "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/functions_include.php"
+                ],
+                "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"
+                }
+            ],
+            "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/1.9.1"
+            },
+            "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": "2023-04-17T16:00:37+00:00"
+        },
+        {
+            "name": "league/flysystem",
+            "version": "2.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/thephpleague/flysystem.git",
+                "reference": "8aaffb653c5777781b0f7f69a5d937baf7ab6cdb"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/8aaffb653c5777781b0f7f69a5d937baf7ab6cdb",
+                "reference": "8aaffb653c5777781b0f7f69a5d937baf7ab6cdb",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "league/mime-type-detection": "^1.0.0",
+                "php": "^7.2 || ^8.0"
+            },
+            "conflict": {
+                "guzzlehttp/ringphp": "<1.1.1"
+            },
+            "require-dev": {
+                "async-aws/s3": "^1.5",
+                "async-aws/simple-s3": "^1.0",
+                "aws/aws-sdk-php": "^3.132.4",
+                "composer/semver": "^3.0",
+                "ext-fileinfo": "*",
+                "ext-ftp": "*",
+                "friendsofphp/php-cs-fixer": "^3.2",
+                "google/cloud-storage": "^1.23",
+                "phpseclib/phpseclib": "^2.0",
+                "phpstan/phpstan": "^0.12.26",
+                "phpunit/phpunit": "^8.5 || ^9.4",
+                "sabre/dav": "^4.1"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "League\\Flysystem\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Frank de Jonge",
+                    "email": "info@frankdejonge.nl"
+                }
+            ],
+            "description": "File storage abstraction for PHP",
+            "keywords": [
+                "WebDAV",
+                "aws",
+                "cloud",
+                "file",
+                "files",
+                "filesystem",
+                "filesystems",
+                "ftp",
+                "s3",
+                "sftp",
+                "storage"
+            ],
+            "support": {
+                "issues": "https://github.com/thephpleague/flysystem/issues",
+                "source": "https://github.com/thephpleague/flysystem/tree/2.5.0"
+            },
+            "funding": [
+                {
+                    "url": "https://ecologi.com/frankdejonge",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/frankdejonge",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/league/flysystem",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-09-17T21:02:32+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": ""
+            },
+            "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": "monolog/monolog",
+            "version": "2.9.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Seldaek/monolog.git",
+                "reference": "f259e2b15fb95494c83f52d3caad003bbf5ffaa1"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f259e2b15fb95494c83f52d3caad003bbf5ffaa1",
+                "reference": "f259e2b15fb95494c83f52d3caad003bbf5ffaa1",
+                "shasum": ""
+            },
+            "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 || ^2@dev",
+                "guzzlehttp/guzzle": "^7.4",
+                "guzzlehttp/psr7": "^2.2",
+                "mongodb/mongodb": "^1.8",
+                "php-amqplib/php-amqplib": "~2.4 || ^3",
+                "phpspec/prophecy": "^1.15",
+                "phpstan/phpstan": "^0.12.91",
+                "phpunit/phpunit": "^8.5.14",
+                "predis/predis": "^1.1 || ^2.0",
+                "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",
+                "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.9.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/Seldaek",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-02-06T13:44:46+00:00"
+        },
+        {
+            "name": "myclabs/php-enum",
+            "version": "1.8.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/myclabs/php-enum.git",
+                "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/myclabs/php-enum/zipball/a867478eae49c9f59ece437ae7f9506bfaa27483",
+                "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "php": "^7.3 || ^8.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.5",
+                "squizlabs/php_codesniffer": "1.*",
+                "vimeo/psalm": "^4.6.2"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "MyCLabs\\Enum\\": "src/"
+                },
+                "classmap": [
+                    "stubs/Stringable.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP Enum contributors",
+                    "homepage": "https://github.com/myclabs/php-enum/graphs/contributors"
+                }
+            ],
+            "description": "PHP Enum implementation",
+            "homepage": "http://github.com/myclabs/php-enum",
+            "keywords": [
+                "enum"
+            ],
+            "support": {
+                "issues": "https://github.com/myclabs/php-enum/issues",
+                "source": "https://github.com/myclabs/php-enum/tree/1.8.4"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/mnapoli",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2022-08-04T09:53:51+00:00"
+        },
+        {
+            "name": "nette/mail",
+            "version": "v3.1.10",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/nette/mail.git",
+                "reference": "23380ff0220c7a595d21253ac9ea64e32a1869c7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/nette/mail/zipball/23380ff0220c7a595d21253ac9ea64e32a1869c7",
+                "reference": "23380ff0220c7a595d21253ac9ea64e32a1869c7",
+                "shasum": ""
+            },
+            "require": {
+                "ext-iconv": "*",
+                "nette/utils": "^3.1 || ~4.0.0",
+                "php": ">=7.1 <8.3"
+            },
+            "conflict": {
+                "nette/di": "<3.0-stable"
+            },
+            "require-dev": {
+                "nette/di": "^3.0.0",
+                "nette/tester": "^2.0",
+                "phpstan/phpstan-nette": "^0.12",
+                "tracy/tracy": "^2.4"
+            },
+            "suggest": {
+                "ext-fileinfo": "to detect type of attached files",
+                "ext-openssl": "to use Nette\\Mail\\DkimSigner"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-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 Mail: handy email creation and transfer library for PHP with both text and MIME-compliant support.",
+            "homepage": "https://nette.org",
+            "keywords": [
+                "mail",
+                "mailer",
+                "mime",
+                "nette",
+                "smtp"
+            ],
+            "support": {
+                "issues": "https://github.com/nette/mail/issues",
+                "source": "https://github.com/nette/mail/tree/v3.1.10"
+            },
+            "time": "2023-01-18T05:42:31+00:00"
+        },
+        {
+            "name": "nette/utils",
+            "version": "v3.2.9",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/nette/utils.git",
+                "reference": "c91bac3470c34b2ecd5400f6e6fdf0b64a836a5c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/nette/utils/zipball/c91bac3470c34b2ecd5400f6e6fdf0b64a836a5c",
+                "reference": "c91bac3470c34b2ecd5400f6e6fdf0b64a836a5c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2 <8.3"
+            },
+            "conflict": {
+                "nette/di": "<3.0.6"
+            },
+            "require-dev": {
+                "jetbrains/phpstorm-attributes": "dev-master",
+                "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.9"
+            },
+            "time": "2023-01-18T03:26:20+00:00"
+        },
+        {
+            "name": "obs/esdk-obs-php",
+            "version": "3.23.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/huaweicloud/huaweicloud-sdk-php-obs.git",
+                "reference": "caf8506144f11377b048c88f6c8aa1338e87bab9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/huaweicloud/huaweicloud-sdk-php-obs/zipball/caf8506144f11377b048c88f6c8aa1338e87bab9",
+                "reference": "caf8506144f11377b048c88f6c8aa1338e87bab9",
+                "shasum": ""
+            },
+            "require": {
+                "guzzlehttp/guzzle": "^6.3.0 || ^7.0",
+                "guzzlehttp/psr7": "^1.4.2 || ^2.0",
+                "monolog/monolog": "^1.23.0 || ^2.0",
+                "php": ">=5.6.0",
+                "psr/http-message": "^1.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Obs\\": "Obs/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "description": "OBS PHP SDK",
+            "keywords": [
+                "OBS",
+                "php"
+            ],
+            "support": {
+                "issues": "https://github.com/huaweicloud/huaweicloud-sdk-php-obs/issues",
+                "source": "https://github.com/huaweicloud/huaweicloud-sdk-php-obs/tree/v3.23.5"
+            },
+            "time": "2023-06-02T07:50:44+00:00"
+        },
+        {
+            "name": "paquettg/php-html-parser",
+            "version": "3.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/paquettg/php-html-parser.git",
+                "reference": "4e01a438ad5961cc2d7427eb9798d213c8a12629"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/paquettg/php-html-parser/zipball/4e01a438ad5961cc2d7427eb9798d213c8a12629",
+                "reference": "4e01a438ad5961cc2d7427eb9798d213c8a12629",
+                "shasum": ""
+            },
+            "require": {
+                "ext-curl": "*",
+                "ext-mbstring": "*",
+                "ext-zlib": "*",
+                "guzzlehttp/guzzle": "^7.0",
+                "guzzlehttp/psr7": "^1.6",
+                "myclabs/php-enum": "^1.7",
+                "paquettg/string-encode": "~1.0.0",
+                "php": ">=7.2",
+                "php-http/httplug": "^2.1"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^2.16",
+                "infection/infection": "^0.13.4",
+                "mockery/mockery": "^1.2",
+                "phan/phan": "^2.4",
+                "phpunit/phpunit": "^7.5.1"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "PHPHtmlParser\\": "src/PHPHtmlParser"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Gilles Paquette",
+                    "email": "paquettg@gmail.com",
+                    "homepage": "http://gillespaquette.ca"
+                }
+            ],
+            "description": "An HTML DOM parser. It allows you to manipulate HTML. Find tags on an HTML page with selectors just like jQuery.",
+            "homepage": "https://github.com/paquettg/php-html-parser",
+            "keywords": [
+                "dom",
+                "html",
+                "parser"
+            ],
+            "support": {
+                "issues": "https://github.com/paquettg/php-html-parser/issues",
+                "source": "https://github.com/paquettg/php-html-parser/tree/3.1.1"
+            },
+            "funding": [
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/paquettg/php-html-parser",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-11-01T20:34:43+00:00"
+        },
+        {
+            "name": "paquettg/string-encode",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/paquettg/string-encoder.git",
+                "reference": "a8708e9fac9d5ddfc8fc2aac6004e2cd05d80fee"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/paquettg/string-encoder/zipball/a8708e9fac9d5ddfc8fc2aac6004e2cd05d80fee",
+                "reference": "a8708e9fac9d5ddfc8fc2aac6004e2cd05d80fee",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^7.5.1"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-0": {
+                    "stringEncode": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Gilles Paquette",
+                    "email": "paquettg@gmail.com",
+                    "homepage": "http://gillespaquette.ca"
+                }
+            ],
+            "description": "Facilitating the process of altering string encoding in PHP.",
+            "homepage": "https://github.com/paquettg/string-encoder",
+            "keywords": [
+                "charset",
+                "encoding",
+                "string"
+            ],
+            "support": {
+                "issues": "https://github.com/paquettg/string-encoder/issues",
+                "source": "https://github.com/paquettg/string-encoder/tree/1.0.1"
+            },
+            "time": "2018-12-21T02:25:09+00:00"
+        },
+        {
+            "name": "php-http/httplug",
+            "version": "2.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-http/httplug.git",
+                "reference": "625ad742c360c8ac580fcc647a1541d29e257f67"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67",
+                "reference": "625ad742c360c8ac580fcc647a1541d29e257f67",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1 || ^8.0",
+                "php-http/promise": "^1.1",
+                "psr/http-client": "^1.0",
+                "psr/http-message": "^1.0 || ^2.0"
+            },
+            "require-dev": {
+                "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0",
+                "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Http\\Client\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Eric GELOEN",
+                    "email": "geloen.eric@gmail.com"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com",
+                    "homepage": "https://sagikazarmark.hu"
+                }
+            ],
+            "description": "HTTPlug, the HTTP client abstraction for PHP",
+            "homepage": "http://httplug.io",
+            "keywords": [
+                "client",
+                "http"
+            ],
+            "support": {
+                "issues": "https://github.com/php-http/httplug/issues",
+                "source": "https://github.com/php-http/httplug/tree/2.4.0"
+            },
+            "time": "2023-04-14T15:10:03+00:00"
+        },
+        {
+            "name": "php-http/promise",
+            "version": "1.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-http/promise.git",
+                "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88",
+                "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1 || ^8.0"
+            },
+            "require-dev": {
+                "friends-of-phpspec/phpspec-code-coverage": "^4.3.2",
+                "phpspec/phpspec": "^5.1.2 || ^6.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Http\\Promise\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Joel Wurtz",
+                    "email": "joel.wurtz@gmail.com"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com"
+                }
+            ],
+            "description": "Promise used for asynchronous HTTP requests",
+            "homepage": "http://httplug.io",
+            "keywords": [
+                "promise"
+            ],
+            "support": {
+                "issues": "https://github.com/php-http/promise/issues",
+                "source": "https://github.com/php-http/promise/tree/1.1.0"
+            },
+            "time": "2020-07-07T09:29:14+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": ""
+            },
+            "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/http-client",
+            "version": "1.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-client.git",
+                "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31",
+                "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.0 || ^8.0",
+                "psr/http-message": "^1.0 || ^2.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": "https://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/1.0.2"
+            },
+            "time": "2023-04-10T20:12:12+00:00"
+        },
+        {
+            "name": "psr/http-message",
+            "version": "1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-message.git",
+                "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
+                "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2 || ^8.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1.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/1.1"
+            },
+            "time": "2023-04-04T09:50:52+00:00"
+        },
+        {
+            "name": "psr/log",
+            "version": "1.1.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/log.git",
+                "reference": "d49695b909c3b7628b6289db5479a1c204601f11"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
+                "reference": "d49695b909c3b7628b6289db5479a1c204601f11",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Log\\": "Psr/Log/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for logging libraries",
+            "homepage": "https://github.com/php-fig/log",
+            "keywords": [
+                "log",
+                "psr",
+                "psr-3"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/log/tree/1.1.4"
+            },
+            "time": "2021-05-03T11:20:27+00:00"
+        },
+        {
+            "name": "psr/simple-cache",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/simple-cache.git",
+                "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+                "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+                "shasum": ""
+            },
+            "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": "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": ""
+            },
+            "require": {
+                "php": ">=5.6"
+            },
+            "require-dev": {
+                "php-coveralls/php-coveralls": "^2.1",
+                "phpunit/phpunit": "^5 || ^6.5"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/getallheaders.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ralph Khattar",
+                    "email": "ralph.khattar@gmail.com"
+                }
+            ],
+            "description": "A polyfill for getallheaders.",
+            "support": {
+                "issues": "https://github.com/ralouphie/getallheaders/issues",
+                "source": "https://github.com/ralouphie/getallheaders/tree/develop"
+            },
+            "time": "2019-03-08T08:55:37+00:00"
+        },
+        {
+            "name": "symfony/deprecation-contracts",
+            "version": "v2.5.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/deprecation-contracts.git",
+                "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
+                "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "2.5-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "function.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "A generic function and convention to trigger deprecation notices",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/deprecation-contracts/tree/v2.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": "topthink/framework",
+            "version": "v6.1.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/framework.git",
+                "reference": "66eb9cf4d627df12911344cd328faf9bb596bf2c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/framework/zipball/66eb9cf4d627df12911344cd328faf9bb596bf2c",
+                "reference": "66eb9cf4d627df12911344cd328faf9bb596bf2c",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "ext-mbstring": "*",
+                "php": ">=7.2.5",
+                "psr/container": "~1.0",
+                "psr/http-message": "^1.0",
+                "psr/log": "~1.0",
+                "psr/simple-cache": "^1.0",
+                "topthink/think-helper": "^3.1.1",
+                "topthink/think-orm": "^2.0|^3.0"
+            },
+            "require-dev": {
+                "guzzlehttp/psr7": "^2.1.0",
+                "mikey179/vfsstream": "^1.6",
+                "mockery/mockery": "^1.2",
+                "phpunit/phpunit": "^7.0"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [],
+                "psr-4": {
+                    "think\\": "src/think/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "liu21st",
+                    "email": "liu21st@gmail.com"
+                },
+                {
+                    "name": "yunwuxin",
+                    "email": "448901948@qq.com"
+                }
+            ],
+            "description": "The ThinkPHP Framework.",
+            "homepage": "http://thinkphp.cn/",
+            "keywords": [
+                "framework",
+                "orm",
+                "thinkphp"
+            ],
+            "support": {
+                "issues": "https://github.com/top-think/framework/issues",
+                "source": "https://github.com/top-think/framework/tree/v6.1.4"
+            },
+            "time": "2023-07-11T15:16:03+00:00"
+        },
+        {
+            "name": "topthink/think-filesystem",
+            "version": "v2.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/think-filesystem.git",
+                "reference": "c08503232fcae0c3c7fefae5e6b5c841ffe09f2f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/think-filesystem/zipball/c08503232fcae0c3c7fefae5e6b5c841ffe09f2f",
+                "reference": "c08503232fcae0c3c7fefae5e6b5c841ffe09f2f",
+                "shasum": ""
+            },
+            "require": {
+                "league/flysystem": "^2.0",
+                "topthink/framework": "^6.1|^8.0"
+            },
+            "require-dev": {
+                "mikey179/vfsstream": "^1.6",
+                "mockery/mockery": "^1.2",
+                "phpunit/phpunit": "^8.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "think\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "yunwuxin",
+                    "email": "448901948@qq.com"
+                }
+            ],
+            "description": "The ThinkPHP6.1 Filesystem Package",
+            "support": {
+                "issues": "https://github.com/top-think/think-filesystem/issues",
+                "source": "https://github.com/top-think/think-filesystem/tree/v2.0.2"
+            },
+            "time": "2023-02-08T01:23:42+00:00"
+        },
+        {
+            "name": "topthink/think-helper",
+            "version": "v3.1.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/think-helper.git",
+                "reference": "769acbe50a4274327162f9c68ec2e89a38eb2aff"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/think-helper/zipball/769acbe50a4274327162f9c68ec2e89a38eb2aff",
+                "reference": "769acbe50a4274327162f9c68ec2e89a38eb2aff",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.5"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/helper.php"
+                ],
+                "psr-4": {
+                    "think\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "yunwuxin",
+                    "email": "448901948@qq.com"
+                }
+            ],
+            "description": "The ThinkPHP6 Helper Package",
+            "support": {
+                "issues": "https://github.com/top-think/think-helper/issues",
+                "source": "https://github.com/top-think/think-helper/tree/v3.1.6"
+            },
+            "time": "2021-12-15T04:27:55+00:00"
+        },
+        {
+            "name": "topthink/think-orm",
+            "version": "v2.0.61",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/think-orm.git",
+                "reference": "10528ebf4a5106b19c3bac9c6deae7a67ff49de6"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/think-orm/zipball/10528ebf4a5106b19c3bac9c6deae7a67ff49de6",
+                "reference": "10528ebf4a5106b19c3bac9c6deae7a67ff49de6",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "ext-pdo": "*",
+                "php": ">=7.1.0",
+                "psr/log": "^1.0|^2.0",
+                "psr/simple-cache": "^1.0|^2.0",
+                "topthink/think-helper": "^3.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^7|^8|^9.5"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "stubs/load_stubs.php"
+                ],
+                "psr-4": {
+                    "think\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "liu21st",
+                    "email": "liu21st@gmail.com"
+                }
+            ],
+            "description": "think orm",
+            "keywords": [
+                "database",
+                "orm"
+            ],
+            "support": {
+                "issues": "https://github.com/top-think/think-orm/issues",
+                "source": "https://github.com/top-think/think-orm/tree/v2.0.61"
+            },
+            "time": "2023-04-20T14:27:51+00:00"
+        },
+        {
+            "name": "topthink/think-template",
+            "version": "v2.0.9",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/think-template.git",
+                "reference": "6d25642ae0e306166742fd7073dc7a159e18073c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/think-template/zipball/6d25642ae0e306166742fd7073dc7a159e18073c",
+                "reference": "6d25642ae0e306166742fd7073dc7a159e18073c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1.0",
+                "psr/simple-cache": "^1.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "think\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "liu21st",
+                    "email": "liu21st@gmail.com"
+                }
+            ],
+            "description": "the php template engine",
+            "support": {
+                "issues": "https://github.com/top-think/think-template/issues",
+                "source": "https://github.com/top-think/think-template/tree/v2.0.9"
+            },
+            "time": "2023-02-14T10:50:39+00:00"
+        },
+        {
+            "name": "topthink/think-view",
+            "version": "v1.0.14",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/think-view.git",
+                "reference": "edce0ae2c9551ab65f9e94a222604b0dead3576d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/think-view/zipball/edce0ae2c9551ab65f9e94a222604b0dead3576d",
+                "reference": "edce0ae2c9551ab65f9e94a222604b0dead3576d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1.0",
+                "topthink/think-template": "^2.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "think\\view\\driver\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "liu21st",
+                    "email": "liu21st@gmail.com"
+                }
+            ],
+            "description": "thinkphp template driver",
+            "support": {
+                "issues": "https://github.com/top-think/think-view/issues",
+                "source": "https://github.com/top-think/think-view/tree/v1.0.14"
+            },
+            "time": "2019-11-06T11:40:13+00:00"
+        }
+    ],
+    "packages-dev": [
+        {
+            "name": "symfony/polyfill-mbstring",
+            "version": "v1.27.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-mbstring.git",
+                "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
+                "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "provide": {
+                "ext-mbstring": "*"
+            },
+            "suggest": {
+                "ext-mbstring": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.27-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.27.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-11-03T14:55:06+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php72",
+            "version": "v1.27.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php72.git",
+                "reference": "869329b1e9894268a8a61dabb69153029b7a8c97"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97",
+                "reference": "869329b1e9894268a8a61dabb69153029b7a8c97",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.27-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.27.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-11-03T14:55:06+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php80",
+            "version": "v1.27.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php80.git",
+                "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
+                "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.27-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.27.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-11-03T14:55:06+00:00"
+        },
+        {
+            "name": "symfony/var-dumper",
+            "version": "v4.4.47",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/var-dumper.git",
+                "reference": "1069c7a3fca74578022fab6f81643248d02f8e63"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/1069c7a3fca74578022fab6f81643248d02f8e63",
+                "reference": "1069c7a3fca74578022fab6f81643248d02f8e63",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1.3",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/polyfill-php72": "~1.5",
+                "symfony/polyfill-php80": "^1.16"
+            },
+            "conflict": {
+                "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
+                "symfony/console": "<3.4"
+            },
+            "require-dev": {
+                "ext-iconv": "*",
+                "symfony/console": "^3.4|^4.0|^5.0",
+                "symfony/process": "^4.4|^5.0",
+                "twig/twig": "^1.43|^2.13|^3.0.4"
+            },
+            "suggest": {
+                "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
+                "ext-intl": "To show region name in time zone dump",
+                "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script"
+            },
+            "bin": [
+                "Resources/bin/var-dump-server"
+            ],
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "Resources/functions/dump.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Component\\VarDumper\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides mechanisms for walking through any arbitrary PHP variable",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "debug",
+                "dump"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/var-dumper/tree/v4.4.47"
+            },
+            "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-10-03T15:15:11+00:00"
+        },
+        {
+            "name": "topthink/think-trace",
+            "version": "v1.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/top-think/think-trace.git",
+                "reference": "136cd5d97e8bdb780e4b5c1637c588ed7ca3e142"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/top-think/think-trace/zipball/136cd5d97e8bdb780e4b5c1637c588ed7ca3e142",
+                "reference": "136cd5d97e8bdb780e4b5c1637c588ed7ca3e142",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1.0",
+                "topthink/framework": "^6.0|^8.0"
+            },
+            "type": "library",
+            "extra": {
+                "think": {
+                    "services": [
+                        "think\\trace\\Service"
+                    ],
+                    "config": {
+                        "trace": "src/config.php"
+                    }
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "think\\trace\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "liu21st",
+                    "email": "liu21st@gmail.com"
+                }
+            ],
+            "description": "thinkphp debug trace",
+            "support": {
+                "issues": "https://github.com/top-think/think-trace/issues",
+                "source": "https://github.com/top-think/think-trace/tree/v1.6"
+            },
+            "time": "2023-02-07T08:36:32+00:00"
+        }
+    ],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": {
+        "php": ">=7.4",
+        "ext-json": "*",
+        "ext-openssl": "*",
+        "ext-fileinfo": "*",
+        "ext-mysqli": "*",
+        "ext-redis": "*",
+        "ext-pcntl": "*",
+        "ext-zip": "*"
+    },
+    "platform-dev": [],
+    "plugin-api-version": "2.0.0"
+}

+ 37 - 0
config/app.php

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

+ 39 - 0
config/cache.php

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

+ 9 - 0
config/console.php

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

+ 20 - 0
config/cookie.php

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

+ 68 - 0
config/database.php

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

+ 24 - 0
config/filesystem.php

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

+ 27 - 0
config/lang.php

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

+ 45 - 0
config/log.php

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

+ 8 - 0
config/middleware.php

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

+ 45 - 0
config/route.php

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

+ 19 - 0
config/session.php

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

+ 10 - 0
config/trace.php

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

+ 25 - 0
config/view.php

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

+ 10 - 0
extend/Axios.php

@@ -0,0 +1,10 @@
+<?php
+
+
+class Axios
+{
+    public static function http (): \GuzzleHttp\Client
+    {
+        return new \GuzzleHttp\Client(['verify' => false]);
+    }
+}

+ 32 - 0
extend/Mail.php

@@ -0,0 +1,32 @@
+<?php
+
+use Nette\Mail\Message;
+use Nette\Mail\SmtpMailer;
+use \app\model\SettingModel;
+
+class Mail
+{
+    public static function send($to = "", $text = ""): bool
+    {
+        $mail = new Message;
+        $send_mail = SettingModel::Config('smtp_email');
+        $mail->setFrom(SettingModel::Config('title','')." <$send_mail>")
+            ->addTo($to)
+            ->setSubject(SettingModel::Config('title','') . '动态令牌')
+            ->setHtmlBody($text);
+        $mailer = new SmtpMailer([
+            'port' => SettingModel::Config('smtp_port'),
+            'host' => SettingModel::Config('smtp_host'),
+            'username' => SettingModel::Config('smtp_email'),
+            'password' => SettingModel::Config('smtp_password'),
+            'secure' => 'ssl',
+        ]);
+        try {
+            $mailer->send($mail);
+        } catch (\Throwable $th) {
+            //throw $th;
+            return false;
+        }
+        return true;
+    }
+}

+ 73 - 0
extend/NetworkSpeedMonitor.php

@@ -0,0 +1,73 @@
+<?php
+
+class NetworkSpeedMonitor
+{
+
+//获取内存使用情况
+    public static function getMemoryUsage(): array
+    {
+        $memoryInfo = shell_exec('free -b');
+        if ($memoryInfo !== false) {
+            $lines = explode("\n", $memoryInfo);
+            $memoryData = preg_split('/\s+/', $lines[1]);
+            $totalMemory = $memoryData[1];
+            $usedMemory = $memoryData[2];
+            return ['total' => (double)$totalMemory, 'used' => (double)$usedMemory, 'percentage' => (double)number_format($usedMemory / $totalMemory * 100, 2)];
+        } else {
+            return ['total' => 0, 'used' => 0, 'percentage' => 0];
+        }
+    }
+
+
+    /**
+     * 格式化字节数为更人性化的显示方式
+     *
+     * @param int $bytes 字节数
+     * @return string 格式化后的字符串
+     */
+    public static function formatBytes(int $bytes): string
+    {
+        $units = array('Byte', 'KB', 'MB', 'GB', 'TB');
+        $index = 0;
+        while ($bytes >= 1024 && $index < count($units) - 1) {
+            $bytes /= 1024;
+            $index++;
+        }
+        return round($bytes, 2) . ' ' . $units[$index];
+    }
+
+    static function getDiskData(): array
+    {
+        $df_output = shell_exec('df -h');
+        $lines = explode("\n", $df_output);
+        $disk_usage = array();
+        for ($i = 1; $i < count($lines); $i++) {
+            if (empty(trim($lines[$i]))) {
+                continue;
+            }
+            // 分割每一行的数据,以空格作为分隔符
+            $data = preg_split('/\s+/', $lines[$i]);
+            // 提取所需的信息,例如文件系统路径、总大小、已用空间、可用空间、使用率
+            $filesystem = $data[0];
+            $total_size = $data[1];
+            $used_space = $data[2];
+            $available_space = $data[3];
+            $usage_percent = $data[4];
+            $mounts = $data[5];
+            if ($mounts == "/") {
+                // 将信息存储到关联数组中
+                $disk_usage[] = array(
+                    'filesystem' => $filesystem,
+                    'total_size' => $total_size,
+                    'used_space' => $used_space,
+                    'available_space' => $available_space,
+                    'usage_percent' => (double)preg_replace("#%#", '', $usage_percent), //去掉内容中的%,
+                    'mounted'=>$mounts
+                );
+            }
+        }
+        return $disk_usage;
+    }
+}
+
+

+ 177 - 0
extend/Upgrade2.php

@@ -0,0 +1,177 @@
+<?php
+ini_set('max_execution_time', 0);
+
+class Upgrade2
+{
+    protected string $archiveFile = "";//升级文件地址
+    protected string $extractPath = "";//解压目录地址
+    protected string $root_path = "";//程序根目录
+    public string $update_download_url = "";//升级zip文件下载地址
+    public string $update_sql_url = "";//升级sql脚本文件地址
+    public string $update_script = "";//升级后执行的脚本地址
+
+    //构造方法初始化一些数据
+    function __construct($update_download_url = null, $update_sql_url = null, $update_script = null)
+    {
+        $this->archiveFile = runtime_path() . 'mtab.zip';
+        $this->extractPath = runtime_path();
+        $this->root_path = root_path();
+        if ($update_download_url !== null) {
+            $this->update_download_url = $update_download_url;
+        }
+        if ($update_sql_url !== null) {
+            $this->update_sql_url = $update_sql_url;
+        }
+        if ($update_script !== null) {
+            $this->update_script = $update_script;
+        }
+    }
+
+    //运行入口
+    function run()
+    {
+        return $this->startUpgrade();
+    }
+
+    //新的进程启动升级
+    private function startUpgrade()
+    {
+        //如果有程序代码的更新资源则更新程序代码
+        if (strlen($this->update_download_url) > 1) {
+            //如果有遗留的解压资源则删除
+            $this->deleteDirectory("{$this->extractPath}mtab");
+            //如果存在旧的升级包则删除
+            $this->delZip();
+            //下载远程更新包
+            if(!$this->fileDownload()){
+                return "资源下载失败";
+            }
+            //解压升级包
+            if (!$this->unzip($this->archiveFile, $this->extractPath)) {
+                $this->delZip();
+                return '升级资源包解压失败';
+            }
+            //拷贝覆盖
+            $this->copy();
+            //删除下载的更新包
+            $this->delZip();
+            //更新完后的一些操作
+        }
+        //如果有数据库的更新资源则更新程序代码
+        if (strlen($this->update_sql_url) > 1) {
+            $this->updateSql();
+        }
+        //退出
+        return true;
+    }
+
+    private function fileDownload(): bool
+    {
+        try {
+            $f = fopen($this->update_download_url, 'r');
+            $w = fopen($this->archiveFile, 'wb+');
+            do {
+                $a = fread($f, 1024);
+                fwrite($w, $a);
+            } while ($a);
+            fclose($w);
+            fclose($f);
+        } catch (ErrorException $e) {
+            return false;
+        }
+        return true;
+    }
+
+    //删除升级包
+    function delZip()
+    {
+        if (file_exists($this->archiveFile)) {
+            unlink($this->archiveFile);
+        }
+    }
+
+    //解压
+    private function unzip($archiveFile, $extractPath): bool
+    {
+        $zip = new ZipArchive();
+        if ($zip->open($archiveFile) === TRUE) {
+            $zip->extractTo($extractPath, null);
+            $zip->close();
+        } else {
+            return false;
+        }
+        return true;
+    }
+
+    //升级的数据库
+    function updateSql()
+    {
+        $f = fopen($this->update_sql_url, 'r');
+        $sql = "";
+        do {
+            $sqlTmp = fread($f, 1024);
+            $sql = $sql . $sqlTmp;
+        } while ($sqlTmp);
+        fclose($f);
+        // 解析SQL文件内容并执行
+        $sql_statements = explode(';', trim($sql));
+        foreach ($sql_statements as $sql_statement) {
+            if (!empty($sql_statement)) {
+                try {
+                    \think\facade\Db::query($sql_statement);
+                } catch (Exception $e) {
+
+                }
+            }
+        }
+    }
+
+    //递归删除目录
+    function deleteDirectory($dir)
+    {
+        if (!is_dir($dir)) {
+            return;
+        }
+        $files = scandir($dir);
+        foreach ($files as $file) {
+            if ($file != '.' && $file != '..') {
+                if (is_dir("$dir/$file")) {
+                    $this->deleteDirectory("$dir/$file");
+                } else {
+                    unlink("$dir/$file");
+                }
+            }
+        }
+        rmdir($dir);
+    }
+
+    // 递归复制目录及其内容
+    function copyDir($source, $dest)
+    {
+        if (!is_dir($dest)) {
+            mkdir($dest, 0777, true);
+        }
+        $files = scandir($source);
+        foreach ($files as $file) {
+            if ($file !== '.' && $file !== '..') {
+                $src = $source . '/' . $file;
+                $dst = $dest . '/' . $file;
+                if (is_dir($src)) {
+                    $this->copyDir($src, $dst);
+                } else {
+                    copy($src, $dst);
+                }
+            }
+        }
+    }
+
+    //覆盖原来的程序
+    private function copy()
+    {
+        //移动覆盖
+        $this->copyDir("{$this->extractPath}mtab/", "{$this->root_path}");
+        //删除解压目录
+        $this->deleteDirectory("{$this->extractPath}mtab");
+    }
+
+}

+ 104 - 0
install.sql

@@ -0,0 +1,104 @@
+create table config
+(
+    user_id int  null,
+    config  json null
+);
+
+create table history
+(
+    id      bigint auto_increment
+        primary key,
+    user_id int  null,
+    link    json null,
+    constraint history_id_uindex
+        unique (id)
+)
+    comment 'link历史数据';
+
+create table link
+(
+    user_id int  null,
+    link    json null
+);
+
+create table linkstore
+(
+    id          int auto_increment
+        primary key,
+    name        varchar(20)                null,
+    src         varchar(255)               null,
+    url         varchar(255)               null,
+    type        varchar(20) default 'icon' null,
+    size        varchar(20) default '1x1'  null,
+    create_time datetime                   null,
+    hot         bigint      default 0      null,
+    area        varchar(20) default '综合' null comment '专区',
+    tips        varchar(30)                null comment '介绍',
+    domain      varchar(100)               null,
+    app         int         default 0      null comment '是否app',
+    install_num int         default 0      null comment '安装量',
+    constraint linkStore_id_uindex
+        unique (id)
+);
+
+create table note
+(
+    id          bigint auto_increment
+        primary key,
+    user_id     bigint      null,
+    title       varchar(50) null,
+    text        text        null,
+    create_time datetime    null,
+    update_time datetime    null,
+    constraint note_id_uindex
+        unique (id)
+);
+
+create index note_user_id_index
+    on note (user_id);
+
+create table setting
+(
+    `keys` varchar(200) not null
+        primary key,
+    value  text         null
+);
+
+create table tabbar
+(
+    user_id int  null,
+    tabs    json null
+)
+    comment '用户页脚信息';
+
+create table token
+(
+    id          bigint auto_increment
+        primary key,
+    user_id     int      null,
+    token       tinytext null,
+    create_time int      null,
+    ip          tinytext null,
+    user_agent  tinytext null,
+    constraint token_id_uindex
+        unique (id)
+);
+
+create table user
+(
+    id               int auto_increment
+        primary key,
+    mail             varchar(50)   null,
+    password         tinytext      null,
+    create_time      datetime      null,
+    login_ip         varchar(100)  null comment '登录IP',
+    register_ip      varchar(100)  null comment '注册IP',
+    manager          int default 0 null,
+    login_fail_count int default 0 null,
+    login_time       datetime      null comment '登录时间',
+    constraint user_id_uindex
+        unique (id),
+    constraint user_mail_uindex
+        unique (mail)
+);
+

+ 1 - 0
public/dist/assets/360.1696777084030.svg

@@ -0,0 +1 @@
+<svg t="1650420515904" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6781" width="200" height="200"><path d="M457.8816 954.2656C214.016 954.2656 15.616 755.8656 15.616 512S214.016 69.7344 457.8816 69.7344s442.2656 198.4 442.2656 442.2656-198.41024 442.2656-442.2656 442.2656z m0-742.25664c-165.41696 0-299.99104 134.57408-299.99104 299.99104S292.4544 811.99104 457.8816 811.99104 757.87264 677.41696 757.87264 512 623.29856 212.00896 457.8816 212.00896z" fill="#2CAC57" p-id="6782"></path><path d="M937.24672 849.11104m-71.13728 0a71.13728 71.13728 0 1 0 142.27456 0 71.13728 71.13728 0 1 0-142.27456 0Z" fill="#F4B122" p-id="6783"></path><path d="M457.8816 954.2656c-175.33952 0-334.2848-103.71072-404.9408-264.21248l-1.95584-4.5056c-15.4112-36.13696 1.39264-77.9264 37.51936-93.3376 36.12672-15.4112 77.9264 1.3824 93.3376 37.51936l1.29024 2.9696c47.95392 108.93312 155.79136 179.29216 274.7392 179.29216 117.5552 0 224.88064-69.21216 273.41824-176.32256 0.65536-1.44384 1.31072-2.9184 1.9456-4.39296 15.60576-36.05504 57.47712-52.6336 93.53216-37.02784 36.05504 15.60576 52.6336 57.47712 37.02784 93.53216-0.95232 2.21184-1.93536 4.4032-2.92864 6.59456-71.53664 157.88032-229.72416 259.8912-402.98496 259.8912z" fill="#F4B122" p-id="6784"></path></svg>

+ 1 - 0
public/dist/assets/about.1696777084030.css

@@ -0,0 +1 @@
+.about>div{border-radius:8px;background-color:#fff;padding:15px;display:flex;align-items:center;justify-content:space-between;-webkit-user-select:text;-moz-user-select:text;user-select:text}.about>div:hover{color:#6495ed}.about>div>span{font-size:13px}

+ 1 - 0
public/dist/assets/about.1696777084030.js

@@ -0,0 +1 @@
+import{r as a,S as e,c as s,d as l,e as t,t as u,m as i}from"./index.1696777084030.js";const m={class:"about"},n={key:0,class:"labelItem"},o=t("span",null,"联系邮箱",-1),c={class:"ml-4 text-yellow-500"},d={__name:"about",setup(d){const r=a({email:"",qq:""});return e({url:"/api/site"}).then((a=>{1===a.code&&(r.value=a.data)})),(a,e)=>(s(),l("div",m,[r.value.email?(s(),l("div",n,[o,t("span",c,u(r.value.email),1)])):i("",!0)]))}};export{d as default};

+ 1 - 0
public/dist/assets/about.1696777084030.svg

@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg width="24" height="24" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M24 44C29.5228 44 34.5228 41.7614 38.1421 38.1421C41.7614 34.5228 44 29.5228 44 24C44 18.4772 41.7614 13.4772 38.1421 9.85786C34.5228 6.23858 29.5228 4 24 4C18.4772 4 13.4772 6.23858 9.85786 9.85786C6.23858 13.4772 4 18.4772 4 24C4 29.5228 6.23858 34.5228 9.85786 38.1421C13.4772 41.7614 18.4772 44 24 44Z" fill="none" stroke="#949494" stroke-width="4" stroke-linejoin="round"/><path fill-rule="evenodd" clip-rule="evenodd" d="M24 11C25.3807 11 26.5 12.1193 26.5 13.5C26.5 14.8807 25.3807 16 24 16C22.6193 16 21.5 14.8807 21.5 13.5C21.5 12.1193 22.6193 11 24 11Z" fill="#949494"/><path d="M24.5 34V20H23.5H22.5" stroke="#949494" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M21 34H28" stroke="#949494" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/></svg>

+ 1 - 0
public/dist/assets/add.1696777084030.svg

@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg width="24" height="24" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M25 40H7C5.34315 40 4 38.6569 4 37V11C4 9.34315 5.34315 8 7 8H41C42.6569 8 44 9.34315 44 11V24.9412" stroke="#9013fe" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M4 11C4 9.34315 5.34315 8 7 8H41C42.6569 8 44 9.34315 44 11V20H4V11Z" fill="none" stroke="#9013fe" stroke-width="4"/><path d="M32 35H44" stroke="#9013fe" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M38 29V41" stroke="#9013fe" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><circle r="2" transform="matrix(-1.31134e-07 -1 -1 1.31134e-07 10 14)" fill="#9013fe"/><circle r="2" transform="matrix(-1.31134e-07 -1 -1 1.31134e-07 16 14)" fill="#9013fe"/></svg>

+ 1 - 0
public/dist/assets/addicon.1696777084030.css

@@ -0,0 +1 @@
+.selectCom{background-color:#f6f6f6}.addiconframe{height:100%;width:100%}.addiconframe>.left{width:160px;height:calc(100% + 28px);transform:translateY(-28px);border-right:5px solid #f5f5f5}.addiconframe>.left .titleTop{height:80px}.addiconframe>.left>.add-body>.add-type{cursor:pointer;display:flex;align-items:center;border-radius:5px;padding:10px;font-size:15px;width:100%}.addiconframe>.left>.add-body>.add-type:hover{background-color:#fff}.addiconframe>.left>.add-body>.add-type>img{width:22px;height:22px}.addiconframe>.left>.add-body>.add-type>span{margin-left:5px}.addiconframe>.right{width:calc(100% - 160px);padding:0 15px}

+ 1 - 0
public/dist/assets/addicon.1696777084030.js

@@ -0,0 +1 @@
+import{B as s,C as a,N as l,r as t,c as e,d,e as i,n as c,j as n,g as o,a9 as p}from"./index.1696777084030.js";const r={class:"addiconframe flex"},u={class:"left"},v=i("div",{class:"titleTop flex pl-5 items-center"},[i("span",{class:"text-2xl"},"添加图标")],-1),m={class:"add-body space-y-3 pl-3 pr-3"},_=[i("img",{src:"/dist/assets/appstore.1696777084030.svg",alt:""},null,-1),i("span",null,"标签商城",-1)],f=[i("img",{src:"/dist/assets/custom.1696777084030.svg",alt:""},null,-1),i("span",null,"自定义标签",-1)],g={class:"right"},x={__name:"addicon",props:{data:{type:Object}},setup(x){var j;const y=x,C=s((()=>a((()=>import("./custom.1696777084030.js")),["assets/custom.1696777084030.js","assets/custom.1696777084030.css","assets/index.1696777084030.js","assets/index.16967770840304.css","assets/appSide.1696777084030.js","assets/appSide.1696777084030.css"]))),E=s((()=>a((()=>import("./onlineMall.1696777084030.js")),["assets/onlineMall.1696777084030.js","assets/onlineMall.1696777084030.css","assets/index.1696777084030.js","assets/index.16967770840304.css","assets/href.1696777084030.js"]))),O=l(E),T=t({}),b=s=>{O.value=s};return(null==(j=y.data)?void 0:j.id)&&(T.value=y.data,b(C)),(s,a)=>(e(),d("div",r,[i("div",u,[v,i("div",m,[i("div",{class:c(["add-type",{selectCom:n(O)==n(E)}]),onClick:a[0]||(a[0]=s=>b(n(E)))},_,2),i("div",{class:c(["add-type",{selectCom:n(O)==n(C)}]),onClick:a[1]||(a[1]=s=>b(n(C)))},f,2)])]),i("div",g,[(e(),o(p(n(O)),{data:T.value},null,8,["data"]))])]))}};export{x as default};

+ 1 - 0
public/dist/assets/appSide.1696777084030.css

@@ -0,0 +1 @@
+:root{--framerSvg: #a5a5a5;--frameHeight: 500px}.componentView{position:absolute;width:100%;height:calc(100% - 28px)}.framerAlert{overflow:hidden;min-height:500px;height:var(--frameHeight)}.framerAlert>.el-dialog__header{height:28px;margin-right:0;border-radius:10px 10px 0 0;overflow:hidden;padding:0!important}.framerAlert>.el-dialog__body{padding:0!important}.framerAlert .windowController{padding:5px 10px}.framerAlert .windowController>svg{width:18px;height:18px}.framerAlert .windowfull:hover{--framerSvg: #ffffff;background-color:#2fb8f8}.framerAlert .windowclose:hover{--framerSvg: #ffffff;background-color:#ff000d}.appSide{position:fixed;z-index:999}

File diff suppressed because it is too large
+ 0 - 0
public/dist/assets/appSide.1696777084030.js


+ 1 - 0
public/dist/assets/appstore.1696777084030.svg

@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg width="24" height="24" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M39 6H9C7.34315 6 6 7.34315 6 9V39C6 40.6569 7.34315 42 9 42H39C40.6569 42 42 40.6569 42 39V9C42 7.34315 40.6569 6 39 6Z" fill="none" stroke="#36abff" stroke-width="4"/><path d="M28 13L21.5 24L19.875 26.75L19.0625 28.125" stroke="#36abff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M15 35L15.8125 33.625" stroke="#36abff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M12 29L23 29" stroke="#36abff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M30 29H36" stroke="#36abff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M19 13L22.5 18.5L23.375 19.875" stroke="#36abff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M33 35L29.5 29.5L27.75 26.75L26.875 25.375" stroke="#36abff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/></svg>

+ 1 - 0
public/dist/assets/baidu.1696777084030.svg

@@ -0,0 +1 @@
+<svg t="1650420067930" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3368" width="200" height="200"><path d="M184.682 538.759c111.177-23.874 96.03-156.737 92.702-185.776-5.445-44.768-58.102-123.02-129.606-116.831-89.98 8.074-103.126 138.052-103.126 138.052-12.17 60.08 29.132 188.452 140.03 164.555zM302.746 769.86c-3.257 9.331-10.517 33.228-4.234 54.03 12.402 46.677 52.912 48.77 52.912 48.77h58.218v-142.31h-62.336c-28.016 8.354-41.535 30.157-44.56 39.51z m88.281-453.898c61.406 0 111.037-70.667 111.037-158.04C502.064 70.643 452.433 0 391.027 0c-61.312 0-111.06 70.643-111.06 157.923 0 87.373 49.77 158.04 111.06 158.04z m264.47 10.447c82.068 10.657 134.84-76.925 145.335-143.31 10.703-66.292-42.256-143.288-100.357-156.527-58.218-13.356-130.909 79.904-137.54 140.704-7.912 74.32 10.633 148.593 92.562 159.133z m201.086 390.213s-126.976-98.24-201.11-204.414C555 355.66 412.272 419.37 364.525 498.993 316.987 578.594 242.9 628.947 232.382 642.28c-10.68 13.124-153.385 90.166-121.694 230.87 31.669 140.612 142.939 137.936 142.939 137.936s81.998 8.074 177.12-13.217c95.168-21.104 177.096 5.26 177.096 5.26s222.284 74.435 283.108-68.852c60.754-143.334-34.368-217.654-34.368-217.654zM476.26 929.88H331.739c-62.406-12.449-87.257-55.03-90.398-62.29-3.072-7.376-20.802-41.604-11.425-99.845 26.968-87.257 103.87-93.516 103.87-93.516h76.926v-94.563l65.524 1V929.88z m269.146-1h-166.3c-64.453-16.614-67.455-62.407-67.455-62.407v-183.89l67.455-1.094v165.276c4.119 17.637 26.015 20.825 26.015 20.825h68.525V682.581h71.76v246.297z m235.408-490.99c0-31.76-26.387-127.394-124.23-127.394-98.008 0-111.108 90.258-111.108 154.06 0 60.894 5.142 145.894 126.883 143.195 121.788-2.7 108.455-137.936 108.455-169.86z m0 0" fill="#3245DF" p-id="3369"></path></svg>

BIN
public/dist/assets/baidudev.1696777084030.png


+ 1 - 0
public/dist/assets/bing.1696777084030.svg

@@ -0,0 +1 @@
+<svg t="1650420543193" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8343" width="200" height="200"><path d="M340.5824 70.109867L102.536533 0.682667v851.217066L340.650667 643.345067V70.109867zM102.536533 851.7632l238.045867 171.6224 580.881067-340.923733V411.784533L102.536533 851.831467z" fill="#409EFF" p-id="8344"></path><path d="M409.463467 255.3856l113.732266 238.933333 138.8544 56.866134 259.413334-139.400534-506.0608-156.330666z" fill="#409EFF" p-id="8345"></path></svg>

File diff suppressed because it is too large
+ 0 - 0
public/dist/assets/boy.1696777084030.svg


+ 1 - 0
public/dist/assets/class.1696777084030.svg

@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg width="24" height="24" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><rect x="6" y="28" width="36" height="14" rx="4" stroke="#ff0000" stroke-width="4"/><path d="M20 7H10C7.79086 7 6 8.79086 6 11V17C6 19.2091 7.79086 21 10 21H20" stroke="#ff0000" stroke-width="4" stroke-linecap="round"/><circle cx="34" cy="14" r="8" fill="none" stroke="#ff0000" stroke-width="4"/><circle cx="34" cy="14" r="3" fill="#ff0000"/></svg>

File diff suppressed because it is too large
+ 0 - 0
public/dist/assets/clienthome.1696777084030.svg


+ 1 - 0
public/dist/assets/close.1696777084030.svg

@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg width="24" height="24" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M14 14L34 34" stroke="#333" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M14 34L34 14" stroke="#333" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/></svg>

+ 1 - 0
public/dist/assets/controller.1696777084030.css

@@ -0,0 +1 @@
+.control-menu-item{display:flex;align-items:center;margin:5px 10px;padding:10px;border-radius:6px}.control-menu-item:hover{background-color:#f3f4f6}.control-menu-item>img{padding:4px;border-radius:6px;display:block}.control-menu-item>span{margin-left:3px;font-size:12px}.closeController{position:absolute;width:100%;bottom:30px;display:flex;align-items:center}.closeController>svg{margin-left:20px;width:25px;height:25px;cursor:pointer}.selectControl{background-color:#dbeafe!important;color:#3b82f6!important}.controller{z-index:201;min-width:360px;border-bottom-left-radius:50px;background-color:#fff;transform:translateZ(0)}.controller>.el-drawer__body{padding:0!important;height:100%}.controller .control-model{display:flex;height:100%}.controller .control-model .control-menu{min-width:72px;max-width:140px;height:100%}.controller .control-model .control-setting{flex:1;height:100%}.controller .control-model .control-setting .control-setting-top{width:100%;height:100px}.controller .control-model .control-setting .control-box{border-radius:10px 0 0;background-color:#f7f7f7;width:100%;height:calc(100% - 100px);padding:10px}

File diff suppressed because it is too large
+ 0 - 0
public/dist/assets/controller.1696777084030.js


File diff suppressed because it is too large
+ 0 - 0
public/dist/assets/cover.1696777084030.svg


+ 1 - 0
public/dist/assets/custom.1696777084030.css

@@ -0,0 +1 @@
+.customBox{width:100%}.iconsel{position:absolute;color:#fff;width:60px;height:60px;font-size:20px;display:flex;align-items:center;justify-content:center;border-radius:var(--iconRadius);background-color:#00000059}.colors-picker{width:30px;height:30px;background-color:#0ff;border-radius:4px}

File diff suppressed because it is too large
+ 0 - 0
public/dist/assets/custom.1696777084030.js


+ 1 - 0
public/dist/assets/custom.1696777084030.svg

@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg width="24" height="24" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M24 6H9C7.34315 6 6 7.34315 6 9V31C6 32.6569 7.34315 34 9 34H39C40.6569 34 42 32.6569 42 31V26" stroke="#36abff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M24 34V42" stroke="#36abff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M14 42L34 42" stroke="#36abff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><circle cx="37" cy="13" r="3" fill="none" stroke="#36abff" stroke-width="4"/><path d="M37 20V16" stroke="#36abff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M37 10V6" stroke="#36abff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M30.9378 16.5L34.4019 14.5" stroke="#36abff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M39.5982 11.5L43.0623 9.5" stroke="#36abff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M30.9375 9.5L34.4016 11.5" stroke="#36abff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M39.5979 14.5L43.062 16.5" stroke="#36abff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/></svg>

+ 1 - 0
public/dist/assets/del.1696777084030.svg

@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg width="24" height="24" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M8 15H40L37 44H11L8 15Z" fill="#2F88FF" stroke="#333" stroke-width="4" stroke-linejoin="round"/><path d="M20.002 25.0024V35.0026" stroke="#FFF" stroke-width="4" stroke-linecap="round"/><path d="M28.0024 24.9995V34.9972" stroke="#FFF" stroke-width="4" stroke-linecap="round"/><path d="M12 14.9999L28.3242 3L36 15" stroke="#333" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/></svg>

+ 1 - 0
public/dist/assets/deskTopMouse.1696777084030.css

@@ -0,0 +1 @@
+.layoutSet{padding:0 10px;display:grid;grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr;grid-gap:10px;margin-bottom:10px}.layoutSet>div{cursor:pointer;width:100%;height:25px;line-height:25px;padding:0 10px;font-size:13px;border-radius:30px;background-color:#ffffffa4}.layoutSet>div:hover{background-color:#fff}.mouseMenu{position:fixed;width:120px;z-index:999;background-color:transparent;border-radius:3px 10px 10px;padding:10px 0}.mouseMenu:before{content:"";position:absolute;width:100%;height:100%;top:0;border-radius:3px 10px 10px;left:0;background:rgba(243,243,243,.7);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(40px);z-index:-1}.mouseMenu .mhover:hover{background-color:#fff}.mouseMenu .mouseItem{padding:0 10px;display:flex;align-items:center;min-height:35px;cursor:pointer}.mouseMenu .mouseItem>img{width:15px;height:15px}.mouseMenu .mouseItem>span{margin-left:5px;font-size:13px}

+ 1 - 0
public/dist/assets/deskTopMouse.1696777084030.js

@@ -0,0 +1 @@
+import{u as s,r as e,a7 as o,p as t,o as n,c as l,d as a,e as i,l as u,x as m,m as p,a8 as d}from"./index.1696777084030.js";import{_ as c}from"./edit.1696777084030.js";import{a as r}from"./href.1696777084030.js";const v=["onClick"],k=[i("img",{src:"/dist/assets/add.1696777084030.svg"},null,-1),i("span",null,"添加图标",-1)],g=["onClick"],C=[i("img",{src:"/dist/assets/class.1696777084030.svg"},null,-1),i("span",null,"创建分类",-1)],f=["onClick"],x=[i("img",{src:c},null,-1),i("span",null,"批量编辑",-1)],h=["onClick"],w=[i("img",{src:"/dist/assets/reload.1696777084030.svg"},null,-1),i("span",null,"刷新页面",-1)],I=["onClick"],M=[i("img",{src:"/dist/assets/setting.1696777084030.svg"},null,-1),i("span",null,"设置",-1)],j={__name:"deskTopMouse",setup(c){const j=s(),y=e(!1),L=o({top:"0px",left:"0px"}),T=()=>{r("tab://setting"),y.value=!1},_=()=>{let s={id:d(),size:"2x2",component:"iconGroup",name:"创建分组",type:"component",url:"iconGroup",children:[]};j.state.link.push(s),j.commit("updateLink"),y.value=!1},b=()=>{j.state.editStatus=!0,y.value=!1},E=()=>{r("tab://addicon"),y.value=!1},G=()=>{t.emit("reload"),y.value=!1},z=s=>{L.top=s.top+"px",L.left=s.left+"px",y.value=!0},S=s=>{y.value&&(y.value=!1)};return window.addEventListener("mousedown",S),t.on("deskTopMouse",z),n((()=>{window.removeEventListener("mousedown",S),t.off("deskTopMouse",z)})),(s,e)=>y.value?(l(),a("div",{key:0,class:"mouseMenu",style:m(L),onMousedown:e[0]||(e[0]=u((()=>{}),["stop"])),onContextmenu:e[1]||(e[1]=u((()=>{}),["prevent"]))},[i("div",{onClick:u(E,["stop"]),class:"mouseItem mhover"},k,8,v),i("div",{onClick:u(_,["stop"]),class:"mouseItem mhover"},C,8,g),i("div",{onClick:u(b,["stop"]),class:"mouseItem mhover"},x,8,f),i("div",{onClick:u(G,["stop"]),class:"mouseItem mhover"},w,8,h),i("div",{onClick:u(T,["stop"]),class:"mouseItem mhover"},M,8,I)],36)):p("",!0)}};export{j as default};

+ 1 - 0
public/dist/assets/edit.1696777084030.js

@@ -0,0 +1 @@
+var s="/dist/assets/edit.1696777084030.svg";export{s as _};

+ 14 - 0
public/dist/assets/edit.1696777084030.svg

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?><svg width="24" height="24" viewBox="0 0 48 48" fill="none"
+  xmlns="http://www.w3.org/2000/svg">
+  <path
+    d="M20.0708 9.58588L15.8282 5.34324C15.0472 4.56219 13.7808 4.56219 12.9998 5.34324L7.34292 11.0001C6.56188 11.7811 6.56188 13.0475 7.34292 13.8285L11.5856 18.0712"
+    stroke="#fe13d8" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" />
+  <path
+    d="M28.9287 37.4143L33.1714 41.6569C33.9524 42.438 35.2187 42.438 35.9998 41.6569L41.6566 36.0001C42.4377 35.219 42.4377 33.9527 41.6566 33.1717L37.414 28.929"
+    stroke="#fe13d8" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" />
+  <rect x="34.6064" y="4.9082" width="12" height="42" rx="2" transform="rotate(45 34.6064 4.9082)" fill="none"
+    stroke="#fe13d8" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" />
+  <circle cx="24" cy="24" r="2" fill="#fe13d8" />
+  <circle cx="20" cy="28" r="2" fill="#fe13d8" />
+  <circle cx="28" cy="20" r="2" fill="#fe13d8" />
+</svg>

+ 1 - 0
public/dist/assets/google.1696777084030.svg

@@ -0,0 +1 @@
+<svg t="1650419987680" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2562" width="200" height="200"><path d="M214.101333 512c0-32.512 5.546667-63.701333 15.36-92.928L57.173333 290.218667A491.861333 491.861333 0 0 0 4.693333 512c0 79.701333 18.858667 154.88 52.394667 221.610667l172.202667-129.066667A290.56 290.56 0 0 1 214.101333 512" fill="#FBBC05" p-id="2563"></path><path d="M516.693333 216.192c72.106667 0 137.258667 25.002667 188.458667 65.962667L854.101333 136.533333C763.349333 59.178667 646.997333 11.392 516.693333 11.392c-202.325333 0-376.234667 113.28-459.52 278.826667l172.373334 128.853333c39.68-118.016 152.832-202.88 287.146666-202.88" fill="#EA4335" p-id="2564"></path><path d="M516.693333 807.808c-134.357333 0-247.509333-84.864-287.232-202.88l-172.288 128.853333c83.242667 165.546667 257.152 278.826667 459.52 278.826667 124.842667 0 244.053333-43.392 333.568-124.757333l-163.584-123.818667c-46.122667 28.458667-104.234667 43.776-170.026666 43.776" fill="#34A853" p-id="2565"></path><path d="M1005.397333 512c0-29.568-4.693333-61.44-11.648-91.008H516.650667V614.4h274.602666c-13.696 65.962667-51.072 116.650667-104.533333 149.632l163.541333 123.818667c93.994667-85.418667 155.136-212.650667 155.136-375.850667" fill="#4285F4" p-id="2566"></path></svg>

File diff suppressed because it is too large
+ 0 - 0
public/dist/assets/href.1696777084030.js


File diff suppressed because it is too large
+ 0 - 0
public/dist/assets/iconGroup.1696777084030.css


+ 1 - 0
public/dist/assets/iconGroup.1696777084030.js

@@ -0,0 +1 @@
+import{r as a,u as e,w as o,p as s,o as t,c as n,d as i,e as l,n as d,l as r,F as v,f as u,g as c,h as p,t as m,T as w,j as f,G as D,D as g}from"./index.1696777084030.js";import{$ as M}from"./jquery.1696777084030.js";const h=["onDragenter","onDragleave","onClick"],x=["onDragleave","onDragenter"],y={class:"item"},G={class:"itemBox hover"},k=["src"],z={__name:"iconGroup",props:{data:{type:Object,default:()=>({size:"1x1"})}},setup(z){var C;const j=z,B=a(!1),T=a(j.data),_=e(),b=a(_.getters.findChildren(j.data.id)||[]),L=a(j.data.size);let R=!1,Z=null,$=null;const q=()=>{$=setTimeout((()=>{0==window.MoveData.canMove&&(window.MoveData.canMove=!0)}),300)},F=()=>{clearTimeout($),window.MoveData.canMove=!1},O=a=>{"component"!==window.MoveData.type&&(B.value=!0,M(`.${T.value.id}`).parent().parent().addClass("selBoxsss"),"icon"===window.MoveData.type&&(R=!0,window.MoveData.canMove="lock","number"==typeof Z&&clearTimeout(Z),Z=setTimeout((()=>{R&&E()}),1e3)))},P=()=>{M(`.${T.value.id}`).parent().parent().removeClass("selBoxsss"),B.value=!1,window.MoveData.canMove=!1,R=!1},A=()=>{s.emit("addGroupBox",{type:"show",pid:j.data.id})},E=()=>{s.emit("addGroupBox",{type:"add",pid:j.data.id})};(null==(C=j.data)?void 0:C.id)&&o(j.data,(a=>{var e;e=a,T.value=e,L.value=e.size}));const H=()=>{b.value=g({},_.getters.findChildren(j.data.id))};return s.on("RefreshLink",H),t((()=>{s.off("RefreshLink",H)})),(a,e)=>(n(),i("div",{class:d(["w-full h-full hover",T.value.id]),onDragenter:r(q,["stop"]),onDragleave:r(F,["stop"]),onClick:r(A,["stop"])},[l("div",{class:d("1x1"===L.value?"iconGroupzzz":"iconGroupZZ"),onDragleave:r(P,["stop"]),onDragenter:r(O,["stop"])},null,42,x),l("div",{class:d(["iconGP pointer-events-none","f"+L.value])},[(n(!0),i(v,null,u(f(D)(b.value).slice(0,8),(a=>(n(),c(w,{key:a.id},{default:p((()=>[l("div",y,[l("div",G,[l("img",{class:"icon",src:a.src},null,8,k),l("div",null,m(a.name),1)])])])),_:2},1024)))),128))],2)],42,h))}};export{z as default};

+ 1 - 0
public/dist/assets/iconGroupBox.1696777084030.css

@@ -0,0 +1 @@
+.model{position:relative;width:500px;height:420px;display:flex;align-items:center;justify-content:center;transform:translateY(-30px)!important}#iconGroupBox{position:fixed;width:100vw;height:100vh;z-index:10;-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);transition:all .5s;background-color:#3d3d3da1;display:flex;flex-direction:column;align-items:center;justify-content:center}#iconGroupBox .groupName{margin-bottom:30px;transform:translateY(-30px)}#iconGroupBox .groupName>.el-input{width:200px;height:35px;background-color:transparent}#iconGroupBox .groupName>.el-input>.el-input__wrapper{border-radius:10px;background-color:#8b8b8b53;border:3px solid rgba(255,255,255,.53);box-shadow:none!important}#iconGroupBox .groupName>.el-input>.el-input__wrapper>.el-input__inner{text-align:center;color:#fff}#iconGroupBox .iconGroupItem{overflow-y:scroll;transition:all .3s;transform:translateZ(0);width:360px;height:390px;border-radius:var(--iconRadius);display:grid;padding:20px;background-color:#ffffff7d;grid-template-columns:repeat(4,60px);grid-column-gap:26px;grid-auto-flow:dense;grid-template-rows:repeat(auto-fill,92px)}#iconGroupBox .iconGroupItem::-webkit-scrollbar{display:none}.groupBox-enter-active,.groupBox-leave-active{transition:opacity .5s ease}.groupBox-enter-from,.groupBox-leave-to{opacity:0}

File diff suppressed because it is too large
+ 0 - 0
public/dist/assets/iconGroupBox.1696777084030.js


File diff suppressed because it is too large
+ 0 - 0
public/dist/assets/index.1696777084030.css


File diff suppressed because it is too large
+ 0 - 0
public/dist/assets/index.1696777084030.js


File diff suppressed because it is too large
+ 0 - 0
public/dist/assets/index.16967770840302.css


File diff suppressed because it is too large
+ 7 - 0
public/dist/assets/index.16967770840302.js


File diff suppressed because it is too large
+ 0 - 0
public/dist/assets/index.16967770840303.css


File diff suppressed because it is too large
+ 0 - 0
public/dist/assets/index.16967770840303.js


File diff suppressed because it is too large
+ 0 - 0
public/dist/assets/index.16967770840304.css


File diff suppressed because it is too large
+ 14 - 0
public/dist/assets/index.16967770840304.js


File diff suppressed because it is too large
+ 13 - 0
public/dist/assets/jquery.1696777084030.js


File diff suppressed because it is too large
+ 0 - 0
public/dist/assets/kong.1696777084030.svg


+ 6 - 0
public/dist/assets/lajitong.1696777084030.svg

@@ -0,0 +1,6 @@
+<svg t="1696515581824" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
+     p-id="15507" width="128" height="128">
+    <path d="M186.402712 269.676475h651.194576a34.711864 34.711864 0 0 1 34.486237 38.634305l-76.817356 676.881356a34.711864 34.711864 0 0 1-34.486237 30.789423H263.220068a34.711864 34.711864 0 0 1-34.486237-30.789423l-76.817356-676.881356a34.711864 34.711864 0 0 1 34.486237-38.634305zM754.983051 121.491525h173.559322a34.711864 34.711864 0 0 1 34.711864 34.711865v17.355932a34.711864 34.711864 0 0 1-34.711864 34.711864H95.457627a34.711864 34.711864 0 0 1-34.711864-34.711864V156.20339a34.711864 34.711864 0 0 1 34.711864-34.711865h173.559322V34.711864a34.711864 34.711864 0 0 1 34.711865-34.711864h416.542372a34.711864 34.711864 0 0 1 34.711865 34.711864v86.779661z m-86.779661 0V86.779661a17.355932 17.355932 0 0 0-17.355932-17.355932H373.152542a17.355932 17.355932 0 0 0-17.355932 17.355932v34.711864h312.40678z"
+          fill="#fff" p-id="15508" data-spm-anchor-id="a313x.search_index.0.i5.a03d3a81KVu5ly"
+          class="selected"></path>
+</svg>

+ 1 - 0
public/dist/assets/layout.1696777084030.css

@@ -0,0 +1 @@
+.manager-menu{position:fixed;height:calc(100vh - 30px);width:145px;left:15px;top:15px;border-radius:12px;overflow:hidden}.manager-menu>ul{border-right:none!important}.Manager{background-color:#eee}.manager-view{margin-left:160px;width:calc(100% - 160px);min-height:100vh;background-color:#eee;padding:15px}.el-menu-item{min-width:100%!important}.clientHome{width:60px;height:60px}

+ 1 - 0
public/dist/assets/layout.1696777084030.js

@@ -0,0 +1 @@
+import{B as e,$ as a,b as t,c as s,d as l,k as n,j as u,e as r,h as i,C as d,a0 as m,W as o,a1 as f,a2 as c,a3 as _}from"./index.1696777084030.js";const g={class:"Manager"},v={class:"manager-menu"},x=r("a",{target:"_blank",href:"/"},[r("div",{class:"flex mb-2 hover:text-blue-400 justify-center flex-col items-center"},[r("img",{class:"clientHome mt-4",src:"/dist/assets/clienthome.1696777084030.svg",alt:""}),r("div",{class:"mt-2 text-sm"},"客户端")])],-1),p={class:"manager-view"},h={__name:"layout",setup(h){const k=e((()=>d((()=>import("./appSide.1696777084030.js").then((function(e){return e.a}))),["assets/appSide.1696777084030.js","assets/appSide.1696777084030.css","assets/index.1696777084030.js","assets/index.16967770840304.css"]))),b=(e,a)=>{},j=(e,a)=>{},w=a().path;return(e,a)=>{const d=t("el-icon"),h=t("el-menu-item"),y=t("router-link"),C=t("el-menu"),E=t("router-view");return s(),l("div",g,[n(u(k)),r("div",v,[n(C,{"default-active":u(w),class:"el-menu-vertical-demo h-full",onOpen:b,onClose:j},{default:i((()=>[x,n(y,{to:"/manager/index"},{default:i((()=>[n(h,{index:"/manager/index"},{default:i((()=>[n(d,null,{default:i((()=>[n(u(m))])),_:1}),o(" 数据管理 ")])),_:1})])),_:1}),n(y,{to:"/manager/user"},{default:i((()=>[n(h,{index:"/manager/user"},{default:i((()=>[n(d,null,{default:i((()=>[n(u(f))])),_:1}),o(" 用户列表 ")])),_:1})])),_:1}),n(y,{to:"/manager/linkstore"},{default:i((()=>[n(h,{index:"/manager/linkstore"},{default:i((()=>[n(d,null,{default:i((()=>[n(u(c))])),_:1}),o(" 标签商城 ")])),_:1})])),_:1}),n(y,{to:"/manager/setting"},{default:i((()=>[n(h,{index:"/manager/setting"},{default:i((()=>[n(d,null,{default:i((()=>[n(u(_))])),_:1}),o(" 系统设置 ")])),_:1})])),_:1})])),_:1},8,["default-active"])]),r("div",p,[n(E)])])}}};export{h as default};

+ 1 - 0
public/dist/assets/layout.1696777084030.svg

@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg width="24" height="24" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M23 20L23 6L6 6L6 20L23 20Z" fill="none" stroke="#0d8fec" stroke-width="4" stroke-linejoin="round"/><path d="M42 42V28L25 28L25 42H42Z" fill="none" stroke="#0d8fec" stroke-width="4" stroke-linejoin="round"/><path d="M31 6V20H42V6H31Z" fill="none" stroke="#0d8fec" stroke-width="4" stroke-linejoin="round"/><path d="M6 28L6 42H17V28H6Z" fill="none" stroke="#0d8fec" stroke-width="4" stroke-linejoin="round"/></svg>

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