Browse Source

update: log api

v2board 2 years ago
parent
commit
3752bed0d6

+ 24 - 5
app/Http/Controllers/Admin/StatController.php

@@ -36,11 +36,13 @@ class StatController extends Controller
                 ->get()
                 ->makeHidden(['record_at', 'created_at', 'updated_at', 'id', 'record_type'])
                 ->toArray();
+        } else {
+            $statisticalService = new StatisticalService();
+            return [
+                'data' => $statisticalService->generateStatData()
+            ];
         }
 
-        $statisticalService = new StatisticalService();
-        $stats = array_merge($stats ?? [], [$statisticalService->generateStatData()]);
-
         $stats = array_reduce($stats, function($carry, $item) {
             foreach($item as $key => $value) {
                 if(isset($carry[$key]) && $carry[$key]) {
@@ -60,9 +62,9 @@ class StatController extends Controller
     public function getStatRecord(Request $request)
     {
         $request->validate([
-            'type' => 'required|in:order_total,commission_total,register_count',
+            'type' => 'required|in:paid_total,commission_total,register_count',
             'start_at' => '',
-            'end_at'
+            'end_at' => ''
         ]);
 
         $statisticalService = new StatisticalService();
@@ -73,6 +75,23 @@ class StatController extends Controller
         ];
     }
 
+    public function getRanking(Request $request)
+    {
+        $request->validate([
+            'type' => 'required|in:server_traffic_rank,user_consumption_rank,invite_rank',
+            'start_at' => '',
+            'end_at' => '',
+            'limit' => 'nullable|integer'
+        ]);
+
+        $statisticalService = new StatisticalService();
+        $statisticalService->setStartAt($request->input('start_at'));
+        $statisticalService->setEndAt($request->input('end_at'));
+        return [
+            'data' => $statisticalService->getRanking($request->input('type'), $request->input('limit') ?? 20)
+        ];
+    }
+
     public function getOverride(Request $request)
     {
         return [

+ 11 - 0
app/Logging/MysqlLogger.php

@@ -0,0 +1,11 @@
+<?php
+namespace App\Logging;
+
+class MysqlLogger
+{
+    public function __invoke(array $config){
+        return tap(new \Monolog\Logger('mysql'), function ($logger) {
+            $logger->pushHandler(new MysqlLoggerHandler());
+        });
+    }
+}

+ 44 - 0
app/Logging/MysqlLoggerHandler.php

@@ -0,0 +1,44 @@
+<?php
+namespace App\Logging;
+
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Log;
+use Monolog\Handler\AbstractProcessingHandler;
+use Monolog\Logger;
+use App\Models\Log as LogModel;
+
+class MysqlLoggerHandler extends AbstractProcessingHandler
+{
+    public function __construct($level = Logger::DEBUG, bool $bubble = true)
+    {
+        parent::__construct($level, $bubble);
+    }
+
+    protected function write(array $record): void
+    {
+        try{
+            if(isset($record['context']['exception']) && is_object($record['context']['exception'])){
+                $record['context']['exception'] = (array)$record['context']['exception'];
+            }
+            $record['request_data'] = request()->all() ??[];
+            $log = [
+                'title' => $record['message'],
+                'level' => $record['level_name'],
+                'host' => $record['request_host'] ?? request()->getSchemeAndHttpHost(),
+                'uri' => $record['request_uri'] ?? request()->getRequestUri(),
+                'method' => $record['request_method'] ?? request()->getMethod(),
+                'ip' => request()->getClientIp(),
+                'data' => json_encode($record['request_data']) ,
+                'context' => isset($record['context']) ? json_encode($record['context']) : '',
+                'created_at' => strtotime($record['datetime']),
+                'updated_at' => strtotime($record['datetime']),
+            ];
+
+            LogModel::insert(
+                $log
+            );
+        }catch (\Exception $e){
+            Log::channel('daily')->error($e->getMessage().$e->getFile().$e->getTraceAsString());
+        }
+    }
+}

+ 16 - 0
app/Models/Log.php

@@ -0,0 +1,16 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class Log extends Model
+{
+    protected $table = 'v2_log';
+    protected $dateFormat = 'U';
+    protected $guarded = ['id'];
+    protected $casts = [
+        'created_at' => 'timestamp',
+        'updated_at' => 'timestamp'
+    ];
+}

+ 66 - 31
app/Services/StatisticalService.php

@@ -209,40 +209,75 @@ class StatisticalService {
     {
         switch ($type) {
             case 'server_traffic_rank': {
-                return StatServer::select([
-                    'server_id',
-                    'server_type',
-                    DB::raw('sum(u) as u'),
-                    DB::raw('sum(d) as d'),
-                    DB::raw('sum(u) + sum(d) as total')
-                ])
-                    ->where('record_at', '>=', $this->startAt)
-                    ->where('record_at', '<', $this->endAt)
-                    ->groupBy('server_id', 'server_type')
-                    ->orderBy('total', 'DESC')
-                    ->limit($limit)
-                    ->get();
+                return $this->buildServerTrafficRank($limit);
             }
             case 'user_consumption_rank': {
-                $stats = StatUser::select([
-                    'user_id',
-                    DB::raw('sum(u) as u'),
-                    DB::raw('sum(d) as d'),
-                    DB::raw('sum(u) + sum(d) as total')
-                ])
-                    ->where('record_at', '>=', $this->startAt)
-                    ->where('record_at', '<', $this->endAt)
-                    ->groupBy('user_id')
-                    ->orderBy('total', 'DESC')
-                    ->limit($limit)
-                    ->get();
-                $users = User::whereIn('id', $stats->pluck('user_id')->toArray())->get()->keyBy('id');
-                foreach ($stats as $k => $v) {
-                    if (!isset($users[$v['user_id']])) continue;
-                    $stats[$k]['email'] = $users[$v['user_id']]['email'];
-                }
-                return $stats;
+                return $this->buildUserConsumptionRank($limit);
+            }
+            case 'invite_rank': {
+                return $this->buildInviteRank($limit);
             }
         }
     }
+
+    private function buildInviteRank($limit)
+    {
+        $stats = User::select([
+            'invite_user_id',
+            DB::raw('count(*) as count')
+        ])
+            ->where('created_at', '>=', $this->startAt)
+            ->where('created_at', '<', $this->endAt)
+            ->whereNotNull('invite_user_id')
+            ->groupBy('invite_user_id')
+            ->orderBy('count', 'DESC')
+            ->limit($limit)
+            ->get();
+
+        $users = User::whereIn('id', $stats->pluck('invite_user_id')->toArray())->get()->keyBy('id');
+        foreach ($stats as $k => $v) {
+            if (!isset($users[$v['invite_user_id']])) continue;
+            $stats[$k]['email'] = $users[$v['invite_user_id']]['email'];
+        }
+        return $stats;
+    }
+
+    private function buildUserConsumptionRank($limit)
+    {
+        $stats = StatUser::select([
+            'user_id',
+            DB::raw('sum(u) as u'),
+            DB::raw('sum(d) as d'),
+            DB::raw('sum(u) + sum(d) as total')
+        ])
+            ->where('record_at', '>=', $this->startAt)
+            ->where('record_at', '<', $this->endAt)
+            ->groupBy('user_id')
+            ->orderBy('total', 'DESC')
+            ->limit($limit)
+            ->get();
+        $users = User::whereIn('id', $stats->pluck('user_id')->toArray())->get()->keyBy('id');
+        foreach ($stats as $k => $v) {
+            if (!isset($users[$v['user_id']])) continue;
+            $stats[$k]['email'] = $users[$v['user_id']]['email'];
+        }
+        return $stats;
+    }
+
+    private function buildServerTrafficRank($limit)
+    {
+        return StatServer::select([
+            'server_id',
+            'server_type',
+            DB::raw('sum(u) as u'),
+            DB::raw('sum(d) as d'),
+            DB::raw('sum(u) + sum(d) as total')
+        ])
+            ->where('record_at', '>=', $this->startAt)
+            ->where('record_at', '<', $this->endAt)
+            ->groupBy('server_id', 'server_type')
+            ->orderBy('total', 'DESC')
+            ->limit($limit)
+            ->get();
+    }
 }

+ 6 - 1
config/logging.php

@@ -16,7 +16,7 @@ return [
     |
     */
 
-    'default' => env('LOG_CHANNEL', 'stack'),
+    'default' => 'mysql',
 
     /*
     |--------------------------------------------------------------------------
@@ -34,6 +34,11 @@ return [
     */
 
     'channels' => [
+        'mysql' => [
+            'driver' => 'custom',
+            'via' => App\Logging\MysqlLogger::class,
+        ],
+
         'stack' => [
             'driver' => 'stack',
             'channels' => ['daily'],

+ 21 - 4
database/install.sql

@@ -81,6 +81,23 @@ CREATE TABLE `v2_knowledge` (
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='知識庫';
 
 
+DROP TABLE IF EXISTS `v2_log`;
+CREATE TABLE `v2_log` (
+                          `id` int(11) NOT NULL AUTO_INCREMENT,
+                          `title` varchar(255) NOT NULL,
+                          `level` varchar(11) DEFAULT NULL,
+                          `host` varchar(255) DEFAULT NULL,
+                          `uri` varchar(255) NOT NULL,
+                          `method` varchar(11) NOT NULL,
+                          `data` text,
+                          `ip` varchar(128) DEFAULT NULL,
+                          `context` text,
+                          `created_at` int(11) NOT NULL,
+                          `updated_at` int(11) NOT NULL,
+                          PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+
 DROP TABLE IF EXISTS `v2_mail_log`;
 CREATE TABLE `v2_mail_log` (
                                `id` int(11) NOT NULL AUTO_INCREMENT,
@@ -163,8 +180,8 @@ CREATE TABLE `v2_plan` (
                            `id` int(11) NOT NULL AUTO_INCREMENT,
                            `group_id` int(11) NOT NULL,
                            `transfer_enable` int(11) NOT NULL,
-                           `speed_limit` int(11) DEFAULT NULL,
                            `name` varchar(255) NOT NULL,
+                           `speed_limit` int(11) DEFAULT NULL,
                            `show` tinyint(1) NOT NULL DEFAULT '0',
                            `sort` int(11) DEFAULT NULL,
                            `renew` tinyint(1) NOT NULL DEFAULT '1',
@@ -408,8 +425,8 @@ CREATE TABLE `v2_user` (
                            `transfer_enable` bigint(20) NOT NULL DEFAULT '0',
                            `banned` tinyint(1) NOT NULL DEFAULT '0',
                            `is_admin` tinyint(1) NOT NULL DEFAULT '0',
-                           `is_staff` tinyint(1) NOT NULL DEFAULT '0',
                            `last_login_at` int(11) DEFAULT NULL,
+                           `is_staff` tinyint(1) NOT NULL DEFAULT '0',
                            `last_login_ip` int(11) DEFAULT NULL,
                            `uuid` varchar(36) NOT NULL,
                            `group_id` int(11) DEFAULT NULL,
@@ -418,8 +435,8 @@ CREATE TABLE `v2_user` (
                            `remind_expire` tinyint(4) DEFAULT '1',
                            `remind_traffic` tinyint(4) DEFAULT '1',
                            `token` char(32) NOT NULL,
-                           `remarks` text,
                            `expired_at` bigint(20) DEFAULT '0',
+                           `remarks` text,
                            `created_at` int(11) NOT NULL,
                            `updated_at` int(11) NOT NULL,
                            PRIMARY KEY (`id`),
@@ -427,4 +444,4 @@ CREATE TABLE `v2_user` (
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
 
--- 2023-05-03 07:27:22
+-- 2023-05-23 17:01:12

+ 15 - 25
database/update.sql

@@ -107,17 +107,6 @@ CREATE TABLE `v2_coupon` (
 ALTER TABLE `v2_order`
 ADD `discount_amount` int(11) NULL AFTER `total_amount`;
 
-CREATE TABLE `v2_tutorial` (
-  `id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-  `title` varchar(255) COLLATE 'utf8mb4_general_ci' NOT NULL,
-  `description` varchar(255) COLLATE 'utf8mb4_general_ci' NOT NULL,
-  `icon` varchar(255) COLLATE 'utf8mb4_general_ci' NOT NULL,
-  `steps` text NULL,
-  `show` tinyint(1) NOT NULL DEFAULT '0',
-  `created_at` int(11) NOT NULL,
-  `updated_at` int(11) NOT NULL
-);
-
 ALTER TABLE `v2_server_log`
 CHANGE `rate` `rate` decimal(10,2) NOT NULL AFTER `d`;
 
@@ -375,20 +364,6 @@ ALTER TABLE `v2_stat_server`
 ADD INDEX `record_at` (`record_at`),
 ADD INDEX `server_id` (`server_id`);
 
-CREATE TABLE `v2_stat_order` (
-  `id` int(11) NOT NULL AUTO_INCREMENT,
-  `order_count` int(11) NOT NULL COMMENT '订单数量',
-  `order_amount` int(11) NOT NULL COMMENT '订单合计',
-  `commission_count` int(11) NOT NULL,
-  `commission_amount` int(11) NOT NULL COMMENT '佣金合计',
-  `record_type` char(1) NOT NULL,
-  `record_at` int(11) NOT NULL,
-  `created_at` int(11) NOT NULL,
-  `updated_at` int(11) NOT NULL,
-  PRIMARY KEY (`id`),
-  UNIQUE KEY `record_at` (`record_at`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单统计';
-
 ALTER TABLE `v2_user`
 DROP `enable`;
 
@@ -697,3 +672,18 @@ ALTER TABLE `v2_stat_order`
     ADD `invite_count` int(11) NOT NULL AFTER `register_count`,
     ADD `transfer_used_total` varchar(32) NOT NULL AFTER `invite_count`,
     RENAME TO `v2_stat`;
+
+CREATE TABLE `v2_log` (
+                          `id` int(11) NOT NULL AUTO_INCREMENT,
+                          `title` varchar(255) NOT NULL,
+                          `level` varchar(11) DEFAULT NULL,
+                          `host` varchar(255) DEFAULT NULL,
+                          `uri` varchar(255) NOT NULL,
+                          `method` varchar(11) NOT NULL,
+                          `data` text,
+                          `ip` varchar(128) DEFAULT NULL,
+                          `context` text,
+                          `created_at` int(11) NOT NULL,
+                          `updated_at` int(11) NOT NULL,
+                          PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;