From 3752bed0d659ceb94e560259a8ff56092dd7cec4 Mon Sep 17 00:00:00 2001 From: v2board Date: Wed, 24 May 2023 01:08:13 +0800 Subject: [PATCH] update: log api --- app/Http/Controllers/Admin/StatController.php | 29 +++++- app/Logging/MysqlLogger.php | 11 +++ app/Logging/MysqlLoggerHandler.php | 44 +++++++++ app/Models/Log.php | 16 +++ app/Services/StatisticalService.php | 97 +++++++++++++------ config/logging.php | 7 +- database/install.sql | 25 ++++- database/update.sql | 40 +++----- 8 files changed, 203 insertions(+), 66 deletions(-) create mode 100644 app/Logging/MysqlLogger.php create mode 100644 app/Logging/MysqlLoggerHandler.php create mode 100644 app/Models/Log.php diff --git a/app/Http/Controllers/Admin/StatController.php b/app/Http/Controllers/Admin/StatController.php index 7f4f20ea..912f8824 100644 --- a/app/Http/Controllers/Admin/StatController.php +++ b/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 [ diff --git a/app/Logging/MysqlLogger.php b/app/Logging/MysqlLogger.php new file mode 100644 index 00000000..95b81855 --- /dev/null +++ b/app/Logging/MysqlLogger.php @@ -0,0 +1,11 @@ +pushHandler(new MysqlLoggerHandler()); + }); + } +} diff --git a/app/Logging/MysqlLoggerHandler.php b/app/Logging/MysqlLoggerHandler.php new file mode 100644 index 00000000..c606b7a9 --- /dev/null +++ b/app/Logging/MysqlLoggerHandler.php @@ -0,0 +1,44 @@ +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()); + } + } +} diff --git a/app/Models/Log.php b/app/Models/Log.php new file mode 100644 index 00000000..606b2077 --- /dev/null +++ b/app/Models/Log.php @@ -0,0 +1,16 @@ + 'timestamp', + 'updated_at' => 'timestamp' + ]; +} diff --git a/app/Services/StatisticalService.php b/app/Services/StatisticalService.php index 26dc5d1c..d403912f 100644 --- a/app/Services/StatisticalService.php +++ b/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(); + } } diff --git a/config/logging.php b/config/logging.php index d09cd7d2..69638470 100755 --- a/config/logging.php +++ b/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'], diff --git a/database/install.sql b/database/install.sql index b6611ec0..0e609f75 100644 --- a/database/install.sql +++ b/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 diff --git a/database/update.sql b/database/update.sql index 04f8f01c..5717d845 100644 --- a/database/update.sql +++ b/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;