Pārlūkot izejas kodu

feat: node bandwidth reset

M1Screw 1 gadu atpakaļ
vecāks
revīzija
fbe69b05c0

+ 24 - 5
app/routes.php

@@ -142,7 +142,14 @@ return static function (Slim\App $app): void {
         $group->get('/node/create', App\Controllers\Admin\NodeController::class . ':create');
         $group->post('/node', App\Controllers\Admin\NodeController::class . ':add');
         $group->get('/node/{id:[0-9]+}/edit', App\Controllers\Admin\NodeController::class . ':edit');
-        $group->post('/node/{id:[0-9]+}/reset', App\Controllers\Admin\NodeController::class . ':reset');
+        $group->post(
+            '/node/{id:[0-9]+}/reset_password',
+            App\Controllers\Admin\NodeController::class . ':resetPassword'
+        );
+        $group->post(
+            '/node/{id:[0-9]+}/reset_bandwidth',
+            App\Controllers\Admin\NodeController::class . ':resetBandwidth'
+        );
         $group->post('/node/{id:[0-9]+}/copy', App\Controllers\Admin\NodeController::class . ':copy');
         $group->put('/node/{id:[0-9]+}', App\Controllers\Admin\NodeController::class . ':update');
         $group->delete('/node/{id:[0-9]+}', App\Controllers\Admin\NodeController::class . ':delete');
@@ -246,10 +253,22 @@ return static function (Slim\App $app): void {
         $group->get('/setting/support', App\Controllers\Admin\Setting\SupportController::class . ':index');
         $group->post('/setting/support', App\Controllers\Admin\Setting\SupportController::class . ':save');
         // 设置测试
-        $group->post('/setting/test/email', App\Controllers\Admin\Setting\EmailController::class . ':testEmail');
-        $group->post('/setting/test/telegram', App\Controllers\Admin\Setting\ImController::class . ':testTelegram');
-        $group->post('/setting/test/discord', App\Controllers\Admin\Setting\ImController::class . ':testDiscord');
-        $group->post('/setting/test/slack', App\Controllers\Admin\Setting\ImController::class . ':testSlack');
+        $group->post(
+            '/setting/test/email',
+            App\Controllers\Admin\Setting\EmailController::class . ':testEmail'
+        );
+        $group->post(
+            '/setting/test/telegram',
+            App\Controllers\Admin\Setting\ImController::class . ':testTelegram'
+        );
+        $group->post(
+            '/setting/test/discord',
+            App\Controllers\Admin\Setting\ImController::class . ':testDiscord'
+        );
+        $group->post(
+            '/setting/test/slack',
+            App\Controllers\Admin\Setting\ImController::class . ':testSlack'
+        );
         // 礼品卡
         $group->get('/giftcard', App\Controllers\Admin\GiftCardController::class . ':index');
         $group->post('/giftcard', App\Controllers\Admin\GiftCardController::class . ':add');

+ 9 - 9
composer.json

@@ -15,7 +15,7 @@
         "ext-yaml": "*",
         "ext-zip": "*",
         "anankke/omnipay-alipay": "^3.1.3",
-        "aws/aws-sdk-php": "^3.293.2",
+        "aws/aws-sdk-php": "^3",
         "geoip2/geoip2": "^3",
         "guzzlehttp/guzzle": "^7.8.1",
         "guzzlehttp/psr7": "^2.6.2",
@@ -24,26 +24,26 @@
         "irazasyed/telegram-bot-sdk": "^3.13",
         "lcobucci/jwt": "^5.2",
         "league/omnipay": "^3.2.1",
-        "mailgun/mailgun-php": "^3.6.3",
+        "mailgun/mailgun-php": "^4",
         "nikolaposa/rate-limit": "^3.0",
         "openai-php/client": "^0",
         "ozdemir/datatables": "^2.3.7",
         "phpmailer/phpmailer": "^6.9.1",
         "postal/postal": "^2",
         "ramsey/uuid": "^4.7.5",
-        "sendgrid/sendgrid": "^8.1.0",
+        "sendgrid/sendgrid": "^8",
         "sentry/sdk": "^4",
         "slim/http": "^1.3",
         "slim/slim": "^4.12",
         "smarty/smarty": "^4.3.4",
-        "srmklive/paypal": "^3.0.27",
+        "srmklive/paypal": "^3",
         "stripe/stripe-php": "^13",
-        "symfony/http-client": "^7.0",
-        "symfony/translation": "^6.4",
+        "symfony/http-client": "^7",
+        "symfony/translation": "^6",
         "tronovav/geoip2-update": "^2.3.1",
-        "twig/twig": "^3.8",
-        "vectorface/googleauthenticator": "^3.0",
-        "voku/anti-xss": "^4.1.42"
+        "twig/twig": "^3",
+        "vectorface/googleauthenticator": "^3",
+        "voku/anti-xss": "^4"
     },
     "autoload": {
         "psr-4": {

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 175 - 171
composer.lock


+ 24 - 4
resources/views/tabler/admin/node/edit.tpl

@@ -163,11 +163,14 @@
                                 <span>流量设置</span>
                             </div>
                             <div class="form-group mb-3 row">
-                                <label class="form-label col-3 col-form-label">已用流量 (GB)</label>
+                                <label class="form-label col-3 col-form-label">已用流量</label>
                                 <div class="col">
                                     <input id="node_bandwidth" type="text" class="form-control"
                                            value="{$node->node_bandwidth}" disabled="">
                                 </div>
+                                <div class="col-auto">
+                                    <button id="reset-bandwidth" class="btn btn-red">重置</button>
+                                </div>
                             </div>
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label">可用流量 (GB)</label>
@@ -199,7 +202,7 @@
                                        disabled="">
                                 <div class="row my-3">
                                     <div class="col">
-                                        <button id="reset-node-password" class="btn btn-red">重置</button>
+                                        <button id="reset-password" class="btn btn-red">重置</button>
                                         <button id="copy-password" class="copy btn btn-primary"
                                                 data-clipboard-text="{$node->password}">
                                             复制
@@ -232,9 +235,26 @@
     const editor = new JSONEditor(container, options);
     editor.set({$node->custom_config})
 
-    $("#reset-node-password").click(function () {
+    $("#reset-bandwidth").click(function () {
+        $.ajax({
+            url: '/admin/node/{$node->id}/reset_bandwidth',
+            type: 'POST',
+            dataType: "json",
+            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');
+                }
+            }
+        })
+    });
+
+    $("#reset-password").click(function () {
         $.ajax({
-            url: '/admin/node/{$node->id}/reset',
+            url: '/admin/node/{$node->id}/reset_password',
             type: 'POST',
             dataType: "json",
             success: function (data) {

+ 18 - 6
src/Controllers/Admin/NodeController.php

@@ -102,9 +102,9 @@ final class NodeController extends BaseController
         $node->dynamic_rate_type = $request->getParam('dynamic_rate_type') ?? 0;
         $node->dynamic_rate_config = json_encode([
             'max_rate' => $request->getParam('max_rate') ?? 1,
-            'max_rate_time' => $request->getParam('max_rate_time') ?? 3,
+            'max_rate_time' => $request->getParam('max_rate_time') ?? 22,
             'min_rate' => $request->getParam('min_rate') ?? 1,
-            'min_rate_time' => $request->getParam('min_rate_time') ?? 22,
+            'min_rate_time' => $request->getParam('min_rate_time') ?? 3,
         ]);
 
         $custom_config = $request->getParam('custom_config') ?? '{}';
@@ -167,11 +167,11 @@ final class NodeController extends BaseController
 
         $dynamic_rate_config = json_decode($node->dynamic_rate_config);
         $node->max_rate = $dynamic_rate_config?->max_rate ?? 1;
-        $node->max_rate_time = $dynamic_rate_config?->max_rate_time ?? 3;
+        $node->max_rate_time = $dynamic_rate_config?->max_rate_time ?? 22;
         $node->min_rate = $dynamic_rate_config?->min_rate ?? 1;
-        $node->min_rate_time = $dynamic_rate_config?->min_rate_time ?? 22;
+        $node->min_rate_time = $dynamic_rate_config?->min_rate_time ?? 3;
 
-        $node->node_bandwidth = Tools::flowToGB($node->node_bandwidth);
+        $node->node_bandwidth = Tools::autoBytes($node->node_bandwidth);
         $node->node_bandwidth_limit = Tools::flowToGB($node->node_bandwidth_limit);
 
         return $response->write(
@@ -248,7 +248,7 @@ final class NodeController extends BaseController
         ]);
     }
 
-    public function reset(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
+    public function resetPassword(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
         $node = (new Node())->find($args['id']);
         $node->password = Tools::genRandomChar(32);
@@ -260,6 +260,18 @@ final class NodeController extends BaseController
         ]);
     }
 
+    public function resetBandwidth(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
+    {
+        $node = (new Node())->find($args['id']);
+        $node->node_bandwidth = 0;
+        $node->save();
+
+        return $response->withJson([
+            'ret' => 1,
+            'msg' => '重置节点流量成功',
+        ]);
+    }
+
     /**
      * 后台删除指定节点
      */

+ 5 - 1
src/Controllers/SubController.php

@@ -75,7 +75,11 @@ final class SubController extends BaseController
         . '; expire=' . strtotime($user->class_expire);
 
         if (Config::obtain('subscribe_log')) {
-            (new SubscribeLog())->add($user, $subtype, $this->antiXss->xss_clean($request->getHeaderLine('User-Agent')));
+            (new SubscribeLog())->add(
+                $user,
+                $subtype,
+                $this->antiXss->xss_clean($request->getHeaderLine('User-Agent'))
+            );
         }
 
         return $response->withHeader('Subscription-Userinfo', $sub_details)

+ 18 - 16
src/Utils/Tools.php

@@ -15,6 +15,7 @@ use function array_flip;
 use function base64_encode;
 use function bin2hex;
 use function closedir;
+use function count;
 use function date;
 use function explode;
 use function filter_var;
@@ -49,42 +50,42 @@ final class Tools
      * @param string $ip
      *
      * @return string
-     *
-     * @throws InvalidDatabaseException
      */
     public static function getIpLocation(string $ip): string
     {
-        $err_msg = '';
+        $data = 'GeoIP2 服务未配置';
         $city = null;
         $country = null;
 
-        if ($_ENV['maxmind_license_key'] === '') {
-            $err_msg = 'GeoIP2 服务未配置';
-        } else {
-            $geoip = new GeoIP2();
+        if ($_ENV['maxmind_license_key'] !== '') {
+            try {
+                $geoip = new GeoIP2();
+            } catch (InvalidDatabaseException $e) {
+                return $data;
+            }
 
             try {
                 $city = $geoip->getCity($ip);
-            } catch (AddressNotFoundException $e) {
+            } catch (AddressNotFoundException|InvalidDatabaseException $e) {
                 $city = '未知城市';
             }
 
             try {
                 $country = $geoip->getCountry($ip);
-            } catch (AddressNotFoundException $e) {
+            } catch (AddressNotFoundException|InvalidDatabaseException $e) {
                 $country = '未知国家';
             }
         }
 
         if ($city !== null) {
-            return $city . ', ' . $country;
+            $data = $city . ', ' . $country;
         }
 
         if ($country !== null) {
-            return $country;
+            $data = $country;
         }
 
-        return $err_msg;
+        return $data;
     }
 
     /**
@@ -159,9 +160,9 @@ final class Tools
         return round(pow(1000, $base - floor($base)), $precision) . $units[floor($base)];
     }
 
-    //虽然名字是toMB,但是实际上功能是from MB to B
-
     /**
+     * 虽然名字是toMB,但是实际上功能是from MB to B
+     *
      * @param $traffic
      *
      * @return int
@@ -171,9 +172,9 @@ final class Tools
         return (int) $traffic * 1048576;
     }
 
-    //虽然名字是toGB,但是实际上功能是from GB to B
-
     /**
+     * 虽然名字是toGB,但是实际上功能是from GB to B
+     *
      * @param $traffic
      *
      * @return int
@@ -422,6 +423,7 @@ final class Tools
 
     /**
      * 判断是否 JSON
+     * TODO: Remove this function when PHP 8.3 is minimum requirement and replace it with native function
      *
      * @param string $string
      *

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels