Bläddra i källkod

用户订阅封禁记录

zhangjiangbin 8 år sedan
förälder
incheckning
974e754bb7

+ 8 - 1
app/Console/Commands/AutoBanSubscribeJob.php

@@ -20,6 +20,13 @@ class AutoBanSubscribeJob extends Command
 
     public function handle()
     {
+        /*
+         * 客户端请求头有多种,常见如下:
+         * SSR、SSRR安卓客户端:okhttp/3.8.0
+         * Shadowrocket:Shadowrocket/516 CFNetwork/893.14.2 Darwin/17.3.0
+         * ShadowsocksR win版:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.3319.102 Safari/537.36
+         */
+
         $config = $this->systemConfig();
 
         // 封禁24小时访问异常的订阅链接
@@ -27,7 +34,7 @@ class AutoBanSubscribeJob extends Command
             $subscribeList = UserSubscribe::query()->where('status', 1)->get();
             if (!$subscribeList->isEmpty()) {
                 foreach ($subscribeList as $subscribe) {
-                    // 24小时内的请求次数
+                    // 24小时内不同IP的请求次数
                     $request_times = UserSubscribeLog::query()->where('sid', $subscribe->id)->where('request_time', '>=', date("Y-m-d H:i:s", strtotime("-24 hours")))->distinct('request_ip')->count('request_ip');
                     if ($request_times >= $config['subscribe_ban_times']) {
                         UserSubscribe::query()->where('id', $subscribe->id)->update(['status' => 0, 'ban_time' => time(), 'ban_desc' => '存在异常,自动封禁']);

+ 20 - 1
app/Http/Controllers/AdminController.php

@@ -22,6 +22,7 @@ use App\Http\Models\SsNodeTrafficDaily;
 use App\Http\Models\SsNodeTrafficHourly;
 use App\Http\Models\User;
 use App\Http\Models\UserBalanceLog;
+use App\Http\Models\UserBanLog;
 use App\Http\Models\UserSubscribe;
 use App\Http\Models\UserSubscribeLog;
 use App\Http\Models\UserTrafficDaily;
@@ -1812,7 +1813,7 @@ class AdminController extends Controller
         }
     }
 
-    // 用户余额变动日志
+    // 用户余额变动记录
     public function userBalanceLogList(Request $request)
     {
         $username = trim($request->get('username'));
@@ -1839,6 +1840,24 @@ class AdminController extends Controller
         return Response::view('admin/userBalanceLogList', $view);
     }
 
+    // 用户封禁记录
+    public function userBanLogList(Request $request)
+    {
+        $username = trim($request->get('username'));
+
+        $query = UserBanLog::query()->with(['user'])->orderBy('id', 'desc');
+
+        if ($username) {
+            $query->whereHas('user', function ($q) use ($username) {
+                $q->where('username', 'like', '%' . $username . '%');
+            });
+        }
+
+        $view['list'] = $query->paginate(10);
+
+        return Response::view('admin/userBanLogList', $view);
+    }
+
     // 用户消费记录
     public function userOrderList(Request $request)
     {

+ 4 - 0
app/Http/Models/UserBanLog.php

@@ -20,4 +20,8 @@ class UserBanLog extends Model
         'status'
     ];
 
+    public function User()
+    {
+        return $this->hasOne(User::class, 'id', 'user_id');
+    }
 }

+ 8 - 2
resources/views/admin/layouts.blade.php

@@ -162,7 +162,7 @@
                         </li>
                     </ul>
                 </li>
-                <li class="nav-item {{in_array(Request::path(), ['admin/userList', 'admin/addUser', 'admin/editUser', 'admin/userOrderList', 'admin/userBalanceLogList', 'admin/export', 'admin/userMonitor']) ? 'active open' : ''}}">
+                <li class="nav-item {{in_array(Request::path(), ['admin/userList', 'admin/addUser', 'admin/editUser', 'admin/userOrderList', 'admin/userBalanceLogList', 'admin/userBanLogList', 'admin/export', 'admin/userMonitor']) ? 'active open' : ''}}">
                     <a href="javascript:;" class="nav-link nav-toggle">
                         <i class="icon-users"></i>
                         <span class="title">用户管理</span>
@@ -184,7 +184,13 @@
                         <li class="nav-item {{in_array(Request::path(), ['admin/userBalanceLogList']) ? 'active open' : ''}}">
                             <a href="{{url('admin/userBalanceLogList')}}" class="nav-link ">
                                 <i class="icon-credit-card"></i>
-                                <span class="title">余额日志</span>
+                                <span class="title">余额变动记录</span>
+                            </a>
+                        </li>
+                        <li class="nav-item {{in_array(Request::path(), ['admin/userBanLogList']) ? 'active open' : ''}}">
+                            <a href="{{url('admin/userBanLogList')}}" class="nav-link ">
+                                <i class="icon-credit-card"></i>
+                                <span class="title">用户封禁记录</span>
                             </a>
                         </li>
                     </ul>

+ 1 - 1
resources/views/admin/userBalanceLogList.blade.php

@@ -16,7 +16,7 @@
                     <div class="portlet-title">
                         <div class="caption font-dark">
                             <i class="icon-credit-card font-dark"></i>
-                            <span class="caption-subject bold uppercase"> 余额日志</span>
+                            <span class="caption-subject bold uppercase"> 余额变动记录 </span>
                         </div>
                     </div>
                     <div class="portlet-body">

+ 95 - 0
resources/views/admin/userBanLogList.blade.php

@@ -0,0 +1,95 @@
+@extends('admin.layouts')
+
+@section('css')
+    <link href="/assets/global/plugins/datatables/datatables.min.css" rel="stylesheet" type="text/css" />
+    <link href="/assets/global/plugins/datatables/plugins/bootstrap/datatables.bootstrap.css" rel="stylesheet" type="text/css" />
+@endsection
+@section('title', '控制面板')
+@section('content')
+    <!-- BEGIN CONTENT BODY -->
+    <div class="page-content" style="padding-top:0;">
+        <!-- BEGIN PAGE BASE CONTENT -->
+        <div class="row">
+            <div class="col-md-12">
+                <!-- BEGIN EXAMPLE TABLE PORTLET-->
+                <div class="portlet light bordered">
+                    <div class="portlet-title">
+                        <div class="caption font-dark">
+                            <i class="icon-credit-card font-dark"></i>
+                            <span class="caption-subject bold uppercase"> 用户封禁记录 </span>
+                        </div>
+                    </div>
+                    <div class="portlet-body">
+                        <div class="row">
+                            <div class="col-md-2 col-sm-2">
+                                <input type="text" class="col-md-4 form-control input-sm" name="username" value="{{Request::get('username')}}" id="username" placeholder="用户名" onkeydown="if(event.keyCode==13){do_search();}">
+                            </div>
+                            <div class="col-md-2 col-sm-2">
+                                <button type="button" class="btn btn-sm blue" onclick="doSearch();">查询</button>
+                                <button type="button" class="btn btn-sm grey" onclick="doReset();">重置</button>
+                            </div>
+                        </div>
+                        <div class="table-scrollable">
+                            <table class="table table-striped table-bordered table-hover table-checkable order-column">
+                                <thead>
+                                <tr>
+                                    <th> # </th>
+                                    <th> 用户名 </th>
+                                    <th> 封禁时长 </th>
+                                    <th> 描述 </th>
+                                    <th> 发生时间 </th>
+                                </tr>
+                                </thead>
+                                <tbody>
+                                    @if($list->isEmpty())
+                                        <tr>
+                                            <td colspan="5">暂无数据</td>
+                                        </tr>
+                                    @else
+                                        @foreach($list as $vo)
+                                            <tr class="odd gradeX">
+                                                <td> {{$vo->id}} </td>
+                                                <td> {{empty($vo->user) ? '【用户已删除】' : $vo->user->username}} </td>
+                                                <td> {{$vo->minutes}}分钟 </td>
+                                                <td> {{$vo->desc}} </td>
+                                                <td> {{$vo->created_at}} </td>
+                                            </tr>
+                                        @endforeach
+                                    @endif
+                                </tbody>
+                            </table>
+                        </div>
+                        <div class="row">
+                            <div class="col-md-4 col-sm-4">
+                                <div class="dataTables_info" role="status" aria-live="polite">共 {{$list->total()}} 条记录</div>
+                            </div>
+                            <div class="col-md-8 col-sm-8">
+                                <div class="dataTables_paginate paging_bootstrap_full_number pull-right">
+                                    {{ $list->links() }}
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <!-- END EXAMPLE TABLE PORTLET-->
+            </div>
+        </div>
+        <!-- END PAGE BASE CONTENT -->
+    </div>
+    <!-- END CONTENT BODY -->
+@endsection
+@section('script')
+    <script type="text/javascript">
+        // 搜索
+        function doSearch() {
+            var username = $("#username").val();
+
+            window.location.href = '{{url('admin/userBanLogList')}}' + '?username=' + username;
+        }
+
+        // 重置
+        function doReset() {
+            window.location.href = '{{url('admin/userBanLogList')}}';
+        }
+    </script>
+@endsection

+ 1 - 0
routes/web.php

@@ -69,6 +69,7 @@ Route::group(['middleware' => ['user', 'admin']], function() {
     Route::post('admin/handleUserBalance', 'AdminController@handleUserBalance'); // 余额充值
     Route::get('admin/userOrderList', 'AdminController@userOrderList'); // 用户消费记录
     Route::get('admin/userBalanceLogList', 'AdminController@userBalanceLogList'); // 余额变动日志
+    Route::get('admin/userBanLogList', 'AdminController@userBanLogList'); // 用户封禁记录
     Route::get('admin/makePasswd', 'AdminController@makePasswd'); // 获取随机密码
     Route::get('admin/download', 'AdminController@download'); // 下载转换过的JSON配置
     Route::any('shop/goodsList', 'ShopController@goodsList'); // 商品列表