Browse Source

增加QQ登录,优化个人中心

tushan 1 year ago
parent
commit
8de92a3125
100 changed files with 762 additions and 92 deletions
  1. 2 5
      Dockerfile
  2. 9 2
      app/BaseController.php
  3. 11 5
      app/controller/Api.php
  4. 8 0
      app/controller/Index.php
  5. 2 2
      app/controller/SearchEngine.php
  6. 18 2
      app/controller/Setting.php
  7. 220 31
      app/controller/User.php
  8. 32 14
      app/controller/admin/Index.php
  9. 3 1
      app/view/cardNotFound.html
  10. 32 0
      app/view/privacy.html
  11. 40 0
      app/view/qq_login.html
  12. 21 0
      app/view/qq_login_error.html
  13. 2 1
      composer.json
  14. 2 1
      config/app.php
  15. 1 1
      config/lang.php
  16. 1 1
      config/trace.php
  17. 188 0
      extend/BrowserExtBuild.php
  18. 3 7
      extend/Mail.php
  19. 3 3
      extend/PluginsInstall.php
  20. 3 3
      extend/Upgrade2.php
  21. 35 0
      extend/browserExt/manifest.json
  22. 13 0
      extend/browserExt/src/background.js
  23. 33 0
      extend/browserExt/src/init.js
  24. 14 13
      install.sql
  25. 1 0
      public/dist/assets/about.1713442796762.css
  26. 1 0
      public/dist/assets/about.1713442796762.js
  27. BIN
      public/dist/assets/add.1713442796762.png
  28. 1 0
      public/dist/assets/add.1713442796762.svg
  29. 1 0
      public/dist/assets/addCard.1713442796762.css
  30. 1 0
      public/dist/assets/addCard.1713442796762.js
  31. 1 0
      public/dist/assets/addSearchEngine.1713442796762.css
  32. 0 0
      public/dist/assets/addSearchEngine.1713442796762.js
  33. 1 0
      public/dist/assets/addicon.1713442796762.css
  34. 0 0
      public/dist/assets/addicon.1713442796762.js
  35. 0 0
      public/dist/assets/appSide.1713442796762.css
  36. 0 0
      public/dist/assets/appSide.1713442796762.js
  37. 1 0
      public/dist/assets/apps.1713442796762.svg
  38. 1 0
      public/dist/assets/arc.1713442796762.svg
  39. 0 0
      public/dist/assets/auth.1713442796762.svg
  40. 1 0
      public/dist/assets/background.1713442796762.css
  41. 0 0
      public/dist/assets/background.1713442796762.js
  42. BIN
      public/dist/assets/bg4.1713442796762.png
  43. 1 0
      public/dist/assets/browserImport.1713442796762.js
  44. 1 0
      public/dist/assets/class.1713442796762.svg
  45. 0 0
      public/dist/assets/clienthome.1713442796762.svg
  46. 1 0
      public/dist/assets/close.1713442796762.svg
  47. 1 0
      public/dist/assets/custom.1713442796762.css
  48. 0 0
      public/dist/assets/custom.1713442796762.js
  49. 1 0
      public/dist/assets/defavatar.1713442796762.js
  50. 0 0
      public/dist/assets/defavatar.1713442796762.svg
  51. 1 0
      public/dist/assets/del.1713442796762.svg
  52. 0 0
      public/dist/assets/dialog.1713442796762.js
  53. 0 0
      public/dist/assets/dock.1713442796762.svg
  54. 1 0
      public/dist/assets/edit.1713442796762.svg
  55. BIN
      public/dist/assets/favicon.1713442796762.png
  56. BIN
      public/dist/assets/gonganbeian.1713442796762.ico
  57. 1 0
      public/dist/assets/href.1713442796762.js
  58. 0 0
      public/dist/assets/iconGroup.1713442796762.css
  59. 0 0
      public/dist/assets/iconGroup.1713442796762.js
  60. 0 0
      public/dist/assets/index.1713442796762.css
  61. 0 0
      public/dist/assets/index.1713442796762.js
  62. 1 0
      public/dist/assets/index.17134427967622.css
  63. 0 0
      public/dist/assets/index.17134427967622.js
  64. 1 0
      public/dist/assets/index.17134427967623.css
  65. 0 0
      public/dist/assets/index.17134427967623.js
  66. 0 0
      public/dist/assets/index.17134427967624.css
  67. 0 0
      public/dist/assets/index.17134427967624.js
  68. 0 0
      public/dist/assets/index.17134427967625.css
  69. 0 0
      public/dist/assets/index.17134427967625.js
  70. 0 0
      public/dist/assets/jiesan.1713442796762.svg
  71. 13 0
      public/dist/assets/jquery.1713442796762.js
  72. 0 0
      public/dist/assets/kong.1713442796762.svg
  73. 1 0
      public/dist/assets/kongzhi.1713442796762.svg
  74. BIN
      public/dist/assets/lajitong.1713442796762.png
  75. 1 0
      public/dist/assets/layout.1713442796762.css
  76. 0 0
      public/dist/assets/layout.1713442796762.js
  77. 1 0
      public/dist/assets/layout.1713442796762.svg
  78. 1 0
      public/dist/assets/light.1713442796762.svg
  79. 1 0
      public/dist/assets/linkstore.1713442796762.css
  80. 0 0
      public/dist/assets/linkstore.1713442796762.js
  81. 1 0
      public/dist/assets/net.1713442796762.js
  82. 1 0
      public/dist/assets/net.1713442796762.svg
  83. 1 0
      public/dist/assets/normal.1713442796762.svg
  84. 1 0
      public/dist/assets/note.1713442796762.css
  85. 0 0
      public/dist/assets/note.1713442796762.js
  86. 1 0
      public/dist/assets/onlineMall.1713442796762.css
  87. 0 0
      public/dist/assets/onlineMall.1713442796762.js
  88. 1 0
      public/dist/assets/open.1713442796762.svg
  89. 1 0
      public/dist/assets/openType.1713442796762.css
  90. 1 0
      public/dist/assets/openType.1713442796762.js
  91. BIN
      public/dist/assets/qq_symbol.1713442796762.png
  92. 1 0
      public/dist/assets/right.1713442796762.svg
  93. 9 0
      public/dist/assets/search.1713442796762.svg
  94. 1 0
      public/dist/assets/searchEngine.1713442796762.css
  95. 0 0
      public/dist/assets/searchEngine.1713442796762.js
  96. 1 0
      public/dist/assets/send.1713442796762.svg
  97. 1 0
      public/dist/assets/setting.1713442796762.css
  98. 0 0
      public/dist/assets/setting.1713442796762.js
  99. 1 0
      public/dist/assets/setting.1713442796762.svg
  100. 6 0
      public/dist/assets/sortable.esm.1713442796762.js

+ 2 - 5
Dockerfile

@@ -1,7 +1,5 @@
 FROM alpine:3.13
 FROM alpine:3.13
-
 LABEL describe="tushan-mtab"
 LABEL describe="tushan-mtab"
-
 LABEL author ="tushan<admin@mcecy.com>"
 LABEL author ="tushan<admin@mcecy.com>"
 
 
 WORKDIR /
 WORKDIR /
@@ -16,9 +14,8 @@ COPY ./docker/php.ini /php.ini
 
 
 COPY . /www
 COPY . /www
 
 
-RUN chmod +x /install.sh /start.sh
-RUN /bin/sh /install.sh
-RUN rm /install.sh
+RUN chmod +x /install.sh && chmod +x /start.sh && /bin/sh /install.sh && rm /install.sh
+
 
 
 EXPOSE 80
 EXPOSE 80
 
 

+ 9 - 2
app/BaseController.php

@@ -56,6 +56,7 @@ class BaseController
     protected $user_temp = false;
     protected $user_temp = false;
     private $SettingConfig = false;
     private $SettingConfig = false;
     public $auth = false;
     public $auth = false;
+
     public function __construct(App $app)
     public function __construct(App $app)
     {
     {
 
 
@@ -101,8 +102,14 @@ class BaseController
      */
      */
     public function getUser(bool $must = false)
     public function getUser(bool $must = false)
     {
     {
-        $id = $this->request->header("Userid", $this->request->cookie('Userid', ''));
-        $token = $this->request->header("Token", $this->request->cookie('Token', ''));
+        $id = $this->request->header("Userid",'');
+        $token = $this->request->header("Token",'');
+        if (!$id) {
+            $id = $this->request->cookie('user_id', '');
+        }
+        if (!$token) {
+            $token = $this->request->cookie('token', '');
+        }
         if ($id && $token) {
         if ($id && $token) {
             if ($this->user_temp) return $this->user_temp;
             if ($this->user_temp) return $this->user_temp;
             $user = TokenModel::where("user_id", $id)->where('token', $token)->field("user_id,token,create_time")->find();
             $user = TokenModel::where("user_id", $id)->where('token', $token)->field("user_id,token,create_time")->find();

+ 11 - 5
app/controller/Api.php

@@ -25,7 +25,8 @@ class Api extends BaseController
             'copyright' => $this->Setting("copyright", ''),
             'copyright' => $this->Setting("copyright", ''),
             "recordNumber" => $this->Setting("recordNumber", ''),
             "recordNumber" => $this->Setting("recordNumber", ''),
             "auth" => $this->auth,
             "auth" => $this->auth,
-            "logo" => $this->Setting('logo', '')
+            "logo" => $this->Setting('logo', ''),
+            "qq_login" => $this->Setting('qq_login', '0')
         ]);
         ]);
     }
     }
 
 
@@ -87,11 +88,16 @@ class Api extends BaseController
                 ';
                 ';
             }
             }
             $html = View::display($k, ['time' => date('Y-m-d H:i:s'), 'code' => $code]);
             $html = View::display($k, ['time' => date('Y-m-d H:i:s'), 'code' => $code]);
-            $status = \Mail::send($mail, $html);
-            if ($status) {
-                Cache::set('code' . $mail, $code, 60);
-                return $this->success("发送成功");
+            try {
+                $status = \Mail::send($mail, $html);
+                if ($status) {
+                    Cache::set('code' . $mail, $code, 300);
+                    return $this->success('发送成功');
+                }
+            }catch (\Exception $e){
+                return $this->error($e->getMessage());
             }
             }
+
         }
         }
         return $this->error('发送失败');
         return $this->error('发送失败');
     }
     }

+ 8 - 0
app/controller/Index.php

@@ -24,6 +24,7 @@ class Index extends BaseController
         View::assign("favicon", SettingModel::Config('logo', '/favicon.ico'));
         View::assign("favicon", SettingModel::Config('logo', '/favicon.ico'));
         return View::fetch("dist/index.html");
         return View::fetch("dist/index.html");
     }
     }
+
     function all()
     function all()
     {
     {
         $app = app();
         $app = app();
@@ -41,6 +42,13 @@ class Index extends BaseController
         $dt['site'] = (new Api($app))->site()->getData()['data'];
         $dt['site'] = (new Api($app))->site()->getData()['data'];
         return $this->success("ok", $dt);
         return $this->success("ok", $dt);
     }
     }
+
+    function privacy()
+    {
+        $content = $this->Setting("privacy", "");
+        return View::fetch('/privacy', ['content' => $content,'title'=>$this->Setting("title",''), 'logo' => $this->Setting('logo', '')]);
+    }
+
     function favicon()
     function favicon()
     {
     {
         //从配置中获取logo
         //从配置中获取logo

+ 2 - 2
app/controller/SearchEngine.php

@@ -3,7 +3,6 @@
 namespace app\controller;
 namespace app\controller;
 
 
 use app\BaseController;
 use app\BaseController;
-use app\model\LinkStoreModel;
 use app\model\SearchEngineModel;
 use app\model\SearchEngineModel;
 use app\model\UserSearchEngineModel;
 use app\model\UserSearchEngineModel;
 use think\facade\Cache;
 use think\facade\Cache;
@@ -91,7 +90,8 @@ class SearchEngine extends BaseController
         }
         }
         return $this->error('保存失败');
         return $this->error('保存失败');
     }
     }
-    function sort(){
+    function sort(): \think\response\Json
+    {
         $sort = (array)$this->request->post();
         $sort = (array)$this->request->post();
         foreach ($sort as $key => $value) {
         foreach ($sort as $key => $value) {
             SearchEngineModel::where("id", $value['id'])->update(['sort' => $value['sort']]);
             SearchEngineModel::where("id", $value['id'])->update(['sort' => $value['sort']]);

+ 18 - 2
app/controller/Setting.php

@@ -28,18 +28,26 @@ class Setting extends BaseController
         (new \app\controller\admin\Index(app()))->authorization();
         (new \app\controller\admin\Index(app()))->authorization();
         return $this->success('保存成功');
         return $this->success('保存成功');
     }
     }
+
     function refreshCache(): \think\response\Json
     function refreshCache(): \think\response\Json
     {
     {
         $this->getAdmin();
         $this->getAdmin();
         Cache::delete('webConfig');
         Cache::delete('webConfig');
         return $this->success('刷新成功');
         return $this->success('刷新成功');
     }
     }
+
     function getSetting(): \think\response\Json
     function getSetting(): \think\response\Json
     {
     {
         $admin = $this->getAdmin();
         $admin = $this->getAdmin();
         $role = $this->request->post('role', []);
         $role = $this->request->post('role', []);
         $info = SettingModel::Config();
         $info = SettingModel::Config();
         $tmp = [];
         $tmp = [];
+        $url = '';
+        if (in_array('ext_name', $role)) {
+            if (file_exists(public_path() . '/browserExt.zip')) {
+                $url = '/browserExt.zip';
+            }
+        }
         if ($info) {
         if ($info) {
             if (count($role) > 0) {
             if (count($role) > 0) {
                 foreach ($info as $key => $val) {
                 foreach ($info as $key => $val) {
@@ -48,8 +56,16 @@ class Setting extends BaseController
                     }
                     }
                 }
                 }
             }
             }
-            return $this->success('ok', $tmp);
+            return json(['msg' => "ok", "data" => $tmp, 'success' => $this->auth, 'code' => 1, "url" => $url]);
+        }
+        return json(['msg' => 'ok', 'data' => false, 'success' => $this->auth, 'code' => 0, 'url' => $url]);
+    }
+    function delExt(): \think\response\Json
+    {
+        $this->getAdmin();
+        if (file_exists(public_path() . '/browserExt.zip')) {
+            unlink(public_path() . '/browserExt.zip');
         }
         }
-        return $this->error('empty');
+        return $this->success("ok");
     }
     }
 }
 }

+ 220 - 31
app/controller/User.php

@@ -4,47 +4,65 @@
 namespace app\controller;
 namespace app\controller;
 
 
 use app\BaseController;
 use app\BaseController;
+use app\model\ConfigModel;
+use app\model\SettingModel;
 use app\model\TokenModel;
 use app\model\TokenModel;
 use app\model\UserModel;
 use app\model\UserModel;
 use think\facade\Cache;
 use think\facade\Cache;
+use think\facade\Log;
+use think\facade\View;
 
 
 class User extends BaseController
 class User extends BaseController
 {
 {
+    protected $qq_bind_mode = false;
+
     public function login(): \think\response\Json
     public function login(): \think\response\Json
     {
     {
         $user = $this->request->post('username', '0');
         $user = $this->request->post('username', '0');
         $pass = $this->request->post('password', '0');
         $pass = $this->request->post('password', '0');
-        $info = UserModel::where("mail", $user)->field('id,mail,password,login_fail_count,login_ip,login_time')->find();
+        $user = trim($user);
+        $pass = trim($pass);
+        $info = UserModel::where('mail', $user)->field('id,mail,password,login_fail_count,login_ip,login_time')->find();
 
 
         if (Cache::get('login.' . $user)) {
         if (Cache::get('login.' . $user)) {
-            return $this->error("账号已被安全锁定,您可以修改密码然后登录");
+            return $this->error('账号已被安全锁定,您可以修改密码然后登录');
         }
         }
         if (!$info) {
         if (!$info) {
-            return $this->error("账号不存在");
+            return $this->error('账号不存在');
         }
         }
         if ($info['login_fail_count'] == 10) {
         if ($info['login_fail_count'] == 10) {
             Cache::set('login.' . $user, 'lock', 7200);
             Cache::set('login.' . $user, 'lock', 7200);
             $info->login_fail_count = 0;
             $info->login_fail_count = 0;
             $info->save();
             $info->save();
-            return $this->error("账号已被锁定2小时");
+            return $this->error('账号已被锁定2小时');
         }
         }
         if ($info['password'] != md5($pass)) {
         if ($info['password'] != md5($pass)) {
             $info->login_fail_count += 1;
             $info->login_fail_count += 1;
             $info->save();
             $info->save();
-            return $this->error("账号不存在或密码错误");
+            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' => getRealIp(), 'user_agent' => $agent];
-        $add = TokenModel::insert($auth);
-        unset($auth['user_agent']);
-        unset($auth['ip']);
+        $auth = $this->refreshToken($info);
         $info->login_ip = getRealIp();
         $info->login_ip = getRealIp();
-        $info->login_time = date("Y-m-d H:i:s");
+        $info->login_time = date('Y-m-d H:i:s');
         $info->login_fail_count = 0;//登陆成功将失败次数归零
         $info->login_fail_count = 0;//登陆成功将失败次数归零
         $info->save();
         $info->save();
-        return $this->success("登录成功", $auth);
+        return $this->success('登录成功', $auth);
+    }
+
+    private function refreshToken($info): array
+    {
+        $token = renderToken($info['id']);
+        $agent = $this->request->header('User-Agent');
+        $agent = mb_substr($agent, 0, 250);
+        $auth = ['user_id' => $info['id'], 'token' => $token, 'create_time' => time(), 'ip' => getRealIp(), 'user_agent' => $agent];
+        if (isset($info['access_token'])) {
+            $auth['access_token'] = $info['access_token'];
+        }
+        TokenModel::insert($auth);
+        unset($auth['user_agent']);
+        unset($auth['access_token']);
+        unset($auth['ip']);
+        return $auth;
     }
     }
 
 
     function register(): \think\response\Json
     function register(): \think\response\Json
@@ -53,23 +71,25 @@ class User extends BaseController
         $pass = $this->request->post('password', false);
         $pass = $this->request->post('password', false);
         $code = $this->request->post('code', '0000');
         $code = $this->request->post('code', '0000');
         if ($user && $pass) {
         if ($user && $pass) {
+            $user = trim($user);
+            $pass = trim($pass);
             if (!validateEmail($user)) {
             if (!validateEmail($user)) {
-                return $this->error("邮箱格式错误");
+                return $this->error('邮箱格式错误');
             }
             }
             if (strlen($pass) < 6) {
             if (strlen($pass) < 6) {
-                return $this->error("密码过短");
+                return $this->error('密码过短');
             }
             }
-            $cacheCode = Cache::get("code" . $user);
+            $cacheCode = Cache::get('code' . $user);
             if (!$cacheCode || $cacheCode != $code) {
             if (!$cacheCode || $cacheCode != $code) {
                 return $this->error('验证码错误');
                 return $this->error('验证码错误');
             }
             }
-            if (UserModel::where("mail", $user)->field("id,mail")->find()) {
-                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' => getRealIp()]);
+            $add = UserModel::insert(['mail' => $user, 'password' => md5($pass), 'create_time' => date('Y-m-d H:i:s'), 'register_ip' => getRealIp()]);
             if ($add) {
             if ($add) {
-                Cache::delete("code" . $user);
-                return $this->success("ok");
+                Cache::delete('code' . $user);
+                return $this->success('ok');
             }
             }
         }
         }
         return $this->error('注册失败');
         return $this->error('注册失败');
@@ -81,24 +101,26 @@ class User extends BaseController
         $pass = $this->request->post('password', false);
         $pass = $this->request->post('password', false);
         $code = $this->request->post('code', '0000');
         $code = $this->request->post('code', '0000');
         if ($user && $pass) {
         if ($user && $pass) {
+            $user = trim($user);
+            $pass = trim($pass);
             if (!validateEmail($user)) {
             if (!validateEmail($user)) {
-                return $this->error("邮箱格式错误");
+                return $this->error('邮箱格式错误');
             }
             }
             if (strlen($pass) < 6) {
             if (strlen($pass) < 6) {
-                return $this->error("密码过短");
+                return $this->error('密码过短');
             }
             }
-            $info = UserModel::where("mail", $user)->field("id,mail")->find();
+            $info = UserModel::where('mail', $user)->field('id,mail')->find();
             if (!$info) {
             if (!$info) {
-                return $this->error("账号不存在");
+                return $this->error('账号不存在');
             }
             }
-            $cacheCode = Cache::get("code" . $user);
+            $cacheCode = Cache::get('code' . $user);
             if ($cacheCode && $cacheCode == $code) {
             if ($cacheCode && $cacheCode == $code) {
                 $info->password = md5($pass);
                 $info->password = md5($pass);
                 $add = $info->save();
                 $add = $info->save();
                 if ($add) {
                 if ($add) {
-                    TokenModel::where("user_id", $info['id'])->delete(); //删除所有登录记录
+                    TokenModel::where('user_id', $info['id'])->delete(); //删除所有登录记录
                     Cache::delete('login.' . $user);
                     Cache::delete('login.' . $user);
-                    return $this->success("ok");
+                    return $this->success('ok');
                 }
                 }
             } else {
             } else {
                 return $this->error('验证码错误');
                 return $this->error('验证码错误');
@@ -107,11 +129,39 @@ class User extends BaseController
         return $this->error('修改失败');
         return $this->error('修改失败');
     }
     }
 
 
+    function newMail(): \think\response\Json
+    {
+        $userinfo = $this->getUser(true);
+        $user = $this->request->post('mail', false);
+        $code = $this->request->post('code', false);
+        if ($user && $code) {
+            $user = trim($user);
+            if (!validateEmail($user)) {
+                return $this->error('邮箱格式错误');
+            }
+            $cacheCode = Cache::get('code' . $user);
+            if ($cacheCode && $cacheCode == $code) {
+                $info = UserModel::where('mail', $user)->field('id,mail')->find();
+                if ($info) {
+                    return $this->error('该邮箱已被使用!');
+                }
+                $info = UserModel::where('id', $userinfo['user_id'])->field('id,mail')->find();
+                $info->mail = $user;
+                $info->save();
+                Cache::delete('code' . $user);
+                return $this->success('修改成功');
+            } else {
+                return $this->error('验证码错误');
+            }
+        }
+        return $this->error('请认真填写表单');
+    }
+
     function loginOut(): \think\response\Json
     function loginOut(): \think\response\Json
     {
     {
         $user = $this->getUser();
         $user = $this->getUser();
         if ($user) {
         if ($user) {
-            TokenModel::where("user_id", $user['user_id'])->where('token', $user['token'])->delete();
+            TokenModel::where('user_id', $user['user_id'])->where('token', $user['token'])->delete();
         }
         }
         return $this->success('ok');
         return $this->success('ok');
     }
     }
@@ -120,9 +170,148 @@ class User extends BaseController
     {
     {
         $info = $this->getUser(true);
         $info = $this->getUser(true);
         if ($info) {
         if ($info) {
-            $info = UserModel::field('id,mail,manager')->find($info['user_id']);
+            $info = UserModel::field('id,mail,manager,nickname,avatar,qq_open_id')->find($info['user_id']);
+            if ($info['qq_open_id']) {
+                $info['qqBind'] = true;
+                unset($info['qq_open_id']);
+            }
             return $this->success('ok', $info);
             return $this->success('ok', $info);
         }
         }
         return $this->error('获取失败');
         return $this->error('获取失败');
     }
     }
+
+    public function updateInfo(): \think\response\Json
+    {
+        $info = $this->getUser(true);
+        $field = $this->request->post('field', false);
+        $value = $this->request->post('value', false);
+        //允许修改的字段
+        $allow = ['nickname', 'avatar'];
+        if ($info && $field && $value && in_array($field, $allow)) {
+            UserModel::where('id', $info['user_id'])->update([$field => $value]);
+        }
+        return $this->success('修改成功');
+    }
+
+    function qLogin(): \think\response\Redirect
+    {
+        $appId = SettingModel::Config('qq_login_appid', false);
+        $callback = 'https://' . $this->request->host() . '/qq_login';
+        $type = $this->request->get('type', '');
+        $query = [
+            'redirect_uri' => $callback,
+            'state' => md5(uniqid()),
+            'response_type' => 'code',
+            'scope' => 'get_user_info,list_album,upload_pic',
+            'client_id' => $appId
+        ];
+        if ($type === 'bind') {
+            $query['state'] = $query['state'] . 'bind';
+        }
+        $http = http_build_query($query);
+        return redirect('https://graph.qq.com/oauth2.0/authorize?' . $http);
+    }
+
+    function qq_login(): string
+    {
+        $appId = SettingModel::Config('qq_login_appid', false);
+        $code = $this->request->get('code', false);
+        $state = $this->request->get('state');
+        if (strpos($state, 'bind')) {
+            //绑定模式
+            $this->qq_bind_mode = true;
+        }
+        $callback = 'https://' . $this->request->host() . '/qq_login';
+        $result = \Axios::http()->get('https://graph.qq.com/oauth2.0/token', [
+            'query' => [
+                'grant_type' => 'authorization_code',
+                'client_id' => $appId,
+                'client_secret' => SettingModel::Config('qq_login_appkey', false),
+                'code' => $code,
+                'redirect_uri' => $callback,
+                'fmt' => 'json'
+            ]
+        ]);
+        if ($result->getStatusCode() === 200) {
+            $content = $result->getBody()->getContents();
+            $js = \Axios::toJson($content);
+            if (isset($js['access_token'])) {
+                $access_token = $js['access_token'];
+                return $this->getOpenId($access_token);
+            }
+        }
+        return View::fetch('/qq_login_error');
+    }
+
+    //此方法禁止网络访问
+    private function getOpenId($access_token): string
+    {
+        $result = \Axios::http()->get('https://graph.qq.com/oauth2.0/me', [
+            'query' => [
+                'access_token' => $access_token,
+                'fmt' => 'json'
+            ]
+        ]);
+        if ($result->getStatusCode() === 200) {
+            $content = $result->getBody()->getContents();
+            $js = \Axios::toJson($content);
+            if (isset($js['openid'])) {
+                $openid = $js['openid'];
+                if ($this->qq_bind_mode) {
+                    //绑定模式
+                    if (UserModel::where('qq_open_id', $openid)->field('id,qq_open_id')->find()) {
+                        return View::fetch('/qq_login_error');
+                    }
+                    //如果openid数据库不存在说明QQ没有被绑定过,可以绑定
+                    $this->BindQQ($openid);//绑定后需要替换Token,不然之前的QQ登录会失效
+                }
+                $info = UserModel::where('qq_open_id', $openid)->field('id,mail,qq_open_id,password,login_fail_count,login_ip,login_time')->find();
+                if (!$info) {//不存在就创建一个新用户,如果上一个步骤绑定成功的话,是不可能进入此步骤的
+                    UserModel::insert(['mail' => '', 'password' => md5(time()), 'create_time' => date('Y-m-d H:i:s'), 'register_ip' => getRealIp(), 'qq_open_id' => $openid]);
+                    $info = UserModel::where('qq_open_id', $openid)->field('id,mail,qq_open_id,password,login_fail_count,login_ip,login_time')->find();
+                    $this->getUserOpenInfo($access_token, $openid);//获取一些用户的默认信息
+                }
+                if ($info) {//如果用户存在
+                    $info->login_ip = getRealIp();
+                    $info->login_time = date('Y-m-d H:i:s');
+                    $info->login_fail_count = 0;//登陆成功将失败次数归零
+                    $info->save();
+                    $info['access_token'] = $access_token;
+                    $auth = $this->refreshToken($info);
+                    return View::fetch('/qq_login', ['info' => $auth]);
+                }
+            }
+        }
+        return View::fetch('/qq_login_error');
+    }
+
+    private function BindQQ($qq_open_id)
+    {
+        $user = $this->getUser();
+        if ($user) {
+            $info = UserModel::where('id', $user['user_id'])->field('id,mail,qq_open_id,password,login_fail_count,login_ip,login_time')->find();
+            if ($info) {
+                $info->qq_open_id = $qq_open_id;
+                $info->save();
+            }
+        }
+    }
+
+    private function getUserOpenInfo($access_token, $openid)
+    {
+        $result = \Axios::http()->get('https://graph.qq.com/user/get_user_info', [
+            'query' => [
+                'openid' => $openid,
+                'oauth_consumer_key' => SettingModel::Config('qq_login_appid', false),
+                'access_token' => $access_token
+            ]
+        ]);
+        if ($result->getStatusCode() === 200) {
+            $content = $result->getBody()->getContents();
+            $js = \Axios::toJson($content);
+            if ($js['ret'] === 0) {
+                UserModel::where('qq_open_id', $openid)->update(['nickname' => $js['nickname'], 'avatar' => $js['figureurl_qq_1']]);
+            }
+        }
+    }
 }
 }

+ 32 - 14
app/controller/admin/Index.php

@@ -4,14 +4,10 @@ namespace app\controller\admin;
 
 
 use app\BaseController;
 use app\BaseController;
 use app\model\CardModel;
 use app\model\CardModel;
-use app\model\ConfigModel;
 use app\model\SettingModel;
 use app\model\SettingModel;
-use http\Header;
-use League\Flysystem\Exception;
 use think\facade\Cache;
 use think\facade\Cache;
 use think\facade\Db;
 use think\facade\Db;
 
 
-//use Upgrade;
 
 
 class Index extends BaseController
 class Index extends BaseController
 {
 {
@@ -65,7 +61,7 @@ class Index extends BaseController
                         require_once $upgradePhp;
                         require_once $upgradePhp;
                         $upGrade = new \Upgrade();
                         $upGrade = new \Upgrade();
                     } catch (\Exception $e) {
                     } catch (\Exception $e) {
-
+                        return $this->error($e->getMessage());
                     }
                     }
                 }
                 }
                 if ($upGrade === null) {
                 if ($upGrade === null) {
@@ -77,16 +73,14 @@ class Index extends BaseController
                 if (!empty($json['info']['update_sql'])) {
                 if (!empty($json['info']['update_sql'])) {
                     $upGrade->update_sql_url = $json['info']['update_sql'];
                     $upGrade->update_sql_url = $json['info']['update_sql'];
                 }
                 }
-                $status = $upGrade->run();//启动任务
                 try {
                 try {
-                    unlink($upgradePhp);
-                } catch (\Exception $e) {
-
-                }
-                if ($status === true) {
+                    $upGrade->run();//启动任务
+                    if (file_exists($upgradePhp)) {
+                        unlink($upgradePhp);
+                    }
                     return $this->success('更新完毕');
                     return $this->success('更新完毕');
-                } else {
-                    return $this->error($status);
+                } catch (\Exception $e) {
+                    return $this->error($e->getMessage());
                 }
                 }
             } else {
             } else {
                 return $this->error($json['msg']);
                 return $this->error($json['msg']);
@@ -216,6 +210,7 @@ class Index extends BaseController
                 }
                 }
                 return $this->installCardTask($json['data']);
                 return $this->installCardTask($json['data']);
             } catch (\Exception $e) {
             } catch (\Exception $e) {
+                return $this->error($e->getMessage());
             }
             }
 
 
         }
         }
@@ -294,7 +289,30 @@ class Index extends BaseController
             }
             }
             return $this->error($state);
             return $this->error($state);
         }
         }
-        return $this->error('新版本没有提供下载地址!');
+        abort(0, "新版本没有提供下载地址!");
     }
     }
 
 
+    //打包扩展
+    function build(): \think\response\Json
+    {
+        $this->getAdmin();
+        is_demo_mode(true);
+        if (!extension_loaded('zip')) {
+            return $this->error("系统未安装或开启zip扩展,请安装后重试!");
+        }
+        if (!$this->auth) {
+            return $this->error("请获取授权后进行操作");
+        }
+        $ExtInfo = $this->request->post("extInfo", []);
+        $build = new \BrowserExtBuild($ExtInfo);
+        try {
+            $status = $build->runBuild();
+            if ($status) {
+                return $this->success('打包完毕', ['url' => '/browserExt.zip']);
+            }
+        } catch (\Exception $e) {
+            return $this->error($e->getMessage());
+        }
+        return $this->success('打包失败');
+    }
 }
 }

+ 3 - 1
app/view/cardNotFound.html

@@ -19,11 +19,12 @@
             place-items: center;
             place-items: center;
             overflow: hidden;
             overflow: hidden;
             border-radius: 8px;
             border-radius: 8px;
+            flex-direction: column;
+            color: white;
         }
         }
 
 
         .card h2 {
         .card h2 {
             z-index: 1;
             z-index: 1;
-            color: white;
             font-size:14vw;
             font-size:14vw;
         }
         }
     </style>
     </style>
@@ -31,6 +32,7 @@
 <body style="background:  #07182E">
 <body style="background:  #07182E">
 <div class="card">
 <div class="card">
     <h2>卡片不存在</h2>
     <h2>卡片不存在</h2>
+    <div>请删除后重新安装</div>
 </div>
 </div>
 </body>
 </body>
 </html>
 </html>

+ 32 - 0
app/view/privacy.html

@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>隐私政策 - {$title}</title>
+    <link href="{$logo}" rel="icon">
+    <style>
+        header,body{
+            margin: 0;
+            padding: 0;
+        }
+        header{
+            box-shadow: 0 0 10px #e1e1e1;
+        }
+    </style>
+</head>
+<body>
+<header style="background: #ffffff;z-index: 10;position: sticky;top: 0">
+    <div style="max-width: 1000px;align-items: center;padding: 15px;margin: 0 auto;display: flex;justify-content: space-between;">
+        <div style="font-size: 25px;font-weight: bolder;display: flex;align-items: center;gap: 15px">
+            <img src="{$logo}" alt="logo" style="width: 40px;height: 40px" />
+            {$title}
+        </div>
+        <a href="/" style="padding: 10px 20px;border-radius: 6px;background: #1e9fff;color: #FFFFFF;text-decoration: none;font-size: 13px">首页</a>
+    </div>
+</header>
+<div style="max-width: 1000px;padding: 15px;margin: 0 auto;">
+    {$content|raw}
+</div>
+</body>
+</html>

+ 40 - 0
app/view/qq_login.html

@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>QQ登录</title>
+</head>
+<body>
+<script>
+    const user_id = '{$info.user_id}';
+    const token = '{$info.token}';
+    localStorage.setItem("user_id", user_id);
+    localStorage.setItem("token", token);
+    const expiresDate = new Date();
+    expiresDate.setDate(expiresDate.getDate() + 7);
+    const userIdCookie = "user_id=" + user_id + ";expires=" + expiresDate.toUTCString() + ";path=/";
+    const tokenCookie = "token=" + token + ";expires=" + expiresDate.toUTCString() + ";path=/";
+    document.cookie = userIdCookie;
+    document.cookie = tokenCookie;
+    function isMobileDevice() {
+        return (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent));
+    }
+    let dt = {
+        type: 'emitter',
+        message: {user_id: user_id, token: token},
+        subject: 'loginRefresh',
+    }
+    if (window.opener) {
+        window.opener.postMessage(JSON.stringify(dt), '*')
+    }
+    setTimeout(() => {
+        if (isMobileDevice() || window.innerWidth < 500) {
+            location.href = "/"
+        } else {
+            window.close()
+        }
+    }, 300)
+
+</script>
+</body>
+</html>

+ 21 - 0
app/view/qq_login_error.html

@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+</head>
+<body>
+<script>
+    // 检测是否为移动设备(包括手机和平板)
+    function isMobileDevice() {
+        return (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent));
+    }
+    if (isMobileDevice()) {
+        location.href = "/"
+    } else {
+        window.close();
+    }
+
+</script>
+</body>
+</html>

+ 2 - 1
composer.json

@@ -36,7 +36,8 @@
     "ext-pcntl": "*",
     "ext-pcntl": "*",
     "ext-zip": "*",
     "ext-zip": "*",
     "ext-posix": "*",
     "ext-posix": "*",
-    "ext-dom": "*"
+    "ext-dom": "*",
+    "ext-mbstring": "*"
   },
   },
   "require-dev": {
   "require-dev": {
     "symfony/var-dumper": "^4.2",
     "symfony/var-dumper": "^4.2",

+ 2 - 1
config/app.php

@@ -29,5 +29,6 @@ return [
     'http_exception_template' => [
     'http_exception_template' => [
         404 => public_path() . '404.html',
         404 => public_path() . '404.html',
         401 => \think\facade\App::getAppPath() . '401.html',
         401 => \think\facade\App::getAppPath() . '401.html',
-    ]
+    ],
+
 ];
 ];

+ 1 - 1
config/lang.php

@@ -11,7 +11,7 @@ return [
     // 多语言自动侦测变量名
     // 多语言自动侦测变量名
     'detect_var'      => 'lang',
     'detect_var'      => 'lang',
     // 是否使用Cookie记录
     // 是否使用Cookie记录
-    'use_cookie'      => true,
+    'use_cookie'      => false,
     // 多语言cookie变量
     // 多语言cookie变量
     'cookie_var'      => 'think_lang',
     'cookie_var'      => 'think_lang',
     // 多语言header变量
     // 多语言header变量

+ 1 - 1
config/trace.php

@@ -4,7 +4,7 @@
 // +----------------------------------------------------------------------
 // +----------------------------------------------------------------------
 return [
 return [
     // 内置Html和Console两种方式 支持扩展
     // 内置Html和Console两种方式 支持扩展
-    'type'    => 'Console',
+    'type'    => 'Html',
     // 读取的日志通道名
     // 读取的日志通道名
     'channel' => '',
     'channel' => '',
 ];
 ];

+ 188 - 0
extend/BrowserExtBuild.php

@@ -0,0 +1,188 @@
+<?php
+
+class BrowserExtBuild
+{
+    protected $originSource = "";
+    public $buildDir = "";
+    public $zipDir = "";
+    public $zipName = "";
+    private $info = [];
+    public $manifest = array(
+        'name' => '',
+        'description' => '',
+        'version' => '',
+        'manifest_version' => 3,
+        'icons' => array(
+            '64' => 'icon/64.png',
+            '128' => 'icon/128.png',
+            '192' => 'icon/192.png'
+        ),
+        'externally_connectable' => array(
+            'matches' => array(
+                '*://go.mtab.cc/*'
+            )
+        ),
+        'background' => array(
+            'service_worker' => 'src/background.js'
+        ),
+        'permissions' => array(
+            'background',
+            'cookies'
+        ),
+        'action' => array(
+            'default_icon' => 'icon/64.png',
+            'default_title' => ''
+        ),
+        'host_permissions' => array(
+            '*://go.mtab.cc/*'
+        ),
+        'chrome_url_overrides' => array(
+            'newtab' => 'dist/index.html'
+        )
+    );
+
+    function __construct($info)
+    {
+        $this->info = $info;
+        $this->originSource = root_path('extend/browserExt');
+        $this->buildDir = runtime_path('browserExt');
+        $this->zipName = "browserExt.zip";
+        $this->zipDir = public_path() . $this->zipName;
+    }
+
+    function runBuild()
+    {
+        if (is_dir($this->buildDir)) {
+            $this->deleteDirectory($this->buildDir);
+        }
+        $this->copyDir($this->originSource, $this->buildDir);
+        $this->copyDir(public_path() . "dist/", $this->buildDir . "/dist/");
+        $this->delZip();
+        $this->copyIcon();
+        $this->renderManifest();
+        $this->renderIndex();
+        $this->renderInitJavascript();
+        $this->createZipFromDir($this->buildDir, $this->zipDir);
+        if (is_dir($this->buildDir)) {
+            $this->deleteDirectory($this->buildDir);
+        }
+        return true;
+    }
+
+    function renderIndex()
+    {
+        $file = $this->buildDir . "dist/index.html";
+        $f = file_get_contents($file);
+        $option = [];
+        $option['title'] = $this->info['ext_name'];
+        $option['customHead'] = '<script src="../src/init.js"></script>';
+        $option['description'] = $this->info['ext_description'];
+        $option['favicon'] = "/icon/64.png";
+        $option['keywords'] = '';
+        $option['version'] = $this->info['ext_version'];
+        $content = \think\facade\View::display($f, $option);
+        file_put_contents($file, $content);
+    }
+
+    function renderInitJavascript()
+    {
+        $file = $this->buildDir . 'src/init.js';
+        $f = file_get_contents($file);
+        $host = explode(':', $this->info['ext_domain'])[0];
+        $f = preg_replace("/extDomain/", $host, $f);
+        $f = preg_replace('/extUrl/', $this->info['ext_protocol'] . "://" . $this->info['ext_domain'], $f);
+        file_put_contents($file, $f);
+    }
+
+    function renderManifest()
+    {
+        $host = explode(":", $this->info['ext_domain'])[0];
+        $this->manifest['version'] = $this->info['ext_version'];
+        $this->manifest['name'] = $this->info['ext_name'];
+        $this->manifest['description'] = $this->info['ext_description'];
+        $this->manifest['action']['default_title'] = $this->info['ext_name'];
+        $this->manifest['externally_connectable']['matches'] = ["*://{$host}/*"];
+        $this->manifest['host_permissions'] = ["*://{$host}/*"];
+        file_put_contents(joinPath($this->buildDir, "manifest.json"), json_encode($this->manifest, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
+    }
+
+    //处理logo问题
+    function copyIcon()
+    {
+        copy(joinPath(public_path(), $this->info['ext_logo_64']), joinPath($this->buildDir, "icon/64.png"));
+        copy(joinPath(public_path(), $this->info['ext_logo_128']), joinPath($this->buildDir, "icon/128.png"));
+        copy(joinPath(public_path(), $this->info['ext_logo_192']), joinPath($this->buildDir, "icon/192.png"));
+    }
+
+    //删除升级包
+    function delZip()
+    {
+        if (file_exists($this->zipDir)) {
+            unlink($this->zipDir);
+        }
+    }
+
+    function createZipFromDir($source_dir, $output_file_path)
+    {
+        $zip = new ZipArchive();
+        if ($zip->open($output_file_path, ZipArchive::CREATE | ZipArchive::OVERWRITE) === true) {
+            // 递归地添加目录中的文件和子目录到压缩包
+            $files = new RecursiveIteratorIterator(
+                new RecursiveDirectoryIterator($source_dir),
+                RecursiveIteratorIterator::LEAVES_ONLY
+            );
+            foreach ($files as $name => $file) {
+                // 跳过 "." 和 ".." 目录
+                if (!$file->isDir()) {
+                    $filePath = $file->getRealPath();
+                    $relativePath = mb_substr($filePath, mb_strlen(dirname($source_dir)) + 1);
+                    $zip->addFile($filePath, $relativePath);
+                }
+            }
+            // 关闭压缩包
+            $zip->close();
+            return true;
+        } else {
+            abort(0, '无法创建压缩文件');
+        }
+    }
+
+    // 递归复制目录及其内容
+    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);
+                }
+            }
+        }
+    }
+
+    //递归删除目录
+    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);
+    }
+}

+ 3 - 7
extend/Mail.php

@@ -10,9 +10,9 @@ class Mail
     {
     {
         $mail = new Message;
         $mail = new Message;
         $send_mail = SettingModel::Config('smtp_email');
         $send_mail = SettingModel::Config('smtp_email');
-        $mail->setFrom(SettingModel::Config('title','')." <$send_mail>")
+        $mail->setFrom(SettingModel::Config('title', '') . " <$send_mail>")
             ->addTo($to)
             ->addTo($to)
-            ->setSubject(SettingModel::Config('title','') . '动态令牌')
+            ->setSubject(SettingModel::Config('title', '') . '动态令牌')
             ->setHtmlBody($text);
             ->setHtmlBody($text);
         $mailer = new SmtpMailer([
         $mailer = new SmtpMailer([
             'port' => SettingModel::Config('smtp_port'),
             'port' => SettingModel::Config('smtp_port'),
@@ -21,11 +21,7 @@ class Mail
             'password' => SettingModel::Config('smtp_password'),
             'password' => SettingModel::Config('smtp_password'),
             'secure' => 'ssl',
             'secure' => 'ssl',
         ]);
         ]);
-        try {
-            $mailer->send($mail);
-        } catch (\Throwable $th) {
-            return false;
-        }
+        $mailer->send($mail);
         return true;
         return true;
     }
     }
 }
 }

+ 3 - 3
extend/PluginsInstall.php

@@ -19,7 +19,7 @@ class PluginsInstall
         $this->extractPath = runtime_path();
         $this->extractPath = runtime_path();
         $this->root_path = root_path() . 'plugins/';
         $this->root_path = root_path() . 'plugins/';
         if (!is_dir($this->root_path)) {//不存在插件目录则创建
         if (!is_dir($this->root_path)) {//不存在插件目录则创建
-            mkdir($this->root_path,0777,true);
+            mkdir($this->root_path, 0777, true);
         }
         }
         $this->download = $info['download'];
         $this->download = $info['download'];
         $this->directory = $info['name_en'];
         $this->directory = $info['name_en'];
@@ -45,12 +45,12 @@ class PluginsInstall
             $this->delZip();
             $this->delZip();
             //下载远程更新包
             //下载远程更新包
             if (!$this->fileDownload()) {
             if (!$this->fileDownload()) {
-                return '资源下载失败';
+                abort(0, "资源下载失败");
             }
             }
             //解压升级包
             //解压升级包
             if (!$this->unzip($this->archiveFile, $this->extractPath)) {
             if (!$this->unzip($this->archiveFile, $this->extractPath)) {
                 $this->delZip();
                 $this->delZip();
-                return '升级资源包解压失败';
+                abort(0, '升级资源包解压失败');
             }
             }
             //拷贝覆盖
             //拷贝覆盖
             $this->copy();
             $this->copy();

+ 3 - 3
extend/Upgrade2.php

@@ -28,7 +28,7 @@ class Upgrade2
     }
     }
 
 
     //运行入口
     //运行入口
-    function run()
+    function run(): bool
     {
     {
         return $this->startUpgrade();
         return $this->startUpgrade();
     }
     }
@@ -44,12 +44,12 @@ class Upgrade2
             $this->delZip();
             $this->delZip();
             //下载远程更新包
             //下载远程更新包
             if(!$this->fileDownload()){
             if(!$this->fileDownload()){
-                return "资源下载失败";
+                abort(0, '资源下载失败');
             }
             }
             //解压升级包
             //解压升级包
             if (!$this->unzip($this->archiveFile, $this->extractPath)) {
             if (!$this->unzip($this->archiveFile, $this->extractPath)) {
                 $this->delZip();
                 $this->delZip();
-                return '升级资源包解压失败';
+                abort(0, '升级资源包解压失败');
             }
             }
             $this->deleteDirectory(public_path().'dist/');//删除旧的网站文件
             $this->deleteDirectory(public_path().'dist/');//删除旧的网站文件
             //拷贝覆盖
             //拷贝覆盖

+ 35 - 0
extend/browserExt/manifest.json

@@ -0,0 +1,35 @@
+{
+  "name": "浏览器扩展",
+  "description": "这是一段简介",
+  "version": "1.0",
+  "manifest_version": 3,
+  "icons": {
+    "64": "icon/64.png",
+    "128": "icon/128.png",
+    "192": "icon/192.png"
+  },
+  "externally_connectable": {
+    "matches": [
+      "*://go.mtab.cc/*"
+    ]
+  },
+  "background": {
+    "service_worker":"src/background.js"
+  },
+  "permissions": [
+    "bookmarks",
+    "background",
+    "activeTab",
+    "cookies"
+  ],
+  "action": {
+    "default_icon": "icon/64.png",
+    "default_title": "浏览器扩展样板"
+  },
+  "host_permissions": [
+    "*://go.mtab.cc/*"
+  ],
+  "chrome_url_overrides": {
+    "newtab": "dist/index.html"
+  }
+}

+ 13 - 0
extend/browserExt/src/background.js

@@ -0,0 +1,13 @@
+chrome.runtime.onInstalled.addListener((detail) => {
+    if (detail.reason === chrome.runtime.OnInstalledReason.INSTALL) {
+        if (navigator.userAgent.includes("Firefox")) {
+            chrome.tabs.create({
+                url: "dist/index.html",
+            });
+        } else {
+            chrome.tabs.create({
+                url: "chrome://newtab",
+            });
+        }
+    }
+});

+ 33 - 0
extend/browserExt/src/init.js

@@ -0,0 +1,33 @@
+//当前文件只有扩展下面才有的
+window.ExtDomain = 'extDomain'
+window.ExtUrl = "extUrl"
+
+chrome.cookies.get({ url: window.ExtUrl, name: 'user_id' }, function (cookie) {
+    if (cookie) {
+        localStorage.setItem('user_id', cookie.value);
+    }
+})
+chrome.cookies.get({ url: window.ExtUrl, name: 'token' }, function (cookie) {
+    if (cookie) {
+        localStorage.setItem('token', cookie.value);
+    }
+})
+if (localStorage.getItem('user_id') && localStorage.getItem('token')) {
+    //如果存在LocalStroe就写入cookie
+    const userID = {
+        url: ExtUrl, // 目标域名
+        name: "user_id",
+        value: localStorage.getItem('user_id'),
+        path: "/", // 可选:指定cookie的路径
+        expirationDate: Math.floor((new Date().getTime() / 1000) + (7 * 24 * 3600))
+    };
+    const Token = {
+        url: ExtUrl, // 目标域名
+        name: "token",
+        value: localStorage.getItem('token'),
+        path: "/", // 可选:指定cookie的路径
+        expirationDate: Math.floor((new Date().getTime() / 1000) + (7 * 24 * 3600))
+    };
+    chrome.cookies.set(userID, function (cookie) {});
+    chrome.cookies.set(Token, function (cookie) {});
+}

+ 14 - 13
install.sql

@@ -18,7 +18,6 @@ create table card
 )
 )
     comment '卡片数据表';
     comment '卡片数据表';
 
 
-
 create table config
 create table config
 (
 (
     user_id int  null,
     user_id int  null,
@@ -43,7 +42,7 @@ create table link
 (
 (
     user_id     int      null,
     user_id     int      null,
     update_time datetime null comment '更新时间',
     update_time datetime null comment '更新时间',
-    link        json     null
+    link        longtext null
 );
 );
 
 
 create table link_folder
 create table link_folder
@@ -78,8 +77,6 @@ create table linkstore
         unique (id)
         unique (id)
 );
 );
 
 
-
-
 create table note
 create table note
 (
 (
     id          bigint auto_increment
     id          bigint auto_increment
@@ -128,13 +125,14 @@ create table tabbar
 
 
 create table token
 create table token
 (
 (
-    id          bigint auto_increment
+    id           bigint auto_increment
         primary key,
         primary key,
-    user_id     int      null,
-    token       tinytext null,
-    create_time int      null,
-    ip          tinytext null,
-    user_agent  tinytext null,
+    user_id      int          null,
+    token        tinytext     null,
+    create_time  int          null,
+    ip           tinytext     null,
+    user_agent   tinytext     null,
+    access_token varchar(200) null comment 'qq的令牌',
     constraint token_id_uindex
     constraint token_id_uindex
         unique (id)
         unique (id)
 );
 );
@@ -143,6 +141,7 @@ create table user
 (
 (
     id               int auto_increment
     id               int auto_increment
         primary key,
         primary key,
+    avatar           varchar(255)  null comment '头像',
     mail             varchar(50)   null,
     mail             varchar(50)   null,
     password         tinytext      null,
     password         tinytext      null,
     create_time      datetime      null,
     create_time      datetime      null,
@@ -151,10 +150,10 @@ create table user
     manager          int default 0 null,
     manager          int default 0 null,
     login_fail_count int default 0 null,
     login_fail_count int default 0 null,
     login_time       datetime      null comment '登录时间',
     login_time       datetime      null comment '登录时间',
+    qq_open_id       varchar(200)  null comment 'qq开放平台Id',
+    nickname         varchar(200)  null comment '昵称',
     constraint user_id_uindex
     constraint user_id_uindex
-        unique (id),
-    constraint user_mail_uindex
-        unique (mail)
+        unique (id)
 );
 );
 
 
 create table user_search_engine
 create table user_search_engine
@@ -182,6 +181,8 @@ create table wallpaper
 );
 );
 
 
 
 
+
+
 INSERT INTO linkstore (name, src, url, type, size, create_time, hot, tips, domain, app, install_num) VALUES ('Bilibili', '/static/bilibili.png', 'https://bilibili.com', 'icon', '1x1', '2022-11-07 21:51:42', 0, 'Bilibili弹幕视频网站Acg网站', 'bilibili.com,www.bilibili.com', 0, 0);
 INSERT INTO linkstore (name, src, url, type, size, create_time, hot, tips, domain, app, install_num) VALUES ('Bilibili', '/static/bilibili.png', 'https://bilibili.com', 'icon', '1x1', '2022-11-07 21:51:42', 0, 'Bilibili弹幕视频网站Acg网站', 'bilibili.com,www.bilibili.com', 0, 0);
 INSERT INTO linkstore (name, src, url, type, size, create_time, hot, tips, domain, app, install_num) VALUES ('蓝易云', '/static/tsy.png', 'https://www.tsyvps.com/aff/IRYIGFMX', 'icon', '1x1', '2022-11-07 22:02:41', 0, '蓝易云-持证高性价比服务器', 'www.tsyvps.com,tsyvps.com', 0, 0);
 INSERT INTO linkstore (name, src, url, type, size, create_time, hot, tips, domain, app, install_num) VALUES ('蓝易云', '/static/tsy.png', 'https://www.tsyvps.com/aff/IRYIGFMX', 'icon', '1x1', '2022-11-07 22:02:41', 0, '蓝易云-持证高性价比服务器', 'www.tsyvps.com,tsyvps.com', 0, 0);
 INSERT INTO linkstore (name, src, url, type, size, create_time, hot, tips, domain, app, install_num) VALUES ('ImgUrl', '/static/imgurl.png', 'https://imgurl.ink', 'icon', '1x1', '2022-11-07 22:05:46', 0, 'ImgUrl图床,图片外链', 'imgurl.ink,www.imgurl.ink', 0, 0);
 INSERT INTO linkstore (name, src, url, type, size, create_time, hot, tips, domain, app, install_num) VALUES ('ImgUrl', '/static/imgurl.png', 'https://imgurl.ink', 'icon', '1x1', '2022-11-07 22:05:46', 0, 'ImgUrl图床,图片外链', 'imgurl.ink,www.imgurl.ink', 0, 0);

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

@@ -0,0 +1 @@
+.about>div,.about>a{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,.about>a:hover{color:#6495ed}.about>div>span,.about>a>span{font-size:13px}

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

@@ -0,0 +1 @@
+import{r as a,Z as e,b as l,c as t,d as s,e as u,x as r,m,k as n,h as c,j as o,av as b,B as d,F as p}from"./index.1713442796762.js";const i={class:"about"},v={key:0,class:"labelItem"},x=u("span",null,"联系邮箱",-1),h={class:"ml-4 text-yellow-500"},y={key:1,class:"labelItem mt-3"},f=u("span",null,"QQ交流群",-1),k={class:"ml-4 text-yellow-500"},q={key:2,class:"labelItem mt-3"},w=u("span",null,"备案号",-1),_={class:"ml-4 text-blue-500"},I={class:"labelItem mt-3 text-sm text-blue-500",href:"/privacy.html",target:"_blank"},g=u("span",null,"隐私政策",-1),N={key:0,class:"absolute text-gray-400 bottom-4 hover:text-blue-600 text-center w-full left-0 text-xs",href:"https://www.mtab.cc",target:"_blank"},j={__name:"about",setup(j){const G=a({email:"",recordNumber:"",qq:""});return e({url:"/api/site"}).then((a=>{1===a.code&&(G.value=a.data)})),(a,e)=>{const j=l("el-icon");return t(),s(p,null,[u("div",i,[G.value.email?(t(),s("div",v,[x,u("span",h,r(G.value.email),1)])):m("",!0),G.value.qqGroup?(t(),s("div",y,[f,u("span",k,r(G.value.qqGroup),1)])):m("",!0),G.value.recordNumber?(t(),s("div",q,[w,u("span",_,r(G.value.recordNumber),1)])):m("",!0),u("a",I,[g,n(j,{color:"#8d8d8d"},{default:c((()=>[n(o(b))])),_:1})])]),o(d).state.site.auth?m("",!0):(t(),s("a",N," mTab书签版权所有© "))],64)}}};export{j as default};

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


+ 1 - 0
public/dist/assets/add.1713442796762.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="#000" stroke-width="3" 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="#000" stroke-width="3"/><path d="M32 35H44" stroke="#000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/><path d="M38 29V41" stroke="#000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/><circle r="2" transform="matrix(-1.31134e-07 -1 -1 1.31134e-07 10 14)" fill="#000"/><circle r="2" transform="matrix(-1.31134e-07 -1 -1 1.31134e-07 16 14)" fill="#000"/></svg>

+ 1 - 0
public/dist/assets/addCard.1713442796762.css

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

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

@@ -0,0 +1 @@
+import{_ as a,r as e,u as s,Z as t,b as n,c as l,d,g as i,m as r,e as c,F as o,f as u,h as p,x as m,j as x,q as v,G as g,aj as _,k as f,T as y,I as k,V as h,W as b}from"./index.1713442796762.js";const w={class:"addCardWindow"},j={class:"addCardBox mt-2"},C={class:"cardItem"},G={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"}},z=["src"],W={class:"mt-4 flex justify-between"},q=(a=>(h("data-v-e84a1550"),a=a(),b(),a))((()=>c("span",{class:"iconfont icon-redu text-red-500 text-lg"},null,-1)));var B=a({__name:"addCard",setup(a){const h=e(!1),b=s(),B=e([]);t({url:"/card/index"}).then((a=>{1===a.code&&(B.value=a.data,h.value=!0)}));return(a,e)=>{const s=n("el-empty"),F=n("el-button");return l(),d("div",w,[h.value&&0===B.value.length?(l(),i(s,{key:0,description:"目前还没有卡片应用哟!"})):r("",!0),c("div",j,[(l(!0),d(o,null,u(B.value,((a,e)=>(l(),i(y,{key:e},{default:p((()=>[c("div",C,[c("h3",G,m(a.name),1),c("div",I,[c("span",null,m(a.tips),1)]),c("iframe",{src:x(v)(a.url),class:"mt-2"},null,8,z),c("div",W,[c("div",null,[q,g(" "+m(x(_)(a.install_num)),1)]),f(F,{onClick:e=>(async a=>{let e={sort:99999,id:k(),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,pageGroup:b.state.pageGroup};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:p((()=>[g("添加 ")])),_:2},1032,["onClick"])])])])),_:2},1024)))),128))])])}}},[["__scopeId","data-v-e84a1550"]]);export{B as default};

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


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

@@ -0,0 +1 @@
+.selectCom{background-color:#7c94b0a6!important;color:#fff!important}.addIconBottom{display:grid;grid-template-columns:repeat(3,1fr)}@media (min-width: 500px){.addIconBottom{display:none}}.addIconBottom>div{display:flex;flex-direction:column;justify-content:center;align-items:center;color:#000;height:50px}.addIconBottom>.selectCom{background-color:transparent!important;color:#1664ff!important}.addiconframe{height:100%;width:100%;display:flex}@media (max-width: 500px){.addiconframe{display:block}}.addiconframe>.left{width:145px;height:calc(100% + 28px);transform:translateY(-28px)}@media (max-width: 500px){.addiconframe>.left{display:none}}.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}@media (max-width: 500px){.addiconframe>.right{position:relative;width:100%;height:calc(100% - 55px);overflow-y:scroll}}

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


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


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


+ 1 - 0
public/dist/assets/apps.1713442796762.svg

@@ -0,0 +1 @@
+<svg t="1709550431098" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9318" width="128" height="128"><path d="M882.521 282.988l-354.987-204.861c-8.98-5.219-20.146-5.219-29.127 0l-354.987 204.861c-8.98 5.219-14.563 14.806-14.563 25.244v409.842c0 10.437 5.583 20.025 14.563 25.244l354.987 204.982c4.491 2.548 9.588 3.884 14.563 3.884s10.073-1.334 14.563-3.884l354.987-204.982c8.98-5.219 14.563-14.806 14.563-25.244v-409.842c0-10.437-5.583-20.025-14.563-25.244zM838.83 701.326l-325.859 188.112-325.859-188.112v-376.225l325.859-188.112 325.859 188.112v376.225z" fill="#ffffff" p-id="9319" stroke-width="3"></path><path d="M270.124 383.476c-8.010 13.957-3.277 31.797 10.681 39.807l202.676 116.994v231.439c0 16.142 12.986 29.127 29.127 29.127s29.127-12.986 29.127-29.127v-231.075l203.404-117.479c13.957-8.010 18.69-25.851 10.681-39.807s-25.851-18.69-39.807-10.681l-203.040 117.236-203.040-117.236c-13.957-8.010-31.676-3.155-39.807 10.801z" fill="#ffffff" p-id="9320" stroke-width="3"></path></svg>

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


+ 1 - 0
public/dist/assets/background.1713442796762.css

@@ -0,0 +1 @@
+#backgroundManager{position:relative;height:calc(100vh - 30px)}.leftScrollBackground::-webkit-scrollbar{display:none!important}.leftScrollBackground::-webkit-scrollbar-thumb{display:none!important}

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


BIN
public/dist/assets/bg4.1713442796762.png


+ 1 - 0
public/dist/assets/browserImport.1713442796762.js

@@ -0,0 +1 @@
+import{r as e,c as l,d as t,e as s,F as a,f as r,g as n,h as u,G as o,x as i,T as c,m as f}from"./index.1713442796762.js";const p={class:"w-full h-full"},d={class:"flex flex-wrap"},h={style:{width:"150px"}},x=["src"],m={key:0,class:"flex h-full flex-col items-center justify-center"},v={class:"relative bg-blue-500 rounded-full text-white py-2 px-4 cursor-pointer"},g=s("span",null,"上传浏览器导出书签文件",-1),w={__name:"browserImport",setup(w){const y=e([]);const b=e=>{const l=e.target.files;if(l.length>=0){const e=l[0],t=new FileReader;t.onload=e=>{y.value=function(e){let l=(new DOMParser).parseFromString(e,"text/html").querySelectorAll("a"),t=[];return l.forEach((e=>{var l,s;console.log(e);const{href:a,icon:r,text:n}=e;let u={name:n,src:null==(s=null==(l=e.attributes)?void 0:l.icon)?void 0:s.value,url:a};t.push(u)})),t}(e.target.result)},t.readAsText(e)}};return(e,w)=>(l(),t("div",p,[s("div",d,[(l(!0),t(a,null,r(y.value,(e=>(l(),n(c,null,{default:u((()=>[s("div",h,[s("img",{src:e.src,style:{width:"50px",height:"50px"}},null,8,x),o(" "+i(e.name),1)])])),_:2},1024)))),256))]),0===y.value.length?(l(),t("div",m,[s("button",v,[s("input",{class:"inset-0 cursor-pointer absolute w-full h-full opacity-0",onChange:b,type:"file",accept:"text/html",name:"file"},null,32),g])])):f("",!0)]))}};export{w as default};

+ 1 - 0
public/dist/assets/class.1713442796762.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="#000" stroke-width="3"/><path d="M20 7H10C7.79086 7 6 8.79086 6 11V17C6 19.2091 7.79086 21 10 21H20" stroke="#000" stroke-width="3" stroke-linecap="round"/><circle cx="34" cy="14" r="8" fill="none" stroke="#000" stroke-width="3"/><circle cx="34" cy="14" r="3" fill="#000"/></svg>

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


+ 1 - 0
public/dist/assets/close.1713442796762.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/custom.1713442796762.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;flex-wrap:wrap}.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.1713442796762.js


+ 1 - 0
public/dist/assets/defavatar.1713442796762.js

@@ -0,0 +1 @@
+var a="/dist/assets/defavatar.1713442796762.svg";export{a as b};

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


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

@@ -0,0 +1 @@
+<svg t="1708268706476" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="32597" width="128" height="128"><path d="M92.748283 203.507071h838.503434v44.140606H92.748283zM644.402424 115.238788v44.127677h44.127677V115.238788c0-24.384646-19.75596-44.127677-43.998384-44.127677h-265.050505a43.97899 43.97899 0 0 0-31.172525 12.916364 43.918222 43.918222 0 0 0-12.825859 31.211313v44.127677h44.127677V115.238788h264.791919z m0 0" fill="#000" p-id="32598"></path><path d="M203.073939 909.614545v-661.979798H158.946263V909.575758c0 24.410505 19.639596 44.179394 44.179394 44.179394h617.761616c24.410505 0 44.179394-19.639596 44.179394-44.179394V247.634747H820.926061v661.979798H203.073939z m0 0" fill="#000" p-id="32599"></path><path d="M313.412525 335.90303h44.127677V733.090909h-44.127677V335.90303z m176.523637 0h44.127676V733.090909H489.936162V335.90303z m176.523636 0h44.127677V733.090909h-44.127677V335.90303z m0 0" fill="#000" p-id="32600"></path></svg>

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


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


+ 1 - 0
public/dist/assets/edit.1713442796762.svg

@@ -0,0 +1 @@
+<svg t="1708268429994" class="icon" viewBox="0 0 1034 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="25262" width="128" height="128"><path d="M867.727088 1023.998849h-741.646209A125.568375 125.568375 0 0 1 0.001023 898.558344v-741.64621A125.568375 125.568375 0 0 1 125.441529 30.832279h370.823104a36.31509 36.31509 0 1 1 0 72.50231h-370.823104a52.938195 52.938195 0 0 0-52.938195 52.938195v742.28556a53.066065 53.066065 0 0 0 52.938195 52.938195h742.285559A53.066065 53.066065 0 0 0 920.665283 898.558344v-370.823105a36.31509 36.31509 0 0 1 72.50231 0v370.823105a125.568375 125.568375 0 0 1-125.440505 125.440505z" p-id="25263" fill="#000"></path><path d="M294.102106 761.353795a35.80361 35.80361 0 0 1-25.574007-10.868953 36.18722 36.18722 0 0 1 0-51.148014L972.580518 10.500943a36.18722 36.18722 0 1 1 51.148014 51.787365L319.676113 750.996322a35.93148 35.93148 0 0 1-25.574007 10.357473z" p-id="25264" fill="#000"></path></svg>

BIN
public/dist/assets/favicon.1713442796762.png


BIN
public/dist/assets/gonganbeian.1713442796762.ico


+ 1 - 0
public/dist/assets/href.1713442796762.js

@@ -0,0 +1 @@
+import{J as n,B as e}from"./index.1713442796762.js";import{a as i}from"./dialog.1713442796762.js";const t={"tab://setting":()=>{n.emit("openController")},"tab://addSearchEngine":(e={})=>{e.size={width:window.innerWidth<500?"380px":"600px",height:"400px",top:window.innerHeight>700?"260px":"15vh"},e.component="addSearchEngine",n.emit("openPlugin",e)},"tab://addicon":(e={})=>{e.full=!1,e.size={width:window.innerWidth<500?"calc(100% - 15px)":"1000px",height:window.innerWidth>500?"550px":window.innerHeight-200+"px"},e.component="addicon",n.emit("openPlugin",e)},"tab://editAll":(n={})=>{setTimeout((()=>{e.state.editStatus=!0}),100)},"tab://background":(e={})=>{e.full=!1,e.size={width:window.innerWidth<500?"calc(100% - 15px)":"1000px",height:window.innerWidth>500?"550px":window.innerHeight-200+"px"},e.component="background",n.emit("openPlugin",e)}};window.openCard=function(n){let{width:e=null,height:t=null,minHeight:o=null,minWidth:d=null,custom:r={},origin:a={}}=n;r||(r={});const{width:l=(window.innerWidth<1250?850:1200),height:s=(window.innerHeight<750?550:700)}=r;new i({width:null==e?l:e,height:null==t?s:t,title:n.name,ico:n.src,url:n.url,minHeight:o,minWidth:d,custom:r,origin:a}).open()};const o=n=>{e.state.moveStatus=!1,window.openCard({name:n.name,src:n.src,url:n.window})},d=(n,i=0)=>{const t=e.getters.find(n);if(t){const{app:n=0,custom:e={}}=t;if(1===n){let n="";n=(/^http/.test(t.url),t.url),window.openCard({name:t.name,src:t.src,url:n,origin:t,custom:e})}else a(t.url)}},r=n=>{let e=document.createElement("a");e.href=n,e.target="_blank",e.click(),e.remove()},a=(n,i=!1)=>{if(t[n])t[n]();else if(i)r(n);else if(e.state.config.openType.linkOpen)r(n);else{let e=document.createElement("a");e.href=n,e.click(),e.remove()}};n.on("openCard",(n=>{openCard(n)}));export{t as C,a,o as b,r as o,d as r};

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


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


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


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


+ 1 - 0
public/dist/assets/index.17134427967622.css

@@ -0,0 +1 @@
+.note-weight{position:relative;bottom:0;height:12px;width:12px;border-radius:100%}.maxWeight{position:relative;width:25px;height:25px}.selWeight:before{margin-left:5px;font-size:20px;font-weight:700;position:relative;content:"\221a";color:#fff}.weight-0{background-color:#e5e5e5}.weight-1{background-color:#f1c40f}.weight-2{background-color:#e67e22}.weight-3{background-color:#27ae60}.weight-4{background-color:#3498db}.weight-5{background-color:#8e44ad}.weight-6{background-color:#e74c3c}.noteApp{position:relative;width:100vw;height:100vh}.noteApp>.noteApp-left{position:relative;flex-shrink:0;width:250px;height:calc(100vh - 20px);overflow:scroll}.noteApp>.noteApp-left .addNote{position:fixed;bottom:15px;left:215px;cursor:pointer;width:30px;height:30px;border-radius:30px;background:#60a5fa;display:flex;justify-content:center;align-items:center;font-size:25px;font-weight:700;color:#fff;z-index:99}.noteApp>.noteApp-left .noteApp-item{position:relative;padding:10px 15px}.noteApp>.noteApp-left .noteApp-item:hover{cursor:pointer}.noteApp>.noteApp-left .noteApp-title{width:calc(100% + -0px);height:20px;font-size:14px}.noteApp>.noteApp-left .noteApp-time{color:#999;font-size:12px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.noteApp .noteApp-context{width:calc(100vw - 260px)}.noteApp #noteAppTitle{height:35px;width:100%;outline:none;font-weight:700;text-indent:10px;font-size:20px}.noteApp-listSelect:after{position:absolute;top:0;left:0;content:" ";width:5px;height:100%;border-radius:0 5px 5px 0;background-color:#0a82f3bb}.noteSearch>.el-input__wrapper{border-radius:80px}

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


+ 1 - 0
public/dist/assets/index.17134427967623.css

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

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


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


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


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


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


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


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


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


+ 1 - 0
public/dist/assets/kongzhi.1713442796762.svg

@@ -0,0 +1 @@
+<svg t="1713173376125" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4853" width="128" height="128"><path d="M512 920.99c-225.52 0-409-183.47-409-409s183.47-409 409-409 409 183.47 409 409-183.48 409-409 409z m0-750.13c-188.1 0-341.13 153.03-341.13 341.13S323.9 853.13 512 853.13c188.11 0 341.14-153.03 341.14-341.13S700.1 170.86 512 170.86z" p-id="4854" fill="#ffffff"></path><path d="M512 594.72c-79.55 0-144.27-64.73-144.27-144.27S432.44 306.17 512 306.17s144.28 64.73 144.28 144.27S591.55 594.72 512 594.72z m0-220.69c-42.13 0-76.41 34.27-76.41 76.41s34.28 76.41 76.41 76.41c42.14 0 76.42-34.27 76.42-76.41s-34.28-76.41-76.42-76.41zM711.16 796.46c-15.41-58.74-100.96-103.03-198.99-103.03-94.4 0-177.32 40.82-197.16 97.07l-64-22.58c29.57-83.81 136.96-142.35 261.16-142.35 129.97 0 241.27 64.63 264.63 153.66l-65.64 17.23z" p-id="4855" fill="#ffffff"></path></svg>

BIN
public/dist/assets/lajitong.1713442796762.png


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


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

@@ -0,0 +1 @@
+<svg t="1708399729042" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4422" width="128" height="128"><path d="M921.6 581.632c0 12.288-8.192 20.48-20.48 20.48s-20.48-8.192-20.48-20.48V204.8c0-34.816-26.624-61.44-61.44-61.44h-614.4c-34.816 0-61.44 26.624-61.44 61.44v614.4c0 34.816 26.624 61.44 61.44 61.44h614.4c34.816 0 61.44-26.624 61.44-61.44v-90.112c0-12.288 8.192-20.48 20.48-20.48s20.48 8.192 20.48 20.48v90.112c0 57.344-45.056 102.4-102.4 102.4h-614.4c-57.344 0-102.4-45.056-102.4-102.4v-614.4c0-57.344 45.056-102.4 102.4-102.4h614.4c57.344 0 102.4 45.056 102.4 102.4v376.832z m-430.08-315.392c0-12.288 8.192-20.48 20.48-20.48s20.48 8.192 20.48 20.48v102.4c0 12.288-8.192 20.48-20.48 20.48s-20.48-8.192-20.48-20.48v-102.4z m-204.8 389.12c0-12.288 8.192-20.48 20.48-20.48s20.48 8.192 20.48 20.48v102.4c0 12.288-8.192 20.48-20.48 20.48s-20.48-8.192-20.48-20.48v-102.4z m409.6 0c0-12.288 8.192-20.48 20.48-20.48s20.48 8.192 20.48 20.48v102.4c0 12.288-8.192 20.48-20.48 20.48s-20.48-8.192-20.48-20.48v-102.4z m-204.8-184.32c0-12.288 8.192-20.48 20.48-20.48s20.48 8.192 20.48 20.48v286.72c0 12.288-8.192 20.48-20.48 20.48s-20.48-8.192-20.48-20.48v-286.72z m-204.8-204.8c0-12.288 8.192-20.48 20.48-20.48s20.48 8.192 20.48 20.48v286.72c0 12.288-8.192 20.48-20.48 20.48s-20.48-8.192-20.48-20.48v-286.72z m409.6 0c0-12.288 8.192-20.48 20.48-20.48s20.48 8.192 20.48 20.48v286.72c0 12.288-8.192 20.48-20.48 20.48s-20.48-8.192-20.48-20.48v-286.72z" fill="#000" p-id="4423"></path></svg>

+ 1 - 0
public/dist/assets/light.1713442796762.svg

@@ -0,0 +1 @@
+<svg t="1709550212337" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7856" width="128" height="128"><path d="M671.532413 735.729527c-56.056714 0-163.475212-10.083659-253.105578-77.69043-83.522252-63.001893-125.861546-138.243551-166.805051-211.011877-42.092677-74.815963-81.857333-145.482419-164.451445-204.449416a24.530696 24.530696 0 0 1-9.646708-25.483394 24.533766 24.533766 0 0 1 19.84907-18.670222c2.831488-0.472767 70.517053-11.610432 167.918408-11.610432 102.18531 0 251.90217 12.8077 384.852158 73.845869 200.576201 92.066859 198.407816 263.489066 197.378369 345.867262-0.203638 15.939017-0.455371 35.775808 1.545193 41.027415 5.665023 11.45489 4.861728 24.831548-2.347465 36.417421-22.094204 35.568077-106.304118 51.757804-175.186951 51.757804zM161.981185 240.267179c61.565171 56.83545 97.460706 120.627335 132.393309 182.708252 40.243563 71.522963 78.252225 139.075499 153.595191 195.904808 78.217433 58.996672 173.636642 67.804269 223.561705 67.804269 71.409376 0 116.998691-16.299221 130.315997-25.783223-3.891633-13.418614-3.675716-30.824029-3.37691-54.996568 1.041726-82.995249 2.790556-221.903949-168.780031-300.664758-124.902708-57.337893-267.104407-69.372997-364.397291-69.372997-40.644699-0.001023-76.152401 2.065032-103.31197 4.400217z" stroke-width="3" p-id="7857" fill="#ffffff"></path><path d="M922.584216 837.18522c-9.783831 0-19.029402-5.903453-22.837125-15.5563-11.184737-28.405957-165.798117-313.587068-367.367948-438.818258C363.915313 278.145881 101.290941 247.285013 98.654904 246.986207c-13.45443-1.532913-23.130813-13.681604-21.597901-27.136033 1.521656-13.465686 13.658068-23.154349 27.123754-21.603018 11.190877 1.269923 276.121781 32.333406 454.088033 142.901641C772.388449 474.182696 931.648662 768.758782 945.396781 803.666826c4.957919 12.597923-1.234107 26.837228-13.84431 31.806403a24.416086 24.416086 0 0 1-8.968255 1.711991z" p-id="7858" stroke-width="3" fill="#ffffff"></path></svg>

+ 1 - 0
public/dist/assets/linkstore.1713442796762.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}.el-message-box__message{width:100%}.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.1713442796762.js


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

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

+ 1 - 0
public/dist/assets/net.1713442796762.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/normal.1713442796762.svg

@@ -0,0 +1 @@
+<svg t="1710838459377" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8363" width="32" height="32"><path d="M148.72381 719.238095l-97.52381 156.038095c-4.87619 9.752381 0 21.942857 12.190476 21.942858l131.657143 7.314285c4.87619 0 7.314286 2.438095 9.752381 4.876191l80.457143 107.27619c7.314286 7.314286 19.504762 7.314286 24.380952 0l92.647619-153.6c4.87619-7.314286 2.438095-14.628571-4.87619-19.504762l-229.180953-129.219047c-7.314286-2.438095-14.628571 0-19.504761 4.87619zM875.27619 716.8l97.52381 156.038095c4.87619 9.752381 0 21.942857-12.190476 21.942857L828.952381 902.095238c-4.87619 0-7.314286 2.438095-9.752381 4.876191l-80.457143 107.27619c-7.314286 7.314286-19.504762 7.314286-24.380952 0l-92.647619-153.6c-4.87619-7.314286-2.438095-14.628571 4.87619-19.504762l229.180953-129.219047c7.314286-4.87619 14.628571-2.438095 19.504761 4.87619zM855.771429 185.295238L546.133333 9.752381c-21.942857-12.190476-51.2-12.190476-73.142857 0L165.790476 182.857143C143.847619 195.047619 129.219048 219.428571 129.219048 243.809524v348.647619c0 24.380952 14.628571 48.761905 36.571428 60.952381L475.428571 828.952381c21.942857 12.190476 51.2 12.190476 73.142858 0l307.2-170.666667c21.942857-12.190476 36.571429-36.571429 36.571428-60.952381V248.685714c0-26.819048-14.628571-51.2-36.571428-63.390476z m-146.285715 148.72381l-180.419047 260.87619c-4.87619 7.314286-14.628571 12.190476-24.380953 12.190476s-19.504762-4.87619-24.380952-12.190476l-173.104762-260.87619c-9.752381-12.190476-4.87619-31.695238 7.314286-39.009524 12.190476-7.314286 31.695238-4.87619 39.009524 7.314286l148.723809 224.304761 156.038095-226.742857c9.752381-12.190476 26.819048-17.066667 39.009524-7.314285 19.504762 12.190476 21.942857 29.257143 12.190476 41.447619z" fill="silver" p-id="8364"></path></svg>

+ 1 - 0
public/dist/assets/note.1713442796762.css

@@ -0,0 +1 @@
+.note{width:100%;height:100%;display:flex;flex-direction:column}.note .note-head{background-color:#f8a222;height:40px;display:flex;align-items:center;padding-left:12px}.note .note-head>span{margin-left:5px;font-size:15px;font-weight:600;color:#fff}.note .note2{height:100%;width:100%}.note .note-body{height:calc(100% - 40px);background:#FFFFFF}.note .note-body>div{position:relative;font-size:14px;overflow:hidden;word-break:normal;white-space:nowrap;height:25%;display:flex;align-items:center;border-bottom:1px solid rgba(221,221,221,.466)}.note .note-body>div:last-child{border-bottom:none}

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


+ 1 - 0
public/dist/assets/onlineMall.1713442796762.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% - 100px)}.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}.background-orange{background-color:#0080ff!important;color:#f3f3f3}.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.1713442796762.js


+ 1 - 0
public/dist/assets/open.1713442796762.svg

@@ -0,0 +1 @@
+<svg t="1708268580445" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="31538" width="128" height="128"><path d="M880.94 960H248.47c-43.6 0-79.06-35.46-79.06-79.06V248.47c0-43.6 35.46-79.06 79.06-79.06h632.47c43.6 0 79.06 35.46 79.06 79.06v632.47c0 43.6-35.46 79.06-79.06 79.06zM248.47 222.12c-14.53 0-26.35 11.82-26.35 26.35v632.47c0 14.53 11.82 26.35 26.35 26.35h632.47c14.53 0 26.35-11.82 26.35-26.35V248.47c0-14.53-11.82-26.35-26.35-26.35H248.47z" fill="#000" p-id="31539"></path><path d="M933.65 383.53H195.76c-14.55 0-26.35-11.8-26.35-26.35V248.47c0-43.6 35.46-79.06 79.06-79.06h632.47c43.6 0 79.06 35.46 79.06 79.06v108.71c0 14.55-11.8 26.35-26.35 26.35z m-711.53-52.71H907.3v-82.35c0-14.53-11.82-26.35-26.35-26.35H248.47c-14.53 0-26.35 11.82-26.35 26.35v82.35z" fill="#000" p-id="31540"></path><path d="M288 276.47m-23.06 0a23.06 23.06 0 1 0 46.12 0 23.06 23.06 0 1 0-46.12 0Z" fill="#000" p-id="31541"></path><path d="M357.18 276.47m-23.06 0a23.06 23.06 0 1 0 46.12 0 23.06 23.06 0 1 0-46.12 0Z" fill="#000" p-id="31542"></path><path d="M426.35 276.47m-23.06 0a23.06 23.06 0 1 0 46.12 0 23.06 23.06 0 1 0-46.12 0Z" fill="#000" p-id="31543"></path><path d="M195.76 854.59h-52.71c-43.6 0-79.06-35.46-79.06-79.06V143.06C64 99.46 99.46 64 143.06 64h632.47c43.6 0 79.06 35.46 79.06 79.06v52.71c0 14.55-11.8 26.35-26.35 26.35H248.47c-14.53 0-26.35 11.82-26.35 26.35v579.76c0 14.56-11.8 26.36-26.36 26.36z m-52.7-737.88c-14.53 0-26.35 11.82-26.35 26.35v632.47c0 14.53 11.82 26.35 26.35 26.35h26.35V248.47c0-43.6 35.46-79.06 79.06-79.06h553.41v-26.35c0-14.53-11.82-26.35-26.35-26.35H143.06z" fill="#000" p-id="31544"></path></svg>

+ 1 - 0
public/dist/assets/openType.1713442796762.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.1713442796762.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.1713442796762.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};

BIN
public/dist/assets/qq_symbol.1713442796762.png


+ 1 - 0
public/dist/assets/right.1713442796762.svg

@@ -0,0 +1 @@
+<svg t="1709561529421" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="29759" width="128" height="128"><path d="M595.858286 512l-206.518857-206.482286a18.285714 18.285714 0 0 1 25.892571-25.892571l219.428571 219.428571a18.285714 18.285714 0 0 1 0 25.892572l-219.428571 219.428571a18.285714 18.285714 0 0 1-25.892571-25.892571L595.858286 512z" fill="#2c2c2c" p-id="29760"></path></svg>

+ 9 - 0
public/dist/assets/search.1713442796762.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.1713442796762.css

@@ -0,0 +1 @@
+.searchEngineLogo[data-v-66285365]{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.1713442796762.js


+ 1 - 0
public/dist/assets/send.1713442796762.svg

@@ -0,0 +1 @@
+<svg t="1709561296205" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="27417" width="128" height="128"><path d="M916.928 65.92a32.256 32.256 0 0 1 41.28 40.576L674.88 938.24a32.384 32.384 0 0 1-61.44-0.768L489.536 541.696 86.656 416.64a32.128 32.128 0 0 1-6.528-58.56l5.504-2.496z m-41.28 82.368L199.104 384.192l308.16 95.616L629.12 359.232l45.056 45.504L552.128 525.44l93.44 298.432 230.08-675.584z" fill="#262626" p-id="27418"></path></svg>

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


+ 1 - 0
public/dist/assets/setting.1713442796762.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="#000" stroke-width="3" 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="#000" stroke-width="3" stroke-linejoin="round"/></svg>

File diff suppressed because it is too large
+ 6 - 0
public/dist/assets/sortable.esm.1713442796762.js


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