瀏覽代碼

feat: user ban status & reason

Cat 3 年之前
父節點
當前提交
1fa9e5b77c

+ 1 - 1
app/routes.php

@@ -38,7 +38,7 @@ return function (SlimApp $app): void {
 
 
         $this->get('/profile', App\Controllers\UserController::class . ':profile');
         $this->get('/profile', App\Controllers\UserController::class . ':profile');
         $this->get('/invite', App\Controllers\UserController::class . ':invite');
         $this->get('/invite', App\Controllers\UserController::class . ':invite');
-        $this->get('/disable', App\Controllers\UserController::class . ':disable');
+        $this->get('/banned', App\Controllers\UserController::class . ':banned');
 
 
         $this->get('/server', App\Controllers\User\ServerController::class . ':userServerPage');
         $this->get('/server', App\Controllers\User\ServerController::class . ':userServerPage');
 
 

+ 2 - 3
db/migrations/20000101000000_init_database.php.new

@@ -24,7 +24,6 @@ final class InitDatabase extends AbstractMigration
             ->addColumn('transfer_total', 'biginteger', [ 'comment' => '账户累计使用流量', 'default' => 0, 'signed' => false])
             ->addColumn('transfer_total', 'biginteger', [ 'comment' => '账户累计使用流量', 'default' => 0, 'signed' => false])
             ->addColumn('transfer_enable', 'biginteger', [ 'comment' => '账户当前可用流量', 'default' => 0, 'signed' => false ])
             ->addColumn('transfer_enable', 'biginteger', [ 'comment' => '账户当前可用流量', 'default' => 0, 'signed' => false ])
             ->addColumn('port', 'integer', [ 'comment' => '用户端口' ])
             ->addColumn('port', 'integer', [ 'comment' => '用户端口' ])
-            ->addColumn('enable', 'boolean', [ 'comment' => '是否启用', 'default' => true ])
             ->addColumn('last_detect_ban_time', 'datetime', [ 'comment' => '最后一次被封禁的时间', 'default' => '1989-06-04 00:05:00' ])
             ->addColumn('last_detect_ban_time', 'datetime', [ 'comment' => '最后一次被封禁的时间', 'default' => '1989-06-04 00:05:00' ])
             ->addColumn('all_detect_number', 'integer', [ 'comment' => '累计违规次数', 'default' => 0 ])
             ->addColumn('all_detect_number', 'integer', [ 'comment' => '累计违规次数', 'default' => 0 ])
             ->addColumn('last_check_in_time', 'biginteger', [ 'comment' => '最后签到时间', 'default' => 0, 'signed' => false ])
             ->addColumn('last_check_in_time', 'biginteger', [ 'comment' => '最后签到时间', 'default' => 0, 'signed' => false ])
@@ -54,8 +53,8 @@ final class InitDatabase extends AbstractMigration
             ->addColumn('protocol_param', 'string', [ 'default' => '' ])
             ->addColumn('protocol_param', 'string', [ 'default' => '' ])
             ->addColumn('obfs', 'string', [ 'comment' => 'SS/SSR混淆方式', 'default' => 'plain' ])
             ->addColumn('obfs', 'string', [ 'comment' => 'SS/SSR混淆方式', 'default' => 'plain' ])
             ->addColumn('obfs_param', 'string', [ 'default' => '' ])
             ->addColumn('obfs_param', 'string', [ 'default' => '' ])
-            ->addColumn('is_banned', 'integer', [ 'default' => 0 ])
-            ->addColumn('banned_reason', 'string', [ 'default' => '' ])
+            ->addColumn('is_banned', 'integer', [ 'comment' => '是否封禁', 'default' => 0 ])
+            ->addColumn('banned_reason', 'string', [ 'comment' => '封禁理由', 'default' => '' ])
             ->addColumn('is_multi_user', 'integer', [ 'default' => 0 ])
             ->addColumn('is_multi_user', 'integer', [ 'default' => 0 ])
             ->addColumn('telegram_id', 'biginteger', [ 'default' => 0 ])
             ->addColumn('telegram_id', 'biginteger', [ 'default' => 0 ])
             ->addColumn('expire_notified', 'boolean', [ 'default' => false])
             ->addColumn('expire_notified', 'boolean', [ 'default' => false])

+ 2 - 2
db/migrations/20221026130700_add_ban_user.php

@@ -10,12 +10,12 @@ final class AddBanUser extends AbstractMigration
     {
     {
         if (! $this->table('user')->hasColumn('is_banned')) {
         if (! $this->table('user')->hasColumn('is_banned')) {
             $this->table('user')
             $this->table('user')
-                ->addColumn('is_banned', 'integer', ['default' => 0])
+                ->addColumn('is_banned', 'integer', [ 'comment' => '是否封禁', 'default' => 0 ])
                 ->save();
                 ->save();
         }
         }
         if (! $this->table('user')->hasColumn('banned_reason')) {
         if (! $this->table('user')->hasColumn('banned_reason')) {
             $this->table('user')
             $this->table('user')
-                ->addColumn('banned_reason', 'string', [ 'default' => '' ])
+                ->addColumn('banned_reason', 'string', [ 'comment' => '封禁理由', 'default' => '' ])
                 ->save();
                 ->save();
         }
         }
         if ($this->table('user')->hasColumn('is_hide')) {
         if ($this->table('user')->hasColumn('is_hide')) {

+ 24 - 0
db/migrations/20221026143200_remove_user_enable.php

@@ -0,0 +1,24 @@
+<?php
+
+declare(strict_types=1);
+
+use Phinx\Migration\AbstractMigration;
+
+final class RemoveUserEnable extends AbstractMigration
+{
+    public function up(): void
+    {
+        if (! $this->table('user')->hasColumn('enable')) {
+            $this->table('user')
+                ->removeColumn('enable')
+                ->save();
+        }
+    }
+
+    public function down(): void
+    {
+        $this->table('user')
+            ->addColumn('enable', 'boolean', [ 'comment' => '是否启用', 'default' => true ])
+            ->save();
+    }
+}

+ 20 - 17
resources/views/tabler/admin/user/edit.tpl

@@ -40,14 +40,6 @@
                                     </label>
                                     </label>
                                 </div>
                                 </div>
                             </div>
                             </div>
-                            <div class="form-group form-group-label">
-                                <div class="checkbox switch">
-                                    <label for="enable">
-                                        <input {if $edit_user->enable==1}checked{/if} class="access-hide" id="enable"
-                                               type="checkbox"><span class="switch-toggle"></span>用户启用
-                                    </label>
-                                </div>
-                            </div>
                             <div class="form-group form-group-label">
                             <div class="form-group form-group-label">
                                 <div class="checkbox switch">
                                 <div class="checkbox switch">
                                     <label for="ga_enable">
                                     <label for="ga_enable">
@@ -82,27 +74,38 @@
 					<div class="card-main">
 					<div class="card-main">
 						<div class="card-inner">
 						<div class="card-inner">
                             <div class="form-group form-group-label">
                             <div class="form-group form-group-label">
-                                <label class="floating-label" for="ban_time">手动封禁时长 (分钟),不封禁不要修改</label>
-                                <input class="form-control maxwidth-edit" id="ban_time" type="text"
-                                       value="0">
+                                <label for="is_banned">
+                                    <label class="floating-label" for="sort">账户状态</label>
+                                    <select id="is_banned" class="form-control maxwidth-edit" name="is_multi_user">
+                                        <option value="0" {if $edit_user->is_banned==0}selected{/if}>正常
+                                        </option>
+                                        <option value="1" {if $edit_user->is_banned==1}selected{/if}>手动封禁
+                                        </option>
+                                    </select>
+                                </label>
+                            </div>
+                            <div class="form-group form-group-label">
+                                <label class="floating-label" for="banned_reason">手动封禁理由</label>
+                                <input class="form-control maxwidth-edit" id="banned_reason" type="text"
+                                       value="{$edit_user->banned_reason}">
                             </div>
                             </div>
                             <div class="form-group form-group-label">
                             <div class="form-group form-group-label">
-                                <label class="floating-label" for="last_detect_ban_time">最后一次被封禁的时间</label>
+                                <label class="floating-label" for="last_detect_ban_time">最后一次被自动封禁的时间</label>
                                 <input class="form-control maxwidth-edit" id="last_detect_ban_time" type="text"
                                 <input class="form-control maxwidth-edit" id="last_detect_ban_time" type="text"
                                        value="{$edit_user->lastDetectBanTime()}" readonly>
                                        value="{$edit_user->lastDetectBanTime()}" readonly>
                             </div>
                             </div>
                             <div class="form-group form-group-label">
                             <div class="form-group form-group-label">
-                                <label class="floating-label" for="relieve_time">当前解封时间</label>
+                                <label class="floating-label" for="relieve_time">当前自动解封时间</label>
                                 <input class="form-control maxwidth-edit" id="relieve_time" type="text"
                                 <input class="form-control maxwidth-edit" id="relieve_time" type="text"
                                        value="{$edit_user->relieveTime()}" readonly>
                                        value="{$edit_user->relieveTime()}" readonly>
                             </div>
                             </div>
                             <div class="form-group form-group-label">
                             <div class="form-group form-group-label">
-                                <label class="floating-label" for="detect_ban_number">累计封禁次数</label>
+                                <label class="floating-label" for="detect_ban_number">累计自动封禁次数</label>
                                 <input class="form-control maxwidth-edit" id="detect_ban_number" type="text"
                                 <input class="form-control maxwidth-edit" id="detect_ban_number" type="text"
                                        value="{if $edit_user->detectBanNumber()==0}标杆用户,没有被封禁过耶{else}太坏了,这位用户累计被封禁过 {$edit_user->detectBanNumber()} 次呢{/if}" readonly>
                                        value="{if $edit_user->detectBanNumber()==0}标杆用户,没有被封禁过耶{else}太坏了,这位用户累计被封禁过 {$edit_user->detectBanNumber()} 次呢{/if}" readonly>
                             </div>
                             </div>
                             <div class="form-group form-group-label">
                             <div class="form-group form-group-label">
-                                <label class="floating-label" for="all_detect_number">累计违规次数</label>
+                                <label class="floating-label" for="all_detect_number">累计审计规则触发次数</label>
                                 <input class="form-control maxwidth-edit" id="all_detect_number" type="text"
                                 <input class="form-control maxwidth-edit" id="all_detect_number" type="text"
                                        value="{$edit_user->all_detect_number}" readonly>
                                        value="{$edit_user->all_detect_number}" readonly>
                             </div>
                             </div>
@@ -323,10 +326,10 @@
                     remark: $$getValue('remark'),
                     remark: $$getValue('remark'),
                     user_name: $$getValue('user_name'),
                     user_name: $$getValue('user_name'),
                     money: $$getValue('money'),
                     money: $$getValue('money'),
-                    enable,
                     is_admin,
                     is_admin,
                     ga_enable,
                     ga_enable,
-                    ban_time: $$getValue('ban_time'),
+                    is_banned: $$getValue('is_banned'),
+                    banned_reason: $$getValue('banned_reason'),
                     ref_by: $$getValue('ref_by'),
                     ref_by: $$getValue('ref_by'),
                     forbidden_ip: $$getValue('forbidden_ip'),
                     forbidden_ip: $$getValue('forbidden_ip'),
                     forbidden_port: $$getValue('forbidden_port'),
                     forbidden_port: $$getValue('forbidden_port'),

+ 12 - 6
resources/views/tabler/user/disable.tpl → resources/views/tabler/user/banned.tpl

@@ -1,4 +1,5 @@
 {include file='user/tabler_header.tpl'}
 {include file='user/tabler_header.tpl'}
+
 <div class="page-wrapper">
 <div class="page-wrapper">
     <div class="container-xl">
     <div class="container-xl">
         <!-- Page title -->
         <!-- Page title -->
@@ -7,10 +8,10 @@
                 <div class="col">
                 <div class="col">
                     <!-- Page pre-title -->
                     <!-- Page pre-title -->
                     <h2 class="page-title">
                     <h2 class="page-title">
-                        <span class="home-title">访问受限</span>
+                        <span class="home-title">账户已被封禁</span>
                     </h2>
                     </h2>
                     <div class="page-pretitle">
                     <div class="page-pretitle">
-                        <span class="home-subtitle">你暂时无法访问除此页面外的其他页面</span>
+                        <span class="home-subtitle">你的账户功能已被停用,并且禁止访问用户中心</span>
                     </div>
                     </div>
                 </div>
                 </div>
             </div>
             </div>
@@ -23,15 +24,20 @@
                     <div class="card">
                     <div class="card">
                         <div class="empty">
                         <div class="empty">
                             <div class="empty-img">
                             <div class="empty-img">
-                                <img src="/theme/tabler/static/illustrations/undraw_quitting_time_dm8t.svg" height="128"
-                                    alt="">
+                                <i class="ti ti-circle-x icon mb-2 text-danger icon-lg" style="font-size:3.5rem;"></i>
                             </div>
                             </div>
-                            <p class="empty-title">账户被停用</p>
-                            <p class="empty-subtitle text-muted">你的账户被管理员停用了,请联系管理员</p>
+                            {if $banned_reason == null}
+                            <p class="empty-title">账户被系统封禁</p>
+                            <p class="empty-subtitle text-muted">你的账户被系统自动封禁了,请联系管理员</p>
+                            {else}
+                            <p class="empty-title">以下是你被封禁的理由</p>
+                            <p class="empty-subtitle text-muted">{$banned_reason}</p>
+                            {/if}
                         </div>
                         </div>
                     </div>
                     </div>
                 </div>
                 </div>
             </div>
             </div>
         </div>
         </div>
     </div>
     </div>
+    
 {include file='user/tabler_footer.tpl'}
 {include file='user/tabler_footer.tpl'}

+ 3 - 3
src/Command/DetectBan.php

@@ -43,7 +43,7 @@ final class DetectBan extends Command
                 $user->all_detect_number += $value;
                 $user->all_detect_number += $value;
                 $user->save();
                 $user->save();
 
 
-                if ($user->enable === 0 || ($user->is_admin && $_ENV['auto_detect_ban_allow_admin'] === true) || \in_array($user->id, $_ENV['auto_detect_ban_allow_users'])) {
+                if ($user->is_banned === 1 || ($user->is_admin && $_ENV['auto_detect_ban_allow_admin'] === true) || \in_array($user->id, $_ENV['auto_detect_ban_allow_users'])) {
                     // 如果用户已被封禁
                     // 如果用户已被封禁
                     // 如果用户是管理员
                     // 如果用户是管理员
                     // 如果属于钦定用户
                     // 如果属于钦定用户
@@ -58,7 +58,7 @@ final class DetectBan extends Command
                     if ($detect_number >= $_ENV['auto_detect_ban_number']) {
                     if ($detect_number >= $_ENV['auto_detect_ban_number']) {
                         $last_detect_ban_time = $user->last_detect_ban_time;
                         $last_detect_ban_time = $user->last_detect_ban_time;
                         $end_time = date('Y-m-d H:i:s');
                         $end_time = date('Y-m-d H:i:s');
-                        $user->enable = 0;
+                        $user->is_banned = 1;
                         $user->last_detect_ban_time = $end_time;
                         $user->last_detect_ban_time = $end_time;
                         $user->save();
                         $user->save();
                         $DetectBanLog = new DetectBanLog();
                         $DetectBanLog = new DetectBanLog();
@@ -88,7 +88,7 @@ final class DetectBan extends Command
                         } else {
                         } else {
                             $last_detect_ban_time = $user->last_detect_ban_time;
                             $last_detect_ban_time = $user->last_detect_ban_time;
                             $end_time = date('Y-m-d H:i:s');
                             $end_time = date('Y-m-d H:i:s');
-                            $user->enable = 0;
+                            $user->is_banned = 1;
                             $user->last_detect_ban_time = $end_time;
                             $user->last_detect_ban_time = $end_time;
                             $user->save();
                             $user->save();
                             $DetectBanLog = new DetectBanLog();
                             $DetectBanLog = new DetectBanLog();

+ 2 - 2
src/Command/Job.php

@@ -520,11 +520,11 @@ EOL;
             }
             }
 
 
             // 审计封禁解封
             // 审计封禁解封
-            if ($user->enable === 0) {
+            if ($user->is_banned === 1) {
                 $logs = DetectBanLog::where('user_id', $user->id)->orderBy('id', 'desc')->first();
                 $logs = DetectBanLog::where('user_id', $user->id)->orderBy('id', 'desc')->first();
                 if ($logs !== null) {
                 if ($logs !== null) {
                     if (($logs->end_time + $logs->ban_time * 60) <= \time()) {
                     if (($logs->end_time + $logs->ban_time * 60) <= \time()) {
-                        $user->enable = 1;
+                        $user->is_banned = 0;
                     }
                     }
                 }
                 }
             }
             }

+ 2 - 20
src/Controllers/Admin/UserController.php

@@ -6,7 +6,6 @@ namespace App\Controllers\Admin;
 
 
 use App\Controllers\BaseController;
 use App\Controllers\BaseController;
 use App\Models\Bought;
 use App\Models\Bought;
-use App\Models\DetectBanLog;
 use App\Models\Setting;
 use App\Models\Setting;
 use App\Models\Shop;
 use App\Models\Shop;
 use App\Models\User;
 use App\Models\User;
@@ -231,7 +230,8 @@ final class UserController extends BaseController
         $user->method = $request->getParam('method');
         $user->method = $request->getParam('method');
         $user->node_speedlimit = $request->getParam('node_speedlimit');
         $user->node_speedlimit = $request->getParam('node_speedlimit');
         $user->node_connector = $request->getParam('node_connector');
         $user->node_connector = $request->getParam('node_connector');
-        $user->enable = $request->getParam('enable');
+        $user->is_banned = $request->getParam('is_banned');
+        $user->banned_reason = $request->getParam('banned_reason');
         $user->is_admin = $request->getParam('is_admin');
         $user->is_admin = $request->getParam('is_admin');
         $user->ga_enable = $request->getParam('ga_enable');
         $user->ga_enable = $request->getParam('ga_enable');
         $user->node_group = $request->getParam('group');
         $user->node_group = $request->getParam('group');
@@ -246,24 +246,6 @@ final class UserController extends BaseController
         $user->forbidden_ip = str_replace(PHP_EOL, ',', $request->getParam('forbidden_ip'));
         $user->forbidden_ip = str_replace(PHP_EOL, ',', $request->getParam('forbidden_ip'));
         $user->forbidden_port = str_replace(PHP_EOL, ',', $request->getParam('forbidden_port'));
         $user->forbidden_port = str_replace(PHP_EOL, ',', $request->getParam('forbidden_port'));
 
 
-        // 手动封禁
-        $ban_time = (int) $request->getParam('ban_time');
-        if ($ban_time > 0) {
-            $user->enable = 0;
-            $end_time = date('Y-m-d H:i:s');
-            $user->last_detect_ban_time = $end_time;
-            $DetectBanLog = new DetectBanLog();
-            $DetectBanLog->user_name = $user->user_name;
-            $DetectBanLog->user_id = $user->id;
-            $DetectBanLog->email = $user->email;
-            $DetectBanLog->detect_number = '0';
-            $DetectBanLog->ban_time = $ban_time;
-            $DetectBanLog->start_time = strtotime('1989-06-04 00:05:00');
-            $DetectBanLog->end_time = strtotime($end_time);
-            $DetectBanLog->all_detect_number = $user->all_detect_number;
-            $DetectBanLog->save();
-        }
-
         if (! $user->save()) {
         if (! $user->save()) {
             return $response->withJson([
             return $response->withJson([
                 'ret' => 0,
                 'ret' => 0,

+ 1 - 0
src/Controllers/Node/UserController.php

@@ -56,6 +56,7 @@ final class UserController extends BaseController
         }
         }
 
 
         $users_raw = User::where('enable', 1)
         $users_raw = User::where('enable', 1)
+            ->where('is_banned', '=', 0)
             ->where('expire_in', '>', date('Y-m-d H:i:s'))
             ->where('expire_in', '>', date('Y-m-d H:i:s'))
             ->where(static function (Builder $query) use ($node): void {
             ->where(static function (Builder $query) use ($node): void {
                 $query->whereRaw(
                 $query->whereRaw(

+ 5 - 2
src/Controllers/UserController.php

@@ -992,9 +992,12 @@ final class UserController extends BaseController
     /**
     /**
      * @param array     $args
      * @param array     $args
      */
      */
-    public function disable(Request $request, Response $response, array $args)
+    public function banned(Request $request, Response $response, array $args)
     {
     {
-        return $this->view()->display('user/disable.tpl');
+        $user = $this->user;
+        return $this->view()
+            ->assign('banned_reason', $user->banned_reason)
+            ->display('user/banned.tpl');
     }
     }
 
 
     /**
     /**

+ 3 - 3
src/Middleware/Auth.php

@@ -14,9 +14,9 @@ final class Auth
         if (! $user->isLogin) {
         if (! $user->isLogin) {
             return $response->withStatus(302)->withHeader('Location', '/auth/login');
             return $response->withStatus(302)->withHeader('Location', '/auth/login');
         }
         }
-        $enablePages = ['/user/disable', '/user/backtoadmin', '/user/logout'];
-        if ($user->enable === 0 && ! \in_array($_SERVER['REQUEST_URI'], $enablePages)) {
-            return $response->withStatus(302)->withHeader('Location', '/user/disable');
+        $enablePages = ['/user/banned', '/user/backtoadmin', '/user/logout'];
+        if ($user->is_banned === 0 && ! \in_array($_SERVER['REQUEST_URI'], $enablePages)) {
+            return $response->withStatus(302)->withHeader('Location', '/user/banned');
         }
         }
         return $next($request, $response);
         return $next($request, $response);
     }
     }

+ 1 - 1
src/Utils/Telegram/Reply.php

@@ -90,7 +90,7 @@ final class Reply
             '',
             '',
             '用户邮箱:' . TelegramTools::getUserEmail($user->email, $ChatID),
             '用户邮箱:' . TelegramTools::getUserEmail($user->email, $ChatID),
             '账户余额:' . $user->money,
             '账户余额:' . $user->money,
-            '是否启用:' . ((int) $user->enable === 1 ? '启用' : '禁用'),
+            '账户状态:' . ((int) $user->is_banned === 1 ? '封禁' : '正常'),
             '用户等级:' . $user->class,
             '用户等级:' . $user->class,
             '剩余流量:' . $user->unusedTraffic(),
             '剩余流量:' . $user->unusedTraffic(),
             '等级到期:' . $user->class_expire,
             '等级到期:' . $user->class_expire,