1
0
Эх сурвалжийг харах

Merge pull request #2210 from sspanel-uim/dev

Dev 20231021
M1Screw 2 жил өмнө
parent
commit
b4494d7d40
98 өөрчлөгдсөн 4898 нэмэгдсэн , 4136 устгасан
  1. 2 2
      .gitignore
  2. 26 28
      composer.lock
  3. 25 20
      resources/email/finance.tpl
  4. 9 4
      resources/email/footer.tpl
  5. 26 26
      resources/email/header.tpl
  6. 25 20
      resources/email/new_user.tpl
  7. 27 22
      resources/email/password_reset.tpl
  8. 25 20
      resources/email/test.tpl
  9. 39 34
      resources/email/traffic_report.tpl
  10. 27 22
      resources/email/verify_code.tpl
  11. 25 20
      resources/email/warn.tpl
  12. 10 10
      resources/views/tabler/admin/announcement/create.tpl
  13. 9 9
      resources/views/tabler/admin/announcement/edit.tpl
  14. 17 12
      resources/views/tabler/admin/announcement/index.tpl
  15. 27 21
      resources/views/tabler/admin/coupon.tpl
  16. 25 19
      resources/views/tabler/admin/detect.tpl
  17. 12 12
      resources/views/tabler/admin/docs/create.tpl
  18. 9 9
      resources/views/tabler/admin/docs/edit.tpl
  19. 17 12
      resources/views/tabler/admin/docs/index.tpl
  20. 4 4
      resources/views/tabler/admin/footer.tpl
  21. 24 18
      resources/views/tabler/admin/giftcard.tpl
  22. 212 210
      resources/views/tabler/admin/header.tpl
  23. 2 2
      resources/views/tabler/admin/index.tpl
  24. 14 9
      resources/views/tabler/admin/invoice/index.tpl
  25. 23 22
      resources/views/tabler/admin/invoice/view.tpl
  26. 10 8
      resources/views/tabler/admin/log/detect.tpl
  27. 10 8
      resources/views/tabler/admin/log/detect_ban.tpl
  28. 10 8
      resources/views/tabler/admin/log/gateway.tpl
  29. 27 22
      resources/views/tabler/admin/log/invite.tpl
  30. 10 8
      resources/views/tabler/admin/log/login.tpl
  31. 10 8
      resources/views/tabler/admin/log/money.tpl
  32. 10 8
      resources/views/tabler/admin/log/online.tpl
  33. 10 8
      resources/views/tabler/admin/log/subscribe.tpl
  34. 10 8
      resources/views/tabler/admin/log/traffic.tpl
  35. 9 8
      resources/views/tabler/admin/node/create.tpl
  36. 17 14
      resources/views/tabler/admin/node/edit.tpl
  37. 19 14
      resources/views/tabler/admin/node/index.tpl
  38. 19 14
      resources/views/tabler/admin/order/index.tpl
  39. 54 53
      resources/views/tabler/admin/order/view.tpl
  40. 31 36
      resources/views/tabler/admin/product/create.tpl
  41. 45 47
      resources/views/tabler/admin/product/edit.tpl
  42. 19 14
      resources/views/tabler/admin/product/index.tpl
  43. 284 247
      resources/views/tabler/admin/setting/billing.tpl
  44. 146 113
      resources/views/tabler/admin/setting/captcha.tpl
  45. 177 142
      resources/views/tabler/admin/setting/cron.tpl
  46. 335 281
      resources/views/tabler/admin/setting/email.tpl
  47. 164 123
      resources/views/tabler/admin/setting/feature.tpl
  48. 528 412
      resources/views/tabler/admin/setting/im.tpl
  49. 123 101
      resources/views/tabler/admin/setting/ref.tpl
  50. 197 160
      resources/views/tabler/admin/setting/reg.tpl
  51. 110 81
      resources/views/tabler/admin/setting/sub.tpl
  52. 126 99
      resources/views/tabler/admin/setting/support.tpl
  53. 24 23
      resources/views/tabler/admin/system.tpl
  54. 18 13
      resources/views/tabler/admin/ticket/index.tpl
  55. 34 31
      resources/views/tabler/admin/ticket/view.tpl
  56. 43 43
      resources/views/tabler/admin/user/edit.tpl
  57. 25 19
      resources/views/tabler/admin/user/index.tpl
  58. 105 104
      resources/views/tabler/auth/login.tpl
  59. 143 140
      resources/views/tabler/auth/register.tpl
  60. 13 13
      resources/views/tabler/gateway/epay.tpl
  61. 7 4
      resources/views/tabler/gateway/stripe.tpl
  62. 6 6
      resources/views/tabler/header.tpl
  63. 7 7
      resources/views/tabler/index.tpl
  64. 104 88
      resources/views/tabler/live_chat.tpl
  65. 82 81
      resources/views/tabler/password/reset.tpl
  66. 50 50
      resources/views/tabler/password/token.tpl
  67. 13 13
      resources/views/tabler/user/announcement.tpl
  68. 6 6
      resources/views/tabler/user/banned.tpl
  69. 11 11
      resources/views/tabler/user/detect/index.tpl
  70. 12 12
      resources/views/tabler/user/detect/log.tpl
  71. 13 13
      resources/views/tabler/user/docs/index.tpl
  72. 205 182
      resources/views/tabler/user/edit.tpl
  73. 4 4
      resources/views/tabler/user/footer.tpl
  74. 139 138
      resources/views/tabler/user/header.tpl
  75. 126 114
      resources/views/tabler/user/index.tpl
  76. 20 17
      resources/views/tabler/user/invite.tpl
  77. 19 14
      resources/views/tabler/user/invoice/index.tpl
  78. 110 110
      resources/views/tabler/user/invoice/view.tpl
  79. 16 14
      resources/views/tabler/user/money.tpl
  80. 42 40
      resources/views/tabler/user/order/create.tpl
  81. 19 14
      resources/views/tabler/user/order/index.tpl
  82. 41 41
      resources/views/tabler/user/order/view.tpl
  83. 55 20
      resources/views/tabler/user/product.tpl
  84. 11 11
      resources/views/tabler/user/profile.tpl
  85. 14 14
      resources/views/tabler/user/server.tpl
  86. 13 13
      resources/views/tabler/user/subscribe_log.tpl
  87. 20 18
      resources/views/tabler/user/ticket/index.tpl
  88. 26 24
      resources/views/tabler/user/ticket/view.tpl
  89. 0 1
      src/Controllers/WebAPI/NodeController.php
  90. 0 2
      src/Controllers/WebAPI/UserController.php
  91. 103 0
      src/Services/DynamicRate.php
  92. 5 5
      src/Services/Gateway/Epay.php
  93. 6 12
      src/Services/Gateway/Epay/EpayNotify.php
  94. 13 13
      src/Services/Gateway/Epay/EpaySubmit.php
  95. 2 2
      src/Services/Gateway/Epay/EpayTool.php
  96. 1 2
      src/Services/Subscribe/Clash.php
  97. 1 2
      src/Services/Subscribe/SingBox.php
  98. 0 0
      storage/framework/twig/.gitkeep

+ 2 - 2
.gitignore

@@ -28,11 +28,11 @@ public/clients/*.*
 
 storage/framework/smarty/cache/*
 storage/framework/smarty/compile/*
-storage/framework/views/*
+storage/framework/twig/*
 storage/*.*
 !storage/framework/smarty/cache/.gitkeep
 !storage/framework/smarty/compile/.gitkeep
-!storage/framework/views/.gitkeep
+!storage/framework/twig/.gitkeep
 
 .user.ini
 public/.user.ini

+ 26 - 28
composer.lock

@@ -123,16 +123,16 @@
         },
         {
             "name": "aws/aws-sdk-php",
-            "version": "3.283.2",
+            "version": "3.283.8",
             "source": {
                 "type": "git",
                 "url": "https://github.com/aws/aws-sdk-php.git",
-                "reference": "6616677d76e39af28138512740199d38a461859f"
+                "reference": "0f73ec85852312a6e971cfe2eebfd7c8091cca34"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/6616677d76e39af28138512740199d38a461859f",
-                "reference": "6616677d76e39af28138512740199d38a461859f",
+                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/0f73ec85852312a6e971cfe2eebfd7c8091cca34",
+                "reference": "0f73ec85852312a6e971cfe2eebfd7c8091cca34",
                 "shasum": ""
             },
             "require": {
@@ -212,9 +212,9 @@
             "support": {
                 "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
                 "issues": "https://github.com/aws/aws-sdk-php/issues",
-                "source": "https://github.com/aws/aws-sdk-php/tree/3.283.2"
+                "source": "https://github.com/aws/aws-sdk-php/tree/3.283.8"
             },
-            "time": "2023-10-06T18:09:54+00:00"
+            "time": "2023-10-19T19:26:52+00:00"
         },
         {
             "name": "bacon/bacon-qr-code",
@@ -4840,16 +4840,16 @@
         },
         {
             "name": "stripe/stripe-php",
-            "version": "v12.7.0",
+            "version": "v12.8.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/stripe/stripe-php.git",
-                "reference": "01a4a316d7c724fd1a111f36f037b698ca425f2c"
+                "reference": "6b6f4a775ad46fee4b1df2df4fdfa574365b1621"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/stripe/stripe-php/zipball/01a4a316d7c724fd1a111f36f037b698ca425f2c",
-                "reference": "01a4a316d7c724fd1a111f36f037b698ca425f2c",
+                "url": "https://api.github.com/repos/stripe/stripe-php/zipball/6b6f4a775ad46fee4b1df2df4fdfa574365b1621",
+                "reference": "6b6f4a775ad46fee4b1df2df4fdfa574365b1621",
                 "shasum": ""
             },
             "require": {
@@ -4893,9 +4893,9 @@
             ],
             "support": {
                 "issues": "https://github.com/stripe/stripe-php/issues",
-                "source": "https://github.com/stripe/stripe-php/tree/v12.7.0"
+                "source": "https://github.com/stripe/stripe-php/tree/v12.8.0"
             },
-            "time": "2023-10-11T17:29:55+00:00"
+            "time": "2023-10-16T18:04:12+00:00"
         },
         {
             "name": "symfony/deprecation-contracts",
@@ -7050,16 +7050,16 @@
         },
         {
             "name": "friendsofphp/php-cs-fixer",
-            "version": "v3.34.1",
+            "version": "v3.35.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
-                "reference": "98bf1b1068b4ceddbbc2a2b70b67a5e380add9e3"
+                "reference": "ec1ccc264994b6764882669973ca435cf05bab08"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/98bf1b1068b4ceddbbc2a2b70b67a5e380add9e3",
-                "reference": "98bf1b1068b4ceddbbc2a2b70b67a5e380add9e3",
+                "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/ec1ccc264994b6764882669973ca435cf05bab08",
+                "reference": "ec1ccc264994b6764882669973ca435cf05bab08",
                 "shasum": ""
             },
             "require": {
@@ -7092,8 +7092,6 @@
                 "phpspec/prophecy": "^1.16",
                 "phpspec/prophecy-phpunit": "^2.0",
                 "phpunit/phpunit": "^9.5",
-                "phpunitgoodpractices/polyfill": "^1.6",
-                "phpunitgoodpractices/traits": "^1.9.2",
                 "symfony/phpunit-bridge": "^6.2.3",
                 "symfony/yaml": "^5.4 || ^6.0"
             },
@@ -7133,7 +7131,7 @@
             ],
             "support": {
                 "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
-                "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.34.1"
+                "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.35.1"
             },
             "funding": [
                 {
@@ -7141,7 +7139,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2023-10-03T23:51:05+00:00"
+            "time": "2023-10-12T13:47:26+00:00"
         },
         {
             "name": "justinrainbow/json-schema",
@@ -7412,16 +7410,16 @@
         },
         {
             "name": "nunomaduro/phpinsights",
-            "version": "v2.8.0",
+            "version": "v2.9.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/nunomaduro/phpinsights.git",
-                "reference": "a701b7acfda9940ef0140c7276319df9026824c4"
+                "reference": "52d69d895239b1e9a90d7212dffc6c7e73ec822e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/nunomaduro/phpinsights/zipball/a701b7acfda9940ef0140c7276319df9026824c4",
-                "reference": "a701b7acfda9940ef0140c7276319df9026824c4",
+                "url": "https://api.github.com/repos/nunomaduro/phpinsights/zipball/52d69d895239b1e9a90d7212dffc6c7e73ec822e",
+                "reference": "52d69d895239b1e9a90d7212dffc6c7e73ec822e",
                 "shasum": ""
             },
             "require": {
@@ -7439,8 +7437,8 @@
                 "psr/container": "^1.0|^2.0",
                 "psr/simple-cache": "^1.0|^2.0|^3.0",
                 "sebastian/diff": "^4.0|^5.0",
-                "slevomat/coding-standard": "^7.0.8|^8.0",
-                "squizlabs/php_codesniffer": "^3.5",
+                "slevomat/coding-standard": "^8.13",
+                "squizlabs/php_codesniffer": "^3.7",
                 "symfony/cache": "^4.4|^5.0|^6.0",
                 "symfony/console": "^4.2.12|^5.0|^6.0",
                 "symfony/finder": "^4.2.12|^5.0|^6.0",
@@ -7498,7 +7496,7 @@
             ],
             "support": {
                 "issues": "https://github.com/nunomaduro/phpinsights/issues",
-                "source": "https://github.com/nunomaduro/phpinsights/tree/v2.8.0"
+                "source": "https://github.com/nunomaduro/phpinsights/tree/v2.9.0"
             },
             "funding": [
                 {
@@ -7514,7 +7512,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2023-03-18T18:38:03+00:00"
+            "time": "2023-10-20T15:58:50+00:00"
         },
         {
             "name": "phar-io/manifest",

+ 25 - 20
resources/email/finance.tpl

@@ -1,30 +1,35 @@
 {include file='header.tpl'}
 
 <body style="background-color:#EEEEEE;">
-    <div style="text-align: center">
-        <div border="0" cellpadding="0" cellspacing="0" width="100%" style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
-            <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
-                <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
-                    <div align="center" valign="top">
-                        <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
-                            <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
-                                <h2 class="bigTitle">
-                                    {$title}
-                                </h2>
-                            </div>
+<div style="text-align: center">
+    <div border="0" cellpadding="0" cellspacing="0" width="100%"
+         style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
+        <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
+            <div border="0" cellpadding="0" cellspacing="0"
+                 style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
+                        <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
+                            <h2 class="bigTitle">
+                                {$title}
+                            </h2>
                         </div>
                     </div>
                 </div>
-                <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%" class="wrapperTable">
-                    <div align="center" valign="top">
-                        <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%" class="oneColumn">
-                            <div align="center" valign="top" style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
-                                <p class="midText">
-                                    {$text}
-                                </p>
-                            </div>
+            </div>
+            <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%"
+                 class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%"
+                         class="oneColumn">
+                        <div align="center" valign="top"
+                             style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
+                            <p class="midText">
+                                {$text}
+                            </p>
                         </div>
                     </div>
                 </div>
+            </div>
 
-{include file='footer.tpl'}
+            {include file='footer.tpl'}

+ 9 - 4
resources/email/footer.tpl

@@ -1,11 +1,16 @@
-<div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%" class="wrapperTable">
+<div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%"
+     class="wrapperTable">
     <div align="center" valign="top">
         <div border="0" cellpadding="0" cellspacing="0" width="100%" class="footer">
             <div>
-                <div align="center" valign="top" style="padding-top:15px;padding-bottom:30px;padding-left:10px;padding-right:10px;" class="brandInfo">
+                <div align="center" valign="top"
+                     style="padding-top:15px;padding-bottom:30px;padding-left:10px;padding-right:10px;"
+                     class="brandInfo">
                     <p class="smlText">
-                        <a href="{$config['baseUrl']}" style="color:#505050;text-decoration:none" target="_blank">{$config['appName']}</a> |
-                        <a href="{$config['baseUrl']}/user/edit" style="color:#505050;text-decoration:none" target="_blank">修改邮件接收设置</a>
+                        <a href="{$config['baseUrl']}" style="color:#505050;text-decoration:none"
+                           target="_blank">{$config['appName']}</a> |
+                        <a href="{$config['baseUrl']}/user/edit" style="color:#505050;text-decoration:none"
+                           target="_blank">修改邮件接收设置</a>
                     </p>
                 </div>
             </div>

+ 26 - 26
resources/email/header.tpl

@@ -8,38 +8,38 @@
 
     <style>
         .bigTitle {
-            color:#000000;
-            font-family:'Open Sans', Tahoma, Verdana, sans-serif;
-            font-size:24px;
-            font-weight:600;
-            font-style:normal;
-            letter-spacing:normal;
-            line-height:34px;
-            text-align:center;
-            padding:0;
-            margin:0;
+            color: #000000;
+            font-family: 'Open Sans', Tahoma, Verdana, sans-serif;
+            font-size: 24px;
+            font-weight: 600;
+            font-style: normal;
+            letter-spacing: normal;
+            line-height: 34px;
+            text-align: center;
+            padding: 0;
+            margin: 0;
         }
 
         .midText {
-            color:#000000 !important;
-            font-family:'Open Sans', Tahoma, Verdana, sans-serif !important;
-            font-size:16px !important;
-            font-weight:400 !important;
-            line-height:22px !important;
-            text-align:center !important;
-            padding:0 !important;
-            margin:0 !important;
+            color: #000000 !important;
+            font-family: 'Open Sans', Tahoma, Verdana, sans-serif !important;
+            font-size: 16px !important;
+            font-weight: 400 !important;
+            line-height: 22px !important;
+            text-align: center !important;
+            padding: 0 !important;
+            margin: 0 !important;
         }
 
         .smlText {
-            color:#313131;
-            font-family:'Open Sans', Tahoma, Verdana, sans-serif;
-            font-size:12px;
-            font-weight:400;
-            line-height:18px;
-            text-align:center;
-            margin:0;
-            padding:0;
+            color: #313131;
+            font-family: 'Open Sans', Tahoma, Verdana, sans-serif;
+            font-size: 12px;
+            font-weight: 400;
+            line-height: 18px;
+            text-align: center;
+            margin: 0;
+            padding: 0;
         }
     </style>
 </head>

+ 25 - 20
resources/email/new_user.tpl

@@ -1,30 +1,35 @@
 {include file='header.tpl'}
 
 <body style="background-color:#EEEEEE;">
-    <div style="text-align: center">
-        <div border="0" cellpadding="0" cellspacing="0" width="100%" style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
-            <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
-                <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
-                    <div align="center" valign="top">
-                        <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
-                            <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
-                                <h2 class="bigTitle">
-                                    账户已经生成
-                                </h2>
-                            </div>
+<div style="text-align: center">
+    <div border="0" cellpadding="0" cellspacing="0" width="100%"
+         style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
+        <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
+            <div border="0" cellpadding="0" cellspacing="0"
+                 style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
+                        <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
+                            <h2 class="bigTitle">
+                                账户已经生成
+                            </h2>
                         </div>
                     </div>
                 </div>
-                <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%" class="wrapperTable">
-                    <div align="center" valign="top">
-                        <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%" class="oneColumn">
-                            <div align="center" valign="top" style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
-                                <p class="midText">
-                                    {$text}
-                                </p>
-                            </div>
+            </div>
+            <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%"
+                 class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%"
+                         class="oneColumn">
+                        <div align="center" valign="top"
+                             style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
+                            <p class="midText">
+                                {$text}
+                            </p>
                         </div>
                     </div>
                 </div>
+            </div>
 
-{include file='footer.tpl'}
+            {include file='footer.tpl'}

+ 27 - 22
resources/email/password_reset.tpl

@@ -1,32 +1,37 @@
 {include file='header.tpl'}
 
 <body style="background-color:#EEEEEE;">
-    <div style="text-align: center">
-        <div border="0" cellpadding="0" cellspacing="0" width="100%" style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
-            <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
-                <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
-                    <div align="center" valign="top">
-                        <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
-                            <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
-                                <h2 class="bigTitle">
-                                    密码重置
-                                </h2>
-                            </div>
+<div style="text-align: center">
+    <div border="0" cellpadding="0" cellspacing="0" width="100%"
+         style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
+        <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
+            <div border="0" cellpadding="0" cellspacing="0"
+                 style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
+                        <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
+                            <h2 class="bigTitle">
+                                密码重置
+                            </h2>
                         </div>
                     </div>
                 </div>
-                <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%" class="wrapperTable">
-                    <div align="center" valign="top">
-                        <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%" class="oneColumn">
-                            <div align="center" valign="top" style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
-                                <p class="midText">
-                                    你收到此邮件是因为你在 {$config['appName']} 系统申请了密码重置,如果非本人申请,请忽略此邮件。
-                                    <br><br>
-                                    <a href="{$resetUrl}" style="color:#505050" target="_blank">点击此链接重置密码</a>
-                                </p>
-                            </div>
+            </div>
+            <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%"
+                 class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%"
+                         class="oneColumn">
+                        <div align="center" valign="top"
+                             style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
+                            <p class="midText">
+                                你收到此邮件是因为你在 {$config['appName']} 系统申请了密码重置,如果非本人申请,请忽略此邮件。
+                                <br><br>
+                                <a href="{$resetUrl}" style="color:#505050" target="_blank">点击此链接重置密码</a>
+                            </p>
                         </div>
                     </div>
                 </div>
+            </div>
 
-{include file='footer.tpl'}
+            {include file='footer.tpl'}

+ 25 - 20
resources/email/test.tpl

@@ -1,30 +1,35 @@
 {include file='header.tpl'}
 
 <body style="background-color:#EEEEEE;">
-    <div style="text-align: center">
-        <div border="0" cellpadding="0" cellspacing="0" width="100%" style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
-            <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
-                <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
-                    <div align="center" valign="top">
-                        <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
-                            <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
-                                <h2 class="bigTitle">
-                                    邮件发送测试
-                                </h2>
-                            </div>
+<div style="text-align: center">
+    <div border="0" cellpadding="0" cellspacing="0" width="100%"
+         style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
+        <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
+            <div border="0" cellpadding="0" cellspacing="0"
+                 style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
+                        <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
+                            <h2 class="bigTitle">
+                                邮件发送测试
+                            </h2>
                         </div>
                     </div>
                 </div>
-                <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%" class="wrapperTable">
-                    <div align="center" valign="top">
-                        <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%" class="oneColumn">
-                            <div align="center" valign="top" style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
-                                <p class="midText">
-                                    这是一封测试邮件。如果你能收到,说明邮件发送配置有效,可以正常工作。
-                                </p>
-                            </div>
+            </div>
+            <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%"
+                 class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%"
+                         class="oneColumn">
+                        <div align="center" valign="top"
+                             style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
+                            <p class="midText">
+                                这是一封测试邮件。如果你能收到,说明邮件发送配置有效,可以正常工作。
+                            </p>
                         </div>
                     </div>
                 </div>
+            </div>
 
-{include file='footer.tpl'}
+            {include file='footer.tpl'}

+ 39 - 34
resources/email/traffic_report.tpl

@@ -1,44 +1,49 @@
 {include file='header.tpl'}
 
 <body style="background-color:#EEEEEE;">
-    <div style="text-align: center">
-        <div border="0" cellpadding="0" cellspacing="0" width="100%" style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
-            <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
-                <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
-                    <div align="center" valign="top">
-                        <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
-                            <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
-                                <h2 class="bigTitle">
-                                    每日流量报告
-                                </h2>
-                            </div>
+<div style="text-align: center">
+    <div border="0" cellpadding="0" cellspacing="0" width="100%"
+         style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
+        <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
+            <div border="0" cellpadding="0" cellspacing="0"
+                 style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
+                        <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
+                            <h2 class="bigTitle">
+                                每日流量报告
+                            </h2>
                         </div>
                     </div>
                 </div>
-                <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%" class="wrapperTable">
-                    <div align="center" valign="top">
-                        <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%" class="oneColumn">
-                            <div align="center" valign="top" style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
-                                <p class="midText">
-                                    用户名: {$user->user_name}
-                                    <br>
-                                    Email: {$user->email}
-                                    <br><br>
-                                    总流量: {$enable_traffic}
-                                    <br>
-                                    已用流量: {$used_traffic}
-                                    <br>
-                                    剩余流量: {$unused_traffic}
-                                    <br>
-                                    今日使用流量: {$lastday_traffic}
-                                    <br><br>
-                                </p>
-                                <p class="midText">
-                                    {$text}
-                                </p>
-                            </div>
+            </div>
+            <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%"
+                 class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%"
+                         class="oneColumn">
+                        <div align="center" valign="top"
+                             style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
+                            <p class="midText">
+                                用户名: {$user->user_name}
+                                <br>
+                                Email: {$user->email}
+                                <br><br>
+                                总流量: {$enable_traffic}
+                                <br>
+                                已用流量: {$used_traffic}
+                                <br>
+                                剩余流量: {$unused_traffic}
+                                <br>
+                                今日使用流量: {$lastday_traffic}
+                                <br><br>
+                            </p>
+                            <p class="midText">
+                                {$text}
+                            </p>
                         </div>
                     </div>
                 </div>
+            </div>
 
-{include file='footer.tpl'}
+            {include file='footer.tpl'}

+ 27 - 22
resources/email/verify_code.tpl

@@ -1,32 +1,37 @@
 {include file='header.tpl'}
 
 <body style="background-color:#EEEEEE;">
-    <div style="text-align: center">
-        <div border="0" cellpadding="0" cellspacing="0" width="100%" style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
-            <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
-                <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
-                    <div align="center" valign="top">
-                        <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
-                            <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
-                                <h2 class="bigTitle">
-                                    邮箱验证
-                                </h2>
-                            </div>
+<div style="text-align: center">
+    <div border="0" cellpadding="0" cellspacing="0" width="100%"
+         style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
+        <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
+            <div border="0" cellpadding="0" cellspacing="0"
+                 style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
+                        <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
+                            <h2 class="bigTitle">
+                                邮箱验证
+                            </h2>
                         </div>
                     </div>
                 </div>
-                <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%" class="wrapperTable">
-                    <div align="center" valign="top">
-                        <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%" class="oneColumn">
-                            <div align="center" valign="top" style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
-                                <p class="midText">
-                                    你请求的邮箱验证代码为: <b style="color:#505050">{$code}</b> <br>
-                                    本验证代码在 {$expire} 前有效。<br>
-                                    如果此验证码非你本人所请求,请直接忽视。<br>
-                                </p>
-                            </div>
+            </div>
+            <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%"
+                 class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%"
+                         class="oneColumn">
+                        <div align="center" valign="top"
+                             style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
+                            <p class="midText">
+                                你请求的邮箱验证代码为: <b style="color:#505050">{$code}</b> <br>
+                                本验证代码在 {$expire} 前有效。<br>
+                                如果此验证码非你本人所请求,请直接忽视。<br>
+                            </p>
                         </div>
                     </div>
                 </div>
+            </div>
 
-{include file='footer.tpl'}
+            {include file='footer.tpl'}

+ 25 - 20
resources/email/warn.tpl

@@ -1,30 +1,35 @@
 {include file='header.tpl'}
 
 <body style="background-color:#EEEEEE;">
-    <div style="text-align: center">
-        <div border="0" cellpadding="0" cellspacing="0" width="100%" style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
-            <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
-                <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
-                    <div align="center" valign="top">
-                        <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
-                            <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
-                                <h2 class="bigTitle">
-                                    系统提示
-                                </h2>
-                            </div>
+<div style="text-align: center">
+    <div border="0" cellpadding="0" cellspacing="0" width="100%"
+         style="padding-top:30px;table-layout:fixed;background-color:#EEEEEE;" id="bodyTable">
+        <div align="center" valign="top" style="padding-right:10px;padding-left:10px;" id="bodyCell">
+            <div border="0" cellpadding="0" cellspacing="0"
+                 style="background-color:#FFFFFF;max-width:600px;text-align: center" width="100%" class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" width="100%" class="logoTable">
+                        <div align="center" valign="middle" style="padding-top:60px;padding-bottom:60px">
+                            <h2 class="bigTitle">
+                                系统提示
+                            </h2>
                         </div>
                     </div>
                 </div>
-                <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%" class="wrapperTable">
-                    <div align="center" valign="top">
-                        <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%" class="oneColumn">
-                            <div align="center" valign="top" style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
-                                <p class="midText">
-                                    {$text}
-                                </p>
-                            </div>
+            </div>
+            <div border="0" cellpadding="0" cellspacing="0" style="max-width:600px;text-align: center" width="100%"
+                 class="wrapperTable">
+                <div align="center" valign="top">
+                    <div border="0" cellpadding="0" cellspacing="0" style="background-color:#FFFFFF" width="100%"
+                         class="oneColumn">
+                        <div align="center" valign="top"
+                             style="padding-bottom:60px;padding-left:20px;padding-right:20px;" class="description">
+                            <p class="midText">
+                                {$text}
+                            </p>
                         </div>
                     </div>
                 </div>
+            </div>
 
-{include file='footer.tpl'}
+            {include file='footer.tpl'}

+ 10 - 10
resources/views/tabler/admin/announcement/create.tpl

@@ -1,6 +1,6 @@
 {include file='admin/header.tpl'}
 
-<script src="//cdnjs.cloudflare.com/ajax/libs/tinymce/6.7.0/tinymce.min.js"></script>
+<script src="//cdnjs.cloudflare.com/ajax/libs/tinymce/6.7.1/tinymce.min.js"></script>
 
 <div class="page-wrapper">
     <div class="container-xl">
@@ -48,7 +48,7 @@
                                     <span class="col-auto">
                                         <label class="form-check form-check-single form-switch">
                                             <input id="email_notify" class="form-check-input" type="checkbox"
-                                                checked="">
+                                                   checked="">
                                         </label>
                                     </span>
                                 </label>
@@ -68,13 +68,13 @@
             menubar: false,
             statusbar: false,
             plugins:
-              'advlist autolink lists link image charmap preview anchor ' +
-              'searchreplace visualblocks code fullscreen ' +
-              'insertdatetime media table wordcount',
+                'advlist autolink lists link image charmap preview anchor ' +
+                'searchreplace visualblocks code fullscreen ' +
+                'insertdatetime media table wordcount',
             toolbar: 'undo redo | formatselect | ' +
-              'bold italic backcolor link | blocks | alignleft aligncenter ' +
-              'alignright alignjustify | bullist numlist outdent indent | ' +
-              'removeformat',
+                'bold italic backcolor link | blocks | alignleft aligncenter ' +
+                'alignright alignjustify | bullist numlist outdent indent | ' +
+                'removeformat',
             content_style: 'body { font-family: -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI, Roboto, Helvetica Neue, sans-serif;font-size:   14px; -webkit-font-smoothing: antialiased; }',
             {if $user->is_dark_mode}
             skin: 'oxide-dark',
@@ -84,7 +84,7 @@
         tinyMCE.init(options);
     })
 
-    $("#create-ann").click(function() {
+    $("#create-ann").click(function () {
         $.ajax({
             url: '/admin/announcement',
             type: 'POST',
@@ -96,7 +96,7 @@
                 email_notify: $("#email_notify").is(":checked"),
                 content: tinyMCE.activeEditor.getContent(),
             },
-            success: function(data) {
+            success: function (data) {
                 if (data.ret === 1) {
                     $('#success-message').text(data.msg);
                     $('#success-dialog').modal('show');

+ 9 - 9
resources/views/tabler/admin/announcement/edit.tpl

@@ -1,6 +1,6 @@
 {include file='admin/header.tpl'}
 
-<script src="//cdnjs.cloudflare.com/ajax/libs/tinymce/6.7.0/tinymce.min.js"></script>
+<script src="//cdnjs.cloudflare.com/ajax/libs/tinymce/6.7.1/tinymce.min.js"></script>
 
 <div class="page-wrapper">
     <div class="container-xl">
@@ -47,13 +47,13 @@
             menubar: false,
             statusbar: false,
             plugins:
-              'advlist autolink lists link image charmap preview anchor ' +
-              'searchreplace visualblocks code fullscreen ' +
-              'insertdatetime media table wordcount',
+                'advlist autolink lists link image charmap preview anchor ' +
+                'searchreplace visualblocks code fullscreen ' +
+                'insertdatetime media table wordcount',
             toolbar: 'undo redo | formatselect | ' +
-              'bold italic backcolor link | blocks | alignleft aligncenter ' +
-              'alignright alignjustify | bullist numlist outdent indent | ' +
-              'removeformat',
+                'bold italic backcolor link | blocks | alignleft aligncenter ' +
+                'alignright alignjustify | bullist numlist outdent indent | ' +
+                'removeformat',
             content_style: 'body { font-family: -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI, Roboto, Helvetica Neue, sans-serif;   font-size:   14px; -webkit-font-smoothing: antialiased; }',
             {if $user->is_dark_mode}
             skin: 'oxide-dark',
@@ -63,7 +63,7 @@
         tinyMCE.init(options);
     })
 
-    $("#save-ann").click(function() {
+    $("#save-ann").click(function () {
         $.ajax({
             url: '/admin/announcement/' + {$ann->id},
             type: 'PUT',
@@ -71,7 +71,7 @@
             data: {
                 content: tinyMCE.activeEditor.getContent(),
             },
-            success: function(data) {
+            success: function (data) {
                 if (data.ret === 1) {
                     $('#success-message').text(data.msg);
                     $('#success-dialog').modal('show');

+ 17 - 12
resources/views/tabler/admin/announcement/index.tpl

@@ -31,11 +31,11 @@
                         <div class="table-responsive">
                             <table id="data_table" class="table card-table table-vcenter text-nowrap datatable">
                                 <thead>
-                                    <tr>
-                                        {foreach $details['field'] as $key => $value}
-                                            <th>{$value}</th>
-                                        {/foreach}
-                                    </tr>
+                                <tr>
+                                    {foreach $details['field'] as $key => $value}
+                                        <th>{$value}</th>
+                                    {/foreach}
+                                </tr>
                                 </thead>
                             </table>
                         </div>
@@ -52,7 +52,7 @@
                 type: 'POST',
                 dataSrc: 'anns'
             },
-            "autoWidth":false,
+            "autoWidth": false,
             'iDisplayLength': 10,
             'scrollX': true,
             'order': [
@@ -60,11 +60,16 @@
             ],
             columns: [
                 {foreach $details['field'] as $key => $value}
-                { data: '{$key}' },
+                {
+                    data: '{$key}'
+                },
                 {/foreach}
             ],
-            "columnDefs":[
-                { targets:[0],orderable:false }
+            "columnDefs": [
+                {
+                    targets: [0],
+                    orderable: false
+                }
             ],
             "dom": "<'row px-3 py-3'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
                 "<'row'<'col-sm-12'tr>>" +
@@ -102,12 +107,12 @@
         function deleteAnn(ann_id) {
             $('#notice-message').text('确定删除此公告?');
             $('#notice-dialog').modal('show');
-            $('#notice-confirm').off('click').on('click', function() {
+            $('#notice-confirm').off('click').on('click', function () {
                 $.ajax({
                     url: "/admin/announcement/" + ann_id,
                     type: 'DELETE',
                     dataType: "json",
-                    success: function(data) {
+                    success: function (data) {
                         if (data.ret === 1) {
                             $('#success-noreload-message').text(data.msg);
                             $('#success-noreload-dialog').modal('show');
@@ -128,4 +133,4 @@
         loadTable();
     </script>
 
-{include file='admin/footer.tpl'}
+    {include file='admin/footer.tpl'}

+ 27 - 21
resources/views/tabler/admin/coupon.tpl

@@ -21,7 +21,7 @@
                 <div class="col-auto">
                     <div class="btn-list">
                         <a href="#" class="btn btn-primary" data-bs-toggle="modal"
-                            data-bs-target="#create-dialog">
+                           data-bs-target="#create-dialog">
                             <i class="icon ti ti-plus"></i>
                             创建
                         </a>
@@ -38,11 +38,11 @@
                         <div class="table-responsive">
                             <table id="data_table" class="table card-table table-vcenter text-nowrap datatable">
                                 <thead>
-                                    <tr>
-                                        {foreach $details['field'] as $key => $value}
-                                            <th>{$value}</th>
-                                        {/foreach}
-                                    </tr>
+                                <tr>
+                                    {foreach $details['field'] as $key => $value}
+                                        <th>{$value}</th>
+                                    {/foreach}
+                                </tr>
                                 </thead>
                             </table>
                         </div>
@@ -66,7 +66,7 @@
                                 <label class="form-label col-3 col-form-label">{$detail['info']}</label>
                                 <div class="col">
                                     <input id="{$detail['id']}" type="text" class="form-control"
-                                        placeholder="{$detail['placeholder']}">
+                                           placeholder="{$detail['placeholder']}">
                                 </div>
                             </div>
                         {/if}
@@ -74,7 +74,7 @@
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label">{$detail['info']}</label>
                                 <textarea id="{$detail['id']}" class="col form-control" rows="{$detail['rows']}"
-                                    placeholder="{$detail['placeholder']}"></textarea>
+                                          placeholder="{$detail['placeholder']}"></textarea>
                             </div>
                         {/if}
                         {if $detail['type'] === 'select'}
@@ -94,14 +94,15 @@
                         <label class="form-label col-3 col-form-label">过期时间(留空则为不限制)</label>
                         <div class="col">
                             <input id="expire_time" type="text" class="form-control"
-                                placeholder="">
+                                   placeholder="">
                         </div>
                     </div>
                 </div>
                 <div class="modal-footer">
                     <button type="button" class="btn me-auto" data-bs-dismiss="modal">取消</button>
                     <button id="create-button" onclick="createCoupon()"
-                        type="button" class="btn btn-primary" data-bs-dismiss="modal">创建</button>
+                            type="button" class="btn btn-primary" data-bs-dismiss="modal">创建
+                    </button>
                 </div>
             </div>
         </div>
@@ -122,7 +123,7 @@
                 type: 'POST',
                 dataSrc: 'coupons'
             },
-            "autoWidth":false,
+            "autoWidth": false,
             'iDisplayLength': 10,
             'scrollX': true,
             'order': [
@@ -130,11 +131,16 @@
             ],
             columns: [
                 {foreach $details['field'] as $key => $value}
-                { data: '{$key}' },
+                {
+                    data: '{$key}'
+                },
                 {/foreach}
             ],
-            "columnDefs":[
-                { targets:[0],orderable:false }
+            "columnDefs": [
+                {
+                    targets: [0],
+                    orderable: false
+                }
             ],
             "dom": "<'row px-3 py-3'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
                 "<'row'<'col-sm-12'tr>>" +
@@ -176,11 +182,11 @@
                 dataType: "json",
                 data: {
                     {foreach $details['create_dialog'] as $detail}
-                        {$detail['id']}: $('#{$detail['id']}').val(),
+                    {$detail['id']}: $('#{$detail['id']}').val(),
                     {/foreach}
                     expire_time: $('#expire_time').val(),
                 },
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-noreload-message').text(data.msg);
                         $('#success-noreload-dialog').modal('show');
@@ -196,12 +202,12 @@
         function deleteCoupon(coupon_id) {
             $('#notice-message').text('确定删除此优惠码?');
             $('#notice-dialog').modal('show');
-            $('#notice-confirm').off('click').on('click', function() {
+            $('#notice-confirm').off('click').on('click', function () {
                 $.ajax({
                     url: "/admin/coupon/" + coupon_id,
                     type: 'DELETE',
                     dataType: "json",
-                    success: function(data) {
+                    success: function (data) {
                         if (data.ret === 1) {
                             $('#success-noreload-message').text(data.msg);
                             $('#success-noreload-dialog').modal('show');
@@ -218,12 +224,12 @@
         function disableCoupon(coupon_id) {
             $('#notice-message').text('确定禁用此优惠码?');
             $('#notice-dialog').modal('show');
-            $('#notice-confirm').off('click').on('click', function() {
+            $('#notice-confirm').off('click').on('click', function () {
                 $.ajax({
                     url: "/admin/coupon/" + coupon_id + "/disable",
                     type: 'POST',
                     dataType: "json",
-                    success: function(data) {
+                    success: function (data) {
                         if (data.ret === 1) {
                             $('#success-noreload-dialog').text(data.msg);
                             $('#success-noreload-message').modal('show');
@@ -244,4 +250,4 @@
         loadTable();
     </script>
 
-{include file='admin/footer.tpl'}
+    {include file='admin/footer.tpl'}

+ 25 - 19
resources/views/tabler/admin/detect.tpl

@@ -15,7 +15,7 @@
                 <div class="col-auto">
                     <div class="btn-list">
                         <button href="#" class="btn btn-primary" data-bs-toggle="modal"
-                            data-bs-target="#add-detect-dialog">
+                                data-bs-target="#add-detect-dialog">
                             <i class="icon ti ti-plus"></i>
                             添加审计规则
                         </button>
@@ -32,11 +32,11 @@
                         <div class="table-responsive">
                             <table id="data_table" class="table card-table table-vcenter text-nowrap datatable">
                                 <thead>
-                                    <tr>
-                                        {foreach $details['field'] as $key => $value}
-                                            <th>{$value}</th>
-                                        {/foreach}
-                                    </tr>
+                                <tr>
+                                    {foreach $details['field'] as $key => $value}
+                                        <th>{$value}</th>
+                                    {/foreach}
+                                </tr>
                                 </thead>
                             </table>
                         </div>
@@ -60,7 +60,7 @@
                                 <label class="form-label col-3 col-form-label">{$from['info']}</label>
                                 <div class="col">
                                     <input id="{$from['id']}" type="text" class="form-control"
-                                        placeholder="{$from['placeholder']}">
+                                           placeholder="{$from['placeholder']}">
                                 </div>
                             </div>
                         {/if}
@@ -68,7 +68,7 @@
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label">{$from['info']}</label>
                                 <textarea id="{$from['id']}" class="col form-control" rows="{$from['rows']}"
-                                    placeholder="{$from['placeholder']}"></textarea>
+                                          placeholder="{$from['placeholder']}"></textarea>
                             </div>
                         {/if}
                         {if $from['type'] === 'select'}
@@ -87,7 +87,8 @@
                 </div>
                 <div class="modal-footer">
                     <button type="button" class="btn me-auto" data-bs-dismiss="modal">取消</button>
-                    <button id="add-detect-button" type="button" class="btn btn-primary" data-bs-dismiss="modal">提交</button>
+                    <button id="add-detect-button" type="button" class="btn btn-primary" data-bs-dismiss="modal">提交
+                    </button>
                 </div>
             </div>
         </div>
@@ -100,7 +101,7 @@
                 type: 'POST',
                 dataSrc: 'rules'
             },
-            "autoWidth":false,
+            "autoWidth": false,
             'iDisplayLength': 10,
             'scrollX': true,
             'order': [
@@ -108,11 +109,16 @@
             ],
             columns: [
                 {foreach $details['field'] as $key => $value}
-                { data: '{$key}' },
+                {
+                    data: '{$key}'
+                },
                 {/foreach}
             ],
-            "columnDefs":[
-                { targets:[0],orderable:false },
+            "columnDefs": [
+                {
+                    targets: [0],
+                    orderable: false
+                },
             ],
             "dom": "<'row px-3 py-3'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
                 "<'row'<'col-sm-12'tr>>" +
@@ -143,17 +149,17 @@
             }
         });
 
-        $("#add-detect-button").click(function() {
+        $("#add-detect-button").click(function () {
             $.ajax({
                 type: "POST",
                 url: "/admin/detect/add",
                 dataType: "json",
                 data: {
                     {foreach $details['add_dialog'] as $from}
-                        {$from['id']}: $('#{$from['id']}').val(),
+                    {$from['id']}: $('#{$from['id']}').val(),
                     {/foreach}
                 },
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -169,12 +175,12 @@
         function deleteRule(rule_id) {
             $('#notice-message').text('确定删除此审计规则?');
             $('#notice-dialog').modal('show');
-            $('#notice-confirm').off('click').on('click', function() {
+            $('#notice-confirm').off('click').on('click', function () {
                 $.ajax({
                     url: "/admin/detect/" + rule_id,
                     type: 'DELETE',
                     dataType: "json",
-                    success: function(data) {
+                    success: function (data) {
                         if (data.ret === 1) {
                             $('#success-noreload-message').text(data.msg);
                             $('#success-noreload-dialog').modal('show');
@@ -199,4 +205,4 @@
         loadTable();
     </script>
 
-{include file='admin/footer.tpl'}
+    {include file='admin/footer.tpl'}

+ 12 - 12
resources/views/tabler/admin/docs/create.tpl

@@ -1,6 +1,6 @@
 {include file='admin/header.tpl'}
 
-<script src="//cdnjs.cloudflare.com/ajax/libs/tinymce/6.7.0/tinymce.min.js"></script>
+<script src="//cdnjs.cloudflare.com/ajax/libs/tinymce/6.7.1/tinymce.min.js"></script>
 
 <div class="page-wrapper">
     <div class="container-xl">
@@ -17,7 +17,7 @@
                 <div class="col-auto ms-auto d-print-none">
                     <div class="btn-list">
                         <button href="#" class="btn btn-primary" data-bs-toggle="modal"
-                            data-bs-target="#generate-ai-content">
+                                data-bs-target="#generate-ai-content">
                             <i class="icon ti ti-robot"></i>
                             AI 文档生成
                         </button>
@@ -78,13 +78,13 @@
             menubar: false,
             statusbar: false,
             plugins:
-              'advlist autolink lists link image charmap preview anchor ' +
-              'searchreplace visualblocks code fullscreen ' +
-              'insertdatetime media table wordcount',
+                'advlist autolink lists link image charmap preview anchor ' +
+                'searchreplace visualblocks code fullscreen ' +
+                'insertdatetime media table wordcount',
             toolbar: 'undo redo | formatselect | ' +
-              'bold italic backcolor link | blocks | alignleft aligncenter ' +
-              'alignright alignjustify | bullist numlist outdent indent | ' +
-              'image removeformat',
+                'bold italic backcolor link | blocks | alignleft aligncenter ' +
+                'alignright alignjustify | bullist numlist outdent indent | ' +
+                'image removeformat',
             image_title: false,
             image_description: false,
             content_style: 'body { font-family: -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI, Roboto, Helvetica Neue, sans-serif;font-size:   14px; -webkit-font-smoothing: antialiased; }',
@@ -96,7 +96,7 @@
         tinyMCE.init(options);
     })
 
-    $("#generate").click(function() {
+    $("#generate").click(function () {
         $.ajax({
             url: "/admin/docs/generate",
             type: 'POST',
@@ -104,7 +104,7 @@
             data: {
                 question: $("#question").val(),
             },
-            success: function(data) {
+            success: function (data) {
                 if (data.ret === 1) {
                     $('#success-noreload-message').text(data.msg);
                     $('#success-noreload-dialog').modal('show');
@@ -117,7 +117,7 @@
         })
     });
 
-    $("#create-doc").click(function() {
+    $("#create-doc").click(function () {
         $.ajax({
             url: '/admin/docs',
             type: 'POST',
@@ -126,7 +126,7 @@
                 title: $("#title").val(),
                 content: tinyMCE.get('tinymce').getContent(),
             },
-            success: function(data) {
+            success: function (data) {
                 if (data.ret === 1) {
                     $('#success-message').text(data.msg);
                     $('#success-dialog').modal('show');

+ 9 - 9
resources/views/tabler/admin/docs/edit.tpl

@@ -1,6 +1,6 @@
 {include file='admin/header.tpl'}
 
-<script src="//cdnjs.cloudflare.com/ajax/libs/tinymce/6.7.0/tinymce.min.js"></script>
+<script src="//cdnjs.cloudflare.com/ajax/libs/tinymce/6.7.1/tinymce.min.js"></script>
 
 <div class="page-wrapper">
     <div class="container-xl">
@@ -53,13 +53,13 @@
             menubar: false,
             statusbar: false,
             plugins:
-              'advlist autolink lists link image charmap preview anchor ' +
-              'searchreplace visualblocks code fullscreen ' +
-              'insertdatetime media table wordcount',
+                'advlist autolink lists link image charmap preview anchor ' +
+                'searchreplace visualblocks code fullscreen ' +
+                'insertdatetime media table wordcount',
             toolbar: 'undo redo | formatselect | ' +
-              'bold italic backcolor link | blocks | alignleft aligncenter ' +
-              'alignright alignjustify | bullist numlist outdent indent | ' +
-              'image removeformat',
+                'bold italic backcolor link | blocks | alignleft aligncenter ' +
+                'alignright alignjustify | bullist numlist outdent indent | ' +
+                'image removeformat',
             image_title: false,
             image_description: false,
             content_style: 'body { font-family: -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI, Roboto, Helvetica Neue, sans-serif;   font-size:   14px; -webkit-font-smoothing: antialiased; }',
@@ -71,7 +71,7 @@
         tinyMCE.init(options);
     })
 
-    $("#save-doc").click(function() {
+    $("#save-doc").click(function () {
         $.ajax({
             url: '/admin/docs/' + {$doc->id},
             type: 'PUT',
@@ -80,7 +80,7 @@
                 title: $("#title").val(),
                 content: tinyMCE.activeEditor.getContent(),
             },
-            success: function(data) {
+            success: function (data) {
                 if (data.ret === 1) {
                     $('#success-message').text(data.msg);
                     $('#success-dialog').modal('show');

+ 17 - 12
resources/views/tabler/admin/docs/index.tpl

@@ -31,11 +31,11 @@
                         <div class="table-responsive">
                             <table id="data_table" class="table card-table table-vcenter text-nowrap datatable">
                                 <thead>
-                                    <tr>
-                                        {foreach $details['field'] as $key => $value}
-                                            <th>{$value}</th>
-                                        {/foreach}
-                                    </tr>
+                                <tr>
+                                    {foreach $details['field'] as $key => $value}
+                                        <th>{$value}</th>
+                                    {/foreach}
+                                </tr>
                                 </thead>
                             </table>
                         </div>
@@ -52,7 +52,7 @@
                 type: 'POST',
                 dataSrc: 'docs'
             },
-            "autoWidth":false,
+            "autoWidth": false,
             'iDisplayLength': 10,
             'scrollX': true,
             'order': [
@@ -60,11 +60,16 @@
             ],
             columns: [
                 {foreach $details['field'] as $key => $value}
-                { data: '{$key}' },
+                {
+                    data: '{$key}'
+                },
                 {/foreach}
             ],
-            "columnDefs":[
-                { targets:[0],orderable:false }
+            "columnDefs": [
+                {
+                    targets: [0],
+                    orderable: false
+                }
             ],
             "dom": "<'row px-3 py-3'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
                 "<'row'<'col-sm-12'tr>>" +
@@ -102,12 +107,12 @@
         function deleteDoc(doc_id) {
             $('#notice-message').text('确定删除此文档?');
             $('#notice-dialog').modal('show');
-            $('#notice-confirm').off('click').on('click', function() {
+            $('#notice-confirm').off('click').on('click', function () {
                 $.ajax({
                     url: "/admin/docs/" + doc_id,
                     type: 'DELETE',
                     dataType: "json",
-                    success: function(data) {
+                    success: function (data) {
                         if (data.ret === 1) {
                             $('#success-noreload-message').text(data.msg);
                             $('#success-noreload-dialog').modal('show');
@@ -128,4 +133,4 @@
         loadTable();
     </script>
 
-{include file='admin/footer.tpl'}
+    {include file='admin/footer.tpl'}

+ 4 - 4
resources/views/tabler/admin/footer.tpl

@@ -112,12 +112,12 @@
 </div>
 <!-- js -->
 <script>
-    $("#switch_theme_mode").click(function() {
+    $("#switch_theme_mode").click(function () {
         $.ajax({
             type: "POST",
             url: "/user/switch_theme_mode",
             dataType: "json",
-            success: function(data) {
+            success: function (data) {
                 if (data.ret === 1) {
                     $('#success-message').text(data.msg);
                     $('#success-dialog').modal('show');
@@ -130,7 +130,7 @@
         })
     });
 
-    $("#success-confirm").click(function() {
+    $("#success-confirm").click(function () {
         location.reload();
     });
 </script>
@@ -139,4 +139,4 @@
 
 </body>
 
-</html>
+</html>

+ 24 - 18
resources/views/tabler/admin/giftcard.tpl

@@ -17,7 +17,7 @@
                 <div class="col-auto">
                     <div class="btn-list">
                         <a href="#" class="btn btn-primary" data-bs-toggle="modal"
-                            data-bs-target="#create-dialog">
+                           data-bs-target="#create-dialog">
                             <i class="icon ti ti-plus"></i>
                             创建
                         </a>
@@ -34,11 +34,11 @@
                         <div class="table-responsive">
                             <table id="data_table" class="table card-table table-vcenter text-nowrap datatable">
                                 <thead>
-                                    <tr>
-                                        {foreach $details['field'] as $key => $value}
-                                            <th>{$value}</th>
-                                        {/foreach}
-                                    </tr>
+                                <tr>
+                                    {foreach $details['field'] as $key => $value}
+                                        <th>{$value}</th>
+                                    {/foreach}
+                                </tr>
                                 </thead>
                             </table>
                         </div>
@@ -62,7 +62,7 @@
                                 <label class="form-label col-3 col-form-label">{$detail['info']}</label>
                                 <div class="col">
                                     <input id="{$detail['id']}" type="text" class="form-control"
-                                        placeholder="{$detail['placeholder']}">
+                                           placeholder="{$detail['placeholder']}">
                                 </div>
                             </div>
                         {/if}
@@ -70,7 +70,7 @@
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label">{$detail['info']}</label>
                                 <textarea id="{$detail['id']}" class="col form-control" rows="{$detail['rows']}"
-                                    placeholder="{$detail['placeholder']}"></textarea>
+                                          placeholder="{$detail['placeholder']}"></textarea>
                             </div>
                         {/if}
                         {if $detail['type'] === 'select'}
@@ -90,7 +90,8 @@
                 <div class="modal-footer">
                     <button type="button" class="btn me-auto" data-bs-dismiss="modal">取消</button>
                     <button id="create-button" onclick="createGiftCard()"
-                        type="button" class="btn btn-primary" data-bs-dismiss="modal">创建</button>
+                            type="button" class="btn btn-primary" data-bs-dismiss="modal">创建
+                    </button>
                 </div>
             </div>
         </div>
@@ -103,7 +104,7 @@
                 type: 'POST',
                 dataSrc: 'giftcards'
             },
-            "autoWidth":false,
+            "autoWidth": false,
             'iDisplayLength': 10,
             'scrollX': true,
             'order': [
@@ -111,11 +112,16 @@
             ],
             columns: [
                 {foreach $details['field'] as $key => $value}
-                { data: '{$key}' },
+                {
+                    data: '{$key}'
+                },
                 {/foreach}
             ],
-            "columnDefs":[
-                { targets:[0],orderable:false }
+            "columnDefs": [
+                {
+                    targets: [0],
+                    orderable: false
+                }
             ],
             "dom": "<'row px-3 py-3'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
                 "<'row'<'col-sm-12'tr>>" +
@@ -157,10 +163,10 @@
                 dataType: "json",
                 data: {
                     {foreach $details['create_dialog'] as $detail}
-                        {$detail['id']}: $('#{$detail['id']}').val(),
+                    {$detail['id']}: $('#{$detail['id']}').val(),
                     {/foreach}
                 },
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -176,12 +182,12 @@
         function deleteGiftCard(giftcard_id) {
             $('#notice-message').text('确定删除此礼品卡?');
             $('#notice-dialog').modal('show');
-            $('#notice-confirm').off('click').on('click', function() {
+            $('#notice-confirm').off('click').on('click', function () {
                 $.ajax({
                     url: "/admin/giftcard/" + giftcard_id,
                     type: 'DELETE',
                     dataType: "json",
-                    success: function(data) {
+                    success: function (data) {
                         if (data.ret === 1) {
                             $('#success-noreload-message').text(data.msg);
                             $('#success-noreload-dialog').modal('show');
@@ -202,4 +208,4 @@
         loadTable();
     </script>
 
-{include file='admin/footer.tpl'}
+    {include file='admin/footer.tpl'}

+ 212 - 210
resources/views/tabler/admin/header.tpl

@@ -2,21 +2,21 @@
 <html lang="zh">
 
 <head>
-    <meta charset="utf-8" />
-    <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
-    <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport" />
-    <meta name="format-detection" content="telephone=no" />
-    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
+    <meta charset="utf-8"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"/>
+    <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"/>
+    <meta name="format-detection" content="telephone=no"/>
+    <meta http-equiv="X-UA-Compatible" content="ie=edge"/>
     <title>{$config['appName']}</title>
     <!-- CSS files -->
-    <link href="//{$config['jsdelivr_url']}/npm/@tabler/core@latest/dist/css/tabler.min.css" rel="stylesheet" />
-    <link href="//{$config['jsdelivr_url']}/npm/@tabler/icons-webfont@latest/tabler-icons.min.css" rel="stylesheet" />
-    <link href="//cdn.datatables.net/v/bs5/dt-1.13.5/datatables.min.css" rel="stylesheet" />
+    <link href="//{$config['jsdelivr_url']}/npm/@tabler/core@latest/dist/css/tabler.min.css" rel="stylesheet"/>
+    <link href="//{$config['jsdelivr_url']}/npm/@tabler/icons-webfont@latest/tabler-icons.min.css" rel="stylesheet"/>
+    <link href="//cdn.datatables.net/v/bs5/dt-1.13.6/datatables.min.css" rel="stylesheet"/>
     <!-- JS files -->
     <script src="//{$config['jsdelivr_url']}/npm/qrcode_js@latest/qrcode.min.js"></script>
     <script src="//{$config['jsdelivr_url']}/npm/clipboard@latest/dist/clipboard.min.js"></script>
     <script src="//{$config['jsdelivr_url']}/npm/jquery/dist/jquery.min.js"></script>
-    <script src="//cdn.datatables.net/v/bs5/dt-1.13.5/datatables.min.js"></script>
+    <script src="//cdn.datatables.net/v/bs5/dt-1.13.6/datatables.min.js"></script>
     <style>
         .home-subtitle {
             font-size: 14px;
@@ -33,256 +33,258 @@
 {else}
 <body>
 {/if}
-    <div class="page">
-        <header class="navbar navbar-expand-md navbar-overlap d-print-none" data-bs-theme="dark">
-            <div class="container-xl" style="background-image: none;">
-                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbar-menu">
-                    <span class="navbar-toggler-icon"></span>
-                </button>
-                <h1 class="navbar-brand navbar-brand-autodark d-none-navbar-horizontal pe-0 pe-md-3">
-                    <img src="/images/uim-logo-round_48x48.png" height="32" alt="SSPanel-UIM Logo" class="navbar-brand-image" style="filter: none;">
-                </h1>
-                <div class="navbar-nav flex-row order-md-last">
-                    <div class="nav-item dropdown">
-                        <a href="#" class="nav-link d-flex lh-1 text-reset p-0" data-bs-toggle="dropdown"
-                            aria-label="Open user menu">
+<div class="page">
+    <header class="navbar navbar-expand-md navbar-overlap d-print-none" data-bs-theme="dark">
+        <div class="container-xl" style="background-image: none;">
+            <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbar-menu">
+                <span class="navbar-toggler-icon"></span>
+            </button>
+            <h1 class="navbar-brand navbar-brand-autodark d-none-navbar-horizontal pe-0 pe-md-3">
+                <img src="/images/uim-logo-round_48x48.png" height="32" alt="SSPanel-UIM Logo"
+                     class="navbar-brand-image" style="filter: none;">
+            </h1>
+            <div class="navbar-nav flex-row order-md-last">
+                <div class="nav-item dropdown">
+                    <a href="#" class="nav-link d-flex lh-1 text-reset p-0" data-bs-toggle="dropdown"
+                       aria-label="Open user menu">
                             <span class="avatar avatar-sm"
-                                style="background-image: url({$user->dice_bear})"></span>
-                            <div class="d-none d-xl-block ps-2">
-                                <div>{$user->email}</div>
-                                <div class="mt-1 small text-secondary">{$user->user_name}</div>
-                            </div>
-                        </a>
-                        <div class="dropdown-menu dropdown-menu-end dropdown-menu-arrow">
-                            {if $user->is_dark_mode}
+                                  style="background-image: url({$user->dice_bear})"></span>
+                        <div class="d-none d-xl-block ps-2">
+                            <div>{$user->email}</div>
+                            <div class="mt-1 small text-secondary">{$user->user_name}</div>
+                        </div>
+                    </a>
+                    <div class="dropdown-menu dropdown-menu-end dropdown-menu-arrow">
+                        {if $user->is_dark_mode}
                             <a id="switch_theme_mode" class="dropdown-item">浅色模式</a>
-                            {else}
+                        {else}
                             <a id="switch_theme_mode" class="dropdown-item">深色模式</a>
-                            {/if}
-                            <a href="/user/logout" class="dropdown-item">登出</a>
-                        </div>
+                        {/if}
+                        <a href="/user/logout" class="dropdown-item">登出</a>
                     </div>
                 </div>
-                <div class="collapse navbar-collapse" id="navbar-menu">
-                    <div class="d-flex flex-column flex-md-row flex-fill align-items-stretch align-items-md-center">
-                        <ul class="navbar-nav">
-                            <li class="nav-item">
-                                <a class="nav-link" href="/admin">
+            </div>
+            <div class="collapse navbar-collapse" id="navbar-menu">
+                <div class="d-flex flex-column flex-md-row flex-fill align-items-stretch align-items-md-center">
+                    <ul class="navbar-nav">
+                        <li class="nav-item">
+                            <a class="nav-link" href="/admin">
                                     <span class="nav-link-icon d-md-none d-lg-inline-block">
                                         <i class="ti ti-home icon"></i>
                                     </span>
-                                    <span class="nav-link-title">
+                                <span class="nav-link-title">
                                         概况
                                     </span>
-                                </a>
-                            </li>
-                            <li class="nav-item dropdown">
-                                <a class="nav-link dropdown-toggle" href="#navbar-base" data-bs-toggle="dropdown"
-                                    data-bs-auto-close="outside" role="button" aria-expanded="false">
+                            </a>
+                        </li>
+                        <li class="nav-item dropdown">
+                            <a class="nav-link dropdown-toggle" href="#navbar-base" data-bs-toggle="dropdown"
+                               data-bs-auto-close="outside" role="button" aria-expanded="false">
                                     <span class="nav-link-icon d-md-none d-lg-inline-block">
                                         <i class="ti ti-settings icon"></i>
                                     </span>
-                                    <span class="nav-link-title">
+                                <span class="nav-link-title">
                                         管理
                                     </span>
-                                </a>
-                                <div class="dropdown-menu">
-                                    <div class="dropdown-menu-columns">
-                                        <div class="dropdown-menu-column">
-                                            <div class="dropend">
-                                                <a class="dropdown-item dropdown-toggle" href="#" data-bs-toggle="dropdown" data-bs-auto-close="outside" role="button" aria-expanded="false" >
-                                                    <i class="ti ti-settings"></i>&nbsp;
-                                                    设置
+                            </a>
+                            <div class="dropdown-menu">
+                                <div class="dropdown-menu-columns">
+                                    <div class="dropdown-menu-column">
+                                        <div class="dropend">
+                                            <a class="dropdown-item dropdown-toggle" href="#" data-bs-toggle="dropdown"
+                                               data-bs-auto-close="outside" role="button" aria-expanded="false">
+                                                <i class="ti ti-settings"></i>&nbsp;
+                                                设置
+                                            </a>
+                                            <div class="dropdown-menu">
+                                                <a href="/admin/setting/billing" class="dropdown-item">
+                                                    财务
+                                                </a>
+                                                <a href="/admin/setting/email" class="dropdown-item">
+                                                    邮件
+                                                </a>
+                                                <a href="/admin/setting/support" class="dropdown-item">
+                                                    客服
+                                                </a>
+                                                <a href="/admin/setting/captcha" class="dropdown-item">
+                                                    验证
+                                                </a>
+                                                <a href="/admin/setting/reg" class="dropdown-item">
+                                                    注册
+                                                </a>
+                                                <a href="/admin/setting/ref" class="dropdown-item">
+                                                    邀请
+                                                </a>
+                                                <a href="/admin/setting/im" class="dropdown-item">
+                                                    IM
+                                                </a>
+                                                <a href="/admin/setting/sub" class="dropdown-item">
+                                                    订阅
+                                                </a>
+                                                <a href="/admin/setting/cron" class="dropdown-item">
+                                                    定时任务
+                                                </a>
+                                                <a href="/admin/setting/feature" class="dropdown-item">
+                                                    其他设置
                                                 </a>
-                                                <div class="dropdown-menu">
-                                                    <a href="/admin/setting/billing" class="dropdown-item">
-                                                        财务
-                                                    </a>
-                                                    <a href="/admin/setting/email" class="dropdown-item">
-                                                        邮件
-                                                    </a>
-                                                    <a href="/admin/setting/support" class="dropdown-item">
-                                                        客服
-                                                    </a>
-                                                    <a href="/admin/setting/captcha" class="dropdown-item">
-                                                        验证
-                                                    </a>
-                                                    <a href="/admin/setting/reg" class="dropdown-item">
-                                                        注册
-                                                    </a>
-                                                    <a href="/admin/setting/ref" class="dropdown-item">
-                                                        邀请
-                                                    </a>
-                                                    <a href="/admin/setting/im" class="dropdown-item">
-                                                        IM
-                                                    </a>
-                                                    <a href="/admin/setting/sub" class="dropdown-item">
-                                                        订阅
-                                                    </a>
-                                                    <a href="/admin/setting/cron" class="dropdown-item">
-                                                        定时任务
-                                                    </a>
-                                                    <a href="/admin/setting/feature" class="dropdown-item">
-                                                        其他设置
-                                                    </a>
-                                                </div>
                                             </div>
-                                            <a class="dropdown-item" href="/admin/user">
-                                                <i class="ti ti-users"></i>&nbsp;
-                                                用户
-                                            </a>
-                                            <a class="dropdown-item" href="/admin/node">
-                                                <i class="ti ti-server-2"></i>&nbsp;
-                                                节点
-                                            </a>
-                                            <a class="dropdown-item" href="/admin/system">
-                                                <i class="ti ti-tool"></i>&nbsp;
-                                                系统
-                                            </a>
                                         </div>
+                                        <a class="dropdown-item" href="/admin/user">
+                                            <i class="ti ti-users"></i>&nbsp;
+                                            用户
+                                        </a>
+                                        <a class="dropdown-item" href="/admin/node">
+                                            <i class="ti ti-server-2"></i>&nbsp;
+                                            节点
+                                        </a>
+                                        <a class="dropdown-item" href="/admin/system">
+                                            <i class="ti ti-tool"></i>&nbsp;
+                                            系统
+                                        </a>
                                     </div>
                                 </div>
-                            </li>
-                            <li class="nav-item dropdown">
-                                <a class="nav-link dropdown-toggle" href="#navbar-extra" data-bs-toggle="dropdown"
-                                    data-bs-auto-close="outside" role="button" aria-expanded="false">
+                            </div>
+                        </li>
+                        <li class="nav-item dropdown">
+                            <a class="nav-link dropdown-toggle" href="#navbar-extra" data-bs-toggle="dropdown"
+                               data-bs-auto-close="outside" role="button" aria-expanded="false">
                                     <span class="nav-link-icon d-md-none d-lg-inline-block">
                                         <i class="ti ti-brand-hipchat icon"></i>
                                     </span>
-                                    <span class="nav-link-title">
+                                <span class="nav-link-title">
                                         运营
                                     </span>
+                            </a>
+                            <div class="dropdown-menu">
+                                <a class="dropdown-item" href="/admin/announcement">
+                                    <i class="ti ti-speakerphone"></i>&nbsp;
+                                    公告
                                 </a>
-                                <div class="dropdown-menu">
-                                    <a class="dropdown-item" href="/admin/announcement">
-                                        <i class="ti ti-speakerphone"></i>&nbsp;
-                                        公告
-                                    </a>
-                                    <a class="dropdown-item" href="/admin/ticket">
-                                        <i class="ti ti-messages"></i>&nbsp;
-                                        工单
-                                    </a>
-                                    <a class="dropdown-item" href="/admin/docs">
-                                        <i class="ti ti-notes"></i>&nbsp;
-                                        文档
-                                    </a>
-                                </div>
-                            </li>
-                            <li class="nav-item dropdown">
-                                <a class="nav-link dropdown-toggle" href="#navbar-extra" data-bs-toggle="dropdown"
-                                    data-bs-auto-close="outside" role="button" aria-expanded="false">
+                                <a class="dropdown-item" href="/admin/ticket">
+                                    <i class="ti ti-messages"></i>&nbsp;
+                                    工单
+                                </a>
+                                <a class="dropdown-item" href="/admin/docs">
+                                    <i class="ti ti-notes"></i>&nbsp;
+                                    文档
+                                </a>
+                            </div>
+                        </li>
+                        <li class="nav-item dropdown">
+                            <a class="nav-link dropdown-toggle" href="#navbar-extra" data-bs-toggle="dropdown"
+                               data-bs-auto-close="outside" role="button" aria-expanded="false">
                                     <span class="nav-link-icon d-md-none d-lg-inline-block">
                                         <i class="ti ti-address-book icon"></i>
                                     </span>
-                                    <span class="nav-link-title">
+                                <span class="nav-link-title">
                                         日志
                                     </span>
+                            </a>
+                            <div class="dropdown-menu">
+                                <a class="dropdown-item" href="/admin/login">
+                                    <i class="ti ti-login"></i>&nbsp;
+                                    登录
                                 </a>
-                                <div class="dropdown-menu">
-                                    <a class="dropdown-item" href="/admin/login">
-                                        <i class="ti ti-login"></i>&nbsp;
-                                        登录
-                                    </a>
-                                    <a class="dropdown-item" href="/admin/subscribe">
-                                        <i class="ti ti-rss"></i>&nbsp;
-                                        订阅
-                                    </a>
-                                    <a class="dropdown-item" href="/admin/invite">
-                                        <i class="ti ti-friends"></i>&nbsp;
-                                        邀请
-                                    </a>
-                                    <a class="dropdown-item" href="/admin/moneylog">
-                                        <i class="ti ti-coin"></i>&nbsp;
-                                        余额
-                                    </a>
-                                    <a class="dropdown-item" href="/admin/gateway">
-                                        <i class="ti ti-torii"></i>&nbsp;
-                                        支付网关
-                                    </a>
-                                    <a class="dropdown-item" href="/admin/online">
-                                        <i class="ti ti-router"></i>&nbsp;
-                                        在线IP
-                                    </a>
-                                    <a class="dropdown-item" href="/admin/trafficlog">
-                                        <i class="ti ti-arrows-up-down"></i>&nbsp;
-                                        流量使用
-                                    </a>
-                                </div>
-                            </li>
-                            <li class="nav-item dropdown">
-                                <a class="nav-link dropdown-toggle" href="#navbar-extra" data-bs-toggle="dropdown"
-                                    data-bs-auto-close="outside" role="button" aria-expanded="false">
+                                <a class="dropdown-item" href="/admin/subscribe">
+                                    <i class="ti ti-rss"></i>&nbsp;
+                                    订阅
+                                </a>
+                                <a class="dropdown-item" href="/admin/invite">
+                                    <i class="ti ti-friends"></i>&nbsp;
+                                    邀请
+                                </a>
+                                <a class="dropdown-item" href="/admin/moneylog">
+                                    <i class="ti ti-coin"></i>&nbsp;
+                                    余额
+                                </a>
+                                <a class="dropdown-item" href="/admin/gateway">
+                                    <i class="ti ti-torii"></i>&nbsp;
+                                    支付网关
+                                </a>
+                                <a class="dropdown-item" href="/admin/online">
+                                    <i class="ti ti-router"></i>&nbsp;
+                                    在线IP
+                                </a>
+                                <a class="dropdown-item" href="/admin/trafficlog">
+                                    <i class="ti ti-arrows-up-down"></i>&nbsp;
+                                    流量使用
+                                </a>
+                            </div>
+                        </li>
+                        <li class="nav-item dropdown">
+                            <a class="nav-link dropdown-toggle" href="#navbar-extra" data-bs-toggle="dropdown"
+                               data-bs-auto-close="outside" role="button" aria-expanded="false">
                                     <span class="nav-link-icon d-md-none d-lg-inline-block">
                                         <i class="ti ti-shield-check icon"></i>
                                     </span>
-                                    <span class="nav-link-title">
+                                <span class="nav-link-title">
                                         审计
                                     </span>
+                            </a>
+                            <div class="dropdown-menu">
+                                <a class="dropdown-item" href="/admin/detect">
+                                    <i class="ti ti-barrier-block"></i>&nbsp;
+                                    规则
                                 </a>
-                                <div class="dropdown-menu">
-                                    <a class="dropdown-item" href="/admin/detect">
-                                        <i class="ti ti-barrier-block"></i>&nbsp;
-                                        规则
-                                    </a>
-                                    <a class="dropdown-item" href="/admin/detect/log">
-                                        <i class="ti ti-notes"></i>&nbsp;
-                                        碰撞记录
-                                    </a>
-                                    <a class="dropdown-item" href="/admin/detect/ban">
-                                        <i class="ti ti-notes"></i>&nbsp;
-                                        封禁记录
-                                    </a>
-                                </div>
-                            </li>
-                            <li class="nav-item dropdown">
-                                <a class="nav-link dropdown-toggle" href="#navbar-layout" data-bs-toggle="dropdown"
-                                    data-bs-auto-close="outside" role="button" aria-expanded="false">
+                                <a class="dropdown-item" href="/admin/detect/log">
+                                    <i class="ti ti-notes"></i>&nbsp;
+                                    碰撞记录
+                                </a>
+                                <a class="dropdown-item" href="/admin/detect/ban">
+                                    <i class="ti ti-notes"></i>&nbsp;
+                                    封禁记录
+                                </a>
+                            </div>
+                        </li>
+                        <li class="nav-item dropdown">
+                            <a class="nav-link dropdown-toggle" href="#navbar-layout" data-bs-toggle="dropdown"
+                               data-bs-auto-close="outside" role="button" aria-expanded="false">
                                     <span class="nav-link-icon d-md-none d-lg-inline-block">
                                         <i class="ti ti-coin icon"></i>
                                     </span>
-                                    <span class="nav-link-title">
+                                <span class="nav-link-title">
                                         财务
                                     </span>
-                                </a>
-                                <div class="dropdown-menu">
-                                    <div class="dropdown-menu-columns">
-                                        <div class="dropdown-menu-column">
-                                            <a class="dropdown-item" href="/admin/product">
-                                                <i class="ti ti-list-details"></i>&nbsp;
-                                                商品
-                                            </a>
-                                            <a class="dropdown-item" href="/admin/order">
-                                                <i class="ti ti-receipt"></i>&nbsp;
-                                                订单
-                                            </a>
-                                            <a class="dropdown-item" href="/admin/invoice">
-                                                <i class="ti ti-file-dollar"></i>&nbsp;
-                                                账单
-                                            </a>
-                                            <a class="dropdown-item" href="/admin/coupon">
-                                                <i class="ti ti-ticket"></i>&nbsp;
-                                                优惠码
-                                            </a>
-                                            <a class="dropdown-item" href="/admin/giftcard">
-                                                <i class="ti ti-gift"></i>&nbsp;
-                                                礼品卡
-                                            </a>
-                                        </div>
+                            </a>
+                            <div class="dropdown-menu">
+                                <div class="dropdown-menu-columns">
+                                    <div class="dropdown-menu-column">
+                                        <a class="dropdown-item" href="/admin/product">
+                                            <i class="ti ti-list-details"></i>&nbsp;
+                                            商品
+                                        </a>
+                                        <a class="dropdown-item" href="/admin/order">
+                                            <i class="ti ti-receipt"></i>&nbsp;
+                                            订单
+                                        </a>
+                                        <a class="dropdown-item" href="/admin/invoice">
+                                            <i class="ti ti-file-dollar"></i>&nbsp;
+                                            账单
+                                        </a>
+                                        <a class="dropdown-item" href="/admin/coupon">
+                                            <i class="ti ti-ticket"></i>&nbsp;
+                                            优惠码
+                                        </a>
+                                        <a class="dropdown-item" href="/admin/giftcard">
+                                            <i class="ti ti-gift"></i>&nbsp;
+                                            礼品卡
+                                        </a>
                                     </div>
                                 </div>
-                            </li>
-                            <li class="nav-item">
-                                <a class="nav-link" href="/user">
+                            </div>
+                        </li>
+                        <li class="nav-item">
+                            <a class="nav-link" href="/user">
                                     <span class="nav-link-icon d-md-none d-lg-inline-block">
                                         <i class="ti ti-arrow-back-up icon"></i>
                                     </span>
-                                    <span class="nav-link-title">
+                                <span class="nav-link-title">
                                         返回用户中心
                                     </span>
-                                </a>
-                            </li>
-                        </ul>
-                    </div>
+                            </a>
+                        </li>
+                    </ul>
                 </div>
             </div>
-</header>
+        </div>
+    </header>

+ 2 - 2
resources/views/tabler/admin/index.tpl

@@ -151,7 +151,7 @@
     </div>
 
     <script>
-        document.addEventListener("DOMContentLoaded", function() {
+        document.addEventListener("DOMContentLoaded", function () {
             window.ApexCharts && (new ApexCharts(document.getElementById('check-in'), {
                 chart: {
                     type: "donut",
@@ -315,4 +315,4 @@
 
     <script src="//{$config['jsdelivr_url']}/npm/@tabler/core@latest/dist/libs/apexcharts/dist/apexcharts.min.js"></script>
 
-{include file='admin/footer.tpl'}
+    {include file='admin/footer.tpl'}

+ 14 - 9
resources/views/tabler/admin/invoice/index.tpl

@@ -25,11 +25,11 @@
                         <div class="table-responsive">
                             <table id="data_table" class="table card-table table-vcenter text-nowrap datatable">
                                 <thead>
-                                    <tr>
-                                        {foreach $details['field'] as $key => $value}
+                                <tr>
+                                    {foreach $details['field'] as $key => $value}
                                         <th>{$value}</th>
-                                        {/foreach}
-                                    </tr>
+                                    {/foreach}
+                                </tr>
                                 </thead>
                             </table>
                         </div>
@@ -46,7 +46,7 @@
                 type: 'POST',
                 dataSrc: 'invoices'
             },
-            "autoWidth":false,
+            "autoWidth": false,
             'iDisplayLength': 10,
             'scrollX': true,
             'order': [
@@ -54,11 +54,16 @@
             ],
             columns: [
                 {foreach $details['field'] as $key => $value}
-                { data: '{$key}' },
+                {
+                    data: '{$key}'
+                },
                 {/foreach}
             ],
-            "columnDefs":[
-                { targets:[0],orderable:false }
+            "columnDefs": [
+                {
+                    targets: [0],
+                    orderable: false
+                }
             ],
             "dom": "<'row px-3 py-3'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
                 "<'row'<'col-sm-12'tr>>" +
@@ -94,4 +99,4 @@
         }
     </script>
 
-{include file='admin/footer.tpl'}
+    {include file='admin/footer.tpl'}

+ 23 - 22
resources/views/tabler/admin/invoice/view.tpl

@@ -13,15 +13,15 @@
                     </div>
                 </div>
                 {if $invoice->status === 'unpaid'}
-                <div class="col-auto">
-                    <div class="btn-list">
-                        <button href="#" class="btn btn-primary" data-bs-toggle="modal"
-                            data-bs-target="#mark_paid_confirm_dialog">
-                            <i class="icon ti ti-checklist"></i>
-                            标记为支付
-                        </button>
+                    <div class="col-auto">
+                        <div class="btn-list">
+                            <button href="#" class="btn btn-primary" data-bs-toggle="modal"
+                                    data-bs-target="#mark_paid_confirm_dialog">
+                                <i class="icon ti ti-checklist"></i>
+                                标记为支付
+                            </button>
+                        </div>
                     </div>
-                </div>
                 {/if}
             </div>
         </div>
@@ -63,10 +63,10 @@
                             <div class="datagrid-content">{$invoice->pay_time}</div>
                         </div>
                         {if $invoice->status === 'paid_gateway'}
-                        <div class="datagrid-item">
-                            <div class="datagrid-title">支付网关单号</div>
-                            <div class="datagrid-content">{$paylist->tradeno}</div>
-                        </div>
+                            <div class="datagrid-item">
+                                <div class="datagrid-title">支付网关单号</div>
+                                <div class="datagrid-content">{$paylist->tradeno}</div>
+                            </div>
                         {/if}
                     </div>
                 </div>
@@ -79,18 +79,18 @@
                     <div class="table-responsive">
                         <table id="invoice_content_table" class="table table-vcenter card-table">
                             <thead>
-                                <tr>
-                                    <th>名称</th>
-                                    <th>价格</th>
-                                </tr>
+                            <tr>
+                                <th>名称</th>
+                                <th>价格</th>
+                            </tr>
                             </thead>
                             <tbody>
-                                {foreach $invoice_content as $invoice_content_detail}
+                            {foreach $invoice_content as $invoice_content_detail}
                                 <tr>
                                     <td>{$invoice_content_detail->name}</td>
                                     <td>{$invoice_content_detail->price}</td>
                                 </tr>
-                                {/foreach}
+                            {/foreach}
                             </tbody>
                         </table>
                     </div>
@@ -115,19 +115,20 @@
                 </div>
                 <div class="modal-footer">
                     <button type="button" class="btn me-auto" data-bs-dismiss="modal">取消</button>
-                    <button id="confirm_mark_paid" type="button" class="btn btn-primary" data-bs-dismiss="modal">确认</button>
+                    <button id="confirm_mark_paid" type="button" class="btn btn-primary" data-bs-dismiss="modal">确认
+                    </button>
                 </div>
             </div>
         </div>
     </div>
 
     <script>
-        $("#confirm_mark_paid").click(function() {
+        $("#confirm_mark_paid").click(function () {
             $.ajax({
                 url: "/admin/invoice/{$invoice->id}/mark_paid",
                 type: 'POST',
                 dataType: "json",
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -140,4 +141,4 @@
         });
     </script>
 
-{include file='admin/footer.tpl'}
+    {include file='admin/footer.tpl'}

+ 10 - 8
resources/views/tabler/admin/log/detect.tpl

@@ -23,11 +23,11 @@
                         <div class="table-responsive">
                             <table id="data_table" class="table card-table table-vcenter text-nowrap datatable">
                                 <thead>
-                                    <tr>
-                                        {foreach $details['field'] as $key => $value}
-                                            <th>{$value}</th>
-                                        {/foreach}
-                                    </tr>
+                                <tr>
+                                    {foreach $details['field'] as $key => $value}
+                                        <th>{$value}</th>
+                                    {/foreach}
+                                </tr>
                                 </thead>
                             </table>
                         </div>
@@ -47,7 +47,7 @@
                 type: 'POST',
                 dataSrc: 'logs.data'
             },
-            "autoWidth":false,
+            "autoWidth": false,
             'iDisplayLength': 10,
             'scrollX': true,
             'order': [
@@ -55,7 +55,9 @@
             ],
             columns: [
                 {foreach $details['field'] as $key => $value}
-                { data: '{$key}' },
+                {
+                    data: '{$key}'
+                },
                 {/foreach}
             ],
             "dom": "<'row px-3 py-3'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
@@ -94,4 +96,4 @@
         loadTable();
     </script>
 
-{include file='admin/footer.tpl'}
+    {include file='admin/footer.tpl'}

+ 10 - 8
resources/views/tabler/admin/log/detect_ban.tpl

@@ -23,11 +23,11 @@
                         <div class="table-responsive">
                             <table id="data_table" class="table card-table table-vcenter text-nowrap datatable">
                                 <thead>
-                                    <tr>
-                                        {foreach $details['field'] as $key => $value}
-                                            <th>{$value}</th>
-                                        {/foreach}
-                                    </tr>
+                                <tr>
+                                    {foreach $details['field'] as $key => $value}
+                                        <th>{$value}</th>
+                                    {/foreach}
+                                </tr>
                                 </thead>
                             </table>
                         </div>
@@ -47,7 +47,7 @@
                 type: 'POST',
                 dataSrc: 'bans.data'
             },
-            "autoWidth":false,
+            "autoWidth": false,
             'iDisplayLength': 10,
             'scrollX': true,
             'order': [
@@ -55,7 +55,9 @@
             ],
             columns: [
                 {foreach $details['field'] as $key => $value}
-                { data: '{$key}' },
+                {
+                    data: '{$key}'
+                },
                 {/foreach}
             ],
             "dom": "<'row px-3 py-3'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
@@ -94,4 +96,4 @@
         loadTable();
     </script>
 
-{include file='admin/footer.tpl'}
+    {include file='admin/footer.tpl'}

+ 10 - 8
resources/views/tabler/admin/log/gateway.tpl

@@ -23,11 +23,11 @@
                         <div class="table-responsive">
                             <table id="data_table" class="table card-table table-vcenter text-nowrap datatable">
                                 <thead>
-                                    <tr>
-                                        {foreach $details['field'] as $key => $value}
-                                            <th>{$value}</th>
-                                        {/foreach}
-                                    </tr>
+                                <tr>
+                                    {foreach $details['field'] as $key => $value}
+                                        <th>{$value}</th>
+                                    {/foreach}
+                                </tr>
                                 </thead>
                             </table>
                         </div>
@@ -44,7 +44,7 @@
                 type: 'POST',
                 dataSrc: 'paylists'
             },
-            "autoWidth":false,
+            "autoWidth": false,
             'iDisplayLength': 10,
             'scrollX': true,
             'order': [
@@ -52,7 +52,9 @@
             ],
             columns: [
                 {foreach $details['field'] as $key => $value}
-                { data: '{$key}' },
+                {
+                    data: '{$key}'
+                },
                 {/foreach}
             ],
             "dom": "<'row px-3 py-3'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
@@ -91,4 +93,4 @@
         loadTable();
     </script>
 
-{include file='admin/footer.tpl'}
+    {include file='admin/footer.tpl'}

+ 27 - 22
resources/views/tabler/admin/log/invite.tpl

@@ -15,12 +15,12 @@
                 <div class="col-auto">
                     <div class="btn-list">
                         <button href="#" class="btn btn-primary" data-bs-toggle="modal"
-                            data-bs-target="#update-invite-dialog">
+                                data-bs-target="#update-invite-dialog">
                             <i class="icon ti ti-user-edit"></i>
                             修改邀请者
                         </button>
                         <button href="#" class="btn btn-primary" data-bs-toggle="modal"
-                            data-bs-target="#add-invite-dialog">
+                                data-bs-target="#add-invite-dialog">
                             <i class="icon ti ti-plus"></i>
                             添加邀请数量
                         </button>
@@ -37,11 +37,11 @@
                         <div class="table-responsive">
                             <table id="data_table" class="table card-table table-vcenter text-nowrap datatable">
                                 <thead>
-                                    <tr>
-                                        {foreach $details['field'] as $key => $value}
-                                            <th>{$value}</th>
-                                        {/foreach}
-                                    </tr>
+                                <tr>
+                                    {foreach $details['field'] as $key => $value}
+                                        <th>{$value}</th>
+                                    {/foreach}
+                                </tr>
                                 </thead>
                             </table>
                         </div>
@@ -65,7 +65,7 @@
                                 <label class="form-label col-3 col-form-label">{$from['info']}</label>
                                 <div class="col">
                                     <input id="{$from['id']}" type="text" class="form-control"
-                                        placeholder="{$from['placeholder']}">
+                                           placeholder="{$from['placeholder']}">
                                 </div>
                             </div>
                         {/if}
@@ -73,7 +73,7 @@
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label">{$from['info']}</label>
                                 <textarea id="{$from['id']}" class="col form-control" rows="{$from['rows']}"
-                                    placeholder="{$from['placeholder']}"></textarea>
+                                          placeholder="{$from['placeholder']}"></textarea>
                             </div>
                         {/if}
                         {if $from['type'] === 'select'}
@@ -92,7 +92,9 @@
                 </div>
                 <div class="modal-footer">
                     <button type="button" class="btn me-auto" data-bs-dismiss="modal">取消</button>
-                    <button id="update-invite-button" type="button" class="btn btn-primary" data-bs-dismiss="modal">提交</button>
+                    <button id="update-invite-button" type="button" class="btn btn-primary" data-bs-dismiss="modal">
+                        提交
+                    </button>
                 </div>
             </div>
         </div>
@@ -112,7 +114,7 @@
                                 <label class="form-label col-3 col-form-label">{$from['info']}</label>
                                 <div class="col">
                                     <input id="{$from['id']}" type="text" class="form-control"
-                                        placeholder="{$from['placeholder']}">
+                                           placeholder="{$from['placeholder']}">
                                 </div>
                             </div>
                         {/if}
@@ -120,7 +122,7 @@
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label">{$from['info']}</label>
                                 <textarea id="{$from['id']}" class="col form-control" rows="{$from['rows']}"
-                                    placeholder="{$from['placeholder']}"></textarea>
+                                          placeholder="{$from['placeholder']}"></textarea>
                             </div>
                         {/if}
                         {if $from['type'] === 'select'}
@@ -139,7 +141,8 @@
                 </div>
                 <div class="modal-footer">
                     <button type="button" class="btn me-auto" data-bs-dismiss="modal">取消</button>
-                    <button id="add-invite-button" type="button" class="btn btn-primary" data-bs-dismiss="modal">提交</button>
+                    <button id="add-invite-button" type="button" class="btn btn-primary" data-bs-dismiss="modal">提交
+                    </button>
                 </div>
             </div>
         </div>
@@ -152,7 +155,7 @@
                 type: 'POST',
                 dataSrc: 'paybacks'
             },
-            "autoWidth":false,
+            "autoWidth": false,
             'iDisplayLength': 10,
             'scrollX': true,
             'order': [
@@ -160,7 +163,9 @@
             ],
             columns: [
                 {foreach $details['field'] as $key => $value}
-                { data: '{$key}' },
+                {
+                    data: '{$key}'
+                },
                 {/foreach}
             ],
             "dom": "<'row px-3 py-3'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
@@ -192,17 +197,17 @@
             }
         });
 
-        $("#update-invite-button").click(function() {
+        $("#update-invite-button").click(function () {
             $.ajax({
                 type: "POST",
                 url: "/admin/invite/update_invite",
                 dataType: "json",
                 data: {
                     {foreach $details['update_dialog'] as $from}
-                        {$from['id']}: $('#{$from['id']}').val(),
+                    {$from['id']}: $('#{$from['id']}').val(),
                     {/foreach}
                 },
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -215,17 +220,17 @@
             })
         });
 
-        $("#add-invite-button").click(function() {
+        $("#add-invite-button").click(function () {
             $.ajax({
                 type: "POST",
                 url: "/admin/invite/add_invite",
                 dataType: "json",
                 data: {
                     {foreach $details['add_dialog'] as $from}
-                        {$from['id']}: $('#{$from['id']}').val(),
+                    {$from['id']}: $('#{$from['id']}').val(),
                     {/foreach}
                 },
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -245,4 +250,4 @@
         loadTable();
     </script>
 
-{include file='admin/footer.tpl'}
+    {include file='admin/footer.tpl'}

+ 10 - 8
resources/views/tabler/admin/log/login.tpl

@@ -23,11 +23,11 @@
                         <div class="table-responsive">
                             <table id="data_table" class="table card-table table-vcenter text-nowrap datatable">
                                 <thead>
-                                    <tr>
-                                        {foreach $details['field'] as $key => $value}
-                                            <th>{$value}</th>
-                                        {/foreach}
-                                    </tr>
+                                <tr>
+                                    {foreach $details['field'] as $key => $value}
+                                        <th>{$value}</th>
+                                    {/foreach}
+                                </tr>
                                 </thead>
                             </table>
                         </div>
@@ -47,7 +47,7 @@
                 type: 'POST',
                 dataSrc: 'logins.data'
             },
-            "autoWidth":false,
+            "autoWidth": false,
             'iDisplayLength': 10,
             'scrollX': true,
             'order': [
@@ -55,7 +55,9 @@
             ],
             columns: [
                 {foreach $details['field'] as $key => $value}
-                { data: '{$key}' },
+                {
+                    data: '{$key}'
+                },
                 {/foreach}
             ],
             "dom": "<'row px-3 py-3'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
@@ -94,4 +96,4 @@
         loadTable();
     </script>
 
-{include file='admin/footer.tpl'}
+    {include file='admin/footer.tpl'}

+ 10 - 8
resources/views/tabler/admin/log/money.tpl

@@ -23,11 +23,11 @@
                         <div class="table-responsive">
                             <table id="data_table" class="table card-table table-vcenter text-nowrap datatable">
                                 <thead>
-                                    <tr>
-                                        {foreach $details['field'] as $key => $value}
-                                            <th>{$value}</th>
-                                        {/foreach}
-                                    </tr>
+                                <tr>
+                                    {foreach $details['field'] as $key => $value}
+                                        <th>{$value}</th>
+                                    {/foreach}
+                                </tr>
                                 </thead>
                             </table>
                         </div>
@@ -44,7 +44,7 @@
                 type: 'POST',
                 dataSrc: 'money_logs'
             },
-            "autoWidth":false,
+            "autoWidth": false,
             'iDisplayLength': 10,
             'scrollX': true,
             'order': [
@@ -52,7 +52,9 @@
             ],
             columns: [
                 {foreach $details['field'] as $key => $value}
-                { data: '{$key}' },
+                {
+                    data: '{$key}'
+                },
                 {/foreach}
             ],
             "dom": "<'row px-3 py-3'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
@@ -91,4 +93,4 @@
         loadTable();
     </script>
 
-{include file='admin/footer.tpl'}
+    {include file='admin/footer.tpl'}

+ 10 - 8
resources/views/tabler/admin/log/online.tpl

@@ -23,11 +23,11 @@
                         <div class="table-responsive">
                             <table id="data_table" class="table card-table table-vcenter text-nowrap datatable">
                                 <thead>
-                                    <tr>
-                                        {foreach $details['field'] as $key => $value}
-                                            <th>{$value}</th>
-                                        {/foreach}
-                                    </tr>
+                                <tr>
+                                    {foreach $details['field'] as $key => $value}
+                                        <th>{$value}</th>
+                                    {/foreach}
+                                </tr>
                                 </thead>
                             </table>
                         </div>
@@ -47,7 +47,7 @@
                 type: 'POST',
                 dataSrc: 'onlines.data'
             },
-            "autoWidth":false,
+            "autoWidth": false,
             'iDisplayLength': 10,
             'scrollX': true,
             'order': [
@@ -55,7 +55,9 @@
             ],
             columns: [
                 {foreach $details['field'] as $key => $value}
-                { data: '{$key}' },
+                {
+                    data: '{$key}'
+                },
                 {/foreach}
             ],
             "dom": "<'row px-3 py-3'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
@@ -94,4 +96,4 @@
         loadTable();
     </script>
 
-{include file='admin/footer.tpl'}
+    {include file='admin/footer.tpl'}

+ 10 - 8
resources/views/tabler/admin/log/subscribe.tpl

@@ -23,11 +23,11 @@
                         <div class="table-responsive">
                             <table id="data_table" class="table card-table table-vcenter text-nowrap datatable">
                                 <thead>
-                                    <tr>
-                                        {foreach $details['field'] as $key => $value}
-                                            <th>{$value}</th>
-                                        {/foreach}
-                                    </tr>
+                                <tr>
+                                    {foreach $details['field'] as $key => $value}
+                                        <th>{$value}</th>
+                                    {/foreach}
+                                </tr>
                                 </thead>
                             </table>
                         </div>
@@ -47,7 +47,7 @@
                 type: 'POST',
                 dataSrc: 'subscribes.data'
             },
-            "autoWidth":false,
+            "autoWidth": false,
             'iDisplayLength': 10,
             'scrollX': true,
             'order': [
@@ -55,7 +55,9 @@
             ],
             columns: [
                 {foreach $details['field'] as $key => $value}
-                { data: '{$key}' },
+                {
+                    data: '{$key}'
+                },
                 {/foreach}
             ],
             "dom": "<'row px-3 py-3'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
@@ -94,4 +96,4 @@
         loadTable();
     </script>
 
-{include file='admin/footer.tpl'}
+    {include file='admin/footer.tpl'}

+ 10 - 8
resources/views/tabler/admin/log/traffic.tpl

@@ -23,11 +23,11 @@
                         <div class="table-responsive">
                             <table id="data_table" class="table card-table table-vcenter text-nowrap datatable">
                                 <thead>
-                                    <tr>
-                                        {foreach $details['field'] as $key => $value}
-                                            <th>{$value}</th>
-                                        {/foreach}
-                                    </tr>
+                                <tr>
+                                    {foreach $details['field'] as $key => $value}
+                                        <th>{$value}</th>
+                                    {/foreach}
+                                </tr>
                                 </thead>
                             </table>
                         </div>
@@ -47,7 +47,7 @@
                 type: 'POST',
                 dataSrc: 'trafficlogs.data'
             },
-            "autoWidth":false,
+            "autoWidth": false,
             'iDisplayLength': 10,
             'scrollX': true,
             'order': [
@@ -55,7 +55,9 @@
             ],
             columns: [
                 {foreach $details['field'] as $key => $value}
-                { data: '{$key}' },
+                {
+                    data: '{$key}'
+                },
                 {/foreach}
             ],
             "dom": "<'row px-3 py-3'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
@@ -94,4 +96,4 @@
         loadTable();
     </script>
 
-{include file='admin/footer.tpl'}
+    {include file='admin/footer.tpl'}

+ 9 - 8
resources/views/tabler/admin/node/create.tpl

@@ -57,7 +57,7 @@
                                 <label class="form-label col-3 col-form-label required">流量倍率</label>
                                 <div class="col">
                                     <input id="traffic_rate" type="text" class="form-control"
-                                        value="">
+                                           value="">
                                 </div>
                             </div>
                             <div class="form-group mb-3 row">
@@ -76,7 +76,8 @@
                                 <label class="form-label col-3 col-form-label">自定义配置</label>
                                 <div id="custom_config"></div>
                                 <label class="form-label col-form-label">
-                                    请参考 <a href="//wiki.sspanel.org/#/custom-config" target="_blank">wiki.sspanel.org/#/custom-config</a> 修改节点自定义配置
+                                    请参考 <a href="//wiki.sspanel.org/#/custom-config" target="_blank">wiki.sspanel.org/#/custom-config</a>
+                                    修改节点自定义配置
                                 </label>
                             </div>
                             <div class="mb-3">
@@ -87,7 +88,7 @@
                                             <span class="col-auto">
                                                 <label class="form-check form-check-single form-switch">
                                                     <input id="type" class="form-check-input" type="checkbox"
-                                                        checked="">
+                                                           checked="">
                                                 </label>
                                             </span>
                                         </label>
@@ -128,21 +129,21 @@
                                 <label class="form-label col-3 col-form-label required">可用流量 (GB)</label>
                                 <div class="col">
                                     <input id="node_bandwidth_limit" type="text" class="form-control"
-                                        value="">
+                                           value="">
                                 </div>
                             </div>
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label required">流量重置日</label>
                                 <div class="col">
                                     <input id="bandwidthlimit_resetday" type="text" class="form-control"
-                                        value="">
+                                           value="">
                                 </div>
                             </div>
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label required">速率限制 (Mbps)</label>
                                 <div class="col">
                                     <input id="node_speedlimit" type="text" class="form-control"
-                                        value="">
+                                           value="">
                                 </div>
                             </div>
                         </div>
@@ -160,7 +161,7 @@
     };
     const editor = new JSONEditor(container, options);
 
-    $("#create-node").click(function() {
+    $("#create-node").click(function () {
         $.ajax({
             url: '/admin/node',
             type: 'POST',
@@ -172,7 +173,7 @@
                 type: $("#type").is(":checked"),
                 custom_config: JSON.stringify(editor.get()),
             },
-            success: function(data) {
+            success: function (data) {
                 if (data.ret === 1) {
                     $('#success-message').text(data.msg);
                     $('#success-dialog').modal('show');

+ 17 - 14
resources/views/tabler/admin/node/edit.tpl

@@ -57,7 +57,7 @@
                                 <label class="form-label col-3 col-form-label">流量倍率</label>
                                 <div class="col">
                                     <input id="traffic_rate" type="text" class="form-control"
-                                        value="{$node->traffic_rate}">
+                                           value="{$node->traffic_rate}">
                                 </div>
                             </div>
                             <div class="form-group mb-3 row">
@@ -76,7 +76,8 @@
                                 <label class="form-label col-3 col-form-label">自定义配置</label>
                                 <div id="custom_config"></div>
                                 <label class="form-label col-form-label">
-                                    请参考 <a href="//wiki.sspanel.org/#/custom-config" target="_blank">wiki.sspanel.org/#/custom-config</a> 修改节点自定义配置
+                                    请参考 <a href="//wiki.sspanel.org/#/custom-config" target="_blank">wiki.sspanel.org/#/custom-config</a>
+                                    修改节点自定义配置
                                 </label>
                             </div>
                             <div class="mb-3">
@@ -87,7 +88,7 @@
                                             <span class="col-auto">
                                                 <label class="form-check form-check-single form-switch">
                                                     <input id="type" class="form-check-input" type="checkbox"
-                                                        {if $node->type === 1}checked="" {/if}>
+                                                           {if $node->type === 1}checked="" {/if}>
                                                 </label>
                                             </span>
                                         </label>
@@ -128,28 +129,28 @@
                                 <label class="form-label col-3 col-form-label">已用流量 (GB)</label>
                                 <div class="col">
                                     <input id="node_bandwidth" type="text" class="form-control"
-                                        value="{round($node->node_bandwidth / 1073741824, 2)}" disabled="">
+                                           value="{round($node->node_bandwidth / 1073741824, 2)}" disabled="">
                                 </div>
                             </div>
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label">可用流量 (GB)</label>
                                 <div class="col">
                                     <input id="node_bandwidth_limit" type="text" class="form-control"
-                                        value="{round($node->node_bandwidth_limit / 1073741824, 2)}">
+                                           value="{round($node->node_bandwidth_limit / 1073741824, 2)}">
                                 </div>
                             </div>
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label">流量重置日</label>
                                 <div class="col">
                                     <input id="bandwidthlimit_resetday" type="text" class="form-control"
-                                        value="{$node->bandwidthlimit_resetday}">
+                                           value="{$node->bandwidthlimit_resetday}">
                                 </div>
                             </div>
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label">速率限制 (Mbps)</label>
                                 <div class="col">
                                     <input id="node_speedlimit" type="text" class="form-control"
-                                        value="{$node->node_speedlimit}">
+                                           value="{$node->node_speedlimit}">
                                 </div>
                             </div>
                             <div class="hr-text">
@@ -157,11 +158,13 @@
                             </div>
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label">节点通讯密钥</label>
-                                <input type="text" class="form-control" id="password" value="{$node->password}" disabled="">
+                                <input type="text" class="form-control" id="password" value="{$node->password}"
+                                       disabled="">
                                 <div class="row my-3">
                                     <div class="col">
                                         <button id="reset-node-password" class="btn btn-red">重置</button>
-                                        <button id="copy-password" class="copy btn btn-primary" data-clipboard-text="{$node->password}">
+                                        <button id="copy-password" class="copy btn btn-primary"
+                                                data-clipboard-text="{$node->password}">
                                             复制
                                         </button>
                                     </div>
@@ -180,7 +183,7 @@
 
 <script>
     var clipboard = new ClipboardJS('.copy');
-    clipboard.on('success', function(e) {
+    clipboard.on('success', function (e) {
         $('#success-noreload-message').text('已复制到剪切板');
         $('#success-noreload-dialog').modal('show');
     });
@@ -192,12 +195,12 @@
     const editor = new JSONEditor(container, options);
     editor.set({$node->custom_config})
 
-    $("#reset-node-password").click(function() {
+    $("#reset-node-password").click(function () {
         $.ajax({
             url: '/admin/node/{$node->id}/password_reset',
             type: 'POST',
             dataType: "json",
-            success: function(data) {
+            success: function (data) {
                 if (data.ret === 1) {
                     $('#success-message').text(data.msg);
                     $('#success-dialog').modal('show');
@@ -209,7 +212,7 @@
         })
     });
 
-    $("#save-node").click(function() {
+    $("#save-node").click(function () {
         $.ajax({
             url: '/admin/node/{$node->id}',
             type: 'PUT',
@@ -221,7 +224,7 @@
                 type: $("#type").is(":checked"),
                 custom_config: JSON.stringify(editor.get()),
             },
-            success: function(data) {
+            success: function (data) {
                 if (data.ret === 1) {
                     $('#success-message').text(data.msg);
                     $('#success-dialog').modal('show');

+ 19 - 14
resources/views/tabler/admin/node/index.tpl

@@ -33,11 +33,11 @@
                         <div class="table-responsive">
                             <table id="data_table" class="table card-table table-vcenter text-nowrap datatable">
                                 <thead>
-                                    <tr>
-                                        {foreach $details['field'] as $key => $value}
-                                            <th>{$value}</th>
-                                        {/foreach}
-                                    </tr>
+                                <tr>
+                                    {foreach $details['field'] as $key => $value}
+                                        <th>{$value}</th>
+                                    {/foreach}
+                                </tr>
                                 </thead>
                             </table>
                         </div>
@@ -54,7 +54,7 @@
                 type: 'POST',
                 dataSrc: 'nodes'
             },
-            "autoWidth":false,
+            "autoWidth": false,
             'iDisplayLength': 10,
             'scrollX': true,
             'order': [
@@ -62,11 +62,16 @@
             ],
             columns: [
                 {foreach $details['field'] as $key => $value}
-                { data: '{$key}' },
+                {
+                    data: '{$key}'
+                },
                 {/foreach}
             ],
-            "columnDefs":[
-                { targets:[0],orderable:false },
+            "columnDefs": [
+                {
+                    targets: [0],
+                    orderable: false
+                },
             ],
             "dom": "<'row px-3 py-3'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
                 "<'row'<'col-sm-12'tr>>" +
@@ -104,12 +109,12 @@
         function deleteNode(node_id) {
             $('#notice-message').text('确定删除此节点?');
             $('#notice-dialog').modal('show');
-            $('#notice-confirm').off('click').on('click', function() {
+            $('#notice-confirm').off('click').on('click', function () {
                 $.ajax({
                     url: "/admin/node/" + node_id,
                     type: 'DELETE',
                     dataType: "json",
-                    success: function(data) {
+                    success: function (data) {
                         if (data.ret === 1) {
                             $('#success-noreload-message').text(data.msg);
                             $('#success-noreload-dialog').modal('show');
@@ -126,12 +131,12 @@
         function copyNode(node_id) {
             $('#notice-message').text('确定复制此节点?');
             $('#notice-dialog').modal('show');
-            $('#notice-confirm').off('click').on('click', function() {
+            $('#notice-confirm').off('click').on('click', function () {
                 $.ajax({
                     url: "/admin/node/" + node_id + "/copy",
                     type: 'POST',
                     dataType: "json",
-                    success: function(data) {
+                    success: function (data) {
                         if (data.ret === 1) {
                             $('#success-noreload-message').text(data.msg);
                             $('#success-noreload-dialog').modal('show');
@@ -152,4 +157,4 @@
         loadTable();
     </script>
 
-{include file='admin/footer.tpl'}
+{include file='admin/footer.tpl'}

+ 19 - 14
resources/views/tabler/admin/order/index.tpl

@@ -23,11 +23,11 @@
                         <div class="table-responsive">
                             <table id="data_table" class="table card-table table-vcenter text-nowrap datatable">
                                 <thead>
-                                    <tr>
-                                        {foreach $details['field'] as $key => $value}
-                                            <th>{$value}</th>
-                                        {/foreach}
-                                    </tr>
+                                <tr>
+                                    {foreach $details['field'] as $key => $value}
+                                        <th>{$value}</th>
+                                    {/foreach}
+                                </tr>
                                 </thead>
                             </table>
                         </div>
@@ -44,7 +44,7 @@
                 type: 'POST',
                 dataSrc: 'orders'
             },
-            "autoWidth":false,
+            "autoWidth": false,
             'iDisplayLength': 10,
             'scrollX': true,
             'order': [
@@ -52,11 +52,16 @@
             ],
             columns: [
                 {foreach $details['field'] as $key => $value}
-                { data: '{$key}' },
+                {
+                    data: '{$key}'
+                },
                 {/foreach}
             ],
-            "columnDefs":[
-                { targets:[0],orderable:false }
+            "columnDefs": [
+                {
+                    targets: [0],
+                    orderable: false
+                }
             ],
             "dom": "<'row px-3 py-3'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
                 "<'row'<'col-sm-12'tr>>" +
@@ -94,12 +99,12 @@
         function deleteOrder(order_id) {
             $('#notice-message').text('确定删除此订单?');
             $('#notice-dialog').modal('show');
-            $('#notice-confirm').off('click').on('click', function() {
+            $('#notice-confirm').off('click').on('click', function () {
                 $.ajax({
                     url: "/admin/order/" + order_id,
                     type: 'DELETE',
                     dataType: "json",
-                    success: function(data) {
+                    success: function (data) {
                         if (data.ret === 1) {
                             $('#success-noreload-message').text(data.msg);
                             $('#success-noreload-dialog').modal('show');
@@ -116,12 +121,12 @@
         function cancelOrder(order_id) {
             $('#notice-message').text('确定取消此订单?');
             $('#notice-dialog').modal('show');
-            $('#notice-confirm').off('click').on('click', function() {
+            $('#notice-confirm').off('click').on('click', function () {
                 $.ajax({
                     url: "/admin/order/" + order_id + "/cancel",
                     type: 'POST',
                     dataType: "json",
-                    success: function(data) {
+                    success: function (data) {
                         if (data.ret === 1) {
                             $('#success-message').text(data.msg);
                             $('#success-dialog').modal('show');
@@ -142,4 +147,4 @@
         loadTable();
     </script>
 
-{include file='admin/footer.tpl'}
+    {include file='admin/footer.tpl'}

+ 54 - 53
resources/views/tabler/admin/order/view.tpl

@@ -23,11 +23,11 @@
                             查看关联账单
                         </a>
                         {if $order->status === 'pending_payment'}
-                        <button href="#" class="btn btn-red" data-bs-toggle="modal"
-                            data-bs-target="#cancel_order_confirm_dialog">
-                            <i class="icon ti ti-x"></i>
-                            取消订单
-                        </button>
+                            <button href="#" class="btn btn-red" data-bs-toggle="modal"
+                                    data-bs-target="#cancel_order_confirm_dialog">
+                                <i class="icon ti ti-x"></i>
+                                取消订单
+                            </button>
                         {/if}
                     </div>
                 </div>
@@ -88,50 +88,50 @@
                 <div class="card-body">
                     <div class="datagrid">
                         {if $order->product_type === 'tabp' || $order->product_type === 'time'}
-                        <div class="datagrid-item">
-                            <div class="datagrid-title">商品时长 (天)</div>
-                            <div class="datagrid-content">{$order->content->time}</div>
-                        </div>
-                        <div class="datagrid-item">
-                            <div class="datagrid-title">等级时长 (天)</div>
-                            <div class="datagrid-content">{$order->content->class_time}</div>
-                        </div>
-                        <div class="datagrid-item">
-                            <div class="datagrid-title">等级</div>
-                            <div class="datagrid-content">{$order->content->class}</div>
-                        </div>
+                            <div class="datagrid-item">
+                                <div class="datagrid-title">商品时长 (天)</div>
+                                <div class="datagrid-content">{$order->content->time}</div>
+                            </div>
+                            <div class="datagrid-item">
+                                <div class="datagrid-title">等级时长 (天)</div>
+                                <div class="datagrid-content">{$order->content->class_time}</div>
+                            </div>
+                            <div class="datagrid-item">
+                                <div class="datagrid-title">等级</div>
+                                <div class="datagrid-content">{$order->content->class}</div>
+                            </div>
                         {/if}
                         {if $order->product_type === 'tabp' || $order->product_type === 'bandwidth'}
-                        <div class="datagrid-item">
-                            <div class="datagrid-title">可用流量 (GB)</div>
-                            <div class="datagrid-content">{$order->content->bandwidth}</div>
-                        </div>
+                            <div class="datagrid-item">
+                                <div class="datagrid-title">可用流量 (GB)</div>
+                                <div class="datagrid-content">{$order->content->bandwidth}</div>
+                            </div>
                         {/if}
                         {if $order->product_type === 'tabp' || $order->product_type === 'time'}
-                        <div class="datagrid-item">
-                            <div class="datagrid-title">用户分组</div>
-                            <div class="datagrid-content">{$order->content->node_group}</div>
-                        </div>
-                        <div class="datagrid-item">
-                            <div class="datagrid-title">速率限制 (Mbps)</div>
-                            <div class="datagrid-content">
-                            {if $order->content->ip_limit === '0'}
-                            不限制
-                            {else}
-                            {$order->content->speed_limit}
-                            {/if}
+                            <div class="datagrid-item">
+                                <div class="datagrid-title">用户分组</div>
+                                <div class="datagrid-content">{$order->content->node_group}</div>
                             </div>
-                        </div>
-                        <div class="datagrid-item">
-                            <div class="datagrid-title">同时连接IP限制</div>
-                            <div class="datagrid-content">
-                            {if $order->content->ip_limit === '0'}
-                            不限制
-                            {else}
-                            {$order->content->ip_limit}
-                            {/if}
+                            <div class="datagrid-item">
+                                <div class="datagrid-title">速率限制 (Mbps)</div>
+                                <div class="datagrid-content">
+                                    {if $order->content->ip_limit === '0'}
+                                        不限制
+                                    {else}
+                                        {$order->content->speed_limit}
+                                    {/if}
+                                </div>
+                            </div>
+                            <div class="datagrid-item">
+                                <div class="datagrid-title">同时连接IP限制</div>
+                                <div class="datagrid-content">
+                                    {if $order->content->ip_limit === '0'}
+                                        不限制
+                                    {else}
+                                        {$order->content->ip_limit}
+                                    {/if}
+                                </div>
                             </div>
-                        </div>
                         {/if}
                     </div>
                 </div>
@@ -148,18 +148,18 @@
                                 <div class="table-responsive">
                                     <table id="invoice_content_table" class="table table-vcenter card-table">
                                         <thead>
-                                            <tr>
-                                                <th>名称</th>
-                                                <th>价格</th>
-                                            </tr>
+                                        <tr>
+                                            <th>名称</th>
+                                            <th>价格</th>
+                                        </tr>
                                         </thead>
                                         <tbody>
-                                            {foreach $invoice->content as $invoice_content}
+                                        {foreach $invoice->content as $invoice_content}
                                             <tr>
                                                 <td>{$invoice_content->name}</td>
                                                 <td>{$invoice_content->price}</td>
                                             </tr>
-                                            {/foreach}
+                                        {/foreach}
                                         </tbody>
                                     </table>
                                 </div>
@@ -207,19 +207,20 @@
                 </div>
                 <div class="modal-footer">
                     <button type="button" class="btn me-auto" data-bs-dismiss="modal">取消</button>
-                    <button id="confirm_cancel" type="button" class="btn btn-primary" data-bs-dismiss="modal">确认</button>
+                    <button id="confirm_cancel" type="button" class="btn btn-primary" data-bs-dismiss="modal">确认
+                    </button>
                 </div>
             </div>
         </div>
     </div>
 
     <script>
-        $("#confirm_cancel").click(function() {
+        $("#confirm_cancel").click(function () {
             $.ajax({
                 url: "/admin/order/{$order->id}/cancel",
                 type: 'POST',
                 dataType: "json",
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -232,4 +233,4 @@
         });
     </script>
 
-{include file='admin/footer.tpl'}
+    {include file='admin/footer.tpl'}

+ 31 - 36
resources/views/tabler/admin/product/create.tpl

@@ -112,14 +112,14 @@
                                 <label class="form-label col-3 col-form-label required">速率限制 (Mbps)</label>
                                 <div class="col">
                                     <input id="speed_limit" type="text" class="form-control"
-                                        value="">
+                                           value="">
                                 </div>
                             </div>
                             <div id="ip_limit_option" class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label required">同时连接IP限制</label>
                                 <div class="col">
                                     <input id="ip_limit" type="text" class="form-control"
-                                        value="">
+                                           value="">
                                 </div>
                             </div>
                             <div class="hr-text">
@@ -129,14 +129,14 @@
                                 <label class="form-label col-3 col-form-label">用户等级要求</label>
                                 <div class="col">
                                     <input id="class_required" type="text" class="form-control"
-                                        value="">
+                                           value="">
                                 </div>
                             </div>
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label">用户所在的节点组</label>
                                 <div class="col">
                                     <input id="node_group_required" type="text" class="form-control"
-                                        value="">
+                                           value="">
                                 </div>
                             </div>
                             <div class="mb-3">
@@ -162,9 +162,8 @@
         $("#type").change();
     });
 
-    $("#type").on("change", function() {
-        if (this.value === "bandwidth")
-        {
+    $("#type").on("change", function () {
+        if (this.value === "bandwidth") {
             $("#time_option").hide();
             $("#class_option").hide();
             $("#class_time_option").hide();
@@ -172,16 +171,14 @@
             $("#node_group_option").hide();
             $("#speed_limit_option").hide();
             $("#ip_limit_option").hide();
-            $("#time").prop("required",false);
-            $("#class").prop("required",false);
-            $("#class_time").prop("required",false);
-            $("#bandwidth").prop("required",true);
-            $("#node_group").prop("required",false);
-            $("#speed_limit").prop("required",false);
-            $("#ip_limit").prop("required",false);
-        }
-        else if (this.value === "time")
-        {
+            $("#time").prop("required", false);
+            $("#class").prop("required", false);
+            $("#class_time").prop("required", false);
+            $("#bandwidth").prop("required", true);
+            $("#node_group").prop("required", false);
+            $("#speed_limit").prop("required", false);
+            $("#ip_limit").prop("required", false);
+        } else if (this.value === "time") {
             $("#time_option").show();
             $("#class_option").show();
             $("#class_time_option").show();
@@ -189,16 +186,14 @@
             $("#node_group_option").show();
             $("#speed_limit_option").show();
             $("#ip_limit_option").show();
-            $("#time").prop("required",true);
-            $("#class").prop("required",true);
-            $("#class_time").prop("required",true);
-            $("#bandwidth").prop("required",false);
-            $("#node_group").prop("required",true);
-            $("#speed_limit").prop("required",true);
-            $("#ip_limit").prop("required",true);
-        }
-        else
-        {
+            $("#time").prop("required", true);
+            $("#class").prop("required", true);
+            $("#class_time").prop("required", true);
+            $("#bandwidth").prop("required", false);
+            $("#node_group").prop("required", true);
+            $("#speed_limit").prop("required", true);
+            $("#ip_limit").prop("required", true);
+        } else {
             $("#time_option").show();
             $("#class_option").show();
             $("#class_time_option").show();
@@ -206,18 +201,18 @@
             $("#node_group_option").show();
             $("#speed_limit_option").show();
             $("#ip_limit_option").show();
-            $("#time").prop("required",true);
-            $("#class").prop("required",true);
-            $("#class_time").prop("required",true);
-            $("#bandwidth").prop("required",true);
-            $("#node_group").prop("required",true);
-            $("#speed_limit").prop("required",true);
-            $("#ip_limit").prop("required",true);
+            $("#time").prop("required", true);
+            $("#class").prop("required", true);
+            $("#class_time").prop("required", true);
+            $("#bandwidth").prop("required", true);
+            $("#node_group").prop("required", true);
+            $("#speed_limit").prop("required", true);
+            $("#ip_limit").prop("required", true);
         }
     });
 
-    $("#create-product").click(function() {
-        var emptyFields = $('input[required]').filter(function() {
+    $("#create-product").click(function () {
+        var emptyFields = $('input[required]').filter(function () {
             return $(this).val() === '';
         });
 

+ 45 - 47
resources/views/tabler/admin/product/edit.tpl

@@ -36,21 +36,21 @@
                                 <label class="form-label col-3 col-form-label required">名称</label>
                                 <div class="col">
                                     <input id="name" type="text" class="form-control"
-                                        value="{$product->name}">
+                                           value="{$product->name}">
                                 </div>
                             </div>
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label required">价格</label>
                                 <div class="col">
                                     <input id="price" type="text" class="form-control"
-                                        value="{$product->price}">
+                                           value="{$product->price}">
                                 </div>
                             </div>
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label required">库存(小于0时不限制)</label>
                                 <div class="col">
                                     <input id="stock" type="text" class="form-control"
-                                        value="{$product->stock}">
+                                           value="{$product->stock}">
                                 </div>
                             </div>
                             <div class="form-group mb-3 row">
@@ -66,9 +66,12 @@
                                 <label class="form-label col-3 col-form-label">类型</label>
                                 <div class="col">
                                     <select id="type" class="col form-select">
-                                        <option value="tabp" {if $product->type === "tabp"}selected{/if}>时间流量包</option>
+                                        <option value="tabp" {if $product->type === "tabp"}selected{/if}>时间流量包
+                                        </option>
                                         <option value="time" {if $product->type === "time"}selected{/if}>时间包</option>
-                                        <option value="bandwidth" {if $product->type === "bandwidth"}selected{/if}>流量包</option>
+                                        <option value="bandwidth" {if $product->type === "bandwidth"}selected{/if}>
+                                            流量包
+                                        </option>
                                     </select>
                                 </div>
                             </div>
@@ -85,49 +88,49 @@
                                 <label class="form-label col-3 col-form-label required">商品时长 (天)</label>
                                 <div class="col">
                                     <input id="time" type="text" class="form-control"
-                                        value="{$content->time}">
+                                           value="{$content->time}">
                                 </div>
                             </div>
                             <div id="class_option" class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label required">等级</label>
                                 <div class="col">
                                     <input id="class" type="text" class="form-control"
-                                        value="{$content->class}">
+                                           value="{$content->class}">
                                 </div>
                             </div>
                             <div id="class_time_option" class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label required">等级时长 (天)</label>
                                 <div class="col">
                                     <input id="class_time" type="text" class="form-control"
-                                        value="{$content->class_time}">
+                                           value="{$content->class_time}">
                                 </div>
                             </div>
                             <div id="bandwidth_option" class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label required">可用流量 (GB)</label>
                                 <div class="col">
                                     <input id="bandwidth" type="text" class="form-control"
-                                        value="{$content->bandwidth}">
+                                           value="{$content->bandwidth}">
                                 </div>
                             </div>
                             <div id="node_group_option" class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label required">用户分组</label>
                                 <div class="col">
                                     <input id="node_group" type="text" class="form-control"
-                                        value="{$content->node_group}">
+                                           value="{$content->node_group}">
                                 </div>
                             </div>
                             <div id="speed_limit_option" class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label required">速率限制 (Mbps)</label>
                                 <div class="col">
                                     <input id="speed_limit" type="text" class="form-control"
-                                        value="{$content->speed_limit}">
+                                           value="{$content->speed_limit}">
                                 </div>
                             </div>
                             <div id="ip_limit_option" class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label required">同时连接IP限制</label>
                                 <div class="col">
                                     <input id="ip_limit" type="text" class="form-control"
-                                        value="{$content->ip_limit}">
+                                           value="{$content->ip_limit}">
                                 </div>
                             </div>
                             <div class="hr-text">
@@ -137,14 +140,14 @@
                                 <label class="form-label col-3 col-form-label">用户等级要求</label>
                                 <div class="col">
                                     <input id="class_required" type="text" class="form-control"
-                                        value="{$limit->class_required}">
+                                           value="{$limit->class_required}">
                                 </div>
                             </div>
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label">用户所在的节点组</label>
                                 <div class="col">
                                     <input id="node_group_required" type="text" class="form-control"
-                                        value="{$limit->node_group_required}">
+                                           value="{$limit->node_group_required}">
                                 </div>
                             </div>
                             <div class="mb-3">
@@ -153,7 +156,7 @@
                                     <span class="col-auto">
                                         <label class="form-check form-check-single form-switch">
                                             <input id="new_user_requried" class="form-check-input" type="checkbox"
-                                                {if $limit->new_user_required === 1}checked="" {/if}>
+                                                   {if $limit->new_user_required === 1}checked="" {/if}>
                                         </label>
                                     </span>
                                 </label>
@@ -171,9 +174,8 @@
         $("#type").change();
     });
 
-    $("#type").on("change", function() {
-        if (this.value === "bandwidth")
-        {
+    $("#type").on("change", function () {
+        if (this.value === "bandwidth") {
             $("#time_option").hide();
             $("#class_option").hide();
             $("#class_time_option").hide();
@@ -181,16 +183,14 @@
             $("#node_group_option").hide();
             $("#speed_limit_option").hide();
             $("#ip_limit_option").hide();
-            $("#time").prop("required",false);
-            $("#class").prop("required",false);
-            $("#class_time").prop("required",false);
-            $("#bandwidth").prop("required",true);
-            $("#node_group").prop("required",false);
-            $("#speed_limit").prop("required",false);
-            $("#ip_limit").prop("required",false);
-        }
-        else if (this.value === "time")
-        {
+            $("#time").prop("required", false);
+            $("#class").prop("required", false);
+            $("#class_time").prop("required", false);
+            $("#bandwidth").prop("required", true);
+            $("#node_group").prop("required", false);
+            $("#speed_limit").prop("required", false);
+            $("#ip_limit").prop("required", false);
+        } else if (this.value === "time") {
             $("#time_option").show();
             $("#class_option").show();
             $("#class_time_option").show();
@@ -198,16 +198,14 @@
             $("#node_group_option").show();
             $("#speed_limit_option").show();
             $("#ip_limit_option").show();
-            $("#time").prop("required",true);
-            $("#class").prop("required",true);
-            $("#class_time").prop("required",true);
-            $("#bandwidth").prop("required",false);
-            $("#node_group").prop("required",true);
-            $("#speed_limit").prop("required",true);
-            $("#ip_limit").prop("required",true);
-        }
-        else
-        {
+            $("#time").prop("required", true);
+            $("#class").prop("required", true);
+            $("#class_time").prop("required", true);
+            $("#bandwidth").prop("required", false);
+            $("#node_group").prop("required", true);
+            $("#speed_limit").prop("required", true);
+            $("#ip_limit").prop("required", true);
+        } else {
             $("#time_option").show();
             $("#class_option").show();
             $("#class_time_option").show();
@@ -215,18 +213,18 @@
             $("#node_group_option").show();
             $("#speed_limit_option").show();
             $("#ip_limit_option").show();
-            $("#time").prop("required",true);
-            $("#class").prop("required",true);
-            $("#class_time").prop("required",true);
-            $("#bandwidth").prop("required",true);
-            $("#node_group").prop("required",true);
-            $("#speed_limit").prop("required",true);
-            $("#ip_limit").prop("required",true);
+            $("#time").prop("required", true);
+            $("#class").prop("required", true);
+            $("#class_time").prop("required", true);
+            $("#bandwidth").prop("required", true);
+            $("#node_group").prop("required", true);
+            $("#speed_limit").prop("required", true);
+            $("#ip_limit").prop("required", true);
         }
     });
 
-    $("#save-product").click(function() {
-        var emptyFields = $('input[required]').filter(function() {
+    $("#save-product").click(function () {
+        var emptyFields = $('input[required]').filter(function () {
             return $(this).val() === '';
         });
 

+ 19 - 14
resources/views/tabler/admin/product/index.tpl

@@ -31,11 +31,11 @@
                         <div class="table-responsive">
                             <table id="data_table" class="table card-table table-vcenter text-nowrap datatable">
                                 <thead>
-                                    <tr>
-                                        {foreach $details['field'] as $key => $value}
-                                            <th>{$value}</th>
-                                        {/foreach}
-                                    </tr>
+                                <tr>
+                                    {foreach $details['field'] as $key => $value}
+                                        <th>{$value}</th>
+                                    {/foreach}
+                                </tr>
                                 </thead>
                             </table>
                         </div>
@@ -52,7 +52,7 @@
                 type: 'POST',
                 dataSrc: 'products'
             },
-            "autoWidth":false,
+            "autoWidth": false,
             'iDisplayLength': 10,
             'scrollX': true,
             'order': [
@@ -60,11 +60,16 @@
             ],
             columns: [
                 {foreach $details['field'] as $key => $value}
-                { data: '{$key}' },
+                {
+                    data: '{$key}'
+                },
                 {/foreach}
             ],
-            "columnDefs":[
-                { targets:[0],orderable:false }
+            "columnDefs": [
+                {
+                    targets: [0],
+                    orderable: false
+                }
             ],
             "dom": "<'row px-3 py-3'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
                 "<'row'<'col-sm-12'tr>>" +
@@ -102,12 +107,12 @@
         function deleteProduct(product_id) {
             $('#notice-message').text('确定删除此产品?');
             $('#notice-dialog').modal('show');
-            $('#notice-confirm').off('click').on('click', function() {
+            $('#notice-confirm').off('click').on('click', function () {
                 $.ajax({
                     url: "/admin/product/" + product_id,
                     type: 'DELETE',
                     dataType: "json",
-                    success: function(data) {
+                    success: function (data) {
                         if (data.ret === 1) {
                             $('#success-noreload-message').text(data.msg);
                             $('#success-noreload-dialog').modal('show');
@@ -124,12 +129,12 @@
         function copyProduct(product_id) {
             $('#notice-message').text('确定复制此产品?');
             $('#notice-dialog').modal('show');
-            $('#notice-confirm').off('click').on('click', function() {
+            $('#notice-confirm').off('click').on('click', function () {
                 $.ajax({
                     url: "/admin/product/" + product_id + "/copy",
                     type: 'POST',
                     dataType: "json",
-                    success: function(data) {
+                    success: function (data) {
                         if (data.ret === 1) {
                             $('#success-noreload-message').text(data.msg);
                             $('#success-noreload-dialog').modal('show');
@@ -150,4 +155,4 @@
         loadTable();
     </script>
 
-{include file='admin/footer.tpl'}
+    {include file='admin/footer.tpl'}

+ 284 - 247
resources/views/tabler/admin/setting/billing.tpl

@@ -28,232 +28,271 @@
             <div class="row row-deck row-cards">
                 <div class="col-md-12">
                     <div class="card">
-                    <div class="card-header">
-                    <ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
-                        <li class="nav-item">
-                            <a href="#gateway" class="nav-link active" data-bs-toggle="tab">网关选择</a>
-                        </li>
-                        <li class="nav-item">
-                            <a href="#f2f" class="nav-link" data-bs-toggle="tab">支付宝当面付</a>
-                        </li>
-                        <li class="nav-item">
-                            <a href="#stripe" class="nav-link" data-bs-toggle="tab">Stripe</a>
-                        </li>
-                        <li class="nav-item">
-                            <a href="#epay" class="nav-link" data-bs-toggle="tab">EPay</a>
-                        </li>
-                        <li class="nav-item">
-                            <a href="#paypal" class="nav-link" data-bs-toggle="tab">PayPal</a>
-                        </li>
-                    </ul>
-                </div>
-                <div class="card-body">
-                    <div class="tab-content">
-                        <div class="tab-pane active show" id="gateway">
-                            {foreach $payment_gateways as $key => $value}
-                            <div class="form-group mb-3 row">
-                                <div class="row align-items-center">
-                                    <label class="form-label col-3 col-form-label">{$key}</label>
-                                    <label class="col-auto ms-auto form-check form-check-single form-switch">
-                                        <input id="{$value}_enable" class="form-check-input" type="checkbox"
-                                        {if in_array($value, $active_payment_gateway)}checked="" {/if}>
-                                    </label>
-                                </div>
-                            </div>
-                            {/foreach}
+                        <div class="card-header">
+                            <ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
+                                <li class="nav-item">
+                                    <a href="#gateway" class="nav-link active" data-bs-toggle="tab">网关选择</a>
+                                </li>
+                                <li class="nav-item">
+                                    <a href="#f2f" class="nav-link" data-bs-toggle="tab">支付宝当面付</a>
+                                </li>
+                                <li class="nav-item">
+                                    <a href="#stripe" class="nav-link" data-bs-toggle="tab">Stripe</a>
+                                </li>
+                                <li class="nav-item">
+                                    <a href="#epay" class="nav-link" data-bs-toggle="tab">EPay</a>
+                                </li>
+                                <li class="nav-item">
+                                    <a href="#paypal" class="nav-link" data-bs-toggle="tab">PayPal</a>
+                                </li>
+                            </ul>
                         </div>
-                        <div class="tab-pane" id="f2f">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">App ID</label>
-                                    <div class="col">
-                                        <input id="f2f_pay_app_id" type="text" class="form-control" value="{$settings['f2f_pay_app_id']}">
-                                    </div>
+                        <div class="card-body">
+                            <div class="tab-content">
+                                <div class="tab-pane active show" id="gateway">
+                                    {foreach $payment_gateways as $key => $value}
+                                        <div class="form-group mb-3 row">
+                                            <div class="row align-items-center">
+                                                <label class="form-label col-3 col-form-label">{$key}</label>
+                                                <label class="col-auto ms-auto form-check form-check-single form-switch">
+                                                    <input id="{$value}_enable" class="form-check-input" type="checkbox"
+                                                           {if in_array($value, $active_payment_gateway)}checked="" {/if}>
+                                                </label>
+                                            </div>
+                                        </div>
+                                    {/foreach}
                                 </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">PID</label>
-                                    <div class="col">
-                                        <input id="f2f_pay_pid" type="text" class="form-control" value="{$settings['f2f_pay_pid']}">
+                                <div class="tab-pane" id="f2f">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">App ID</label>
+                                            <div class="col">
+                                                <input id="f2f_pay_app_id" type="text" class="form-control"
+                                                       value="{$settings['f2f_pay_app_id']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">PID</label>
+                                            <div class="col">
+                                                <input id="f2f_pay_pid" type="text" class="form-control"
+                                                       value="{$settings['f2f_pay_pid']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">支付宝公钥</label>
+                                            <div class="col">
+                                                <input id="f2f_pay_public_key" type="text" class="form-control"
+                                                       value="{$settings['f2f_pay_public_key']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">应用私钥</label>
+                                            <div class="col">
+                                                <input id="f2f_pay_private_key" type="text" class="form-control"
+                                                       value="{$settings['f2f_pay_private_key']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">自定义回调地址(可选)</label>
+                                            <div class="col">
+                                                <input id="f2f_pay_notify_url" type="text" class="form-control"
+                                                       value="{$settings['f2f_pay_notify_url']}">
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">支付宝公钥</label>
-                                    <div class="col">
-                                        <input id="f2f_pay_public_key" type="text" class="form-control" value="{$settings['f2f_pay_public_key']}">
+                                <div class="tab-pane" id="stripe">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">银行卡支付</label>
+                                            <div class="col">
+                                                <select id="stripe_card" class="col form-select"
+                                                        value="{$settings['stripe_card']}">
+                                                    <option value="0">停用</option>
+                                                    <option value="1" {if $settings['stripe_card']}selected{/if}>启用
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">支付宝支付</label>
+                                            <div class="col">
+                                                <select id="stripe_alipay" class="col form-select"
+                                                        value="{$settings['stripe_alipay']}">
+                                                    <option value="0">停用</option>
+                                                    <option value="1" {if $settings['stripe_alipay']}selected{/if}>
+                                                        启用
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">微信支付</label>
+                                            <div class="col">
+                                                <select id="stripe_wechat" class="col form-select"
+                                                        value="{$settings['stripe_wechat']}">
+                                                    <option value="0">停用</option>
+                                                    <option value="1" {if $settings['stripe_wechat']}selected{/if}>
+                                                        启用
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">网关货币</label>
+                                            <div class="col">
+                                                <input id="stripe_currency" type="text" class="form-control"
+                                                       value="{$settings['stripe_currency']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">最低充值限额(整数)</label>
+                                            <div class="col">
+                                                <input id="stripe_min_recharge" type="text" class="form-control"
+                                                       value="{$settings['stripe_min_recharge']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">最高充值限额(整数)</label>
+                                            <div class="col">
+                                                <input id="stripe_max_recharge" type="text" class="form-control"
+                                                       value="{$settings['stripe_max_recharge']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">公钥</label>
+                                            <div class="col">
+                                                <input id="stripe_pk" type="text" class="form-control"
+                                                       value="{$settings['stripe_pk']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">私钥</label>
+                                            <div class="col">
+                                                <input id="stripe_sk" type="text" class="form-control"
+                                                       value="{$settings['stripe_sk']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">WebHook密钥</label>
+                                            <div class="col">
+                                                <input id="stripe_webhook_key" type="text" class="form-control"
+                                                       value="{$settings['stripe_webhook_key']}">
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">应用私钥</label>
-                                    <div class="col">
-                                        <input id="f2f_pay_private_key" type="text" class="form-control" value="{$settings['f2f_pay_private_key']}">
+                                <div class="tab-pane" id="epay">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">网关地址</label>
+                                            <div class="col">
+                                                <input id="epay_url" type="text" class="form-control"
+                                                       value="{$settings['epay_url']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">商户ID</label>
+                                            <div class="col">
+                                                <input id="epay_pid" type="text" class="form-control"
+                                                       value="{$settings['epay_pid']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">密钥</label>
+                                            <div class="col">
+                                                <input id="epay_key" type="text" class="form-control"
+                                                       value="{$settings['epay_key']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">支付宝</label>
+                                            <div class="col">
+                                                <select id="epay_alipay" class="col form-select"
+                                                        value="{$settings['epay_alipay']}">
+                                                    <option value="0">停用</option>
+                                                    <option value="1" {if $settings['epay_alipay']}selected{/if}>启用
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">微信支付</label>
+                                            <div class="col">
+                                                <select id="epay_wechat" class="col form-select"
+                                                        value="{$settings['epay_wechat']}">
+                                                    <option value="0">停用</option>
+                                                    <option value="1" {if $settings['epay_wechat']}selected{/if}>启用
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">QQ钱包</label>
+                                            <div class="col">
+                                                <select id="epay_qq" class="col form-select"
+                                                        value="{$settings['epay_qq']}">
+                                                    <option value="0">停用</option>
+                                                    <option value="1" {if $settings['epay_qq']}selected{/if}>启用
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">USDT</label>
+                                            <div class="col">
+                                                <select id="epay_usdt" class="col form-select"
+                                                        value="{$settings['epay_usdt']}">
+                                                    <option value="0">停用</option>
+                                                    <option value="1" {if $settings['epay_usdt']}selected{/if}>启用
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">自定义回调地址(可选)</label>
-                                    <div class="col">
-                                        <input id="f2f_pay_notify_url" type="text" class="form-control" value="{$settings['f2f_pay_notify_url']}">
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="tab-pane" id="stripe">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">银行卡支付</label>
-                                    <div class="col">
-                                        <select id="stripe_card" class="col form-select" value="{$settings['stripe_card']}">
-                                            <option value="0">停用</option>
-                                            <option value="1" {if $settings['stripe_card']}selected{/if}>启用</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">支付宝支付</label>
-                                    <div class="col">
-                                        <select id="stripe_alipay" class="col form-select" value="{$settings['stripe_alipay']}">
-                                            <option value="0">停用</option>
-                                            <option value="1" {if $settings['stripe_alipay']}selected{/if}>启用</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">微信支付</label>
-                                    <div class="col">
-                                        <select id="stripe_wechat" class="col form-select" value="{$settings['stripe_wechat']}">
-                                            <option value="0">停用</option>
-                                            <option value="1" {if $settings['stripe_wechat']}selected{/if}>启用</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">网关货币</label>
-                                    <div class="col">
-                                        <input id="stripe_currency" type="text" class="form-control" value="{$settings['stripe_currency']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">最低充值限额(整数)</label>
-                                    <div class="col">
-                                        <input id="stripe_min_recharge" type="text" class="form-control" value="{$settings['stripe_min_recharge']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">最高充值限额(整数)</label>
-                                    <div class="col">
-                                        <input id="stripe_max_recharge" type="text" class="form-control" value="{$settings['stripe_max_recharge']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">公钥</label>
-                                    <div class="col">
-                                        <input id="stripe_pk" type="text" class="form-control" value="{$settings['stripe_pk']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">私钥</label>
-                                    <div class="col">
-                                        <input id="stripe_sk" type="text" class="form-control" value="{$settings['stripe_sk']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">WebHook密钥</label>
-                                    <div class="col">
-                                        <input id="stripe_webhook_key" type="text" class="form-control" value="{$settings['stripe_webhook_key']}">
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="tab-pane" id="epay">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">网关地址</label>
-                                    <div class="col">
-                                        <input id="epay_url" type="text" class="form-control" value="{$settings['epay_url']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">商户ID</label>
-                                    <div class="col">
-                                        <input id="epay_pid" type="text" class="form-control" value="{$settings['epay_pid']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">密钥</label>
-                                    <div class="col">
-                                        <input id="epay_key" type="text" class="form-control" value="{$settings['epay_key']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">支付宝</label>
-                                    <div class="col">
-                                        <select id="epay_alipay" class="col form-select" value="{$settings['epay_alipay']}">
-                                            <option value="0">停用</option>
-                                            <option value="1" {if $settings['epay_alipay']}selected{/if}>启用</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">微信支付</label>
-                                    <div class="col">
-                                        <select id="epay_wechat" class="col form-select" value="{$settings['epay_wechat']}">
-                                            <option value="0">停用</option>
-                                            <option value="1" {if $settings['epay_wechat']}selected{/if}>启用</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">QQ钱包</label>
-                                    <div class="col">
-                                        <select id="epay_qq" class="col form-select" value="{$settings['epay_qq']}">
-                                            <option value="0">停用</option>
-                                            <option value="1" {if $settings['epay_qq']}selected{/if}>启用</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">USDT</label>
-                                    <div class="col">
-                                        <select id="epay_usdt" class="col form-select" value="{$settings['epay_usdt']}">
-                                            <option value="0">停用</option>
-                                            <option value="1" {if $settings['epay_usdt']}selected{/if}>启用</option>
-                                        </select>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="tab-pane" id="paypal">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">模式</label>
-                                    <div class="col">
-                                        <select id="paypal_mode" class="col form-select" value="{$settings['paypal_mode']}">
-                                            <option value="sandbox">Sandbox</option>
-                                            <option value="live" {if $settings['paypal_mode'] === 'live'}selected{/if}>Live</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">PayPal客戶ID</label>
-                                    <div class="col">
-                                        <input id="paypal_client_id" type="text" class="form-control" value="{$settings['paypal_client_id']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">PayPal客戶密钥</label>
-                                    <div class="col">
-                                        <input id="paypal_client_secret" type="text" class="form-control" value="{$settings['paypal_client_secret']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">PayPal货币</label>
-                                    <div class="col">
-                                        <input id="paypal_currency" type="text" class="form-control" value="{$settings['paypal_currency']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">PayPal语言</label>
-                                    <div class="col">
-                                        <input id="paypal_locale" type="text" class="form-control" value="{$settings['paypal_locale']}">
+                                <div class="tab-pane" id="paypal">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">模式</label>
+                                            <div class="col">
+                                                <select id="paypal_mode" class="col form-select"
+                                                        value="{$settings['paypal_mode']}">
+                                                    <option value="sandbox">Sandbox</option>
+                                                    <option value="live"
+                                                            {if $settings['paypal_mode'] === 'live'}selected{/if}>Live
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">PayPal客戶ID</label>
+                                            <div class="col">
+                                                <input id="paypal_client_id" type="text" class="form-control"
+                                                       value="{$settings['paypal_client_id']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">PayPal客戶密钥</label>
+                                            <div class="col">
+                                                <input id="paypal_client_secret" type="text" class="form-control"
+                                                       value="{$settings['paypal_client_secret']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">PayPal货币</label>
+                                            <div class="col">
+                                                <input id="paypal_currency" type="text" class="form-control"
+                                                       value="{$settings['paypal_currency']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">PayPal语言</label>
+                                            <div class="col">
+                                                <input id="paypal_locale" type="text" class="form-control"
+                                                       value="{$settings['paypal_locale']}">
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
                             </div>
@@ -262,34 +301,32 @@
                 </div>
             </div>
         </div>
-    </div>
-</div>
 
-<script>
-    $("#save-setting").click(function() {
-        $.ajax({
-            url: '/admin/setting/billing',
-            type: 'POST',
-            dataType: "json",
-            data: {
-                {foreach $update_field as $key}
-                {$key}: $('#{$key}').val(),
-                {/foreach}
-                {foreach $payment_gateways as $key => $value}
-                {$key}: $("#{$key}_enable").is(":checked"),
-                {/foreach}
-            },
-            success: function(data) {
-                if (data.ret === 1) {
-                    $('#success-message').text(data.msg);
-                    $('#success-dialog').modal('show');
-                } else {
-                    $('#fail-message').text(data.msg);
-                    $('#fail-dialog').modal('show');
-                }
-            }
-        })
-    });
-</script>
+        <script>
+            $("#save-setting").click(function () {
+                $.ajax({
+                    url: '/admin/setting/billing',
+                    type: 'POST',
+                    dataType: "json",
+                    data: {
+                        {foreach $update_field as $key}
+                        {$key}: $('#{$key}').val(),
+                        {/foreach}
+                        {foreach $payment_gateways as $key => $value}
+                        {$key}: $("#{$key}_enable").is(":checked"),
+                        {/foreach}
+                    },
+                    success: function (data) {
+                        if (data.ret === 1) {
+                            $('#success-message').text(data.msg);
+                            $('#success-dialog').modal('show');
+                        } else {
+                            $('#fail-message').text(data.msg);
+                            $('#fail-dialog').modal('show');
+                        }
+                    }
+                })
+            });
+        </script>
 
-{include file='admin/footer.tpl'}
+{include file='admin/footer.tpl'}

+ 146 - 113
resources/views/tabler/admin/setting/captcha.tpl

@@ -28,98 +28,133 @@
             <div class="row row-deck row-cards">
                 <div class="col-md-12">
                     <div class="card">
-                    <div class="card-header">
-                    <ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
-                        <li class="nav-item">
-                            <a href="#captcha" class="nav-link active" data-bs-toggle="tab">验证设置</a>
-                        </li>
-                        <li class="nav-item">
-                            <a href="#turnstile" class="nav-link" data-bs-toggle="tab">Turnstile</a>
-                        </li>
-                        <li class="nav-item">
-                            <a href="#geetest" class="nav-link" data-bs-toggle="tab">Geetest</a>
-                        </li>
-                    </ul>
-                </div>
-                <div class="card-body">
-                    <div class="tab-content">
-                        <div class="tab-pane active show" id="captcha">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">验证码提供商</label>
-                                    <div class="col">
-                                        <select id="captcha_provider" class="col form-select" value="{$settings['captcha_provider']}">
-                                            <option value="turnstile" {if $settings['captcha_provider'] === "turnstile"}selected{/if}>Turnstile</option>
-                                            <option value="geetest" {if $settings['captcha_provider'] === "geetest"}selected{/if}>Geetest</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">注册验证码</label>
-                                    <div class="col">
-                                        <select id="enable_reg_captcha" class="col form-select" value="{$settings['enable_reg_captcha']}">
-                                            <option value="0" {if ! $settings['enable_reg_captcha']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['enable_reg_captcha']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">登录验证码</label>
-                                    <div class="col">
-                                        <select id="enable_login_captcha" class="col form-select" value="{$settings['enable_login_captcha']}">
-                                            <option value="0" {if ! $settings['enable_login_captcha']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['enable_login_captcha']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">签到验证码</label>
-                                    <div class="col">
-                                        <select id="enable_checkin_captcha" class="col form-select" value="{$settings['enable_checkin_captcha']}">
-                                            <option value="0" {if ! $settings['enable_checkin_captcha']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['enable_checkin_captcha']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">重置密码验证码</label>
-                                    <div class="col">
-                                        <select id="enable_reset_password_captcha" class="col form-select" value="{$settings['enable_reset_password_captcha']}">
-                                            <option value="0" {if ! $settings['enable_reset_password_captcha']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['enable_reset_password_captcha']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                            </div>
+                        <div class="card-header">
+                            <ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
+                                <li class="nav-item">
+                                    <a href="#captcha" class="nav-link active" data-bs-toggle="tab">验证设置</a>
+                                </li>
+                                <li class="nav-item">
+                                    <a href="#turnstile" class="nav-link" data-bs-toggle="tab">Turnstile</a>
+                                </li>
+                                <li class="nav-item">
+                                    <a href="#geetest" class="nav-link" data-bs-toggle="tab">Geetest</a>
+                                </li>
+                            </ul>
                         </div>
-                        <div class="tab-pane" id="turnstile">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Turnstile Site Key</label>
-                                    <div class="col">
-                                        <input id="turnstile_sitekey" type="text" class="form-control" value="{$settings['turnstile_sitekey']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Turnstile Secret</label>
-                                    <div class="col">
-                                        <input id="turnstile_secret" type="text" class="form-control" value="{$settings['turnstile_secret']}">
+                        <div class="card-body">
+                            <div class="tab-content">
+                                <div class="tab-pane active show" id="captcha">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">验证码提供商</label>
+                                            <div class="col">
+                                                <select id="captcha_provider" class="col form-select"
+                                                        value="{$settings['captcha_provider']}">
+                                                    <option value="turnstile"
+                                                            {if $settings['captcha_provider'] === "turnstile"}selected{/if}>
+                                                        Turnstile
+                                                    </option>
+                                                    <option value="geetest"
+                                                            {if $settings['captcha_provider'] === "geetest"}selected{/if}>
+                                                        Geetest
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">注册验证码</label>
+                                            <div class="col">
+                                                <select id="enable_reg_captcha" class="col form-select"
+                                                        value="{$settings['enable_reg_captcha']}">
+                                                    <option value="0"
+                                                            {if ! $settings['enable_reg_captcha']}selected{/if}>关闭
+                                                    </option>
+                                                    <option value="1" {if $settings['enable_reg_captcha']}selected{/if}>
+                                                        开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">登录验证码</label>
+                                            <div class="col">
+                                                <select id="enable_login_captcha" class="col form-select"
+                                                        value="{$settings['enable_login_captcha']}">
+                                                    <option value="0"
+                                                            {if ! $settings['enable_login_captcha']}selected{/if}>关闭
+                                                    </option>
+                                                    <option value="1"
+                                                            {if $settings['enable_login_captcha']}selected{/if}>开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">签到验证码</label>
+                                            <div class="col">
+                                                <select id="enable_checkin_captcha" class="col form-select"
+                                                        value="{$settings['enable_checkin_captcha']}">
+                                                    <option value="0"
+                                                            {if ! $settings['enable_checkin_captcha']}selected{/if}>关闭
+                                                    </option>
+                                                    <option value="1"
+                                                            {if $settings['enable_checkin_captcha']}selected{/if}>开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">重置密码验证码</label>
+                                            <div class="col">
+                                                <select id="enable_reset_password_captcha" class="col form-select"
+                                                        value="{$settings['enable_reset_password_captcha']}">
+                                                    <option value="0"
+                                                            {if ! $settings['enable_reset_password_captcha']}selected{/if}>
+                                                        关闭
+                                                    </option>
+                                                    <option value="1"
+                                                            {if $settings['enable_reset_password_captcha']}selected{/if}>
+                                                        开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
-                            </div>
-                        </div>
-                        <div class="tab-pane" id="geetest">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Geetest ID</label>
-                                    <div class="col">
-                                        <input id="geetest_id" type="text" class="form-control" value="{$settings['geetest_id']}">
+                                <div class="tab-pane" id="turnstile">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Turnstile Site Key</label>
+                                            <div class="col">
+                                                <input id="turnstile_sitekey" type="text" class="form-control"
+                                                       value="{$settings['turnstile_sitekey']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Turnstile Secret</label>
+                                            <div class="col">
+                                                <input id="turnstile_secret" type="text" class="form-control"
+                                                       value="{$settings['turnstile_secret']}">
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Geetest Key</label>
-                                    <div class="col">
-                                        <input id="geetest_key" type="text" class="form-control" value="{$settings['geetest_key']}">
+                                <div class="tab-pane" id="geetest">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Geetest ID</label>
+                                            <div class="col">
+                                                <input id="geetest_id" type="text" class="form-control"
+                                                       value="{$settings['geetest_id']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Geetest Key</label>
+                                            <div class="col">
+                                                <input id="geetest_key" type="text" class="form-control"
+                                                       value="{$settings['geetest_key']}">
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
                             </div>
@@ -128,31 +163,29 @@
                 </div>
             </div>
         </div>
-    </div>
-</div>
 
-<script>
-    $("#save-setting").click(function() {
-        $.ajax({
-            url: '/admin/setting/captcha',
-            type: 'POST',
-            dataType: "json",
-            data: {
-                {foreach $update_field as $key}
-                {$key}: $('#{$key}').val(),
-                {/foreach}
-            },
-            success: function(data) {
-                if (data.ret === 1) {
-                    $('#success-message').text(data.msg);
-                    $('#success-dialog').modal('show');
-                } else {
-                    $('#fail-message').text(data.msg);
-                    $('#fail-dialog').modal('show');
-                }
-            }
-        })
-    });
-</script>
+        <script>
+            $("#save-setting").click(function () {
+                $.ajax({
+                    url: '/admin/setting/captcha',
+                    type: 'POST',
+                    dataType: "json",
+                    data: {
+                        {foreach $update_field as $key}
+                        {$key}: $('#{$key}').val(),
+                        {/foreach}
+                    },
+                    success: function (data) {
+                        if (data.ret === 1) {
+                            $('#success-message').text(data.msg);
+                            $('#success-dialog').modal('show');
+                        } else {
+                            $('#fail-message').text(data.msg);
+                            $('#fail-dialog').modal('show');
+                        }
+                    }
+                })
+            });
+        </script>
 
-{include file='admin/footer.tpl'}
+{include file='admin/footer.tpl'}

+ 177 - 142
resources/views/tabler/admin/setting/cron.tpl

@@ -28,129 +28,166 @@
             <div class="row row-deck row-cards">
                 <div class="col-md-12">
                     <div class="card">
-                    <div class="card-header">
-                    <ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
-                        <li class="nav-item">
-                            <a href="#daily_job" class="nav-link active" data-bs-toggle="tab">每日任务</a>
-                        </li>
-                        <li class="nav-item">
-                            <a href="#finance_mail" class="nav-link" data-bs-toggle="tab">财务报告</a>
-                        </li>
-                        <li class="nav-item">
-                            <a href="#detect" class="nav-link" data-bs-toggle="tab">审计任务</a>
-                        </li>
-                        <li class="nav-item">
-                            <a href="#inactive" class="nav-link" data-bs-toggle="tab">闲置账号检测</a>
-                        </li>
-                    </ul>
-                </div>
-                <div class="card-body">
-                    <div class="tab-content">
-                        <div class="tab-pane active show" id="daily_job">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">每日任务执行时间(小时)</label>
-                                    <div class="col">
-                                        <input id="daily_job_hour" type="text" class="form-control"
-                                               value="{$settings['daily_job_hour']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">每日任务执行时间(分钟)</label>
-                                    <div class="col">
-                                        <input id="daily_job_minute" type="text" class="form-control"
-                                               value="{$settings['daily_job_minute']}">
-                                    </div>
-                                </div>
-                            </div>
+                        <div class="card-header">
+                            <ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
+                                <li class="nav-item">
+                                    <a href="#daily_job" class="nav-link active" data-bs-toggle="tab">每日任务</a>
+                                </li>
+                                <li class="nav-item">
+                                    <a href="#finance_mail" class="nav-link" data-bs-toggle="tab">财务报告</a>
+                                </li>
+                                <li class="nav-item">
+                                    <a href="#detect" class="nav-link" data-bs-toggle="tab">审计任务</a>
+                                </li>
+                                <li class="nav-item">
+                                    <a href="#inactive" class="nav-link" data-bs-toggle="tab">闲置账号检测</a>
+                                </li>
+                            </ul>
                         </div>
-                        <div class="tab-pane show" id="finance_mail">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">是否启用每日财务报告</label>
-                                    <div class="col">
-                                        <select id="enable_daily_finance_mail" class="col form-select"
-                                                value="{$settings['enable_daily_finance_mail']}">
-                                            <option value="0" {if ! $settings['enable_daily_finance_mail']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['enable_daily_finance_mail']}selected{/if}>开启</option>
-                                        </select>
+                        <div class="card-body">
+                            <div class="tab-content">
+                                <div class="tab-pane active show" id="daily_job">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">每日任务执行时间(小时)</label>
+                                            <div class="col">
+                                                <input id="daily_job_hour" type="text" class="form-control"
+                                                       value="{$settings['daily_job_hour']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">每日任务执行时间(分钟)</label>
+                                            <div class="col">
+                                                <input id="daily_job_minute" type="text" class="form-control"
+                                                       value="{$settings['daily_job_minute']}">
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">是否启用每周财务报告</label>
-                                    <div class="col">
-                                        <select id="enable_weekly_finance_mail" class="col form-select"
-                                                value="{$settings['enable_weekly_finance_mail']}">
-                                            <option value="0" {if ! $settings['enable_weekly_finance_mail']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['enable_weekly_finance_mail']}selected{/if}>开启</option>
-                                        </select>
+                                <div class="tab-pane show" id="finance_mail">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">是否启用每日财务报告</label>
+                                            <div class="col">
+                                                <select id="enable_daily_finance_mail" class="col form-select"
+                                                        value="{$settings['enable_daily_finance_mail']}">
+                                                    <option value="0"
+                                                            {if ! $settings['enable_daily_finance_mail']}selected{/if}>
+                                                        关闭
+                                                    </option>
+                                                    <option value="1"
+                                                            {if $settings['enable_daily_finance_mail']}selected{/if}>开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">是否启用每周财务报告</label>
+                                            <div class="col">
+                                                <select id="enable_weekly_finance_mail" class="col form-select"
+                                                        value="{$settings['enable_weekly_finance_mail']}">
+                                                    <option value="0"
+                                                            {if ! $settings['enable_weekly_finance_mail']}selected{/if}>
+                                                        关闭
+                                                    </option>
+                                                    <option value="1"
+                                                            {if $settings['enable_weekly_finance_mail']}selected{/if}>开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">是否启用每月财务报告</label>
+                                            <div class="col">
+                                                <select id="enable_monthly_finance_mail" class="col form-select"
+                                                        value="{$settings['enable_monthly_finance_mail']}">
+                                                    <option value="0"
+                                                            {if ! $settings['enable_monthly_finance_mail']}selected{/if}>
+                                                        关闭
+                                                    </option>
+                                                    <option value="1"
+                                                            {if $settings['enable_monthly_finance_mail']}selected{/if}>
+                                                        开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">是否启用每月财务报告</label>
-                                    <div class="col">
-                                        <select id="enable_monthly_finance_mail" class="col form-select"
-                                                value="{$settings['enable_monthly_finance_mail']}">
-                                            <option value="0" {if ! $settings['enable_monthly_finance_mail']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['enable_monthly_finance_mail']}selected{/if}>开启</option>
-                                        </select>
+                                <div class="tab-pane show" id="detect">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">是否启用节点被墙检测</label>
+                                            <div class="col">
+                                                <select id="enable_detect_gfw" class="col form-select"
+                                                        value="{$settings['enable_detect_gfw']}">
+                                                    <option value="0"
+                                                            {if ! $settings['enable_detect_gfw']}selected{/if}>关闭
+                                                    </option>
+                                                    <option value="1" {if $settings['enable_detect_gfw']}selected{/if}>
+                                                        开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">是否启用审计封禁</label>
+                                            <div class="col">
+                                                <select id="enable_detect_ban" class="col form-select"
+                                                        value="{$settings['enable_detect_ban']}">
+                                                    <option value="0"
+                                                            {if ! $settings['enable_detect_ban']}selected{/if}>关闭
+                                                    </option>
+                                                    <option value="1" {if $settings['enable_detect_ban']}selected{/if}>
+                                                        开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
-                            </div>
-                        </div>
-                        <div class="tab-pane show" id="detect">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">是否启用节点被墙检测</label>
-                                    <div class="col">
-                                        <select id="enable_detect_gfw" class="col form-select" value="{$settings['enable_detect_gfw']}">
-                                            <option value="0" {if ! $settings['enable_detect_gfw']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['enable_detect_gfw']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">是否启用审计封禁</label>
-                                    <div class="col">
-                                        <select id="enable_detect_ban" class="col form-select" value="{$settings['enable_detect_ban']}">
-                                            <option value="0" {if ! $settings['enable_detect_ban']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['enable_detect_ban']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="tab-pane show" id="inactive">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">是否启用闲置账号检测</label>
-                                    <div class="col">
-                                        <select id="enable_detect_inactive_user" class="col form-select"
-                                                value="{$settings['enable_detect_inactive_user']}">
-                                            <option value="0" {if ! $settings['enable_detect_inactive_user']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['enable_detect_inactive_user']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">未签到时长(天)</label>
-                                    <div class="col">
-                                        <input id="detect_inactive_user_checkin_days" type="text" class="form-control"
-                                               value="{$settings['detect_inactive_user_checkin_days']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">未登录时长(天)</label>
-                                    <div class="col">
-                                        <input id="detect_inactive_user_login_days" type="text" class="form-control"
-                                               value="{$settings['detect_inactive_user_login_days']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">未使用时长(天)</label>
-                                    <div class="col">
-                                        <input id="detect_inactive_user_use_days" type="text" class="form-control"
-                                               value="{$settings['detect_inactive_user_use_days']}">
+                                <div class="tab-pane show" id="inactive">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">是否启用闲置账号检测</label>
+                                            <div class="col">
+                                                <select id="enable_detect_inactive_user" class="col form-select"
+                                                        value="{$settings['enable_detect_inactive_user']}">
+                                                    <option value="0"
+                                                            {if ! $settings['enable_detect_inactive_user']}selected{/if}>
+                                                        关闭
+                                                    </option>
+                                                    <option value="1"
+                                                            {if $settings['enable_detect_inactive_user']}selected{/if}>
+                                                        开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">未签到时长(天)</label>
+                                            <div class="col">
+                                                <input id="detect_inactive_user_checkin_days" type="text"
+                                                       class="form-control"
+                                                       value="{$settings['detect_inactive_user_checkin_days']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">未登录时长(天)</label>
+                                            <div class="col">
+                                                <input id="detect_inactive_user_login_days" type="text"
+                                                       class="form-control"
+                                                       value="{$settings['detect_inactive_user_login_days']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">未使用时长(天)</label>
+                                            <div class="col">
+                                                <input id="detect_inactive_user_use_days" type="text"
+                                                       class="form-control"
+                                                       value="{$settings['detect_inactive_user_use_days']}">
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
                             </div>
@@ -159,31 +196,29 @@
                 </div>
             </div>
         </div>
-    </div>
-</div>
 
-<script>
-    $("#save-setting").click(function() {
-        $.ajax({
-            url: '/admin/setting/cron',
-            type: 'POST',
-            dataType: "json",
-            data: {
-                {foreach $update_field as $key}
-                {$key}: $('#{$key}').val(),
-                {/foreach}
-            },
-            success: function(data) {
-                if (data.ret === 1) {
-                    $('#success-message').text(data.msg);
-                    $('#success-dialog').modal('show');
-                } else {
-                    $('#fail-message').text(data.msg);
-                    $('#fail-dialog').modal('show');
-                }
-            }
-        })
-    });
-</script>
+        <script>
+            $("#save-setting").click(function () {
+                $.ajax({
+                    url: '/admin/setting/cron',
+                    type: 'POST',
+                    dataType: "json",
+                    data: {
+                        {foreach $update_field as $key}
+                        {$key}: $('#{$key}').val(),
+                        {/foreach}
+                    },
+                    success: function (data) {
+                        if (data.ret === 1) {
+                            $('#success-message').text(data.msg);
+                            $('#success-dialog').modal('show');
+                        } else {
+                            $('#fail-message').text(data.msg);
+                            $('#fail-dialog').modal('show');
+                        }
+                    }
+                })
+            });
+        </script>
 
-{include file='admin/footer.tpl'}
+        {include file='admin/footer.tpl'}

+ 335 - 281
resources/views/tabler/admin/setting/email.tpl

@@ -28,255 +28,311 @@
             <div class="row row-deck row-cards">
                 <div class="col-md-12">
                     <div class="card">
-                    <div class="card-header">
-                    <ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
-                        <li class="nav-item">
-                            <a href="#email" class="nav-link active" data-bs-toggle="tab">邮件设置</a>
-                        </li>
-                        <li class="nav-item">
-                            <a href="#limit" class="nav-link" data-bs-toggle="tab">发送限制</a>
-                        </li>
-                        <li class="nav-item">
-                            <a href="#smtp" class="nav-link" data-bs-toggle="tab">SMTP</a>
-                        </li>
-                        <li class="nav-item">
-                            <a href="#sendgrid" class="nav-link" data-bs-toggle="tab">Sendgrid</a>
-                        </li>
-                        <li class="nav-item">
-                            <a href="#mailgun" class="nav-link" data-bs-toggle="tab">Mailgun</a>
-                        </li>
-                        <li class="nav-item">
-                            <a href="#postal" class="nav-link" data-bs-toggle="tab">Postal</a>
-                        </li>
-                        <li class="nav-item">
-                            <a href="#ses" class="nav-link" data-bs-toggle="tab">AWS SES</a>
-                        </li>
-                    </ul>
-                </div>
-                <div class="card-body">
-                    <div class="tab-content">
-                        <div class="tab-pane active show" id="email">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">邮件服务提供商</label>
-                                    <div class="col">
-                                        <select id="email_driver" class="col form-select" value="{$settings['email_driver']}">
-                                            <option value="none" {if $settings['email_driver'] === "none"}selected{/if}>none</option>
-                                            <option value="smtp" {if $settings['email_driver'] === "smtp"}selected{/if}>smtp</option>
-                                            <option value="sendgrid" {if $settings['email_driver'] === "sendgrid"}selected{/if}>sendgrid</option>
-                                            <option value="mailgun" {if $settings['email_driver'] === "mailgun"}selected{/if}>mailgun</option>
-                                            <option value="postal" {if $settings['email_driver'] === "postal"}selected{/if}>postal</option>
-                                            <option value="ses" {if $settings['email_driver'] === "ses"}selected{/if}>ses</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">测试邮件接收地址</label>
-                                    <input type="text" class="form-control" id="recipient" value="">
-                                    <div class="row my-3">
-                                        <div class="col">
-                                            <button id="test-email" class="btn btn-primary">发送测试邮件</button>
-                                        </div>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="tab-pane" id="limit">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">邮箱验证码有效期(秒)</label>
-                                    <div class="col">
-                                        <input id="email_verify_code_ttl" type="text" class="form-control"
-                                               value="{$settings['email_verify_code_ttl']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">邮箱重设密码链接有效期(秒)</label>
-                                    <div class="col">
-                                        <input id="email_password_reset_ttl" type="text" class="form-control"
-                                               value="{$settings['email_password_reset_ttl']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">单个IP每小时可请求的发信次数</label>
-                                    <div class="col">
-                                        <input id="email_request_ip_limit" type="text" class="form-control"
-                                               value="{$settings['email_request_ip_limit']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">单个邮箱地址每小时可请求的发信次数</label>
-                                    <div class="col">
-                                        <input id="email_request_address_limit" type="text" class="form-control"
-                                               value="{$settings['email_request_address_limit']}">
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="tab-pane" id="smtp">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">SMTP 主机地址</label>
-                                    <div class="col">
-                                        <input id="smtp_host" type="text" class="form-control" value="{$settings['smtp_host']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">SMTP 用户名</label>
-                                    <div class="col">
-                                        <input id="smtp_username" type="text" class="form-control" value="{$settings['smtp_username']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">SMTP 密码</label>
-                                    <div class="col">
-                                        <input id="smtp_password" type="text" class="form-control" value="{$settings['smtp_password']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">SMTP 端口</label>
-                                    <div class="col">
-                                        <select id="smtp_port" class="col form-select" value="{$settings['smtp_port']}">
-                                            <option value="465" {if $settings['smtp_port'] === "465"}selected{/if}>465</option>
-                                            <option value="587" {if $settings['smtp_port'] === "587"}selected{/if}>587</option>
-                                            <option value="443" {if $settings['smtp_port'] === "443"}selected{/if}>443</option>
-                                            <option value="80" {if $settings['smtp_port'] === "80"}selected{/if}>80</option>
-                                            <option value="2525" {if $settings['smtp_port'] === "2525"}selected{/if}>2525</option>
-                                            <option value="25" {if $settings['smtp_port'] === "25"}selected{/if}>25</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">SMTP 发件人名称</label>
-                                    <div class="col">
-                                        <input id="smtp_name" type="text" class="form-control" value="{$settings['smtp_name']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">SMTP 发信地址</label>
-                                    <div class="col">
-                                        <input id="smtp_sender" type="text" class="form-control" value="{$settings['smtp_sender']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">是否使用 TLS/SSL</label>
-                                    <div class="col">
-                                    <select id="smtp_ssl" class="col form-select" value="{$settings['smtp_ssl']}">
-                                        <option value="0" {if ! $settings['smtp_ssl']}selected{/if}>关闭</option>
-                                        <option value="1" {if $settings['smtp_ssl']}selected{/if}>开启</option>
-                                    </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">客户邮件副本接收邮箱</label>
-                                    <div class="col">
-                                        <input id="smtp_bbc" type="text" class="form-control" value="{$settings['smtp_bbc']}">
-                                    </div>
-                                </div>
-                            </div>
+                        <div class="card-header">
+                            <ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
+                                <li class="nav-item">
+                                    <a href="#email" class="nav-link active" data-bs-toggle="tab">邮件设置</a>
+                                </li>
+                                <li class="nav-item">
+                                    <a href="#limit" class="nav-link" data-bs-toggle="tab">发送限制</a>
+                                </li>
+                                <li class="nav-item">
+                                    <a href="#smtp" class="nav-link" data-bs-toggle="tab">SMTP</a>
+                                </li>
+                                <li class="nav-item">
+                                    <a href="#sendgrid" class="nav-link" data-bs-toggle="tab">Sendgrid</a>
+                                </li>
+                                <li class="nav-item">
+                                    <a href="#mailgun" class="nav-link" data-bs-toggle="tab">Mailgun</a>
+                                </li>
+                                <li class="nav-item">
+                                    <a href="#postal" class="nav-link" data-bs-toggle="tab">Postal</a>
+                                </li>
+                                <li class="nav-item">
+                                    <a href="#ses" class="nav-link" data-bs-toggle="tab">AWS SES</a>
+                                </li>
+                            </ul>
                         </div>
-                        <div class="tab-pane" id="sendgrid">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Sendgrid 密钥</label>
-                                    <div class="col">
-                                        <input id="sendgrid_key" type="text" class="form-control" value="{$settings['sendgrid_key']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Sendgrid 发信地址</label>
-                                    <div class="col">
-                                        <input id="sendgrid_sender" type="text" class="form-control" value="{$settings['sendgrid_sender']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Sendgrid 发件人名称</label>
-                                    <div class="col">
-                                        <input id="sendgrid_name" type="text" class="form-control" value="{$settings['sendgrid_name']}">
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="tab-pane" id="mailgun">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Mailgun 密钥</label>
-                                    <div class="col">
-                                        <input id="mailgun_key" type="text" class="form-control" value="{$settings['mailgun_key']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Mailgun 域名</label>
-                                    <div class="col">
-                                        <input id="mailgun_domain" type="text" class="form-control" value="{$settings['mailgun_domain']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Mailgun 发信地址</label>
-                                    <div class="col">
-                                        <input id="mailgun_sender" type="text" class="form-control" value="{$settings['mailgun_sender']}">
-                                    </div>
-                                </div>
-                                 <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Mailgun 发信人名称</label>
-                                    <div class="col">
-                                        <input id="mailgun_sender_name" type="text" class="form-control" value="{$settings['mailgun_sender_name']}">
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="tab-pane" id="postal">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Postal API地址</label>
-                                    <div class="col">
-                                        <input id="postal_host" type="text" class="form-control" value="{$settings['postal_host']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Postal API密钥</label>
-                                    <div class="col">
-                                        <input id="postal_key" type="text" class="form-control" value="{$settings['postal_key']}">
+                        <div class="card-body">
+                            <div class="tab-content">
+                                <div class="tab-pane active show" id="email">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">邮件服务提供商</label>
+                                            <div class="col">
+                                                <select id="email_driver" class="col form-select"
+                                                        value="{$settings['email_driver']}">
+                                                    <option value="none"
+                                                            {if $settings['email_driver'] === "none"}selected{/if}>none
+                                                    </option>
+                                                    <option value="smtp"
+                                                            {if $settings['email_driver'] === "smtp"}selected{/if}>smtp
+                                                    </option>
+                                                    <option value="sendgrid"
+                                                            {if $settings['email_driver'] === "sendgrid"}selected{/if}>
+                                                        sendgrid
+                                                    </option>
+                                                    <option value="mailgun"
+                                                            {if $settings['email_driver'] === "mailgun"}selected{/if}>
+                                                        mailgun
+                                                    </option>
+                                                    <option value="postal"
+                                                            {if $settings['email_driver'] === "postal"}selected{/if}>
+                                                        postal
+                                                    </option>
+                                                    <option value="ses"
+                                                            {if $settings['email_driver'] === "ses"}selected{/if}>ses
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">测试邮件接收地址</label>
+                                            <input type="text" class="form-control" id="recipient" value="">
+                                            <div class="row my-3">
+                                                <div class="col">
+                                                    <button id="test-email" class="btn btn-primary">发送测试邮件
+                                                    </button>
+                                                </div>
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Postal发件邮箱</label>
-                                    <div class="col">
-                                        <input id="postal_sender" type="text" class="form-control" value="{$settings['postal_sender']}">
+                                <div class="tab-pane" id="limit">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">邮箱验证码有效期(秒)</label>
+                                            <div class="col">
+                                                <input id="email_verify_code_ttl" type="text" class="form-control"
+                                                       value="{$settings['email_verify_code_ttl']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">邮箱重设密码链接有效期(秒)</label>
+                                            <div class="col">
+                                                <input id="email_password_reset_ttl" type="text" class="form-control"
+                                                       value="{$settings['email_password_reset_ttl']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">单个IP每小时可请求的发信次数</label>
+                                            <div class="col">
+                                                <input id="email_request_ip_limit" type="text" class="form-control"
+                                                       value="{$settings['email_request_ip_limit']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">单个邮箱地址每小时可请求的发信次数</label>
+                                            <div class="col">
+                                                <input id="email_request_address_limit" type="text" class="form-control"
+                                                       value="{$settings['email_request_address_limit']}">
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Postal发件人名称</label>
-                                    <div class="col">
-                                        <input id="postal_name" type="text" class="form-control" value="{$settings['postal_name']}">
+                                <div class="tab-pane" id="smtp">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">SMTP 主机地址</label>
+                                            <div class="col">
+                                                <input id="smtp_host" type="text" class="form-control"
+                                                       value="{$settings['smtp_host']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">SMTP 用户名</label>
+                                            <div class="col">
+                                                <input id="smtp_username" type="text" class="form-control"
+                                                       value="{$settings['smtp_username']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">SMTP 密码</label>
+                                            <div class="col">
+                                                <input id="smtp_password" type="text" class="form-control"
+                                                       value="{$settings['smtp_password']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">SMTP 端口</label>
+                                            <div class="col">
+                                                <select id="smtp_port" class="col form-select"
+                                                        value="{$settings['smtp_port']}">
+                                                    <option value="465"
+                                                            {if $settings['smtp_port'] === "465"}selected{/if}>465
+                                                    </option>
+                                                    <option value="587"
+                                                            {if $settings['smtp_port'] === "587"}selected{/if}>587
+                                                    </option>
+                                                    <option value="443"
+                                                            {if $settings['smtp_port'] === "443"}selected{/if}>443
+                                                    </option>
+                                                    <option value="80"
+                                                            {if $settings['smtp_port'] === "80"}selected{/if}>80
+                                                    </option>
+                                                    <option value="2525"
+                                                            {if $settings['smtp_port'] === "2525"}selected{/if}>2525
+                                                    </option>
+                                                    <option value="25"
+                                                            {if $settings['smtp_port'] === "25"}selected{/if}>25
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">SMTP 发件人名称</label>
+                                            <div class="col">
+                                                <input id="smtp_name" type="text" class="form-control"
+                                                       value="{$settings['smtp_name']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">SMTP 发信地址</label>
+                                            <div class="col">
+                                                <input id="smtp_sender" type="text" class="form-control"
+                                                       value="{$settings['smtp_sender']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">是否使用 TLS/SSL</label>
+                                            <div class="col">
+                                                <select id="smtp_ssl" class="col form-select"
+                                                        value="{$settings['smtp_ssl']}">
+                                                    <option value="0" {if ! $settings['smtp_ssl']}selected{/if}>关闭
+                                                    </option>
+                                                    <option value="1" {if $settings['smtp_ssl']}selected{/if}>开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">客户邮件副本接收邮箱</label>
+                                            <div class="col">
+                                                <input id="smtp_bbc" type="text" class="form-control"
+                                                       value="{$settings['smtp_bbc']}">
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
-                            </div>
-                        </div>
-                        <div class="tab-pane" id="ses">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">AWS 密钥 ID</label>
-                                    <div class="col">
-                                        <input id="aws_access_key_id" type="text" class="form-control" value="{$settings['aws_access_key_id']}">
+                                <div class="tab-pane" id="sendgrid">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Sendgrid 密钥</label>
+                                            <div class="col">
+                                                <input id="sendgrid_key" type="text" class="form-control"
+                                                       value="{$settings['sendgrid_key']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Sendgrid 发信地址</label>
+                                            <div class="col">
+                                                <input id="sendgrid_sender" type="text" class="form-control"
+                                                       value="{$settings['sendgrid_sender']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Sendgrid 发件人名称</label>
+                                            <div class="col">
+                                                <input id="sendgrid_name" type="text" class="form-control"
+                                                       value="{$settings['sendgrid_name']}">
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">AWS 密钥</label>
-                                    <div class="col">
-                                        <input id="aws_secret_access_key" type="text" class="form-control" value="{$settings['aws_secret_access_key']}">
+                                <div class="tab-pane" id="mailgun">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Mailgun 密钥</label>
+                                            <div class="col">
+                                                <input id="mailgun_key" type="text" class="form-control"
+                                                       value="{$settings['mailgun_key']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Mailgun 域名</label>
+                                            <div class="col">
+                                                <input id="mailgun_domain" type="text" class="form-control"
+                                                       value="{$settings['mailgun_domain']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Mailgun 发信地址</label>
+                                            <div class="col">
+                                                <input id="mailgun_sender" type="text" class="form-control"
+                                                       value="{$settings['mailgun_sender']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Mailgun 发信人名称</label>
+                                            <div class="col">
+                                                <input id="mailgun_sender_name" type="text" class="form-control"
+                                                       value="{$settings['mailgun_sender_name']}">
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">AWS 区域</label>
-                                    <div class="col">
-                                        <input id="aws_region" type="text" class="form-control" value="{$settings['aws_region']}">
+                                <div class="tab-pane" id="postal">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Postal API地址</label>
+                                            <div class="col">
+                                                <input id="postal_host" type="text" class="form-control"
+                                                       value="{$settings['postal_host']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Postal API密钥</label>
+                                            <div class="col">
+                                                <input id="postal_key" type="text" class="form-control"
+                                                       value="{$settings['postal_key']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Postal发件邮箱</label>
+                                            <div class="col">
+                                                <input id="postal_sender" type="text" class="form-control"
+                                                       value="{$settings['postal_sender']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Postal发件人名称</label>
+                                            <div class="col">
+                                                <input id="postal_name" type="text" class="form-control"
+                                                       value="{$settings['postal_name']}">
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">AWS SES 发信地址</label>
-                                    <div class="col">
-                                        <input id="aws_ses_sender" type="text" class="form-control" value="{$settings['aws_ses_sender']}">
+                                <div class="tab-pane" id="ses">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">AWS 密钥 ID</label>
+                                            <div class="col">
+                                                <input id="aws_access_key_id" type="text" class="form-control"
+                                                       value="{$settings['aws_access_key_id']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">AWS 密钥</label>
+                                            <div class="col">
+                                                <input id="aws_secret_access_key" type="text" class="form-control"
+                                                       value="{$settings['aws_secret_access_key']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">AWS 区域</label>
+                                            <div class="col">
+                                                <input id="aws_region" type="text" class="form-control"
+                                                       value="{$settings['aws_region']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">AWS SES 发信地址</label>
+                                            <div class="col">
+                                                <input id="aws_ses_sender" type="text" class="form-control"
+                                                       value="{$settings['aws_ses_sender']}">
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
                             </div>
@@ -285,51 +341,49 @@
                 </div>
             </div>
         </div>
-    </div>
-</div>
 
-<script>
-    $("#save-setting").click(function() {
-        $.ajax({
-            url: '/admin/setting/email',
-            type: 'POST',
-            dataType: "json",
-            data: {
-                {foreach $update_field as $key}
-                {$key}: $('#{$key}').val(),
-                {/foreach}
-            },
-            success: function(data) {
-                if (data.ret === 1) {
-                    $('#success-message').text(data.msg);
-                    $('#success-dialog').modal('show');
-                } else {
-                    $('#fail-message').text(data.msg);
-                    $('#fail-dialog').modal('show');
-                }
-            }
-        })
-    });
+        <script>
+            $("#save-setting").click(function () {
+                $.ajax({
+                    url: '/admin/setting/email',
+                    type: 'POST',
+                    dataType: "json",
+                    data: {
+                        {foreach $update_field as $key}
+                        {$key}: $('#{$key}').val(),
+                        {/foreach}
+                    },
+                    success: function (data) {
+                        if (data.ret === 1) {
+                            $('#success-message').text(data.msg);
+                            $('#success-dialog').modal('show');
+                        } else {
+                            $('#fail-message').text(data.msg);
+                            $('#fail-dialog').modal('show');
+                        }
+                    }
+                })
+            });
 
-    $("#test-email").click(function() {
-        $.ajax({
-            url: '/admin/setting/test_email',
-            type: 'POST',
-            dataType: "json",
-            data: {
-                recipient: $('#recipient').val(),
-            },
-            success: function(data) {
-                if (data.ret === 1) {
-                    $('#success-noreload-message').text(data.msg);
-                    $('#success-noreload-dialog').modal('show');
-                } else {
-                    $('#fail-message').text(data.msg);
-                    $('#fail-dialog').modal('show');
-                }
-            }
-        })
-    });
-</script>
+            $("#test-email").click(function () {
+                $.ajax({
+                    url: '/admin/setting/test_email',
+                    type: 'POST',
+                    dataType: "json",
+                    data: {
+                        recipient: $('#recipient').val(),
+                    },
+                    success: function (data) {
+                        if (data.ret === 1) {
+                            $('#success-noreload-message').text(data.msg);
+                            $('#success-noreload-dialog').modal('show');
+                        } else {
+                            $('#fail-message').text(data.msg);
+                            $('#fail-dialog').modal('show');
+                        }
+                    }
+                })
+            });
+        </script>
 
-{include file='admin/footer.tpl'}
+        {include file='admin/footer.tpl'}

+ 164 - 123
resources/views/tabler/admin/setting/feature.tpl

@@ -28,106 +28,149 @@
             <div class="row row-deck row-cards">
                 <div class="col-md-12">
                     <div class="card">
-                    <div class="card-header">
-                    <ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
-                        <li class="nav-item">
-                            <a href="#display" class="nav-link active" data-bs-toggle="tab">功能显示</a>
-                        </li>
-                        <li class="nav-item">
-                            <a href="#log" class="nav-link" data-bs-toggle="tab">用户日志</a>
-                        </li>
-                    </ul>
-                </div>
-                <div class="card-body">
-                    <div class="tab-content">
-                        <div class="tab-pane active show" id="display">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">显示用户审计记录</label>
-                                    <div class="col">
-                                        <select id="display_detect_log" class="col form-select" value="{$settings['display_detect_log']}">
-                                            <option value="0" {if ! $settings['display_detect_log']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['display_detect_log']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">显示文档</label>
-                                    <div class="col">
-                                        <select id="display_docs" class="col form-select" value="{$settings['display_docs']}">
-                                            <option value="0" {if ! $settings['display_docs']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['display_docs']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">文档仅付费用户可见</label>
-                                    <div class="col">
-                                        <select id="display_docs_only_for_paid_user" class="col form-select" value="{$settings['display_docs_only_for_paid_user']}">
-                                            <option value="0" {if ! $settings['display_docs_only_for_paid_user']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['display_docs_only_for_paid_user']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                            </div>
+                        <div class="card-header">
+                            <ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
+                                <li class="nav-item">
+                                    <a href="#display" class="nav-link active" data-bs-toggle="tab">功能显示</a>
+                                </li>
+                                <li class="nav-item">
+                                    <a href="#log" class="nav-link" data-bs-toggle="tab">用户日志</a>
+                                </li>
+                            </ul>
                         </div>
-                        <div class="tab-pane" id="log">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">启用每小时使用流量日志</label>
-                                    <div class="col">
-                                        <select id="traffic_log" class="col form-select" value="{$settings['traffic_log']}">
-                                            <option value="0" {if ! $settings['traffic_log']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['traffic_log']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">流量日志保留天数</label>
-                                    <div class="col">
-                                        <input id="traffic_log_retention_days" type="text" class="form-control" value="{$settings['traffic_log_retention_days']}">
+                        <div class="card-body">
+                            <div class="tab-content">
+                                <div class="tab-pane active show" id="display">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">显示用户审计记录</label>
+                                            <div class="col">
+                                                <select id="display_detect_log" class="col form-select"
+                                                        value="{$settings['display_detect_log']}">
+                                                    <option value="0"
+                                                            {if ! $settings['display_detect_log']}selected{/if}>关闭
+                                                    </option>
+                                                    <option value="1" {if $settings['display_detect_log']}selected{/if}>
+                                                        开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">显示文档</label>
+                                            <div class="col">
+                                                <select id="display_docs" class="col form-select"
+                                                        value="{$settings['display_docs']}">
+                                                    <option value="0" {if ! $settings['display_docs']}selected{/if}>
+                                                        关闭
+                                                    </option>
+                                                    <option value="1" {if $settings['display_docs']}selected{/if}>开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">文档仅付费用户可见</label>
+                                            <div class="col">
+                                                <select id="display_docs_only_for_paid_user" class="col form-select"
+                                                        value="{$settings['display_docs_only_for_paid_user']}">
+                                                    <option value="0"
+                                                            {if ! $settings['display_docs_only_for_paid_user']}selected{/if}>
+                                                        关闭
+                                                    </option>
+                                                    <option value="1"
+                                                            {if $settings['display_docs_only_for_paid_user']}selected{/if}>
+                                                        开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">启用订阅日志</label>
-                                    <div class="col">
-                                        <select id="subscribe_log" class="col form-select" value="{$settings['subscribe_log']}">
-                                            <option value="0" {if ! $settings['subscribe_log']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['subscribe_log']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">订阅日志保留天数</label>
-                                    <div class="col">
-                                        <input id="subscribe_log_retention_days" type="text" class="form-control" value="{$settings['subscribe_log_retention_days']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">通知用户新IP订阅</label>
-                                    <div class="col">
-                                        <select id="notify_new_subscribe" class="col form-select" value="{$settings['notify_new_subscribe']}">
-                                            <option value="0" {if ! $settings['notify_new_subscribe']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['notify_new_subscribe']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">启用登录日志</label>
-                                    <div class="col">
-                                        <select id="login_log" class="col form-select" value="{$settings['login_log']}">
-                                            <option value="0" {if ! $settings['login_log']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['login_log']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">通知用户新IP登录</label>
-                                    <div class="col">
-                                        <select id="notify_new_login" class="col form-select" value="{$settings['notify_new_login']}">
-                                            <option value="0" {if ! $settings['notify_new_login']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['notify_new_login']}selected{/if}>开启</option>
-                                        </select>
+                                <div class="tab-pane" id="log">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">启用每小时使用流量日志</label>
+                                            <div class="col">
+                                                <select id="traffic_log" class="col form-select"
+                                                        value="{$settings['traffic_log']}">
+                                                    <option value="0" {if ! $settings['traffic_log']}selected{/if}>
+                                                        关闭
+                                                    </option>
+                                                    <option value="1" {if $settings['traffic_log']}selected{/if}>开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">流量日志保留天数</label>
+                                            <div class="col">
+                                                <input id="traffic_log_retention_days" type="text" class="form-control"
+                                                       value="{$settings['traffic_log_retention_days']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">启用订阅日志</label>
+                                            <div class="col">
+                                                <select id="subscribe_log" class="col form-select"
+                                                        value="{$settings['subscribe_log']}">
+                                                    <option value="0" {if ! $settings['subscribe_log']}selected{/if}>
+                                                        关闭
+                                                    </option>
+                                                    <option value="1" {if $settings['subscribe_log']}selected{/if}>
+                                                        开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">订阅日志保留天数</label>
+                                            <div class="col">
+                                                <input id="subscribe_log_retention_days" type="text"
+                                                       class="form-control"
+                                                       value="{$settings['subscribe_log_retention_days']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">通知用户新IP订阅</label>
+                                            <div class="col">
+                                                <select id="notify_new_subscribe" class="col form-select"
+                                                        value="{$settings['notify_new_subscribe']}">
+                                                    <option value="0"
+                                                            {if ! $settings['notify_new_subscribe']}selected{/if}>关闭
+                                                    </option>
+                                                    <option value="1"
+                                                            {if $settings['notify_new_subscribe']}selected{/if}>开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">启用登录日志</label>
+                                            <div class="col">
+                                                <select id="login_log" class="col form-select"
+                                                        value="{$settings['login_log']}">
+                                                    <option value="0" {if ! $settings['login_log']}selected{/if}>关闭
+                                                    </option>
+                                                    <option value="1" {if $settings['login_log']}selected{/if}>开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">通知用户新IP登录</label>
+                                            <div class="col">
+                                                <select id="notify_new_login" class="col form-select"
+                                                        value="{$settings['notify_new_login']}">
+                                                    <option value="0" {if ! $settings['notify_new_login']}selected{/if}>
+                                                        关闭
+                                                    </option>
+                                                    <option value="1" {if $settings['notify_new_login']}selected{/if}>
+                                                        开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
                             </div>
@@ -136,31 +179,29 @@
                 </div>
             </div>
         </div>
-    </div>
-</div>
 
-<script>
-    $("#save-setting").click(function() {
-        $.ajax({
-            url: '/admin/setting/feature',
-            type: 'POST',
-            dataType: "json",
-            data: {
-                {foreach $update_field as $key}
-                {$key}: $('#{$key}').val(),
-                {/foreach}
-            },
-            success: function(data) {
-                if (data.ret === 1) {
-                    $('#success-message').text(data.msg);
-                    $('#success-dialog').modal('show');
-                } else {
-                    $('#fail-message').text(data.msg);
-                    $('#fail-dialog').modal('show');
-                }
-            }
-        })
-    });
-</script>
+        <script>
+            $("#save-setting").click(function () {
+                $.ajax({
+                    url: '/admin/setting/feature',
+                    type: 'POST',
+                    dataType: "json",
+                    data: {
+                        {foreach $update_field as $key}
+                        {$key}: $('#{$key}').val(),
+                        {/foreach}
+                    },
+                    success: function (data) {
+                        if (data.ret === 1) {
+                            $('#success-message').text(data.msg);
+                            $('#success-dialog').modal('show');
+                        } else {
+                            $('#fail-message').text(data.msg);
+                            $('#fail-dialog').modal('show');
+                        }
+                    }
+                })
+            });
+        </script>
 
-{include file='admin/footer.tpl'}
+        {include file='admin/footer.tpl'}

+ 528 - 412
resources/views/tabler/admin/setting/im.tpl

@@ -28,344 +28,462 @@
             <div class="row row-deck row-cards">
                 <div class="col-md-12">
                     <div class="card">
-                    <div class="card-header">
-                    <ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
-                        <li class="nav-item">
-                            <a href="#notification" class="nav-link active" data-bs-toggle="tab">通知设定</a>
-                        </li>
-                        <li class="nav-item">
-                            <a href="#telegram" class="nav-link" data-bs-toggle="tab">Telegram Bot</a>
-                        </li>
-                        <li class="nav-item">
-                            <a href="#discord" class="nav-link" data-bs-toggle="tab">Discord Bot</a>
-                        </li>
-                        <li class="nav-item">
-                            <a href="#slack" class="nav-link" data-bs-toggle="tab">Slack Bot</a>
-                        </li>
-                    </ul>
-                </div>
-                <div class="card-body">
-                    <div class="tab-content">
-                        <div class="tab-pane active show" id="notification">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">添加节点通知</label>
-                                    <div class="col">
-                                        <select id="telegram_add_node" class="col form-select" value="{$settings['telegram_add_node']}">
-                                            <option value="0" {if ! $settings['telegram_add_node']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['telegram_add_node']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">添加节点通知文本</label>
-                                    <div class="col">
-                                        <input id="telegram_add_node_text" type="text" class="form-control" value="{$settings['telegram_add_node_text']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">修改节点通知</label>
-                                    <div class="col">
-                                        <select id="telegram_update_node" class="col form-select" value="{$settings['telegram_update_node']}">
-                                            <option value="0" {if ! $settings['telegram_update_node']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['telegram_update_node']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">修改节点通知文本</label>
-                                    <div class="col">
-                                        <input id="telegram_update_node_text" type="text" class="form-control" value="{$settings['telegram_update_node_text']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">删除节点通知</label>
-                                    <div class="col">
-                                        <select id="telegram_delete_node" class="col form-select" value="{$settings['telegram_delete_node']}">
-                                            <option value="0" {if ! $settings['telegram_delete_node']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['telegram_delete_node']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">删除节点通知文本</label>
-                                    <div class="col">
-                                        <input id="telegram_delete_node_text" type="text" class="form-control" value="{$settings['telegram_delete_node_text']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">节点被墙通知</label>
-                                    <div class="col">
-                                        <select id="telegram_node_gfwed" class="col form-select" value="{$settings['telegram_node_gfwed']}">
-                                            <option value="0" {if ! $settings['telegram_node_gfwed']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['telegram_node_gfwed']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">节点被墙通知文本</label>
-                                    <div class="col">
-                                        <input id="telegram_node_gfwed_text" type="text" class="form-control" value="{$settings['telegram_node_gfwed_text']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">节点被墙恢复通知</label>
-                                    <div class="col">
-                                        <select id="telegram_node_ungfwed" class="col form-select" value="{$settings['telegram_node_ungfwed']}">
-                                            <option value="0" {if ! $settings['telegram_node_ungfwed']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['telegram_node_ungfwed']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">节点被墙恢复通知文本</label>
-                                    <div class="col">
-                                        <input id="telegram_node_ungfwed_text" type="text" class="form-control" value="{$settings['telegram_node_ungfwed_text']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">节点离线通知</label>
-                                    <div class="col">
-                                        <select id="telegram_node_offline" class="col form-select" value="{$settings['telegram_node_offline']}">
-                                            <option value="0" {if ! $settings['telegram_node_offline']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['telegram_node_offline']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">节点离线通知文本</label>
-                                    <div class="col">
-                                        <input id="telegram_node_offline_text" type="text" class="form-control" value="{$settings['telegram_node_offline_text']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">节点上线通知</label>
-                                    <div class="col">
-                                        <select id="telegram_node_online" class="col form-select" value="{$settings['telegram_node_online']}">
-                                            <option value="0" {if ! $settings['telegram_node_online']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['telegram_node_online']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">节点上线通知文本</label>
-                                    <div class="col">
-                                        <input id="telegram_node_online_text" type="text" class="form-control" value="{$settings['telegram_node_online_text']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">每日任务通知</label>
-                                    <div class="col">
-                                        <select id="telegram_daily_job" class="col form-select" value="{$settings['telegram_daily_job']}">
-                                            <option value="0" {if ! $settings['telegram_daily_job']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['telegram_daily_job']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">每日任务通知文本</label>
-                                    <div class="col">
-                                        <input id="telegram_daily_job_text" type="text" class="form-control" value="{$settings['telegram_daily_job_text']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">系统运行状况通知</label>
-                                    <div class="col">
-                                        <select id="telegram_diary" class="col form-select" value="{$settings['telegram_diary']}">
-                                            <option value="0" {if ! $settings['telegram_diary']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['telegram_diary']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">系统运行状况通知文本</label>
-                                    <div class="col">
-                                        <input id="telegram_diary_text" type="text" class="form-control" value="{$settings['telegram_diary_text']}">
-                                    </div>
-                                </div>
-                            </div>
+                        <div class="card-header">
+                            <ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
+                                <li class="nav-item">
+                                    <a href="#notification" class="nav-link active" data-bs-toggle="tab">通知设定</a>
+                                </li>
+                                <li class="nav-item">
+                                    <a href="#telegram" class="nav-link" data-bs-toggle="tab">Telegram Bot</a>
+                                </li>
+                                <li class="nav-item">
+                                    <a href="#discord" class="nav-link" data-bs-toggle="tab">Discord Bot</a>
+                                </li>
+                                <li class="nav-item">
+                                    <a href="#slack" class="nav-link" data-bs-toggle="tab">Slack Bot</a>
+                                </li>
+                            </ul>
                         </div>
-                        <div class="tab-pane" id="telegram">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">是否启用 Telegram 机器人</label>
-                                    <div class="col">
-                                        <select id="enable_telegram" class="col form-select" value="{$settings['enable_telegram']}">
-                                            <option value="0" {if ! $settings['enable_telegram']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['enable_telegram']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Bot Token</label>
-                                    <div class="col">
-                                        <input id="telegram_token" type="text" class="form-control" value="{$settings['telegram_token']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Telegram 群组会话 ID</label>
-                                    <div class="col">
-                                        <input id="telegram_chatid" type="text" class="form-control" value="{$settings['telegram_chatid']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Telegram 机器人账号</label>
-                                    <div class="col">
-                                        <input id="telegram_bot" type="text" class="form-control" value="{$settings['telegram_bot']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Telegram Webhook 密钥</label>
-                                    <div class="col">
-                                        <input id="telegram_request_token" type="text" class="form-control" value="{$settings['telegram_request_token']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">解绑 Telegram 账户后自动踢出群组</label>
-                                    <div class="col">
-                                        <select id="telegram_unbind_kick_member" class="col form-select" value="{$settings['telegram_unbind_kick_member']}">
-                                            <option value="0" {if ! $settings['telegram_unbind_kick_member']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['telegram_unbind_kick_member']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">仅允许已绑定 Telegram 账户的用户加入群组</label>
-                                    <div class="col">
-                                        <select id="telegram_group_bound_user" class="col form-select" value="{$settings['telegram_group_bound_user']}">
-                                            <option value="0" {if ! $settings['telegram_group_bound_user']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['telegram_group_bound_user']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Telegram 机器人发送欢迎消息</label>
-                                    <div class="col">
-                                        <select id="enable_welcome_message" class="col form-select" value="{$settings['enable_welcome_message']}">
-                                            <option value="0" {if ! $settings['enable_welcome_message']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['enable_welcome_message']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Telegram 机器人在群组中不回应</label>
-                                    <div class="col">
-                                        <select id="telegram_group_quiet" class="col form-select" value="{$settings['telegram_group_quiet']}">
-                                            <option value="0" {if ! $settings['telegram_group_quiet']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['telegram_group_quiet']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">允许 Bot 加入下方配置之外的群组</label>
-                                    <div class="col">
-                                        <select id="allow_to_join_new_groups" class="col form-select" value="{$settings['allow_to_join_new_groups']}">
-                                            <option value="0" {if ! $settings['allow_to_join_new_groups']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['allow_to_join_new_groups']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">允许加入的群组 ID</label>
-                                    <div class="col">
-                                        <input id="group_id_allowed_to_join" type="text" class="form-control" value="{$settings['group_id_allowed_to_join']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">允许任意未知的命令触发 /help 的回复</label>
-                                    <div class="col">
-                                        <select id="help_any_command" class="col form-select" value="{$settings['help_any_command']}">
-                                            <option value="0" {if ! $settings['help_any_command']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['help_any_command']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">未绑定账户的回复</label>
-                                    <div class="col">
-                                        <input id="user_not_bind_reply" type="text" class="form-control" value="{$settings['user_not_bind_reply']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Telegram 用户 ID</label>
-                                    <input type="text" class="form-control" id="telegram_user_id" value="">
-                                    <div class="row my-3">
-                                        <div class="col">
-                                            <button id="test-telegram" class="btn btn-primary">发送测试信息</button>
+                        <div class="card-body">
+                            <div class="tab-content">
+                                <div class="tab-pane active show" id="notification">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">添加节点通知</label>
+                                            <div class="col">
+                                                <select id="telegram_add_node" class="col form-select"
+                                                        value="{$settings['telegram_add_node']}">
+                                                    <option value="0"
+                                                            {if ! $settings['telegram_add_node']}selected{/if}>关闭
+                                                    </option>
+                                                    <option value="1" {if $settings['telegram_add_node']}selected{/if}>
+                                                        开启
+                                                    </option>
+                                                </select>
+                                            </div>
                                         </div>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="tab-pane" id="discord">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Bot Token</label>
-                                    <div class="col">
-                                        <input id="discord_bot_token" type="text" class="form-control" value="{$settings['discord_bot_token']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Client ID</label>
-                                    <div class="col">
-                                        <input id="discord_client_id" type="text" class="form-control" value="{$settings['discord_client_id']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Client Secret</label>
-                                    <div class="col">
-                                        <input id="discord_client_secret" type="text" class="form-control" value="{$settings['discord_client_secret']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Guild ID</label>
-                                    <div class="col">
-                                        <input id="discord_guild_id" type="text" class="form-control" value="{$settings['discord_guild_id']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Discord 用户 ID</label>
-                                    <input type="text" class="form-control" id="discord_user_id" value="">
-                                    <div class="row my-3">
-                                        <div class="col">
-                                            <button id="test-discord" class="btn btn-primary">发送测试信息</button>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">添加节点通知文本</label>
+                                            <div class="col">
+                                                <input id="telegram_add_node_text" type="text" class="form-control"
+                                                       value="{$settings['telegram_add_node_text']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">修改节点通知</label>
+                                            <div class="col">
+                                                <select id="telegram_update_node" class="col form-select"
+                                                        value="{$settings['telegram_update_node']}">
+                                                    <option value="0"
+                                                            {if ! $settings['telegram_update_node']}selected{/if}>关闭
+                                                    </option>
+                                                    <option value="1"
+                                                            {if $settings['telegram_update_node']}selected{/if}>开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">修改节点通知文本</label>
+                                            <div class="col">
+                                                <input id="telegram_update_node_text" type="text" class="form-control"
+                                                       value="{$settings['telegram_update_node_text']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">删除节点通知</label>
+                                            <div class="col">
+                                                <select id="telegram_delete_node" class="col form-select"
+                                                        value="{$settings['telegram_delete_node']}">
+                                                    <option value="0"
+                                                            {if ! $settings['telegram_delete_node']}selected{/if}>关闭
+                                                    </option>
+                                                    <option value="1"
+                                                            {if $settings['telegram_delete_node']}selected{/if}>开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">删除节点通知文本</label>
+                                            <div class="col">
+                                                <input id="telegram_delete_node_text" type="text" class="form-control"
+                                                       value="{$settings['telegram_delete_node_text']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">节点被墙通知</label>
+                                            <div class="col">
+                                                <select id="telegram_node_gfwed" class="col form-select"
+                                                        value="{$settings['telegram_node_gfwed']}">
+                                                    <option value="0"
+                                                            {if ! $settings['telegram_node_gfwed']}selected{/if}>关闭
+                                                    </option>
+                                                    <option value="1"
+                                                            {if $settings['telegram_node_gfwed']}selected{/if}>开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">节点被墙通知文本</label>
+                                            <div class="col">
+                                                <input id="telegram_node_gfwed_text" type="text" class="form-control"
+                                                       value="{$settings['telegram_node_gfwed_text']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">节点被墙恢复通知</label>
+                                            <div class="col">
+                                                <select id="telegram_node_ungfwed" class="col form-select"
+                                                        value="{$settings['telegram_node_ungfwed']}">
+                                                    <option value="0"
+                                                            {if ! $settings['telegram_node_ungfwed']}selected{/if}>关闭
+                                                    </option>
+                                                    <option value="1"
+                                                            {if $settings['telegram_node_ungfwed']}selected{/if}>开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">节点被墙恢复通知文本</label>
+                                            <div class="col">
+                                                <input id="telegram_node_ungfwed_text" type="text" class="form-control"
+                                                       value="{$settings['telegram_node_ungfwed_text']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">节点离线通知</label>
+                                            <div class="col">
+                                                <select id="telegram_node_offline" class="col form-select"
+                                                        value="{$settings['telegram_node_offline']}">
+                                                    <option value="0"
+                                                            {if ! $settings['telegram_node_offline']}selected{/if}>关闭
+                                                    </option>
+                                                    <option value="1"
+                                                            {if $settings['telegram_node_offline']}selected{/if}>开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">节点离线通知文本</label>
+                                            <div class="col">
+                                                <input id="telegram_node_offline_text" type="text" class="form-control"
+                                                       value="{$settings['telegram_node_offline_text']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">节点上线通知</label>
+                                            <div class="col">
+                                                <select id="telegram_node_online" class="col form-select"
+                                                        value="{$settings['telegram_node_online']}">
+                                                    <option value="0"
+                                                            {if ! $settings['telegram_node_online']}selected{/if}>关闭
+                                                    </option>
+                                                    <option value="1"
+                                                            {if $settings['telegram_node_online']}selected{/if}>开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">节点上线通知文本</label>
+                                            <div class="col">
+                                                <input id="telegram_node_online_text" type="text" class="form-control"
+                                                       value="{$settings['telegram_node_online_text']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">每日任务通知</label>
+                                            <div class="col">
+                                                <select id="telegram_daily_job" class="col form-select"
+                                                        value="{$settings['telegram_daily_job']}">
+                                                    <option value="0"
+                                                            {if ! $settings['telegram_daily_job']}selected{/if}>关闭
+                                                    </option>
+                                                    <option value="1" {if $settings['telegram_daily_job']}selected{/if}>
+                                                        开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">每日任务通知文本</label>
+                                            <div class="col">
+                                                <input id="telegram_daily_job_text" type="text" class="form-control"
+                                                       value="{$settings['telegram_daily_job_text']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">系统运行状况通知</label>
+                                            <div class="col">
+                                                <select id="telegram_diary" class="col form-select"
+                                                        value="{$settings['telegram_diary']}">
+                                                    <option value="0" {if ! $settings['telegram_diary']}selected{/if}>
+                                                        关闭
+                                                    </option>
+                                                    <option value="1" {if $settings['telegram_diary']}selected{/if}>
+                                                        开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">系统运行状况通知文本</label>
+                                            <div class="col">
+                                                <input id="telegram_diary_text" type="text" class="form-control"
+                                                       value="{$settings['telegram_diary_text']}">
+                                            </div>
                                         </div>
                                     </div>
                                 </div>
-                            </div>
-                        </div>
-                        <div class="tab-pane" id="slack">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">App Token</label>
-                                    <div class="col">
-                                        <input id="slack_token" type="text" class="form-control" value="{$settings['slack_token']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Client ID</label>
-                                    <div class="col">
-                                        <input id="slack_client_id" type="text" class="form-control" value="{$settings['slack_client_id']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Client Secret</label>
-                                    <div class="col">
-                                        <input id="slack_client_secret" type="text" class="form-control" value="{$settings['slack_client_secret']}">
+                                <div class="tab-pane" id="telegram">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">是否启用 Telegram
+                                                机器人</label>
+                                            <div class="col">
+                                                <select id="enable_telegram" class="col form-select"
+                                                        value="{$settings['enable_telegram']}">
+                                                    <option value="0" {if ! $settings['enable_telegram']}selected{/if}>
+                                                        关闭
+                                                    </option>
+                                                    <option value="1" {if $settings['enable_telegram']}selected{/if}>
+                                                        开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Bot Token</label>
+                                            <div class="col">
+                                                <input id="telegram_token" type="text" class="form-control"
+                                                       value="{$settings['telegram_token']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Telegram 群组会话 ID</label>
+                                            <div class="col">
+                                                <input id="telegram_chatid" type="text" class="form-control"
+                                                       value="{$settings['telegram_chatid']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Telegram 机器人账号</label>
+                                            <div class="col">
+                                                <input id="telegram_bot" type="text" class="form-control"
+                                                       value="{$settings['telegram_bot']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Telegram Webhook 密钥</label>
+                                            <div class="col">
+                                                <input id="telegram_request_token" type="text" class="form-control"
+                                                       value="{$settings['telegram_request_token']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">解绑 Telegram
+                                                账户后自动踢出群组</label>
+                                            <div class="col">
+                                                <select id="telegram_unbind_kick_member" class="col form-select"
+                                                        value="{$settings['telegram_unbind_kick_member']}">
+                                                    <option value="0"
+                                                            {if ! $settings['telegram_unbind_kick_member']}selected{/if}>
+                                                        关闭
+                                                    </option>
+                                                    <option value="1"
+                                                            {if $settings['telegram_unbind_kick_member']}selected{/if}>
+                                                        开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">仅允许已绑定 Telegram
+                                                账户的用户加入群组</label>
+                                            <div class="col">
+                                                <select id="telegram_group_bound_user" class="col form-select"
+                                                        value="{$settings['telegram_group_bound_user']}">
+                                                    <option value="0"
+                                                            {if ! $settings['telegram_group_bound_user']}selected{/if}>
+                                                        关闭
+                                                    </option>
+                                                    <option value="1"
+                                                            {if $settings['telegram_group_bound_user']}selected{/if}>开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Telegram
+                                                机器人发送欢迎消息</label>
+                                            <div class="col">
+                                                <select id="enable_welcome_message" class="col form-select"
+                                                        value="{$settings['enable_welcome_message']}">
+                                                    <option value="0"
+                                                            {if ! $settings['enable_welcome_message']}selected{/if}>关闭
+                                                    </option>
+                                                    <option value="1"
+                                                            {if $settings['enable_welcome_message']}selected{/if}>开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Telegram
+                                                机器人在群组中不回应</label>
+                                            <div class="col">
+                                                <select id="telegram_group_quiet" class="col form-select"
+                                                        value="{$settings['telegram_group_quiet']}">
+                                                    <option value="0"
+                                                            {if ! $settings['telegram_group_quiet']}selected{/if}>关闭
+                                                    </option>
+                                                    <option value="1"
+                                                            {if $settings['telegram_group_quiet']}selected{/if}>开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">允许 Bot
+                                                加入下方配置之外的群组</label>
+                                            <div class="col">
+                                                <select id="allow_to_join_new_groups" class="col form-select"
+                                                        value="{$settings['allow_to_join_new_groups']}">
+                                                    <option value="0"
+                                                            {if ! $settings['allow_to_join_new_groups']}selected{/if}>关闭
+                                                    </option>
+                                                    <option value="1"
+                                                            {if $settings['allow_to_join_new_groups']}selected{/if}>开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">允许加入的群组 ID</label>
+                                            <div class="col">
+                                                <input id="group_id_allowed_to_join" type="text" class="form-control"
+                                                       value="{$settings['group_id_allowed_to_join']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">允许任意未知的命令触发 /help
+                                                的回复</label>
+                                            <div class="col">
+                                                <select id="help_any_command" class="col form-select"
+                                                        value="{$settings['help_any_command']}">
+                                                    <option value="0" {if ! $settings['help_any_command']}selected{/if}>
+                                                        关闭
+                                                    </option>
+                                                    <option value="1" {if $settings['help_any_command']}selected{/if}>
+                                                        开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">未绑定账户的回复</label>
+                                            <div class="col">
+                                                <input id="user_not_bind_reply" type="text" class="form-control"
+                                                       value="{$settings['user_not_bind_reply']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Telegram 用户 ID</label>
+                                            <input type="text" class="form-control" id="telegram_user_id" value="">
+                                            <div class="row my-3">
+                                                <div class="col">
+                                                    <button id="test-telegram" class="btn btn-primary">发送测试信息
+                                                    </button>
+                                                </div>
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Team ID</label>
-                                    <div class="col">
-                                        <input id="slack_team_id" type="text" class="form-control" value="{$settings['slack_team_id']}">
+                                <div class="tab-pane" id="discord">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Bot Token</label>
+                                            <div class="col">
+                                                <input id="discord_bot_token" type="text" class="form-control"
+                                                       value="{$settings['discord_bot_token']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Client ID</label>
+                                            <div class="col">
+                                                <input id="discord_client_id" type="text" class="form-control"
+                                                       value="{$settings['discord_client_id']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Client Secret</label>
+                                            <div class="col">
+                                                <input id="discord_client_secret" type="text" class="form-control"
+                                                       value="{$settings['discord_client_secret']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Guild ID</label>
+                                            <div class="col">
+                                                <input id="discord_guild_id" type="text" class="form-control"
+                                                       value="{$settings['discord_guild_id']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Discord 用户 ID</label>
+                                            <input type="text" class="form-control" id="discord_user_id" value="">
+                                            <div class="row my-3">
+                                                <div class="col">
+                                                    <button id="test-discord" class="btn btn-primary">发送测试信息
+                                                    </button>
+                                                </div>
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Slack 用户 ID</label>
-                                    <input type="text" class="form-control" id="slack_user_id" value="">
-                                    <div class="row my-3">
-                                        <div class="col">
-                                            <button id="test-slack" class="btn btn-primary">发送测试信息</button>
+                                <div class="tab-pane" id="slack">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">App Token</label>
+                                            <div class="col">
+                                                <input id="slack_token" type="text" class="form-control"
+                                                       value="{$settings['slack_token']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Client ID</label>
+                                            <div class="col">
+                                                <input id="slack_client_id" type="text" class="form-control"
+                                                       value="{$settings['slack_client_id']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Client Secret</label>
+                                            <div class="col">
+                                                <input id="slack_client_secret" type="text" class="form-control"
+                                                       value="{$settings['slack_client_secret']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Team ID</label>
+                                            <div class="col">
+                                                <input id="slack_team_id" type="text" class="form-control"
+                                                       value="{$settings['slack_team_id']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Slack 用户 ID</label>
+                                            <input type="text" class="form-control" id="slack_user_id" value="">
+                                            <div class="row my-3">
+                                                <div class="col">
+                                                    <button id="test-slack" class="btn btn-primary">发送测试信息
+                                                    </button>
+                                                </div>
+                                            </div>
                                         </div>
                                     </div>
                                 </div>
@@ -375,91 +493,89 @@
                 </div>
             </div>
         </div>
-    </div>
-</div>
 
-<script>
-    $("#save-setting").click(function() {
-        $.ajax({
-            url: '/admin/setting/im',
-            type: 'POST',
-            dataType: "json",
-            data: {
-                {foreach $update_field as $key}
-                {$key}: $('#{$key}').val(),
-                {/foreach}
-            },
-            success: function(data) {
-                if (data.ret === 1) {
-                    $('#success-message').text(data.msg);
-                    $('#success-dialog').modal('show');
-                } else {
-                    $('#fail-message').text(data.msg);
-                    $('#fail-dialog').modal('show');
-                }
-            }
-        })
-    });
+        <script>
+            $("#save-setting").click(function () {
+                $.ajax({
+                    url: '/admin/setting/im',
+                    type: 'POST',
+                    dataType: "json",
+                    data: {
+                        {foreach $update_field as $key}
+                        {$key}: $('#{$key}').val(),
+                        {/foreach}
+                    },
+                    success: function (data) {
+                        if (data.ret === 1) {
+                            $('#success-message').text(data.msg);
+                            $('#success-dialog').modal('show');
+                        } else {
+                            $('#fail-message').text(data.msg);
+                            $('#fail-dialog').modal('show');
+                        }
+                    }
+                })
+            });
 
-    $("#test-telegram").click(function() {
-        $.ajax({
-            url: '/admin/setting/test_telegram',
-            type: 'POST',
-            dataType: "json",
-            data: {
-                telegram_user_id: $('#telegram_user_id').val(),
-            },
-            success: function(data) {
-                if (data.ret === 1) {
-                    $('#success-noreload-message').text(data.msg);
-                    $('#success-noreload-dialog').modal('show');
-                } else {
-                    $('#fail-message').text(data.msg);
-                    $('#fail-dialog').modal('show');
-                }
-            }
-        })
-    });
+            $("#test-telegram").click(function () {
+                $.ajax({
+                    url: '/admin/setting/test_telegram',
+                    type: 'POST',
+                    dataType: "json",
+                    data: {
+                        telegram_user_id: $('#telegram_user_id').val(),
+                    },
+                    success: function (data) {
+                        if (data.ret === 1) {
+                            $('#success-noreload-message').text(data.msg);
+                            $('#success-noreload-dialog').modal('show');
+                        } else {
+                            $('#fail-message').text(data.msg);
+                            $('#fail-dialog').modal('show');
+                        }
+                    }
+                })
+            });
 
-    $("#test-discord").click(function() {
-        $.ajax({
-            url: '/admin/setting/test_discord',
-            type: 'POST',
-            dataType: "json",
-            data: {
-                discord_user_id: $('#discord_user_id').val(),
-            },
-            success: function(data) {
-                if (data.ret === 1) {
-                    $('#success-noreload-message').text(data.msg);
-                    $('#success-noreload-dialog').modal('show');
-                } else {
-                    $('#fail-message').text(data.msg);
-                    $('#fail-dialog').modal('show');
-                }
-            }
-        })
-    });
+            $("#test-discord").click(function () {
+                $.ajax({
+                    url: '/admin/setting/test_discord',
+                    type: 'POST',
+                    dataType: "json",
+                    data: {
+                        discord_user_id: $('#discord_user_id').val(),
+                    },
+                    success: function (data) {
+                        if (data.ret === 1) {
+                            $('#success-noreload-message').text(data.msg);
+                            $('#success-noreload-dialog').modal('show');
+                        } else {
+                            $('#fail-message').text(data.msg);
+                            $('#fail-dialog').modal('show');
+                        }
+                    }
+                })
+            });
 
-    $("#test-slack").click(function() {
-        $.ajax({
-            url: '/admin/setting/test_slack',
-            type: 'POST',
-            dataType: "json",
-            data: {
-                slack_user_id: $('#slack_user_id').val(),
-            },
-            success: function(data) {
-                if (data.ret === 1) {
-                    $('#success-noreload-message').text(data.msg);
-                    $('#success-noreload-dialog').modal('show');
-                } else {
-                    $('#fail-message').text(data.msg);
-                    $('#fail-dialog').modal('show');
-                }
-            }
-        })
-    });
-</script>
+            $("#test-slack").click(function () {
+                $.ajax({
+                    url: '/admin/setting/test_slack',
+                    type: 'POST',
+                    dataType: "json",
+                    data: {
+                        slack_user_id: $('#slack_user_id').val(),
+                    },
+                    success: function (data) {
+                        if (data.ret === 1) {
+                            $('#success-noreload-message').text(data.msg);
+                            $('#success-noreload-dialog').modal('show');
+                        } else {
+                            $('#fail-message').text(data.msg);
+                            $('#fail-dialog').modal('show');
+                        }
+                    }
+                })
+            });
+        </script>
 
-{include file='admin/footer.tpl'}
+        {include file='admin/footer.tpl'}

+ 123 - 101
resources/views/tabler/admin/setting/ref.tpl

@@ -28,84 +28,108 @@
             <div class="row row-deck row-cards">
                 <div class="col-md-12">
                     <div class="card">
-                    <div class="card-header">
-                    <ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
-                        <li class="nav-item">
-                            <a href="#invite" class="nav-link active" data-bs-toggle="tab">邀请设置</a>
-                        </li>
-                        <li class="nav-item">
-                            <a href="#rebate" class="nav-link" data-bs-toggle="tab">返利</a>
-                        </li>
-                    </ul>
-                </div>
-                <div class="card-body">
-                    <div class="tab-content">
-                        <div class="tab-pane active show" id="invite">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">被邀请者初始账户余额(元)</label>
-                                    <div class="col">
-                                        <input id="invitation_to_register_balance_reward" type="text" class="form-control" value="{$settings['invitation_to_register_balance_reward']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">邀请者流量奖励(GB)</label>
-                                    <div class="col">
-                                        <input id="invitation_to_register_traffic_reward" type="text" class="form-control" value="{$settings['invitation_to_register_traffic_reward']}">
-                                    </div>
-                                </div>
-                            </div>
+                        <div class="card-header">
+                            <ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
+                                <li class="nav-item">
+                                    <a href="#invite" class="nav-link active" data-bs-toggle="tab">邀请设置</a>
+                                </li>
+                                <li class="nav-item">
+                                    <a href="#rebate" class="nav-link" data-bs-toggle="tab">返利</a>
+                                </li>
+                            </ul>
                         </div>
-                        <div class="tab-pane" id="rebate">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">邀请模式</label>
-                                    <div class="col">
-                                        <select id="invitation_mode" class="col form-select" value="{$settings['invitation_mode']}">
-                                            <option value="reg_only" {if $settings['invitation_mode'] === 'reg_only'}selected{/if}>
-                                            不返利</option>
-                                            <option value="after_paid" {if $settings['invitation_mode'] === 'after_paid'}selected{/if}>
-                                            被邀请用户支付账单时返利</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">返利模式</label>
-                                    <div class="col">
-                                        <select id="invite_rebate_mode" class="col form-select" value="{$settings['invite_rebate_mode']}">
-                                            <option value="continued" {if $settings['invite_rebate_mode'] === 'continued'}selected{/if}>
-                                            持续返利</option>
-                                            <option value="limit_frequency" {if $settings['invite_rebate_mode'] === 'limit_frequency'}selected{/if}>
-                                            限制邀请人能从被邀请人身上获得的返利次数</option>
-                                            <option value="limit_amount" {if $settings['invite_rebate_mode'] === 'limit_amount'}selected{/if}>
-                                            限制邀请人能从被邀请人身上获得的返利金额</option>
-                                            <option value="limit_time_range" {if $settings['invite_rebate_mode'] === 'limit_time_range'}selected{/if}>
-                                            限制邀请人能从被邀请人身上获得返利的时间范围</option>
-                                        </select>
+                        <div class="card-body">
+                            <div class="tab-content">
+                                <div class="tab-pane active show" id="invite">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">被邀请者初始账户余额(元)</label>
+                                            <div class="col">
+                                                <input id="invitation_to_register_balance_reward" type="text"
+                                                       class="form-control"
+                                                       value="{$settings['invitation_to_register_balance_reward']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">邀请者流量奖励(GB)</label>
+                                            <div class="col">
+                                                <input id="invitation_to_register_traffic_reward" type="text"
+                                                       class="form-control"
+                                                       value="{$settings['invitation_to_register_traffic_reward']}">
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">返利比例,10% 填 0.1</label>
-                                    <div class="col">
-                                        <input id="rebate_ratio" type="text" class="form-control" value="{$settings['rebate_ratio']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">返利时间范围(天)</label>
-                                    <div class="col">
-                                        <input id="rebate_time_range_limit" type="text" class="form-control" value="{$settings['rebate_time_range_limit']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">返利次数</label>
-                                    <div class="col">
-                                        <input id="rebate_frequency_limit" type="text" class="form-control" value="{$settings['rebate_frequency_limit']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">返利金额限制</label>
-                                    <div class="col">
-                                        <input id="rebate_amount_limit" type="text" class="form-control" value="{$settings['rebate_amount_limit']}">
+                                <div class="tab-pane" id="rebate">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">邀请模式</label>
+                                            <div class="col">
+                                                <select id="invitation_mode" class="col form-select"
+                                                        value="{$settings['invitation_mode']}">
+                                                    <option value="reg_only"
+                                                            {if $settings['invitation_mode'] === 'reg_only'}selected{/if}>
+                                                        不返利
+                                                    </option>
+                                                    <option value="after_paid"
+                                                            {if $settings['invitation_mode'] === 'after_paid'}selected{/if}>
+                                                        被邀请用户支付账单时返利
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">返利模式</label>
+                                            <div class="col">
+                                                <select id="invite_rebate_mode" class="col form-select"
+                                                        value="{$settings['invite_rebate_mode']}">
+                                                    <option value="continued"
+                                                            {if $settings['invite_rebate_mode'] === 'continued'}selected{/if}>
+                                                        持续返利
+                                                    </option>
+                                                    <option value="limit_frequency"
+                                                            {if $settings['invite_rebate_mode'] === 'limit_frequency'}selected{/if}>
+                                                        限制邀请人能从被邀请人身上获得的返利次数
+                                                    </option>
+                                                    <option value="limit_amount"
+                                                            {if $settings['invite_rebate_mode'] === 'limit_amount'}selected{/if}>
+                                                        限制邀请人能从被邀请人身上获得的返利金额
+                                                    </option>
+                                                    <option value="limit_time_range"
+                                                            {if $settings['invite_rebate_mode'] === 'limit_time_range'}selected{/if}>
+                                                        限制邀请人能从被邀请人身上获得返利的时间范围
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">返利比例,10% 填 0.1</label>
+                                            <div class="col">
+                                                <input id="rebate_ratio" type="text" class="form-control"
+                                                       value="{$settings['rebate_ratio']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">返利时间范围(天)</label>
+                                            <div class="col">
+                                                <input id="rebate_time_range_limit" type="text" class="form-control"
+                                                       value="{$settings['rebate_time_range_limit']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">返利次数</label>
+                                            <div class="col">
+                                                <input id="rebate_frequency_limit" type="text" class="form-control"
+                                                       value="{$settings['rebate_frequency_limit']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">返利金额限制</label>
+                                            <div class="col">
+                                                <input id="rebate_amount_limit" type="text" class="form-control"
+                                                       value="{$settings['rebate_amount_limit']}">
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
                             </div>
@@ -114,31 +138,29 @@
                 </div>
             </div>
         </div>
-    </div>
-</div>
 
-<script>
-    $("#save-setting").click(function() {
-        $.ajax({
-            url: '/admin/setting/ref',
-            type: 'POST',
-            dataType: "json",
-            data: {
-                {foreach $update_field as $key}
-                {$key}: $('#{$key}').val(),
-                {/foreach}
-            },
-            success: function(data) {
-                if (data.ret === 1) {
-                    $('#success-message').text(data.msg);
-                    $('#success-dialog').modal('show');
-                } else {
-                    $('#fail-message').text(data.msg);
-                    $('#fail-dialog').modal('show');
-                }
-            }
-        })
-    });
-</script>
+        <script>
+            $("#save-setting").click(function () {
+                $.ajax({
+                    url: '/admin/setting/ref',
+                    type: 'POST',
+                    dataType: "json",
+                    data: {
+                        {foreach $update_field as $key}
+                        {$key}: $('#{$key}').val(),
+                        {/foreach}
+                    },
+                    success: function (data) {
+                        if (data.ret === 1) {
+                            $('#success-message').text(data.msg);
+                            $('#success-dialog').modal('show');
+                        } else {
+                            $('#fail-message').text(data.msg);
+                            $('#fail-dialog').modal('show');
+                        }
+                    }
+                })
+            });
+        </script>
 
-{include file='admin/footer.tpl'}
+        {include file='admin/footer.tpl'}

+ 197 - 160
resources/views/tabler/admin/setting/reg.tpl

@@ -28,141 +28,180 @@
             <div class="row row-deck row-cards">
                 <div class="col-md-12">
                     <div class="card">
-                    <div class="card-header">
-                    <ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
-                        <li class="nav-item">
-                            <a href="#reg" class="nav-link active" data-bs-toggle="tab">注册设置</a>
-                        </li>
-                        <li class="nav-item">
-                            <a href="#default_value" class="nav-link" data-bs-toggle="tab">默认值</a>
-                        </li>
-                        <li class="nav-item">
-                            <a href="#limit" class="nav-link" data-bs-toggle="tab">账户限制</a>
-                        </li>
-                    </ul>
-                </div>
-                <div class="card-body">
-                    <div class="tab-content">
-                        <div class="tab-pane active show" id="reg">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">注册模式</label>
-                                    <div class="col">
-                                        <select id="reg_mode" class="col form-select" value="{$settings['reg_mode']}">
-                                            <option value="close" {if $settings['reg_mode'] === 'close'}selected{/if}>关闭注册</option>
-                                            <option value="open" {if $settings['reg_mode'] === 'open'}selected{/if}>公开注册</option>
-                                            <option value="invite" {if $settings['reg_mode'] === 'invite'}selected{/if}>仅限用户邀请注册</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">邮箱验证</label>
-                                    <div class="col">
-                                        <select id="reg_email_verify" class="col form-select" value="{$settings['reg_email_verify']}">
-                                            <option value="0" {if ! $settings['reg_email_verify']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['reg_email_verify']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">默认接收每日用量邮件推送</label>
-                                    <div class="col">
-                                        <select id="sign_up_for_daily_report" class="col form-select" value="{$settings['sign_up_for_daily_report']}">
-                                            <option value="0" {if ! $settings['sign_up_for_daily_report']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['sign_up_for_daily_report']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                            </div>
+                        <div class="card-header">
+                            <ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
+                                <li class="nav-item">
+                                    <a href="#reg" class="nav-link active" data-bs-toggle="tab">注册设置</a>
+                                </li>
+                                <li class="nav-item">
+                                    <a href="#default_value" class="nav-link" data-bs-toggle="tab">默认值</a>
+                                </li>
+                                <li class="nav-item">
+                                    <a href="#limit" class="nav-link" data-bs-toggle="tab">账户限制</a>
+                                </li>
+                            </ul>
                         </div>
-                        <div class="tab-pane" id="default_value">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">注册时随机分配到的分组,多个分组请用英文半角逗号分隔</label>
-                                    <div class="col">
-                                        <input id="random_group" type="text" class="form-control" value="{$settings['random_group']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">用户端口池最小值,设为 0 时用户不会被分配端口</label>
-                                    <div class="col">
-                                        <input id="min_port" type="text" class="form-control" value="{$settings['min_port']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">用户端口池最大值,设为 0 时用户不会被分配端口</label>
-                                    <div class="col">
-                                        <input id="max_port" type="text" class="form-control" value="{$settings['max_port']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">注册时赠送的流量(GB)</label>
-                                    <div class="col">
-                                        <input id="sign_up_for_free_traffic" type="text" class="form-control" value="{$settings['sign_up_for_free_traffic']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">免费用戶的流量重置日,设为 0 时不重置</label>
-                                    <div class="col">
-                                        <input id="free_user_reset_day" type="text" class="form-control" value="{$settings['free_user_reset_day']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">需要重置的免费流量,设为 0 时不重置</label>
-                                    <div class="col">
-                                        <input id="free_user_reset_bandwidth" type="text" class="form-control" value="{$settings['free_user_reset_bandwidth']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">注册时设定的等级</label>
-                                    <div class="col">
-                                        <input id="sign_up_for_class" type="text" class="form-control" value="{$settings['sign_up_for_class']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">注册时设定的等级过期时间(天)</label>
-                                    <div class="col">
-                                        <input id="sign_up_for_class_time" type="text" class="form-control" value="{$settings['sign_up_for_class_time']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">默认加密</label>
-                                    <div class="col">
-                                        <input id="sign_up_for_method" type="text" class="form-control" value="{$settings['sign_up_for_method']}">
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="tab-pane" id="limit">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">邀请链接使用次数限制</label>
-                                    <div class="col">
-                                        <input id="sign_up_for_invitation_codes" type="text" class="form-control" value="{$settings['sign_up_for_invitation_codes']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">连接 IP 限制</label>
-                                    <div class="col">
-                                        <input id="connection_ip_limit" type="text" class="form-control" value="{$settings['connection_ip_limit']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">使用速率限制</label>
-                                    <div class="col">
-                                        <input id="connection_rate_limit" type="text" class="form-control" value="{$settings['connection_rate_limit']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">禁止访问的 IP 列表</label>
-                                    <div class="col">
-                                        <input id="reg_forbidden_ip" type="text" class="form-control" value="{$settings['reg_forbidden_ip']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">禁止访问的端口列表</label>
-                                    <div class="col">
-                                        <input id="reg_forbidden_port" type="text" class="form-control" value="{$settings['reg_forbidden_port']}">
+                        <div class="card-body">
+                            <div class="tab-content">
+                                <div class="tab-pane active show" id="reg">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">注册模式</label>
+                                            <div class="col">
+                                                <select id="reg_mode" class="col form-select"
+                                                        value="{$settings['reg_mode']}">
+                                                    <option value="close"
+                                                            {if $settings['reg_mode'] === 'close'}selected{/if}>关闭注册
+                                                    </option>
+                                                    <option value="open"
+                                                            {if $settings['reg_mode'] === 'open'}selected{/if}>公开注册
+                                                    </option>
+                                                    <option value="invite"
+                                                            {if $settings['reg_mode'] === 'invite'}selected{/if}>
+                                                        仅限用户邀请注册
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">邮箱验证</label>
+                                            <div class="col">
+                                                <select id="reg_email_verify" class="col form-select"
+                                                        value="{$settings['reg_email_verify']}">
+                                                    <option value="0" {if ! $settings['reg_email_verify']}selected{/if}>
+                                                        关闭
+                                                    </option>
+                                                    <option value="1" {if $settings['reg_email_verify']}selected{/if}>
+                                                        开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">默认接收每日用量邮件推送</label>
+                                            <div class="col">
+                                                <select id="sign_up_for_daily_report" class="col form-select"
+                                                        value="{$settings['sign_up_for_daily_report']}">
+                                                    <option value="0"
+                                                            {if ! $settings['sign_up_for_daily_report']}selected{/if}>关闭
+                                                    </option>
+                                                    <option value="1"
+                                                            {if $settings['sign_up_for_daily_report']}selected{/if}>开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="tab-pane" id="default_value">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">注册时随机分配到的分组,多个分组请用英文半角逗号分隔</label>
+                                            <div class="col">
+                                                <input id="random_group" type="text" class="form-control"
+                                                       value="{$settings['random_group']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">用户端口池最小值,设为 0
+                                                时用户不会被分配端口</label>
+                                            <div class="col">
+                                                <input id="min_port" type="text" class="form-control"
+                                                       value="{$settings['min_port']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">用户端口池最大值,设为 0
+                                                时用户不会被分配端口</label>
+                                            <div class="col">
+                                                <input id="max_port" type="text" class="form-control"
+                                                       value="{$settings['max_port']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">注册时赠送的流量(GB)</label>
+                                            <div class="col">
+                                                <input id="sign_up_for_free_traffic" type="text" class="form-control"
+                                                       value="{$settings['sign_up_for_free_traffic']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">免费用戶的流量重置日,设为 0
+                                                时不重置</label>
+                                            <div class="col">
+                                                <input id="free_user_reset_day" type="text" class="form-control"
+                                                       value="{$settings['free_user_reset_day']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">需要重置的免费流量,设为 0
+                                                时不重置</label>
+                                            <div class="col">
+                                                <input id="free_user_reset_bandwidth" type="text" class="form-control"
+                                                       value="{$settings['free_user_reset_bandwidth']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">注册时设定的等级</label>
+                                            <div class="col">
+                                                <input id="sign_up_for_class" type="text" class="form-control"
+                                                       value="{$settings['sign_up_for_class']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">注册时设定的等级过期时间(天)</label>
+                                            <div class="col">
+                                                <input id="sign_up_for_class_time" type="text" class="form-control"
+                                                       value="{$settings['sign_up_for_class_time']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">默认加密</label>
+                                            <div class="col">
+                                                <input id="sign_up_for_method" type="text" class="form-control"
+                                                       value="{$settings['sign_up_for_method']}">
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="tab-pane" id="limit">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">邀请链接使用次数限制</label>
+                                            <div class="col">
+                                                <input id="sign_up_for_invitation_codes" type="text"
+                                                       class="form-control"
+                                                       value="{$settings['sign_up_for_invitation_codes']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">连接 IP 限制</label>
+                                            <div class="col">
+                                                <input id="connection_ip_limit" type="text" class="form-control"
+                                                       value="{$settings['connection_ip_limit']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">使用速率限制</label>
+                                            <div class="col">
+                                                <input id="connection_rate_limit" type="text" class="form-control"
+                                                       value="{$settings['connection_rate_limit']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">禁止访问的 IP 列表</label>
+                                            <div class="col">
+                                                <input id="reg_forbidden_ip" type="text" class="form-control"
+                                                       value="{$settings['reg_forbidden_ip']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">禁止访问的端口列表</label>
+                                            <div class="col">
+                                                <input id="reg_forbidden_port" type="text" class="form-control"
+                                                       value="{$settings['reg_forbidden_port']}">
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
                             </div>
@@ -171,31 +210,29 @@
                 </div>
             </div>
         </div>
-    </div>
-</div>
 
-<script>
-    $("#save-setting").click(function() {
-        $.ajax({
-            url: '/admin/setting/reg',
-            type: 'POST',
-            dataType: "json",
-            data: {
-                {foreach $update_field as $key}
-                {$key}: $('#{$key}').val(),
-                {/foreach}
-            },
-            success: function(data) {
-                if (data.ret === 1) {
-                    $('#success-message').text(data.msg);
-                    $('#success-dialog').modal('show');
-                } else {
-                    $('#fail-message').text(data.msg);
-                    $('#fail-dialog').modal('show');
-                }
-            }
-        })
-    });
-</script>
+        <script>
+            $("#save-setting").click(function () {
+                $.ajax({
+                    url: '/admin/setting/reg',
+                    type: 'POST',
+                    dataType: "json",
+                    data: {
+                        {foreach $update_field as $key}
+                        {$key}: $('#{$key}').val(),
+                        {/foreach}
+                    },
+                    success: function (data) {
+                        if (data.ret === 1) {
+                            $('#success-message').text(data.msg);
+                            $('#success-dialog').modal('show');
+                        } else {
+                            $('#fail-message').text(data.msg);
+                            $('#fail-dialog').modal('show');
+                        }
+                    }
+                })
+            });
+        </script>
 
-{include file='admin/footer.tpl'}
+        {include file='admin/footer.tpl'}

+ 110 - 81
resources/views/tabler/admin/setting/sub.tpl

@@ -28,94 +28,123 @@
             <div class="row row-deck row-cards">
                 <div class="col-md-12">
                     <div class="card">
-                    <div class="card-header">
-                    <ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
-                        <li class="nav-item">
-                            <a href="#sub" class="nav-link active" data-bs-toggle="tab">订阅设置</a>
-                        </li>
-                    </ul>
-                </div>
-                <div class="card-body">
-                    <div class="tab-content">
-                        <div class="tab-pane active show" id="sub">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">启用传统订阅系统</label>
-                                    <div class="col">
-                                        <select id="enable_traditional_sub" class="col form-select" value="{$settings['enable_traditional_sub']}">
-                                            <option value="0" {if ! $settings['enable_traditional_sub']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['enable_traditional_sub']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">启用 Shadowsocks 订阅(仅影响前端显示与传统/sip002/sip008订阅)</label>
-                                    <div class="col">
-                                        <select id="enable_ss_sub" class="col form-select" value="{$settings['enable_ss_sub']}">
-                                            <option value="0" {if ! $settings['enable_ss_sub']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['enable_ss_sub']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">启用 V2Ray 订阅(仅影响前端显示与传统订阅)</label>
-                                    <div class="col">
-                                        <select id="enable_v2_sub" class="col form-select" value="{$settings['enable_v2_sub']}">
-                                            <option value="0" {if ! $settings['enable_v2_sub']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['enable_v2_sub']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">启用 Trojan 订阅(仅影响前端显示与传统订阅)</label>
-                                    <div class="col">
-                                        <select id="enable_trojan_sub" class="col form-select" value="{$settings['enable_trojan_sub']}">
-                                            <option value="0" {if ! $settings['enable_trojan_sub']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['enable_trojan_sub']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">用户修改账户登录密码时,是否强制更换订阅地址</label>
-                                    <div class="col">
-                                        <select id="enable_forced_replacement" class="col form-select" value="{$settings['enable_forced_replacement']}">
-                                            <option value="0" {if ! $settings['enable_forced_replacement']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['enable_forced_replacement']}selected{/if}>开启</option>
-                                        </select>
+                        <div class="card-header">
+                            <ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
+                                <li class="nav-item">
+                                    <a href="#sub" class="nav-link active" data-bs-toggle="tab">订阅设置</a>
+                                </li>
+                            </ul>
+                        </div>
+                        <div class="card-body">
+                            <div class="tab-content">
+                                <div class="tab-pane active show" id="sub">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">启用传统订阅系统</label>
+                                            <div class="col">
+                                                <select id="enable_traditional_sub" class="col form-select"
+                                                        value="{$settings['enable_traditional_sub']}">
+                                                    <option value="0"
+                                                            {if ! $settings['enable_traditional_sub']}selected{/if}>关闭
+                                                    </option>
+                                                    <option value="1"
+                                                            {if $settings['enable_traditional_sub']}selected{/if}>开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">启用 Shadowsocks
+                                                订阅(仅影响前端显示与传统/sip002/sip008订阅)</label>
+                                            <div class="col">
+                                                <select id="enable_ss_sub" class="col form-select"
+                                                        value="{$settings['enable_ss_sub']}">
+                                                    <option value="0" {if ! $settings['enable_ss_sub']}selected{/if}>
+                                                        关闭
+                                                    </option>
+                                                    <option value="1" {if $settings['enable_ss_sub']}selected{/if}>
+                                                        开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">启用 V2Ray
+                                                订阅(仅影响前端显示与传统订阅)</label>
+                                            <div class="col">
+                                                <select id="enable_v2_sub" class="col form-select"
+                                                        value="{$settings['enable_v2_sub']}">
+                                                    <option value="0" {if ! $settings['enable_v2_sub']}selected{/if}>
+                                                        关闭
+                                                    </option>
+                                                    <option value="1" {if $settings['enable_v2_sub']}selected{/if}>
+                                                        开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">启用 Trojan
+                                                订阅(仅影响前端显示与传统订阅)</label>
+                                            <div class="col">
+                                                <select id="enable_trojan_sub" class="col form-select"
+                                                        value="{$settings['enable_trojan_sub']}">
+                                                    <option value="0"
+                                                            {if ! $settings['enable_trojan_sub']}selected{/if}>关闭
+                                                    </option>
+                                                    <option value="1" {if $settings['enable_trojan_sub']}selected{/if}>
+                                                        开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">用户修改账户登录密码时,是否强制更换订阅地址</label>
+                                            <div class="col">
+                                                <select id="enable_forced_replacement" class="col form-select"
+                                                        value="{$settings['enable_forced_replacement']}">
+                                                    <option value="0"
+                                                            {if ! $settings['enable_forced_replacement']}selected{/if}>
+                                                        关闭
+                                                    </option>
+                                                    <option value="1"
+                                                            {if $settings['enable_forced_replacement']}selected{/if}>开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
+
                             </div>
                         </div>
-
                     </div>
                 </div>
             </div>
         </div>
-    </div>
-</div>
 
-<script>
-    $("#save-setting").click(function() {
-        $.ajax({
-            url: '/admin/setting/sub',
-            type: 'POST',
-            dataType: "json",
-            data: {
-                {foreach $update_field as $key}
-                {$key}: $('#{$key}').val(),
-                {/foreach}
-            },
-            success: function(data) {
-                if (data.ret === 1) {
-                    $('#success-message').text(data.msg);
-                    $('#success-dialog').modal('show');
-                } else {
-                    $('#fail-message').text(data.msg);
-                    $('#fail-dialog').modal('show');
-                }
-            }
-        })
-    });
-</script>
+        <script>
+            $("#save-setting").click(function () {
+                $.ajax({
+                    url: '/admin/setting/sub',
+                    type: 'POST',
+                    dataType: "json",
+                    data: {
+                        {foreach $update_field as $key}
+                        {$key}: $('#{$key}').val(),
+                        {/foreach}
+                    },
+                    success: function (data) {
+                        if (data.ret === 1) {
+                            $('#success-message').text(data.msg);
+                            $('#success-dialog').modal('show');
+                        } else {
+                            $('#fail-message').text(data.msg);
+                            $('#fail-dialog').modal('show');
+                        }
+                    }
+                })
+            });
+        </script>
 
-{include file='admin/footer.tpl'}
+        {include file='admin/footer.tpl'}

+ 126 - 99
resources/views/tabler/admin/setting/support.tpl

@@ -28,82 +28,111 @@
             <div class="row row-deck row-cards">
                 <div class="col-md-12">
                     <div class="card">
-                    <div class="card-header">
-                    <ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
-                        <li class="nav-item">
-                            <a href="#support" class="nav-link active" data-bs-toggle="tab">网页客服</a>
-                        </li>
-                        <li class="nav-item">
-                            <a href="#ticket" class="nav-link" data-bs-toggle="tab">工单</a>
-                        </li>
-                    </ul>
-                </div>
-                <div class="card-body">
-                    <div class="tab-content">
-                        <div class="tab-pane active show" id="support">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">客服系统提供商</label>
-                                    <div class="col">
-                                        <select id="live_chat" class="col form-select" value="{$settings['live_chat']}">
-                                            <option value="none" {if $settings['live_chat'] === "none"}selected{/if}>无</option>
-                                            <option value="tawk" {if $settings['live_chat'] === "tawk"}selected{/if}>Tawk</option>
-                                            <option value="crisp" {if $settings['live_chat'] === "crisp"}selected{/if}>Crisp</option>
-                                            <option value="livechat" {if $settings['live_chat'] === "livechat"}selected{/if}>LiveChat</option>
-                                            <option value="mylivechat" {if $settings['live_chat'] === "mylivechat"}selected{/if}>MyLiveChat</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Tawk ID</label>
-                                    <div class="col">
-                                        <input id="tawk_id" type="text" class="form-control" value="{$settings['tawk_id']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">Crisp ID</label>
-                                    <div class="col">
-                                        <input id="crisp_id" type="text" class="form-control" value="{$settings['crisp_id']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">LiveChat ID</label>
-                                    <div class="col">
-                                        <input id="livechat_id" type="text" class="form-control" value="{$settings['livechat_id']}">
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">MyLiveChat ID</label>
-                                    <div class="col">
-                                        <input id="mylivechat_id" type="text" class="form-control" value="{$settings['mylivechat_id']}">
-                                    </div>
-                                </div>
-                            </div>
+                        <div class="card-header">
+                            <ul class="nav nav-tabs card-header-tabs" data-bs-toggle="tabs">
+                                <li class="nav-item">
+                                    <a href="#support" class="nav-link active" data-bs-toggle="tab">网页客服</a>
+                                </li>
+                                <li class="nav-item">
+                                    <a href="#ticket" class="nav-link" data-bs-toggle="tab">工单</a>
+                                </li>
+                            </ul>
                         </div>
-                        <div class="tab-pane" id="ticket">
-                            <div class="card-body">
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">启用工单系统</label>
-                                    <div class="col">
-                                        <select id="enable_ticket" class="col form-select" value="{$settings['enable_ticket']}">
-                                            <option value="0" {if ! $settings['enable_ticket']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['enable_ticket']}selected{/if}>开启</option>
-                                        </select>
+                        <div class="card-body">
+                            <div class="tab-content">
+                                <div class="tab-pane active show" id="support">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">客服系统提供商</label>
+                                            <div class="col">
+                                                <select id="live_chat" class="col form-select"
+                                                        value="{$settings['live_chat']}">
+                                                    <option value="none"
+                                                            {if $settings['live_chat'] === "none"}selected{/if}>无
+                                                    </option>
+                                                    <option value="tawk"
+                                                            {if $settings['live_chat'] === "tawk"}selected{/if}>Tawk
+                                                    </option>
+                                                    <option value="crisp"
+                                                            {if $settings['live_chat'] === "crisp"}selected{/if}>Crisp
+                                                    </option>
+                                                    <option value="livechat"
+                                                            {if $settings['live_chat'] === "livechat"}selected{/if}>
+                                                        LiveChat
+                                                    </option>
+                                                    <option value="mylivechat"
+                                                            {if $settings['live_chat'] === "mylivechat"}selected{/if}>
+                                                        MyLiveChat
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Tawk ID</label>
+                                            <div class="col">
+                                                <input id="tawk_id" type="text" class="form-control"
+                                                       value="{$settings['tawk_id']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">Crisp ID</label>
+                                            <div class="col">
+                                                <input id="crisp_id" type="text" class="form-control"
+                                                       value="{$settings['crisp_id']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">LiveChat ID</label>
+                                            <div class="col">
+                                                <input id="livechat_id" type="text" class="form-control"
+                                                       value="{$settings['livechat_id']}">
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">MyLiveChat ID</label>
+                                            <div class="col">
+                                                <input id="mylivechat_id" type="text" class="form-control"
+                                                       value="{$settings['mylivechat_id']}">
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">启用工单邮件提醒</label>
-                                    <div class="col">
-                                        <select id="mail_ticket" class="col form-select" value="{$settings['mail_ticket']}">
-                                            <option value="0" {if ! $settings['mail_ticket']}selected{/if}>关闭</option>
-                                            <option value="1" {if $settings['mail_ticket']}selected{/if}>开启</option>
-                                        </select>
-                                    </div>
-                                </div>
-                                <div class="form-group mb-3 row">
-                                    <label class="form-label col-3 col-form-label">用戶工单配額(每月)</label>
-                                    <div class="col">
-                                        <input id="ticket_limit" type="text" class="form-control" value="{$settings['ticket_limit']}">
+                                <div class="tab-pane" id="ticket">
+                                    <div class="card-body">
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">启用工单系统</label>
+                                            <div class="col">
+                                                <select id="enable_ticket" class="col form-select"
+                                                        value="{$settings['enable_ticket']}">
+                                                    <option value="0" {if ! $settings['enable_ticket']}selected{/if}>
+                                                        关闭
+                                                    </option>
+                                                    <option value="1" {if $settings['enable_ticket']}selected{/if}>
+                                                        开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">启用工单邮件提醒</label>
+                                            <div class="col">
+                                                <select id="mail_ticket" class="col form-select"
+                                                        value="{$settings['mail_ticket']}">
+                                                    <option value="0" {if ! $settings['mail_ticket']}selected{/if}>
+                                                        关闭
+                                                    </option>
+                                                    <option value="1" {if $settings['mail_ticket']}selected{/if}>开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">用戶工单配額(每月)</label>
+                                            <div class="col">
+                                                <input id="ticket_limit" type="text" class="form-control"
+                                                       value="{$settings['ticket_limit']}">
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
                             </div>
@@ -112,31 +141,29 @@
                 </div>
             </div>
         </div>
-    </div>
-</div>
 
-<script>
-    $("#save-setting").click(function() {
-        $.ajax({
-            url: '/admin/setting/support',
-            type: 'POST',
-            dataType: "json",
-            data: {
-                {foreach $update_field as $key}
-                {$key}: $('#{$key}').val(),
-                {/foreach}
-            },
-            success: function(data) {
-                if (data.ret === 1) {
-                    $('#success-message').text(data.msg);
-                    $('#success-dialog').modal('show');
-                } else {
-                    $('#fail-message').text(data.msg);
-                    $('#fail-dialog').modal('show');
-                }
-            }
-        })
-    });
-</script>
+        <script>
+            $("#save-setting").click(function () {
+                $.ajax({
+                    url: '/admin/setting/support',
+                    type: 'POST',
+                    dataType: "json",
+                    data: {
+                        {foreach $update_field as $key}
+                        {$key}: $('#{$key}').val(),
+                        {/foreach}
+                    },
+                    success: function (data) {
+                        if (data.ret === 1) {
+                            $('#success-message').text(data.msg);
+                            $('#success-dialog').modal('show');
+                        } else {
+                            $('#fail-message').text(data.msg);
+                            $('#fail-dialog').modal('show');
+                        }
+                    }
+                })
+            });
+        </script>
 
-{include file='admin/footer.tpl'}
+        {include file='admin/footer.tpl'}

+ 24 - 23
resources/views/tabler/admin/system.tpl

@@ -18,37 +18,38 @@
     <div class="page-body">
         <div class="container-xl">
             <div class="row row-deck row-cards">
-                 <div class="col-sm-12 col-lg-12">
-                     <div class="card">
-                         <div class="card-body">
-                             <table class="table table-transparent table-responsive">
-                                 <tr>
-                                     <td>SSPanel-UIM 版本</td>
-                                     <td class="text-end" id="version"><a href="#" id="version_check">{$version} </a></td>
-                                 </tr>
-                                 <tr>
-                                     <td>数据库版本</td>
-                                     <td class="text-end">{$db_version}</td>
-                                 </tr>
-                                 <tr>
-                                     <td>最后一次每日任务执行时间</td>
-                                     <td class="text-end">{$last_daily_job_time}</td>
-                                 </tr>
-                             </table>
-                         </div>
-                     </div>
-                 </div>
+                <div class="col-sm-12 col-lg-12">
+                    <div class="card">
+                        <div class="card-body">
+                            <table class="table table-transparent table-responsive">
+                                <tr>
+                                    <td>SSPanel-UIM 版本</td>
+                                    <td class="text-end" id="version"><a href="#" id="version_check">{$version} </a>
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>数据库版本</td>
+                                    <td class="text-end">{$db_version}</td>
+                                </tr>
+                                <tr>
+                                    <td>最后一次每日任务执行时间</td>
+                                    <td class="text-end">{$last_daily_job_time}</td>
+                                </tr>
+                            </table>
+                        </div>
+                    </div>
+                </div>
             </div>
         </div>
     </div>
 
     <script>
-        $('#version_check').click(function() {
+        $('#version_check').click(function () {
             $.ajax({
                 url: '/admin/system/check_update',
                 type: 'POST',
                 dataType: "json",
-                success: function(data) {
+                success: function (data) {
                     if (data.is_upto_date === true) {
                         $('.badge').remove();
                         $('#version').append('<span class="badge bg-green">已是最新版本</span>');
@@ -61,4 +62,4 @@
         });
     </script>
 
-{include file='admin/footer.tpl'}
+    {include file='admin/footer.tpl'}

+ 18 - 13
resources/views/tabler/admin/ticket/index.tpl

@@ -23,11 +23,11 @@
                         <div class="table-responsive">
                             <table id="data_table" class="table card-table table-vcenter text-nowrap datatable">
                                 <thead>
-                                    <tr>
-                                        {foreach $details['field'] as $key => $value}
-                                            <th>{$value}</th>
-                                        {/foreach}
-                                    </tr>
+                                <tr>
+                                    {foreach $details['field'] as $key => $value}
+                                        <th>{$value}</th>
+                                    {/foreach}
+                                </tr>
                                 </thead>
                             </table>
                         </div>
@@ -44,7 +44,7 @@
                 type: 'POST',
                 dataSrc: 'tickets'
             },
-            "autoWidth":false,
+            "autoWidth": false,
             'iDisplayLength': 10,
             'scrollX': true,
             'order': [
@@ -52,11 +52,16 @@
             ],
             columns: [
                 {foreach $details['field'] as $key => $value}
-                { data: '{$key}' },
+                {
+                    data: '{$key}'
+                },
                 {/foreach}
             ],
-            "columnDefs":[
-                { targets:[0],orderable:false }
+            "columnDefs": [
+                {
+                    targets: [0],
+                    orderable: false
+                }
             ],
             "dom": "<'row px-3 py-3'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
                 "<'row'<'col-sm-12'tr>>" +
@@ -99,7 +104,7 @@
                     url: "/admin/ticket/" + ticket_id + '/close',
                     type: 'PUT',
                     dataType: "json",
-                    success: function(data) {
+                    success: function (data) {
                         if (data.ret === 1) {
                             $('#success-message').text(data.msg);
                             $('#success-dialog').modal('show');
@@ -116,12 +121,12 @@
         function deleteTicket(ticket_id) {
             $('#notice-message').text('确定删除此工单?');
             $('#notice-dialog').modal('show');
-            $('#notice-confirm').off('click').on('click', function() {
+            $('#notice-confirm').off('click').on('click', function () {
                 $.ajax({
                     url: "/admin/ticket/" + ticket_id,
                     type: 'DELETE',
                     dataType: "json",
-                    success: function(data) {
+                    success: function (data) {
                         if (data.ret === 1) {
                             $('#success-noreload-message').text(data.msg);
                             $('#success-noreload-dialog').modal('show');
@@ -142,4 +147,4 @@
         loadTable();
     </script>
 
-{include file='admin/footer.tpl'}
+{include file='admin/footer.tpl'}

+ 34 - 31
resources/views/tabler/admin/ticket/view.tpl

@@ -15,18 +15,18 @@
                 <div class="col-auto">
                     <div class="btn-list">
                         {if $ticket->status !== 'closed'}
-                        <button href="#" class="btn btn-red" data-bs-toggle="modal"
-                            data-bs-target="#close_ticket_confirm_dialog">
-                            <i class="icon ti ti-x"></i>
-                            关闭
-                        </button>
+                            <button href="#" class="btn btn-red" data-bs-toggle="modal"
+                                    data-bs-target="#close_ticket_confirm_dialog">
+                                <i class="icon ti ti-x"></i>
+                                关闭
+                            </button>
                         {/if}
                         <button id="add_ai_reply" href="#" class="btn btn-primary">
                             <i class="icon ti ti-robot"></i>
                             AI 回复
                         </button>
                         <button href="#" class="btn btn-primary" data-bs-toggle="modal"
-                            data-bs-target="#add-reply">
+                                data-bs-target="#add-reply">
                             <i class="icon ti ti-plus"></i>
                             回复
                         </button>
@@ -51,24 +51,25 @@
                     <div class="card">
                         <div class="card-body">
                             <div class="divide-y">
-                            {foreach $comments as $comment}
-                            <div>
-                                <div class="row">
-                                    <div class="col">
-                                        <div>
-                                            {nl2br($comment->comment)}
-                                        </div>
-                                        <div class="text-secondary my-1">{$comment->commenter_name} 回复于 {$comment->datetime}
+                                {foreach $comments as $comment}
+                                    <div>
+                                        <div class="row">
+                                            <div class="col">
+                                                <div>
+                                                    {nl2br($comment->comment)}
+                                                </div>
+                                                <div class="text-secondary my-1">{$comment->commenter_name}
+                                                    回复于 {$comment->datetime}
+                                                </div>
+                                            </div>
+                                            <div class="col-auto">
+                                                <div>
+                                                    # {$comment->comment_id + 1}
+                                                </div>
+                                            </div>
                                         </div>
                                     </div>
-                                    <div class="col-auto">
-                                        <div>
-                                            # {$comment->comment_id + 1}
-                                        </div>
-                                    </div>
-                                </div>
-                            </div>
-                            {/foreach}
+                                {/foreach}
                             </div>
                         </div>
                     </div>
@@ -86,7 +87,8 @@
                 </div>
                 <div class="modal-body">
                     <div class="mb-3">
-                        <textarea id="reply-comment" class="form-control" rows="12" placeholder="请输入回复内容"></textarea>
+                        <textarea id="reply-comment" class="form-control" rows="12"
+                                  placeholder="请输入回复内容"></textarea>
                     </div>
                 </div>
                 <div class="modal-footer">
@@ -113,14 +115,15 @@
                 </div>
                 <div class="modal-footer">
                     <button type="button" class="btn me-auto" data-bs-dismiss="modal">取消</button>
-                    <button id="confirm_close" type="button" class="btn btn-primary" data-bs-dismiss="modal">确认</button>
+                    <button id="confirm_close" type="button" class="btn btn-primary" data-bs-dismiss="modal">确认
+                    </button>
                 </div>
             </div>
         </div>
     </div>
 
     <script>
-        $("#reply").click(function() {
+        $("#reply").click(function () {
             $.ajax({
                 url: "/admin/ticket/{$ticket->id}",
                 type: 'PUT',
@@ -128,7 +131,7 @@
                 data: {
                     comment: $('#reply-comment').val()
                 },
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -140,12 +143,12 @@
             })
         });
 
-        $("#add_ai_reply").click(function() {
+        $("#add_ai_reply").click(function () {
             $.ajax({
                 url: "/admin/ticket/{$ticket->id}/ai",
                 type: 'PUT',
                 dataType: "json",
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -157,12 +160,12 @@
             })
         });
 
-        $("#confirm_close").click(function() {
+        $("#confirm_close").click(function () {
             $.ajax({
                 url: "/admin/ticket/{$ticket->id}/close",
                 type: 'PUT',
                 dataType: "json",
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -175,4 +178,4 @@
         });
     </script>
 
-{include file='admin/footer.tpl'}
+{include file='admin/footer.tpl'}

+ 43 - 43
resources/views/tabler/admin/user/edit.tpl

@@ -42,28 +42,28 @@
                                 <label class="form-label col-3 col-form-label">用户名</label>
                                 <div class="col">
                                     <input id="user_name" type="text" class="form-control"
-                                        value="{$edit_user->user_name}">
+                                           value="{$edit_user->user_name}">
                                 </div>
                             </div>
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label">备注</label>
                                 <div class="col">
                                     <input id="remark" type="text" class="form-control" value="{$edit_user->remark}"
-                                        placeholder="仅管理员可见">
+                                           placeholder="仅管理员可见">
                                 </div>
                             </div>
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label">账户密码</label>
                                 <div class="col">
                                     <input id="pass" type="text" class="form-control"
-                                        placeholder="若需为此用户重置密码, 填写此栏">
+                                           placeholder="若需为此用户重置密码, 填写此栏">
                                 </div>
                             </div>
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label">账户余额</label>
                                 <div class="col">
                                     <input id="money" type="number" step="0.1" class="form-control"
-                                        value="{$edit_user->money}">
+                                           value="{$edit_user->money}">
                                 </div>
                             </div>
                             <div class="hr-text">
@@ -73,23 +73,23 @@
                                 <label class="form-label col-4 col-form-label">等级过期时间</label>
                                 <div class="col">
                                     <input id="class_expire" type="text" class="form-control"
-                                        value="{$edit_user->class_expire}">
+                                           value="{$edit_user->class_expire}">
                                 </div>
                             </div>
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-4 col-form-label">免费用户流量重置日</label>
                                 <div class="col">
                                     <input id="auto_reset_day" type="text" class="form-control"
-                                        value="{$edit_user->auto_reset_day}">
+                                           value="{$edit_user->auto_reset_day}">
                                 </div>
                             </div>
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-4 col-form-label">
-                                重置的免费流量(GB)
+                                    重置的免费流量(GB)
                                 </label>
                                 <div class="col">
                                     <input id="auto_reset_bandwidth" type="text" class="form-control"
-                                        value="{$edit_user->auto_reset_bandwidth}">
+                                           value="{$edit_user->auto_reset_bandwidth}">
                                 </div>
                             </div>
                             <div class="hr-text">
@@ -100,7 +100,7 @@
                                 <span class="col-auto">
                                     <label class="form-check form-check-single form-switch">
                                         <input id="is_admin" class="form-check-input" type="checkbox"
-                                            {if $edit_user->is_admin}checked="" {/if}>
+                                               {if $edit_user->is_admin}checked="" {/if}>
                                     </label>
                                 </span>
                             </div>
@@ -109,7 +109,7 @@
                                 <span class="col-auto">
                                     <label class="form-check form-check-single form-switch">
                                         <input id="ga_enable" class="form-check-input" type="checkbox"
-                                            {if $edit_user->ga_enable}checked="" {/if}>
+                                               {if $edit_user->ga_enable}checked="" {/if}>
                                     </label>
                                 </span>
                             </div>
@@ -117,7 +117,7 @@
                                 <span class="col">账户异常状态</span>
                                 <span class="col-auto form-check-single form-switch">
                                     <input id="is_shadow_banned" class="form-check-input" type="checkbox"
-                                            {if $edit_user->is_shadow_banned}checked=""{/if}>
+                                           {if $edit_user->is_shadow_banned}checked=""{/if}>
                                 </span>
                             </div>
                             <div class="form-group mb-3 row">
@@ -125,7 +125,7 @@
                                 <span class="col-auto">
                                     <label class="form-check form-check-single form-switch">
                                         <input id="is_banned" class="form-check-input" type="checkbox"
-                                            {if $edit_user->is_banned}checked=""{/if}>
+                                               {if $edit_user->is_banned}checked=""{/if}>
                                     </label>
                                 </span>
                             </div>
@@ -133,7 +133,7 @@
                                 <span class="col">手动封禁理由</span>
                                 <span class="col-auto">
                                     <input id="banned_reason" type="text" class="form-control"
-                                        value="{$edit_user->banned_reason}">
+                                           value="{$edit_user->banned_reason}">
                                 </span>
                             </div>
                         </div>
@@ -149,21 +149,21 @@
                                 <label class="form-label col-4 col-form-label">流量限制</label>
                                 <div class="col">
                                     <input id="transfer_enable" type="text" class="form-control"
-                                        value="{$edit_user->enableTraffic()}">
+                                           value="{$edit_user->enableTraffic()}">
                                 </div>
                             </div>
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-4 col-form-label">当期用量</label>
                                 <div class="col">
                                     <input id="usedTraffic" type="text" class="form-control"
-                                        value="{$edit_user->usedTraffic()}" disabled />
+                                           value="{$edit_user->usedTraffic()}" disabled/>
                                 </div>
                             </div>
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-4 col-form-label">累计用量</label>
                                 <div class="col">
                                     <input id="usedTraffic" type="text" class="form-control"
-                                           value="{$edit_user->totalTraffic()}" disabled />
+                                           value="{$edit_user->totalTraffic()}" disabled/>
                                 </div>
                             </div>
                             <div class="hr-text">
@@ -173,7 +173,7 @@
                                 <label class="form-label col-4 col-form-label">可用邀请数量</label>
                                 <div class="col">
                                     <input id="invite_num" type="text" class="form-control"
-                                        value="{$edit_user->invite_num}">
+                                           value="{$edit_user->invite_num}">
                                 </div>
                             </div>
                             <div class="form-group mb-3 row">
@@ -186,32 +186,32 @@
                                 <span>划分与使用限制</span>
                             </div>
                             <div class="form-group mb-3 col-12">
-                                    <label class="form-label col-12 col-form-label">节点群组</label>
-                                    <div class="col">
-                                        <input id="node_group" type="text" class="form-control"
-                                            value="{$edit_user->node_group}">
-                                    </div>
+                                <label class="form-label col-12 col-form-label">节点群组</label>
+                                <div class="col">
+                                    <input id="node_group" type="text" class="form-control"
+                                           value="{$edit_user->node_group}">
                                 </div>
-                                <div class="form-group mb-3 col-12">
-                                    <label class="form-label col-12 col-form-label">账户等级</label>
-                                    <div class="col">
-                                        <input id="class" type="text" class="form-control" value="{$edit_user->class}">
-                                    </div>
+                            </div>
+                            <div class="form-group mb-3 col-12">
+                                <label class="form-label col-12 col-form-label">账户等级</label>
+                                <div class="col">
+                                    <input id="class" type="text" class="form-control" value="{$edit_user->class}">
                                 </div>
-                                <div class="form-group mb-3 col-12">
-                                    <label class="form-label col-12 col-form-label">速度限制 (Mbps)</label>
-                                    <div class="col">
-                                        <input id="node_speedlimit" type="text" class="form-control"
-                                            value="{$edit_user->node_speedlimit}">
-                                    </div>
+                            </div>
+                            <div class="form-group mb-3 col-12">
+                                <label class="form-label col-12 col-form-label">速度限制 (Mbps)</label>
+                                <div class="col">
+                                    <input id="node_speedlimit" type="text" class="form-control"
+                                           value="{$edit_user->node_speedlimit}">
                                 </div>
-                                <div class="form-group mb-3 col-12">
-                                    <label class="form-label col-12 col-form-label">同時连接 IP 限制</label>
-                                    <div class="col">
-                                        <input id="node_iplimit" type="text" class="form-control"
-                                            value="{$edit_user->node_iplimit}">
-                                    </div>
+                            </div>
+                            <div class="form-group mb-3 col-12">
+                                <label class="form-label col-12 col-form-label">同時连接 IP 限制</label>
+                                <div class="col">
+                                    <input id="node_iplimit" type="text" class="form-control"
+                                           value="{$edit_user->node_iplimit}">
                                 </div>
+                            </div>
                         </div>
                     </div>
                 </div>
@@ -246,14 +246,14 @@
                                 <label class="form-label col-3 col-form-label">IP / CIDR</label>
                                 <div class="col">
                                     <textarea id="forbidden_ip" class="col form-control"
-                                        rows="2">{$edit_user->forbidden_ip}</textarea>
+                                              rows="2">{$edit_user->forbidden_ip}</textarea>
                                 </div>
                             </div>
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label">PORT</label>
                                 <div class="col">
                                     <textarea id="forbidden_port" class="col form-control"
-                                        rows="2">{$edit_user->forbidden_port}</textarea>
+                                              rows="2">{$edit_user->forbidden_port}</textarea>
                                 </div>
                             </div>
                         </div>
@@ -265,7 +265,7 @@
 </div>
 
 <script>
-    $("#save_changes").click(function() {
+    $("#save_changes").click(function () {
         $.ajax({
             url: '/admin/user/{$edit_user->id}',
             type: 'PUT',
@@ -279,7 +279,7 @@
                 ga_enable: $("#ga_enable").is(":checked"),
                 is_shadow_banned: $("#is_shadow_banned").is(":checked"),
             },
-            success: function(data) {
+            success: function (data) {
                 if (data.ret === 1) {
                     $('#success-message').text(data.msg);
                     $('#success-dialog').modal('show');

+ 25 - 19
resources/views/tabler/admin/user/index.tpl

@@ -17,7 +17,7 @@
                 <div class="col-auto">
                     <div class="btn-list">
                         <button href="#" class="btn btn-primary" data-bs-toggle="modal"
-                            data-bs-target="#create-dialog">
+                                data-bs-target="#create-dialog">
                             <i class="icon ti ti-plus"></i>
                             创建
                         </button>
@@ -34,11 +34,11 @@
                         <div class="table-responsive">
                             <table id="data_table" class="table card-table table-vcenter text-nowrap datatable">
                                 <thead>
-                                    <tr>
-                                        {foreach $details['field'] as $key => $value}
-                                            <th>{$value}</th>
-                                        {/foreach}
-                                    </tr>
+                                <tr>
+                                    {foreach $details['field'] as $key => $value}
+                                        <th>{$value}</th>
+                                    {/foreach}
+                                </tr>
                                 </thead>
                             </table>
                         </div>
@@ -62,7 +62,7 @@
                                 <label class="form-label col-3 col-form-label">{$from['info']}</label>
                                 <div class="col">
                                     <input id="{$from['id']}" type="text" class="form-control"
-                                        placeholder="{$from['placeholder']}">
+                                           placeholder="{$from['placeholder']}">
                                 </div>
                             </div>
                         {/if}
@@ -70,7 +70,7 @@
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label">{$from['info']}</label>
                                 <textarea id="{$from['id']}" class="col form-control" rows="{$from['rows']}"
-                                    placeholder="{$from['placeholder']}"></textarea>
+                                          placeholder="{$from['placeholder']}"></textarea>
                             </div>
                         {/if}
                         {if $from['type'] === 'select'}
@@ -89,7 +89,8 @@
                 </div>
                 <div class="modal-footer">
                     <button type="button" class="btn me-auto" data-bs-dismiss="modal">取消</button>
-                    <button id="create-button" type="button" class="btn btn-primary" data-bs-dismiss="modal">添加</button>
+                    <button id="create-button" type="button" class="btn btn-primary" data-bs-dismiss="modal">添加
+                    </button>
                 </div>
             </div>
         </div>
@@ -102,7 +103,7 @@
                 type: 'POST',
                 dataSrc: 'users'
             },
-            "autoWidth":false,
+            "autoWidth": false,
             'iDisplayLength': 10,
             'scrollX': true,
             'order': [
@@ -110,11 +111,16 @@
             ],
             columns: [
                 {foreach $details['field'] as $key => $value}
-                { data: '{$key}' },
+                {
+                    data: '{$key}'
+                },
                 {/foreach}
             ],
-            "columnDefs":[
-                { targets:[0],orderable:false },
+            "columnDefs": [
+                {
+                    targets: [0],
+                    orderable: false
+                },
             ],
             "dom": "<'row px-3 py-3'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
                 "<'row'<'col-sm-12'tr>>" +
@@ -149,17 +155,17 @@
             table;
         }
 
-        $("#create-button").click(function() {
+        $("#create-button").click(function () {
             $.ajax({
                 type: "POST",
                 url: "/admin/user/create",
                 dataType: "json",
                 data: {
                     {foreach $details['create_dialog'] as $from}
-                        {$from['id']}: $('#{$from['id']}').val(),
+                    {$from['id']}: $('#{$from['id']}').val(),
                     {/foreach}
                 },
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-noreload-message').text(data.msg);
                         $('#success-noreload-dialog').modal('show');
@@ -175,12 +181,12 @@
         function deleteUser(user_id) {
             $('#notice-message').text('确定删除此用户?');
             $('#notice-dialog').modal('show');
-            $('#notice-confirm').off('click').on('click', function() {
+            $('#notice-confirm').off('click').on('click', function () {
                 $.ajax({
                     url: "/admin/user/" + user_id,
                     type: 'DELETE',
                     dataType: "json",
-                    success: function(data) {
+                    success: function (data) {
                         if (data.ret === 1) {
                             $('#success-noreload-message').text(data.msg);
                             $('#success-noreload-dialog').modal('show');
@@ -201,4 +207,4 @@
         loadTable();
     </script>
 
-{include file='admin/footer.tpl'}
+{include file='admin/footer.tpl'}

+ 105 - 104
resources/views/tabler/auth/login.tpl

@@ -1,123 +1,124 @@
 {include file='header.tpl'}
 
 <body class="border-top-wide border-primary d-flex flex-column">
-    <div class="page page-center">
-        <div class="container-tight my-auto">
-            <div class="text-center mb-4">
-                <a href="#" class="navbar-brand navbar-brand-autodark">
-                    <img src="/images/uim-logo-round_96x96.png" height="64" alt="SSPanel-UIM Logo">
-                </a>
-            </div>
-            <div class="card card-md">
-                <div class="card-body">
-                    <h2 class="card-title text-center mb-4">登录到用户中心</h2>
-                    <div class="mb-3">
-                        <label class="form-label">注册邮箱</label>
-                        <input id="email" type="email" class="form-control">
-                    </div>
-                    <div class="mb-2">
-                        <label class="form-label">
-                            登录密码
-                            <span class="form-label-description">
+<div class="page page-center">
+    <div class="container-tight my-auto">
+        <div class="text-center mb-4">
+            <a href="#" class="navbar-brand navbar-brand-autodark">
+                <img src="/images/uim-logo-round_96x96.png" height="64" alt="SSPanel-UIM Logo">
+            </a>
+        </div>
+        <div class="card card-md">
+            <div class="card-body">
+                <h2 class="card-title text-center mb-4">登录到用户中心</h2>
+                <div class="mb-3">
+                    <label class="form-label">注册邮箱</label>
+                    <input id="email" type="email" class="form-control">
+                </div>
+                <div class="mb-2">
+                    <label class="form-label">
+                        登录密码
+                        <span class="form-label-description">
                                 <a href="/password/reset">忘记密码</a>
                             </span>
-                        </label>
-                        <div class="input-group input-group-flat">
-                            <input id="passwd" type="password" class="form-control" autocomplete="off">
-                        </div>
-                    </div>
-                    <div class="mb-2">
-                        <label class="form-label">两步认证</label>
-                        <input id="code" type="email" class="form-control" placeholder="如果没有设置两步认证可留空">
+                    </label>
+                    <div class="input-group input-group-flat">
+                        <input id="passwd" type="password" class="form-control" autocomplete="off">
                     </div>
-                    <div class="mb-2">
-                        <label class="form-check">
-                            <input id="remember_me" type="checkbox" class="form-check-input" />
-                            <span class="form-check-label">记住此设备</span>
-                        </label>
-                    </div>
-                    {if $public_setting['enable_login_captcha']}
-                        {if $public_setting['captcha_provider'] === 'turnstile'}
-                            <div class="mb-3">
-                                <div class="input-group mb-3">
-                                    <div id="cf-turnstile" class="cf-turnstile" data-sitekey="{$captcha['turnstile_sitekey']}" data-theme="light"></div>
-                                </div>
+                </div>
+                <div class="mb-2">
+                    <label class="form-label">两步认证</label>
+                    <input id="code" type="email" class="form-control" placeholder="如果没有设置两步认证可留空">
+                </div>
+                <div class="mb-2">
+                    <label class="form-check">
+                        <input id="remember_me" type="checkbox" class="form-check-input"/>
+                        <span class="form-check-label">记住此设备</span>
+                    </label>
+                </div>
+                {if $public_setting['enable_login_captcha']}
+                    {if $public_setting['captcha_provider'] === 'turnstile'}
+                        <div class="mb-3">
+                            <div class="input-group mb-3">
+                                <div id="cf-turnstile" class="cf-turnstile"
+                                     data-sitekey="{$captcha['turnstile_sitekey']}" data-theme="light"></div>
                             </div>
-                        {/if}
-                        {if $public_setting['captcha_provider'] === 'geetest'}
-                            <div class="mb-3">
-                                <div class="input-group mb-3">
-                                    <div id="geetest"></div>
-                                </div>
+                        </div>
+                    {/if}
+                    {if $public_setting['captcha_provider'] === 'geetest'}
+                        <div class="mb-3">
+                            <div class="input-group mb-3">
+                                <div id="geetest"></div>
                             </div>
-                        {/if}
+                        </div>
                     {/if}
-                    <div class="form-footer">
-                        <button id="login-dashboard" class="btn btn-primary w-100">登录</button>
-                    </div>
+                {/if}
+                <div class="form-footer">
+                    <button id="login-dashboard" class="btn btn-primary w-100">登录</button>
                 </div>
             </div>
-            <div class="text-center text-secondary mt-3">
-                还没有账户? <a href="/auth/register" tabindex="-1">点击注册</a>
-            </div>
+        </div>
+        <div class="text-center text-secondary mt-3">
+            还没有账户? <a href="/auth/register" tabindex="-1">点击注册</a>
         </div>
     </div>
+</div>
 
-    <script>
-        $("#login-dashboard").click(function() {
-            $.ajax({
-                type: 'POST',
-                url: '/auth/login',
-                dataType: "json",
-                data: {
-                    code: $('#code').val(),
-                    email: $('#email').val(),
-                    passwd: $('#passwd').val(),
-                    remember_me: $('#remember_me').is(":checked"),
-                    {if $public_setting['enable_login_captcha']}
-                        {if $public_setting['captcha_provider'] === 'turnstile'}
-                            turnstile: $('input[name=cf-turnstile-response]').val(),
-                        {/if}
-                        {if $public_setting['captcha_provider'] === 'geetest'}
-                            geetest: geetest_result,
-                        {/if}
-                    {/if}
-                },
-                success: function(data) {
-                    if (data.ret === 1) {
-                        $('#success-message').text(data.msg);
-                        $('#success-dialog').modal('show');
-                        window.setTimeout(location.href=data.redir, {$config['jump_delay']});
-                    } else {
-                        $('#fail-message').text(data.msg);
-                        $('#fail-dialog').modal('show');
-                    }
+<script>
+    $("#login-dashboard").click(function () {
+        $.ajax({
+            type: 'POST',
+            url: '/auth/login',
+            dataType: "json",
+            data: {
+                code: $('#code').val(),
+                email: $('#email').val(),
+                passwd: $('#passwd').val(),
+                remember_me: $('#remember_me').is(":checked"),
+                {if $public_setting['enable_login_captcha']}
+                {if $public_setting['captcha_provider'] === 'turnstile'}
+                turnstile: $('input[name=cf-turnstile-response]').val(),
+                {/if}
+                {if $public_setting['captcha_provider'] === 'geetest'}
+                geetest: geetest_result,
+                {/if}
+                {/if}
+            },
+            success: function (data) {
+                if (data.ret === 1) {
+                    $('#success-message').text(data.msg);
+                    $('#success-dialog').modal('show');
+                    window.setTimeout(location.href = data.redir, {$config['jump_delay']});
+                } else {
+                    $('#fail-message').text(data.msg);
+                    $('#fail-dialog').modal('show');
                 }
-            })
+            }
+        })
+    });
+</script>
+
+{if $public_setting['enable_login_captcha']}
+{if $public_setting['captcha_provider'] === 'turnstile'}
+    <script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
+{/if}
+{if $public_setting['captcha_provider'] === 'geetest'}
+    <script src="https://static.geetest.com/v4/gt4.js"></script>
+    <script>
+        var geetest_result = '';
+        initGeetest4({
+            captchaId: '{$captcha['geetest_id']}',
+            product: 'float',
+            language: "zho",
+            riskType: 'slide'
+        }, function (geetest) {
+            geetest.appendTo("#geetest");
+            geetest.onSuccess(function () {
+                geetest_result = geetest.getValidate();
+            });
         });
     </script>
-
-    {if $public_setting['enable_login_captcha']}
-        {if $public_setting['captcha_provider'] === 'turnstile'}
-            <script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
-        {/if}
-        {if $public_setting['captcha_provider'] === 'geetest'}
-            <script src="https://static.geetest.com/v4/gt4.js"></script>
-            <script>
-                var geetest_result = '';
-                initGeetest4({
-                    captchaId: '{$captcha['geetest_id']}',
-                    product: 'float',
-                    language: "zho",
-                    riskType:'slide'
-                }, function (geetest) {
-                    geetest.appendTo("#geetest");
-                    geetest.onSuccess(function() {
-                        geetest_result = geetest.getValidate();
-                    });
-                });
-            </script>
-        {/if}
-    {/if}
+{/if}
+{/if}
 
 {include file='footer.tpl'}

+ 143 - 140
resources/views/tabler/auth/register.tpl

@@ -1,169 +1,172 @@
 {include file='header.tpl'}
 
 <body class="border-top-wide border-primary d-flex flex-column">
-    <div class="page page-center">
-        <div class="container-tight my-auto">
-            <div class="text-center mb-4">
-                <a href="#" class="navbar-brand navbar-brand-autodark">
-                    <img src="/images/uim-logo-round_96x96.png" height="64" alt="SSPanel-UIM Logo">
-                </a>
-            </div>
-            <div class="card card-md">
-                {if $public_setting['reg_mode'] !== 'close'}
-                    <div class="card-body">
-                        <h2 class="card-title text-center mb-4">注册账户</h2>
-                        <div class="mb-3">
-                            <input id="name" type="text" class="form-control" placeholder="昵称">
+<div class="page page-center">
+    <div class="container-tight my-auto">
+        <div class="text-center mb-4">
+            <a href="#" class="navbar-brand navbar-brand-autodark">
+                <img src="/images/uim-logo-round_96x96.png" height="64" alt="SSPanel-UIM Logo">
+            </a>
+        </div>
+        <div class="card card-md">
+            {if $public_setting['reg_mode'] !== 'close'}
+                <div class="card-body">
+                    <h2 class="card-title text-center mb-4">注册账户</h2>
+                    <div class="mb-3">
+                        <input id="name" type="text" class="form-control" placeholder="昵称">
+                    </div>
+                    <div class="mb-3">
+                        <input id="email" type="email" class="form-control" placeholder="电子邮箱">
+                    </div>
+                    <div class="mb-3">
+                        <div class="input-group input-group-flat">
+                            <input id="passwd" type="password" class="form-control" placeholder="登录密码">
                         </div>
-                        <div class="mb-3">
-                            <input id="email" type="email" class="form-control" placeholder="电子邮箱">
+                    </div>
+                    <div class="mb-3">
+                        <div class="input-group input-group-flat">
+                            <input id="repasswd" type="password" class="form-control" placeholder="重复登录密码">
                         </div>
+                    </div>
+                    {if $public_setting['reg_mode'] !== 'close' }
                         <div class="mb-3">
                             <div class="input-group input-group-flat">
-                                <input id="passwd" type="password" class="form-control" placeholder="登录密码">
+                                <input id="code" type="text" class="form-control"
+                                       placeholder="注册邀请码{if $public_setting['reg_mode'] === 'open'}(可选){else}(必填){/if}"
+                                       value="{$code}">
                             </div>
                         </div>
+                    {/if}
+                    {if $public_setting['reg_email_verify']}
                         <div class="mb-3">
-                            <div class="input-group input-group-flat">
-                                <input id="repasswd" type="password" class="form-control" placeholder="重复登录密码">
+                            <div class="input-group mb-2">
+                                <input id="emailcode" type="text" class="form-control" placeholder="邮箱验证码">
+                                <button id="email-verify" class="btn text-blue" type="button">获取</button>
                             </div>
                         </div>
-                        {if $public_setting['reg_mode'] !== 'close' }
+                    {/if}
+                    <div class="mb-3">
+                        <label class="form-check">
+                            <input id="tos" type="checkbox" class="form-check-input"/>
+                            <span class="form-check-label">
+                                    我已阅读并同意 <a href="/tos" tabindex="-1"> 服务条款与隐私政策 </a>
+                                </span>
+                        </label>
+                    </div>
+                    {if $public_setting['enable_reg_captcha']}
+                        {if $public_setting['captcha_provider'] === 'turnstile'}
                             <div class="mb-3">
-                                <div class="input-group input-group-flat">
-                                    <input id="code" type="text" class="form-control" placeholder="注册邀请码{if $public_setting['reg_mode'] === 'open'}(可选){else}(必填){/if}" value="{$code}">
+                                <div class="input-group mb-3">
+                                    <div id="cf-turnstile" class="cf-turnstile"
+                                         data-sitekey="{$captcha['turnstile_sitekey']}" data-theme="light"></div>
                                 </div>
                             </div>
                         {/if}
-                        {if $public_setting['reg_email_verify']}
+                        {if $public_setting['captcha_provider'] === 'geetest'}
                             <div class="mb-3">
-                                <div class="input-group mb-2">
-                                    <input id="emailcode" type="text" class="form-control" placeholder="邮箱验证码">
-                                    <button id="email-verify" class="btn text-blue" type="button">获取</button>
+                                <div class="input-group mb-3">
+                                    <div id="geetest"></div>
                                 </div>
                             </div>
                         {/if}
-                        <div class="mb-3">
-                            <label class="form-check">
-                                <input id="tos" type="checkbox" class="form-check-input" />
-                                <span class="form-check-label">
-                                    我已阅读并同意 <a href="/tos" tabindex="-1"> 服务条款与隐私政策 </a>
-                                </span>
-                            </label>
-                        </div>
-                        {if $public_setting['enable_reg_captcha']}
-                            {if $public_setting['captcha_provider'] === 'turnstile'}
-                                <div class="mb-3">
-                                    <div class="input-group mb-3">
-                                        <div id="cf-turnstile" class="cf-turnstile" data-sitekey="{$captcha['turnstile_sitekey']}" data-theme="light"></div>
-                                    </div>
-                                </div>
-                            {/if}
-                            {if $public_setting['captcha_provider'] === 'geetest'}
-                                <div class="mb-3">
-                                    <div class="input-group mb-3">
-                                        <div id="geetest"></div>
-                                    </div>
-                                </div>
-                            {/if}
-                        {/if}
-                        <div class="form-footer">
-                            <button id="confirm-register" type="submit" class="btn btn-primary w-100">注册新账户</button>
-                        </div>
-                    </div>
-                {else}
-                    <div class="card-body">
-                        <p>还没有开放注册,过两天再来看看吧</p>
+                    {/if}
+                    <div class="form-footer">
+                        <button id="confirm-register" type="submit" class="btn btn-primary w-100">注册新账户</button>
                     </div>
-                {/if}
-            </div>
-            <div class="text-center text-secondary mt-3">
-                已有账户? <a href="/auth/login" tabindex="-1">点击登录</a>
-            </div>
+                </div>
+            {else}
+                <div class="card-body">
+                    <p>还没有开放注册,过两天再来看看吧</p>
+                </div>
+            {/if}
+        </div>
+        <div class="text-center text-secondary mt-3">
+            已有账户? <a href="/auth/login" tabindex="-1">点击登录</a>
         </div>
     </div>
+</div>
 
-    <script>
-        {if $public_setting['reg_email_verify']}
-            $("#email-verify").click(function() {
-                $.ajax({
-                    type: 'POST',
-                    url: '/auth/send',
-                    dataType: "json",
-                    data: {
-                        email: $('#email').val(),
-                    },
-                    success: function(data) {
-                        if (data.ret === 1) {
-                            $('#success-message').text(data.msg);
-                            $('#success-dialog').modal('show');
-                        } else {
-                            $('#fail-message').text(data.msg);
-                            $('#fail-dialog').modal('show');
-                        }
-                    }
-                })
-            });
-        {/if}
+<script>
+    {if $public_setting['reg_email_verify']}
+    $("#email-verify").click(function () {
+        $.ajax({
+            type: 'POST',
+            url: '/auth/send',
+            dataType: "json",
+            data: {
+                email: $('#email').val(),
+            },
+            success: function (data) {
+                if (data.ret === 1) {
+                    $('#success-message').text(data.msg);
+                    $('#success-dialog').modal('show');
+                } else {
+                    $('#fail-message').text(data.msg);
+                    $('#fail-dialog').modal('show');
+                }
+            }
+        })
+    });
+    {/if}
 
-        $("#confirm-register").click(function() {
-            $.ajax({
-                type: 'POST',
-                url: '/auth/register',
-                dataType: "json",
-                data: {
-                    {if $public_setting['reg_email_verify']}
-                        emailcode: $('#emailcode').val(),
-                    {/if}
-                    tos: $('#tos').prop('checked'), // true / false (string)
-                    code: $('#code').val(),
-                    name: $('#name').val(),
-                    email: $('#email').val(),
-                    passwd: $('#passwd').val(),
-                    repasswd: $('#repasswd').val(),
-                    {if $public_setting['enable_reg_captcha']}
-                        {if $public_setting['captcha_provider'] === 'turnstile'}
-                            turnstile: $('input[name=cf-turnstile-response]').val(),
-                        {/if}
-                        {if $public_setting['captcha_provider'] === 'geetest'}
-                            geetest: geetest_result,
-                        {/if}
-                    {/if}
-                },
-                success: function(data) {
-                    if (data.ret === 1) {
-                        $('#success-message').text(data.msg);
-                        $('#success-dialog').modal('show');
-                        window.setTimeout(location.href=data.redir, {$config['jump_delay']});
-                    } else {
-                        $('#fail-message').text(data.msg);
-                        $('#fail-dialog').modal('show');
-                    }
+    $("#confirm-register").click(function () {
+        $.ajax({
+            type: 'POST',
+            url: '/auth/register',
+            dataType: "json",
+            data: {
+                {if $public_setting['reg_email_verify']}
+                emailcode: $('#emailcode').val(),
+                {/if}
+                tos: $('#tos').prop('checked'), // true / false (string)
+                code: $('#code').val(),
+                name: $('#name').val(),
+                email: $('#email').val(),
+                passwd: $('#passwd').val(),
+                repasswd: $('#repasswd').val(),
+                {if $public_setting['enable_reg_captcha']}
+                {if $public_setting['captcha_provider'] === 'turnstile'}
+                turnstile: $('input[name=cf-turnstile-response]').val(),
+                {/if}
+                {if $public_setting['captcha_provider'] === 'geetest'}
+                geetest: geetest_result,
+                {/if}
+                {/if}
+            },
+            success: function (data) {
+                if (data.ret === 1) {
+                    $('#success-message').text(data.msg);
+                    $('#success-dialog').modal('show');
+                    window.setTimeout(location.href = data.redir, {$config['jump_delay']});
+                } else {
+                    $('#fail-message').text(data.msg);
+                    $('#fail-dialog').modal('show');
                 }
-            })
+            }
+        })
+    });
+</script>
+
+{if $public_setting['enable_reg_captcha']}
+{if $public_setting['captcha_provider'] === 'turnstile'}
+    <script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
+{/if}
+{if $public_setting['captcha_provider'] === 'geetest'}
+    <script src="https://static.geetest.com/v4/gt4.js"></script>
+    <script>
+        var geetest_result = '';
+        initGeetest4({
+            captchaId: '{$captcha['geetest_id']}',
+            product: 'float',
+            language: "zho",
+            riskType: 'slide'
+        }, function (geetest) {
+            geetest.appendTo("#geetest");
+            geetest.onSuccess(function () {
+                geetest_result = geetest.getValidate();
+            });
         });
     </script>
-
-    {if $public_setting['enable_reg_captcha']}
-        {if $public_setting['captcha_provider'] === 'turnstile'}
-            <script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
-        {/if}
-        {if $public_setting['captcha_provider'] === 'geetest'}
-            <script src="https://static.geetest.com/v4/gt4.js"></script>
-            <script>
-                var geetest_result = '';
-                initGeetest4({
-                    captchaId: '{$captcha['geetest_id']}',
-                    product: 'float',
-                    language: "zho",
-                    riskType:'slide'
-                }, function (geetest) {
-                    geetest.appendTo("#geetest");
-                    geetest.onSuccess(function() {
-                        geetest_result = geetest.getValidate();
-                    });
-                });
-            </script>
-        {/if}
-    {/if}
+{/if}
+{/if}
 {include file='footer.tpl'}

+ 13 - 13
resources/views/tabler/gateway/epay.tpl

@@ -7,24 +7,24 @@
         <input hidden id="price" name="price" value="{$invoice->price}">
         <input hidden id="invoice_id" name="invoice_id" value="{$invoice->id}">
         {if $public_setting['epay_alipay']}
-        <button class="btn btn-flat waves-attach" id="btnSubmit" type="submit" name="type" value="alipay">
-            <img src="/images/alipay.png" height="50px" />
-        </button>
+            <button class="btn btn-flat waves-attach" id="btnSubmit" type="submit" name="type" value="alipay">
+                <img src="/images/alipay.png" height="50px"/>
+            </button>
         {/if}
         {if $public_setting['epay_wechat']}
-        <button class="btn btn-flat waves-attach" id="btnSubmit" type="submit" name="type" value="wxpay">
-            <img src="/images/wechat.png" height="50px" />
-        </button>
+            <button class="btn btn-flat waves-attach" id="btnSubmit" type="submit" name="type" value="wxpay">
+                <img src="/images/wechat.png" height="50px"/>
+            </button>
         {/if}
         {if $public_setting['epay_qq']}
-        <button class="btn btn-flat waves-attach" id="btnSubmit" type="submit" name="type" value="qqpay">
-            <img src="/images/qqpay.png" height="50px" />
-        </button>
+            <button class="btn btn-flat waves-attach" id="btnSubmit" type="submit" name="type" value="qqpay">
+                <img src="/images/qqpay.png" height="50px"/>
+            </button>
         {/if}
         {if $public_setting['epay_usdt']}
-        <button class="btn btn-flat waves-attach" id="btnSubmit" type="submit" name="type" value="usdt">
-            <img src="/images/usdt.png" height="50px" />
-        </button>
+            <button class="btn btn-flat waves-attach" id="btnSubmit" type="submit" name="type" value="usdt">
+                <img src="/images/usdt.png" height="50px"/>
+            </button>
         {/if}
     </form>
-</div>
+</div>

+ 7 - 4
resources/views/tabler/gateway/stripe.tpl

@@ -1,4 +1,5 @@
-<link rel="stylesheet" href="https://{$config['jsdelivr_url']}/npm/@tabler/core@latest/dist/css/tabler-payments.min.css">
+<link rel="stylesheet"
+      href="https://{$config['jsdelivr_url']}/npm/@tabler/core@latest/dist/css/tabler-payments.min.css">
 
 <div class="card-inner">
     <h4>
@@ -11,10 +12,12 @@
         <span class="payment payment-xs payment-provider-visa me-auto"></span>
         等标识的信用卡或借记卡</p>
     <form action="/user/payment/purchase/stripe" method="post">
-        <div class="form-group form-group-label">    
+        <div class="form-group form-group-label">
             <label class="floating-label" for="amount-stripe-card">金额</label>
-            <input class="form-control maxwidth-edit" id="price" name="price" min="{$public_setting['stripe_min_recharge']}" max="{$public_setting['stripe_max_recharge']}" step="0.1" type="number" required="required">
+            <input class="form-control maxwidth-edit" id="price" name="price"
+                   min="{$public_setting['stripe_min_recharge']}" max="{$public_setting['stripe_max_recharge']}"
+                   step="0.1" type="number" required="required">
             <button class="btn btn-flat waves-attach" type="submit"><i class="icon ti ti-credit-card"></i></button>
         </div>
     </form>
-</div>
+</div>

+ 6 - 6
resources/views/tabler/header.tpl

@@ -2,15 +2,15 @@
 <html lang="zh">
 
 <head>
-    <meta charset="utf-8" />
+    <meta charset="utf-8"/>
     <meta name="robots" content="noindex">
-    <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
-    <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport" />
-    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
+    <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"/>
+    <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"/>
+    <meta http-equiv="X-UA-Compatible" content="ie=edge"/>
     <title>{$config['appName']}</title>
     <!-- CSS files -->
-    <link href="//{$config['jsdelivr_url']}/npm/@tabler/core@latest/dist/css/tabler.min.css" rel="stylesheet" />
-    <link href="//{$config['jsdelivr_url']}/npm/@tabler/icons-webfont@latest/tabler-icons.min.css" rel="stylesheet" />
+    <link href="//{$config['jsdelivr_url']}/npm/@tabler/core@latest/dist/css/tabler.min.css" rel="stylesheet"/>
+    <link href="//{$config['jsdelivr_url']}/npm/@tabler/icons-webfont@latest/tabler-icons.min.css" rel="stylesheet"/>
     <!-- JS files -->
     <script src="/assets/js/fuck.min.js"></script>
     <script src="//{$config['jsdelivr_url']}/npm/jquery/dist/jquery.min.js"></script>

+ 7 - 7
resources/views/tabler/index.tpl

@@ -5,13 +5,13 @@
     <meta name="robots" content="noindex">
     <title>{$config['appName']}</title>
     {if $user->isLogin}
-    <script>
-        window.location.href = "/user"
-    </script>
+        <script>
+            window.location.href = "/user"
+        </script>
     {else}
-    <script>
-        window.location.href = "/auth/login"
-    </script>
+        <script>
+            window.location.href = "/auth/login"
+        </script>
     {/if}
 </head>
-</html>
+</html>

+ 104 - 88
resources/views/tabler/live_chat.tpl

@@ -1,102 +1,118 @@
 {if $public_setting['live_chat'] === 'tawk'}
-<script type="text/javascript">
-    var Tawk_API=Tawk_API||{}, Tawk_LoadStart=new Date();
-    (function(){
-        var id = "{$public_setting['tawk_id']}";
-        var s1=document.createElement("script"),s0=document.getElementsByTagName("script")[0];
-        s1.async=true;
-        s1.src='https://embed.tawk.to/' + id + '/default';
-        s1.setAttribute('crossorigin','*');
-        s0.parentNode.insertBefore(s1,s0);
-    })();
-</script>
+    <script type="text/javascript">
+        var Tawk_API = Tawk_API ||{}, Tawk_LoadStart = new Date();
+        (function () {
+            var id = "{$public_setting['tawk_id']}";
+            var s1 = document.createElement("script"), s0 = document.getElementsByTagName("script")[0];
+            s1.async = true;
+            s1.src = 'https://embed.tawk.to/' + id + '/default';
+            s1.setAttribute('crossorigin', '*');
+            s0.parentNode.insertBefore(s1, s0);
+        })();
+    </script>
 {/if}
 
 {if $public_setting['live_chat'] === 'crisp'}
-<script type="text/javascript"> window.$crisp = [];
-    window.CRISP_WEBSITE_ID = "{$public_setting["crisp_id"]}";
-    (function () {
-        d = document;
-        s = d.createElement("script");
-        s.src = "https://client.crisp.chat/l.js";
-        s.async = 1;
-        d.getElementsByTagName("head")[0].appendChild(s);
-    })();
-    $crisp.push(["safe", true])
-    $crisp.push(["set","user:nickname", "{$user->user_name}"],
-              ["set","user:email","{$user->email}"],
-              ["set", "session:data",
+    <script type="text/javascript"> window.$crisp = [];
+        window.CRISP_WEBSITE_ID = "{$public_setting["crisp_id"]}";
+        (function () {
+            d = document;
+            s = d.createElement("script");
+            s.src = "https://client.crisp.chat/l.js";
+            s.async = 1;
+            d.getElementsByTagName("head")[0].appendChild(s);
+        })();
+        $crisp.push(["safe", true])
+        $crisp.push(["set", "user:nickname", "{$user->user_name}"],
+            ["set", "user:email", "{$user->email}"],
+            ["set", "session:data",
                 [[
-                  ["user_id","{$user->id}"],
-                  ["user_class","{$user->class}"],
-                  ["reg_email","{$user->email}"],
-                  ["class_expire_time","{$user->class_expire}"],
-                  ["available_traffic","{$user->unusedTraffic()}"],
-                  ["balance","{$user->money}"]
+                    ["user_id", "{$user->id}"],
+                    ["user_class", "{$user->class}"],
+                    ["reg_email", "{$user->email}"],
+                    ["class_expire_time", "{$user->class_expire}"],
+                    ["available_traffic", "{$user->unusedTraffic()}"],
+                    ["balance", "{$user->money}"]
                 ]]
-              ]);
-</script>
+            ]);
+    </script>
 {/if}
 
 {if $public_setting['live_chat'] === 'livechat'}
-<script>
-window.__lc = window.__lc || { };
-window.__lc.license = "{$public_setting['livechat_id']}";
-window.__lc.params = [
-    { name: '用户编号', value: '{$user->id}' },
-    { name: '用户类别', value: '{$user->class}' },
-    { name: '注册邮箱', value: '{$user->email}' },
-    { name: '等级时间', value: '{$user->class_expire}' },
-    { name: '剩余流量', value: '{$user->unusedTraffic()}' },
-    { name: '账户余额', value: '{$user->money}' }
-];
+    <script>
+        window.__lc = window.__lc ||
+        {
+        };
+        window.__lc.license = "{$public_setting['livechat_id']}";
+        window.__lc.params = [
+            {
+                name: '用户编号', value: '{$user->id}'
+            },
+            {
+                name: '用户类别', value: '{$user->class}'
+            },
+            {
+                name: '注册邮箱', value: '{$user->email}'
+            },
+            {
+                name: '等级时间', value: '{$user->class_expire}'
+            },
+            {
+                name: '剩余流量', value: '{$user->unusedTraffic()}'
+            },
+            {
+                name: '账户余额', value: '{$user->money}'
+            }
+        ];
 
-(function(n, t, c) {
-    function i(n) {
-        return e._h ? e._h.apply(null, n) : e._q.push(n)
-    }
-    var e = {
-        _q: [],
-        _h: null,
-        _v: "2.0",
-        on: function() {
-            i(["on", c.call(arguments)])
-        },
-        once: function() {
-            i(["once", c.call(arguments)])
-        },
-        off: function() {
-            i(["off", c.call(arguments)])
-        },
-        get: function() {
-            if (!e._h) throw new Error("[LiveChatWidget] You can't use getters before load.");
-            return i(["get", c.call(arguments)])
-        },
-        call: function() {
-            i(["call", c.call(arguments)])
-        },
-        init: function() {
-            var n = t.createElement("script");
-            n.async = !0,
-            n.type = "text/javascript",
-            n.src = "https://cdn.livechatinc.com/tracking.js",
-            t.head.appendChild(n)
-        }
-    }; ! n.__lc.asyncInit && e.init(),
-    n.LiveChatWidget = n.LiveChatWidget || e
-} (window, document, [].slice))
-</script>
+        (function (n, t, c) {
+            function i(n) {
+                return e._h ? e._h.apply(null, n) : e._q.push(n)
+            }
+
+            var e = {
+                _q: [],
+                _h: null,
+                _v: "2.0",
+                on: function () {
+                    i(["on", c.call(arguments)])
+                },
+                once: function () {
+                    i(["once", c.call(arguments)])
+                },
+                off: function () {
+                    i(["off", c.call(arguments)])
+                },
+                get: function () {
+                    if (!e._h) throw new Error("[LiveChatWidget] You can't use getters before load.");
+                    return i(["get", c.call(arguments)])
+                },
+                call: function () {
+                    i(["call", c.call(arguments)])
+                },
+                init: function () {
+                    var n = t.createElement("script");
+                    n.async = !0,
+                        n.type = "text/javascript",
+                        n.src = "https://cdn.livechatinc.com/tracking.js",
+                        t.head.appendChild(n)
+                }
+            };
+            !n.__lc.asyncInit && e.init(),
+                n.LiveChatWidget = n.LiveChatWidget || e
+        }(window, document, [].slice))
+    </script>
 {/if}
 
 {if $public_setting['live_chat'] === 'mylivechat'}
-<script type="text/javascript">
-    (() => {
-        var hccid = "{$public_setting['mylivechat_id']}";
-        var nt = document.createElement("script");
-        nt.async = true;
-        nt.src = "https://mylivechat.com/chatinline.aspx?hccid=" + hccid;
-        var ct = document.getElementsByTagName("script")[0];
-        ct.parentNode.insertBefore(nt, ct);
-    })();
-</script>
+    <script type="text/javascript">
+        (() => {
+            var hccid = "{$public_setting['mylivechat_id']}";
+            var nt = document.createElement("script");
+            nt.async = true;
+            nt.src = "https://mylivechat.com/chatinline.aspx?hccid=" + hccid;
+            var ct = document.getElementsByTagName("script")[0];
+            ct.parentNode.insertBefore(nt, ct);
+        })();
+    </script>
 {/if}

+ 82 - 81
resources/views/tabler/password/reset.tpl

@@ -1,103 +1,104 @@
 {include file='header.tpl'}
 
 <body class="border-top-wide border-primary d-flex flex-column">
-    <div class="page page-center">
-        <div class="container-tight my-auto">
-            <div class="text-center mb-4">
-                <a href="#" class="navbar-brand navbar-brand-autodark">
-                    <img src="/images/uim-logo-round_96x96.png" height="64" alt="SSPanel-UIM Logo">
-                </a>
-            </div>
-            <div class="card card-md">
-                <div class="card-body">
-                    <h2 class="card-title text-center mb-4">忘记密码</h2>
-                    <p class="text-secondary mb-4">
-                        我们将向你的注册邮箱发送一封邮件,邮件内容中包含一个可以重设密码的链接
-                    </p>
-                    <div class="mb-3">
-                        <label class="form-label">注册邮箱</label>
-                        <input id="email" type="email" class="form-control">
-                    </div>
-                    {if $public_setting['enable_reset_password_captcha']}
-                        {if $public_setting['captcha_provider'] === 'turnstile'}
+<div class="page page-center">
+    <div class="container-tight my-auto">
+        <div class="text-center mb-4">
+            <a href="#" class="navbar-brand navbar-brand-autodark">
+                <img src="/images/uim-logo-round_96x96.png" height="64" alt="SSPanel-UIM Logo">
+            </a>
+        </div>
+        <div class="card card-md">
+            <div class="card-body">
+                <h2 class="card-title text-center mb-4">忘记密码</h2>
+                <p class="text-secondary mb-4">
+                    我们将向你的注册邮箱发送一封邮件,邮件内容中包含一个可以重设密码的链接
+                </p>
+                <div class="mb-3">
+                    <label class="form-label">注册邮箱</label>
+                    <input id="email" type="email" class="form-control">
+                </div>
+                {if $public_setting['enable_reset_password_captcha']}
+                    {if $public_setting['captcha_provider'] === 'turnstile'}
                         <div class="mb-3">
                             <div class="input-group mb-3">
-                                <div id="cf-turnstile" class="cf-turnstile" data-sitekey="{$captcha['turnstile_sitekey']}" data-theme="light"></div>
+                                <div id="cf-turnstile" class="cf-turnstile"
+                                     data-sitekey="{$captcha['turnstile_sitekey']}" data-theme="light"></div>
                             </div>
                         </div>
-                        {/if}
-                        {if $public_setting['captcha_provider'] === 'geetest'}
+                    {/if}
+                    {if $public_setting['captcha_provider'] === 'geetest'}
                         <div class="mb-3">
                             <div class="input-group mb-3">
                                 <div id="geetest"></div>
                             </div>
                         </div>
-                        {/if}
                     {/if}
-                    <div class="form-footer">
-                        <button id="send" class="btn btn-primary w-100">
-                            <i class="ti ti-brand-telegram icon"></i>
-                            发送邮件
-                        </button>
-                    </div>
+                {/if}
+                <div class="form-footer">
+                    <button id="send" class="btn btn-primary w-100">
+                        <i class="ti ti-brand-telegram icon"></i>
+                        发送邮件
+                    </button>
                 </div>
             </div>
-            <div class="text-center text-secondary mt-3">
-                已有账户? <a href="/auth/login" tabindex="-1">点击登录</a>
-            </div>
+        </div>
+        <div class="text-center text-secondary mt-3">
+            已有账户? <a href="/auth/login" tabindex="-1">点击登录</a>
         </div>
     </div>
+</div>
 
-    <script>
-        $("#send").click(function() {
-            $.ajax({
-                type: 'POST',
-                url: '/password/reset',
-                dataType: "json",
-                data: {
-                    email: $('#email').val(),
-                    {if $public_setting['enable_reset_password_captcha']}
-                        {if $public_setting['captcha_provider'] === 'turnstile'}
-                            turnstile: $('input[name=cf-turnstile-response]').val(),
-                        {/if}
-                        {if $public_setting['captcha_provider'] === 'geetest'}
-                            geetest: geetest_result,
-                        {/if}
-                    {/if}
-                },
-                success: function(data) {
-                    if (data.ret === 1) {
-                        $('#success-message').text(data.msg);
-                        $('#success-dialog').modal('show');
-                    } else {
-                        $('#fail-message').text(data.msg);
-                        $('#fail-dialog').modal('show');
-                    }
+<script>
+    $("#send").click(function () {
+        $.ajax({
+            type: 'POST',
+            url: '/password/reset',
+            dataType: "json",
+            data: {
+                email: $('#email').val(),
+                {if $public_setting['enable_reset_password_captcha']}
+                {if $public_setting['captcha_provider'] === 'turnstile'}
+                turnstile: $('input[name=cf-turnstile-response]').val(),
+                {/if}
+                {if $public_setting['captcha_provider'] === 'geetest'}
+                geetest: geetest_result,
+                {/if}
+                {/if}
+            },
+            success: function (data) {
+                if (data.ret === 1) {
+                    $('#success-message').text(data.msg);
+                    $('#success-dialog').modal('show');
+                } else {
+                    $('#fail-message').text(data.msg);
+                    $('#fail-dialog').modal('show');
                 }
-            })
+            }
+        })
+    });
+</script>
+
+{if $public_setting['enable_reset_password_captcha']}
+{if $public_setting['captcha_provider'] === 'turnstile'}
+    <script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
+{/if}
+{if $public_setting['captcha_provider'] === 'geetest'}
+    <script src="https://static.geetest.com/v4/gt4.js"></script>
+    <script>
+        var geetest_result = '';
+        initGeetest4({
+            captchaId: '{$captcha['geetest_id']}',
+            product: 'float',
+            language: "zho",
+            riskType: 'slide'
+        }, function (geetest) {
+            geetest.appendTo("#geetest");
+            geetest.onSuccess(function () {
+                geetest_result = geetest.getValidate();
+            });
         });
     </script>
-
-    {if $public_setting['enable_reset_password_captcha']}
-        {if $public_setting['captcha_provider'] === 'turnstile'}
-            <script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
-        {/if}
-        {if $public_setting['captcha_provider'] === 'geetest'}
-            <script src="https://static.geetest.com/v4/gt4.js"></script>
-            <script>
-                var geetest_result = '';
-                initGeetest4({
-                    captchaId: '{$captcha['geetest_id']}',
-                    product: 'float',
-                    language: "zho",
-                    riskType:'slide'
-                }, function (geetest) {
-                    geetest.appendTo("#geetest");
-                    geetest.onSuccess(function() {
-                        geetest_result = geetest.getValidate();
-                    });
-                });
-            </script>
-        {/if}
-    {/if}
+{/if}
+{/if}
 {include file='footer.tpl'}

+ 50 - 50
resources/views/tabler/password/token.tpl

@@ -1,62 +1,62 @@
 {include file='header.tpl'}
 
 <body class="border-top-wide border-primary d-flex flex-column">
-    <div class="page page-center">
-        <div class="container-tight my-auto">
-            <div class="text-center mb-4">
-                <a href="#" class="navbar-brand navbar-brand-autodark">
-                    <img src="/images/uim-logo-round_96x96.png" height="64" alt="SSPanel-UIM Logo">
-                </a>
-            </div>
-            <div class="card card-md">
-                <div class="card-body">
-                    <h2 class="card-title text-center mb-4">设置新密码</h2>
-                    <p class="text-secondary mb-4">
-                        请在下方设置账户新的登录密码
-                    </p>
-                    <div class="mb-3">
-                        <label class="form-label">新密码</label>
-                        <input id="password" type="password" class="form-control" placeholder="请输入新密码">
-                    </div>
-                    <div class="mb-3">
-                        <label class="form-label">再次输入新密码</label>
-                        <input id="repasswd" type="password" class="form-control" placeholder="请再次输入新密码">
-                    </div>
-                    <div class="form-footer">
-                        <button id="reset" class="btn btn-primary w-100">
+<div class="page page-center">
+    <div class="container-tight my-auto">
+        <div class="text-center mb-4">
+            <a href="#" class="navbar-brand navbar-brand-autodark">
+                <img src="/images/uim-logo-round_96x96.png" height="64" alt="SSPanel-UIM Logo">
+            </a>
+        </div>
+        <div class="card card-md">
+            <div class="card-body">
+                <h2 class="card-title text-center mb-4">设置新密码</h2>
+                <p class="text-secondary mb-4">
+                    请在下方设置账户新的登录密码
+                </p>
+                <div class="mb-3">
+                    <label class="form-label">新密码</label>
+                    <input id="password" type="password" class="form-control" placeholder="请输入新密码">
+                </div>
+                <div class="mb-3">
+                    <label class="form-label">再次输入新密码</label>
+                    <input id="repasswd" type="password" class="form-control" placeholder="请再次输入新密码">
+                </div>
+                <div class="form-footer">
+                    <button id="reset" class="btn btn-primary w-100">
                         <i class="ti ti-key icon"></i>
-                            重置
-                        </button>
-                    </div>
+                        重置
+                    </button>
                 </div>
             </div>
-            <div class="text-center text-secondary mt-3">
-                已有账户? <a href="/auth/login" tabindex="-1">点击登录</a>
-            </div>
+        </div>
+        <div class="text-center text-secondary mt-3">
+            已有账户? <a href="/auth/login" tabindex="-1">点击登录</a>
         </div>
     </div>
+</div>
 
-    <script>
-        $("#reset").click(function() {
-            $.ajax({
-                type: 'POST',
-                url: location.pathname,
-                dataType: "json",
-                data: {
-                    password: $('#password').val(),
-                    repasswd: $('#repasswd').val(),
-                },
-                success: function(data) {
-                    if (data.ret === 1) {
-                        $('#success-message').text(data.msg);
-                        $('#success-dialog').modal('show');
-                    } else {
-                        $('#fail-message').text(data.msg);
-                        $('#fail-dialog').modal('show');
-                    }
+<script>
+    $("#reset").click(function () {
+        $.ajax({
+            type: 'POST',
+            url: location.pathname,
+            dataType: "json",
+            data: {
+                password: $('#password').val(),
+                repasswd: $('#repasswd').val(),
+            },
+            success: function (data) {
+                if (data.ret === 1) {
+                    $('#success-message').text(data.msg);
+                    $('#success-dialog').modal('show');
+                } else {
+                    $('#fail-message').text(data.msg);
+                    $('#fail-dialog').modal('show');
                 }
-            })
-        });
-    </script>
+            }
+        })
+    });
+</script>
 
 {include file='footer.tpl'}

+ 13 - 13
resources/views/tabler/user/announcement.tpl

@@ -23,20 +23,20 @@
                         <div class="table-responsive">
                             <table class="table table-vcenter card-table">
                                 <thead>
-                                    <tr>
-                                        <th>公告ID</th>
-                                        <th>发布日期</th>
-                                        <th>公告内容</th>
-                                    </tr>
+                                <tr>
+                                    <th>公告ID</th>
+                                    <th>发布日期</th>
+                                    <th>公告内容</th>
+                                </tr>
                                 </thead>
                                 <tbody>
-                                    {foreach $anns as $ann}
-                                        <tr>
-                                            <td>{$ann->id}</td>
-                                            <td>{$ann->date}</td>
-                                            <td>{$ann->content}</td>
-                                        </tr>
-                                    {/foreach}
+                                {foreach $anns as $ann}
+                                    <tr>
+                                        <td>{$ann->id}</td>
+                                        <td>{$ann->date}</td>
+                                        <td>{$ann->content}</td>
+                                    </tr>
+                                {/foreach}
                                 </tbody>
                             </table>
                         </div>
@@ -46,4 +46,4 @@
         </div>
     </div>
 
-{include file='user/footer.tpl'}
+{include file='user/footer.tpl'}

+ 6 - 6
resources/views/tabler/user/banned.tpl

@@ -25,11 +25,11 @@
                                 <i class="ti ti-circle-x icon mb-2 text-danger icon-lg" style="font-size:3.5rem;"></i>
                             </div>
                             {if $banned_reason === 'DetectBan'}
-                            <p class="empty-title">审计封禁</p>
-                            <p class="empty-subtitle text-secondary">你的账户因为触发审计规则而被系统自动封禁</p>
+                                <p class="empty-title">审计封禁</p>
+                                <p class="empty-subtitle text-secondary">你的账户因为触发审计规则而被系统自动封禁</p>
                             {else}
-                            <p class="empty-title">以下是你被封禁的理由</p>
-                            <p class="empty-subtitle text-secondary">{$banned_reason}</p>
+                                <p class="empty-title">以下是你被封禁的理由</p>
+                                <p class="empty-subtitle text-secondary">{$banned_reason}</p>
                             {/if}
                         </div>
                     </div>
@@ -37,5 +37,5 @@
             </div>
         </div>
     </div>
-    
-{include file='user/footer.tpl'}
+
+{include file='user/footer.tpl'}

+ 11 - 11
resources/views/tabler/user/detect/index.tpl

@@ -24,16 +24,16 @@
                         <div class="table-responsive">
                             <table class="table table-vcenter card-table">
                                 <thead>
-                                    <tr>
-                                        <th>ID</th>
-                                        <th>名称</th>
-                                        <th>描述</th>
-                                        <th>正则表达式</th>
-                                        <th>类型</th>
-                                    </tr>
+                                <tr>
+                                    <th>ID</th>
+                                    <th>名称</th>
+                                    <th>描述</th>
+                                    <th>正则表达式</th>
+                                    <th>类型</th>
+                                </tr>
                                 </thead>
                                 <tbody>
-                                    {foreach $rules as $rule}
+                                {foreach $rules as $rule}
                                     <tr>
                                         <td>#{$rule->id}</td>
                                         <td>{$rule->name}</td>
@@ -46,7 +46,7 @@
                                             <td>数据包 hex 匹配</td>
                                         {/if}
                                     </tr>
-                                    {/foreach}
+                                {/foreach}
                                 </tbody>
                             </table>
                         </div>
@@ -55,5 +55,5 @@
             </div>
         </div>
     </div>
-    
-{include file='user/footer.tpl'}
+
+    {include file='user/footer.tpl'}

+ 12 - 12
resources/views/tabler/user/detect/log.tpl

@@ -23,17 +23,17 @@
                         <div class="table-responsive">
                             <table class="table table-vcenter card-table">
                                 <thead>
-                                    <tr>
-                                        <th>事件ID</th>
-                                        <th>节点ID</th>
-                                        <th>节点名称</th>
-                                        <th>规则ID</th>
-                                        <th>名称</th>
-                                        <th>描述</th>
-                                        <th>正则表达式</th>
-                                        <th>类型</th>
-                                        <th>时间</th>
-                                    </tr>
+                                <tr>
+                                    <th>事件ID</th>
+                                    <th>节点ID</th>
+                                    <th>节点名称</th>
+                                    <th>规则ID</th>
+                                    <th>名称</th>
+                                    <th>描述</th>
+                                    <th>正则表达式</th>
+                                    <th>类型</th>
+                                    <th>时间</th>
+                                </tr>
                                 </thead>
                                 <tbody>
                                 {foreach $logs as $log}
@@ -58,4 +58,4 @@
         </div>
     </div>
 
-{include file='user/footer.tpl'}
+    {include file='user/footer.tpl'}

+ 13 - 13
resources/views/tabler/user/docs/index.tpl

@@ -25,21 +25,21 @@
                         </div>
                         <div class="list-group list-group-flush list-group-hoverable">
                             {foreach $docs as $doc}
-                            <div class="list-group-item">
-                                <div class="row align-items-center">
-                                    <div class="col text-truncate">
-                                        <div class="text-reset d-block">{$doc->title}</div>
-                                        <div class="d-block text-secondary text-truncate mt-n1">
-                                            {$doc->date}
+                                <div class="list-group-item">
+                                    <div class="row align-items-center">
+                                        <div class="col text-truncate">
+                                            <div class="text-reset d-block">{$doc->title}</div>
+                                            <div class="d-block text-secondary text-truncate mt-n1">
+                                                {$doc->date}
+                                            </div>
+                                        </div>
+                                        <div class="col-auto">
+                                            <a class="btn btn-blue" href="/user/docs/{$doc->id}/view">
+                                                查看
+                                            </a>
                                         </div>
-                                    </div>
-                                    <div class="col-auto">
-                                        <a class="btn btn-blue" href="/user/docs/{$doc->id}/view">
-                                            查看
-                                        </a>
                                     </div>
                                 </div>
-                            </div>
                             {/foreach}
                         </div>
                     </div>
@@ -48,4 +48,4 @@
         </div>
     </div>
 
-{include file='user/footer.tpl'}
+{include file='user/footer.tpl'}

+ 205 - 182
resources/views/tabler/user/edit.tpl

@@ -23,28 +23,28 @@
                         <ul class="nav nav-tabs nav-fill" data-bs-toggle="tabs" role="tablist">
                             <li class="nav-item" role="presentation">
                                 <a href="#personal_information" class="nav-link active" data-bs-toggle="tab"
-                                    aria-selected="true" role="tab">
+                                   aria-selected="true" role="tab">
                                     <i class="ti ti-chart-candle icon"></i>&nbsp;
                                     资料
                                 </a>
                             </li>
                             <li class="nav-item" role="presentation">
                                 <a href="#login_security" class="nav-link" data-bs-toggle="tab" aria-selected="true"
-                                    role="tab">
+                                   role="tab">
                                     <i class="ti ti-shield-lock icon"></i>&nbsp;
                                     登录
                                 </a>
                             </li>
                             <li class="nav-item" role="presentation">
                                 <a href="#use_safety" class="nav-link" data-bs-toggle="tab" aria-selected="false"
-                                    tabindex="-1" role="tab">
+                                   tabindex="-1" role="tab">
                                     <i class="ti ti-brand-telegram icon"></i>&nbsp;
                                     使用
                                 </a>
                             </li>
                             <li class="nav-item" role="presentation">
                                 <a href="#other_settings" class="nav-link" data-bs-toggle="tab" aria-selected="false"
-                                    tabindex="-1" role="tab">
+                                   tabindex="-1" role="tab">
                                     <i class="ti ti-settings icon"></i>&nbsp;
                                     其他
                                 </a>
@@ -61,27 +61,31 @@
                                                     <p>当前邮箱:<code>{$user->email}</code></p>
                                                     <div class="mb-3">
                                                         <input id="new-email" type="email" class="form-control"
-                                                            placeholder="新邮箱" {if ! $config['enable_change_email']}disabled=""{/if}>
+                                                               placeholder="新邮箱"
+                                                               {if ! $config['enable_change_email']}disabled=""{/if}>
                                                     </div>
                                                     {if $public_setting['reg_email_verify'] && $config['enable_change_email']}
-                                                    <div class="mb-3">
-                                                        <input id="email-code" type="text" class="form-control"
-                                                            placeholder="验证码">
-                                                    </div>
+                                                        <div class="mb-3">
+                                                            <input id="email-code" type="text" class="form-control"
+                                                                   placeholder="验证码">
+                                                        </div>
                                                     {/if}
                                                 </div>
                                                 <div class="card-footer">
                                                     <div class="d-flex">
                                                         {if $public_setting['reg_email_verify'] && $config['enable_change_email']}
-                                                        <a id="email-verify" class="btn btn-link">获取验证码</a>
-                                                        <button id="modify-email"
-                                                            class="btn btn-primary ms-auto">修改</button>
+                                                            <a id="email-verify" class="btn btn-link">获取验证码</a>
+                                                            <button id="modify-email"
+                                                                    class="btn btn-primary ms-auto">修改
+                                                            </button>
                                                         {elseif $config['enable_change_email']}
-                                                        <button id="modify-email"
-                                                            class="btn btn-primary ms-auto">修改</button>
+                                                            <button id="modify-email"
+                                                                    class="btn btn-primary ms-auto">修改
+                                                            </button>
                                                         {else}
-                                                        <button id="modify-email" class="btn btn-primary ms-auto"
-                                                            disabled>不允许修改</button>
+                                                            <button id="modify-email" class="btn btn-primary ms-auto"
+                                                                    disabled>不允许修改
+                                                            </button>
                                                         {/if}
                                                     </div>
                                                 </div>
@@ -112,22 +116,27 @@
                                                         <select id="imtype" class="form-select"
                                                                 {if $user->im_type !== 0 && $user->im_value !== ''}disabled=""{/if}>
                                                             <option value="0" {if $user->im_type === 0}selected{/if}>
-                                                                未绑定</option>
+                                                                未绑定
+                                                            </option>
                                                             <option value="1" {if $user->im_type === 1}selected{/if}>
-                                                                Slack</option>
+                                                                Slack
+                                                            </option>
                                                             <option value="2" {if $user->im_type === 2}selected{/if}>
-                                                                Discord</option>
+                                                                Discord
+                                                            </option>
                                                             <option value="4" {if $user->im_type === 4}selected{/if}>
-                                                                Telegram</option>
+                                                                Telegram
+                                                            </option>
                                                         </select>
                                                     </div>
                                                     <div class="mb-3">
                                                         <input id="imvalue" type="text" class="form-control"
-                                                            disabled="" value="{$user->im_value}">
+                                                               disabled="" value="{$user->im_value}">
                                                     </div>
                                                 </div>
                                                 <div class="card-footer">
-                                                    <div class="d-flex btn-list justify-content-end" id="oauth-provider"></div>
+                                                    <div class="d-flex btn-list justify-content-end"
+                                                         id="oauth-provider"></div>
                                                 </div>
                                             </div>
                                         </div>
@@ -136,23 +145,23 @@
                                                 <div class="card-body">
                                                     <h3 class="card-title">解绑 IM 账户</h3>
                                                     {if $user->im_type === 0}
-                                                    <p>你的账户当前没有绑定任何 IM 服务</p>
+                                                        <p>你的账户当前没有绑定任何 IM 服务</p>
                                                     {else}
-                                                    <p>
-                                                        当前绑定的 IM 服务:{$user->imType()}
-                                                        <br>
-                                                        账户 ID:<code>{$user->im_value}</code>
-                                                    </p>
+                                                        <p>
+                                                            当前绑定的 IM 服务:{$user->imType()}
+                                                            <br>
+                                                            账户 ID:<code>{$user->im_value}</code>
+                                                        </p>
                                                     {/if}
                                                 </div>
                                                 {if $user->im_type !== 0}
-                                                <div class="card-footer">
-                                                    <div class="d-flex">
-                                                        <button id="unbind-im" class="btn btn-red ms-auto">
-                                                            解绑
-                                                        </button>
+                                                    <div class="card-footer">
+                                                        <div class="d-flex">
+                                                            <button id="unbind-im" class="btn btn-red ms-auto">
+                                                                解绑
+                                                            </button>
+                                                        </div>
                                                     </div>
-                                                </div>
                                                 {/if}
                                             </div>
                                         </div>
@@ -168,12 +177,14 @@
                                                         <div class="col-sm-6 col-md-6">
                                                             <i class="ti ti-brand-apple"></i>
                                                             <a target="view_window"
-                                                                href="https://apps.apple.com/us/app/google-authenticator/id388497605">iOS 客户端
+                                                               href="https://apps.apple.com/us/app/google-authenticator/id388497605">iOS
+                                                                客户端
                                                             </a>
                                                             &nbsp;&nbsp;&nbsp;
                                                             <i class="ti ti-brand-android"></i>
                                                             <a target="view_window"
-                                                                href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2">Android 客户端
+                                                               href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2">Android
+                                                                客户端
                                                             </a>
                                                         </div>
                                                     </div>
@@ -187,14 +198,15 @@
                                                                 <select id="ga-enable" class="form-select">
                                                                     <option value="0">不使用</option>
                                                                     <option value="1"
-                                                                        {if $user->ga_enable === '1'}selected{/if}>
+                                                                            {if $user->ga_enable === '1'}selected{/if}>
                                                                         使用两步认证登录
                                                                     </option>
                                                                 </select>
                                                             </div>
                                                             <div class="mb-3">
                                                                 <input id="2fa-test-code" type="text"
-                                                                    class="form-control" placeholder="测试两步认证验证码">
+                                                                       class="form-control"
+                                                                       placeholder="测试两步认证验证码">
                                                             </div>
                                                             <div class="col-md-12">
                                                                 <p>密钥:<code>{$user->ga_token}</code></p>
@@ -218,28 +230,28 @@
                                                     <div class="mb-3">
                                                         <form>
                                                             <input id="password" type="password" class="form-control"
-                                                                placeholder="当前登录密码" autocomplete="off">
+                                                                   placeholder="当前登录密码" autocomplete="off">
                                                         </form>
                                                     </div>
                                                     <div class="mb-3">
                                                         <form>
                                                             <input id="new-password" type="password"
-                                                                class="form-control" placeholder="输入新密码"
-                                                                autocomplete="off">
+                                                                   class="form-control" placeholder="输入新密码"
+                                                                   autocomplete="off">
                                                         </form>
                                                     </div>
                                                     <div class="mb-3">
                                                         <form>
                                                             <input id="again-new-password" type="password"
-                                                                class="form-control" placeholder="再次输入新密码"
-                                                                autocomplete="off">
+                                                                   class="form-control" placeholder="再次输入新密码"
+                                                                   autocomplete="off">
                                                         </form>
                                                     </div>
                                                 </div>
                                                 <div class="card-footer">
                                                     <div class="d-flex">
                                                         <a id="modify-login-passwd"
-                                                            class="btn btn-primary ms-auto">修改</a>
+                                                           class="btn btn-primary ms-auto">修改</a>
                                                     </div>
                                                 </div>
                                             </div>
@@ -252,21 +264,23 @@
                                             <div class="card">
                                                 <div class="card-body">
                                                     <h3 class="card-title">更换加密方式</h3>
-                                                    <p>不同的客户端支持的加密方式可能会有所不同,请参考客户端支持列表进行设置</p>
+                                                    <p>
+                                                        不同的客户端支持的加密方式可能会有所不同,请参考客户端支持列表进行设置</p>
                                                     <div class="mb-3">
                                                         <select id="user-method" class="form-select">
                                                             {foreach $methods as $method}
-                                                            <option value="{$method}"
-                                                                {if $user->method === $method}selected{/if}>
-                                                                {$method}
-                                                            </option>
+                                                                <option value="{$method}"
+                                                                        {if $user->method === $method}selected{/if}>
+                                                                    {$method}
+                                                                </option>
                                                             {/foreach}
                                                         </select>
                                                     </div>
                                                 </div>
                                                 <div class="card-footer">
                                                     <div class="d-flex">
-                                                        <a id="modify-user-method" class="btn btn-primary ms-auto">修改</a>
+                                                        <a id="modify-user-method"
+                                                           class="btn btn-primary ms-auto">修改</a>
                                                     </div>
                                                 </div>
                                             </div>
@@ -281,7 +295,7 @@
                                                 <div class="card-footer">
                                                     <div class="d-flex">
                                                         <a id="reset-sub-url"
-                                                            class="btn btn-primary ms-auto bg-red">重置</a>
+                                                           class="btn btn-primary ms-auto bg-red">重置</a>
                                                     </div>
                                                 </div>
                                             </div>
@@ -296,7 +310,8 @@
                                                 </div>
                                                 <div class="card-footer">
                                                     <div class="d-flex">
-                                                        <a id="reset-passwd" class="btn btn-primary ms-auto bg-red">重置</a>
+                                                        <a id="reset-passwd"
+                                                           class="btn btn-primary ms-auto bg-red">重置</a>
                                                     </div>
                                                 </div>
                                             </div>
@@ -311,13 +326,16 @@
                                                     <h3 class="card-title">每日流量报告</h3>
                                                     <div class="mb-3">
                                                         <select id="daily-report" class="form-select">
-                                                            <option value="0" {if $user->daily_mail_enable === 0}selected{/if}>
+                                                            <option value="0"
+                                                                    {if $user->daily_mail_enable === 0}selected{/if}>
                                                                 不接收
                                                             </option>
-                                                            <option value="1" {if $user->daily_mail_enable === 1}selected{/if}>
+                                                            <option value="1"
+                                                                    {if $user->daily_mail_enable === 1}selected{/if}>
                                                                 邮件接收
                                                             </option>
-                                                            <option value="2" {if $user->daily_mail_enable === 2}selected{/if}>
+                                                            <option value="2"
+                                                                    {if $user->daily_mail_enable === 2}selected{/if}>
                                                                 IM 接收
                                                             </option>
                                                         </select>
@@ -326,7 +344,7 @@
                                                 <div class="card-footer">
                                                     <div class="d-flex">
                                                         <a id="modify-daily-report"
-                                                            class="btn btn-primary ms-auto">修改</a>
+                                                           class="btn btn-primary ms-auto">修改</a>
                                                     </div>
                                                 </div>
                                             </div>
@@ -338,10 +356,12 @@
                                                     <p>当 IM 未绑定时站点依然会向账户邮箱发送通知信息</p>
                                                     <div class="mb-3">
                                                         <select id="contact-method" class="form-select">
-                                                            <option value="1" {if $user->contact_method === 1}selected{/if}>
+                                                            <option value="1"
+                                                                    {if $user->contact_method === 1}selected{/if}>
                                                                 邮件
                                                             </option>
-                                                            <option value="2" {if $user->contact_method === 2}selected{/if}>
+                                                            <option value="2"
+                                                                    {if $user->contact_method === 2}selected{/if}>
                                                                 IM
                                                             </option>
                                                         </select>
@@ -363,7 +383,7 @@
                                                         <select id="user-theme" class="form-select">
                                                             {foreach $themes as $theme}
                                                                 <option value="{$theme}"
-                                                                    {if $user->theme === $theme}selected{/if}>{$theme}
+                                                                        {if $user->theme === $theme}selected{/if}>{$theme}
                                                                 </option>
                                                             {/foreach}
                                                         </select>
@@ -371,31 +391,32 @@
                                                 </div>
                                                 <div class="card-footer">
                                                     <div class="d-flex">
-                                                        <a id="modify-user-theme" class="btn btn-primary ms-auto">修改</a>
+                                                        <a id="modify-user-theme"
+                                                           class="btn btn-primary ms-auto">修改</a>
                                                     </div>
                                                 </div>
                                             </div>
                                         </div>
                                         {if $config['enable_kill']}
-                                        <div class="col-sm-12 col-md-6">
-                                            <div class="card">
-                                                <div class="card-stamp">
-                                                    <div class="card-stamp-icon bg-red">
-                                                        <i class="ti ti-circle-x"></i>
+                                            <div class="col-sm-12 col-md-6">
+                                                <div class="card">
+                                                    <div class="card-stamp">
+                                                        <div class="card-stamp-icon bg-red">
+                                                            <i class="ti ti-circle-x"></i>
+                                                        </div>
+                                                    </div>
+                                                    <div class="card-body">
+                                                        <h3 class="card-title">删除账户数据</h3>
+                                                    </div>
+                                                    <div class="card-footer">
+                                                        <a href="#" class="btn btn-red" data-bs-toggle="modal"
+                                                           data-bs-target="#destroy-account">
+                                                            <i class="ti ti-trash icon"></i>
+                                                            确认删除
+                                                        </a>
                                                     </div>
-                                                </div>
-                                                <div class="card-body">
-                                                    <h3 class="card-title">删除账户数据</h3>
-                                                </div>
-                                                <div class="card-footer">
-                                                    <a href="#" class="btn btn-red" data-bs-toggle="modal"
-                                                        data-bs-target="#destroy-account">
-                                                        <i class="ti ti-trash icon"></i>
-                                                        确认删除
-                                                    </a>
                                                 </div>
                                             </div>
-                                        </div>
                                         {/if}
                                     </div>
                                 </div>
@@ -408,91 +429,93 @@
     </div>
 
     {if $config['enable_kill']}
-    <div class="modal modal-blur fade" id="destroy-account" tabindex="-1" role="dialog" aria-hidden="true">
-        <div class="modal-dialog modal-sm modal-dialog-centered" role="document">
-            <div class="modal-content">
-                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
-                <div class="modal-status bg-danger"></div>
-                <div class="modal-body text-center py-4">
-                    <i class="ti ti-alert-circle icon mb-2 text-danger icon-lg" style="font-size:3.5rem;"></i>
-                    <h3>删除确认</h3>
-                    <div class="text-secondary">请确认是否真的要删除你的账户,此操作无法撤销,你的所有账户数据将会被从服务器上彻底删除</div>
-                    <div class="py-3">
-                        <form>
-                            <input id="confirm-passwd" type="password" class="form-control" placeholder="输入登录密码"
-                                autocomplete="off">
-                        </form>
+        <div class="modal modal-blur fade" id="destroy-account" tabindex="-1" role="dialog" aria-hidden="true">
+            <div class="modal-dialog modal-sm modal-dialog-centered" role="document">
+                <div class="modal-content">
+                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
+                    <div class="modal-status bg-danger"></div>
+                    <div class="modal-body text-center py-4">
+                        <i class="ti ti-alert-circle icon mb-2 text-danger icon-lg" style="font-size:3.5rem;"></i>
+                        <h3>删除确认</h3>
+                        <div class="text-secondary">
+                            请确认是否真的要删除你的账户,此操作无法撤销,你的所有账户数据将会被从服务器上彻底删除
+                        </div>
+                        <div class="py-3">
+                            <form>
+                                <input id="confirm-passwd" type="password" class="form-control"
+                                       placeholder="输入登录密码"
+                                       autocomplete="off">
+                            </form>
+                        </div>
                     </div>
-                </div>
-                <div class="modal-footer">
-                    <div class="w-100">
-                        <div class="row">
-                            <div class="col">
-                                <a href="#" class="btn w-100" data-bs-dismiss="modal">
-                                    取消
-                                </a>
-                            </div>
-                            <div class="col">
-                                <a href="#" id="confirm-destroy" class="btn btn-danger w-100" data-bs-dismiss="modal">
-                                    确认
-                                </a>
+                    <div class="modal-footer">
+                        <div class="w-100">
+                            <div class="row">
+                                <div class="col">
+                                    <a href="#" class="btn w-100" data-bs-dismiss="modal">
+                                        取消
+                                    </a>
+                                </div>
+                                <div class="col">
+                                    <a href="#" id="confirm-destroy" class="btn btn-danger w-100"
+                                       data-bs-dismiss="modal">
+                                        确认
+                                    </a>
+                                </div>
                             </div>
                         </div>
                     </div>
                 </div>
             </div>
         </div>
-    </div>
-
-    <div class="modal modal-blur fade" id="destroy-account-success" tabindex="-1" role="dialog" aria-hidden="true">
-        <div class="modal-dialog modal-sm modal-dialog-centered" role="document">
-            <div class="modal-content">
-                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
-                <div class="modal-status bg-success"></div>
-                <div class="modal-body text-center py-4">
-                    <i class="ti ti-circle-check icon mb-2 text-green icon-lg" style="font-size:3.5rem;"></i>
-                    <h3>删除成功</h3>
-                    <p id="success-message" class="text-secondary">删除成功</p>
-                </div>
-                <div class="modal-footer">
-                    <div class="w-100">
-                        <div class="row">
-                            <div class="col">
-                                <a href="#" class="btn w-100" data-bs-dismiss="modal">
-                                    好
-                                </a>
+        <div class="modal modal-blur fade" id="destroy-account-success" tabindex="-1" role="dialog" aria-hidden="true">
+            <div class="modal-dialog modal-sm modal-dialog-centered" role="document">
+                <div class="modal-content">
+                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
+                    <div class="modal-status bg-success"></div>
+                    <div class="modal-body text-center py-4">
+                        <i class="ti ti-circle-check icon mb-2 text-green icon-lg" style="font-size:3.5rem;"></i>
+                        <h3>删除成功</h3>
+                        <p id="success-message" class="text-secondary">删除成功</p>
+                    </div>
+                    <div class="modal-footer">
+                        <div class="w-100">
+                            <div class="row">
+                                <div class="col">
+                                    <a href="#" class="btn w-100" data-bs-dismiss="modal">
+                                        好
+                                    </a>
+                                </div>
                             </div>
                         </div>
                     </div>
                 </div>
             </div>
         </div>
-    </div>
-
-    <div class="modal modal-blur fade" id="destroy-account-fail" tabindex="-1" role="dialog" aria-hidden="true">
-        <div class="modal-dialog modal-sm modal-dialog-centered" role="document">
-            <div class="modal-content">
-                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
-                <div class="modal-status bg-danger"></div>
-                <div class="modal-body text-center py-4">
-                    <i class="ti ti-circle-x icon mb-2 text-danger icon-lg" style="font-size:3.5rem;"></i>
-                    <h3>删除失败</h3>
-                    <p id="error-message" class="text-secondary">删除失败</p>
-                </div>
-                <div class="modal-footer">
-                    <div class="w-100">
-                        <div class="row">
-                            <div class="col">
-                                <a href="#" class="btn btn-danger w-100" data-bs-dismiss="modal">
-                                    确认
-                                </a>
+        <div class="modal modal-blur fade" id="destroy-account-fail" tabindex="-1" role="dialog" aria-hidden="true">
+            <div class="modal-dialog modal-sm modal-dialog-centered" role="document">
+                <div class="modal-content">
+                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
+                    <div class="modal-status bg-danger"></div>
+                    <div class="modal-body text-center py-4">
+                        <i class="ti ti-circle-x icon mb-2 text-danger icon-lg" style="font-size:3.5rem;"></i>
+                        <h3>删除失败</h3>
+                        <p id="error-message" class="text-secondary">删除失败</p>
+                    </div>
+                    <div class="modal-footer">
+                        <div class="w-100">
+                            <div class="row">
+                                <div class="col">
+                                    <a href="#" class="btn btn-danger w-100" data-bs-dismiss="modal">
+                                        确认
+                                    </a>
+                                </div>
                             </div>
                         </div>
                     </div>
                 </div>
             </div>
         </div>
-    </div>
     {/if}
 
     <script>
@@ -506,23 +529,23 @@
         });
 
         var clipboard = new ClipboardJS('.copy');
-        clipboard.on('success', function(e) {
+        clipboard.on('success', function (e) {
             $('#success-noreload-message').text('已复制到剪切板');
             $('#success-noreload-dialog').modal('show');
         });
 
-        $("#modify-email").click(function() {
+        $("#modify-email").click(function () {
             $.ajax({
                 type: "POST",
                 url: "/user/email",
                 dataType: "json",
                 data: {
                     {if $public_setting['reg_email_verify']}
-                        emailcode: $('#email-code').val(),
+                    emailcode: $('#email-code').val(),
                     {/if}
                     newemail: $('#new-email').val()
                 },
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -534,7 +557,7 @@
             })
         });
 
-        $("#email-verify").click(function() {
+        $("#email-verify").click(function () {
             $.ajax({
                 type: "POST",
                 url: "/user/send",
@@ -542,7 +565,7 @@
                 data: {
                     email: $('#new-email').val()
                 },
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -554,7 +577,7 @@
             })
         });
 
-        $("#modify-username").click(function() {
+        $("#modify-username").click(function () {
             $.ajax({
                 type: "POST",
                 url: "/user/username",
@@ -562,7 +585,7 @@
                 data: {
                     newusername: $('#new-nickname').val()
                 },
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -574,7 +597,7 @@
             })
         });
 
-        $("#modify-user-method").click(function() {
+        $("#modify-user-method").click(function () {
             $.ajax({
                 type: "POST",
                 url: "/user/method",
@@ -582,7 +605,7 @@
                 data: {
                     method: $('#user-method').val()
                 },
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -594,12 +617,12 @@
             })
         });
 
-        $("#reset-sub-url").click(function() {
+        $("#reset-sub-url").click(function () {
             $.ajax({
                 type: "POST",
                 url: "/user/url_reset",
                 dataType: "json",
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -611,12 +634,12 @@
             })
         });
 
-        $("#reset-passwd").click(function() {
+        $("#reset-passwd").click(function () {
             $.ajax({
                 type: "POST",
                 url: "/user/passwd_reset",
                 dataType: "json",
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -628,7 +651,7 @@
             })
         });
 
-        $("#modify-login-passwd").click(function() {
+        $("#modify-login-passwd").click(function () {
             $.ajax({
                 type: "POST",
                 url: "/user/password",
@@ -638,7 +661,7 @@
                     repwd: $('#again-new-password').val(),
                     oldpwd: $('#password').val()
                 },
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -650,12 +673,12 @@
             })
         });
 
-        $("#unbind-im").click(function() {
+        $("#unbind-im").click(function () {
             $.ajax({
                 type: "POST",
                 url: "/user/unbind_im",
                 dataType: "json",
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -667,12 +690,12 @@
             })
         });
 
-        $("#reset-2fa").click(function() {
+        $("#reset-2fa").click(function () {
             $.ajax({
                 type: "POST",
                 url: "/user/ga_reset",
                 dataType: "json",
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -684,7 +707,7 @@
             })
         });
 
-        $("#test-2fa").click(function() {
+        $("#test-2fa").click(function () {
             $.ajax({
                 type: "POST",
                 url: "/user/ga_check",
@@ -692,7 +715,7 @@
                 data: {
                     code: $('#2fa-test-code').val()
                 },
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -704,7 +727,7 @@
             })
         });
 
-        $("#save-2fa").click(function() {
+        $("#save-2fa").click(function () {
             $.ajax({
                 type: "POST",
                 url: "/user/ga_set",
@@ -712,7 +735,7 @@
                 data: {
                     enable: $('#ga-enable').val()
                 },
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -724,7 +747,7 @@
             })
         });
 
-        $("#modify-daily-report").click(function() {
+        $("#modify-daily-report").click(function () {
             $.ajax({
                 type: "POST",
                 url: "/user/daily_mail",
@@ -732,7 +755,7 @@
                 data: {
                     mail: $('#daily-report').val()
                 },
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -744,7 +767,7 @@
             })
         });
 
-        $("#modify-contact-method").click(function() {
+        $("#modify-contact-method").click(function () {
             $.ajax({
                 type: "POST",
                 url: "/user/contact_method",
@@ -752,7 +775,7 @@
                 data: {
                     contact: $('#contact-method').val()
                 },
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -764,7 +787,7 @@
             })
         });
 
-        $("#modify-user-theme").click(function() {
+        $("#modify-user-theme").click(function () {
             $.ajax({
                 type: "POST",
                 url: "/user/theme",
@@ -772,7 +795,7 @@
                 data: {
                     theme: $('#user-theme').val()
                 },
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -786,7 +809,7 @@
         });
 
         {if $config['enable_kill']}
-        $("#confirm-destroy").click(function() {
+        $("#confirm-destroy").click(function () {
             $.ajax({
                 type: "POST",
                 url: "/user/kill",
@@ -794,7 +817,7 @@
                 data: {
                     passwd: $('#confirm-passwd').val(),
                 },
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#destroy-account-success').modal('show');
@@ -808,7 +831,7 @@
         {/if}
 
         {if $user->im_type === 0 && $user->im_value === ''}
-        $("#imtype").on('change', function() {
+        $("#imtype").on('change', function () {
             if ($(this).val() === '0') {
                 $('#oauth-provider').empty();
             } else if ($(this).val() === '1') {
@@ -821,7 +844,7 @@
                 $('#oauth-provider').append(
                     "<a id='bind-discord' class='btn btn-indigo ms-auto'>绑定 Discord</a>"
                 );
-            } else if ($(this).val() === '4'){
+            } else if ($(this).val() === '4') {
                 $('#oauth-provider').empty();
                 $('#oauth-provider').append(
                     '<script async src=\"https://telegram.org/js/telegram-widget.js?22\"' +
@@ -832,12 +855,12 @@
             }
         });
 
-        $('#oauth-provider').on('click', '#bind-slack', function() {
+        $('#oauth-provider').on('click', '#bind-slack', function () {
             $.ajax({
                 type: "POST",
                 url: "/oauth/slack",
                 dataType: "json",
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         window.location.replace(data.redir);
                     } else {
@@ -848,12 +871,12 @@
             })
         });
 
-        $('#oauth-provider').on('click', '#bind-discord', function() {
+        $('#oauth-provider').on('click', '#bind-discord', function () {
             $.ajax({
                 type: "POST",
                 url: "/oauth/discord",
                 dataType: "json",
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         window.location.replace(data.redir);
                     } else {
@@ -872,7 +895,7 @@
                 data: {
                     user: JSON.stringify(user),
                 },
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -886,4 +909,4 @@
         {/if}
     </script>
 
-{include file='user/footer.tpl'}
+    {include file='user/footer.tpl'}

+ 4 - 4
resources/views/tabler/user/footer.tpl

@@ -95,12 +95,12 @@
 </div>
 <!-- js -->
 <script>
-    $("#switch_theme_mode").click(function() {
+    $("#switch_theme_mode").click(function () {
         $.ajax({
             type: "POST",
             url: "/user/switch_theme_mode",
             dataType: "json",
-            success: function(data) {
+            success: function (data) {
                 if (data.ret === 1) {
                     $('#success-message').text(data.msg);
                     $('#success-dialog').modal('show');
@@ -113,7 +113,7 @@
         })
     });
 
-    $("#success-confirm").click(function() {
+    $("#success-confirm").click(function () {
         location.reload();
     });
 </script>
@@ -124,4 +124,4 @@
 
 </body>
 
-</html>
+</html>

+ 139 - 138
resources/views/tabler/user/header.tpl

@@ -2,15 +2,15 @@
 <html lang="zh">
 
 <head>
-    <meta charset="utf-8" />
-    <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
-    <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport" />
-    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
+    <meta charset="utf-8"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"/>
+    <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"/>
+    <meta http-equiv="X-UA-Compatible" content="ie=edge"/>
     <meta name="referrer" content="never">
     <title>{$config['appName']}</title>
     <!-- CSS files -->
-    <link href="//{$config['jsdelivr_url']}/npm/@tabler/core@latest/dist/css/tabler.min.css" rel="stylesheet" />
-    <link href="//{$config['jsdelivr_url']}/npm/@tabler/icons-webfont@latest/tabler-icons.min.css" rel="stylesheet" />
+    <link href="//{$config['jsdelivr_url']}/npm/@tabler/core@latest/dist/css/tabler.min.css" rel="stylesheet"/>
+    <link href="//{$config['jsdelivr_url']}/npm/@tabler/icons-webfont@latest/tabler-icons.min.css" rel="stylesheet"/>
     <!-- JS files -->
     <script src="/assets/js/fuck.min.js"></script>
     <script src="//{$config['jsdelivr_url']}/npm/qrcode_js@latest/qrcode.min.js"></script>
@@ -32,188 +32,189 @@
 {else}
 <body>
 {/if}
-    <div class="page">
-        <header class="navbar navbar-expand-md navbar-overlap d-print-none" data-bs-theme="dark">
-            <div class="container-xl" style="background-image: none;">
-                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbar-menu">
-                    <span class="navbar-toggler-icon"></span>
-                </button>
-                <h1 class="navbar-brand navbar-brand-autodark d-none-navbar-horizontal pe-0 pe-md-3">
-                    <img src="/images/uim-logo-round_48x48.png" height="32" alt="SSPanel-UIM Logo" class="navbar-brand-image" style="filter: none;">
-                </h1>
-                <div class="navbar-nav flex-row order-md-last">
-                    <div class="nav-item dropdown">
-                        <a href="#" class="nav-link d-flex lh-1 text-reset p-0" data-bs-toggle="dropdown"
-                            aria-label="Open user menu">
+<div class="page">
+    <header class="navbar navbar-expand-md navbar-overlap d-print-none" data-bs-theme="dark">
+        <div class="container-xl" style="background-image: none;">
+            <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbar-menu">
+                <span class="navbar-toggler-icon"></span>
+            </button>
+            <h1 class="navbar-brand navbar-brand-autodark d-none-navbar-horizontal pe-0 pe-md-3">
+                <img src="/images/uim-logo-round_48x48.png" height="32" alt="SSPanel-UIM Logo"
+                     class="navbar-brand-image" style="filter: none;">
+            </h1>
+            <div class="navbar-nav flex-row order-md-last">
+                <div class="nav-item dropdown">
+                    <a href="#" class="nav-link d-flex lh-1 text-reset p-0" data-bs-toggle="dropdown"
+                       aria-label="Open user menu">
                             <span class="avatar avatar-sm"
-                                style="background-image: url({$user->dice_bear})"></span>
-                            <div class="d-none d-xl-block ps-2">
-                                <div>{$user->email}</div>
-                                <div class="mt-1 small text-secondary">{$user->user_name}</div>
-                            </div>
-                        </a>
-                        <div class="dropdown-menu dropdown-menu-end dropdown-menu-arrow">
-                            {if $user->is_dark_mode}
+                                  style="background-image: url({$user->dice_bear})"></span>
+                        <div class="d-none d-xl-block ps-2">
+                            <div>{$user->email}</div>
+                            <div class="mt-1 small text-secondary">{$user->user_name}</div>
+                        </div>
+                    </a>
+                    <div class="dropdown-menu dropdown-menu-end dropdown-menu-arrow">
+                        {if $user->is_dark_mode}
                             <a id="switch_theme_mode" class="dropdown-item">浅色模式</a>
-                            {else}
+                        {else}
                             <a id="switch_theme_mode" class="dropdown-item">深色模式</a>
-                            {/if}
-                            <a href="/user/logout" class="dropdown-item">登出</a>
-                        </div>
+                        {/if}
+                        <a href="/user/logout" class="dropdown-item">登出</a>
                     </div>
                 </div>
-                <div class="collapse navbar-collapse" id="navbar-menu">
-                    <div class="d-flex flex-column flex-md-row flex-fill align-items-stretch align-items-md-center">
-                        <ul class="navbar-nav">
-                            <li class="nav-item">
-                                <a class="nav-link" href="/user">
+            </div>
+            <div class="collapse navbar-collapse" id="navbar-menu">
+                <div class="d-flex flex-column flex-md-row flex-fill align-items-stretch align-items-md-center">
+                    <ul class="navbar-nav">
+                        <li class="nav-item">
+                            <a class="nav-link" href="/user">
                                     <span class="nav-link-icon d-md-none d-lg-inline-block">
                                         <i class="ti ti-home icon"></i>
                                     </span>
-                                    <span class="nav-link-title">
+                                <span class="nav-link-title">
                                         主页
                                     </span>
-                                </a>
-                            </li>
-                            <li class="nav-item dropdown">
-                                <a class="nav-link dropdown-toggle" href="#navbar-base" data-bs-toggle="dropdown"
-                                    data-bs-auto-close="outside" role="button" aria-expanded="false">
+                            </a>
+                        </li>
+                        <li class="nav-item dropdown">
+                            <a class="nav-link dropdown-toggle" href="#navbar-base" data-bs-toggle="dropdown"
+                               data-bs-auto-close="outside" role="button" aria-expanded="false">
                                     <span class="nav-link-icon d-md-none d-lg-inline-block">
                                         <i class="ti ti-user icon"></i>
                                     </span>
-                                    <span class="nav-link-title">
+                                <span class="nav-link-title">
                                         我的
                                     </span>
-                                </a>
-                                <div class="dropdown-menu">
-                                    <div class="dropdown-menu-columns">
-                                        <div class="dropdown-menu-column">
-                                            <a class="dropdown-item" href="/user/profile">
-                                                <i class="ti ti-info-square"></i>&nbsp;
-                                                账户
-                                            </a>
-                                            <a class="dropdown-item" href="/user/edit">
-                                                <i class="ti ti-edit"></i>&nbsp;
-                                                资料
-                                            </a>
-                                            {if $public_setting['subscribe_log']}
+                            </a>
+                            <div class="dropdown-menu">
+                                <div class="dropdown-menu-columns">
+                                    <div class="dropdown-menu-column">
+                                        <a class="dropdown-item" href="/user/profile">
+                                            <i class="ti ti-info-square"></i>&nbsp;
+                                            账户
+                                        </a>
+                                        <a class="dropdown-item" href="/user/edit">
+                                            <i class="ti ti-edit"></i>&nbsp;
+                                            资料
+                                        </a>
+                                        {if $public_setting['subscribe_log']}
                                             <a class="dropdown-item" href="/user/subscribe/log">
                                                 <i class="ti ti-rss"></i></i>&nbsp;
                                                 订阅
                                             </a>
-                                            {/if}
-                                            <a class="dropdown-item" href="/user/invite">
-                                                <i class="ti ti-friends"></i>&nbsp;
-                                                邀请
-                                            </a>
-                                        </div>
+                                        {/if}
+                                        <a class="dropdown-item" href="/user/invite">
+                                            <i class="ti ti-friends"></i>&nbsp;
+                                            邀请
+                                        </a>
                                     </div>
                                 </div>
-                            </li>
-                            <li class="nav-item dropdown">
-                                <a class="nav-link dropdown-toggle" href="#navbar-extra" data-bs-toggle="dropdown"
-                                    data-bs-auto-close="outside" role="button" aria-expanded="false">
+                            </div>
+                        </li>
+                        <li class="nav-item dropdown">
+                            <a class="nav-link dropdown-toggle" href="#navbar-extra" data-bs-toggle="dropdown"
+                               data-bs-auto-close="outside" role="button" aria-expanded="false">
                                     <span class="nav-link-icon d-md-none d-lg-inline-block">
                                         <i class="ti ti-brand-telegram icon"></i>
                                     </span>
-                                    <span class="nav-link-title">
+                                <span class="nav-link-title">
                                         使用
                                     </span>
+                            </a>
+                            <div class="dropdown-menu">
+                                <a class="dropdown-item" href="/user/server">
+                                    <i class="ti ti-server"></i>&nbsp;
+                                    节点
                                 </a>
-                                <div class="dropdown-menu">
-                                    <a class="dropdown-item" href="/user/server">
-                                        <i class="ti ti-server"></i>&nbsp;
-                                        节点
-                                    </a>
-                                </div>
-                            </li>
-                            <li class="nav-item dropdown">
-                                <a class="nav-link dropdown-toggle" href="#navbar-extra" data-bs-toggle="dropdown"
-                                    data-bs-auto-close="outside" role="button" aria-expanded="false">
+                            </div>
+                        </li>
+                        <li class="nav-item dropdown">
+                            <a class="nav-link dropdown-toggle" href="#navbar-extra" data-bs-toggle="dropdown"
+                               data-bs-auto-close="outside" role="button" aria-expanded="false">
                                     <span class="nav-link-icon d-md-none d-lg-inline-block">
                                         <i class="ti ti-dots-circle-horizontal icon"></i>
                                     </span>
-                                    <span class="nav-link-title">
+                                <span class="nav-link-title">
                                         支援
                                     </span>
+                            </a>
+                            <div class="dropdown-menu">
+                                <a class="dropdown-item" href="/user/announcement">
+                                    <i class="ti ti-speakerphone"></i>&nbsp;
+                                    公告
                                 </a>
-                                <div class="dropdown-menu">
-                                    <a class="dropdown-item" href="/user/announcement">
-                                        <i class="ti ti-speakerphone"></i>&nbsp;
-                                        公告
-                                    </a>
-                                    {if $public_setting['enable_ticket']}
+                                {if $public_setting['enable_ticket']}
                                     <a class="dropdown-item" href="/user/ticket">
                                         <i class="ti ti-ticket"></i>&nbsp;
                                         工单
                                     </a>
-                                    {/if}
-                                    {if $public_setting['display_docs'] &&
-                                    (! $public_setting['display_docs_only_for_paid_user'] || $user->class !== 0)}
-                                        <a class="dropdown-item" href="/user/docs">
-                                            <i class="ti ti-notes"></i>&nbsp;
-                                            文档
-                                        </a>
-                                    {/if}
-                                </div>
-                            </li>
-                            <li class="nav-item dropdown">
-                                <a class="nav-link dropdown-toggle" href="#navbar-extra" data-bs-toggle="dropdown"
-                                    data-bs-auto-close="outside" role="button" aria-expanded="false">
+                                {/if}
+                                {if $public_setting['display_docs'] &&
+                                (! $public_setting['display_docs_only_for_paid_user'] || $user->class !== 0)}
+                                    <a class="dropdown-item" href="/user/docs">
+                                        <i class="ti ti-notes"></i>&nbsp;
+                                        文档
+                                    </a>
+                                {/if}
+                            </div>
+                        </li>
+                        <li class="nav-item dropdown">
+                            <a class="nav-link dropdown-toggle" href="#navbar-extra" data-bs-toggle="dropdown"
+                               data-bs-auto-close="outside" role="button" aria-expanded="false">
                                     <span class="nav-link-icon d-md-none d-lg-inline-block">
                                         <i class="ti ti-shield-check icon"></i>
                                     </span>
-                                    <span class="nav-link-title">
+                                <span class="nav-link-title">
                                         审计
                                     </span>
+                            </a>
+                            <div class="dropdown-menu">
+                                <a class="dropdown-item" href="/user/detect">
+                                    <i class="ti ti-barrier-block"></i>&nbsp;
+                                    规则
                                 </a>
-                                <div class="dropdown-menu">
-                                    <a class="dropdown-item" href="/user/detect">
-                                        <i class="ti ti-barrier-block"></i>&nbsp;
-                                        规则
-                                    </a>
-                                    {if $public_setting['display_detect_log']}
+                                {if $public_setting['display_detect_log']}
                                     <a class="dropdown-item" href="/user/detect/log">
                                         <i class="ti ti-notes"></i>&nbsp;
                                         日志
                                     </a>
-                                    {/if}
-                                </div>
-                            </li>
-                            <li class="nav-item dropdown">
-                                <a class="nav-link dropdown-toggle" href="#navbar-layout" data-bs-toggle="dropdown"
-                                    data-bs-auto-close="outside" role="button" aria-expanded="false">
+                                {/if}
+                            </div>
+                        </li>
+                        <li class="nav-item dropdown">
+                            <a class="nav-link dropdown-toggle" href="#navbar-layout" data-bs-toggle="dropdown"
+                               data-bs-auto-close="outside" role="button" aria-expanded="false">
                                     <span class="nav-link-icon d-md-none d-lg-inline-block">
                                         <i class="ti ti-building-store icon"></i>
                                     </span>
-                                    <span class="nav-link-title">
+                                <span class="nav-link-title">
                                         商店
                                     </span>
-                                </a>
-                                <div class="dropdown-menu">
-                                    <div class="dropdown-menu-columns">
-                                        <div class="dropdown-menu-column">
-                                            <a class="dropdown-item" href="/user/product">
-                                                <i class="ti ti-list"></i>&nbsp;
-                                                商品
-                                            </a>
-                                            <a class="dropdown-item" href="/user/order">
-                                                <i class="ti ti-file-invoice"></i>&nbsp;
-                                                订单
-                                            </a>
-                                            <a class="dropdown-item" href="/user/invoice">
-                                                <i class="ti ti-file-dollar"></i>&nbsp;
-                                                账单
-                                            </a>
-                                            <a class="dropdown-item" href="/user/money">
-                                                <i class="ti ti-home-dollar"></i>&nbsp;
-                                                余额
-                                            </a>
-                                        </div>
+                            </a>
+                            <div class="dropdown-menu">
+                                <div class="dropdown-menu-columns">
+                                    <div class="dropdown-menu-column">
+                                        <a class="dropdown-item" href="/user/product">
+                                            <i class="ti ti-list"></i>&nbsp;
+                                            商品
+                                        </a>
+                                        <a class="dropdown-item" href="/user/order">
+                                            <i class="ti ti-file-invoice"></i>&nbsp;
+                                            订单
+                                        </a>
+                                        <a class="dropdown-item" href="/user/invoice">
+                                            <i class="ti ti-file-dollar"></i>&nbsp;
+                                            账单
+                                        </a>
+                                        <a class="dropdown-item" href="/user/money">
+                                            <i class="ti ti-home-dollar"></i>&nbsp;
+                                            余额
+                                        </a>
                                     </div>
                                 </div>
-                            </li>
-                            {if $user->is_admin}
+                            </div>
+                        </li>
+                        {if $user->is_admin}
                             <li class="nav-item">
                                 <a class="nav-link" href="/admin">
                                     <span class="nav-link-icon d-md-none d-lg-inline-block">
@@ -224,9 +225,9 @@
                                     </span>
                                 </a>
                             </li>
-                            {/if}
-                        </ul>
-                    </div>
+                        {/if}
+                    </ul>
                 </div>
             </div>
-</header>
+        </div>
+    </header>

+ 126 - 114
resources/views/tabler/user/index.tpl

@@ -111,7 +111,8 @@
                                             </div>
                                             <div class="text-secondary">
                                                 {if $user->node_speedlimit !== 0.0}
-                                                    <code>{$user->node_speedlimit}</code> Mbps
+                                                    <code>{$user->node_speedlimit}</code>
+                                                    Mbps
                                                 {else}
                                                     不限制
                                                 {/if}
@@ -191,9 +192,9 @@
                                             通用订阅(sing-box):<code>{$UniversalSub}/singbox</code>
                                         </p>
                                         {if $public_setting['enable_ss_sub']}
-                                        <p>
-                                            通用订阅(sip008):<code>{$UniversalSub}/sip008</code>
-                                        </p>
+                                            <p>
+                                                通用订阅(sip008):<code>{$UniversalSub}/sip008</code>
+                                            </p>
                                         {/if}
                                         <div class="btn-list justify-content-start">
                                             <a data-clipboard-text="{$UniversalSub}/json"
@@ -209,10 +210,10 @@
                                                 复制通用订阅(sing-box)
                                             </a>
                                             {if $public_setting['enable_ss_sub']}
-                                            <a data-clipboard-text="{$UniversalSub}/sip008"
-                                               class="copy btn btn-primary">
-                                                复制通用订阅(sip008)
-                                            </a>
+                                                <a data-clipboard-text="{$UniversalSub}/sip008"
+                                                   class="copy btn btn-primary">
+                                                    复制通用订阅(sip008)
+                                                </a>
                                             {/if}
                                         </div>
                                     </div>
@@ -221,39 +222,44 @@
                                     <div class="tab-pane show" id="traditional-sub">
                                         <div>
                                             {if $public_setting['enable_ss_sub']}
-                                            <p>
-                                                传统订阅(Shadowsocks):<code>{$TraditionalSub}?ss=1</code></p><p>
-                                                传统订阅(Shadowsocks SIP002):<code>{$TraditionalSub}?sip002=1</code>
-                                            </p>
+                                                <p>
+                                                    传统订阅(Shadowsocks):<code>{$TraditionalSub}?ss=1</code></p>
+                                                <p>
+                                                    传统订阅(Shadowsocks SIP002):<code>{$TraditionalSub}?sip002=1</code>
+                                                </p>
                                             {/if}
                                             {if $public_setting['enable_v2_sub']}
-                                            <p>
-                                                传统订阅(V2Ray):<code>{$TraditionalSub}?v2ray=1</code>
-                                            </p>
+                                                <p>
+                                                    传统订阅(V2Ray):<code>{$TraditionalSub}?v2ray=1</code>
+                                                </p>
                                             {/if}
                                             {if $public_setting['enable_trojan_sub']}
-                                            <p>
-                                                传统订阅(Trojan):<code>{$TraditionalSub}?trojan=1</code>
-                                            </p>
+                                                <p>
+                                                    传统订阅(Trojan):<code>{$TraditionalSub}?trojan=1</code>
+                                                </p>
                                             {/if}
                                             <div class="btn-list justify-content-start">
                                                 {if $public_setting['enable_ss_sub']}
-                                                <a data-clipboard-text="{$TraditionalSub}?ss=1" class="copy btn btn-primary">
-                                                    复制传统订阅(Shadowsocks)
-                                                </a>
-                                                <a data-clipboard-text="{$TraditionalSub}?sip002=1" class="copy btn btn-primary">
-                                                    复制传统订阅(Shadowsocks SIP002)
-                                                </a>
+                                                    <a data-clipboard-text="{$TraditionalSub}?ss=1"
+                                                       class="copy btn btn-primary">
+                                                        复制传统订阅(Shadowsocks)
+                                                    </a>
+                                                    <a data-clipboard-text="{$TraditionalSub}?sip002=1"
+                                                       class="copy btn btn-primary">
+                                                        复制传统订阅(Shadowsocks SIP002)
+                                                    </a>
                                                 {/if}
                                                 {if $public_setting['enable_v2_sub']}
-                                                <a data-clipboard-text="{$TraditionalSub}?v2ray=1" class="copy btn btn-primary">
-                                                    复制传统订阅(V2Ray)
-                                                </a>
+                                                    <a data-clipboard-text="{$TraditionalSub}?v2ray=1"
+                                                       class="copy btn btn-primary">
+                                                        复制传统订阅(V2Ray)
+                                                    </a>
                                                 {/if}
                                                 {if $public_setting['enable_trojan_sub']}
-                                                <a data-clipboard-text="{$TraditionalSub}?trojan=1" class="copy btn btn-primary">
-                                                    复制传统订阅(Trojan)
-                                                </a>
+                                                    <a data-clipboard-text="{$TraditionalSub}?trojan=1"
+                                                       class="copy btn btn-primary">
+                                                        复制传统订阅(Trojan)
+                                                    </a>
                                                 {/if}
                                             </div>
                                         </div>
@@ -266,11 +272,11 @@
                                         </p>
                                         <div class="btn-list justify-content-start">
                                             <a
-                                            {if $config['enable_r2_client_download']}
-                                                href="/user/clients/Clash.Verge.exe"
-                                            {else}
-                                                href="/clients/Clash.Verge.exe"
-                                            {/if} class="btn btn-azure">
+                                                    {if $config['enable_r2_client_download']}
+                                                        href="/user/clients/Clash.Verge.exe"
+                                                    {else}
+                                                        href="/clients/Clash.Verge.exe"
+                                                    {/if} class="btn btn-azure">
                                                 下载 Clash Verge
                                             </a>
                                             <a data-clipboard-text="{$UniversalSub}/clash"
@@ -464,14 +470,14 @@
                                     <div class="progress-bar bg-primary" role="progressbar" style="width: 1%"></div>
                                 {else}
                                     <div class="progress-bar bg-primary" role="progressbar"
-                                        style="width: {$user->LastusedTrafficPercent()}%">
+                                         style="width: {$user->LastusedTrafficPercent()}%">
                                     </div>
                                 {/if}
                                 {if $user->TodayusedTrafficPercent() < '1'}
                                     <div class="progress-bar bg-success" role="progressbar" style="width: 1%"></div>
                                 {else}
                                     <div class="progress-bar bg-success" role="progressbar"
-                                        style="width: {$user->TodayusedTrafficPercent()}%"></div>
+                                         style="width: {$user->TodayusedTrafficPercent()}%"></div>
                                 {/if}
                             </div>
                             <div class="row">
@@ -490,7 +496,9 @@
                             </div>
                             <p class="my-3">
                                 {if $user->class === 0}
-                                    前往 <a href="/user/product">商店</a> 购买套餐
+                                    前往
+                                    <a href="/user/product">商店</a>
+                                    购买套餐
                                 {else}
                                     你的 LV. {$user->class} 账户会在 {$class_expire_days} 天后到期({$user->class_expire})
                                 {/if}
@@ -507,67 +515,71 @@
                             <h3 class="card-title">
                                 最新公告
                                 {if $ann !== null}
-                                <span class="card-subtitle">{$ann->date}</span>
+                                    <span class="card-subtitle">{$ann->date}</span>
                                 {/if}
                             </h3>
                             <p class="text-secondary">
-                            {if $ann !== null}
-                                {$ann->content}
-                            {else}
-                                暂无公告
-                            {/if}
+                                {if $ann !== null}
+                                    {$ann->content}
+                                {else}
+                                    暂无公告
+                                {/if}
                             </p>
                         </div>
                     </div>
                 </div>
                 {if $config['enable_checkin']}
-                <div class="col-lg-6 col-sm-12">
-                    <div class="card">
-                        <div class="card-stamp">
-                            <div class="card-stamp-icon bg-green">
-                                <i class="ti ti-check"></i>
+                    <div class="col-lg-6 col-sm-12">
+                        <div class="card">
+                            <div class="card-stamp">
+                                <div class="card-stamp-icon bg-green">
+                                    <i class="ti ti-check"></i>
+                                </div>
                             </div>
-                        </div>
-                        <div class="card-body">
-                            <h3 class="card-title">每日签到</h3>
-                            <p>
-                                签到可领取
-                                {if $config['checkinMin'] !== $config['checkinMax']}
-                                    &nbsp;<code>{$config['checkinMin']} MB</code> 至 <code>{$config['checkinMax']} MB</code>
-                                    范围内的流量
-                                {else}
-                                    <code>{$config['checkinMin']} MB</code>
-                                {/if}
-                            </p>
-                            <p>
-                                上次签到时间:<code>{$user->lastCheckInTime()}</code>
-                            </p>
-                        </div>
-                        <div class="card-footer">
-                            <div class="d-flex">
-                                {if ! $user->isAbleToCheckin()}
-                                <button id="check-in" class="btn btn-primary ms-auto" disabled>已签到</button>
-                                {else}
-                                {if $public_setting['enable_checkin_captcha']}
-                                    {if $public_setting['captcha_provider'] === 'turnstile'}
-                                        <div id="cf-turnstile" class="cf-turnstile" data-sitekey="{$captcha['turnstile_sitekey']}"
-                                        {if $user->is_dark_mode}
-                                             data-theme="dark"
-                                        {else}
-                                             data-theme="light"
-                                        {/if}
-                                        ></div>
+                            <div class="card-body">
+                                <h3 class="card-title">每日签到</h3>
+                                <p>
+                                    签到可领取
+                                    {if $config['checkinMin'] !== $config['checkinMax']}
+                                        &nbsp;
+                                        <code>{$config['checkinMin']} MB</code>
+                                        至
+                                        <code>{$config['checkinMax']} MB</code>
+                                        范围内的流量
+                                    {else}
+                                        <code>{$config['checkinMin']} MB</code>
                                     {/if}
-                                    {if $public_setting['captcha_provider'] === 'geetest'}
-                                        <div id="geetest"></div>
+                                </p>
+                                <p>
+                                    上次签到时间:<code>{$user->lastCheckInTime()}</code>
+                                </p>
+                            </div>
+                            <div class="card-footer">
+                                <div class="d-flex">
+                                    {if ! $user->isAbleToCheckin()}
+                                        <button id="check-in" class="btn btn-primary ms-auto" disabled>已签到</button>
+                                    {else}
+                                        {if $public_setting['enable_checkin_captcha']}
+                                            {if $public_setting['captcha_provider'] === 'turnstile'}
+                                                <div id="cf-turnstile" class="cf-turnstile"
+                                                     data-sitekey="{$captcha['turnstile_sitekey']}"
+                                                        {if $user->is_dark_mode}
+                                                            data-theme="dark"
+                                                        {else}
+                                                            data-theme="light"
+                                                        {/if}
+                                                ></div>
+                                            {/if}
+                                            {if $public_setting['captcha_provider'] === 'geetest'}
+                                                <div id="geetest"></div>
+                                            {/if}
+                                        {/if}
+                                        <button id="check-in" class="btn btn-primary ms-auto">签到</button>
                                     {/if}
-                                {/if}
-                                <button id="check-in" class="btn btn-primary ms-auto">签到</button>
-                                {/if}
+                                </div>
                             </div>
                         </div>
                     </div>
-                </div>
                 {/if}
             </div>
         </div>
@@ -575,27 +587,27 @@
 
     <script>
         var clipboard = new ClipboardJS('.copy');
-        clipboard.on('success', function(e) {
+        clipboard.on('success', function (e) {
             $('#success-noreload-message').text('已复制到剪切板');
             $('#success-noreload-dialog').modal('show');
         });
 
-        $("#check-in").click(function() {
+        $("#check-in").click(function () {
             $.ajax({
                 type: "POST",
                 url: "/user/checkin",
                 dataType: "json",
                 data: {
                     {if $public_setting['enable_checkin_captcha'] && $user->isAbleToCheckin()}
-                        {if $public_setting['captcha_provider'] === 'turnstile'}
-                            turnstile: $('input[name=cf-turnstile-response]').val(),
-                        {/if}
-                        {if $public_setting['captcha_provider'] === 'geetest'}
-                            geetest: geetest_result,
-                        {/if}
+                    {if $public_setting['captcha_provider'] === 'turnstile'}
+                    turnstile: $('input[name=cf-turnstile-response]').val(),
+                    {/if}
+                    {if $public_setting['captcha_provider'] === 'geetest'}
+                    geetest: geetest_result,
+                    {/if}
                     {/if}
                 },
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -609,25 +621,25 @@
     </script>
 
     {if $public_setting['enable_checkin_captcha'] && $user->isAbleToCheckin()}
-        {if $public_setting['captcha_provider'] === 'turnstile'}
-            <script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
-        {/if}
-        {if $public_setting['captcha_provider'] === 'geetest'}
-            <script src="https://static.geetest.com/v4/gt4.js"></script>
-            <script>
-                var geetest_result = '';
-                initGeetest4({
-                    captchaId: '{$captcha['geetest_id']}',
-                    product: 'float',
-                    language: "zho",
-                    riskType:'slide'
-                }, function (geetest) {
-                    geetest.appendTo("#geetest");
-                    geetest.onSuccess(function() {
-                        geetest_result = geetest.getValidate();
-                    });
+    {if $public_setting['captcha_provider'] === 'turnstile'}
+        <script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
+    {/if}
+    {if $public_setting['captcha_provider'] === 'geetest'}
+        <script src="https://static.geetest.com/v4/gt4.js"></script>
+        <script>
+            var geetest_result = '';
+            initGeetest4({
+                captchaId: '{$captcha['geetest_id']}',
+                product: 'float',
+                language: "zho",
+                riskType: 'slide'
+            }, function (geetest) {
+                geetest.appendTo("#geetest");
+                geetest.onSuccess(function () {
+                    geetest_result = geetest.getValidate();
                 });
-            </script>
-        {/if}
+            });
+        </script>
+    {/if}
     {/if}
-{include file='user/footer.tpl'}
+    {include file='user/footer.tpl'}

+ 20 - 17
resources/views/tabler/user/invite.tpl

@@ -25,8 +25,10 @@
                                 <div class="card-body">
                                     <h3 class="card-title">邀请规则</h3>
                                     <ul>
-                                        <li>邀请注册的用户在账单确认后,你可获得其账单金额的 <code>{$rebate_ratio_per} %</code>
-                                            作为返利</li>
+                                        <li>邀请注册的用户在账单确认后,你可获得其账单金额的 <code>{$rebate_ratio_per}
+                                                %</code>
+                                            作为返利
+                                        </li>
                                         <li>部分商品的返利比例可能不遵循上面的比例</li>
                                     </ul>
                                     <p>你目前通过邀请好友获得的总返利为 <code>{$paybacks_sum}</code> 元</p>
@@ -37,12 +39,13 @@
                             <div class="card">
                                 <div class="card-body">
                                     <h3 class="card-title">邀请链接</h3>
-                                    <input class="form-control" value="{$invite_url}" disabled />
+                                    <input class="form-control" value="{$invite_url}" disabled/>
                                 </div>
                                 <div class="card-footer">
                                     <div class="d-flex">
                                         <a id="reset-url" class="btn text-red btn-link">重置</a>
-                                        <a data-clipboard-text="{$invite_url}" class="copy btn btn-primary ms-auto">复制</a>
+                                        <a data-clipboard-text="{$invite_url}"
+                                           class="copy btn btn-primary ms-auto">复制</a>
                                     </div>
                                 </div>
                             </div>
@@ -57,16 +60,16 @@
                         <div class="table-responsive">
                             <table class="table card-table table-vcenter text-nowrap datatable">
                                 <thead>
-                                    <tr>
-                                        <th>记录ID</th>
-                                        <th>邀请用户ID</th>
-                                        <th>邀请用户昵称</th>
-                                        <th>返利金额</th>
-                                        <th>返利时间</th>
-                                    </tr>
+                                <tr>
+                                    <th>记录ID</th>
+                                    <th>邀请用户ID</th>
+                                    <th>邀请用户昵称</th>
+                                    <th>返利金额</th>
+                                    <th>返利时间</th>
+                                </tr>
                                 </thead>
                                 <tbody>
-                                    {foreach $paybacks as $payback}
+                                {foreach $paybacks as $payback}
                                     <tr>
                                         <td>{$payback->id}</td>
                                         <td>{$payback->userid}</td>
@@ -74,7 +77,7 @@
                                         <td>{$payback->ref_get} 元</td>
                                         <td>{$payback->datetime}</td>
                                     </tr>
-                                    {/foreach}
+                                {/foreach}
                                 </tbody>
                             </table>
                         </div>
@@ -86,17 +89,17 @@
 
     <script>
         var clipboard = new ClipboardJS('.copy');
-        clipboard.on('success', function(e) {
+        clipboard.on('success', function (e) {
             $('#success-noreload-message').text('已复制到剪切板');
             $('#success-noreload-dialog').modal('show');
         });
 
-        $("#reset-url").click(function() {
+        $("#reset-url").click(function () {
             $.ajax({
                 type: "POST",
                 url: "/user/invite_reset",
                 dataType: "json",
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -109,4 +112,4 @@
         });
     </script>
 
-{include file='user/footer.tpl'}
+    {include file='user/footer.tpl'}

+ 19 - 14
resources/views/tabler/user/invoice/index.tpl

@@ -1,13 +1,13 @@
 {include file='user/header.tpl'}
 
-<link href="//cdn.datatables.net/v/bs5/dt-1.13.5/datatables.min.css" rel="stylesheet" />
-<script src="//cdn.datatables.net/v/bs5/dt-1.13.5/datatables.min.js"></script>
+<link href="//cdn.datatables.net/v/bs5/dt-1.13.6/datatables.min.css" rel="stylesheet"/>
+<script src="//cdn.datatables.net/v/bs5/dt-1.13.6/datatables.min.js"></script>
 
 <div class="page-wrapper">
-    <div class="container-xl">       
+    <div class="container-xl">
         <div class="page-header d-print-none text-white">
             <div class="row align-items-center">
-                <div class="col">                   
+                <div class="col">
                     <h2 class="page-title">
                         <span class="home-title my-3">账单列表</span>
                     </h2>
@@ -26,11 +26,11 @@
                         <div class="table-responsive">
                             <table id="data_table" class="table card-table table-vcenter text-nowrap datatable">
                                 <thead>
-                                    <tr>
-                                        {foreach $details['field'] as $key => $value}
+                                <tr>
+                                    {foreach $details['field'] as $key => $value}
                                         <th>{$value}</th>
-                                        {/foreach}
-                                    </tr>
+                                    {/foreach}
+                                </tr>
                                 </thead>
                             </table>
                         </div>
@@ -41,13 +41,13 @@
     </div>
 
     <script>
-       var table = $('#data_table').DataTable({
+        var table = $('#data_table').DataTable({
             ajax: {
                 url: '/user/invoice/ajax',
                 type: 'POST',
                 dataSrc: 'invoices'
             },
-            "autoWidth":false,
+            "autoWidth": false,
             'iDisplayLength': 10,
             'scrollX': true,
             'order': [
@@ -55,11 +55,16 @@
             ],
             columns: [
                 {foreach $details['field'] as $key => $value}
-                { data: '{$key}' },
+                {
+                    data: '{$key}'
+                },
                 {/foreach}
             ],
-            "columnDefs":[
-                { targets:[0],orderable:false }
+            "columnDefs": [
+                {
+                    targets: [0],
+                    orderable: false
+                }
             ],
             "dom": "<'row px-3 py-3'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
                 "<'row'<'col-sm-12'tr>>" +
@@ -101,4 +106,4 @@
         loadTable();
     </script>
 
-{include file='user/footer.tpl'}
+    {include file='user/footer.tpl'}

+ 110 - 110
resources/views/tabler/user/invoice/view.tpl

@@ -24,135 +24,135 @@
             <div class="row row-cards">
                 {if $invoice->status === 'unpaid'}
                 <div class="col-sm-12 col-md-6 col-lg-9">
-                {else}
-                <div class="col-sm-12 col-md-12 col-lg-12">
-                {/if}
-                    <div class="card">
-                        <div class="card-header">
-                            <h3 class="card-title">基本信息</h3>
-                        </div>
-                        <div class="card-body">
-                            <div class="datagrid">
-                                <div class="datagrid-item">
-                                    <div class="datagrid-title">订单ID</div>
-                                    <div class="datagrid-content">{$invoice->order_id}</div>
-                                </div>
-                                <div class="datagrid-item">
-                                    <div class="datagrid-title">订单金额</div>
-                                    <div class="datagrid-content">{$invoice->price}</div>
-                                </div>
-                                <div class="datagrid-item">
-                                    <div class="datagrid-title">订单状态</div>
-                                    <div class="datagrid-content">{$invoice->status_text}</div>
-                                </div>
-                                <div class="datagrid-item">
-                                    <div class="datagrid-title">创建时间</div>
-                                    <div class="datagrid-content">{$invoice->create_time}</div>
-                                </div>
-                                <div class="datagrid-item">
-                                    <div class="datagrid-title">更新时间</div>
-                                    <div class="datagrid-content">{$invoice->update_time}</div>
-                                </div>
-                                <div class="datagrid-item">
-                                    <div class="datagrid-title">支付时间</div>
-                                    <div class="datagrid-content">{$invoice->pay_time}</div>
-                                </div>
-                                {if $invoice->status === 'paid_gateway'}
-                                <div class="datagrid-item">
-                                    <div class="datagrid-title">支付网关单号</div>
-                                    <div class="datagrid-content">{$paylist->tradeno}</div>
+                    {else}
+                    <div class="col-sm-12 col-md-12 col-lg-12">
+                        {/if}
+                        <div class="card">
+                            <div class="card-header">
+                                <h3 class="card-title">基本信息</h3>
+                            </div>
+                            <div class="card-body">
+                                <div class="datagrid">
+                                    <div class="datagrid-item">
+                                        <div class="datagrid-title">订单ID</div>
+                                        <div class="datagrid-content">{$invoice->order_id}</div>
+                                    </div>
+                                    <div class="datagrid-item">
+                                        <div class="datagrid-title">订单金额</div>
+                                        <div class="datagrid-content">{$invoice->price}</div>
+                                    </div>
+                                    <div class="datagrid-item">
+                                        <div class="datagrid-title">订单状态</div>
+                                        <div class="datagrid-content">{$invoice->status_text}</div>
+                                    </div>
+                                    <div class="datagrid-item">
+                                        <div class="datagrid-title">创建时间</div>
+                                        <div class="datagrid-content">{$invoice->create_time}</div>
+                                    </div>
+                                    <div class="datagrid-item">
+                                        <div class="datagrid-title">更新时间</div>
+                                        <div class="datagrid-content">{$invoice->update_time}</div>
+                                    </div>
+                                    <div class="datagrid-item">
+                                        <div class="datagrid-title">支付时间</div>
+                                        <div class="datagrid-content">{$invoice->pay_time}</div>
+                                    </div>
+                                    {if $invoice->status === 'paid_gateway'}
+                                        <div class="datagrid-item">
+                                            <div class="datagrid-title">支付网关单号</div>
+                                            <div class="datagrid-content">{$paylist->tradeno}</div>
+                                        </div>
+                                    {/if}
                                 </div>
-                                {/if}   
                             </div>
                         </div>
-                    </div>
-                    <div class="card my-3">
-                        <div class="card-header">
-                            <h3 class="card-title">账单详情</h3>
-                        </div>
-                        <div class="card-body">
-                            <div class="table-responsive">
-                                <table id="invoice_content_table" class="table table-vcenter card-table">
-                                    <thead>
+                        <div class="card my-3">
+                            <div class="card-header">
+                                <h3 class="card-title">账单详情</h3>
+                            </div>
+                            <div class="card-body">
+                                <div class="table-responsive">
+                                    <table id="invoice_content_table" class="table table-vcenter card-table">
+                                        <thead>
                                         <tr>
                                             <th>名称</th>
                                             <th>价格</th>
                                         </tr>
-                                    </thead>
-                                    <tbody>
+                                        </thead>
+                                        <tbody>
                                         {foreach $invoice_content as $invoice_content_detail}
-                                        <tr>
-                                            <td>{$invoice_content_detail->name}</td>
-                                            <td>{$invoice_content_detail->price}</td>
-                                        </tr>
+                                            <tr>
+                                                <td>{$invoice_content_detail->name}</td>
+                                                <td>{$invoice_content_detail->price}</td>
+                                            </tr>
                                         {/foreach}
-                                    </tbody>
-                                </table>
+                                        </tbody>
+                                    </table>
+                                </div>
                             </div>
                         </div>
                     </div>
-                </div>
-                {if $invoice->status === 'unpaid'}
-                <div class="col-sm-12 col-md-6 col-lg-3">
-                    <div class="card">
-                        <div class="card-header">
-                            <h3 class="card-title">余额支付</h3>
-                        </div>
-                        <div class="card-body">
-                            <div class="mb-3">
-                                当前账户可用余额:<code>{$user->money}</code> 元
+                    {if $invoice->status === 'unpaid'}
+                        <div class="col-sm-12 col-md-6 col-lg-3">
+                            <div class="card">
+                                <div class="card-header">
+                                    <h3 class="card-title">余额支付</h3>
+                                </div>
+                                <div class="card-body">
+                                    <div class="mb-3">
+                                        当前账户可用余额:<code>{$user->money}</code> 元
+                                    </div>
+                                </div>
+                                <div class="card-footer">
+                                    <div class="d-flex">
+                                        <button id="pay-balance" class="btn btn-blue" type="button">支付</button>
+                                    </div>
+                                </div>
                             </div>
-                        </div>
-                        <div class="card-footer">
-                          <div class="d-flex">
-                          <button id="pay-balance" class="btn btn-blue" type="button">支付</button>
-                          </div>
-                        </div>
-                    </div>
-                    {if count($payments) > 0}
-                    <div class="card my-3">
-                        <div class="card-header">
-                            <h3 class="card-title">网关支付</h3>
-                        </div>
-                        <div class="card-body">
-                            {foreach from=$payments item=payment}
-                                <div class="mb-3">
-                                    {$payment_name = $payment::_name()}
-                                    {include file="../../gateway/$payment_name.tpl"}
+                            {if count($payments) > 0}
+                                <div class="card my-3">
+                                    <div class="card-header">
+                                        <h3 class="card-title">网关支付</h3>
+                                    </div>
+                                    <div class="card-body">
+                                        {foreach from=$payments item=payment}
+                                            <div class="mb-3">
+                                                {$payment_name = $payment::_name()}
+                                                {include file="../../gateway/$payment_name.tpl"}
+                                            </div>
+                                        {/foreach}
+                                    </div>
                                 </div>
-                            {/foreach}
+                            {/if}
                         </div>
-                    </div>
                     {/if}
                 </div>
-                {/if}
             </div>
         </div>
-    </div>
 
-    <script>
-        $("#pay-balance").click(function() {
-            $.ajax({
-                url: '/user/invoice/pay_balance',
-                type: 'POST',
-                dataType: "json",
-                data: {
-                    invoice_id: {$invoice->id},
-                },
-                success: function(data) {
-                    if (data.ret === 1) {
-                        $('#success-message').text(data.msg);
-                        $('#success-dialog').modal('show');
-                        setTimeout(function() {
-                            $(location).attr('href', '/user/invoice');
-                        }, 1500);
-                    } else {
-                        $('#fail-message').text(data.msg);
-                        $('#fail-dialog').modal('show');
+        <script>
+            $("#pay-balance").click(function () {
+                $.ajax({
+                    url: '/user/invoice/pay_balance',
+                    type: 'POST',
+                    dataType: "json",
+                    data: {
+                        invoice_id: {$invoice->id},
+                    },
+                    success: function (data) {
+                        if (data.ret === 1) {
+                            $('#success-message').text(data.msg);
+                            $('#success-dialog').modal('show');
+                            setTimeout(function () {
+                                $(location).attr('href', '/user/invoice');
+                            }, 1500);
+                        } else {
+                            $('#fail-message').text(data.msg);
+                            $('#fail-dialog').modal('show');
+                        }
                     }
-                }
-            })
-        });  
-    </script>
+                })
+            });
+        </script>
 
-{include file='user/footer.tpl'}
+        {include file='user/footer.tpl'}

+ 16 - 14
resources/views/tabler/user/money.tpl

@@ -1,7 +1,7 @@
 {include file='user/header.tpl'}
 
 <div class="page-wrapper">
-    <div class="container-xl">       
+    <div class="container-xl">
         <div class="page-header d-print-none text-white">
             <div class="row align-items-center">
                 <div class="col">
@@ -32,14 +32,14 @@
                         <div class="table-responsive">
                             <table class="table card-table table-vcenter text-nowrap datatable">
                                 <thead>
-                                    <tr>
-                                        <th>事件ID</th>
-                                        <th>变动前余额</th>
-                                        <th>变动后余额</th>
-                                        <th>变动金额</th>
-                                        <th>备注</th>
-                                        <th>变动时间</th>
-                                    </tr>
+                                <tr>
+                                    <th>事件ID</th>
+                                    <th>变动前余额</th>
+                                    <th>变动后余额</th>
+                                    <th>变动金额</th>
+                                    <th>备注</th>
+                                    <th>变动时间</th>
+                                </tr>
                                 </thead>
                                 <tbody>
                                 {foreach $moneylogs as $moneylog}
@@ -71,21 +71,23 @@
                 <div class="modal-body">
                     <div class="form-group mb-3 row">
                         <div class="col">
-                            <input id="giftcard" type="text" class="form-control" placeholder="输入礼品卡卡号并点击兑换">
+                            <input id="giftcard" type="text" class="form-control"
+                                   placeholder="输入礼品卡卡号并点击兑换">
                         </div>
                     </div>
                 </div>
                 <div class="modal-footer">
                     <button type="button" class="btn me-auto" data-bs-dismiss="modal">取消</button>
                     <button id="apply-giftcard"
-                            type="button" class="btn btn-primary" data-bs-dismiss="modal">兑换</button>
+                            type="button" class="btn btn-primary" data-bs-dismiss="modal">兑换
+                    </button>
                 </div>
             </div>
         </div>
     </div>
 
     <script>
-        $("#apply-giftcard").click(function() {
+        $("#apply-giftcard").click(function () {
             $.ajax({
                 url: '/user/giftcard',
                 type: 'POST',
@@ -93,7 +95,7 @@
                 data: {
                     giftcard: $('#giftcard').val(),
                 },
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -106,4 +108,4 @@
         });
     </script>
 
-{include file='user/footer.tpl'}
+{include file='user/footer.tpl'}

+ 42 - 40
resources/views/tabler/user/order/create.tpl

@@ -38,42 +38,42 @@
                                     <td class="text-end">{$product->type_text}</td>
                                 </tr>
                                 {if $product->type === 'tabp' || $product->type === 'time'}
-                                <tr>
-                                    <td>商品时长</td>
-                                    <td class="text-end">{$product->content->time} 天</td>
-                                </tr>
-                                <tr>
-                                    <td>等级时长</td>
-                                    <td class="text-end">{$product->content->class_time} 天</td>
-                                </tr>
-                                <tr>
-                                    <td>等级</td>
-                                    <td class="text-end">Lv. {$product->content->class}</td>
-                                </tr>
+                                    <tr>
+                                        <td>商品时长</td>
+                                        <td class="text-end">{$product->content->time} 天</td>
+                                    </tr>
+                                    <tr>
+                                        <td>等级时长</td>
+                                        <td class="text-end">{$product->content->class_time} 天</td>
+                                    </tr>
+                                    <tr>
+                                        <td>等级</td>
+                                        <td class="text-end">Lv. {$product->content->class}</td>
+                                    </tr>
                                 {/if}
                                 {if $product->type === 'tabp' || $product->type === 'bandwidth'}
-                                <tr>
-                                    <td>可用流量</td>
-                                    <td class="text-end">{$product->content->bandwidth} GB</td>
-                                </tr>
+                                    <tr>
+                                        <td>可用流量</td>
+                                        <td class="text-end">{$product->content->bandwidth} GB</td>
+                                    </tr>
                                 {/if}
                                 {if $product->type === 'tabp' || $product->type === 'time'}
-                                <tr>
-                                    <td>速率限制</td>
-                                    {if $product->content->speed_limit === '0'}
-                                    <td class="text-end">不限制</td>
-                                    {else}
-                                    <td class="text-end">{$product->content->speed_limit} Mbps</td>
-                                    {/if}
-                                </tr>
-                                <tr>
-                                    <td>同时连接 IP 限制</td>
-                                    {if $product->content->ip_limit === '0'}
-                                    <td class="text-end">不限制</td>
-                                    {else}
-                                    <td class="text-end">{$product->content->ip_limit}</td>
-                                    {/if}
-                                </tr>
+                                    <tr>
+                                        <td>速率限制</td>
+                                        {if $product->content->speed_limit === '0'}
+                                            <td class="text-end">不限制</td>
+                                        {else}
+                                            <td class="text-end">{$product->content->speed_limit} Mbps</td>
+                                        {/if}
+                                    </tr>
+                                    <tr>
+                                        <td>同时连接 IP 限制</td>
+                                        {if $product->content->ip_limit === '0'}
+                                            <td class="text-end">不限制</td>
+                                        {else}
+                                            <td class="text-end">{$product->content->ip_limit}</td>
+                                        {/if}
+                                    </tr>
                                 {/if}
                             </table>
                         </div>
@@ -112,7 +112,8 @@
                         <div class="card-body">
                             <div class="mb-3">
                                 <div class="input-group mb-2">
-                                    <input id="coupon" type="text" class="form-control" placeholder="填写优惠码,没有请留空">
+                                    <input id="coupon" type="text" class="form-control"
+                                           placeholder="填写优惠码,没有请留空">
                                     <button id="verify-coupon" class="btn" type="button">应用</button>
                                 </div>
                             </div>
@@ -121,7 +122,8 @@
                     <div class="card my-3">
                         <div class="card-body">
                             <button id="create-order" href=""
-                            class="btn btn-primary w-100 my-3">创建订单</button>
+                                    class="btn btn-primary w-100 my-3">创建订单
+                            </button>
                         </div>
                     </div>
                 </div>
@@ -130,7 +132,7 @@
     </div>
 
     <script>
-        $("#verify-coupon").click(function() {
+        $("#verify-coupon").click(function () {
             $.ajax({
                 url: '/user/coupon',
                 type: 'POST',
@@ -139,7 +141,7 @@
                     coupon: $('#coupon').val(),
                     product_id: {$product->id},
                 },
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#coupon-code').text($('#coupon').val());
                         $('#product-buy-discount').text(data.discount);
@@ -152,7 +154,7 @@
             })
         });
 
-        $("#create-order").click(function() {
+        $("#create-order").click(function () {
             $.ajax({
                 url: '/user/order/create',
                 type: 'POST',
@@ -161,11 +163,11 @@
                     coupon: $('#coupon').val(),
                     product_id: {$product->id},
                 },
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-noreload-message').text(data.msg);
                         $('#success-noreload-dialog').modal('show');
-                        setTimeout(function() {
+                        setTimeout(function () {
                             $(location).attr('href', '/user/invoice/' + data.invoice_id + '/view');
                         }, 1500);
                     } else {
@@ -177,4 +179,4 @@
         });
     </script>
 
-{include file='user/footer.tpl'}
+    {include file='user/footer.tpl'}

+ 19 - 14
resources/views/tabler/user/order/index.tpl

@@ -1,13 +1,13 @@
 {include file='user/header.tpl'}
 
-<link href="//cdn.datatables.net/v/bs5/dt-1.13.5/datatables.min.css" rel="stylesheet" />
-<script src="//cdn.datatables.net/v/bs5/dt-1.13.5/datatables.min.js"></script>
+<link href="//cdn.datatables.net/v/bs5/dt-1.13.6/datatables.min.css" rel="stylesheet"/>
+<script src="//cdn.datatables.net/v/bs5/dt-1.13.6/datatables.min.js"></script>
 
 <div class="page-wrapper">
-    <div class="container-xl">       
+    <div class="container-xl">
         <div class="page-header d-print-none text-white">
             <div class="row align-items-center">
-                <div class="col">                   
+                <div class="col">
                     <h2 class="page-title">
                         <span class="home-title my-3">订单列表</span>
                     </h2>
@@ -26,11 +26,11 @@
                         <div class="table-responsive">
                             <table id="data_table" class="table card-table table-vcenter text-nowrap datatable">
                                 <thead>
-                                    <tr>
-                                        {foreach $details['field'] as $key => $value}
+                                <tr>
+                                    {foreach $details['field'] as $key => $value}
                                         <th>{$value}</th>
-                                        {/foreach}
-                                    </tr>
+                                    {/foreach}
+                                </tr>
                                 </thead>
                             </table>
                         </div>
@@ -41,13 +41,13 @@
     </div>
 
     <script>
-       var table = $('#data_table').DataTable({
+        var table = $('#data_table').DataTable({
             ajax: {
                 url: '/user/order/ajax',
                 type: 'POST',
                 dataSrc: 'orders'
             },
-            "autoWidth":false,
+            "autoWidth": false,
             'iDisplayLength': 10,
             'scrollX': true,
             'order': [
@@ -55,11 +55,16 @@
             ],
             columns: [
                 {foreach $details['field'] as $key => $value}
-                { data: '{$key}' },
+                {
+                    data: '{$key}'
+                },
                 {/foreach}
             ],
-            "columnDefs":[
-                { targets:[0],orderable:false }
+            "columnDefs": [
+                {
+                    targets: [0],
+                    orderable: false
+                }
             ],
             "dom": "<'row px-3 py-3'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
                 "<'row'<'col-sm-12'tr>>" +
@@ -101,4 +106,4 @@
         loadTable();
     </script>
 
-{include file='user/footer.tpl'}
+    {include file='user/footer.tpl'}

+ 41 - 41
resources/views/tabler/user/order/view.tpl

@@ -69,46 +69,46 @@
                 <div class="card-body">
                     <div class="datagrid">
                         {if $order->product_type === 'tabp' || $order->product_type === 'time'}
-                        <div class="datagrid-item">
-                            <div class="datagrid-title">商品时长 (天)</div>
-                            <div class="datagrid-content">{$order->content->time}</div>
-                        </div>
-                        <div class="datagrid-item">
-                            <div class="datagrid-title">等级时长 (天)</div>
-                            <div class="datagrid-content">{$order->content->class_time}</div>
-                        </div>
-                        <div class="datagrid-item">
-                            <div class="datagrid-title">等级</div>
-                            <div class="datagrid-content">{$order->content->class}</div>
-                        </div>
+                            <div class="datagrid-item">
+                                <div class="datagrid-title">商品时长 (天)</div>
+                                <div class="datagrid-content">{$order->content->time}</div>
+                            </div>
+                            <div class="datagrid-item">
+                                <div class="datagrid-title">等级时长 (天)</div>
+                                <div class="datagrid-content">{$order->content->class_time}</div>
+                            </div>
+                            <div class="datagrid-item">
+                                <div class="datagrid-title">等级</div>
+                                <div class="datagrid-content">{$order->content->class}</div>
+                            </div>
                         {/if}
                         {if $order->product_type === 'tabp' || $order->product_type === 'bandwidth'}
-                        <div class="datagrid-item">
-                            <div class="datagrid-title">可用流量 (GB)</div>
-                            <div class="datagrid-content">{$order->content->bandwidth}</div>
-                        </div>
+                            <div class="datagrid-item">
+                                <div class="datagrid-title">可用流量 (GB)</div>
+                                <div class="datagrid-content">{$order->content->bandwidth}</div>
+                            </div>
                         {/if}
                         {if $order->product_type === 'tabp' || $order->product_type === 'time'}
-                        <div class="datagrid-item">
-                            <div class="datagrid-title">速率限制 (Mbps)</div>
-                            <div class="datagrid-content">
-                            {if $order->content->ip_limit === '0'}
-                            不限制
-                            {else}
-                            {$order->content->speed_limit}
-                            {/if}
+                            <div class="datagrid-item">
+                                <div class="datagrid-title">速率限制 (Mbps)</div>
+                                <div class="datagrid-content">
+                                    {if $order->content->ip_limit === '0'}
+                                        不限制
+                                    {else}
+                                        {$order->content->speed_limit}
+                                    {/if}
+                                </div>
                             </div>
-                        </div>
-                        <div class="datagrid-item">
-                            <div class="datagrid-title">同时连接IP限制</div>
-                            <div class="datagrid-content">
-                            {if $order->content->ip_limit === '0'}
-                            不限制
-                            {else}
-                            {$order->content->ip_limit}
-                            {/if}
+                            <div class="datagrid-item">
+                                <div class="datagrid-title">同时连接IP限制</div>
+                                <div class="datagrid-content">
+                                    {if $order->content->ip_limit === '0'}
+                                        不限制
+                                    {else}
+                                        {$order->content->ip_limit}
+                                    {/if}
+                                </div>
                             </div>
-                        </div>
                         {/if}
                     </div>
                 </div>
@@ -125,18 +125,18 @@
                                 <div class="table-responsive">
                                     <table id="invoice_content_table" class="table table-vcenter card-table">
                                         <thead>
-                                            <tr>
-                                                <th>名称</th>
-                                                <th>价格</th>
-                                            </tr>
+                                        <tr>
+                                            <th>名称</th>
+                                            <th>价格</th>
+                                        </tr>
                                         </thead>
                                         <tbody>
-                                            {foreach $invoice->content as $invoice_content}
+                                        {foreach $invoice->content as $invoice_content}
                                             <tr>
                                                 <td>{$invoice_content->name}</td>
                                                 <td>{$invoice_content->price}</td>
                                             </tr>
-                                            {/foreach}
+                                        {/foreach}
                                         </tbody>
                                     </table>
                                 </div>
@@ -168,4 +168,4 @@
         </div>
     </div>
 
-{include file='user/footer.tpl'}
+    {include file='user/footer.tpl'}

+ 55 - 20
resources/views/tabler/user/product.tpl

@@ -60,24 +60,35 @@
                                                             <div class="list-group-item">
                                                                 <div class="row align-items-center">
                                                                     <div class="col text-truncate">
-                                                                        <div class="text-reset d-block">Lv. {$tabp->content->class}</div>
-                                                                        <div class="d-block text-secondary text-truncate mt-n1">等级</div>
+                                                                        <div class="text-reset d-block">
+                                                                            Lv. {$tabp->content->class}</div>
+                                                                        <div class="d-block text-secondary text-truncate mt-n1">
+                                                                            等级
+                                                                        </div>
                                                                     </div>
                                                                 </div>
                                                             </div>
                                                             <div class="list-group-item">
                                                                 <div class="row align-items-center">
                                                                     <div class="col text-truncate">
-                                                                        <div class="text-reset d-block">{$tabp->content->class_time} 天</div>
-                                                                        <div class="d-block text-secondary text-truncate mt-n1">等级时长</div>
+                                                                        <div class="text-reset d-block">{$tabp->content->class_time}
+                                                                            天
+                                                                        </div>
+                                                                        <div class="d-block text-secondary text-truncate mt-n1">
+                                                                            等级时长
+                                                                        </div>
                                                                     </div>
                                                                 </div>
                                                             </div>
                                                             <div class="list-group-item">
                                                                 <div class="row align-items-center">
                                                                     <div class="col text-truncate">
-                                                                        <div class="text-reset d-block">{$tabp->content->bandwidth} GB</div>
-                                                                        <div class="d-block text-secondary text-truncate mt-n1">可用流量</div>
+                                                                        <div class="text-reset d-block">{$tabp->content->bandwidth}
+                                                                            GB
+                                                                        </div>
+                                                                        <div class="d-block text-secondary text-truncate mt-n1">
+                                                                            可用流量
+                                                                        </div>
                                                                     </div>
                                                                 </div>
                                                             </div>
@@ -87,9 +98,13 @@
                                                                         {if $tabp->content->speed_limit === '0'}
                                                                             <div class="text-reset d-block">不限制</div>
                                                                         {else}
-                                                                            <div class="text-reset d-block">{$tabp->content->speed_limit} Mbps</div>
+                                                                            <div class="text-reset d-block">{$tabp->content->speed_limit}
+                                                                                Mbps
+                                                                            </div>
                                                                         {/if}
-                                                                        <div class="d-block text-secondary text-truncate mt-n1">连接速度</div>
+                                                                        <div class="d-block text-secondary text-truncate mt-n1">
+                                                                            连接速度
+                                                                        </div>
                                                                     </div>
                                                                 </div>
                                                             </div>
@@ -101,7 +116,9 @@
                                                                         {else}
                                                                             <div class="text-reset d-block">{$tabp->content->ip_limit}</div>
                                                                         {/if}
-                                                                        <div class="d-block text-secondary text-truncate mt-n1">同时连接 IP 数</div>
+                                                                        <div class="d-block text-secondary text-truncate mt-n1">
+                                                                            同时连接 IP 数
+                                                                        </div>
                                                                     </div>
                                                                 </div>
                                                             </div>
@@ -143,8 +160,12 @@
                                                             <div class="list-group-item">
                                                                 <div class="row align-items-center">
                                                                     <div class="col text-truncate">
-                                                                        <div class="text-reset d-block">{$bandwidth->content->bandwidth} GB</div>
-                                                                        <div class="d-block text-secondary text-truncate mt-n1">可用流量</div>
+                                                                        <div class="text-reset d-block">{$bandwidth->content->bandwidth}
+                                                                            GB
+                                                                        </div>
+                                                                        <div class="d-block text-secondary text-truncate mt-n1">
+                                                                            可用流量
+                                                                        </div>
                                                                     </div>
                                                                 </div>
                                                             </div>
@@ -179,23 +200,31 @@
                                                             {$time->name}
                                                         </div>
                                                         <div id="product-{$time->id}-price"
-                                                             class="display-6 my-3"><p class="fw-bold">{$time->price}</p>
+                                                             class="display-6 my-3"><p
+                                                                    class="fw-bold">{$time->price}</p>
                                                             <i class="ti ti-currency-yuan"></i>
                                                         </div>
                                                         <div class="list-group list-group-flush">
                                                             <div class="list-group-item">
                                                                 <div class="row align-items-center">
                                                                     <div class="col text-truncate">
-                                                                        <div class="text-reset d-block">Lv. {$time->content->class}</div>
-                                                                        <div class="d-block text-secondary text-truncate mt-n1">等级</div>
+                                                                        <div class="text-reset d-block">
+                                                                            Lv. {$time->content->class}</div>
+                                                                        <div class="d-block text-secondary text-truncate mt-n1">
+                                                                            等级
+                                                                        </div>
                                                                     </div>
                                                                 </div>
                                                             </div>
                                                             <div class="list-group-item">
                                                                 <div class="row align-items-center">
                                                                     <div class="col text-truncate">
-                                                                        <div class="text-reset d-block">{$time->content->class_time} 天</div>
-                                                                        <div class="d-block text-secondary text-truncate mt-n1">等级时长</div>
+                                                                        <div class="text-reset d-block">{$time->content->class_time}
+                                                                            天
+                                                                        </div>
+                                                                        <div class="d-block text-secondary text-truncate mt-n1">
+                                                                            等级时长
+                                                                        </div>
                                                                     </div>
                                                                 </div>
                                                             </div>
@@ -205,9 +234,13 @@
                                                                         {if $time->content->speed_limit === '0'}
                                                                             <div class="text-reset d-block">不限制</div>
                                                                         {else}
-                                                                            <div class="text-reset d-block">{$time->content->speed_limit} Mbps</div>
+                                                                            <div class="text-reset d-block">{$time->content->speed_limit}
+                                                                                Mbps
+                                                                            </div>
                                                                         {/if}
-                                                                        <div class="d-block text-secondary text-truncate mt-n1">连接速度</div>
+                                                                        <div class="d-block text-secondary text-truncate mt-n1">
+                                                                            连接速度
+                                                                        </div>
                                                                     </div>
                                                                 </div>
                                                             </div>
@@ -219,7 +252,9 @@
                                                                         {else}
                                                                             <div class="text-reset d-block">{$time->content->ip_limit}</div>
                                                                         {/if}
-                                                                        <div class="d-block text-secondary text-truncate mt-n1">同时连接 IP 数</div>
+                                                                        <div class="d-block text-secondary text-truncate mt-n1">
+                                                                            同时连接 IP 数
+                                                                        </div>
                                                                     </div>
                                                                 </div>
                                                             </div>
@@ -251,4 +286,4 @@
         </div>
     </div>
 
-{include file='user/footer.tpl'}
+    {include file='user/footer.tpl'}

+ 11 - 11
resources/views/tabler/user/profile.tpl

@@ -1,10 +1,10 @@
 {include file='user/header.tpl'}
 
 <div class="page-wrapper">
-    <div class="container-xl">  
+    <div class="container-xl">
         <div class="page-header d-print-none text-white">
             <div class="row align-items-center">
-                <div class="col">     
+                <div class="col">
                     <h2 class="page-title">
                         <span class="home-title">账户信息</span>
                     </h2>
@@ -68,20 +68,20 @@
                         <div class="table-responsive">
                             <table class="table table-vcenter text-nowrap card-table">
                                 <thead>
-                                    <tr>
-                                        <th>IP</th>
-                                        <th>时间</th>
-                                        <th>IP归属地</th>
-                                    </tr>
+                                <tr>
+                                    <th>IP</th>
+                                    <th>时间</th>
+                                    <th>IP归属地</th>
+                                </tr>
                                 </thead>
                                 <tbody>
-                                    {foreach $logins as $login}
+                                {foreach $logins as $login}
                                     <tr>
                                         <td>{$login->ip}</td>
                                         <td>{$login->datetime}</td>
                                         <td>{$login->location}</td>
                                     </tr>
-                                    {/foreach}
+                                {/foreach}
                                 </tbody>
                             </table>
                         </div>
@@ -119,5 +119,5 @@
             </div>
         </div>
     </div>
-    
-{include file='user/footer.tpl'}
+
+{include file='user/footer.tpl'}

+ 14 - 14
resources/views/tabler/user/server.tpl

@@ -27,15 +27,15 @@
                                         <div class="col-lg-4 col-md-6 col-sm-12">
                                             <div class="card">
                                                 {if $server["class"] === 0}
-                                                <div class="ribbon bg-blue">免费</div>
+                                                    <div class="ribbon bg-blue">免费</div>
                                                 {else}
-                                                <div class="ribbon bg-blue">LV. {$server["class"]}</div>
+                                                    <div class="ribbon bg-blue">LV. {$server["class"]}</div>
                                                 {/if}
                                                 <div class="card-body">
                                                     <div class="row g-3 align-items-center">
                                                         <div class="col-auto">
                                                             <span
-                                                                class="status-indicator status-{$server["color"]}
+                                                                    class="status-indicator status-{$server["color"]}
                                                                  status-indicator-animated">
                                                                 <span class="status-indicator-circle"></span>
                                                                 <span class="status-indicator-circle"></span>
@@ -46,7 +46,7 @@
                                                             <h2 class="page-title" style="font-size: 16px;">
                                                                 {$server["name"]}&nbsp;
                                                                 <span class="card-subtitle my-2"
-                                                                    style="font-size: 10px;">
+                                                                      style="font-size: 10px;">
                                                                     {$server["node_bandwidth"]} /
                                                                     {$server["node_bandwidth_limit"]}
                                                                 </span>
@@ -72,15 +72,15 @@
                                                 </div>
                                             </div>
                                             {if $user->class < $server["class"]}
-                                            <div class="card bg-primary-lt">
-                                                <div class="card-body">
-                                                    <p class="text-secondary">
-                                                        <i class="ti ti-info-circle icon text-blue"></i>
-                                                        你当前的账户等级小于节点等级,因此无法使用。可前往 <a
-                                                            href="/user/product">商品页面</a> 订购时间流量包
-                                                    </p>
+                                                <div class="card bg-primary-lt">
+                                                    <div class="card-body">
+                                                        <p class="text-secondary">
+                                                            <i class="ti ti-info-circle icon text-blue"></i>
+                                                            你当前的账户等级小于节点等级,因此无法使用。可前往 <a
+                                                                    href="/user/product">商品页面</a> 订购时间流量包
+                                                        </p>
+                                                    </div>
                                                 </div>
-                                            </div>
                                             {/if}
                                         </div>
                                     {/foreach}
@@ -92,5 +92,5 @@
             </div>
         </div>
     </div>
-    
-{include file="user/footer.tpl"}
+
+    {include file="user/footer.tpl"}

+ 13 - 13
resources/views/tabler/user/subscribe_log.tpl

@@ -1,10 +1,10 @@
 {include file='user/header.tpl'}
 
 <div class="page-wrapper">
-    <div class="container-xl">  
+    <div class="container-xl">
         <div class="page-header d-print-none text-white">
             <div class="row align-items-center">
-                <div class="col">                    
+                <div class="col">
                     <h2 class="page-title">
                         <span class="home-title">订阅记录</span>
                     </h2>
@@ -23,17 +23,17 @@
                         <div class="table-responsive">
                             <table class="table table-vcenter card-table">
                                 <thead>
-                                    <tr>
-                                        <th>事件ID</th>
-                                        <th>类型</th>
-                                        <th>IP</th>
-                                        <th>归属</th>
-                                        <th>时间</th>
-                                        <th>标识</th>
-                                    </tr>
+                                <tr>
+                                    <th>事件ID</th>
+                                    <th>类型</th>
+                                    <th>IP</th>
+                                    <th>归属</th>
+                                    <th>时间</th>
+                                    <th>标识</th>
+                                </tr>
                                 </thead>
                                 <tbody>
-                                    {foreach $logs as $log}
+                                {foreach $logs as $log}
                                     <tr>
                                         <td>#{$log->id}</td>
                                         <td>{$log->type}</td>
@@ -42,7 +42,7 @@
                                         <td>{$log->request_time}</td>
                                         <td>{$log->request_user_agent}</td>
                                     </tr>
-                                    {/foreach}
+                                {/foreach}
                                 </tbody>
                             </table>
                         </div>
@@ -52,4 +52,4 @@
         </div>
     </div>
 
-{include file='user/footer.tpl'}
+{include file='user/footer.tpl'}

+ 20 - 18
resources/views/tabler/user/ticket/index.tpl

@@ -15,7 +15,7 @@
                 <div class="col-auto">
                     <div class="btn-list">
                         <button href="#" class="btn btn-primary" data-bs-toggle="modal"
-                            data-bs-target="#create-ticket">
+                                data-bs-target="#create-ticket">
                             <i class="icon ti ti-plus"></i>
                             创建工单
                         </button>
@@ -36,13 +36,13 @@
                                         <div class="card-body">
                                             <div class="card-stamp">
                                                 {if $ticket->status !== 'closed'}
-                                                <div class="card-stamp-icon bg-yellow">
-                                                    <i class="ti ti-clock"></i>
-                                                </div>
+                                                    <div class="card-stamp-icon bg-yellow">
+                                                        <i class="ti ti-clock"></i>
+                                                    </div>
                                                 {else}
-                                                <div class="card-stamp-icon bg-green">
-                                                    <i class="ti ti-check"></i>
-                                                </div>
+                                                    <div class="card-stamp-icon bg-green">
+                                                        <i class="ti ti-check"></i>
+                                                    </div>
                                                 {/if}
                                             </div>
                                             <h3 class="card-title" style="font-size: 20px;">
@@ -59,19 +59,19 @@
                                                 <!-- 工单类型标签 -->
                                                 <span class="status status-grey">{$ticket->type}</span>
                                                 <a href="/user/ticket/{$ticket->id}/view"
-                                                    class="btn btn-primary ms-auto">查看</a>
+                                                   class="btn btn-primary ms-auto">查看</a>
                                             </div>
                                         </div>
                                     </div>
                                 </div>
                             {/foreach}
                         {else}
-                        <div class="card">
-                            <div class="card-header">
-                                <h3 class="card-title">没有任何工单</h3>
+                            <div class="card">
+                                <div class="card-header">
+                                    <h3 class="card-title">没有任何工单</h3>
+                                </div>
+                                <div class="card-body">如需帮助,请点击右上角按钮开启新工单</div>
                             </div>
-                            <div class="card-body">如需帮助,请点击右上角按钮开启新工单</div>
-                        </div>
                         {/if}
                     </div>
                 </div>
@@ -100,20 +100,22 @@
                         <input id="ticket-title" type="text" class="form-control" placeholder="请输入工单主题">
                     </div>
                     <div class="mb-3">
-                        <textarea id="ticket-comment" class="form-control" rows="12" placeholder="请输入工单内容"></textarea>
+                        <textarea id="ticket-comment" class="form-control" rows="12"
+                                  placeholder="请输入工单内容"></textarea>
                     </div>
                 </div>
                 <div class="modal-footer">
                     <button type="button" class="btn me-auto" data-bs-dismiss="modal">取消</button>
                     <button id="create-ticket-button" type="button" class="btn btn-primary"
-                        data-bs-dismiss="modal">创建</button>
+                            data-bs-dismiss="modal">创建
+                    </button>
                 </div>
             </div>
         </div>
     </div>
 
     <script>
-        $("#create-ticket-button").click(function() {
+        $("#create-ticket-button").click(function () {
             $.ajax({
                 type: "POST",
                 url: "/user/ticket",
@@ -123,7 +125,7 @@
                     comment: $('#ticket-comment').val(),
                     type: $('#ticket-type').val(),
                 },
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -136,4 +138,4 @@
         });
     </script>
 
-{include file='user/footer.tpl'}
+{include file='user/footer.tpl'}

+ 26 - 24
resources/views/tabler/user/ticket/view.tpl

@@ -13,15 +13,15 @@
                     </div>
                 </div>
                 {if $ticket->status !== 'closed'}
-                <div class="col-auto">
-                    <div class="btn-list">
-                        <a href="#" class="btn btn-primary" data-bs-toggle="modal"
-                            data-bs-target="#add-reply">
-                            <i class="icon ti ti-plus"></i>
-                            添加回复
-                        </a>
+                    <div class="col-auto">
+                        <div class="btn-list">
+                            <a href="#" class="btn btn-primary" data-bs-toggle="modal"
+                               data-bs-target="#add-reply">
+                                <i class="icon ti ti-plus"></i>
+                                添加回复
+                            </a>
+                        </div>
                     </div>
-                </div>
                 {/if}
             </div>
         </div>
@@ -77,21 +77,22 @@
                         <div class="card-body">
                             <div class="divide-y">
                                 {foreach $comments as $comment}
-                                <div>
-                                    <div class="row">
-                                        <div class="col">
-                                            <div>
-                                                {nl2br($comment->comment)}
+                                    <div>
+                                        <div class="row">
+                                            <div class="col">
+                                                <div>
+                                                    {nl2br($comment->comment)}
+                                                </div>
+                                                <div class="text-secondary my-1">{$comment->commenter_name}
+                                                    回复于 {$comment->datetime}</div>
                                             </div>
-                                            <div class="text-secondary my-1">{$comment->commenter_name} 回复于 {$comment->datetime}</div>
-                                        </div>
-                                        <div class="col-auto">
-                                            <div>
-                                                # {$comment->comment_id + 1}
+                                            <div class="col-auto">
+                                                <div>
+                                                    # {$comment->comment_id + 1}
+                                                </div>
                                             </div>
                                         </div>
                                     </div>
-                                </div>
                                 {/foreach}
                             </div>
                         </div>
@@ -110,7 +111,8 @@
                 </div>
                 <div class="modal-body">
                     <div class="mb-3">
-                        <textarea id="reply-comment" class="form-control" rows="10" placeholder="请输入回复内容"></textarea>
+                        <textarea id="reply-comment" class="form-control" rows="10"
+                                  placeholder="请输入回复内容"></textarea>
                     </div>
                 </div>
                 <div class="modal-footer">
@@ -122,7 +124,7 @@
     </div>
 
     <script>
-        $("#reply").click(function() {
+        $("#reply").click(function () {
             $.ajax({
                 url: "/user/ticket/{$ticket->id}",
                 type: 'PUT',
@@ -130,7 +132,7 @@
                 data: {
                     comment: $('#reply-comment').val()
                 },
-                success: function(data) {
+                success: function (data) {
                     if (data.ret === 1) {
                         $('#success-message').text(data.msg);
                         $('#success-dialog').modal('show');
@@ -142,5 +144,5 @@
             })
         });
     </script>
-    
-{include file='user/footer.tpl'}
+
+    {include file='user/footer.tpl'}

+ 0 - 1
src/Controllers/WebAPI/NodeController.php

@@ -32,7 +32,6 @@ final class NodeController extends BaseController
             'node_class' => $node->node_class,
             'node_speedlimit' => $node->node_speedlimit,
             'traffic_rate' => $node->traffic_rate,
-            'mu_only' => 0,
             'sort' => $node->sort,
             'server' => $node->server,
             'custom_config' => json_decode($node->custom_config, true, JSON_UNESCAPED_SLASHES),

+ 0 - 2
src/Controllers/WebAPI/UserController.php

@@ -115,8 +115,6 @@ final class UserController extends BaseController
                 $user_raw->passwd = Tools::genSs2022UserPk($user_raw->passwd, $pk_len);
             }
 
-            $user_raw->node_connector = 0;
-
             foreach ($keys_unset as $key) {
                 unset($user_raw->$key);
             }

+ 103 - 0
src/Services/DynamicRate.php

@@ -0,0 +1,103 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Services;
+
+final class DynamicRate
+{
+    public static function getFullDayRates(
+        float $max_rate,
+        int $max_rate_time,
+        float $min_rate,
+        int $min_rate_time,
+        string $method = 'logistic',
+    ): array|string {
+        if (! self::validateData($max_rate, $max_rate_time, $min_rate, $min_rate_time)) {
+            return 'Invalid data';
+        }
+
+        $rates = [];
+
+        for ($i = 0; $i < 24; $i++) {
+            $rates[] = self::getRateByTime($max_rate, $max_rate_time, $min_rate, $min_rate_time, $i, $method);
+        }
+
+        return $rates;
+    }
+
+    public static function getRateByTime(
+        float $max_rate,
+        int $max_rate_time,
+        float $min_rate,
+        int $min_rate_time,
+        int $time,
+        string $method = 'logistic',
+    ): float|string {
+        if (! self::validateData($max_rate, $max_rate_time, $min_rate, $min_rate_time)) {
+            return 'Invalid data';
+        }
+
+        if ($time === $max_rate_time || $max_rate_time === $min_rate_time || $max_rate === $min_rate) {
+            return $max_rate;
+        }
+
+        if ($time === $min_rate_time) {
+            return $min_rate;
+        }
+
+        if ($time < $min_rate_time) {
+            $time += 24;
+        }
+
+        if ($time > $max_rate_time) {
+            $min_rate_time += 24;
+        }
+
+        return match ($method) {
+            'logistic' => self::logistic($max_rate, $max_rate_time, $min_rate, $min_rate_time, $time),
+            'linear' => self::linear($max_rate, $max_rate_time, $min_rate, $min_rate_time, $time),
+        };
+    }
+
+    public static function validateData(
+        float $max_rate,
+        int $max_rate_time,
+        float $min_rate,
+        int $min_rate_time,
+    ): bool {
+        return ! ($max_rate < 0 ||
+            $min_rate < 0 ||
+            $max_rate_time < 0 ||
+            $min_rate_time < 0 ||
+            $max_rate_time > 24 ||
+            $min_rate_time > 24 ||
+            $min_rate_time > $max_rate_time);
+    }
+
+    public static function logistic(
+        float $max_rate,
+        int $max_rate_time,
+        float $min_rate,
+        int $min_rate_time,
+        int $time,
+    ): float {
+        $k = $time < $max_rate_time ? -0.7 : 1.3;
+        $e = M_E;
+
+        return ($max_rate - $min_rate) / (1 + $e ** ($k * ($time - ($max_rate_time + $min_rate_time) / 2))) + $min_rate;
+    }
+
+    public static function linear(
+        float $max_rate,
+        int $max_rate_time,
+        float $min_rate,
+        int $min_rate_time,
+        int $time,
+    ): float {
+        $k = ($max_rate - $min_rate) / ($max_rate_time - $min_rate_time);
+        $b = $max_rate - $k * $max_rate_time;
+
+        return $k * $time + $b;
+    }
+}

+ 5 - 5
src/Services/Gateway/Epay.php

@@ -31,7 +31,7 @@ final class Epay extends AbstractPayment
         $this->epay['apiurl'] = Setting::obtain('epay_url');//易支付API地址
         $this->epay['partner'] = Setting::obtain('epay_pid');//易支付商户pid
         $this->epay['key'] = Setting::obtain('epay_key');//易支付商户Key
-        $this->epay['sign_type'] = strtoupper('MD5'); //签名方式
+        $this->epay['sign_type'] = strtoupper('SHA256'); //签名方式
         $this->epay['input_charset'] = strtolower('utf-8');//字符编码
         $this->epay['transport'] = 'https';//协议 http 或者https
     }
@@ -97,16 +97,16 @@ final class Epay extends AbstractPayment
             'sitename' => $_ENV['appName'],
         ];
 
-        $alipaySubmit = new EpaySubmit($this->epay);
-        $html_text = $alipaySubmit->buildRequestForm($data);
+        $epaySubmit = new EpaySubmit($this->epay);
+        $html_text = $epaySubmit->buildRequestForm($data);
 
         return $response->write($html_text);
     }
 
     public function notify($request, $response, $args): ResponseInterface
     {
-        $alipayNotify = new EpayNotify($this->epay);
-        $verify_result = $alipayNotify->verifyNotify();
+        $epayNotify = new EpayNotify($this->epay);
+        $verify_result = $epayNotify->verifyNotify();
 
         if ($verify_result) {
             $out_trade_no = $_GET['out_trade_no'];

+ 6 - 12
src/Services/Gateway/Epay/EpayNotify.php

@@ -8,11 +8,11 @@ use function is_null;
 
 final class EpayNotify
 {
-    private array $alipay_config;
+    private array $epay_config;
 
-    public function __construct($alipay_config)
+    public function __construct($epay_config)
     {
-        $this->alipay_config = $alipay_config;
+        $this->epay_config = $epay_config;
     }
 
     public function verifyNotify(): bool
@@ -20,14 +20,8 @@ final class EpayNotify
         if (is_null($_GET)) {//判断POST来的数组是否为空
             return false;
         }
-        //生成签名结果
-        $isSign = $this->getSignVeryfy($_GET, $_GET['sign']);
-        //获取支付宝远程服务器ATN结果(验证是否是支付宝发来的消息)
-        $responseTxt = 'true';
-        //验证
-        //$responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
-        //isSign的结果不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
-        if (preg_match('/true$/i', $responseTxt) && $isSign) {
+
+        if ($this->getSignVeryfy($_GET, $_GET['sign'])) {
             return true;
         }
 
@@ -43,6 +37,6 @@ final class EpayNotify
         //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
         $prestr = EpayTool::createLinkstring($para_sort);
 
-        return EpayTool::verify($prestr, $sign, $this->alipay_config['key']);
+        return EpayTool::verify($prestr, $sign, $this->epay_config['key']);
     }
 }

+ 13 - 13
src/Services/Gateway/Epay/EpaySubmit.php

@@ -6,13 +6,13 @@ namespace App\Services\Gateway\Epay;
 
 final class EpaySubmit
 {
-    private array $alipay_config;
-    private string $alipay_gateway_new;
+    private array $epay_config;
+    private string $epay_gateway;
 
-    public function __construct($alipay_config)
+    public function __construct($epay_config)
     {
-        $this->alipay_config = $alipay_config;
-        $this->alipay_gateway_new = $this->alipay_config['apiurl'] . 'submit.php?';
+        $this->epay_config = $epay_config;
+        $this->epay_gateway = $this->epay_config['apiurl'] . 'submit.php?';
     }
 
     public function buildRequestMysign($para_sort): string
@@ -20,7 +20,7 @@ final class EpaySubmit
         //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
         $prestr = EpayTool::createLinkstring($para_sort);
 
-        return EpayTool::sign($prestr, $this->alipay_config['key']);
+        return EpayTool::sign($prestr, $this->epay_config['key']);
     }
 
     public function buildRequestPara($para_temp)
@@ -33,7 +33,7 @@ final class EpaySubmit
         $mysign = $this->buildRequestMysign($para_sort);
         //签名结果与签名方式加入请求提交参数组中
         $para_sort['sign'] = $mysign;
-        $para_sort['sign_type'] = strtoupper(trim($this->alipay_config['sign_type']));
+        $para_sort['sign_type'] = strtoupper(trim($this->epay_config['sign_type']));
 
         return $para_sort;
     }
@@ -42,16 +42,16 @@ final class EpaySubmit
     {
         //待请求参数数组
         $para = $this->buildRequestPara($para_temp);
-        $sHtml = "<form id='alipaysubmit' name='alipaysubmit' action='".
-            $this->alipay_gateway_new . "' method='" . $method . "'>";
+        $html = "<form id='alipaysubmit' name='alipaysubmit' action='".
+            $this->epay_gateway . "' method='" . $method . "'>";
 
         foreach ($para as $key => $val) {
-            $sHtml .= "<input type='hidden' name='".$key."' value='".$val."'/>";
+            $html .= "<input type='hidden' name='".$key."' value='".$val."'/>";
         }
         //submit按钮控件请不要含有name属性
-        $sHtml .= "<input type='submit' value='".$button_name."'></form>";
-        $sHtml .= "<script>document.forms['alipaysubmit'].submit();</script>";
+        $html .= "<input type='submit' value='".$button_name."'></form>";
+        $html .= "<script>document.forms['alipaysubmit'].submit();</script>";
 
-        return $sHtml;
+        return $html;
     }
 }

+ 2 - 2
src/Services/Gateway/Epay/EpayTool.php

@@ -19,9 +19,9 @@ final class EpayTool
     public static function verify($prestr, $sign, $key): bool
     {
         $prestr .= $key;
-        $correct_sgin = hash('sha256', $prestr);
+        $correct_sign = hash('sha256', $prestr);
 
-        return $correct_sgin === $sign;
+        return $correct_sign === $sign;
     }
 
     public static function createLinkstring($para): string

+ 1 - 2
src/Services/Subscribe/Clash.php

@@ -7,7 +7,6 @@ namespace App\Services\Subscribe;
 use App\Services\Subscribe;
 use Symfony\Component\Yaml\Yaml;
 use function array_merge;
-use function in_array;
 use function json_decode;
 
 final class Clash extends Base
@@ -97,7 +96,7 @@ final class Clash extends Base
                     $host = $node_custom_config['header']['request']['headers']['Host'][0] ??
                         $node_custom_config['host'] ?? '';
                     $allow_insecure = $node_custom_config['allow_insecure'] ?? false;
-                    $tls = in_array($security, ['tls', 'xtls']);
+                    $tls = $security === 'tls';
                     // Clash 特定配置
                     $udp = $node_custom_config['udp'] ?? true;
                     $ws_opts = $node_custom_config['ws-opts'] ?? $node_custom_config['ws_opts'] ?? null;

+ 1 - 2
src/Services/Subscribe/SingBox.php

@@ -82,7 +82,6 @@ final class SingBox extends Base
                     break;
                 case 11:
                     $v2_port = $node_custom_config['offset_port_user'] ?? ($node_custom_config['offset_port_node'] ?? 443);
-                    $security = $node_custom_config['security'] ?? 'auto';
                     $transport = ($node_custom_config['network'] ?? '') === 'tcp' ? '' : $node_custom_config['network'];
                     $host = $node_custom_config['header']['request']['headers']['Host'][0] ??
                         $node_custom_config['host'] ?? '';
@@ -96,7 +95,7 @@ final class SingBox extends Base
                         'server' => $node_raw->server,
                         'server_port' => (int) $v2_port,
                         'uuid' => $user->uuid,
-                        'security' => $security,
+                        'security' => 'auto',
                         'alter_id' => 0,
                         'tls' => [
                             'server_name' => $host,

+ 0 - 0
storage/framework/views/.gitkeep → storage/framework/twig/.gitkeep