alroyso 1 mēnesi atpakaļ
vecāks
revīzija
9dd1399d23

+ 17 - 2
.idea/workspace.xml

@@ -4,7 +4,12 @@
     <option name="autoReloadType" value="SELECTIVE" />
   </component>
   <component name="ChangeListManager">
-    <list default="true" id="09451f28-815a-407f-8951-727d305b50a4" name="Changes" comment="Changes" />
+    <list default="true" id="09451f28-815a-407f-8951-727d305b50a4" name="Changes" comment="Changes">
+      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/app/Console/Commands/AutoJob.php" beforeDir="false" afterPath="$PROJECT_DIR$/app/Console/Commands/AutoJob.php" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/app/Http/Controllers/Admin/LogsController.php" beforeDir="false" afterPath="$PROJECT_DIR$/app/Http/Controllers/Admin/LogsController.php" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/resources/views/admin/logs/traffic.blade.php" beforeDir="false" afterPath="$PROJECT_DIR$/resources/views/admin/logs/traffic.blade.php" afterDir="false" />
+    </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
     <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
@@ -380,6 +385,8 @@
       <workItem from="1742627488124" duration="1465000" />
       <workItem from="1745205587369" duration="5133000" />
       <workItem from="1746161383498" duration="16509000" />
+      <workItem from="1746179823316" duration="256000" />
+      <workItem from="1746180473097" duration="1860000" />
     </task>
     <task id="LOCAL-00001" summary="Changes">
       <option name="closed" value="true" />
@@ -693,7 +700,15 @@
       <option name="project" value="LOCAL" />
       <updated>1746179575608</updated>
     </task>
-    <option name="localTasksCounter" value="40" />
+    <task id="LOCAL-00040" summary="Changes">
+      <option name="closed" value="true" />
+      <created>1746180074310</created>
+      <option name="number" value="00040" />
+      <option name="presentableId" value="LOCAL-00040" />
+      <option name="project" value="LOCAL" />
+      <updated>1746180074310</updated>
+    </task>
+    <option name="localTasksCounter" value="41" />
     <servers />
   </component>
   <component name="TypeScriptGeneratedFilesManager">

+ 18 - 26
app/Console/Commands/AutoJob.php

@@ -11,6 +11,7 @@ use App\Models\Order;
 use App\Models\User;
 use App\Models\VerifyCode;
 use App\Models\UserHourlyDataFlow;
+use App\Models\UserDataFlowLog;
 use Illuminate\Console\Command;
 use Log;
 
@@ -63,15 +64,17 @@ class AutoJob extends Command
                 }
             });
 
-        // 封禁1小时内流量异常账号
+        // 封禁最近1小时内流量异常账号(直接用UserDataFlowLog统计)
         if (sysConfig('is_traffic_ban')) {
             $trafficBanTime = sysConfig('traffic_ban_time');
             $trafficBanValue = sysConfig('traffic_ban_value') * GB;
+            $oneHourAgo = time() - 3600;
 
-            // 获取最近1小时流量异常的用户ID列表
-            $abnormalUserIds = UserHourlyDataFlow::where('created_at', '>=', now()->subHour())
-                ->where('total', '>', $trafficBanValue)
-                ->distinct()
+            // 查询最近1小时内流量超限的用户ID
+            $abnormalUserIds = UserDataFlowLog::where('log_time', '>=', $oneHourAgo)
+                ->selectRaw('user_id, SUM(u + d) as total_traffic')
+                ->groupBy('user_id')
+                ->having('total_traffic', '>', $trafficBanValue)
                 ->pluck('user_id')
                 ->toArray();
 
@@ -81,38 +84,27 @@ class AutoJob extends Command
                     'user_ids' => $abnormalUserIds
                 ]);
 
-                // 直接查询这些异常用户并封禁
                 User::activeUser()
                     ->whereIn('id', $abnormalUserIds)
                     ->whereBanTime(null)
-                    ->chunk(100, function ($users) use ($trafficBanTime, $trafficBanValue) {
+                    ->chunk(100, function ($users) use ($trafficBanTime, $trafficBanValue, $oneHourAgo) {
                         foreach ($users as $user) {
                             try {
-                                \Log::warning('即将封禁流量异常用户', [
-                                    'user_id' => $user->id,
-                                    'email' => $user->email,
-                                    'before_enable' => $user->enable,
-                                    'before_ban_time' => $user->ban_time,
-                                    'traffic_ban_value' => $trafficBanValue
-                                ]);
+                                // 重新统计该用户最近1小时的总流量
+                                $total = UserDataFlowLog::where('user_id', $user->id)
+                                    ->where('log_time', '>=', $oneHourAgo)
+                                    ->sum(\DB::raw('u + d'));
+                                $banValueStr = flowAutoShow($trafficBanValue);
+                                $usedStr = flowAutoShow($total);
+
+                                \Log::warning('⚠️ 用户流量异常封禁 | ID: '.$user->id.' | 邮箱: '.$user->email.' | 1小时内已用流量: '.$usedStr.',阈值: '.$banValueStr.'(已超限)');
 
                                 $user->update([
                                     'enable' => 0,
                                     'ban_time' => strtotime("+$trafficBanTime minutes")
                                 ]);
-
                                 $user->refresh();
-                                \Log::info('流量异常用户封禁完成', [
-                                    'user_id' => $user->id,
-                                    'after_enable' => $user->enable,
-                                    'after_ban_time' => $user->ban_time,
-                                    'ban_minutes' => $trafficBanTime
-                                ]);
-                                $total = $user->usedTraffic();
-                                $banValue = $trafficBanValue;
-                                $banValueStr = flowAutoShow($banValue);
-                                $usedStr = flowAutoShow($total);
-                                \Log::warning("⚠️ 用户流量异常封禁 | ID: {$user->id} | 邮箱: {$user->email} | 1小时内已用流量: {$usedStr},阈值: {$banValueStr}(已超限)");
+
                                 Helpers::addUserBanLog($user->id, $trafficBanTime, '【临时封禁代理】-1小时内流量异常');
                             } catch (\Exception $e) {
                                 \Log::error('封禁流量异常用户失败', [

+ 10 - 6
app/Http/Controllers/Admin/LogsController.php

@@ -111,6 +111,7 @@ class LogsController extends Controller
         $nodeId = $request->input('nodeId');
         $startTime = $request->input('startTime');
         $endTime = $request->input('endTime');
+        $lastHours = $request->input('last_hours');
 
         $query = UserDataFlowLog::with(['user', 'node']);
 
@@ -134,12 +135,15 @@ class LogsController extends Controller
             $query->whereNodeId($nodeId);
         }
 
-        if (isset($startTime)) {
-            $query->where('log_time', '>=', strtotime($startTime));
-        }
-
-        if (isset($endTime)) {
-            $query->where('log_time', '<=', strtotime($endTime));
+        if ($lastHours) {
+            $query->where('log_time', '>=', time() - 3600 * intval($lastHours));
+        } else {
+            if (isset($startTime)) {
+                $query->where('log_time', '>=', strtotime($startTime));
+            }
+            if (isset($endTime)) {
+                $query->where('log_time', '<=', strtotime($endTime));
+            }
         }
 
         $dataFlowLogs = $query->latest('log_time')->paginate(20)->appends($request->except('page'));

+ 13 - 1
resources/views/admin/logs/traffic.blade.php

@@ -45,6 +45,17 @@
                                    placeholder="{{date("Y-m-d",strtotime("+1 month"))}}"/>
                         </div>
                     </div>
+                    <div class="form-group col-lg-2 col-sm-4">
+                        <select class="form-control" name="last_hours" id="last_hours">
+                            <option value="">全部时间</option>
+                            <option value="1" {{ Request::input('last_hours') == 1 ? 'selected' : '' }}>最近1小时</option>
+                            <option value="2" {{ Request::input('last_hours') == 2 ? 'selected' : '' }}>最近2小时</option>
+                            <option value="3" {{ Request::input('last_hours') == 3 ? 'selected' : '' }}>最近3小时</option>
+                            <option value="6" {{ Request::input('last_hours') == 6 ? 'selected' : '' }}>最近6小时</option>
+                            <option value="12" {{ Request::input('last_hours') == 12 ? 'selected' : '' }}>最近12小时</option>
+                            <option value="24" {{ Request::input('last_hours') == 24 ? 'selected' : '' }}>最近24小时</option>
+                        </select>
+                    </div>
                     <div class="form-group col-lg-2 col-sm-4 btn-group">
                         <button class="btn btn-primary" onclick="Search()">搜 索</button>
                         <a href="{{route('admin.log.traffic')}}" class="btn btn-danger">{{trans('common.reset')}}</a>
@@ -125,7 +136,8 @@
       // 搜索
       function Search() {
         window.location.href = '{{route('admin.log.traffic')}}?port=' + $('#port').val() + '&user_id=' + $('#user_id').val() + '&email=' + $('#email').val()
-            + '&nodeId=' + $('#nodeId option:selected').val() + '&startTime=' + $('#start').val() + '&endTime=' + $('#end').val();
+            + '&nodeId=' + $('#nodeId option:selected').val() + '&startTime=' + $('#start').val() + '&endTime=' + $('#end').val()
+            + '&last_hours=' + $('#last_hours').val();
       }
     </script>
 @endsection