Browse Source

refactor: analytics service

M1Screw 2 years ago
parent
commit
8280170dbf

+ 6 - 6
composer.lock

@@ -7110,16 +7110,16 @@
         },
         {
             "name": "friendsofphp/php-cs-fixer",
-            "version": "v3.26.1",
+            "version": "v3.27.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
-                "reference": "d023ba6684055f6ea1da1352d8a02baca0426983"
+                "reference": "e73ccaae1208f017bb7860986eebb3da48bd25d6"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/d023ba6684055f6ea1da1352d8a02baca0426983",
-                "reference": "d023ba6684055f6ea1da1352d8a02baca0426983",
+                "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/e73ccaae1208f017bb7860986eebb3da48bd25d6",
+                "reference": "e73ccaae1208f017bb7860986eebb3da48bd25d6",
                 "shasum": ""
             },
             "require": {
@@ -7193,7 +7193,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.26.1"
+                "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.27.0"
             },
             "funding": [
                 {
@@ -7201,7 +7201,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2023-09-08T19:09:07+00:00"
+            "time": "2023-09-17T14:37:54+00:00"
         },
         {
             "name": "justinrainbow/json-schema",

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

@@ -109,7 +109,7 @@
                 <div class="col-sm-12 col-md-6">
                     <div class="card">
                         <div class="card-header">
-                            <h3 class="card-title">{$sts->getTotalUser()} 位用户的签到情况</h3>
+                            <h3 class="card-title">{$total_user} 位用户的签到情况</h3>
                         </div>
                         <div class="card-body">
                             <div id="check-in"></div>
@@ -119,7 +119,7 @@
                 <div class="col-sm-12 col-md-6">
                     <div class="card">
                         <div class="card-header">
-                            <h3 class="card-title">{$sts->getTotalNodes()} 个服务器的在线情况</h3>
+                            <h3 class="card-title">{$total_node} 个服务器的在线情况</h3>
                         </div>
                         <div class="card-body">
                             <div id="node-online"></div>
@@ -167,7 +167,7 @@
                 fill: {
                     opacity: 1,
                 },
-                series: [{$sts->getTotalUser()-$sts->getCheckinUser()}, {$sts->getCheckinUser()-$sts->getTodayCheckinUser()}, {$sts->getTodayCheckinUser()}],
+                series: [{$total_user-$checkin_user}, {$checkin_user-$today_checkin_user}, {$today_checkin_user}],
                 labels: ["没有签到", "曾经签到", "今日签到"],
                 grid: {
                     strokeDashArray: 3,
@@ -207,7 +207,7 @@
                 fill: {
                     opacity: 1,
                 },
-                series: [{$sts->getAliveNodes()}, {$sts->getTotalNodes()-$sts->getAliveNodes()}],
+                series: [{$alive_node}, {$total_node-$alive_node}],
                 labels: ["在线", "离线"],
                 grid: {
                     strokeDashArray: 2,
@@ -247,7 +247,7 @@
                 fill: {
                     opacity: 1,
                 },
-                series: [{$sts->getInactiveUser()}, {$sts->getActiveUser()}],
+                series: [{$inactive_user}, {$active_user}],
                 labels: ["闲置账户", "活动账户"],
                 grid: {
                     strokeDashArray: 4,
@@ -287,8 +287,8 @@
                 fill: {
                     opacity: 1,
                 },
-                series: [{$sts->getRawGbTodayTrafficUsage()}, {$sts->getRawGbLastTrafficUsage()}, {$sts->getRawGbUnusedTrafficUsage()}],
-                labels: ["今日已用({$sts->getTodayTrafficUsage()})", "过去已用({$sts->getLastTrafficUsage()})", "剩余流量({$sts->getUnusedTrafficUsage()})"],
+                series: [{$raw_today_traffic}, {$raw_last_traffic}, {$raw_unused_traffic}],
+                labels: ["今日已用({$today_traffic})", "过去已用({$last_traffic})", "剩余流量({$unused_traffic})"],
                 grid: {
                     strokeDashArray: 3,
                 },

+ 3 - 3
src/Command/Tool.php

@@ -184,7 +184,7 @@ EOL;
         $user = ModelsUser::find(trim(fgets(STDIN)));
 
         if ($user !== null) {
-            $user->port = Tools::getAvPort();
+            $user->port = Tools::getSsPort();
             if ($user->save()) {
                 echo '重置成功!';
             }
@@ -202,7 +202,7 @@ EOL;
 
         foreach ($users as $user) {
             $origin_port = $user->port;
-            $user->port = Tools::getAvPort();
+            $user->port = Tools::getSsPort();
             echo '$origin_port=' . $origin_port . '&$user->port=' . $user->port . PHP_EOL;
             $user->save();
         }
@@ -324,7 +324,7 @@ EOL;
             $user->passwd = Tools::genRandomChar(16);
             $user->uuid = Uuid::uuid4();
             $user->api_token = Uuid::uuid4();
-            $user->port = Tools::getAvPort();
+            $user->port = Tools::getSsPort();
             $user->u = 0;
             $user->d = 0;
             $user->transfer_enable = 0;

+ 30 - 6
src/Controllers/AdminController.php

@@ -5,7 +5,6 @@ declare(strict_types=1);
 namespace App\Controllers;
 
 use App\Services\Analytics;
-use App\Utils\Tools;
 use Exception;
 use Psr\Http\Message\ResponseInterface;
 use Slim\Http\Response;
@@ -23,18 +22,43 @@ final class AdminController extends BaseController
      */
     public function index(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
-        $today_income = Tools::getIncome('today');
-        $yesterday_income = Tools::getIncome('yesterday');
-        $this_month_income = Tools::getIncome('this month');
-        $total_income = Tools::getIncome('total');
+        $today_income = Analytics::getIncome('today');
+        $yesterday_income = Analytics::getIncome('yesterday');
+        $this_month_income = Analytics::getIncome('this month');
+        $total_income = Analytics::getIncome('total');
+        $total_user = Analytics::getTotalUser();
+        $checkin_user = Analytics::getCheckinUser();
+        $today_checkin_user = Analytics::getTodayCheckinUser();
+        $inactive_user = Analytics::getInactiveUser();
+        $active_user = Analytics::getActiveUser();
+        $total_node = Analytics::getTotalNode();
+        $alive_node = Analytics::getAliveNode();
+        $raw_today_traffic = Analytics::getRawGbTodayTrafficUsage();
+        $raw_last_traffic = Analytics::getRawGbLastTrafficUsage();
+        $raw_unused_traffic = Analytics::getRawGbUnusedTrafficUsage();
+        $today_traffic = Analytics::getTodayTrafficUsage();
+        $last_traffic = Analytics::getLastTrafficUsage();
+        $unused_traffic = Analytics::getUnusedTrafficUsage();
 
         return $response->write(
             $this->view()
-                ->assign('sts', new Analytics())
                 ->assign('today_income', $today_income)
                 ->assign('yesterday_income', $yesterday_income)
                 ->assign('this_month_income', $this_month_income)
                 ->assign('total_income', $total_income)
+                ->assign('total_user', $total_user)
+                ->assign('checkin_user', $checkin_user)
+                ->assign('today_checkin_user', $today_checkin_user)
+                ->assign('inactive_user', $inactive_user)
+                ->assign('active_user', $active_user)
+                ->assign('total_node', $total_node)
+                ->assign('alive_node', $alive_node)
+                ->assign('raw_today_traffic', $raw_today_traffic)
+                ->assign('raw_last_traffic', $raw_last_traffic)
+                ->assign('raw_unused_traffic', $raw_unused_traffic)
+                ->assign('today_traffic', $today_traffic)
+                ->assign('last_traffic', $last_traffic)
+                ->assign('unused_traffic', $unused_traffic)
                 ->fetch('admin/index.tpl')
         );
     }

+ 1 - 1
src/Controllers/AuthController.php

@@ -250,7 +250,7 @@ final class AuthController extends BaseController
         $user->passwd = Tools::genRandomChar(16);
         $user->uuid = Uuid::uuid4();
         $user->api_token = Uuid::uuid4();
-        $user->port = Tools::getAvPort();
+        $user->port = Tools::getSsPort();
         $user->u = 0;
         $user->d = 0;
         $user->method = $configs['sign_up_for_method'];

+ 50 - 20
src/Services/Analytics.php

@@ -5,109 +5,139 @@ declare(strict_types=1);
 namespace App\Services;
 
 use App\Models\Node;
+use App\Models\Paylist;
 use App\Models\User;
 use App\Utils\Tools;
+use function floatval;
+use function is_null;
+use function round;
 use function strtotime;
 use function time;
 
 final class Analytics
 {
-    public function getTotalUser()
+    /**
+     * 获取累计收入
+     *
+     * @param string $req
+     *
+     * @return float
+     */
+    public static function getIncome(string $req): float
+    {
+        $today = strtotime('00:00:00');
+        $number = match ($req) {
+            'today' => Paylist::where('status', 1)
+                ->whereBetween('datetime', [$today, time()])
+                ->sum('total'),
+            'yesterday' => Paylist::where('status', 1)
+                ->whereBetween('datetime', [strtotime('-1 day', $today), $today])
+                ->sum('total'),
+            'this month' => Paylist::where('status', 1)
+                ->whereBetween('datetime', [strtotime('first day of this month 00:00:00'), time()])
+                ->sum('total'),
+            default => Paylist::where('status', 1)->sum('total'),
+        };
+
+        return is_null($number) ? 0.00 : round(floatval($number), 2);
+    }
+
+    public static function getTotalUser()
     {
         return User::count();
     }
 
-    public function getCheckinUser()
+    public static function getCheckinUser()
     {
         return User::where('last_check_in_time', '>', 0)->count();
     }
 
-    public function getTodayCheckinUser()
+    public static function getTodayCheckinUser()
     {
         return User::where('last_check_in_time', '>', strtotime('today'))->count();
     }
 
-    public function getTrafficUsage(): string
+    public static function getTrafficUsage(): string
     {
         return Tools::autoBytes(User::sum('u') + User::sum('d'));
     }
 
-    public function getTodayTrafficUsage(): string
+    public static function getTodayTrafficUsage(): string
     {
         return Tools::autoBytes(User::sum('transfer_today'));
     }
 
-    public function getRawTodayTrafficUsage()
+    public static function getRawTodayTrafficUsage()
     {
         return User::sum('transfer_today');
     }
 
-    public function getRawGbTodayTrafficUsage(): float
+    public static function getRawGbTodayTrafficUsage(): float
     {
         return Tools::flowToGB(User::sum('transfer_today'));
     }
 
-    public function getLastTrafficUsage(): string
+    public static function getLastTrafficUsage(): string
     {
         return Tools::autoBytes(User::sum('u') + User::sum('d') - User::sum('transfer_today'));
     }
 
-    public function getRawLastTrafficUsage()
+    public static function getRawLastTrafficUsage()
     {
         return User::sum('u') + User::sum('d') - User::sum('transfer_today');
     }
 
-    public function getRawGbLastTrafficUsage(): float
+    public static function getRawGbLastTrafficUsage(): float
     {
         return Tools::flowToGB(User::sum('u') + User::sum('d') - User::sum('transfer_today'));
     }
 
-    public function getUnusedTrafficUsage(): string
+    public static function getUnusedTrafficUsage(): string
     {
         return Tools::autoBytes(User::sum('transfer_enable') - User::sum('u') - User::sum('d'));
     }
 
-    public function getRawUnusedTrafficUsage()
+    public static function getRawUnusedTrafficUsage()
     {
         return User::sum('transfer_enable') - User::sum('u') - User::sum('d');
     }
 
-    public function getRawGbUnusedTrafficUsage(): float
+    public static function getRawGbUnusedTrafficUsage(): float
     {
         return Tools::flowToGB(User::sum('transfer_enable') - User::sum('u') - User::sum('d'));
     }
 
-    public function getTotalTraffic(): string
+    public static function getTotalTraffic(): string
     {
         return Tools::autoBytes(User::sum('transfer_enable'));
     }
 
-    public function getRawTotalTraffic()
+    public static function getRawTotalTraffic()
     {
         return User::sum('transfer_enable');
     }
 
-    public function getRawGbTotalTraffic(): float
+    public static function getRawGbTotalTraffic(): float
     {
         return Tools::flowToGB(User::sum('transfer_enable'));
     }
 
-    public function getTotalNodes()
+    public static function getTotalNode()
     {
         return Node::where('node_heartbeat', '>', 0)->count();
     }
 
-    public function getAliveNodes()
+    public static function getAliveNode()
     {
         return Node::where('node_heartbeat', '>', time() - 90)->count();
     }
 
-    public function getInactiveUser()
+    public static function getInactiveUser()
     {
         return User::where('is_inactive', 1)->count();
     }
 
-    public function getActiveUser()
+    public static function getActiveUser()
     {
         return User::where('is_inactive', 0)->count();
     }

+ 3 - 4
src/Services/Cron.php

@@ -608,8 +608,6 @@ final class Cron
      */
     public static function sendTelegramDiary(): void
     {
-        $analytics = new Analytics();
-
         (new Telegram())->send(
             0,
             str_replace(
@@ -618,8 +616,8 @@ final class Cron
                     '%lastday_total%',
                 ],
                 [
-                    $analytics->getTodayCheckinUser(),
-                    $analytics->getTodayTrafficUsage(),
+                    Analytics::getTodayCheckinUser(),
+                    Analytics::getTodayTrafficUsage(),
                 ],
                 Setting::obtain('telegram_diary_text')
             )
@@ -634,6 +632,7 @@ final class Cron
 
         foreach ($nodes as $node) {
             $server = $node->server;
+
             if (! Tools::isIPv4($server) && ! Tools::isIPv6($server)) {
                 $node->changeNodeIp($server);
                 $node->save();

+ 9 - 37
src/Utils/Tools.php

@@ -6,7 +6,6 @@ namespace App\Utils;
 
 use App\Models\Link;
 use App\Models\Node;
-use App\Models\Paylist;
 use App\Models\Setting;
 use App\Models\User;
 use App\Services\Config;
@@ -19,10 +18,8 @@ use function closedir;
 use function date;
 use function explode;
 use function filter_var;
-use function floatval;
 use function floor;
 use function in_array;
-use function is_null;
 use function is_numeric;
 use function json_decode;
 use function log;
@@ -35,9 +32,7 @@ use function round;
 use function shuffle;
 use function strlen;
 use function strpos;
-use function strtotime;
 use function substr;
-use function time;
 use const FILTER_FLAG_IPV4;
 use const FILTER_FLAG_IPV6;
 use const FILTER_VALIDATE_EMAIL;
@@ -166,22 +161,22 @@ final class Tools
     /**
      * @param $traffic
      *
-     * @return float|int
+     * @return int
      */
-    public static function toMB($traffic): float|int
+    public static function toMB($traffic): int
     {
-        return $traffic * 1048576;
+        return (int) $traffic * 1048576;
     }
 
     //虽然名字是toGB,但是实际上功能是from GB to B
     /**
      * @param $traffic
      *
-     * @return float|int
+     * @return int
      */
-    public static function toGB($traffic): float|int
+    public static function toGB($traffic): int
     {
-        return $traffic * 1073741824;
+        return (int) $traffic * 1073741824;
     }
 
     /**
@@ -191,7 +186,7 @@ final class Tools
      */
     public static function flowToGB($traffic): float
     {
-        return $traffic / 1073741824;
+        return round($traffic / 1073741824, 2);
     }
 
     /**
@@ -201,7 +196,7 @@ final class Tools
      */
     public static function flowToMB($traffic): float
     {
-        return $traffic / 1048576;
+        return round($traffic / 1048576, 2);
     }
 
     public static function genRandomChar(int $length = 8): string
@@ -214,7 +209,7 @@ final class Tools
         return date('Y-m-d H:i:s', $time);
     }
 
-    public static function getAvPort(): mixed
+    public static function getSsPort(): int
     {
         if (Setting::obtain('min_port') > 65535
             || Setting::obtain('min_port') <= 0
@@ -399,29 +394,6 @@ final class Tools
         return "couldn't alloc token";
     }
 
-    /**
-     * 获取累计收入
-     *
-     * @param string $req
-     *
-     * @return float
-     */
-    public static function getIncome(string $req): float
-    {
-        $today = strtotime('00:00:00');
-        $number = match ($req) {
-            'today' => Paylist::where('status', 1)
-                ->whereBetween('datetime', [$today, time()])->sum('total'),
-            'yesterday' => Paylist::where('status', 1)
-                ->whereBetween('datetime', [strtotime('-1 day', $today), $today])->sum('total'),
-            'this month' => Paylist::where('status', 1)
-                ->whereBetween('datetime', [strtotime('first day of this month 00:00:00'), time()])->sum('total'),
-            default => Paylist::where('status', 1)->sum('total'),
-        };
-
-        return is_null($number) ? 0.00 : round(floatval($number), 2);
-    }
-
     /**
      * @param $user
      *