mirror of
				https://github.com/v2board/v2board.git
				synced 2025-10-31 09:21:46 +08:00 
			
		
		
		
	update: log api
This commit is contained in:
		| @@ -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
									
								
								app/Logging/MysqlLogger.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								app/Logging/MysqlLogger.php
									
									
									
									
									
										Normal file
									
								
							| @@ -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
									
								
								app/Logging/MysqlLoggerHandler.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								app/Logging/MysqlLoggerHandler.php
									
									
									
									
									
										Normal file
									
								
							| @@ -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
									
								
								app/Models/Log.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								app/Models/Log.php
									
									
									
									
									
										Normal file
									
								
							| @@ -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' | ||||
|     ]; | ||||
| } | ||||
| @@ -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(); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -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'], | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user