فهرست منبع

Improve Avatar display and image lazy load

BrettonYe 1 سال پیش
والد
کامیت
6cfbcda974

+ 11 - 12
app/Models/User.php

@@ -5,8 +5,8 @@ namespace App\Models;
 use App\Casts\data_rate;
 use App\Casts\money;
 use App\Observers\UserObserver;
+use App\Utils\Avatar;
 use App\Utils\Helpers;
-use App\Utils\QQInfo;
 use DB;
 use Hash;
 use Illuminate\Database\Eloquent\Attributes\ObservedBy;
@@ -203,18 +203,20 @@ class User extends Authenticatable
 
     public function getAvatarAttribute(): string
     {
+        $img = session('avatar_url_'.$this->id);
+        if ($img) {
+            return $img;
+        }
         if ($this->qq) {
-            $url = QQInfo::getQQAvatar($this->qq);
+            $img = Avatar::getQQAvatar($this->qq);
         } elseif (stripos(strtolower($this->username), '@qq.com') !== false) {
-            $url = QQInfo::getQQAvatar($this->username);
+            $img = Avatar::getQQAvatar($this->username);
         } else {
-            // $url = 'https://gravatar.loli.net/avatar/'.md5(strtolower(trim($this->username)))."?&d=identicon";
-            // $url = 'https://robohash.org/'.md5(strtolower(trim($this->username))).'?set=set4&bgset=bg2&size=400x400';
-            // $url = 'https://api.dicebear.com/6.x/thumbs/svg?seed='.$this->username.'&radius=50';
-            $url = 'https://api.btstu.cn/sjtx/api.php?lx=c1&format=images&method=zsy';
+            $img = Avatar::getRandomAvatar($this->username);
         }
+        session(['avatar_url_'.$this->id => $img]);
 
-        return $url;
+        return $img;
     }
 
     public function scopeActiveUser(Builder $query): Builder
@@ -310,10 +312,7 @@ class User extends Authenticatable
 
     public function paidOrders()
     {
-        return $this->hasMany(Order::class)->where('status', 2)
-            ->whereNotNull('goods_id')
-            ->where('is_expire', 0)
-            ->where('amount', '>', 0);
+        return $this->hasMany(Order::class)->where('status', 2)->whereNotNull('goods_id')->where('is_expire', 0)->where('amount', '>', 0);
     }
 
     public function routeNotificationForTelegram()

+ 44 - 12
app/Utils/QQInfo.php → app/Utils/Avatar.php

@@ -4,15 +4,31 @@ namespace App\Utils;
 
 use Http;
 use Illuminate\Http\Client\PendingRequest;
+use Illuminate\Http\JsonResponse;
+use Illuminate\Http\Request;
 
-class QQInfo
+class Avatar
 {
     private static PendingRequest $basicRequest;
 
+    public static function getAvatar(Request $request): JsonResponse
+    {
+        $username = $request->input('username');
+        $qq = $request->input('qq');
+        if ($qq) {
+            $url = self::getQQAvatar($qq);
+        } elseif ($username && stripos(strtolower($request->input('username')), '@qq.com') !== false) {
+            $url = self::getQQAvatar($username);
+        } else {
+            $url = self::getRandomAvatar($username);
+        }
+
+        return response()->json($url);
+    }
+
     public static function getQQAvatar(string $qq): ?string
     {
         self::$basicRequest = Http::timeout(15)->withOptions(['http_errors' => false])->withUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36')->replaceHeaders(['Referer' => null]);
-
         $ret = null;
         $source = 1;
 
@@ -29,6 +45,16 @@ class QQInfo
         return $ret;
     }
 
+    private static function qLogo(string $url): ?string
+    {
+        $response = self::$basicRequest->get($url);
+        if ($response->ok()) {
+            return $url;
+        }
+
+        return null;
+    }
+
     private static function qZonePortrait(string $url, string $qq): ?string
     { //向接口发起请求获取json数据
         $response = self::$basicRequest->get($url);
@@ -44,16 +70,6 @@ class QQInfo
         return null;
     }
 
-    private static function qLogo(string $url): ?string
-    {
-        $response = self::$basicRequest->get($url);
-        if ($response->ok()) {
-            return $url;
-        }
-
-        return null;
-    }
-
     private static function qqLogin(string $qq): ?string
     {
         $response = self::$basicRequest->get("https://ptlogin.qq.com/getface?imgtype=3&uin=$qq");
@@ -66,4 +82,20 @@ class QQInfo
 
         return null;
     }
+
+    public static function getRandomAvatar(string $username): string
+    {
+        // 'https://api.sretna.cn/kind/ar.php','https://api.qjqq.cn/api/MiYouShe',
+        // 'https://api.uomg.com/api/rand.avatar?sort=%E5%8A%A8%E6%BC%AB%E5%A5%B3&format=images','https://api.uomg.com/api/rand.avatar?sort=%E5%8A%A8%E6%BC%AB%E7%94%B7&format=images',
+        // 'https://zt.sanzhixiongnet.cn/api.php','https://api.vvhan.com/api/avatar/dm',
+        $apiUrls = [
+            'https://www.loliapi.com/acg/pp/',
+            'https://api.dicebear.com/9.x/thumbs/svg?seed='.$username.'&radius=50',
+            'https://www.cuteapi.com/api/acg/head-portrait/',
+            'https://api.lolimi.cn/API/dmtx/',
+            'https://t.alcy.cc/tx/',
+        ];
+
+        return $apiUrls[array_rand($apiUrls)];
+    }
 }

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
public/assets/bundle/app.min.css


+ 0 - 56
public/assets/css/font.css

@@ -1,56 +0,0 @@
-
-/* roboto-300 */
-@font-face {
-    font-family: 'Roboto';
-    font-style: normal;
-    font-weight: 300;
-    src: url('//lib.baomitu.com/fonts/roboto/roboto-300.eot'); /* IE9 Compat Modes */
-    src: local('Roboto'), local('Roboto-Normal'),
-    url('//lib.baomitu.com/fonts/roboto/roboto-300.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
-    url('//lib.baomitu.com/fonts/roboto/roboto-300.woff2') format('woff2'), /* Super Modern Browsers */
-    url('//lib.baomitu.com/fonts/roboto/roboto-300.woff') format('woff'), /* Modern Browsers */
-    url('//lib.baomitu.com/fonts/roboto/roboto-300.ttf') format('truetype'), /* Safari, Android, iOS */
-    url('//lib.baomitu.com/fonts/roboto/roboto-300.svg#Roboto') format('svg'); /* Legacy iOS */
-}
-
-/* roboto-regular */
-@font-face {
-    font-family: 'Roboto';
-    font-style: normal;
-    font-weight: regular;
-    src: url('//lib.baomitu.com/fonts/roboto/roboto-regular.eot'); /* IE9 Compat Modes */
-    src: local('Roboto'), local('Roboto-Normal'),
-    url('//lib.baomitu.com/fonts/roboto/roboto-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
-    url('//lib.baomitu.com/fonts/roboto/roboto-regular.woff2') format('woff2'), /* Super Modern Browsers */
-    url('//lib.baomitu.com/fonts/roboto/roboto-regular.woff') format('woff'), /* Modern Browsers */
-    url('//lib.baomitu.com/fonts/roboto/roboto-regular.ttf') format('truetype'), /* Safari, Android, iOS */
-    url('//lib.baomitu.com/fonts/roboto/roboto-regular.svg#Roboto') format('svg'); /* Legacy iOS */
-}
-
-/* roboto-500 */
-@font-face {
-    font-family: 'Roboto';
-    font-style: normal;
-    font-weight: 500;
-    src: url('//lib.baomitu.com/fonts/roboto/roboto-500.eot'); /* IE9 Compat Modes */
-    src: local('Roboto'), local('Roboto-Normal'),
-    url('//lib.baomitu.com/fonts/roboto/roboto-500.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
-    url('//lib.baomitu.com/fonts/roboto/roboto-500.woff2') format('woff2'), /* Super Modern Browsers */
-    url('//lib.baomitu.com/fonts/roboto/roboto-500.woff') format('woff'), /* Modern Browsers */
-    url('//lib.baomitu.com/fonts/roboto/roboto-500.ttf') format('truetype'), /* Safari, Android, iOS */
-    url('//lib.baomitu.com/fonts/roboto/roboto-500.svg#Roboto') format('svg'); /* Legacy iOS */
-}
-
-/* roboto-300italic */
-@font-face {
-    font-family: 'Roboto';
-    font-style: italic;
-    font-weight: 300;
-    src: url('//lib.baomitu.com/fonts/roboto/roboto-300italic.eot'); /* IE9 Compat Modes */
-    src: local('Roboto'), local('Roboto-Italic'),
-    url('//lib.baomitu.com/fonts/roboto/roboto-300italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
-    url('//lib.baomitu.com/fonts/roboto/roboto-300italic.woff2') format('woff2'), /* Super Modern Browsers */
-    url('//lib.baomitu.com/fonts/roboto/roboto-300italic.woff') format('woff'), /* Modern Browsers */
-    url('//lib.baomitu.com/fonts/roboto/roboto-300italic.ttf') format('truetype'), /* Safari, Android, iOS */
-    url('//lib.baomitu.com/fonts/roboto/roboto-300italic.svg#Roboto') format('svg'); /* Legacy iOS */
-}

+ 1 - 1
public/assets/css/login-v3.min.css

@@ -1 +1 @@
-.page-login-v3:before{position:fixed;top:0;left:0;content:'';width:100%;height:100%;background-position:center top;background-size:cover;z-index:-1;background:#3e8ef7;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzYyYThlYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMxNTcxYjEiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);background-image:linear-gradient(to bottom,#3e8ef7 0,#0b69e3 100%);background-repeat:repeat-x}.page-login-v3 .panel{width:400px;margin-bottom:45px;background:#fff;border-radius:.286rem}.page-login-v3 .panel .brand-img{height:96px}.page-login-v3 .panel .brand-text{margin-top:12px}.page-login-v3 form{margin:0 0 30px}.page-login-v3 form .form-material.floating+.page-login-v3 form .form-material.floating{margin-top:30px}.page-login-v3 form .form-material label{color:#a3afb7;font-weight:300}@media (max-width:479.98px){.page-login-v3 .panel{width:330px;padding:10px}}@media screen and (max-height:575px){.g-recaptcha .h-captcha{-webkit-transform:scale(.81);transform:scale(.81);-webkit-transform-origin:0 0;transform-origin:0 0}}.geetest_holder.geetest_wind{min-width:245px!important}.line{height:1px;border-top:1px solid #ddd;text-align:center;padding-bottom:15px}.line span{position:relative;top:-8px;background:#fff;padding:0 20px}
+.page-login-v3:before{position:fixed;top:0;left:0;content:'';width:100%;height:100%;background-position:center top;background-size:cover;z-index:-1;background:#3e8ef7;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzYyYThlYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMxNTcxYjEiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);background-image:linear-gradient(to bottom,#3e8ef7 0,#0b69e3 100%);background-repeat:repeat-x}.page-login-v3 .panel{width:400px;margin-bottom:45px;background:#fff;border-radius:.286rem}.page-login-v3 .panel .brand-img{height:84px}.page-login-v3 .panel .brand-text{margin-top:12px}.page-login-v3 form{margin:0 0 30px}.page-login-v3 form .form-material.floating+.page-login-v3 form .form-material.floating{margin-top:30px}.page-login-v3 form .form-material label{color:#a3afb7;font-weight:300}@media (max-width:479.98px){.page-login-v3 .panel{width:330px;padding:10px}}@media screen and (max-height:575px){.g-recaptcha .h-captcha{-webkit-transform:scale(.81);transform:scale(.81);-webkit-transform-origin:0 0;transform-origin:0 0}}.geetest_holder.geetest_wind{min-width:245px!important}.line{height:1px;border-top:1px solid #ddd;text-align:center;padding-bottom:15px}.line span{position:relative;top:-8px;background:#fff;padding:0 20px}

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
public/assets/custom/sweetalert2/polyfill.min.js


+ 0 - 412
public/assets/custom/tinymce/langs/dv.js

@@ -1,412 +0,0 @@
-/*!
- * TinyMCE Language Pack
- *
- * Copyright (c) 2022 Ephox Corporation DBA Tiny Technologies, Inc.
- * Licensed under the Tiny commercial license. See https://www.tiny.cloud/legal/
- */
-tinymce.addI18n('dv', {
-"Redo": "ރީޑޫ",
-"Undo": "އަންޑޫ",
-"Cut": "ކަޓް",
-"Copy": "ކޮޕީ",
-"Paste": "ޕޭސްޓް",
-"Select all": "ސެލެކްޓް އޯލް",
-"New document": "އާ ޑޮކިއުމެންޓް",
-"Ok": "އޯކޭ",
-"Cancel": "ކެންސަލް",
-"Visual aids": "ވިޝުއަލް އެއިޑްސް",
-"Bold": "ބޯލްޑް",
-"Italic": "އިޓަލިކް",
-"Underline": "ދަށުރޮނގު",
-"Strikethrough": "މެދު ރޮނގޮ",
-"Superscript": "މަތީއަކުރު",
-"Subscript": "ތިރީއަކުރު",
-"Clear formatting": "ފޯމެޓްތައް ފޮހޭ",
-"Remove": "",
-"Align left": "ވާތަށް ޖައްސާ",
-"Align center": "މެދަށް ޖައްސާ",
-"Align right": "ކަނާތަށް ޖައްސާ",
-"No alignment": "",
-"Justify": "އެއްވަރު ކުރޭ",
-"Bullet list": "ބުލެޓް ލިސްޓް",
-"Numbered list": "ނަންބަރު ލިސްޓް",
-"Decrease indent": "ދުރުމިން ކުޑަކުރޭ",
-"Increase indent": "ދުރުމިން ބޮޑުކުރޭ",
-"Close": "ނިއްވާ",
-"Formats": "ފޯމެޓްތައް",
-"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X/C/V keyboard shortcuts instead.": "ކްލިޕްބޯޑް ބޭނުން ކުރުމުގެ ހުއްދަ، ބްރޯޒަރއަކުން ނުދޭ! Ctrl+X/C/V ބޭނުން ކުރޭ!",
-"Headings": "ހެޑިން",
-"Heading 1": "ހެޑިން 1",
-"Heading 2": "ހެޑިން 2",
-"Heading 3": "ހެޑިން 3",
-"Heading 4": "ހެޑިން 4",
-"Heading 5": "ހެޑިން 5",
-"Heading 6": "ހެޑިން 6",
-"Preformatted": "",
-"Div": "ޑައިވް",
-"Pre": "ޕްރީ",
-"Code": "ކޯޑް",
-"Paragraph": "ޕެރެގްރާފް",
-"Blockquote": "ބްލޮކް-ކޯޓް",
-"Inline": "އިންލައިން",
-"Blocks": "ބްލޮކްތައް",
-"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "ޕޭސްޓް ކުރެވޭނީ ޕްލެއިންކޮށް! ބަދަލު ކުރެއްވުމަށް މި އޮޕްޝަން އޮފް ކޮށްލައްވާ!",
-"Fonts": "ފޮންޓުތައް",
-"Font sizes": "",
-"Class": "ކްލާސް",
-"Browse for an image": "އިމޭޖެއް ލޯޑުކުރޭ",
-"OR": "ނުވަތަ",
-"Drop an image here": "އިމޭޖެއް ވައްޓާލާ",
-"Upload": "އަޕްލޯޑު",
-"Uploading image": "",
-"Block": "ބްލޮކް",
-"Align": "ފަރާތަކަށް ޖެއްސުން",
-"Default": "ޑިފޯލްޓް",
-"Circle": "ބޮޅު",
-"Disc": "ވަށްބުރު",
-"Square": "ގޮޅި",
-"Lower Alpha": "ލޯވަރ އަލްފާ",
-"Lower Greek": "ލޯވަރ ގްރީކް",
-"Lower Roman": "ލޯވަރ ރޯމަން",
-"Upper Alpha": "އަޕާ އަލްފާ",
-"Upper Roman": "އަޕާ ރޯމަން",
-"Anchor...": "ނަގިލި..",
-"Anchor": "",
-"Name": "ނަން",
-"ID": "",
-"ID should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "",
-"You have unsaved changes are you sure you want to navigate away?": "ބަދަލުތައް ސޭވް ނުކޮށް ދޫކޮށްލަންވީތަ؟",
-"Restore last draft": "ފަހުގެ ޑްރާފްޓް ރެސްޓޯ ކުރޭ",
-"Special character...": "ޚާއްސަ އަކުރު",
-"Special Character": "",
-"Source code": "މަސްދަރު",
-"Insert/Edit code sample": "ކޯޑު މިސާލު އިންސާޓު/އެޑިޓް ކުރުން",
-"Language": "ބަސް",
-"Code sample...": "ސާމްޕަލް ކޯޑު",
-"Left to right": "ވާތުން ކަނާތަށް",
-"Right to left": "ކަނާތުން ވާތަށް",
-"Title": "ޓައިޓަލް",
-"Fullscreen": "ފުލްސްކްރީން",
-"Action": "އެކްޝަން",
-"Shortcut": "ކުރުމަގުތައް",
-"Help": "އެހީ",
-"Address": "އެޑްރެސް",
-"Focus to menubar": "މެނޫބާއަށް ފޯކަސްކުރޭ",
-"Focus to toolbar": "ޓޫލްބާއަށް ފޯކަލްކުރޭ",
-"Focus to element path": "އެލެމެންޓްގެ ޕެތަށް ފޯކަސް ކުރޭ",
-"Focus to contextual toolbar": "",
-"Insert link (if link plugin activated)": "",
-"Save (if save plugin activated)": "",
-"Find (if searchreplace plugin activated)": "",
-"Plugins installed ({0}):": "",
-"Premium plugins:": "",
-"Learn more...": "އިތުރަށް ދަސްކުރުމަށް...",
-"You are using {0}": "",
-"Plugins": "ޕްލަގިންތައް",
-"Handy Shortcuts": "މުހިންމު ކުރުމަގުތައް",
-"Horizontal line": "ހުރަސް ރޮނގު",
-"Insert/edit image": "ފޮޓޯލުން/ބަދަލުކުރުން",
-"Alternative description": "",
-"Accessibility": "",
-"Image is decorative": "",
-"Source": "މަސްދަރު",
-"Dimensions": "މިންތައް",
-"Constrain proportions": "ވަޒަން ހިފަހައްޓާ",
-"General": "އާންމު",
-"Advanced": "އެޑްވާންސްޑް",
-"Style": "ސްޓައިލް",
-"Vertical space": "ވާޓިކަލް ސްޕޭސް",
-"Horizontal space": "ހޮރިޒޯންޓަލް ސްޕޭސް",
-"Border": "ބޯޑަރު",
-"Insert image": "ފޮޓޯ އިންސާޓް ކުރޭ",
-"Image...": "އިމޭޖު...",
-"Image list": "އިމޭޖު ލިސްޓް",
-"Resize": "ސައިޒުބަދަލުކުރުން",
-"Insert date/time": "ވަގުތު/ތާރީޚް ލުން",
-"Date/time": "ތާރީޚް/ވަގުތު",
-"Insert/edit link": "ލިންކް ލުން/ބަދަލު ގެނައުން",
-"Text to display": "ދައްކަންވީ އިބާރާތް",
-"Url": "ޔޫ.އާރް.އެލް",
-"Open link in...": "",
-"Current window": "",
-"None": "ނޮން",
-"New window": "އާ ވިންޑޯއަކަށް",
-"Open link": "",
-"Remove link": "ލިންކް ފޮހޭ",
-"Anchors": "އެންކަރތައް",
-"Link...": "ފާލަން...",
-"Paste or type a link": "ލިންކު ލިޔުއްވާ ނުވަތަ ޕޭސްޓް ކުރައްވާ",
-"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "މެއިލްޓޫ - ކުރިއަށް އިތުރުކުރައްވަން ބޭނުންފުޅުތޯ؟",
-"The URL you entered seems to be an external link. Do you want to add the required http:// prefix?": "ތިޔަ ލިޔުއްވީ އެހެން ސައިޓެއްގެ ލިންކެއްކަމުން އެޗް.ޓީ.ޓީ.ޕީ ކުރިއަށް އިތުރު ކުރަންތޯ؟",
-"The URL you entered seems to be an external link. Do you want to add the required https:// prefix?": "",
-"Link list": "ފާލަންތައް",
-"Insert video": "ވީޑިއޯ ލުން",
-"Insert/edit video": "ވީޑިއޯ ލުން/ބަދަލު ގެނައުން",
-"Insert/edit media": "އިންސާޓް/އެޑިޓް މީޑިއާ",
-"Alternative source": "އަލްޓަނޭޓިވް ސޯސް",
-"Alternative source URL": "",
-"Media poster (Image URL)": "",
-"Paste your embed code below:": "އެމްބެޑް ކޯޑް ތިރީގައި ޕޭސްޓް ކުރޭ",
-"Embed": "އެމްބެޑް",
-"Media...": "",
-"Nonbreaking space": "ނޮން ބްރޭކިން ސްޕޭސް",
-"Page break": "ޕޭޖް ބްރޭކް",
-"Paste as text": "ޓެކްސްޓް ގޮތަށް ޕޭސްޓް ކުރޭ",
-"Preview": "ޕްރީވިއު",
-"Print": "",
-"Print...": "ޕްރިންޓް...",
-"Save": "ސޭވް ކުރޭ",
-"Find": "ހޯދާ",
-"Replace with": "ބަދަލުގައި ބޭނުން ކުރާނީ",
-"Replace": "ބަދަލު ކުރޭ",
-"Replace all": "ހުރިހާ އެއްޗެއް ބަދަލު ކުރޭ",
-"Previous": "",
-"Next": "ފަހަތަށް",
-"Find and Replace": "",
-"Find and replace...": "",
-"Could not find the specified string.": "ތިޔަ ހޯއްދަވާ ލަފުޒެއް ނުފެނުނު",
-"Match case": "ކޭސް އަށް ބަލާ",
-"Find whole words only": "",
-"Find in selection": "",
-"Insert table": "ޓޭބަލް ލުން",
-"Table properties": "ޓޭބަލްގެ ސިފަތައް",
-"Delete table": "ޓޭބަލް ފޮހޭ",
-"Cell": "ސެލް",
-"Row": "ރޯ",
-"Column": "ކޮލަމް",
-"Cell properties": "ސެލްގެ ސިފަތައް",
-"Merge cells": "ސެލް އެއްކުރޭ",
-"Split cell": "ސެލް ވަކިކުރޭ",
-"Insert row before": "ކުރިއަށް ރޯއެއް އިތުރު ކުރޭ",
-"Insert row after": "ފަހަތަށް ރޯއެއް އިތުރު ކުރޭ",
-"Delete row": "ރޯ ފޮހޭ",
-"Row properties": "ރޯގެ ސިފަތައް",
-"Cut row": "ރޯ ކަޓްކުރޭ",
-"Cut column": "",
-"Copy row": "ރޯ ކޮޕީކުރޭ",
-"Copy column": "",
-"Paste row before": "ކުރިއަށް ރޯ ޕޭސްޓް ކުރޭ",
-"Paste column before": "",
-"Paste row after": "ފަހަތަށް ރޯ ޕޭސްޓް ކުރޭ",
-"Paste column after": "",
-"Insert column before": "ކުރިއަށް ކޮލަމެއް އިތުރު ކުރޭ",
-"Insert column after": "ފަހަތަށް ކޮލަމެއް އިތުރު ކުރޭ",
-"Delete column": "ކޮލަމް ފޮހޭ",
-"Cols": "ކޮލަމް",
-"Rows": "ރޯ",
-"Width": "ފުޅާމިން",
-"Height": "ދިގުމިން",
-"Cell spacing": "ސެލް ސްޕޭސިންގ",
-"Cell padding": "ސެލް ޕެޑިން",
-"Row clipboard actions": "",
-"Column clipboard actions": "",
-"Table styles": "",
-"Cell styles": "",
-"Column header": "",
-"Row header": "",
-"Table caption": "",
-"Caption": "ކެޕްޝަން",
-"Show caption": "",
-"Left": "ވާތަށް",
-"Center": "މެދަށް",
-"Right": "ކަނާތަށް",
-"Cell type": "ސެލްގެ ވައްތަރު",
-"Scope": "ސްކޯޕް",
-"Alignment": "އެލައިންމެންޓް",
-"Horizontal align": "",
-"Vertical align": "",
-"Top": "މަތި",
-"Middle": "މެދު",
-"Bottom": "ތިރި",
-"Header cell": "ހެޑާ ސެލް",
-"Row group": "ރޯ ގްރޫޕް",
-"Column group": "ކޮލަމް ގްރޫޕް",
-"Row type": "ރޯގެ ވައްތަރު",
-"Header": "ހެޑާ",
-"Body": "ބޮޑީ",
-"Footer": "ފޫޓަރ",
-"Border color": "ބޯޑަރު ކުލަ",
-"Solid": "",
-"Dotted": "",
-"Dashed": "",
-"Double": "",
-"Groove": "",
-"Ridge": "",
-"Inset": "",
-"Outset": "",
-"Hidden": "",
-"Insert template...": "",
-"Templates": "ޓެމްޕްލޭޓްތައް",
-"Template": "ނަމޫނާ",
-"Insert Template": "",
-"Text color": "އަކުރުގެ ކުލަ",
-"Background color": "ބެކްގްރައުންޑްގެ ކުލަ",
-"Custom...": "އަމިއްލަ",
-"Custom color": "އަމިއްލަ ކުލަ",
-"No color": "ކުލަ ނުޖައްސާ",
-"Remove color": "",
-"Show blocks": "ބްލޮކްތައް ދައްކާ",
-"Show invisible characters": "ނުފެންނަ އަކުރުތައް ދައްކާ",
-"Word count": "",
-"Count": "",
-"Document": "",
-"Selection": "",
-"Words": "ބަސްތައް",
-"Words: {0}": "ބަސް: {0}",
-"{0} words": "{0} ބަސް",
-"File": "ފައިލް",
-"Edit": "ބަދަލު ގެނައުން",
-"Insert": "އިންސާޓް",
-"View": "ވިއު",
-"Format": "ފޯމެޓް",
-"Table": "ޓޭބަލް",
-"Tools": "ޓޫލްތައް",
-"Powered by {0}": "އެހީތެރިވެދިނީ {0}",
-"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "ރިޗް ޓެކްސްޓް އޭރިއާ. މެނޫ ހޯދުމަށް ALT-F9. ޓޫލްބަރ ހޯދުމަށް ALT-F10. އެހީ ހޯދުމަށް ALT-0",
-"Image title": "އިމޭޖުގެ ނަން",
-"Border width": "",
-"Border style": "",
-"Error": "",
-"Warn": "",
-"Valid": "",
-"To open the popup, press Shift+Enter": "",
-"Rich Text Area": "",
-"Rich Text Area. Press ALT-0 for help.": "",
-"System Font": "",
-"Failed to upload image: {0}": "",
-"Failed to load plugin: {0} from url {1}": "",
-"Failed to load plugin url: {0}": "",
-"Failed to initialize plugin: {0}": "",
-"example": "",
-"Search": "",
-"All": "",
-"Currency": "",
-"Text": "",
-"Quotations": "",
-"Mathematical": "",
-"Extended Latin": "",
-"Symbols": "",
-"Arrows": "",
-"User Defined": "",
-"dollar sign": "",
-"currency sign": "",
-"euro-currency sign": "",
-"colon sign": "",
-"cruzeiro sign": "",
-"french franc sign": "",
-"lira sign": "",
-"mill sign": "",
-"naira sign": "",
-"peseta sign": "",
-"rupee sign": "",
-"won sign": "",
-"new sheqel sign": "",
-"dong sign": "",
-"kip sign": "",
-"tugrik sign": "",
-"drachma sign": "",
-"german penny symbol": "",
-"peso sign": "",
-"guarani sign": "",
-"austral sign": "",
-"hryvnia sign": "",
-"cedi sign": "",
-"livre tournois sign": "",
-"spesmilo sign": "",
-"tenge sign": "",
-"indian rupee sign": "",
-"turkish lira sign": "",
-"nordic mark sign": "",
-"manat sign": "",
-"ruble sign": "",
-"yen character": "",
-"yuan character": "",
-"yuan character, in hong kong and taiwan": "",
-"yen/yuan character variant one": "",
-"Emojis": "",
-"Emojis...": "",
-"Loading emojis...": "",
-"Could not load emojis": "",
-"People": "",
-"Animals and Nature": "",
-"Food and Drink": "",
-"Activity": "",
-"Travel and Places": "",
-"Objects": "",
-"Flags": "",
-"Characters": "",
-"Characters (no spaces)": "",
-"{0} characters": "",
-"Error: Form submit field collision.": "",
-"Error: No form element found.": "",
-"Color swatch": "",
-"Color Picker": "ކުލަ ނެގި",
-"Invalid hex color code: {0}": "",
-"Invalid input": "",
-"R": "އާރު",
-"Red component": "",
-"G": "ޖީ",
-"Green component": "",
-"B": "ބީ",
-"Blue component": "",
-"#": "",
-"Hex color code": "",
-"Range 0 to 255": "",
-"Turquoise": "",
-"Green": "",
-"Blue": "",
-"Purple": "",
-"Navy Blue": "",
-"Dark Turquoise": "",
-"Dark Green": "",
-"Medium Blue": "",
-"Medium Purple": "",
-"Midnight Blue": "",
-"Yellow": "",
-"Orange": "",
-"Red": "",
-"Light Gray": "",
-"Gray": "",
-"Dark Yellow": "",
-"Dark Orange": "",
-"Dark Red": "",
-"Medium Gray": "",
-"Dark Gray": "",
-"Light Green": "",
-"Light Yellow": "",
-"Light Red": "",
-"Light Purple": "",
-"Light Blue": "",
-"Dark Purple": "",
-"Dark Blue": "",
-"Black": "",
-"White": "",
-"Switch to or from fullscreen mode": "",
-"Open help dialog": "",
-"history": "",
-"styles": "",
-"formatting": "",
-"alignment": "",
-"indentation": "",
-"Font": "ފޮންޓު",
-"Size": "ސައިޒު",
-"More...": "އިތުރު ބައިތައް..",
-"Select...": "",
-"Preferences": "",
-"Yes": "އާނ",
-"No": "ނޫން",
-"Keyboard Navigation": "",
-"Version": "އިސްދާރު",
-"Code view": "",
-"Open popup menu for split buttons": "",
-"List Properties": "",
-"List properties...": "",
-"Start list at number": "",
-"Line height": "",
-"Dropped file type is not supported": "",
-"Loading...": "",
-"ImageProxy HTTP error: Rejected request": "",
-"ImageProxy HTTP error: Could not find Image Proxy": "",
-"ImageProxy HTTP error: Incorrect Image Proxy URL": "",
-"ImageProxy HTTP error: Unknown ImageProxy error": ""
-});

+ 0 - 412
public/assets/custom/tinymce/langs/hi.js

@@ -1,412 +0,0 @@
-/*!
- * TinyMCE Language Pack
- *
- * Copyright (c) 2022 Ephox Corporation DBA Tiny Technologies, Inc.
- * Licensed under the Tiny commercial license. See https://www.tiny.cloud/legal/
- */
-tinymce.addI18n('hi', {
-"Redo": "आगे",
-"Undo": "पीछे",
-"Cut": "काटें",
-"Copy": "प्रति करें",
-"Paste": "चिपकाएँ",
-"Select all": "सभी चुनें",
-"New document": "नया दस्तावेज़",
-"Ok": "ठीक है",
-"Cancel": "रद्द",
-"Visual aids": "दृश्य साधन",
-"Bold": "मोटा",
-"Italic": "टेड़ा",
-"Underline": "अधोरेखांकन",
-"Strikethrough": "मध्य से काटें",
-"Superscript": "उपरिलिखित",
-"Subscript": "निचलीलिखित",
-"Clear formatting": "प्रारूपण हटाएँ",
-"Remove": "",
-"Align left": "बाएँ संरेखण",
-"Align center": "मध्य संरेखण",
-"Align right": "दाएँ संरेखण",
-"No alignment": "",
-"Justify": "समकरण",
-"Bullet list": "गोली सूची",
-"Numbered list": "क्रमांकित सूची",
-"Decrease indent": "खरोज कम करें",
-"Increase indent": "खरोज बढ़ाएँ",
-"Close": "बंद",
-"Formats": "प्रारूप",
-"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X/C/V keyboard shortcuts instead.": "आपका जाल विचारक सीधे समर्थन नहीं कर रहा है। कृपया कुंजीपटल के द्वारा Ctrl+X/C/V का उपयोग करें।",
-"Headings": "शीर्षक",
-"Heading 1": "शीर्षक 1",
-"Heading 2": "शीर्षक 2",
-"Heading 3": "शीर्षक 3",
-"Heading 4": "शीर्षक 4",
-"Heading 5": "शीर्षक 5",
-"Heading 6": "शीर्षक 6",
-"Preformatted": "पूर्वस्वरूपित",
-"Div": "डिव",
-"Pre": "पूर्व",
-"Code": "संकेतलिपि",
-"Paragraph": "अनुच्छेद",
-"Blockquote": "खंड-उद्धरण",
-"Inline": "रेखा में",
-"Blocks": "खंड",
-"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "चिपकाने का प्रकार अभी सादा पाठ्य है। सामग्री चिपकाने पर वह सादे पाठ्य में रहगी जब तक आप इस विकल्प को बंद नहीं कर देते।",
-"Fonts": "फोंट्स",
-"Font sizes": "",
-"Class": "कक्षा",
-"Browse for an image": "एक छवि ब्राउज़ करें",
-"OR": "या",
-"Drop an image here": "यहां एक छवि छोड़ें",
-"Upload": "अपलोड",
-"Uploading image": "",
-"Block": "खंड",
-"Align": "संरेखित",
-"Default": "पहले से चुना हुआ",
-"Circle": "वृत्त",
-"Disc": "बिंब",
-"Square": "वर्ग",
-"Lower Alpha": "निम्न अल्फा",
-"Lower Greek": "निम्न ग्रीक",
-"Lower Roman": "निम्न रोमन",
-"Upper Alpha": "उच्च अल्फा",
-"Upper Roman": "उच्च रोमन",
-"Anchor...": "लंगर",
-"Anchor": "",
-"Name": "नाम",
-"ID": "",
-"ID should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "",
-"You have unsaved changes are you sure you want to navigate away?": "आपके कुछ असहेजे बदलाव हैं, क्या आप निश्चित रूप से यहाँ से जाना चाहते हो?",
-"Restore last draft": "आखिरी मसौदा पुनर्स्थापित करें",
-"Special character...": "विशेष वर्ण",
-"Special Character": "",
-"Source code": "स्त्रोत संकेतलिपि",
-"Insert/Edit code sample": "कोड नमूना डालें/संपादित करें",
-"Language": "भाषा",
-"Code sample...": "कोड नमूना",
-"Left to right": "बाएँ से दाएँ",
-"Right to left": "दाएँ से बाएँ",
-"Title": "शीर्षक",
-"Fullscreen": "पूर्ण स्क्रीन",
-"Action": "कार्य",
-"Shortcut": "छोटा रास्ता",
-"Help": "मदद",
-"Address": "पता",
-"Focus to menubar": "मेनूबार पर ध्यान दें",
-"Focus to toolbar": "टूलबार पर ध्यान दें",
-"Focus to element path": "तत्व पथ पर ध्यान दें",
-"Focus to contextual toolbar": "प्रासंगिक टूलबार पर ध्यान दें",
-"Insert link (if link plugin activated)": "लिंक डालें (यदि लिंक प्लगइन सक्रिय है)",
-"Save (if save plugin activated)": "सहेजें (यदि सहेजें प्लगइन सक्रिय है)",
-"Find (if searchreplace plugin activated)": "खोजें (यदि खोज सक्रिय प्लगइन को प्रतिस्थापित करती है)",
-"Plugins installed ({0}):": "प्लगइन्स स्थापित ({0}):",
-"Premium plugins:": "प्रीमियम प्लगइन्स:",
-"Learn more...": "और अधिक जानें...",
-"You are using {0}": "आप {0} का उपयोग कर रहे हैं",
-"Plugins": "प्लग-इन",
-"Handy Shortcuts": "आसान शॉर्टकट",
-"Horizontal line": "क्षैतिज रेखा",
-"Insert/edit image": "छवि डालें/सम्पादन करें",
-"Alternative description": "वैकल्पिक विवरण",
-"Accessibility": "सरल उपयोग",
-"Image is decorative": "छवि सजावटी है",
-"Source": "स्त्रोत",
-"Dimensions": "आयाम",
-"Constrain proportions": "अनुपात विवश",
-"General": "सामान्य",
-"Advanced": "उन्नत",
-"Style": "शैली",
-"Vertical space": "ऊर्ध्वाधर स्थान",
-"Horizontal space": "क्षैतिज स्थान",
-"Border": "सीमा",
-"Insert image": "छवि डालें",
-"Image...": "छवि...",
-"Image list": "छवि सूची",
-"Resize": "आकार बदलें",
-"Insert date/time": "दिनांक/समय डालें",
-"Date/time": "दिनांक और समय",
-"Insert/edit link": "कड़ी डालें/संपादित करें",
-"Text to display": "दिखाने हेतु पाठ्य",
-"Url": "जालस्थल पता",
-"Open link in...": "में लिंक खोलें...",
-"Current window": "वर्तमान खिड़की",
-"None": "कोई नहीं",
-"New window": "नई खिड़की",
-"Open link": "खुली लिंक",
-"Remove link": "कड़ी हटाएँ",
-"Anchors": "लंगर",
-"Link...": "संपर्क...",
-"Paste or type a link": "लिंक पेस्ट करें या टाइप करें",
-"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "आपने जो कड़ी डाली है वह ईमेल पता के जैसे दिख रहा है। क्या आप mailto: पहले जोड़ना चाहते है?",
-"The URL you entered seems to be an external link. Do you want to add the required http:// prefix?": "आपने जो कड़ी डाली है वह बाहरी कड़ी के जैसे दिख रहा है। क्या आप http:// पहले जोड़ना चाहते है?",
-"The URL you entered seems to be an external link. Do you want to add the required https:// prefix?": "आपके द्वारा दर्ज किया गया URL एक बाहरी लिंक प्रतीत होता है। क्या आप आवश्यक https:// उपसर्ग जोड़ना चाहते हैं?",
-"Link list": "लिंक सूची",
-"Insert video": "चलचित्र डालें",
-"Insert/edit video": "चलचित्र डालें/सम्पादन करें",
-"Insert/edit media": "",
-"Alternative source": "वैकल्पिक स्रोत",
-"Alternative source URL": "",
-"Media poster (Image URL)": "",
-"Paste your embed code below:": "दिखाने वाले संकेत को नीचे डालें:",
-"Embed": "दिखाना",
-"Media...": "",
-"Nonbreaking space": "अविरामित जगह",
-"Page break": "पृष्ठ विराम",
-"Paste as text": "पाठ्य के रूप में चिपकाएँ",
-"Preview": "पूर्वावलोकन",
-"Print": "",
-"Print...": "",
-"Save": "सहेजें",
-"Find": "खोज",
-"Replace with": "प्रतिस्थापित करें",
-"Replace": "प्रतिस्थापन",
-"Replace all": "सभी प्रतिस्थापित करें",
-"Previous": "",
-"Next": "अगला",
-"Find and Replace": "",
-"Find and replace...": "",
-"Could not find the specified string.": "निर्दिष्ट पंक्ति नहीं मिल सका।",
-"Match case": "मामले मिलाएँ",
-"Find whole words only": "",
-"Find in selection": "",
-"Insert table": "तालिका डालें",
-"Table properties": "तालिका के गुण",
-"Delete table": "तालिका हटाएँ",
-"Cell": "कोशिका",
-"Row": "पंक्ति",
-"Column": "स्तंभ",
-"Cell properties": "कोशिका गुण",
-"Merge cells": "खानों को मिलाएं",
-"Split cell": "खानें विभाजित करें",
-"Insert row before": "पहले पंक्ति डालें",
-"Insert row after": "बाद पंक्ति डालें",
-"Delete row": "पंक्ति हटाएं",
-"Row properties": "पंक्ति के गुण",
-"Cut row": "पंक्ति काटें",
-"Cut column": "",
-"Copy row": "पंक्ति की प्रतिलिपि लें",
-"Copy column": "",
-"Paste row before": "पंक्ति से पहले चिपकाएँ",
-"Paste column before": "",
-"Paste row after": "पंक्ति के बाद चिपकाएँ",
-"Paste column after": "",
-"Insert column before": "पहले स्तंभ डालें",
-"Insert column after": "बाद स्तंभ डालें",
-"Delete column": "स्तंभ हटाएँ",
-"Cols": "स्तंभ",
-"Rows": "पंक्तियाँ",
-"Width": "चौड़ाई",
-"Height": "ऊँचाई",
-"Cell spacing": "खानों में रिक्ति",
-"Cell padding": "खानों में दूरी",
-"Row clipboard actions": "",
-"Column clipboard actions": "",
-"Table styles": "",
-"Cell styles": "",
-"Column header": "",
-"Row header": "",
-"Table caption": "",
-"Caption": "अनुशीर्षक",
-"Show caption": "",
-"Left": "बायाँ",
-"Center": "मध्य",
-"Right": "दायाँ",
-"Cell type": "खाने का प्रकार",
-"Scope": "क्षेत्र",
-"Alignment": "संरेखण",
-"Horizontal align": "",
-"Vertical align": "",
-"Top": "शीर्ष",
-"Middle": "मध्य",
-"Bottom": "नीचे",
-"Header cell": "शीर्ष खाना",
-"Row group": "पंक्ति समूह",
-"Column group": "स्तंभ समूह",
-"Row type": "पंक्ति प्रकार",
-"Header": "शीर्षक",
-"Body": "शरीर",
-"Footer": "पाद लेख",
-"Border color": "सीमा रंग",
-"Solid": "",
-"Dotted": "",
-"Dashed": "",
-"Double": "",
-"Groove": "",
-"Ridge": "",
-"Inset": "",
-"Outset": "",
-"Hidden": "",
-"Insert template...": "",
-"Templates": "साँचे",
-"Template": "",
-"Insert Template": "",
-"Text color": "पाठ्य रंग",
-"Background color": "पृष्ठभूमि का रंग",
-"Custom...": "अनुकूलित...",
-"Custom color": "अनुकूलित रंग",
-"No color": "रंगहीन",
-"Remove color": "",
-"Show blocks": "डब्बे दिखाएँ",
-"Show invisible characters": "अदृश्य अक्षरों को दिखाएँ",
-"Word count": "",
-"Count": "",
-"Document": "",
-"Selection": "",
-"Words": "",
-"Words: {0}": "शब्द: {0}",
-"{0} words": "",
-"File": "नत्थी",
-"Edit": "सम्पादन",
-"Insert": "डालें",
-"View": "देखें",
-"Format": "प्रारूप",
-"Table": "तालिका",
-"Tools": "उपकरण",
-"Powered by {0}": "",
-"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "संपन्न पाठ क्षेत्र। मेनू के लिए ALT-F9 दबाएँ। उपकरण पट्टी के लिए  ALT-F10 दबाएँ। सहायता के लिए ALT-0 दबाएँ।",
-"Image title": "",
-"Border width": "",
-"Border style": "",
-"Error": "",
-"Warn": "",
-"Valid": "",
-"To open the popup, press Shift+Enter": "",
-"Rich Text Area": "",
-"Rich Text Area. Press ALT-0 for help.": "",
-"System Font": "",
-"Failed to upload image: {0}": "",
-"Failed to load plugin: {0} from url {1}": "",
-"Failed to load plugin url: {0}": "",
-"Failed to initialize plugin: {0}": "",
-"example": "",
-"Search": "",
-"All": "",
-"Currency": "",
-"Text": "",
-"Quotations": "",
-"Mathematical": "",
-"Extended Latin": "",
-"Symbols": "",
-"Arrows": "",
-"User Defined": "",
-"dollar sign": "",
-"currency sign": "",
-"euro-currency sign": "",
-"colon sign": "",
-"cruzeiro sign": "",
-"french franc sign": "",
-"lira sign": "",
-"mill sign": "",
-"naira sign": "",
-"peseta sign": "",
-"rupee sign": "",
-"won sign": "",
-"new sheqel sign": "",
-"dong sign": "",
-"kip sign": "",
-"tugrik sign": "",
-"drachma sign": "",
-"german penny symbol": "",
-"peso sign": "",
-"guarani sign": "",
-"austral sign": "",
-"hryvnia sign": "",
-"cedi sign": "",
-"livre tournois sign": "",
-"spesmilo sign": "",
-"tenge sign": "",
-"indian rupee sign": "",
-"turkish lira sign": "",
-"nordic mark sign": "",
-"manat sign": "",
-"ruble sign": "",
-"yen character": "",
-"yuan character": "",
-"yuan character, in hong kong and taiwan": "",
-"yen/yuan character variant one": "",
-"Emojis": "",
-"Emojis...": "",
-"Loading emojis...": "",
-"Could not load emojis": "",
-"People": "",
-"Animals and Nature": "",
-"Food and Drink": "",
-"Activity": "",
-"Travel and Places": "",
-"Objects": "",
-"Flags": "",
-"Characters": "",
-"Characters (no spaces)": "",
-"{0} characters": "",
-"Error: Form submit field collision.": "",
-"Error: No form element found.": "",
-"Color swatch": "",
-"Color Picker": "रंग चयनकर्ता",
-"Invalid hex color code: {0}": "",
-"Invalid input": "",
-"R": "आर",
-"Red component": "",
-"G": "जी",
-"Green component": "",
-"B": "बी",
-"Blue component": "",
-"#": "",
-"Hex color code": "",
-"Range 0 to 255": "",
-"Turquoise": "",
-"Green": "",
-"Blue": "",
-"Purple": "",
-"Navy Blue": "",
-"Dark Turquoise": "",
-"Dark Green": "",
-"Medium Blue": "",
-"Medium Purple": "",
-"Midnight Blue": "",
-"Yellow": "",
-"Orange": "",
-"Red": "",
-"Light Gray": "",
-"Gray": "",
-"Dark Yellow": "",
-"Dark Orange": "",
-"Dark Red": "",
-"Medium Gray": "",
-"Dark Gray": "",
-"Light Green": "",
-"Light Yellow": "",
-"Light Red": "",
-"Light Purple": "",
-"Light Blue": "",
-"Dark Purple": "",
-"Dark Blue": "",
-"Black": "",
-"White": "",
-"Switch to or from fullscreen mode": "",
-"Open help dialog": "",
-"history": "",
-"styles": "",
-"formatting": "",
-"alignment": "",
-"indentation": "",
-"Font": "",
-"Size": "",
-"More...": "",
-"Select...": "",
-"Preferences": "",
-"Yes": "",
-"No": "",
-"Keyboard Navigation": "",
-"Version": "",
-"Code view": "",
-"Open popup menu for split buttons": "",
-"List Properties": "",
-"List properties...": "",
-"Start list at number": "",
-"Line height": "",
-"Dropped file type is not supported": "",
-"Loading...": "",
-"ImageProxy HTTP error: Rejected request": "",
-"ImageProxy HTTP error: Could not find Image Proxy": "",
-"ImageProxy HTTP error: Incorrect Image Proxy URL": "",
-"ImageProxy HTTP error: Unknown ImageProxy error": ""
-});

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 3
public/assets/custom/tinymce/plugins/template/plugin.min.js


+ 112 - 42
resources/views/_layout.blade.php

@@ -33,47 +33,117 @@
 </head>
 
 <body class="animsition @yield('body_class')">
-@yield('layout_content')
-<!-- 核心/Core -->
-<script src="/assets/global/vendor/babel-external-helpers/babel-external-helpers.js"></script>
-<script src="/assets/global/vendor/jquery/jquery.min.js"></script>
-<script src="/assets/global/vendor/popper-js/umd/popper.min.js"></script>
-<script src="/assets/global/vendor/bootstrap/bootstrap.min.js"></script>
-<script src="/assets/global/vendor/animsition/animsition.min.js"></script>
-<script src="/assets/global/vendor/mousewheel/jquery.mousewheel.min.js"></script>
-<script src="/assets/global/vendor/asscrollbar/jquery-asScrollbar.min.js"></script>
-<script src="/assets/global/vendor/asscrollable/jquery-asScrollable.min.js"></script>
-<script src="/assets/global/vendor/ashoverscroll/jquery-asHoverScroll.min.js"></script>
-<!-- 插件/Plugins -->
-<script src="/assets/global/vendor/screenfull/screenfull.min.js"></script>
-<script src="/assets/global/vendor/slidepanel/jquery-slidePanel.min.js"></script>
-<!-- 脚本/Scripts -->
-<script src="/assets/global/js/Component.js"></script>
-<script src="/assets/global/js/Plugin.js"></script>
-<script src="/assets/global/js/Base.js"></script>
-<script src="/assets/global/js/Config.js"></script>
-<script src="/assets/js/Section/Menubar.js"></script>
-<script src="/assets/js/Section/Sidebar.js"></script>
-<script src="/assets/js/Section/PageAside.js"></script>
-<script src="/assets/js/Plugin/menu.js"></script>
-<!-- 设置/Config -->
-<script src="/assets/global/js/config/colors.js"></script>
-<script>
-  Config.set('assets', '/assets');
-</script>
-<!-- 页面/Page -->
-<script src="/assets/js/Site.js"></script>
-<script src="/assets/global/js/Plugin/asscrollable.js"></script>
-<script src="/assets/global/js/Plugin/slidepanel.js"></script>
-<script>
-  (function(document, window, $) {
-    'use strict';
-    const Site = window.Site;
-    $(document).ready(function() {
-      Site.run();
-    });
-  })(document, window, jQuery);
-</script>
-@yield('layout_javascript')
+    @yield('layout_content')
+    <!-- 核心/Core -->
+    <script src="/assets/global/vendor/babel-external-helpers/babel-external-helpers.js"></script>
+    <script src="/assets/global/vendor/jquery/jquery.min.js"></script>
+    <script src="/assets/global/vendor/popper-js/umd/popper.min.js"></script>
+    <script src="/assets/global/vendor/bootstrap/bootstrap.min.js"></script>
+    <script src="/assets/global/vendor/animsition/animsition.min.js"></script>
+    <script src="/assets/global/vendor/mousewheel/jquery.mousewheel.min.js"></script>
+    <script src="/assets/global/vendor/asscrollbar/jquery-asScrollbar.min.js"></script>
+    <script src="/assets/global/vendor/asscrollable/jquery-asScrollable.min.js"></script>
+    <script src="/assets/global/vendor/ashoverscroll/jquery-asHoverScroll.min.js"></script>
+    <!-- 插件/Plugins -->
+    <script src="/assets/global/vendor/screenfull/screenfull.min.js"></script>
+    <script src="/assets/global/vendor/slidepanel/jquery-slidePanel.min.js"></script>
+    <!-- 脚本/Scripts -->
+    <script src="/assets/global/js/Component.js"></script>
+    <script src="/assets/global/js/Plugin.js"></script>
+    <script src="/assets/global/js/Base.js"></script>
+    <script src="/assets/global/js/Config.js"></script>
+    <script src="/assets/js/Section/Menubar.js"></script>
+    <script src="/assets/js/Section/Sidebar.js"></script>
+    <script src="/assets/js/Section/PageAside.js"></script>
+    <script src="/assets/js/Plugin/menu.js"></script>
+    <!-- 设置/Config -->
+    <script src="/assets/global/js/config/colors.js"></script>
+    <script>
+        Config.set("assets", "/assets");
+    </script>
+    <!-- 页面/Page -->
+    <script src="/assets/js/Site.js"></script>
+    <script src="/assets/global/js/Plugin/asscrollable.js"></script>
+    <script src="/assets/global/js/Plugin/slidepanel.js"></script>
+    <script>
+        (function(document, window, $) {
+            "use strict";
+            const Site = window.Site;
+            $(document).ready(function() {
+                Site.run();
+            });
+        })(document, window, jQuery);
+        @auth
+        document.addEventListener("DOMContentLoaded", async function() {
+            const avatarElements = Array.from(document.querySelectorAll("img[data-uid]"));
+            let avatarData = JSON.parse(localStorage.getItem("avatarData")) || {};
+            const fetchPromises = {};
+
+            // Group img elements by uid
+            const uidToElementsMap = groupElementsByUid(avatarElements);
+
+            for (const [uid, elements] of Object.entries(uidToElementsMap)) {
+                if (avatarData[uid]) {
+                    updateElementsSrc(elements, avatarData[uid]);
+                } else if (!fetchPromises[uid]) {
+                    const {
+                        username,
+                        qq
+                    } = elements[0].dataset;
+                    fetchPromises[uid] = fetchAndCacheAvatar(uid, username, qq).then(imgUrl => {
+                        avatarData[uid] = imgUrl;
+                        localStorage.setItem("avatarData", JSON.stringify(avatarData));
+                        updateElementsSrc(elements, imgUrl);
+                    }).catch(error => {
+                        console.error(`Error fetching avatar for uid ${uid}:`, error);
+                        updateElementsSrc(elements, ""); // Or set to a default URL
+                    });
+                }
+            }
+        });
+
+        function groupElementsByUid(elements) {
+            return elements.reduce((acc, el) => {
+                const uid = el.dataset.uid;
+                if (!acc[uid]) acc[uid] = [];
+                acc[uid].push(el);
+                return acc;
+            }, {});
+        }
+
+        function updateElementsSrc(elements, src) {
+            elements.forEach(el => el.src = src);
+        }
+
+        async function fetchAndCacheAvatar(uid, username, qq) {
+            const response = await fetch(`{{ route('getAvatar') }}?username=${username}&qq=${qq}`);
+            const url = await response.json();
+            if (/@qq\.com/.test(username) || qq) {
+                return url;
+            }
+            const imgResponse = await fetch(url);
+
+            if (url === imgResponse.url) {
+                const type = imgResponse.headers.get("Content-Type");
+                const imgBlob = await imgResponse.blob();
+                const base64String = await blobToBase64(imgBlob);
+                return `data:${type};base64,${base64String}`;
+            } else {
+                return imgResponse.url;
+            }
+        }
+
+        async function blobToBase64(blob) {
+            return new Promise((resolve, reject) => {
+                const reader = new FileReader();
+                reader.onload = () => resolve(reader.result.split(",")[1]);
+                reader.onerror = () => reject("Error converting blob to base64");
+                reader.readAsDataURL(blob);
+            });
+        }
+        @endauth
+    </script>
+    @yield('layout_javascript')
 </body>
+
 </html>

+ 155 - 130
resources/views/admin/layouts.blade.php

@@ -6,18 +6,20 @@
 @endsection
 @section('body_class', 'dashboard')
 @section('layout_content')
-    <nav class="site-navbar navbar navbar-default navbar-fixed-top navbar-mega {{config('theme.navbar.inverse')}} {{config('theme.navbar.skin')}}" role="navigation">
+    <nav class="site-navbar navbar navbar-default navbar-fixed-top navbar-mega {{ config('theme.navbar.inverse') }} {{ config('theme.navbar.skin') }}"
+         role="navigation">
         <div class="navbar-header">
-            <button type="button" class="navbar-toggler hamburger hamburger-close navbar-toggler-left hided" data-toggle="menubar">
-                <span class="sr-only">{{trans('common.toggle_action', ['action' => trans('common.function.navigation')])}}</span>
+            <button class="navbar-toggler hamburger hamburger-close navbar-toggler-left hided" data-toggle="menubar" type="button">
+                <span class="sr-only">{{ trans('common.toggle_action', ['action' => trans('common.function.navigation')]) }}</span>
                 <span class="hamburger-bar"></span>
             </button>
-            <button type="button" class="navbar-toggler collapsed" data-target="#site-navbar-collapse" data-toggle="collapse">
+            <button class="navbar-toggler collapsed" data-target="#site-navbar-collapse" data-toggle="collapse" type="button">
                 <i class="icon wb-more-horizontal" aria-hidden="true"></i>
             </button>
             <div class="navbar-brand navbar-brand-center">
-                <img src="{{sysConfig('website_logo')? asset(sysConfig('website_logo')) :'/assets/images/logo.png'}}" class="navbar-brand-logo" alt="logo"/>
-                <span class="navbar-brand-text hidden-xs-down"> {{sysConfig('website_name')}}</span>
+                <img class="navbar-brand-logo" src="{{ sysConfig('website_logo') ? asset(sysConfig('website_logo')) : '/assets/images/logo.png' }}"
+                     alt="logo" />
+                <span class="navbar-brand-text hidden-xs-down"> {{ sysConfig('website_name') }}</span>
             </div>
         </div>
         <div class="navbar-container container-fluid">
@@ -26,26 +28,26 @@
                     <li class="nav-item hidden-float" id="toggleMenubar">
                         <a class="nav-link" data-toggle="menubar" href="#" role="button">
                             <i class="icon hamburger hamburger-arrow-left">
-                                <span class="sr-only">{{trans('common.toggle_action', ['action' => trans('common.function.menubar')])}}</span>
+                                <span class="sr-only">{{ trans('common.toggle_action', ['action' => trans('common.function.menubar')]) }}</span>
                                 <span class="hamburger-bar"></span>
                             </i>
                         </a>
                     </li>
                     <li class="nav-item hidden-sm-down">
                         <a class="nav-link icon icon-fullscreen" data-toggle="fullscreen" href="#" role="button">
-                            <span class="sr-only">{{trans('common.toggle_action', ['action' => trans('common.function.fullscreen')])}}</span>
+                            <span class="sr-only">{{ trans('common.toggle_action', ['action' => trans('common.function.fullscreen')]) }}</span>
                         </a>
                     </li>
                     <li class="nav-item dropdown">
-                        <a href="javascript:void(0)" class="nav-link" data-toggle="dropdown" role="button">
+                        <a class="nav-link" data-toggle="dropdown" href="javascript:void(0)" role="button">
                             <span class="icon wb-globe"></span>
                             <span class="icon wb-chevron-down-mini"></span>
                         </a>
                         <div class="dropdown-menu" role="menu">
                             @foreach (config('common.language') as $key => $value)
-                                <a class="dropdown-item" href="{{route('lang', ['locale' => $key])}}" role="menuitem">
-                                    <i class="fi fi-{{$value[1]}}" aria-hidden="true"></i>
-                                    <span style="padding: inherit;">{{$value[0]}}</span>
+                                <a class="dropdown-item" href="{{ route('lang', ['locale' => $key]) }}" role="menuitem">
+                                    <i class="fi fi-{{ $value[1] }}" aria-hidden="true"></i>
+                                    <span style="padding: inherit;">{{ $value[0] }}</span>
                                 </a>
                             @endforeach
                         </div>
@@ -53,11 +55,12 @@
                 </ul>
                 <ul class="nav navbar-toolbar navbar-right navbar-toolbar-right">
                     <li class="nav-item dropdown">
-                        <a class="nav-link navbar-avatar" data-toggle="dropdown" href="#" aria-expanded="false" data-animation="scale-up" role="button">
-                        <span class="avatar avatar-online">
-                            <img src="{{Auth::getUser()->avatar}}" alt="{{trans('common.avatar')}}"/>
-                            <i></i>
-                        </span>
+                        <a class="nav-link navbar-avatar" data-toggle="dropdown" data-animation="scale-up" href="#" role="button" aria-expanded="false">
+                            <span class="avatar avatar-online">
+                                <img data-uid="{{ Auth::getUser()->id }}" data-qq="{{ Auth::getUser()->qq }}" data-username="{{ Auth::getUser()->username }}"
+                                     src="" alt="{{ trans('common.avatar') }}" loading="lazy" />
+                                <i></i>
+                            </span>
                         </a>
                         <div class="dropdown-menu" role="menu">
                             <a class="dropdown-item" href="/" role="menuitem">
@@ -65,9 +68,9 @@
                                 {{ trans('admin.user_dashboard') }}
                             </a>
                             <div class="dropdown-divider" role="presentation"></div>
-                            <a class="dropdown-item" href="{{route('logout')}}" role="menuitem">
+                            <a class="dropdown-item" href="{{ route('logout') }}" role="menuitem">
                                 <i class="icon wb-power" aria-hidden="true"></i>
-                                {{trans('auth.logout')}}
+                                {{ trans('auth.logout') }}
                             </a>
                         </div>
                     </li>
@@ -75,55 +78,56 @@
             </div>
         </div>
     </nav>
-    <div class="site-menubar {{config('theme.sidebar')}}">
+    <div class="site-menubar {{ config('theme.sidebar') }}">
         <div class="site-menubar-body">
             <ul class="site-menu" data-plugin="menu">
                 @can('admin.index')
-                    <li class="site-menu-item {{request()->routeIs('admin.index') ? 'active open' : ''}}">
-                        <a href="{{route('admin.index')}}">
+                    <li class="site-menu-item {{ request()->routeIs('admin.index') ? 'active open' : '' }}">
+                        <a href="{{ route('admin.index') }}">
                             <i class="site-menu-icon wb-dashboard" aria-hidden="true"></i>
                             <span class="site-menu-title">{{ trans('admin.menu.dashboard') }}</span>
                         </a>
                     </li>
                 @endcan
                 @canany(['admin.user.index', 'admin.user.group.index', 'admin.log.credit', 'admin.subscribe.index'])
-                    <li class="site-menu-item has-sub {{request()->routeIs('admin.user.*', 'admin.log.credit', 'admin.subscribe.*') ? 'active open' : ''}}">
+                    <li class="site-menu-item has-sub {{ request()->routeIs('admin.user.*', 'admin.log.credit', 'admin.subscribe.*') ? 'active open' : '' }}">
                         <a href="javascript:void(0)">
                             <i class="site-menu-icon wb-user" aria-hidden="true"></i>
                             <span class="site-menu-title">{{ trans('admin.menu.user.attribute') }}</span>
                         </a>
                         <ul class="site-menu-sub">
                             @can('admin.user.index')
-                                <li class="site-menu-item {{request()->routeIs('admin.user.index', 'admin.user.edit', 'admin.user.monitor', 'admin.user.online', 'admin.user.online', 'admin.user.export') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.user.index')}}">
+                                <li
+                                    class="site-menu-item {{ request()->routeIs('admin.user.index', 'admin.user.edit', 'admin.user.monitor', 'admin.user.online', 'admin.user.online', 'admin.user.export') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.user.index') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.user.list') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.user.oauth')
-                                <li class="site-menu-item {{request()->routeIs('admin.user.oauth') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.user.oauth')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.user.oauth') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.user.oauth') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.user.oauth') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.user.group.index')
-                                <li class="site-menu-item {{request()->routeIs('admin.user.group.*') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.user.group.index')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.user.group.*') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.user.group.index') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.user.group') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.log.credit')
-                                <li class="site-menu-item {{request()->routeIs('admin.log.credit') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.log.credit')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.log.credit') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.log.credit') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.user.credit_log') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.subscribe.index')
-                                <li class="site-menu-item {{request()->routeIs('admin.subscribe.*')? 'active open' : ''}}">
-                                    <a href="{{route('admin.subscribe.index')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.subscribe.*') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.subscribe.index') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.user.subscribe') }}</span>
                                     </a>
                                 </li>
@@ -132,22 +136,22 @@
                     </li>
                 @endcanany
                 @canany(['admin.permission.index', 'admin.role.index'])
-                    <li class="site-menu-item has-sub {{request()->routeIs('admin.permission.*', 'admin.role.*') ? 'active open' : ''}}">
+                    <li class="site-menu-item has-sub {{ request()->routeIs('admin.permission.*', 'admin.role.*') ? 'active open' : '' }}">
                         <a href="javascript:void(0)">
                             <i class="site-menu-icon wb-users" aria-hidden="true"></i>
                             <span class="site-menu-title">{{ trans('admin.menu.rbac.attribute') }}</span>
                         </a>
                         <ul class="site-menu-sub">
                             @can('admin.permission.index')
-                                <li class="site-menu-item {{request()->routeIs('admin.permission.*') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.permission.index')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.permission.*') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.permission.index') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.rbac.permission') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.role.index')
-                                <li class="site-menu-item {{request()->routeIs('admin.role.*') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.role.index')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.role.*') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.role.index') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.rbac.role') }}</span>
                                     </a>
                                 </li>
@@ -156,17 +160,17 @@
                     </li>
                 @endcanany
                 @canany(['admin.ticket.index', 'admin.article.index', 'admin.marketing.push', 'admin.marketing.email'])
-                    <li class="site-menu-item has-sub {{request()->routeIs('admin.ticket.*', 'admin.article.*', 'admin.marketing.*')? 'active open' : ''}}">
+                    <li class="site-menu-item has-sub {{ request()->routeIs('admin.ticket.*', 'admin.article.*', 'admin.marketing.*') ? 'active open' : '' }}">
                         <a href="javascript:void(0)">
                             <i class="site-menu-icon wb-chat-working" aria-hidden="true"></i>
                             <span class="site-menu-title">{{ trans('admin.menu.customer_service.attribute') }}</span>
                             @can('admin.ticket.index')
                                 @php
-                                    $openTicket = Cache::rememberForever('open_ticket_count', static function (){
+                                    $openTicket = Cache::rememberForever('open_ticket_count', static function () {
                                         return App\Models\Ticket::whereStatus(0)->count();
-                                    })
+                                    });
                                 @endphp
-                                @if($openTicket)
+                                @if ($openTicket)
                                     <div class="site-menu-badge">
                                         <span class="badge badge-pill badge-success">{{ $openTicket }}</span>
                                     </div>
@@ -175,10 +179,10 @@
                         </a>
                         <ul class="site-menu-sub">
                             @can('admin.ticket.index')
-                                <li class="site-menu-item {{request()->routeIs('admin.ticket.*') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.ticket.index')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.ticket.*') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.ticket.index') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.customer_service.ticket') }}</span>
-                                        @if($openTicket > 0)
+                                        @if ($openTicket > 0)
                                             <div class="site-menu-label">
                                                 <span class="badge badge-danger badge-round mr-25">{{ $openTicket }}</span>
                                             </div>
@@ -187,22 +191,22 @@
                                 </li>
                             @endcan
                             @can('admin.article.index')
-                                <li class="site-menu-item {{request()->routeIs('admin.article.*')? 'active open' : ''}}">
-                                    <a href="{{route('admin.article.index')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.article.*') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.article.index') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.customer_service.article') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.marketing.push')
-                                <li class="site-menu-item {{request()->routeIs('admin.marketing.push') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.marketing.push')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.marketing.push') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.marketing.push') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.customer_service.push') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.marketing.email')
-                                <li class="site-menu-item {{request()->routeIs('admin.marketing.email') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.marketing.email')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.marketing.email') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.marketing.email') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.customer_service.mail') }}</span>
                                     </a>
                                 </li>
@@ -211,29 +215,29 @@
                     </li>
                 @endcanany
                 @canany(['admin.node.index', 'admin.node.auth.index', 'admin.node.cert.index'])
-                    <li class="site-menu-item has-sub {{request()->routeIs('admin.node.*') ? 'active open' : ''}}">
+                    <li class="site-menu-item has-sub {{ request()->routeIs('admin.node.*') ? 'active open' : '' }}">
                         <a href="javascript:void(0)">
                             <i class="site-menu-icon wb-cloud" aria-hidden="true"></i>
                             <span class="site-menu-title">{{ trans('admin.menu.node.attribute') }}</span>
                         </a>
                         <ul class="site-menu-sub">
                             @can('admin.node.index')
-                                <li class="site-menu-item {{request()->routeIs('admin.node.index', 'admin.node.create', 'admin.node.edit')? 'active open' : ''}}">
-                                    <a href="{{route('admin.node.index')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.node.index', 'admin.node.create', 'admin.node.edit') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.node.index') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.node.list') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.node.auth.index')
-                                <li class="site-menu-item {{request()->routeIs('admin.node.auth.*') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.node.auth.index')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.node.auth.*') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.node.auth.index') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.node.auth') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.node.cert.index')
-                                <li class="site-menu-item {{request()->routeIs('admin.node.cert.*') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.node.cert.index')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.node.cert.*') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.node.cert.index') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.node.cert') }}</span>
                                     </a>
                                 </li>
@@ -242,29 +246,29 @@
                     </li>
                 @endcanany
                 @canany(['admin.rule.index', 'admin.rule.group.index', 'admin.rule.log'])
-                    <li class="site-menu-item has-sub {{request()->routeIs('admin.rule.*') ? 'active open' : ''}}">
+                    <li class="site-menu-item has-sub {{ request()->routeIs('admin.rule.*') ? 'active open' : '' }}">
                         <a href="javascript:void(0)">
                             <i class="site-menu-icon wb-eye" aria-hidden="true"></i>
                             <span class="site-menu-title">{{ trans('admin.menu.rule.attribute') }}</span>
                         </a>
                         <ul class="site-menu-sub">
                             @can('admin.rule.index')
-                                <li class="site-menu-item {{request()->routeIs('admin.rule.index') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.rule.index')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.rule.index') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.rule.index') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.rule.list') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.rule.group.index')
-                                <li class="site-menu-item {{request()->routeIs('admin.rule.group.*') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.rule.group.index')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.rule.group.*') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.rule.group.index') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.rule.group') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.rule.log')
-                                <li class="site-menu-item {{request()->routeIs('admin.rule.log') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.rule.log')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.rule.log') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.rule.log') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.rule.trigger') }}</span>
                                     </a>
                                 </li>
@@ -273,29 +277,29 @@
                     </li>
                 @endcanany
                 @canany(['admin.goods.index', 'admin.coupon.index', 'admin.order'])
-                    <li class="site-menu-item has-sub {{request()->routeIs('admin.goods.*', 'admin.coupon.*', 'admin.order') ? 'active open' : ''}}">
+                    <li class="site-menu-item has-sub {{ request()->routeIs('admin.goods.*', 'admin.coupon.*', 'admin.order') ? 'active open' : '' }}">
                         <a href="javascript:void(0)">
                             <i class="site-menu-icon wb-shopping-cart" aria-hidden="true"></i>
                             <span class="site-menu-title">{{ trans('admin.menu.shop.attribute') }}</span>
                         </a>
                         <ul class="site-menu-sub">
                             @can('admin.goods.index')
-                                <li class="site-menu-item {{request()->routeIs('admin.goods.*') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.goods.index')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.goods.*') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.goods.index') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.shop.goods') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.coupon.index')
-                                <li class="site-menu-item {{request()->routeIs('admin.coupon.*') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.coupon.index')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.coupon.*') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.coupon.index') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.shop.coupon') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.order')
-                                <li class="site-menu-item {{request()->routeIs('admin.order') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.order')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.order') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.order') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.shop.order') }}</span>
                                     </a>
                                 </li>
@@ -304,17 +308,17 @@
                     </li>
                 @endcanany
                 @canany(['admin.invite.index', 'admin.aff.index', 'admin.aff.rebate'])
-                    <li class="site-menu-item has-sub {{request()->routeIs('admin.invite.*', 'admin.aff.*') ? 'active open' : ''}}">
+                    <li class="site-menu-item has-sub {{ request()->routeIs('admin.invite.*', 'admin.aff.*') ? 'active open' : '' }}">
                         <a href="javascript:void(0)">
                             <i class="site-menu-icon wb-thumb-up" aria-hidden="true"></i>
                             <span class="site-menu-title">{{ trans('admin.menu.promotion.attribute') }}</span>
                             @can('admin.aff.index')
                                 @php
-                                    $openApply = Cache::rememberForever('open_referral_apply_count', static function (){
+                                    $openApply = Cache::rememberForever('open_referral_apply_count', static function () {
                                         return App\Models\ReferralApply::whereStatus(0)->count();
-                                    })
+                                    });
                                 @endphp
-                                @if($openApply)
+                                @if ($openApply)
                                     <div class="site-menu-badge">
                                         <span class="badge badge-pill badge-success">{{ $openApply }}</span>
                                     </div>
@@ -323,27 +327,27 @@
                         </a>
                         <ul class="site-menu-sub">
                             @can('admin.invite.index')
-                                <li class="site-menu-item {{request()->routeIs('admin.invite.index') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.invite.index')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.invite.index') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.invite.index') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.promotion.invite') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.aff.index')
-                                <li class="site-menu-item {{request()->routeIs('admin.aff.index', 'admin.aff.detail') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.aff.index')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.aff.index', 'admin.aff.detail') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.aff.index') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.promotion.withdraw') }}</span>
-                                        @if($openApply > 0)
+                                        @if ($openApply > 0)
                                             <div class="site-menu-label">
-                                                <span class="badge badge-danger badge-round mr-25">{{$openApply}}</span>
+                                                <span class="badge badge-danger badge-round mr-25">{{ $openApply }}</span>
                                             </div>
                                         @endif
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.aff.rebate')
-                                <li class="site-menu-item {{request()->routeIs('admin.aff.rebate') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.aff.rebate')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.aff.rebate') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.aff.rebate') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.promotion.rebate_flow') }}</span>
                                     </a>
                                 </li>
@@ -352,22 +356,22 @@
                     </li>
                 @endcanany
                 @canany(['admin.report.accounting', 'admin.report.userAnalysis'])
-                    <li class="site-menu-item has-sub {{request()->routeIs('admin.report.*') ? 'active open' : ''}}">
+                    <li class="site-menu-item has-sub {{ request()->routeIs('admin.report.*') ? 'active open' : '' }}">
                         <a href="javascript:void(0)">
                             <i class="site-menu-icon wb-stats-bars" aria-hidden="true"></i>
                             <span class="site-menu-title">{{ trans('admin.menu.analysis.attribute') }}</span>
                         </a>
                         <ul class="site-menu-sub">
                             @can('admin.report.accounting')
-                                <li class="site-menu-item {{request()->routeIs('admin.report.accounting') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.report.accounting')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.report.accounting') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.report.accounting') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.analysis.accounting') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.report.userAnalysis')
-                                <li class="site-menu-item {{request()->routeIs('admin.report.userAnalysis') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.report.userAnalysis')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.report.userAnalysis') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.report.userAnalysis') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.analysis.user_flow') }}</span>
                                     </a>
                                 </li>
@@ -376,79 +380,80 @@
                     </li>
                 @endcanany
                 @canany(['admin.log.traffic', 'admin.log.flow', 'admin.log.ban', 'admin.log.ip', 'admin.log.online', 'admin.log.notify', 'admin.payment.callback'])
-                    <li class="site-menu-item has-sub {{request()->routeIs('admin.log.traffic', 'admin.log.flow', 'admin.log.ban', 'admin.log.ip', 'admin.log.online', 'admin.log.notify', 'admin.payment.callback') ? 'active open' : ''}}">
+                    <li
+                        class="site-menu-item has-sub {{ request()->routeIs('admin.log.traffic', 'admin.log.flow', 'admin.log.ban', 'admin.log.ip', 'admin.log.online', 'admin.log.notify', 'admin.payment.callback') ? 'active open' : '' }}">
                         <a href="javascript:void(0)">
                             <i class="site-menu-icon wb-calendar" aria-hidden="true"></i>
                             <span class="site-menu-title">{{ trans('admin.menu.log.attribute') }}</span>
                         </a>
                         <ul class="site-menu-sub">
                             @can('admin.log.traffic')
-                                <li class="site-menu-item {{request()->routeIs('admin.log.traffic') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.log.traffic')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.log.traffic') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.log.traffic') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.log.traffic') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.log.flow')
-                                <li class="site-menu-item {{request()->routeIs('admin.log.flow') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.log.flow')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.log.flow') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.log.flow') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.log.traffic_flow') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.log.ban')
-                                <li class="site-menu-item {{request()->routeIs('admin.log.ban') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.log.ban')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.log.ban') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.log.ban') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.log.service_ban') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.log.ip')
-                                <li class="site-menu-item {{request()->routeIs('admin.log.ip') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.log.ip')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.log.ip') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.log.ip') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.log.online_logs') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.log.online')
-                                <li class="site-menu-item {{request()->routeIs('admin.log.online') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.log.online')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.log.online') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.log.online') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.log.online_monitor') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.log.notify')
-                                <li class="site-menu-item {{request()->routeIs('admin.log.notify') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.log.notify')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.log.notify') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.log.notify') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.log.notify') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.payment.callback')
-                                <li class="site-menu-item {{request()->routeIs('admin.payment.callback') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.payment.callback')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.payment.callback') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.payment.callback') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.log.payment_callback') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('log-viewer')
                                 <li class="site-menu-item">
-                                    <a href="{{route('log-viewer::dashboard')}}" target="_blank">
+                                    <a href="{{ route('log-viewer::dashboard') }}" target="_blank">
                                         <span class="site-menu-title">{{ trans('admin.menu.log.system') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('viewHorizon')
                                 <li class="site-menu-item">
-                                    <a href="{{route('horizon.index')}}" target="_blank">
+                                    <a href="{{ route('horizon.index') }}" target="_blank">
                                         <span class="site-menu-title"> Horizon </span>
                                     </a>
                                 </li>
                             @endcan
-                            @if(config('app.debug') && config('app.env') === 'local')
+                            @if (config('app.debug') && config('app.env') === 'local')
                                 @can('viewTelescope')
                                     <li class="site-menu-item">
-                                        <a href="{{route('telescope')}}" target="_blank">
+                                        <a href="{{ route('telescope') }}" target="_blank">
                                             <span class="site-menu-title"> Telescope </span>
                                         </a>
                                     </li>
@@ -458,36 +463,36 @@
                     </li>
                 @endcanany
                 @canany(['admin.tools.decompile', 'admin.tools.convert', 'admin.tools.import', 'admin.tools.analysis'])
-                    <li class="site-menu-item has-sub {{request()->routeIs('admin.tools.*') ? 'active open' : ''}}">
+                    <li class="site-menu-item has-sub {{ request()->routeIs('admin.tools.*') ? 'active open' : '' }}">
                         <a href="javascript:void(0)">
                             <i class="site-menu-icon wb-briefcase" aria-hidden="true"></i>
                             <span class="site-menu-title">{{ trans('admin.menu.tools.attribute') }}</span>
                         </a>
                         <ul class="site-menu-sub">
                             @can('admin.tools.decompile')
-                                <li class="site-menu-item {{request()->routeIs('admin.tools.decompile') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.tools.decompile')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.tools.decompile') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.tools.decompile') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.tools.decompile') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.tools.convert')
-                                <li class="site-menu-item {{request()->routeIs('admin.tools.convert') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.tools.convert')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.tools.convert') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.tools.convert') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.tools.convert') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.tools.import')
-                                <li class="site-menu-item {{request()->routeIs('admin.tools.import') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.tools.import')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.tools.import') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.tools.import') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.tools.import') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.tools.analysis')
-                                <li class="site-menu-item {{request()->routeIs('admin.tools.analysis') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.tools.analysis')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.tools.analysis') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.tools.analysis') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.tools.analysis') }}</span>
                                     </a>
                                 </li>
@@ -496,29 +501,29 @@
                     </li>
                 @endcanany
                 @canany(['admin.config.filter.index', 'admin.config.index', 'admin.system.index'])
-                    <li class="site-menu-item has-sub {{request()->routeIs('admin.config.*', 'admin.system.index') ? 'active open' : ''}}">
+                    <li class="site-menu-item has-sub {{ request()->routeIs('admin.config.*', 'admin.system.index') ? 'active open' : '' }}">
                         <a href="javascript:void(0)">
                             <i class="site-menu-icon wb-settings" aria-hidden="true"></i>
                             <span class="site-menu-title">{{ trans('admin.menu.setting.attribute') }}</span>
                         </a>
                         <ul class="site-menu-sub">
                             @can('admin.config.filter.index')
-                                <li class="site-menu-item {{request()->routeIs('admin.config.filter.index') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.config.filter.index')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.config.filter.index') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.config.filter.index') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.setting.email_suffix') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.config.index')
-                                <li class="site-menu-item {{request()->routeIs('admin.config.common.*') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.config.index')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.config.common.*') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.config.index') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.setting.universal') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.system.index')
-                                <li class="site-menu-item {{request()->routeIs('admin.system.index') ? 'active open' : ''}}">
-                                    <a href="{{route('admin.system.index')}}">
+                                <li class="site-menu-item {{ request()->routeIs('admin.system.index') ? 'active open' : '' }}">
+                                    <a href="{{ route('admin.system.index') }}">
                                         <span class="site-menu-title">{{ trans('admin.menu.setting.system') }}</span>
                                     </a>
                                 </li>
@@ -530,15 +535,35 @@
         </div>
     </div>
     <div class="page">
-        <!--[if lt IE 8]><p class="browserupgrade">{{trans('common.update_browser.0')}}<strong>{{trans('common.update_browser.1')}}</strong>
-{{trans('common.update_browser.2')}}<a href="https://browsehappy.com/" target="_blank">{{trans('common.update_browser.3')}}</a>{{trans('common.update_browser.4')}}</p><![endif]-->
         @yield('content')
     </div>
-    @endsection
+@endsection
 @section('layout_javascript')
-    <!--[if lt IE 11]>
-    <script src="/assets/custom/sweetalert2/polyfill.min.js"></script>
-    <![endif]-->
     <script src="/assets/custom/sweetalert2/sweetalert2.all.min.js"></script>
+    <script>
+        const $buoop = {
+            required: {
+                e: 11,
+                f: -6,
+                o: -6,
+                s: -6,
+                c: -6
+            },
+            insecure: true,
+            unsupported: true,
+            api: 2024.07,
+        }
+
+        function $buo_f() {
+            const e = document.createElement('script')
+            e.src = "//browser-update.org/update.min.js";
+            document.body.appendChild(e);
+        }
+        try {
+            document.addEventListener("DOMContentLoaded", $buo_f, false)
+        } catch (e) {
+            window.attachEvent("onload", $buo_f)
+        }
+    </script>
     @yield('javascript')
 @endsection

+ 41 - 14
resources/views/auth/layouts.blade.php

@@ -46,7 +46,7 @@
 @endsection
 @section('body_class', 'page-login-v3 layout-full position-relative')
 @section('layout_content')
-    @if(Agent::isMobile() && Agent::is('iOS') && str_contains(Agent::getUserAgent(), 'MicroMessenger'))
+    @if (Agent::isMobile() && Agent::is('iOS') && str_contains(Agent::getUserAgent(), 'MicroMessenger'))
         <style>
             .cover-up {
                 opacity: 0.1;
@@ -54,11 +54,13 @@
             }
         </style>
         <div class="m-0 p-0 w-full h-full text-white" style="z-index: 10; position: absolute;">
-            <div class="font-size-16 h-p33 pl-20 pt-20" style="line-height: 1.8; background: url(//gw.alicdn.com/tfs/TB1eSZaNFXXXXb.XXXXXXXXXXXX-750-234.png) center top/contain no-repeat">
-                <p>{{trans('common.to_safari.0')}}
-                    <i class="icon wb-more-horizontal" aria-hidden="true"></i>{{trans('common.to_safari.1')}}
-                    <img src="//gw.alicdn.com/tfs/TB1xwiUNpXXXXaIXXXXXXXXXXXX-55-55.png" class="w-30 h-30 vertical-align-middle m-3" alt="Safari"/>
-                    {{trans('common.to_safari.2')}}<br>{{trans('common.to_safari.3')}}</p>
+            <div class="font-size-16 h-p33 pl-20 pt-20"
+                 style="line-height: 1.8; background: url(//gw.alicdn.com/tfs/TB1eSZaNFXXXXb.XXXXXXXXXXXX-750-234.png) center top/contain no-repeat">
+                <p>{{ trans('common.to_safari.0') }}
+                    <i class="icon wb-more-horizontal" aria-hidden="true"></i>{{ trans('common.to_safari.1') }}
+                    <img class="w-30 h-30 vertical-align-middle m-3" src="https://gw.alicdn.com/tfs/TB1xwiUNpXXXXaIXXXXXXXXXXXX-55-55.png" alt="Safari" />
+                    {{ trans('common.to_safari.2') }}<br>{{ trans('common.to_safari.3') }}
+                </p>
             </div>
         </div>
     @endif
@@ -76,27 +78,27 @@
                     <div class="panel-heading">
                         <div class="panel-title">
                             <div class="brand">
-                                <img src="{{sysConfig('website_home_logo')? asset(sysConfig('website_home_logo')) :'/assets/images/logo.png'}}" class="brand-img" alt="logo"/>
-                                <h1 class="brand-text">{{sysConfig('website_name')}}</h1>
+                                <img class="brand-img"
+                                     src="{{ sysConfig('website_home_logo') ? asset(sysConfig('website_home_logo')) : '/assets/images/logo.png' }}"
+                                     alt="logo" />
+                                <h1 class="brand-text">{{ sysConfig('website_name') }}</h1>
                             </div>
                         </div>
                         <div class="ribbon ribbon-reverse ribbon-info ribbon-clip">
                             <button class="ribbon-inner btn dropdown-toggle pt-0" id="language" data-toggle="dropdown" aria-expanded="false">
                                 <i class="font-size-20 wb-globe" aria-hidden="true"></i>
                             </button>
-                            <div class="dropdown-menu dropdown-menu-bullet" aria-labelledby="language" role="menu">
+                            <div class="dropdown-menu dropdown-menu-bullet" role="menu" aria-labelledby="language">
                                 @foreach (config('common.language') as $key => $value)
-                                    <a class="dropdown-item" href="{{route('lang', ['locale' => $key])}}" role="menuitem">
-                                        <i class="fi fi-{{$value[1]}}" aria-hidden="true"></i>
-                                        <span style="padding: inherit;">{{$value[0]}}</span>
+                                    <a class="dropdown-item" href="{{ route('lang', ['locale' => $key]) }}" role="menuitem">
+                                        <i class="fi fi-{{ $value[1] }}" aria-hidden="true"></i>
+                                        <span style="padding: inherit;">{{ $value[0] }}</span>
                                     </a>
                                 @endforeach
                             </div>
                         </div>
                     </div>
                     <div class="panel-body">
-                        <!--[if lt IE 8]><p class="browserupgrade">{{trans('common.update_browser.0')}}<strong>{{trans('common.update_browser.1')}}</strong>
-{{trans('common.update_browser.2')}}<a href="https://browsehappy.com/" target="_blank">{{trans('common.update_browser.3')}}</a>{{trans('common.update_browser.4')}}</p><![endif]-->
                         @yield('content')
                     </div>
                 </div>
@@ -109,6 +111,31 @@
     <script src="/assets/global/vendor/jquery-placeholder/jquery.placeholder.min.js"></script>
     <script src="/assets/global/js/Plugin/jquery-placeholder.js"></script>
     <script src="/assets/global/js/Plugin/material.js"></script>
+    <script>
+        const $buoop = {
+            required: {
+                e: 11,
+                f: -6,
+                o: -6,
+                s: -6,
+                c: -6
+            },
+            insecure: true,
+            unsupported: true,
+            api: 2024.07,
+        }
+
+        function $buo_f() {
+            const e = document.createElement('script')
+            e.src = "//browser-update.org/update.min.js";
+            document.body.appendChild(e);
+        }
+        try {
+            document.addEventListener("DOMContentLoaded", $buo_f, false)
+        } catch (e) {
+            window.attachEvent("onload", $buo_f)
+        }
+    </script>
     @yield('javascript')
     <!-- 统计 -->
     {!! sysConfig('website_analytics') !!}

+ 13 - 10
resources/views/components/chat-unit.blade.php

@@ -1,12 +1,15 @@
-<div class="chat
-@if (isset($ticket->admin_id) && $ticket->admin_id !== $user->id)
-    chat-left
-@elseif(isset($ticket->user_id) && !isset($ticket->admin_id)  && $ticket->user_id !== $user->id)
-    chat-left
-@endif">
+@php
+    $isChatLeft =
+        (isset($ticket->admin_id) && $ticket->admin_id !== $user->id) ||
+        (isset($ticket->user_id) && !isset($ticket->admin_id) && $ticket->user_id !== $user->id);
+    $chatUser = $ticket->admin ?? $ticket->user;
+@endphp
+
+<div class="chat {{ $isChatLeft ? 'chat-left' : '' }}">
     <div class="chat-avatar">
-        <p class="avatar" data-toggle="tooltip" href="#" data-placement="right" title="" data-original-title="{{($ticket->admin ?? $ticket->user)->username}}">
-            <img src="{{($ticket->admin ?? $ticket->user)->avatar}}" alt="{{trans('common.avatar')}}"/>
+        <p class="avatar" data-toggle="tooltip" data-placement="right" data-original-title="{{ $chatUser->username }}" title="">
+            <img data-uid="{{ $chatUser->id }}" data-qq="{{ $chatUser->qq }}" data-username="{{ $chatUser->username }}" src=""
+                 alt="{{ trans('common.avatar') }}" loading="lazy" />
         </p>
     </div>
     <div class="chat-body">
@@ -14,8 +17,8 @@
             <p>
                 {!! $ticket->content !!}
             </p>
-            <time class="chat-time" datetime="{{$ticket->created_at}}">
-                {{($ticket->ticket && $ticket->ticket->status === 2) || $ticket->status === 2 ? $ticket->created_at : $ticket->created_at->diffForHumans()}}
+            <time class="chat-time" datetime="{{ $ticket->created_at }}">
+                {{ ($ticket->ticket && $ticket->ticket->status === 2) || $ticket->status === 2 ? $ticket->created_at : $ticket->created_at->diffForHumans() }}
             </time>
         </div>
     </div>

+ 2 - 1
resources/views/user/layouts.blade.php

@@ -70,7 +70,8 @@
                     <li class="nav-item dropdown">
                         <a class="nav-link navbar-avatar" data-animation="scale-up" data-toggle="dropdown" href="#" role="button" aria-expanded="false">
                             <span class="avatar avatar-online">
-                            <img src="{{Auth::getUser()->avatar}}" alt="{{trans('common.avatar')}}"/><i></i>
+                                <img data-uid="{{ Auth::getUser()->id }}" data-qq="{{ Auth::getUser()->qq }}" data-username="{{ Auth::getUser()->username }}"
+                                     src="" alt="{{ trans('common.avatar') }}" loading="lazy" />
                             </span>
                         </a>
                         <div class="dropdown-menu" role="menu">

+ 56 - 45
resources/views/user/profile.blade.php

@@ -24,43 +24,49 @@
                 <div class="user-info card card-shadow text-center">
                     <div class="user-base card-block">
                         <a class="avatar img-bordered avatar-100" href="javascript:void(0)">
-                            <img src="{{Auth::getUser()->avatar}}" alt="{{trans('common.avatar')}}"/>
+                            <img data-uid="{{ Auth::getUser()->id }}" data-qq="{{ Auth::getUser()->qq }}" data-username="{{ Auth::getUser()->username }}"
+                                 src="" alt="{{ trans('common.avatar') }}" loading="lazy" />
                         </a>
-                        <h4 class="user-name">{{Auth::getUser()->nickname}}</h4>
+                        <h4 class="user-name">{{ Auth::getUser()->nickname }}</h4>
                         <p class="user-job">
                             <i class="fa-brands fa-weixin fa-lg mr-10" aria-hidden="true"></i>
-                            {{trans('model.user.wechat')}}: {{Auth::getUser()->wechat ?? trans('common.none')}}</p>
+                            {{ trans('model.user.wechat') }}: {{ Auth::getUser()->wechat ?? trans('common.none') }}
+                        </p>
                         <p class="user-location"><i class="fa-brands fa-qq fa-lg mr-10" aria-hidden="true"></i> QQ:
-                            @if(Auth::getUser()->qq)
-                                {{Auth::getUser()->qq}}
+                            @if (Auth::getUser()->qq)
+                                {{ Auth::getUser()->qq }}
                             @else
-                                {{trans('common.none')}}
-                            @endif</p>
+                                {{ trans('common.none') }}
+                            @endif
+                        </p>
                     </div>
-                    @if(sysConfig('oauth_path'))
+                    @if (sysConfig('oauth_path'))
                         <div class="line">
-                            <span> {{trans('user.oauth.bind_title')}} </span>
+                            <span> {{ trans('user.oauth.bind_title') }} </span>
                         </div>
                         <div class="user-socials list-group-gap list-group-full row m-0">
                             @foreach (json_decode(sysConfig('oauth_path'), false) as $provider)
                                 <a class="list-group-item offset-lg-1 col-lg-8 col-10 d-flex justify-content-around align-items-center"
-                                   @if($provider !== 'telegram') href="{{route('oauth.route', ['provider' => $provider, 'operation' => 'bind'])}}" @endif>
+                                   @if ($provider !== 'telegram') href="{{ route('oauth.route', ['provider' => $provider, 'operation' => 'bind']) }}" @endif>
                                     <span>
-                                        <i class="fa-brands {{ config('common.oauth.icon')[$provider] }} fa-lg mr-2" aria-hidden="true"></i> {{ config('common.oauth.labels')[$provider] }}:
+                                        <i class="fa-brands {{ config('common.oauth.icon')[$provider] }} fa-lg mr-2" aria-hidden="true"></i>
+                                        {{ config('common.oauth.labels')[$provider] }}:
                                     </span>
                                     <span>
-                                        @if(in_array($provider, $auth, true))
-                                            <span class="text-danger">{{trans('user.oauth.rebind')}}</span>
+                                        @if (in_array($provider, $auth, true))
+                                            <span class="text-danger">{{ trans('user.oauth.rebind') }}</span>
                                         @else
-                                            <span class="text-muted">{{trans('user.oauth.not_bind')}}</span>
+                                            <span class="text-muted">{{ trans('user.oauth.not_bind') }}</span>
                                         @endif
-                                        @if($provider === 'telegram')
-                                            <script async src="https://telegram.org/js/telegram-widget.js?22" data-telegram-login="{{config('services.telegram.bot')}}" data-size="medium" data-userpic="false" data-auth-url="{{route('oauth.bind', ['provider' => $provider])}}" data-request-access="write"></script>
+                                        @if ($provider === 'telegram')
+                                            <script async src="https://telegram.org/js/telegram-widget.js?22" data-telegram-login="{{ config('services.telegram.bot') }}" data-size="medium"
+                                                    data-userpic="false" data-auth-url="{{ route('oauth.bind', ['provider' => $provider]) }}" data-request-access="write"></script>
                                         @endif
                                     </span>
                                 </a>
-                                @if(in_array($provider, $auth, true))
-                                    <a class="col-2 btn btn-danger btn-block my-auto" href="{{route('oauth.unbind', ['provider' => $provider])}}">{{trans('user.oauth.unbind')}}</a>
+                                @if (in_array($provider, $auth, true))
+                                    <a class="col-2 btn btn-danger btn-block my-auto"
+                                       href="{{ route('oauth.unbind', ['provider' => $provider]) }}">{{ trans('user.oauth.unbind') }}</a>
                                 @endif
                             @endforeach
                         </div>
@@ -70,69 +76,74 @@
             <div class="col-lg-7">
                 <div class="panel">
                     @if (Session::has('successMsg'))
-                        <x-alert type="success" :message="Session::pull('successMsg')"/>
+                        <x-alert type="success" :message="Session::pull('successMsg')" />
                     @endif
-                    @if($errors->any())
-                        <x-alert type="danger" :message="$errors->all()"/>
+                    @if ($errors->any())
+                        <x-alert type="danger" :message="$errors->all()" />
                     @endif
                     <div class="panel-body nav-tabs-animate nav-tabs-horizontal" data-plugin="tabs">
                         <ul class="nav nav-tabs nav-tabs-line" role="tablist">
                             <li class="nav-item" role="presentation">
-                                <a class="active nav-link" data-toggle="tab" href="#tab_1" aria-controls="tab_1" role="tab">{{trans('validation.attributes.password')}}</a>
+                                <a class="active nav-link" data-toggle="tab" href="#account" role="tab"
+                                   aria-controls="account">{{ trans('validation.attributes.password') }}</a>
                             </li>
                             <li class="nav-item" role="presentation">
-                                <a class="nav-link" data-toggle="tab" href="#tab_2" aria-controls="tab_2" role="tab">{{trans('user.contact')}}</a>
+                                <a class="nav-link" data-toggle="tab" href="#contact" role="tab" aria-controls="contact">{{ trans('user.contact') }}</a>
                             </li>
                             <li class="nav-item" role="presentation">
-                                <a class="nav-link" data-toggle="tab" href="#tab_3" aria-controls="tab_3" role="tab">{{trans('user.node.setting')}}</a>
+                                <a class="nav-link" data-toggle="tab" href="#proxy" role="tab" aria-controls="proxy">{{ trans('user.node.setting') }}</a>
                             </li>
                         </ul>
                         <div class="tab-content py-10">
-                            <div class="tab-pane active animation-slide-left" id="tab_1" role="tabpanel">
-                                <form action="{{route('profile')}}" method="post" enctype="multipart/form-data" class="form-horizontal" autocomplete="off">
+                            <div class="tab-pane active animation-slide-left" id="account" role="tabpanel">
+                                <form class="form-horizontal" action="{{ route('profile') }}" method="post" enctype="multipart/form-data" autocomplete="off">
                                     @csrf
                                     <div class="form-group row">
-                                        <label for="password" class="col-md-5 col-form-label">{{trans('auth.password.original')}}</label>
-                                        <input type="password" class="form-control col-md-6 round" name="password" id="password" autofocus required/>
+                                        <label class="col-md-5 col-form-label" for="password">{{ trans('auth.password.original') }}</label>
+                                        <input class="form-control col-md-6 round" id="password" name="password" type="password" autofocus required />
                                     </div>
                                     <div class="form-group row">
-                                        <label for="new_password" class="col-md-5  col-form-label">{{trans('auth.password.new')}}</label>
-                                        <input type="password" class="form-control col-md-6 round" name="new_password" id="new_password" required/>
+                                        <label class="col-md-5  col-form-label" for="new_password">{{ trans('auth.password.new') }}</label>
+                                        <input class="form-control col-md-6 round" id="new_password" name="new_password" type="password" required />
                                     </div>
                                     <div class="form-actions">
-                                        <button type="submit" class="btn btn-info">{{trans('common.submit')}}</button>
+                                        <button class="btn btn-info float-right" type="submit">{{ trans('common.submit') }}</button>
                                     </div>
                                 </form>
                             </div>
-                            <div class="tab-pane animation-slide-left" id="tab_2" role="tabpanel">
-                                <form action="{{route('profile')}}" method="post" enctype="multipart/form-data" class="form-horizontal">
+                            <div class="tab-pane animation-slide-left" id="contact" role="tabpanel">
+                                <form class="form-horizontal" action="{{ route('profile') }}" method="post" enctype="multipart/form-data">
                                     @csrf
                                     <div class="form-group row">
-                                        <label for="nickname" class="col-md-5 col-form-label">{{trans('model.user.nickname')}}</label>
-                                        <input type="text" class="form-control col-md-6 round" name="nickname" id="nickname" value="{{Auth::getUser()->nickname}}"/>
+                                        <label class="col-md-5 col-form-label" for="nickname">{{ trans('model.user.nickname') }}</label>
+                                        <input class="form-control col-md-6 round" id="nickname" name="nickname" type="text"
+                                               value="{{ Auth::getUser()->nickname }}" />
                                     </div>
                                     <div class="form-group row">
-                                        <label for="wechat" class="col-md-5 col-form-label">{{trans('model.user.wechat')}}</label>
-                                        <input type="text" class="form-control col-md-6 round" name="wechat" id="wechat" value="{{Auth::getUser()->wechat}}"/>
+                                        <label class="col-md-5 col-form-label" for="wechat">{{ trans('model.user.wechat') }}</label>
+                                        <input class="form-control col-md-6 round" id="wechat" name="wechat" type="text"
+                                               value="{{ Auth::getUser()->wechat }}" />
                                     </div>
                                     <div class="form-group row">
-                                        <label for="qq" class="col-md-5 col-form-label">{{trans('model.user.qq')}}</label>
-                                        <input type="number" class="form-control col-md-6 round" name="qq" id="qq" value="{{Auth::getUser()->qq}}"/>
+                                        <label class="col-md-5 col-form-label" for="qq">{{ trans('model.user.qq') }}</label>
+                                        <input class="form-control col-md-6 round" id="qq" name="qq" type="number"
+                                               value="{{ Auth::getUser()->qq }}" />
                                     </div>
                                     <div class="form-actions">
-                                        <button type="submit" class="btn btn-info">{{trans('common.submit')}}</button>
+                                        <button class="btn btn-info float-right" type="submit">{{ trans('common.submit') }}</button>
                                     </div>
                                 </form>
                             </div>
-                            <div class="tab-pane animation-slide-left" id="tab_3" role="tabpanel">
-                                <form action="{{route('profile')}}" method="post" enctype="multipart/form-data" class="form-horizontal">
+                            <div class="tab-pane animation-slide-left" id="proxy" role="tabpanel">
+                                <form class="form-horizontal" action="{{ route('profile') }}" method="post" enctype="multipart/form-data">
                                     @csrf
                                     <div class="form-group row">
-                                        <label for="passwd" class="col-md-5 col-form-label"> {{trans('user.account.connect_password')}} </label>
-                                        <input type="text" class="form-control col-md-5 round" name="passwd" id="passwd" value="{{Auth::getUser()->passwd}}" required/>
+                                        <label class="col-md-5 col-form-label" for="passwd"> {{ trans('user.account.connect_password') }} </label>
+                                        <input class="form-control col-md-5 round" id="passwd" name="passwd" type="text"
+                                               value="{{ Auth::getUser()->passwd }}" required />
                                     </div>
                                     <div class="form-actions">
-                                        <button type="submit" class="btn btn-info"> {{trans('common.submit')}} </button>
+                                        <button class="btn btn-info float-right" type="submit"> {{ trans('common.submit') }} </button>
                                     </div>
                                 </form>
                             </div>

+ 2 - 0
routes/user.php

@@ -3,6 +3,7 @@
 use App\Http\Controllers\PaymentController;
 use App\Http\Controllers\User\AffiliateController;
 use App\Http\Controllers\UserController;
+use App\Utils\Avatar;
 use App\Utils\Payments\Manual;
 use App\Utils\Payments\Stripe;
 
@@ -49,6 +50,7 @@ Route::prefix('pay')->group(function () {
     Route::get('/stripe/{session_id}', [Stripe::class, 'redirectPage'])->name('stripe.checkout'); // Stripe Checkout page
 });
 
+Route::get('avatar', [Avatar::class, 'getAvatar'])->name('getAvatar'); // 获取随机头像
 Route::get('create/string', [Str::class, 'random'])->name('createStr'); // 生成随机密码
 Route::get('create/uuid', [Str::class, 'uuid'])->name('createUUID'); // 生成UUID
 Route::get('getPort', [Helpers::class, 'getPort'])->name('getPort'); // 获取端口

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است