Browse Source

优化一些操作体验和新增自定义搜索引擎

tushan 1 year ago
parent
commit
8ec1375495
100 changed files with 442 additions and 82 deletions
  1. 5 1
      Dockerfile
  2. 3 3
      app/controller/Admin.php
  3. 87 29
      app/controller/Api.php
  4. 2 0
      app/controller/Config.php
  5. 4 2
      app/controller/Index.php
  6. 12 11
      app/controller/LinkStore.php
  7. 87 0
      app/controller/SearchEngine.php
  8. 13 8
      app/controller/admin/Index.php
  9. 11 0
      app/model/SearchEngineModel.php
  10. 13 0
      app/model/UserSearchEngineModel.php
  11. 2 2
      extend/PluginStaticSystem.php
  12. 3 0
      extend/PluginsInstall.php
  13. 60 19
      install.sql
  14. 1 0
      public/dist/assets/about.1705848582155.css
  15. 1 0
      public/dist/assets/about.1705848582155.js
  16. BIN
      public/dist/assets/add.1705848582155.png
  17. 1 0
      public/dist/assets/add.1705848582155.svg
  18. 1 0
      public/dist/assets/addCard.1705848582155.css
  19. 1 0
      public/dist/assets/addCard.1705848582155.js
  20. 1 0
      public/dist/assets/addSearchEngine.1705848582155.css
  21. 0 0
      public/dist/assets/addSearchEngine.1705848582155.js
  22. 1 0
      public/dist/assets/addicon.1705848582155.css
  23. 1 0
      public/dist/assets/addicon.1705848582155.js
  24. 0 0
      public/dist/assets/appSide.1705848582155.css
  25. 0 0
      public/dist/assets/appSide.1705848582155.js
  26. 1 0
      public/dist/assets/arc.1705848582155.svg
  27. 0 0
      public/dist/assets/auth.1705848582155.svg
  28. BIN
      public/dist/assets/avatar.1705848582155.png
  29. 1 0
      public/dist/assets/class.1705848582155.svg
  30. 0 0
      public/dist/assets/clienthome.1705848582155.svg
  31. 1 0
      public/dist/assets/close.1705848582155.svg
  32. 1 0
      public/dist/assets/controller.1705848582155.css
  33. 0 0
      public/dist/assets/controller.1705848582155.js
  34. 1 0
      public/dist/assets/custom.1705848582155.css
  35. 0 0
      public/dist/assets/custom.1705848582155.js
  36. 1 0
      public/dist/assets/del.1705848582155.svg
  37. 1 0
      public/dist/assets/deskTopMouse.1705848582155.css
  38. 1 0
      public/dist/assets/deskTopMouse.1705848582155.js
  39. 1 0
      public/dist/assets/edit.1705848582155.js
  40. 14 0
      public/dist/assets/edit.1705848582155.svg
  41. 1 0
      public/dist/assets/help.1705848582155.css
  42. 0 0
      public/dist/assets/help.1705848582155.js
  43. 0 0
      public/dist/assets/href.1705848582155.js
  44. 0 0
      public/dist/assets/iconGroup.1705848582155.css
  45. 0 0
      public/dist/assets/iconGroup.1705848582155.js
  46. 1 0
      public/dist/assets/iconGroupBox.1705848582155.css
  47. 0 0
      public/dist/assets/iconGroupBox.1705848582155.js
  48. 0 0
      public/dist/assets/index.1705848582155.css
  49. 0 0
      public/dist/assets/index.1705848582155.js
  50. 0 0
      public/dist/assets/index.17058485821552.css
  51. 7 0
      public/dist/assets/index.17058485821552.js
  52. 0 0
      public/dist/assets/index.17058485821553.css
  53. 0 0
      public/dist/assets/index.17058485821553.js
  54. 0 0
      public/dist/assets/index.17058485821554.css
  55. 14 0
      public/dist/assets/index.17058485821554.js
  56. 13 0
      public/dist/assets/jquery.1705848582155.js
  57. 0 0
      public/dist/assets/kong.1705848582155.svg
  58. 6 0
      public/dist/assets/lajitong.1705848582155.svg
  59. 1 0
      public/dist/assets/layout.1705848582155.css
  60. 0 0
      public/dist/assets/layout.1705848582155.js
  61. 1 0
      public/dist/assets/layout.1705848582155.svg
  62. 1 0
      public/dist/assets/linkstore.1705848582155.css
  63. 0 0
      public/dist/assets/linkstore.1705848582155.js
  64. 0 0
      public/dist/assets/mouseMenu.1705848582155.js
  65. 1 0
      public/dist/assets/net.1705848582155.js
  66. 1 0
      public/dist/assets/net.1705848582155.svg
  67. 1 0
      public/dist/assets/onlineMall.1705848582155.css
  68. 0 0
      public/dist/assets/onlineMall.1705848582155.js
  69. 1 0
      public/dist/assets/open.1705848582155.svg
  70. 1 0
      public/dist/assets/openType.1705848582155.css
  71. 1 0
      public/dist/assets/openType.1705848582155.js
  72. 1 0
      public/dist/assets/reload.1705848582155.svg
  73. 9 0
      public/dist/assets/search.1705848582155.svg
  74. 1 0
      public/dist/assets/searchEngine.1705848582155.css
  75. 0 0
      public/dist/assets/searchEngine.1705848582155.js
  76. 1 0
      public/dist/assets/setting.1705848582155.css
  77. 0 0
      public/dist/assets/setting.1705848582155.js
  78. 1 0
      public/dist/assets/setting.1705848582155.svg
  79. 1 0
      public/dist/assets/theme.1705848582155.css
  80. 0 0
      public/dist/assets/theme.1705848582155.js
  81. 1 0
      public/dist/assets/user.1705848582155.css
  82. 0 0
      public/dist/assets/user.1705848582155.js
  83. 0 0
      public/dist/assets/user.17058485821552.js
  84. 3 0
      public/dist/assets/wapp.1705848582155.svg
  85. 1 0
      public/dist/assets/webApp.1705848582155.css
  86. 0 0
      public/dist/assets/webApp.1705848582155.js
  87. BIN
      public/dist/assets/wiki.1705848582155.png
  88. 1 1
      public/dist/index.html
  89. 2 2
      public/index.php
  90. 31 4
      public/install.php
  91. 1 0
      public/static/searchEngine/360.svg
  92. 0 0
      public/static/searchEngine/DuckDuckGo.svg
  93. 1 0
      public/static/searchEngine/baidu.svg
  94. BIN
      public/static/searchEngine/baidudev.png
  95. BIN
      public/static/searchEngine/bilibiliico.png
  96. 1 0
      public/static/searchEngine/bing.svg
  97. 1 0
      public/static/searchEngine/google.svg
  98. 0 0
      public/static/searchEngine/net.svg
  99. 1 0
      public/static/searchEngine/sougou.svg
  100. BIN
      public/static/searchEngine/weiboico.png

+ 5 - 1
Dockerfile

@@ -19,4 +19,8 @@ RUN chmod +x /install.sh && /install.sh && rm /install.sh
 
 EXPOSE 6379 80 443 8080
 
-CMD ["./start.sh"]
+CMD ["./start.sh"]
+
+#构建全平台 docker buildx create --name mybuilder --driver docker-container --use
+#构建全平台 docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t itushan/mtab --push .
+#构建本地镜像 docker build -t itushan/mtab .

+ 3 - 3
app/controller/Admin.php

@@ -16,7 +16,7 @@ class Admin extends BaseController
         if (isset($search['mail']) && mb_strlen($search['mail']) > 0) {
             $sql['mail'] = $search['mail'];
         }
-        $user = UserModel::where($sql)->withoutField('password')->order("id", 'desc')->paginate($limit);
+        $user = UserModel::where($sql)->withoutField('password')->order($this->request->post('sort.prop', 'id'), $this->request->post('sort.order', 'desc'))->paginate($limit);
         return $this->success('ok', $user);
     }
 
@@ -28,7 +28,7 @@ class Admin extends BaseController
         $user = UserModel::where('id', $id)->find();
         $data = $this->request->post();
         if (!$user) {
-            return $this->error('用户不存在');
+            $user = new UserModel();
         }
         //如果字段中的password有内容则md5加密后保存
         if (isset($data['password']) && mb_strlen($data['password']) > 0) {
@@ -37,6 +37,6 @@ class Admin extends BaseController
             unset($data['password']);
         }
         $user->save($data);
-        return $this->success('修改成功');
+        return $this->success('保存成功');
     }
 }

+ 87 - 29
app/controller/Api.php

@@ -55,11 +55,63 @@ class Api extends BaseController
         return $this->error('发送失败');
     }
 
+    private function addHttpProtocolRemovePath($url): string
+    {
+        // 解析URL
+        $parsedUrl = parse_url($url);
+        // 检查是否已经有协议,如果没有则添加http://
+        if (!isset($parsedUrl['scheme'])) {
+            // 检查是否以 // 开头,如果是,则转换为相对协议
+            if (isset($parsedUrl['host']) && strpos($url, '//') === 0) {
+                $url = 'http:' . $url;
+            } else {
+                $url = 'http://' . $url;
+            }
+        } else {
+            // 如果有协议但没有路径,保留原样
+            $url = $parsedUrl['scheme'] . '://';
+            // 如果有主机,则添加主机部分
+            if (isset($parsedUrl['host'])) {
+                $url .= $parsedUrl['host'];
+                // 如果有端口号,则添加端口号
+                if (isset($parsedUrl['port'])) {
+                    $url .= ':' . $parsedUrl['port'];
+                }
+            }
+        }
+        return $url;
+    }
+
+    private function addHttpProtocol($url)
+    {
+        // 检查是否已经有协议,如果没有则添加http://
+        if (!parse_url($url, PHP_URL_SCHEME)) {
+            // 检查是否以 // 开头,如果是,则转换为相对协议
+            if (strpos($url, '//') === 0) {
+                $url = 'https:' . $url;
+            } else {
+                $url = 'http://' . $url;
+            }
+        }
+        return $url;
+    }
+
+    private function hasOnlyPath($url): bool
+    {
+        $parsedUrl = parse_url($url);
+        // 检查是否存在路径但不存在域名和协议
+        if (isset($parsedUrl['path']) && !isset($parsedUrl['host']) && !isset($parsedUrl['scheme'])) {
+            return true;
+        }
+        return false;
+    }
+
+
     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);
+            $remote_avatar = $this->Setting("remote_avatar", "https://avatar.mtab.cc/6.x/bottts/png?seed=", true);
             $str = $this->downloadFile($remote_avatar . $avatar, md5($avatar) . '.png');
             return $this->success(['src' => $str]);
         }
@@ -67,24 +119,18 @@ class Api extends BaseController
         $icon = "";
         $cdn = $this->Setting('assets_host', '');
         if ($url) {
-            $urlInfo = parse_url($url);
-            $host = $urlInfo['host'] ?? $urlInfo['path'];
-            $title = '';
-            $scheme = "http";
-            if (isset($urlInfo['scheme'])) {
-                $scheme = $urlInfo["scheme"];
-            }
-            $realUrl = $scheme . "://" . $host;
+            $realUrl = $this->addHttpProtocolRemovePath($url);
             $client = \Axios::http();
-            $response = null;
-            $status = null;
             try {
-                $response = $client->get($realUrl);
+                $response = $client->get($realUrl, [
+                    'headers' => [
+                        "User-Agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
+                    ]
+                ]);
                 $status = $response->getStatusCode();
             } catch (\Exception $e) {
-                return $this->error('获取失败');
+                return $this->error('无法连接远程目标服务器');
             }
-
             if ($status == 200) {
                 $body = $response->getBody()->getContents();
                 $dom = new Dom();
@@ -95,17 +141,27 @@ class Api extends BaseController
                 }
                 try {
                     $list = $dom->find('[rel="icon"]');
+                    if (count($list) == 0) {
+                        $list = $dom->find('[rel="shortcut icon"]');
+                    }
+                    if (count($list) == 0) {
+                        $list = $dom->find('[rel="Shortcut Icon"]');
+                    }
                     if (count($list) > 0) {
-                        $icon = $list->href;
-                        $iconInfo = parse_url($icon);
-                        if (!isset($iconInfo['scheme'])) {
-                            if (isset($iconInfo['host'])) {
-                                $icon = "https://" . $iconInfo["host"] . $icon;
-                            } else {
-                                $icon = $realUrl . $icon;
+                        $href = $list->href;
+                        if ($this->hasOnlyPath($href)) {
+                            if ($href[0]!='/') {
+                                $href = "/" . $href;
                             }
+                            $href = $realUrl . $href;
                         }
-                        $response = \Axios::http()->head($icon);
+                        $href = $this->addHttpProtocol($href);
+                        $icon = $href;
+                        $response = \Axios::http()->get($icon, [
+                            'headers' => [
+                                'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
+                            ]
+                        ]);
                         $contentType = $response->getHeader('content-type');
                         $contentType = $contentType[0];
                         if (preg_match('/(png|jpg|jpeg|x-icon|svg\+xml)$/', $contentType, $matches)) {
@@ -114,7 +170,7 @@ class Api extends BaseController
                                 'jpg' => 'jpg',
                                 'jpeg' => 'jpeg',
                                 'x-icon' => 'ico',
-                                'svg+xml' => 'svg'
+                                'svg+xml' => 'svg',
                             );
                             $fileFormat = $matches[1];
                             $icon = $this->downloadFile($icon, md5($realUrl) . '.' . $contentType[$fileFormat]);
@@ -124,7 +180,6 @@ class Api extends BaseController
                         } else {
                             $icon = '';
                         }
-
                     }
                 } catch (\ErrorException $e) {
                 }
@@ -149,7 +204,7 @@ class Api extends BaseController
                 return $this->success(['src' => $icon, 'name' => $title]);
             }
         }
-        return $this->error('no');
+        return $this->error('没有抓取到图标');
     }
 
     private function downloadFile($url, $name)
@@ -163,7 +218,10 @@ class Api extends BaseController
         }
         try {
             $response = $client->request('GET', $url, [
-                'sink' => $downloadPath
+                'sink' => $downloadPath,
+                'headers' => [
+                    'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
+                ]
             ]);
             return $path . $name;
         } catch (RequestException $e) {
@@ -175,7 +233,7 @@ class Api extends BaseController
     {
         $send = $this->request->get('seed');
         $client = new Client();
-        $remote_avatar = $this->Setting('remote_avatar', 'https://avatar.mtab.cc/6.x/thumbs/png?seed=', true);
+        $remote_avatar = $this->Setting('remote_avatar', 'https://avatar.mtab.cc/6.x/bottts/png?seed=', true);
         $response = $client->get($remote_avatar . urlencode($send), [
             'stream' => true,
             'timeout' => 10,
@@ -190,9 +248,9 @@ class Api extends BaseController
             return $this->error('not File');
         }
         if ($file->getSize() > 1024 * 1024 * 5) {
-            return $this->error('max fileSize is 5M');
+            return $this->error('文件最大5MB');
         }
-        if (in_array(strtolower($file->getOriginalExtension()), ['png', 'jpg', 'jpeg', 'webp', 'ico'])) {
+        if (in_array(strtolower($file->getOriginalExtension()), ['png', 'jpg', 'jpeg', 'webp', 'ico', 'svg'])) {
             // 验证文件并保存
             try {
                 // 构建保存路径

+ 2 - 0
app/controller/Config.php

@@ -6,6 +6,8 @@ namespace app\controller;
 
 use app\BaseController;
 use app\model\ConfigModel;
+use app\model\SearchEngineModel;
+use app\model\UserSearchEngineModel;
 
 class Config extends BaseController
 {

+ 4 - 2
app/controller/Index.php

@@ -18,7 +18,8 @@ class Index extends BaseController
         View::assign("keywords", SettingModel::Config('keywords', 'Mtab书签'));
         View::assign("description", SettingModel::Config('description', 'Mtab书签'));
         View::assign("version", app_version);
-        View::assign("customHead",SettingModel::Config('customHead',''));
+        View::assign("customHead", SettingModel::Config('customHead', ''));
+        View::assign("favicon", SettingModel::Config('logo', '/favicon.ico'));
         return View::fetch("dist/index.html");
     }
 
@@ -26,6 +27,7 @@ class Index extends BaseController
     {
         //从配置中获取logo
         $favicon = $this->Setting('logo');
-        return download(public_path() . $favicon);
+        $file = public_path() . $favicon;
+        return download($file)->mimeType(\PluginStaticSystem::mimeType($file))->header(['Cache-Control' => 'max-age=68400']);
     }
 }

+ 12 - 11
app/controller/LinkStore.php

@@ -17,14 +17,14 @@ class LinkStore extends BaseController
         $area = $this->request->post('area', false);
         $sql = [];
         if ($name) {
-            $sql[] = ['name|tips', 'like', "%" . $name . "%"];
+            $sql[] = ['name|tips', 'like', '%' . $name . '%'];
         }
         $list = LinkStoreModel::where($sql);
         //area需要使用find_in_set来匹配
-        if ($area && $area != '全部') {
+        if ($area && $area != 0) {
             $list = $list->whereRaw("find_in_set('$area',area)");
         }
-        $list = $list->order("hot", 'desc')->paginate($limit);
+        $list = $list->order('create_time', 'desc')->paginate($limit);
         return $this->success('ok', $list);
     }
 
@@ -43,20 +43,21 @@ class LinkStore extends BaseController
         if ($area && $area != '全部') {
             $list = $list->whereRaw("find_in_set('$area',area)");
         }
-        $list = $list->order('hot', 'desc')->paginate($limit);
+        $list = $list->order($this->request->post('sort.prop', 'id'), $this->request->post('sort.order', 'asc'))->paginate($limit);
         return $this->success('ok', $list);
     }
 
     function getFolder(): \think\response\Json
     {
-        return $this->success("ok", LinkFolderModel::order("sort","desc")->select());
+        return $this->success('ok', LinkFolderModel::order('sort', 'desc')->select());
     }
 
     private function update(): \think\response\Json
     {
         is_demo_mode(true);
-        $data = $this->request->post("form");
-        $info = LinkStoreModel::where("id", $data['id'])->update($data);
+        $admin = $this->getAdmin();
+        $data = $this->request->post('form');
+        $info = LinkStoreModel::where('id', $data['id'])->update($data);
         return $this->success('修改成功', $info);
     }
 
@@ -69,7 +70,7 @@ class LinkStore extends BaseController
             if (isset($data['id']) && $data['id']) { //更新
                 return $this->update();
             } else {
-                $data['create_time'] = date("Y-m-d H:i:s");
+                $data['create_time'] = date('Y-m-d H:i:s');
                 $info = (new \app\model\LinkStoreModel)->insert($data);
                 return $this->success('添加成功', $info);
             }
@@ -101,7 +102,7 @@ class LinkStore extends BaseController
     {
         $id = $this->request->post('id', false);
         //给标签+=1
-        $res = Db::table("linkstore")->where('id', $id)->inc('install_num')->update();
+        $res = Db::table('linkstore')->where('id', $id)->inc('install_num')->update();
         if ($res) {
             return $this->success('ok');
         }
@@ -126,7 +127,7 @@ class LinkStore extends BaseController
 
         } else if ($type === 'del') {
             $id = $this->request->post('id');
-            $result = LinkFolderModel::where("id", $id)->find();
+            $result = LinkFolderModel::where('id', $id)->find();
             if ($result) {
                 $result->delete();
                 Db::query(
@@ -144,7 +145,7 @@ class LinkStore extends BaseController
         is_demo_mode(true);
         $this->getAdmin();
         $ids = $this->request->post('ids', []);
-        LinkStoreModel::where("id", 'in', $ids)->delete();
+        LinkStoreModel::where('id', 'in', $ids)->delete();
         return $this->success('删除成功');
     }
 }

+ 87 - 0
app/controller/SearchEngine.php

@@ -0,0 +1,87 @@
+<?php
+
+namespace app\controller;
+
+use app\BaseController;
+use app\model\LinkStoreModel;
+use app\model\SearchEngineModel;
+use app\model\UserSearchEngineModel;
+
+class SearchEngine extends BaseController
+{
+    function index(): \think\response\Json
+    {
+        $list = SearchEngineModel::where("status", 1)->order('sort', 'desc')->select();
+        return $this->success("ok", $list);
+    }
+
+    public function list(): \think\response\Json
+    {
+        $this->getAdmin();
+        $name = $this->request->post('search.name', false);
+        $sql = [];
+        if ($name) {
+            $sql[] = ['name|tips', 'like', '%' . $name . '%'];
+        }
+        $list = SearchEngineModel::where($sql);
+        $list = $list->order('sort', 'desc')->select();
+        return $this->success('ok', $list);
+    }
+
+    function add(): \think\response\Json
+    {
+        is_demo_mode(true);
+        $this->getAdmin();
+        $data = $this->request->post('form');
+        if ($data) {
+            $model = new SearchEngineModel();
+            if (isset($data['id']) && $data['id']) { //更新
+                $model = $model->find($data['id']);
+            }
+            $model->save($data);
+            return $this->success("保存成功!");
+        }
+        return $this->error('缺少数据');
+    }
+
+    function del(): \think\response\Json
+    {
+        is_demo_mode(true);
+        $this->getAdmin();
+        $ids = $this->request->post('ids', []);
+        SearchEngineModel::where('id', 'in', $ids)->delete();
+        return $this->success('删除成功');
+    }
+
+    function searchEngine(): \think\response\Json
+    {
+        $user = $this->getUser();
+        if ($user) {
+            $data = UserSearchEngineModel::find($user['user_id']);
+            if ($data) {
+                return $this->success('ok', $data['list']);
+            }
+        }
+        $list = SearchEngineModel::where('status', 1)->order('sort', 'desc')->limit(10)->select()->toArray();
+        return $this->success('ok', $list);
+    }
+
+    function saveSearchEngine(): \think\response\Json
+    {
+        $user = $this->getUser(true);
+        if ($user) {
+            $config = $this->request->post('searchEngine', []);
+            if ($config) {
+                $is = UserSearchEngineModel::where('user_id', $user['user_id'])->find();
+                if ($is) {
+                    $is->list = $config;
+                    $is->force()->save();
+                } else {
+                    UserSearchEngineModel::create(['user_id' => $user['user_id'], 'list' => $config]);
+                }
+                return $this->success('ok');
+            }
+        }
+        return $this->error('保存失败');
+    }
+}

+ 13 - 8
app/controller/admin/Index.php

@@ -17,11 +17,12 @@ use think\facade\Db;
 
 class Index extends BaseController
 {
-    public string $authService = "https://auth.mtab.cc";
-    public string $authCode = '';
+    public $authService = "https://auth.mtab.cc";
+    public $authCode = '';
 
     function setSubscription(): \think\response\Json
     {
+        $this->getAdmin();
         $code = $this->request->post("code", "");
         if (trim($code)) {
             Db::table('setting')->replace()->insert(['keys' => 'authCode', 'value' => $code]);
@@ -58,7 +59,7 @@ class Index extends BaseController
                 $f = "";
                 $upGrade = null;
                 if (!empty($json['info']['update_php'])) {
-                    try {//用远程脚本更新
+                    try {//用远程脚本更新,一般用不到,除非上一个版本发生一些问题需要额外脚本处理
                         $f = file_get_contents($json['info']['update_php']);
                         file_put_contents(runtime_path() . 'update.php', $f);
                         require_once $upgradePhp;
@@ -119,7 +120,7 @@ class Index extends BaseController
         }
     }
 
-    function countFilesInDirectory($directory): int
+    private function countFilesInDirectory($directory): int
     {
         $fileCount = 0;
 
@@ -176,7 +177,7 @@ class Index extends BaseController
         return $this->success('ok', $list);
     }
 
-    function render($arr): array
+    private function render($arr): array
     {
         $info = [];
         foreach ($arr as $key => $value) {
@@ -241,6 +242,7 @@ class Index extends BaseController
 
     function stopCard(): \think\response\Json
     {
+        $this->getAdmin();
         $name_en = $this->request->post('name_en', '');
         CardModel::where('name_en', $name_en)->update(['status' => 0]);
         Cache::delete('cardList');
@@ -249,6 +251,7 @@ class Index extends BaseController
 
     function startCard(): \think\response\Json
     {
+        $this->getAdmin();
         $name_en = $this->request->post('name_en', '');
         CardModel::where('name_en', $name_en)->update(['status' => 1]);
         Cache::delete('cardList');
@@ -257,6 +260,7 @@ class Index extends BaseController
 
     function installCard(): \think\response\Json
     {
+        $this->getAdmin();
         $this->initAuth();
         $name_en = $this->request->post("name_en", '');
         $version = 0;
@@ -295,6 +299,7 @@ class Index extends BaseController
 
     function uninstallCard(): \think\response\Json
     {
+        $this->getAdmin();
         $name_en = $this->request->post("name_en");
         if ($name_en) {
             $this->deleteDirectory(root_path() . 'plugins/' . $name_en);
@@ -304,7 +309,7 @@ class Index extends BaseController
         return $this->success('卸载完毕!');
     }
 
-    function deleteDirectory($dir)
+    private function deleteDirectory($dir)
     {
         if (!is_dir($dir)) {
             return;
@@ -322,7 +327,7 @@ class Index extends BaseController
         rmdir($dir);
     }
 
-    protected function readCardInfo($name_en)
+    private function readCardInfo($name_en)
     {
         $file = root_path() . 'plugins/' . $name_en . '/info.json';
         $info = file_get_contents($file);
@@ -333,7 +338,7 @@ class Index extends BaseController
         return false;
     }
 
-    function installCardTask($info): \think\response\Json
+    private function installCardTask($info): \think\response\Json
     {
         if ($info['download']) {
             $task = new \PluginsInstall($info);

+ 11 - 0
app/model/SearchEngineModel.php

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

+ 13 - 0
app/model/UserSearchEngineModel.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace app\model;
+
+use think\Model;
+
+class UserSearchEngineModel extends Model
+{
+    protected $name = 'user_search_engine';
+    protected $pk = 'user_id';
+    protected $jsonAssoc = true;
+    protected $json = ['list'];
+}

+ 2 - 2
extend/PluginStaticSystem.php

@@ -7,12 +7,12 @@ class PluginStaticSystem
         $file = preg_replace("#\.\.#", "", $file);
         $file = plugins_path("static/" . $file);
         if (file_exists($file)) {
-            return download($file)->force(false)->mimeType($this->mimeType($file))->header(['Cache-Control' => 'max-age=68400']);
+            return download($file)->force(false)->mimeType(self::mimeType($file))->header(['Cache-Control' => 'max-age=68400']);
         }
         return response('', 404);
     }
 
-    function mimeType($ext): string
+    static function mimeType($ext): string
     {
         $ext = pathinfo($ext);
         if ($ext['extension']) {

+ 3 - 0
extend/PluginsInstall.php

@@ -18,6 +18,9 @@ class PluginsInstall
         $this->archiveFile = runtime_path() . $info['name_en'] . '.zip';
         $this->extractPath = runtime_path();
         $this->root_path = root_path() . 'plugins/';
+        if (!is_dir($this->root_path)) {//不存在插件目录则创建
+            mkdir($this->root_path,0777,true);
+        }
         $this->download = $info['download'];
         $this->directory = $info['name_en'];
         if (isset($info['update_sql']) && $info['update_sql']) {

+ 60 - 19
install.sql

@@ -1,9 +1,30 @@
+create table card
+(
+    id          int auto_increment
+        primary key,
+    name        varchar(200)  null,
+    name_en     varchar(200)  null,
+    status      int default 0 null,
+    version     int default 0 null,
+    tips        varchar(255)  null comment '说明',
+    create_time datetime      null comment '添加时间',
+    src         text          null comment 'logo',
+    url         varchar(255)  null comment '卡片地址',
+    `window`    varchar(255)  null comment '窗口地址',
+    update_time datetime      null,
+    install_num int default 0 null
+)
+    comment '卡片数据表';
+
 create table config
 (
     user_id int  null,
     config  json null
 );
 
+create index config_user_id_index
+    on config (user_id);
+
 create table history
 (
     id      bigint auto_increment
@@ -17,8 +38,9 @@ create table history
 
 create table link
 (
-    user_id int  null,
-    link    json null
+    user_id     int      null,
+    update_time datetime null comment '更新时间',
+    link        json     null
 );
 
 create table link_folder
@@ -46,6 +68,7 @@ create table linkstore
     domain      varchar(255)               null,
     app         int         default 0      null comment '是否app',
     install_num int         default 0      null comment '安装量',
+    bgColor     varchar(30)                null comment '背景颜色',
     constraint linkStore_id_uindex
         unique (id)
 );
@@ -67,6 +90,20 @@ create table note
 create index note_user_id_index
     on note (user_id);
 
+create table search_engine
+(
+    id          int auto_increment
+        primary key,
+    name        varchar(50)   null comment '名称',
+    icon        varchar(255)  null comment '图标 128x128',
+    url         varchar(255)  null comment '跳转url',
+    sort        int default 0 null comment '排序',
+    create_time datetime      null comment '添加时间',
+    status      int default 0 null comment '状态 0=关闭 1=启用',
+    tips        varchar(250)  null comment '搜索引擎介绍'
+)
+    comment '搜索引擎';
+
 create table setting
 (
     `keys` varchar(200) not null
@@ -76,8 +113,9 @@ create table setting
 
 create table tabbar
 (
-    user_id int  null,
-    tabs    json null
+    user_id     int      null,
+    tabs        json     null,
+    update_time datetime null
 )
     comment '用户页脚信息';
 
@@ -112,23 +150,15 @@ create table user
         unique (mail)
 );
 
-create table card
+create table user_search_engine
 (
-    id          int auto_increment
+    user_id int  not null
         primary key,
-    name        varchar(200)  null,
-    name_en     varchar(200)  null,
-    status      int default 0 null,
-    version     int default 0 null,
-    tips        varchar(255)  null comment '说明',
-    create_time datetime      null comment '添加时间',
-    src         text          null comment 'logo',
-    url         varchar(255)  null comment '卡片地址',
-    `window`    varchar(255)  null comment '窗口地址',
-    update_time datetime      null,
-    install_num int default 0 null
+    list    json null,
+    constraint user_search_engine_pk
+        unique (user_id)
 )
-    comment '卡片数据表';
+    comment '用户搜索引擎同步表';
 
 
 
@@ -140,4 +170,15 @@ INSERT INTO linkstore (name, src, url, type, size, create_time, hot, tips, domai
 INSERT INTO linkstore (name, src, url, type, size, create_time, hot, tips, domain, app, install_num) VALUES ('腾讯云', '/static/tencentcloud.png', 'https://cloud.tencent.com/', 'icon', '1x1', '2022-11-10 16:25:51', 1, '腾讯云', 'cloud.tencent.com', 0, 0);
 INSERT INTO linkstore (name, src, url, type, size, create_time, hot, tips, domain, app, install_num) VALUES ('阿里云', '/static/aliyun.png', 'https://www.aliyun.com/', 'icon', '1x1', '2022-11-10 17:30:17', 1, '阿里云', 'www.aliyun.com,aliyun.com', 0, 0);
 INSERT INTO linkstore (name, src, url, type, size, create_time, hot, tips, domain, app, install_num) VALUES ('腾讯视频', '/static/txsp.png', 'https://v.qq.com/channel/choice?channel_2022=1', 'icon', '1x1', '2022-12-19 19:34:45', 0, '腾讯视频', 'v.qq.com', 0, 0);
-INSERT INTO linkstore (name, src, url, type, size, create_time, hot, tips, domain, app, install_num) VALUES ('记事本', '/static/note.png', '/noteApp', 'icon', '1x1', '2023-06-14 21:13:15', 1,'记事本App', '/noteApp', 1, 3);
+INSERT INTO linkstore (name, src, url, type, size, create_time, hot, tips, domain, app, install_num) VALUES ('记事本', '/static/note.png', '/noteApp', 'icon', '1x1', '2023-06-14 21:13:15', 1,'记事本App', '/noteApp', 1, 3);
+
+
+INSERT INTO search_engine (id, name, icon, url, sort, create_time, status, tips) VALUES (1, '百度', '/static/searchEngine/baidu.svg', 'https://www.baidu.com/s?wd={1}', 0, '2024-01-14 22:12:18', 1, '中国领先的搜索引擎和互联网公司,提供全球最大的中文搜索引擎服务,同时涵盖在线地图、贴吧、知道等多个互');
+INSERT INTO search_engine (id, name, icon, url, sort, create_time, status, tips) VALUES (3, '必应', '/static/searchEngine/bing.svg', 'https://www.bing.com/search?q={1}', 99, '2024-01-14 23:20:03', 1, '微软推出的搜索引擎,以直观的界面和优质搜索结果而闻名,提供全球范围内的多语言搜索服务');
+INSERT INTO search_engine (id, name, icon, url, sort, create_time, status, tips) VALUES (4, 'Google', '/static/searchEngine/google.svg', 'https://www.google.com/search?q={1}', 98, '2024-01-14 23:20:21', 1, 'Google:全球最大的搜索引擎,以卓越的搜索算法、广告服务和多样化的产品而著称,成为互联网信息检索');
+INSERT INTO search_engine (id, name, icon, url, sort, create_time, status, tips) VALUES (5, '搜狗', '/static/searchEngine/sougou.svg', 'https://www.sogou.com/web?query={1}', 0, '2024-01-14 23:20:46', 1, '中国领先的搜索引擎,致力于提供智能搜索和语音输入技术,以及多元化的互联网服务,深受用户喜爱');
+INSERT INTO search_engine (id, name, icon, url, sort, create_time, status, tips) VALUES (6, '360', '/static/searchEngine/360.svg', 'https://www.so.com/s?q={1}', 0, '2024-01-14 23:21:07', 1, '中国知名搜索引擎,注重用户隐私安全,提供全面的搜索服务,涵盖网页、图片、新闻等多个领域,致力于用户友');
+INSERT INTO search_engine (id, name, icon, url, sort, create_time, status, tips) VALUES (7, '开发者搜索', '/static/searchEngine/baidudev.png', 'https://kaifa.baidu.com/searchPage?module=SEARCH&wd={1}', 0, '2024-01-14 23:21:45', 1, '专注于技术文档、API 和开发者资源的搜索引擎,为开发者提供快速准确的技术信息检索服务,支持多种编程');
+INSERT INTO search_engine (id, name, icon, url, sort, create_time, status, tips) VALUES (8, 'B站', '/static/searchEngine/bilibiliico.png', 'https://search.bilibili.com/all?vt=21160573&keyword={1}', 0, '2024-01-14 23:21:57', 1, '中国弹幕视频平台,以二次元文化为特色,提供丰富的动画、游戏、音乐等内容,用户可通过弹幕互动分享观感。');
+INSERT INTO search_engine (id, name, icon, url, sort, create_time, status, tips) VALUES (9, '微博', '/static/searchEngine/weiboico.png', 'https://s.weibo.com/weibo?q={1}', 0, '2024-01-14 23:22:12', 1, '中国社交媒体平台,用户可以发布短文、图片和视频,关注他人并互动评论,是实时新闻、话题讨论和社交分享的');
+INSERT INTO search_engine (id, name, icon, url, sort, create_time, status, tips) VALUES (10, 'DuckDuckGo', '/static/searchEngine/DuckDuckGo.svg', 'https://duckduckgo.com/?t=h_&q={1}&ia=web', 96, '2024-01-15 21:37:44', 1, '注重隐私保护的搜索引擎,致力于不追踪用户个人信息,提供匿名、安全的搜索服务,受到关注的隐私倡导者青睐');

+ 1 - 0
public/dist/assets/about.1705848582155.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.1705848582155.js

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

BIN
public/dist/assets/add.1705848582155.png


+ 1 - 0
public/dist/assets/add.1705848582155.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/addCard.1705848582155.css

@@ -0,0 +1 @@
+.addCardBox[data-v-60425510]{display:grid;grid-template-columns:1fr 1fr;grid-template-rows:repeat(auto-fill,1fr);gap:15px}.addCardBox>.cardItem[data-v-60425510]{width:100%;height:100%;padding:15px;border-radius:10px;background-color:#44444b1a}.addCardBox>.cardItem>iframe[data-v-60425510]{border-radius:12px;border:none;outline:none;width:100%;height:180px}.addCardWindow[data-v-60425510]{position:relative;width:100%;height:100%;overflow-y:scroll;padding-bottom:20px}

+ 1 - 0
public/dist/assets/addCard.1705848582155.js

@@ -0,0 +1 @@
+import{_ as a,r as e,u as s,X as t,b as n,c as l,d as i,g as r,m as d,e as c,F as o,f as u,h as m,x as p,a1 as x,j as v,aa as f,k as _,T as y,ac as g,L as k,D as h,E as b}from"./index.1705848582155.js";const w={class:"addCardWindow"},C={class:"addCardBox mt-2"},j={class:"cardItem"},z={class:"text-center text-base text-black"},I={class:"text-center text-gray-700 text-sm",style:{height:"40px",display:"flex","align-items":"center","justify-content":"center"}},L=["src"],B={class:"mt-4 flex justify-between"},D=(a=>(h("data-v-60425510"),a=a(),b(),a))((()=>c("span",{class:"iconfont icon-redu text-red-500 text-lg"},null,-1)));var E=a({__name:"addCard",setup(a){const h=e(!1),b=s(),E=e([]);t({url:"/card/index"}).then((a=>{1===a.code&&(E.value=a.data,h.value=!0)}));return(a,e)=>{const s=n("el-empty"),F=n("el-button");return l(),i("div",w,[h.value&&0===E.value.length?(l(),r(s,{key:0,description:"目前还没有卡片应用哟!"})):d("",!0),c("div",C,[(l(!0),i(o,null,u(E.value,((a,e)=>(l(),r(y,{key:e},{default:m((()=>[c("div",j,[c("h3",z,p(a.name),1),c("div",I,[c("span",null,p(a.tips),1)]),c("iframe",{src:a.url,class:"mt-2"},null,8,L),c("div",B,[c("div",null,[D,x(" "+p(v(f)(a.install_num)),1)]),_(F,{onClick:e=>(async a=>{let e={sort:99999,id:g(),name:a.name,name_en:a.name_en,size:"2x4",src:a.src,url:a.url,window:a.window,type:"component",component:"plugins",app:1,tips:a.tips,version:a.version,origin_id:a.id};if(b.state.link.find((e=>{const{name_en:s=!1}=e;if(s&&s===a.name_en)return!0})))return k.error("您已添加过了!请勿重复添加相同卡片!"),!1;b.state.link.push(e),b.commit("updateLink"),await t({url:"/card/install_num",method:"post",data:{id:a.id}})})(a),size:"small",round:"",style:{"background-color":"rgba(243,243,243,0.45)"}},{default:m((()=>[x("添加 ")])),_:2},1032,["onClick"])])])])),_:2},1024)))),128))])])}}},[["__scopeId","data-v-60425510"]]);export{E as default};

+ 1 - 0
public/dist/assets/addSearchEngine.1705848582155.css

@@ -0,0 +1 @@
+.searchEngineUserManager{position:absolute;top:10px;left:0;overflow-y:scroll;width:100%;height:calc(100% - 10px);padding:0 0 20px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.searchEngineUserManager>.myEngine{min-height:80px}.search-add-ico{position:absolute;border-radius:30px;right:11px;top:-11px;width:22px;height:22px;background-color:#008bd7;display:flex;justify-content:center;align-items:center;cursor:pointer}.search-del-ico{position:absolute;border-radius:30px;right:11px;top:-11px;width:22px;height:22px;background-color:#d70000;display:flex;justify-content:center;align-items:center;cursor:pointer}.searchEngineTitle{position:fixed;top:8px;width:230px;height:20px;left:15px;color:#0d0c22;font-size:15px}.customEngineName{width:105px;border-radius:4px;padding:6px 10px;font-size:12px;outline:none}.customEngineUrl{border-radius:4px;padding:6px 10px;font-size:12px;outline:none;flex:1}.addCustom{width:80px;flex-shrink:0;background:#04a3ff;padding:0 10px;outline:none;border:none;color:#fff;font-size:12px}@media (max-width: 500px){.addCustom{width:100%}}

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


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

@@ -0,0 +1 @@
+.selectCom{background-color:#7c94b0a6!important;color:#fff!important}.addiconframe{height:100%;width:100%}.addiconframe>.left{width:145px;height:calc(100% + 28px);transform:translateY(-28px)}.addiconframe>.left .titleTop{height:80px;color:#000}.addiconframe>.left>.add-body>.add-type{cursor:pointer;display:flex;align-items:center;border-radius:5px;padding:8px 10px;font-size:15px;width:100%;color:#000;transition:all .3s}.addiconframe>.left>.add-body>.add-type>.iconfont{font-size:18px}.addiconframe>.left>.add-body>.add-type>span:not(.iconfont){margin-left:5px}.addiconframe>.right{width:calc(100% - 145px);padding:0 15px}

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

@@ -0,0 +1 @@
+import{B as a,C as s,R as l,r as n,c as t,d,e,n as i,j as c,P as o,m as p,g as r,ad as u}from"./index.1705848582155.js";const _={class:"addiconframe flex"},v={class:"left"},m=e("div",{class:"titleTop flex pl-5 items-center"},[e("span",{class:"text-2xl w-full"},[e("span",{class:"ml-2"},"添加图标")])],-1),f={class:"add-body space-y-3 pl-3 pr-3"},y=[e("span",{class:"iconfont icon-tag"},null,-1),e("span",null,"在线标签库",-1)],C=[e("span",{class:"iconfont icon-zidingyi"},null,-1),e("span",null,"自定义标签",-1)],j=[e("span",{class:"iconfont icon-kapian"},null,-1),e("span",null,"卡片组件库",-1)],x={class:"right"},E={__name:"addicon",props:{data:{type:Object}},setup(E){var k;const g=E,O=a((()=>s((()=>import("./addCard.1705848582155.js")),["assets/addCard.1705848582155.js","assets/addCard.1705848582155.css","assets/index.1705848582155.js","assets/index.17058485821554.css"]))),P=a((()=>s((()=>import("./custom.1705848582155.js")),["assets/custom.1705848582155.js","assets/custom.1705848582155.css","assets/index.1705848582155.js","assets/index.17058485821554.css"]))),R=a((()=>s((()=>import("./onlineMall.1705848582155.js")),["assets/onlineMall.1705848582155.js","assets/onlineMall.1705848582155.css","assets/index.1705848582155.js","assets/index.17058485821554.css","assets/href.1705848582155.js"]))),T=l(R),A=n({}),D=a=>{T.value=a};return(null==(k=g.data)?void 0:k.id)&&(A.value=g.data,D(P)),(a,s)=>{var l;return t(),d("div",_,[e("div",v,[m,e("div",f,[e("div",{class:i(["add-type",{selectCom:c(T)===c(R)}]),onClick:s[0]||(s[0]=a=>D(c(R)))},y,2),e("div",{class:i(["add-type",{selectCom:c(T)===c(P)}]),onClick:s[1]||(s[1]=a=>D(c(P)))},C,2),(null==(l=c(o).state.site)?void 0:l.auth)?(t(),d("div",{key:0,class:i(["add-type",{selectCom:c(T)===c(O)}]),onClick:s[2]||(s[2]=a=>D(c(O)))},j,2)):p("",!0)])]),e("div",x,[(t(),r(u(c(T)),{data:A.value},null,8,["data"]))])])}}};export{E as default};

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


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


+ 1 - 0
public/dist/assets/arc.1705848582155.svg

@@ -0,0 +1 @@
+<svg t="1704989608955" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2460" width="128" height="128"><path d="M512 512m-442.7 0a442.7 442.7 0 1 0 885.4 0 442.7 442.7 0 1 0-885.4 0Z" fill="#9BBFFD" p-id="2461"></path><path d="M512 512m-263 0a263 263 0 1 0 526 0 263 263 0 1 0-526 0Z" fill="#377FFC" p-id="2462"></path></svg>

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


BIN
public/dist/assets/avatar.1705848582155.png


+ 1 - 0
public/dist/assets/class.1705848582155.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.1705848582155.svg


+ 1 - 0
public/dist/assets/close.1705848582155.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.1705848582155.css

@@ -0,0 +1 @@
+.control-menu-item{display:flex;align-items:center;margin:5px 10px;padding:8px 10px;border-radius:6px;transition:all .3s;cursor:pointer}.control-menu-item:hover{background-color:#f3f4f6}.control-menu-item>.icons{padding:4px;border-radius:6px;display:block;font-size:17px}@media (max-width: 480px){.control-menu-item>.icons{font-size:20px}}.control-menu-item>.names{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:#ebf3fd!important;color:#0095ff!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.1705848582155.js


+ 1 - 0
public/dist/assets/custom.1705848582155.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:#0000001a}.colors-picker{width:30px;height:30px;background-color:#0ff;border-radius:4px}.input_div>.el-input__wrapper,.input_div>.el-textarea__inner{background-color:#e1e1e157;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.el-input__count,.el-input__count-inner{background-color:transparent!important}.bgColorPicker{display:flex;gap:15px;margin-right:15px}.bgColorPicker>li{border:1px solid rgba(255,255,255,.47);width:32px;height:32px;border-radius:3px;display:flex;justify-content:center;align-items:center}.bgColorPicker>li>div{width:22px;height:22px;border-radius:2px;border:1px solid #8c939d}.touming{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAANJJREFUWEftlz0OAWEQhp9NREejonIHFWdwBx3ncAAH4BouoFO5AI2KSqWiYgoKmdeur/lWMpNs8052Z/Jk/rYgsxWZ41O7BKbAwKGyA1aC1ljoe8Cer/ZJYCkSWANz8SVL2rNNJBAEUghYQXWdijoAR1FsTaGfgIvjuwPXl151DoyAiQg0E3of6Dg+C/5uz0ggCNSOQOyCIBAE7BzrOfO7AbTFzN8K/fa8orw2N/0cyygI/CWBoaj2hdDttGuJi+jnLij7wUn2V13HyQHKXsyewAONol4hxQbtygAAAABJRU5ErkJggg==) no-repeat center / cover}

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


+ 1 - 0
public/dist/assets/del.1705848582155.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.1705848582155.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.1705848582155.js

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

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

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

+ 14 - 0
public/dist/assets/edit.1705848582155.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/help.1705848582155.css

@@ -0,0 +1 @@
+.help-card[data-v-5cbcc894]{width:100%;height:100%;border-radius:10px;overflow:scroll}.help-card[data-v-5cbcc894]::-webkit-scrollbar{display:none}

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


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


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


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


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

@@ -0,0 +1 @@
+.model{position:relative;width:calc(((var(--iconWidth) + 26px) * 8) + 60px);height:calc(4 * (var(--iconWidth) + 35px) + 60px);display:flex;align-items:center;justify-content:center;transform:translateY(-30px)!important}@media (max-width: 900px){.model{width:calc(((var(--iconWidth) + 26px) * 4) + 60px)}}#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:-moz-max-content;width:max-content;height:calc(4 * (var(--iconWidth) + 40px));border-radius:var(--iconRadius);display:grid;padding:20px;background-color:#ffffff7d;grid-template-columns:repeat(8,var(--iconWidth));grid-column-gap:26px;grid-row-gap:5px;grid-auto-flow:dense;grid-template-rows:repeat(auto-fit,calc(var(--iconWidth) + 35px))}#iconGroupBox .iconGroupItem::-webkit-scrollbar{display:none}@media (max-width: 900px){#iconGroupBox .iconGroupItem{grid-template-columns:repeat(4,var(--iconWidth))}}.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.1705848582155.js


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


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


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


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


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


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


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


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


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


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


+ 6 - 0
public/dist/assets/lajitong.1705848582155.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.1705848582155.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}

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


+ 1 - 0
public/dist/assets/layout.1705848582155.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>

+ 1 - 0
public/dist/assets/linkstore.1705848582155.css

@@ -0,0 +1 @@
+.logoiconRadius{height:55px;width:55px;border-radius:12px;border:2px solid #eeeeee}.bgColorPicker{display:flex;gap:15px;margin-right:15px}.bgColorPicker>li{border:1px solid #ccc;width:32px;height:32px;border-radius:3px;display:flex;justify-content:center;align-items:center}.bgColorPicker>li>div{width:22px;height:22px;border-radius:2px;border:1px solid #8c939d}.touming{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAANJJREFUWEftlz0OAWEQhp9NREejonIHFWdwBx3ncAAH4BouoFO5AI2KSqWiYgoKmdeur/lWMpNs8052Z/Jk/rYgsxWZ41O7BKbAwKGyA1aC1ljoe8Cer/ZJYCkSWANz8SVL2rNNJBAEUghYQXWdijoAR1FsTaGfgIvjuwPXl151DoyAiQg0E3of6Dg+C/5uz0ggCNSOQOyCIBAE7BzrOfO7AbTFzN8K/fa8orw2N/0cyygI/CWBoaj2hdDttGuJi+jnLij7wUn2V13HyQHKXsyewAONol4hxQbtygAAAABJRU5ErkJggg==) no-repeat center / cover}

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


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


+ 1 - 0
public/dist/assets/net.1705848582155.js

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

+ 1 - 0
public/dist/assets/net.1705848582155.svg

@@ -0,0 +1 @@
+<svg t="1705409061788" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3608" width="128" height="128"><path d="M511.5 82c-236.6 0-429 192.4-429 429 0 236.5 192.5 429 429 429 236.6 0 429-192.4 429-429 0-236.5-192.4-429-429-429z m377.6 403.8H734.3c-4-139.9-41.4-259.9-97.5-331.9C776.5 203 879 332 889.1 485.8z m-402.8-349v349h-147c5.5-175.5 68.6-322.6 147-349z m0 399.4v349c-78.4-26.4-141.4-173.5-147-349h147z m50.5 349v-349h147c-5.6 175.5-68.6 322.6-147 349z m0-399.4v-349c78.4 26.4 141.4 173.5 147 349h-147zM386.3 153.9c-56.1 72-93.5 192-97.5 331.9H133.9C144.1 332 246.5 203 386.3 153.9zM133.9 536.2h154.8c4 139.9 41.4 259.9 97.5 331.9C246.5 819 144.1 690 133.9 536.2z m502.8 331.9c56.1-72 93.5-192 97.5-331.9H889C879 690 776.5 819 636.7 868.1z" fill="#2c2c2c" p-id="3609"></path></svg>

+ 1 - 0
public/dist/assets/onlineMall.1705848582155.css

@@ -0,0 +1 @@
+.onlinemall{position:relative;width:100%;height:100%}.iconSearch{height:40px}.iconSearch>.el-input__wrapper{border-radius:30px}.iconSearch>.el-input__wrapper>input{font-size:14px;text-indent:10px!important}.linkscroll{position:relative;overflow-y:auto;width:100%;height:calc(100% - 110px)}.linkscroll::-webkit-scrollbar{display:none}.linklist{grid-gap:10px}.linklist>div{height:100px;border-radius:8px;background-color:#44444b1a;padding:10px}.linklist>div>.links{display:flex}.linklist>div>.links>.linklogo{flex-shrink:0;border-radius:8px;width:40px;height:40px;display:block}.linklist>div>.links>.linkTips{margin-left:10px;display:flex;color:#0d0c22;flex-direction:column}.linklist>div>.links>.linkTips>div{text-overflow:ellipsis;height:32px;overflow:hidden}.linkarea{width:100%;height:40px;display:flex;align-items:center;overflow-y:scroll;color:#0d0c22}.linkarea>div{cursor:pointer;flex-shrink:0;padding:3px 10px;font-size:12px;border-radius:20px;display:flex;background-color:#44444b1a}.iconSearch>.is-focus{box-shadow:0 0 0 1px #04a3ff!important}.iconSearch>.el-input__wrapper{background-color:#44444b1a;box-shadow:0 0 0 1px transparent}.iconSearch>.el-input__wrapper>input::-moz-placeholder{color:#505050}.iconSearch>.el-input__wrapper>input::placeholder{color:#505050}

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


+ 1 - 0
public/dist/assets/open.1705848582155.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="M21 43C16.2742 41.2327 12.3325 35.1851 10.3597 31.6428C9.50794 30.1134 9.95664 28.2347 11.3236 27.1411C12.8473 25.9222 15.0438 26.0438 16.4236 27.4236L18 29V17.5C18 16.1193 19.1193 15 20.5 15C21.8807 15 23 16.1193 23 17.5V23.5C23 22.1193 24.1193 21 25.5 21C26.8807 21 28 22.1193 28 23.5V25.5C28 24.1193 29.1193 23 30.5 23C31.8807 23 33 24.1193 33 25.5V27.5C33 26.1193 34.1193 25 35.5 25C36.8807 25 38 26.1193 38 27.5V35.368C38 36.4383 37.7354 37.496 37.1185 38.3707C36.0949 39.8219 34.255 42.0336 32 43C28.5 44.5 25.3701 44.6343 21 43Z" fill="#2F88FF" stroke="#333" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M12 9L15 12" stroke="#333" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M19 4L20 10" stroke="#333" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M27 8L25 11" stroke="#333" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/></svg>

+ 1 - 0
public/dist/assets/openType.1705848582155.css

@@ -0,0 +1 @@
+.openType>div{border-radius:6px;background-color:#fff;padding:10px;display:flex;align-items:center;justify-content:space-between}.openType>div>span{font-size:13px}

+ 1 - 0
public/dist/assets/openType.1705848582155.js

@@ -0,0 +1 @@
+import{u as e,b as l,c as n,d as a,e as o,k as s,j as p}from"./index.1705848582155.js";const u={class:"openType space-y-2"},t=o("span",null,"搜索新页面打开",-1),c=o("span",null,"标签新页面打开",-1),d=o("span",null,"进入程序自动聚焦搜索",-1),m=o("span",null,"搜索词联想功能",-1),i=o("span",null,"图标快捷搜索展示",-1),g={__name:"openType",setup(g){const f=e(),V=()=>{f.commit("updateConfig")};return(e,g)=>{const r=l("el-switch");return n(),a("div",u,[o("div",null,[t,s(r,{onChange:V,modelValue:p(f).state.config.openType.searchOpen,"onUpdate:modelValue":g[0]||(g[0]=e=>p(f).state.config.openType.searchOpen=e),class:"ml-2"},null,8,["modelValue"])]),o("div",null,[c,s(r,{onChange:V,modelValue:p(f).state.config.openType.linkOpen,"onUpdate:modelValue":g[1]||(g[1]=e=>p(f).state.config.openType.linkOpen=e),class:"ml-2"},null,8,["modelValue"])]),o("div",null,[d,s(r,{onChange:V,modelValue:p(f).state.config.openType.autofocus,"onUpdate:modelValue":g[2]||(g[2]=e=>p(f).state.config.openType.autofocus=e),class:"ml-2"},null,8,["modelValue"])]),o("div",null,[m,s(r,{onChange:V,modelValue:p(f).state.config.openType.searchRecommend,"onUpdate:modelValue":g[3]||(g[3]=e=>p(f).state.config.openType.searchRecommend=e),class:"ml-2"},null,8,["modelValue"])]),o("div",null,[i,s(r,{onChange:V,modelValue:p(f).state.config.openType.searchLink,"onUpdate:modelValue":g[4]||(g[4]=e=>p(f).state.config.openType.searchLink=e),class:"ml-2"},null,8,["modelValue"])])])}}};export{g as default};

+ 1 - 0
public/dist/assets/reload.1705848582155.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="M42 8V24" stroke="#ff4800" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M6 24L6 40" stroke="#ff4800" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/><path d="M42 24C42 14.0589 33.9411 6 24 6C18.9145 6 14.3216 8.10896 11.0481 11.5M6 24C6 33.9411 14.0589 42 24 42C28.8556 42 33.2622 40.0774 36.5 36.9519" stroke="#ff4800" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/></svg>

+ 9 - 0
public/dist/assets/search.1705848582155.svg

@@ -0,0 +1,9 @@
+<svg width="22" height="22" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+          <path
+            d="M21 38C30.3888 38 38 30.3888 38 21C38 11.6112 30.3888 4 21 4C11.6112 4 4 11.6112 4 21C4 30.3888 11.6112 38 21 38Z"
+            fill="none" stroke="#747474" stroke-width="4" stroke-linejoin="round" />
+          <path d="M26.657 14.3431C25.2093 12.8954 23.2093 12 21.0001 12C18.791 12 16.791 12.8954 15.3433 14.3431"
+            stroke="#747474" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" />
+          <path d="M33.2216 33.2217L41.7069 41.707" stroke="#747474" stroke-width="4" stroke-linecap="round"
+            stroke-linejoin="round" />
+        </svg>

+ 1 - 0
public/dist/assets/searchEngine.1705848582155.css

@@ -0,0 +1 @@
+.searchEngineLogo[data-v-73d46173]{width:40px;height:40px;border-radius:12px;border:2px solid #eeeeee;padding:5px;margin:auto}

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


+ 1 - 0
public/dist/assets/setting.1705848582155.css

@@ -0,0 +1 @@
+.el-card{border-radius:8px!important}.avatar-uploader .avatar{width:100px;height:100px;display:block;border-radius:12px}.avatar-uploader .el-upload{border:1px dashed var(--el-border-color);border-radius:6px;cursor:pointer;position:relative;overflow:hidden;transition:var(--el-transition-duration-fast)}.avatar-uploader .el-upload:hover{border-color:var(--el-color-primary)}.el-icon.avatar-uploader-icon{font-size:28px;color:#8c939d;width:100px;height:100px;text-align:center}

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


+ 1 - 0
public/dist/assets/setting.1705848582155.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 4L18 10H10V18L4 24L10 30V38H18L24 44L30 38H38V30L44 24L38 18V10H30L24 4Z" fill="none" stroke="#5105ff" stroke-width="4" stroke-linejoin="round"/><path d="M24 30C27.3137 30 30 27.3137 30 24C30 20.6863 27.3137 18 24 18C20.6863 18 18 20.6863 18 24C18 27.3137 20.6863 30 24 30Z" fill="none" stroke="#5105ff" stroke-width="4" stroke-linejoin="round"/></svg>

+ 1 - 0
public/dist/assets/theme.1705848582155.css

@@ -0,0 +1 @@
+.theme-control{position:relative;overflow-y:scroll;height:100%}

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


+ 1 - 0
public/dist/assets/user.1705848582155.css

@@ -0,0 +1 @@
+.user-control [userBox]{border-radius:10px;background-color:#fff;padding:10px;display:flex;flex-direction:column;align-items:center}.user-control [userBox]>div{width:100%;display:flex;flex-direction:column;align-items:center;font-size:13px}.user-control [userBox]>div>.iconfont{font-size:30px}

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


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


+ 3 - 0
public/dist/assets/wapp.1705848582155.svg

@@ -0,0 +1,3 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg t="1686753105122" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1718"
+     width="48" height="48"><path d="M512 0a512 512 0 1 0 512 512A512 512 0 0 0 512 0z m256.717 460.186a151.962 151.962 0 0 1-87.347 65.74 83.251 83.251 0 0 1-24.474 4.096 29.082 29.082 0 0 1 0-58.163 15.667 15.667 0 0 0 6.451-1.229 91.443 91.443 0 0 0 55.91-40.96 75.264 75.264 0 0 0 11.06-39.628c0-45.978-42.496-83.866-94.31-83.866a105.267 105.267 0 0 0-51.2 13.414 81.92 81.92 0 0 0-43.725 70.452v244.224a138.445 138.445 0 0 1-72.704 120.422 159.642 159.642 0 0 1-79.77 20.48c-84.378 0-153.6-63.488-153.6-142.029a136.192 136.192 0 0 1 19.763-69.837 151.962 151.962 0 0 1 87.347-65.74 85.914 85.914 0 0 1 24.474-4.096 29.082 29.082 0 1 1 0 58.163 15.667 15.667 0 0 0-6.451 1.229 95.949 95.949 0 0 0-55.91 40.96 75.264 75.264 0 0 0-11.06 39.628c0 45.978 42.496 83.866 94.925 83.866a105.267 105.267 0 0 0 51.2-13.414 81.92 81.92 0 0 0 43.622-70.452V390.35a138.752 138.752 0 0 1 72.807-120.525 151.245 151.245 0 0 1 79.155-21.504c84.378 0 153.6 63.488 153.6 142.029a136.192 136.192 0 0 1-19.763 69.837z" fill="#FF7E05" p-id="1719" data-spm-anchor-id="a313x.7781069.0.i0" class=""></path></svg>

+ 1 - 0
public/dist/assets/webApp.1705848582155.css

@@ -0,0 +1 @@
+.manager-webApp{min-height:calc(100vh - 30px)}.webappItem{min-height:calc(100vh - 123px)}.card-box{display:grid;grid-template-columns:repeat(4,minmax(300px,450px));grid-template-rows:repeat(auto-fill,max-content);gap:20px}@media (max-width: 1700px){.card-box{grid-template-columns:repeat(3,minmax(300px,500px))}}@media (max-width: 1300px){.card-box{grid-template-columns:repeat(2,minmax(300px,600px))}}.card-box .card-box-item{box-shadow:0 0 5px #e7e7e7;border-radius:10px;padding:20px;height:100%}.card-box .card-box-item .card-box-item-logo{width:60px;height:60px;border-radius:12px;box-shadow:0 0 5px #f5f5f5}.card-swipe{width:100%;display:flex;height:-moz-max-content;height:max-content;justify-content:center;background:#fff;padding:15px 0;border-radius:10px}.card-swipe .card-swipe-item{width:-moz-max-content;width:max-content;overflow:hidden;border:3px solid #ffffff;box-shadow:0 0 5px #d2d1d1;border-radius:50px}.card-swipe .card-swipe-item>button{padding:5px 20px;height:40px;width:100px;background:#fff;font-size:14px;border-radius:50px;transition:all .2s}.selSwipe{background:#04a3ff!important;color:#fff}

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


BIN
public/dist/assets/wiki.1705848582155.png


+ 1 - 1
public/dist/index.html

@@ -1 +1 @@
-<!doctype html><html lang="zh"><head><meta charset="UTF-8"/><link href="/favicon" rel="icon"/><meta name="version" content="{$version}"><meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=1,maximum-scale=1,minimum-scale=1"><title>{$title}</title>{$customHead|raw}<meta content="{$keywords}" name="keywords"/><meta content="{$description}" name="description"/><script type="module" crossorigin src="/dist/assets/index.1705154127287.js"></script><link rel="stylesheet" href="/dist/assets/index.17051541272874.css"></head><body><div id="app"></div></body></html>
+<!doctype html><html lang="zh"><head><meta charset="UTF-8"/><link href="{$favicon}" rel="icon"/><meta name="version" content="{$version}"><meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=1,maximum-scale=1,minimum-scale=1"><title>{$title}</title>{$customHead|raw}<meta content="{$keywords}" name="keywords"/><meta content="{$description}" name="description"/><script type="module" crossorigin src="/dist/assets/index.1705848582155.js"></script><link rel="stylesheet" href="/dist/assets/index.17058485821554.css"></head><body><div id="app"></div></body></html>

+ 2 - 2
public/index.php

@@ -10,8 +10,8 @@
 // +----------------------------------------------------------------------
 // [ 应用入口文件 ]
 namespace think;
-define('app_version', '1.3.1');
-define('app_version_code', 31);
+define('app_version', '1.3.5');
+define('app_version_code', 35);
 require __DIR__ . '/../vendor/autoload.php';
 
 // 执行HTTP应用并响应

+ 31 - 4
public/install.php

@@ -49,10 +49,37 @@ $database_type = params('database_type', 1);//1=全新安装,2=使用已存在
 $error = false;
 $conn = null;
 $status = false;
+
+function isDatabaseVersionValid($conn)
+{
+    // 检查连接是否成功
+    if ($conn->connect_error) {
+        die('连接失败: ' . $conn->connect_error);
+    }
+    // 获取数据库类型和版本信息
+    $db_info = $conn->get_server_info();
+    // 判断数据库类型和版本
+    if (strpos($db_info, 'MariaDB') !== false) {
+        // 是 MariaDB,检查版本是否大于等于 10.2.7
+        $maria_version = explode('-', $db_info)[0]; // 提取版本号
+        return version_compare($maria_version, '10.2.7', '>=');
+    } elseif (strpos($db_info, 'MySQL') !== false) {
+        // 是 MySQL,检查版本是否大于等于 5.7
+        $mysql_version = explode('-', $db_info)[0]; // 提取版本号
+        return version_compare($mysql_version, '5.7', '>=');
+    } else {
+        // 未知数据库类型
+        return false;
+    }
+}
+
+
 if ($db_username && $php_version && $fileinfo_ext && $curl_ext && $zip_ext) {
     $conn = new mysqli($db_host, $db_username, $db_password, null, $db_port);
     if ($conn->connect_error) {
-        $error = '<div style="text-align: center">数据库相关错误,详细信息如下</div>'."<div style='margin-top:15px;text-align: center'>{$conn->connect_error}</div>";
+        $error = '<div style="text-align: center">数据库相关错误,详细信息如下</div>' . "<div style='margin-top:15px;text-align: center'>{$conn->connect_error}</div>";
+    } else if (!isDatabaseVersionValid($conn)) {
+        $error = '<div style="text-align: center">数据库相关错误,详细信息如下</div>' . "<div style='margin-top:15px;text-align: center'>数据库版本低于5.7,请升级数据库版本至5.7及以上版本!</div>";
     } else {
         if ($database_type == 1) {//全新安装
             $sql = "DROP DATABASE $table_name";//删除原来的
@@ -78,9 +105,9 @@ if ($db_username && $php_version && $fileinfo_ext && $curl_ext && $zip_ext) {
                  ");
             $conn->query($AdminSql);
             $conn->close();
+            file_put_contents('./installed.lock', 'installed');
+            $status = true;
         }
-        file_put_contents('./installed.lock', 'installed');
-        $status = true;
     }
 }
 if ($status) {
@@ -190,7 +217,7 @@ EOF;
                 margin: auto;
                 width: 500px;
                 height: fit-content;
-                padding:10px 20px 20px;
+                padding: 10px 20px 20px;
                 background-color: rgb(255, 101, 2);
                 color: #fff;
                 border-radius: 12px;

+ 1 - 0
public/static/searchEngine/360.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>

File diff suppressed because it is too large
+ 0 - 0
public/static/searchEngine/DuckDuckGo.svg


+ 1 - 0
public/static/searchEngine/baidu.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/static/searchEngine/baidudev.png


BIN
public/static/searchEngine/bilibiliico.png


+ 1 - 0
public/static/searchEngine/bing.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>

+ 1 - 0
public/static/searchEngine/google.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/static/searchEngine/net.svg


+ 1 - 0
public/static/searchEngine/sougou.svg

@@ -0,0 +1 @@
+<svg t="1650420413766" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5090" width="200" height="200"><path d="M510.050302 1009.113308a504.54878 504.54878 0 1 1 504.470793-504.54878 505.094696 505.094696 0 0 1-504.471793 504.471792z m0-980.001071a475.452291 475.452291 0 1 0 475.374303 475.452291A475.998206 475.998206 0 0 0 510.050302 29.112237z" fill="#3EA1FC" p-id="5091"></path><path d="M694.301738 913.165183c184.643375-88.538274 273.804552-237.141236 267.408544-445.965863-22.232553-344.556584-438.944951-482.863142-532.943378-268.65635-44.308131 196.187585 223.567341 174.423959 329.188966 320.45332 94.388367 133.079369 73.170656 264.443004-63.653132 394.168893z" fill="#3EA1FC" p-id="5092"></path><path d="M321.663508 96.588776C137.020133 185.12605 47.858955 333.807 54.254964 542.553638 76.487517 887.111222 493.199915 1025.41678 587.198342 811.209989c44.386119-196.187585-223.489353-174.422959-329.03299-320.374333-94.388367-133.314332-73.326632-264.755955 63.498156-394.24688z" fill="#3EA1FC" p-id="5093"></path></svg>

BIN
public/static/searchEngine/weiboico.png


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