소스 검색

refactor: new admin user edit ui

Cat 1 년 전
부모
커밋
a64454ed21

+ 120 - 91
resources/views/tabler/admin/user/edit.tpl

@@ -29,11 +29,11 @@
                 <div class="col-md-4 col-sm-12">
                     <div class="card">
                         <div class="card-header card-header-light">
-                            <h3 class="card-title">基础信息</h3>
+                            <h3 class="card-title">账户信息</h3>
                         </div>
                         <div class="card-body">
                             <div class="form-group mb-3 row">
-                                <label class="form-label col-3 col-form-label">注册邮箱</label>
+                                <label class="form-label col-3 col-form-label">邮箱</label>
                                 <div class="col">
                                     <input id="email" type="email" class="form-control" value="{$edit_user->email}">
                                 </div>
@@ -45,13 +45,6 @@
                                            value="{$edit_user->user_name}">
                                 </div>
                             </div>
-                            <div class="form-group mb-3 row">
-                                <label class="form-label col-3 col-form-label">备注</label>
-                                <div class="col">
-                                    <input id="remark" type="text" class="form-control" value="{$edit_user->remark}"
-                                           placeholder="仅管理员可见">
-                                </div>
-                            </div>
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label">账户密码</label>
                                 <div class="col">
@@ -62,43 +55,62 @@
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-3 col-form-label">账户余额</label>
                                 <div class="col">
-                                    <input id="money" type="number" step="0.1" class="form-control"
+                                    <input id="money" type="number" step="1" class="form-control"
                                            value="{$edit_user->money}">
                                 </div>
                             </div>
-                            <div class="hr-text">
-                                <span>时间设置</span>
+                            <div class="form-group mb-3 row">
+                                <label class="form-label col-3 col-form-label">邀请人</label>
+                                <div class="col">
+                                    <input id="ref_by" type="text" class="form-control" value="{$edit_user->ref_by}">
+                                </div>
                             </div>
                             <div class="form-group mb-3 row">
-                                <label class="form-label col-4 col-form-label">等级过期时间</label>
+                                <label class="form-label col-3 col-form-label">SS端口</label>
                                 <div class="col">
-                                    <input id="class_expire" type="text" class="form-control"
-                                           value="{$edit_user->class_expire}">
+                                    <input id="port" type="text" class="form-control" value="{$edit_user->port}">
                                 </div>
                             </div>
                             <div class="form-group mb-3 row">
-                                <label class="form-label col-4 col-form-label">免费用户流量重置日</label>
+                                <label class="form-label col-3 col-form-label">SS加密方式</label>
                                 <div class="col">
-                                    <input id="auto_reset_day" type="text" class="form-control"
-                                           value="{$edit_user->auto_reset_day}">
+                                    <select id="method" class="col form-select" value="{$edit_user->method}">
+                                        {foreach $ss_methods as $method}
+                                            <option value="{$method}" {if $edit_user->method === $method}selected{/if}>
+                                                {$method}
+                                            </option>
+                                        {/foreach}
+                                    </select>
                                 </div>
                             </div>
                             <div class="form-group mb-3 row">
-                                <label class="form-label col-4 col-form-label">
-                                    重置的免费流量(GB)
-                                </label>
+                                <label class="form-label col-3 col-form-label">注册IP</label>
                                 <div class="col">
-                                    <input id="auto_reset_bandwidth" type="text" class="form-control"
-                                           value="{$edit_user->auto_reset_bandwidth}">
+                                    <input type="text" class="form-control" value="{$edit_user->reg_ip}" disabled/>
                                 </div>
                             </div>
-                            <div class="hr-text">
-                                <span>邀请注册</span>
+                            <div class="form-group mb-3 row">
+                                <label class="form-label col-3 col-form-label">注册日期</label>
+                                <div class="col">
+                                    <input type="text" class="form-control" value="{$edit_user->reg_date}" disabled/>
+                                </div>
                             </div>
                             <div class="form-group mb-3 row">
-                                <label class="form-label col-4 col-form-label">邀请人</label>
+                                <label class="form-label col-3 col-form-label">最后使用时间</label>
                                 <div class="col">
-                                    <input id="ref_by" type="text" class="form-control" value="{$edit_user->ref_by}">
+                                    <input type="text" class="form-control" value="{$edit_user->last_use_time}" disabled/>
+                                </div>
+                            </div>
+                            <div class="form-group mb-3 row">
+                                <label class="form-label col-3 col-form-label">最后签到时间</label>
+                                <div class="col">
+                                    <input type="text" class="form-control" value="{$edit_user->last_check_in_time}" disabled/>
+                                </div>
+                            </div>
+                            <div class="form-group mb-3 row">
+                                <label class="form-label col-3 col-form-label">最后登录时间</label>
+                                <div class="col">
+                                    <input type="text" class="form-control" value="{$edit_user->last_login_time}" disabled/>
                                 </div>
                             </div>
                         </div>
@@ -107,7 +119,7 @@
                 <div class="col-md-4 col-sm-12">
                     <div class="card">
                         <div class="card-header card-header-light">
-                            <h3 class="card-title">其他信息</h3>
+                            <h3 class="card-title">使用限制</h3>
                         </div>
                         <div class="card-body">
                             <div class="form-group mb-3 row">
@@ -120,19 +132,86 @@
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-4 col-form-label">当期用量</label>
                                 <div class="col">
-                                    <input id="usedTraffic" type="text" class="form-control"
+                                    <input type="text" class="form-control"
                                            value="{$edit_user->usedTraffic()}" disabled/>
                                 </div>
                             </div>
                             <div class="form-group mb-3 row">
                                 <label class="form-label col-4 col-form-label">累计用量</label>
                                 <div class="col">
-                                    <input id="usedTraffic" type="text" class="form-control"
+                                    <input type="text" class="form-control"
                                            value="{$edit_user->totalTraffic()}" disabled/>
                                 </div>
                             </div>
-                            <div class="hr-text">
-                                <span>高级选项</span>
+                            <div class="form-group mb-3 row">
+                                <label class="form-label col-4 col-form-label">节点群组</label>
+                                <div class="col">
+                                    <input id="node_group" type="text" class="form-control"
+                                           value="{$edit_user->node_group}">
+                                </div>
+                            </div>
+                            <div class="form-group mb-3 row">
+                                <label class="form-label col-4 col-form-label">账户等级</label>
+                                <div class="col">
+                                    <input id="class" type="text" class="form-control"
+                                           value="{$edit_user->class}">
+                                </div>
+                            </div>
+                            <div class="form-group mb-3 row">
+                                <label class="form-label col-4 col-form-label">等级过期时间</label>
+                                <div class="col">
+                                    <input id="class_expire" type="text" class="form-control"
+                                           value="{$edit_user->class_expire}">
+                                </div>
+                            </div>
+                            <div class="form-group mb-3 row">
+                                <label class="form-label col-4 col-form-label">免费用户流量重置日</label>
+                                <div class="col">
+                                    <input id="auto_reset_day" type="text" class="form-control"
+                                           value="{$edit_user->auto_reset_day}">
+                                </div>
+                            </div>
+                            <div class="form-group mb-3 row">
+                                <label class="form-label col-4 col-form-label">重置的免费流量(GB)</label>
+                                <div class="col">
+                                    <input id="auto_reset_bandwidth" type="text" class="form-control"
+                                           value="{$edit_user->auto_reset_bandwidth}">
+                                </div>
+                            </div>
+                            <div class="form-group mb-3 row">
+                                <label class="form-label col-4 col-form-label">速度限制 (Mbps)</label>
+                                <div class="col">
+                                    <input id="node_speedlimit" type="text" class="form-control"
+                                           value="{$edit_user->node_speedlimit}">
+                                </div>
+                            </div>
+                            <div class="form-group mb-3 row">
+                                <label class="form-label col-4 col-form-label">同時连接 IP 限制</label>
+                                <div class="col">
+                                    <input id="node_iplimit" type="text" class="form-control"
+                                           value="{$edit_user->node_iplimit}">
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-md-4 col-sm-12">
+                    <div class="card">
+                        <div class="card-header card-header-light">
+                            <h3 class="card-title">其他设置</h3>
+                        </div>
+                        <div class="card-body">
+                            <div class="form-group mb-3 row">
+                                <label class="form-label col-3 col-form-label">显示语言</label>
+                                <div class="col">
+                                    <select id="locale" class="col form-select" value="{$edit_user->locale}">
+                                        {foreach $locales as $locale}
+                                        <option value="{$locale}" {if $edit_user->locale === $locale}selected{/if}>
+                                            {$locale}
+                                        </option>
+                                        {/foreach}
+                                    </select>
+                                </div>
                             </div>
                             <div class="form-group mb-3 row">
                                 <span class="col">管理员</span>
@@ -153,7 +232,7 @@
                                 </span>
                             </div>
                             <div class="form-group mb-3 row">
-                                <span class="col">账户异常状态</span>
+                                <span class="col">账户异常状态(Shadow Banned)</span>
                                 <span class="col-auto form-check-single form-switch">
                                     <input id="is_shadow_banned" class="form-check-input" type="checkbox"
                                            {if $edit_user->is_shadow_banned}checked=""{/if}>
@@ -168,68 +247,18 @@
                                     </label>
                                 </span>
                             </div>
-                            <div class="form-group mb-3 row">
-                                <span class="col">手动封禁理由</span>
+                            <div class="form-group mb-3 col-12">
+                                <span class="form-label col-12 col-form-label">手动封禁理由</span>
                                 <span class="col-auto">
-                                    <input id="banned_reason" type="text" class="form-control"
-                                           value="{$edit_user->banned_reason}">
+                                    <textarea id="banned_reason" class="form-control"
+                                              value="{$edit_user->banned_reason}"></textarea>
                                 </span>
                             </div>
-                        </div>
-                    </div>
-                </div>
-                <div class="col-md-4 col-sm-12">
-                    <div class="card">
-                        <div class="card-header card-header-light">
-                            <h3 class="card-title">连接设置</h3>
-                        </div>
-                        <div class="card-body">
-                            <div class="form-group mb-3 row">
-                                <label class="form-label col-3 col-form-label">端口</label>
-                                <div class="col">
-                                    <input id="port" type="text" class="form-control" value="{$edit_user->port}">
-                                </div>
-                            </div>
-                            <div class="form-group mb-3 row">
-                                <label class="form-label col-3 col-form-label">密码</label>
-                                <div class="col">
-                                    <input id="passwd" type="text" class="form-control" value="{$edit_user->passwd}" disabled/>
-                                </div>
-                            </div>
-                            <div class="form-group mb-3 row">
-                                <label class="form-label col-3 col-form-label">加密</label>
-                                <div class="col">
-                                    <input id="method" type="text" class="form-control" value="{$edit_user->method}">
-                                </div>
-                            </div>
-                            <div class="hr-text">
-                                <span>使用限制</span>
-                            </div>
                             <div class="form-group mb-3 col-12">
-                                <label class="form-label col-12 col-form-label">节点群组</label>
+                                <label class="form-label col-12 col-form-label">账户备注</label>
                                 <div class="col">
-                                    <input id="node_group" type="text" class="form-control"
-                                           value="{$edit_user->node_group}">
-                                </div>
-                            </div>
-                            <div class="form-group mb-3 col-12">
-                                <label class="form-label col-12 col-form-label">账户等级</label>
-                                <div class="col">
-                                    <input id="class" type="text" class="form-control" value="{$edit_user->class}">
-                                </div>
-                            </div>
-                            <div class="form-group mb-3 col-12">
-                                <label class="form-label col-12 col-form-label">速度限制 (Mbps)</label>
-                                <div class="col">
-                                    <input id="node_speedlimit" type="text" class="form-control"
-                                           value="{$edit_user->node_speedlimit}">
-                                </div>
-                            </div>
-                            <div class="form-group mb-3 col-12">
-                                <label class="form-label col-12 col-form-label">同時连接 IP 限制</label>
-                                <div class="col">
-                                    <input id="node_iplimit" type="text" class="form-control"
-                                           value="{$edit_user->node_iplimit}">
+                                    <textarea id="remark" class="form-control" value="{$edit_user->remark}"
+                                              placeholder="仅管理员可见"></textarea>
                                 </div>
                             </div>
                         </div>
@@ -251,9 +280,9 @@
                 {$key}: $('#{$key}').val(),
                 {/foreach}
                 is_admin: $("#is_admin").is(":checked"),
-                is_banned: $("#is_banned").is(":checked"),
                 ga_enable: $("#ga_enable").is(":checked"),
                 is_shadow_banned: $("#is_shadow_banned").is(":checked"),
+                is_banned: $("#is_banned").is(":checked"),
             },
             success: function (data) {
                 if (data.ret === 1) {

+ 36 - 22
src/Controllers/Admin/UserController.php

@@ -9,6 +9,7 @@ use App\Controllers\BaseController;
 use App\Models\Config;
 use App\Models\User;
 use App\Models\UserMoneyLog;
+use App\Services\I18n;
 use App\Utils\Hash;
 use App\Utils\Tools;
 use Exception;
@@ -66,26 +67,22 @@ final class UserController extends BaseController
     private static array $update_field = [
         'email',
         'user_name',
-        'remark',
         'pass',
         'money',
-        'is_admin',
-        'ga_enable',
-        'is_banned',
-        'banned_reason',
-        'is_shadow_banned',
-        'transfer_enable',
         'ref_by',
-        'class_expire',
+        'port',
+        'method',
+        'transfer_enable',
         'node_group',
         'class',
+        'class_expire',
         'auto_reset_day',
         'auto_reset_bandwidth',
         'node_speedlimit',
         'node_iplimit',
-        'port',
-        'passwd',
-        'method',
+        'locale',
+        'banned_reason',
+        'remark',
     ];
 
     /**
@@ -130,7 +127,17 @@ final class UserController extends BaseController
             $password = Tools::genRandomChar(16);
         }
 
-        (new AuthController())->registerHelper($response, 'user', $email, $password, '', 0, '', $balance, 1);
+        (new AuthController())->registerHelper(
+            $response,
+            'user',
+            $email,
+            $password,
+            '',
+            0,
+            '',
+            $balance,
+            1
+        );
         $user = (new User())->where('email', $email)->first();
 
         if ($ref_by !== '') {
@@ -150,11 +157,16 @@ final class UserController extends BaseController
     public function edit(ServerRequest $request, Response $response, array $args): ResponseInterface
     {
         $user = (new User())->find($args['id']);
+        $user->last_use_time = Tools::toDateTime($user->last_use_time);
+        $user->last_check_in_time = Tools::toDateTime($user->last_check_in_time);
+        $user->last_login_time = Tools::toDateTime($user->last_login_time);
 
         return $response->write(
             $this->view()
                 ->assign('update_field', self::$update_field)
                 ->assign('edit_user', $user)
+                ->assign('ss_methods', Tools::getSsMethod())
+                ->assign('locales', I18n::getLocaleList())
                 ->fetch('admin/user/edit.tpl')
         );
     }
@@ -185,23 +197,24 @@ final class UserController extends BaseController
 
         $user->email = $request->getParam('email');
         $user->user_name = $request->getParam('user_name');
-        $user->remark = $request->getParam('remark');
-        $user->is_admin = $request->getParam('is_admin') === 'true' ? 1 : 0;
-        $user->ga_enable = $request->getParam('ga_enable') === 'true' ? 1 : 0;
-        $user->is_banned = $request->getParam('is_banned') === 'true' ? 1 : 0;
-        $user->banned_reason = $request->getParam('banned_reason');
-        $user->is_shadow_banned = $request->getParam('is_shadow_banned') === 'true' ? 1 : 0;
-        $user->transfer_enable = Tools::autoBytesR($request->getParam('transfer_enable'));
         $user->ref_by = $request->getParam('ref_by');
-        $user->class_expire = $request->getParam('class_expire');
+        $user->port = $request->getParam('port');
+        $user->method = $request->getParam('method');
+        $user->transfer_enable = Tools::autoBytesR($request->getParam('transfer_enable'));
         $user->node_group = $request->getParam('node_group');
         $user->class = $request->getParam('class');
+        $user->class_expire = $request->getParam('class_expire');
         $user->auto_reset_day = $request->getParam('auto_reset_day');
         $user->auto_reset_bandwidth = $request->getParam('auto_reset_bandwidth');
         $user->node_speedlimit = $request->getParam('node_speedlimit');
         $user->node_iplimit = $request->getParam('node_iplimit');
-        $user->port = $request->getParam('port');
-        $user->method = $request->getParam('method');
+        $user->locale = $request->getParam('locale');
+        $user->is_admin = $request->getParam('is_admin') === 'true' ? 1 : 0;
+        $user->ga_enable = $request->getParam('ga_enable') === 'true' ? 1 : 0;
+        $user->is_shadow_banned = $request->getParam('is_shadow_banned') === 'true' ? 1 : 0;
+        $user->is_banned = $request->getParam('is_banned') === 'true' ? 1 : 0;
+        $user->banned_reason = $request->getParam('banned_reason');
+        $user->remark = $request->getParam('remark');
 
         if (! $user->save()) {
             return $response->withJson([
@@ -209,6 +222,7 @@ final class UserController extends BaseController
                 'msg' => '修改失败',
             ]);
         }
+
         return $response->withJson([
             'ret' => 1,
             'msg' => '修改成功',

+ 1 - 1
src/Controllers/User/InfoController.php

@@ -33,7 +33,7 @@ final class InfoController extends BaseController
     public function index(ServerRequest $request, Response $response, array $args): ResponseInterface
     {
         $themes = Tools::getDir(BASE_PATH . '/resources/views');
-        $methods = Tools::getSsMethod('method');
+        $methods = Tools::getSsMethod();
         $ga_url = MFA::getGaUrl($this->user);
 
         return $response->write($this->view()

+ 1 - 1
src/Services/Bot/Telegram/Callback.php

@@ -586,7 +586,7 @@ final class Callback
             case 'encrypt':
                 // 加密方式更改
                 $keyboard = $back;
-                $method = Tools::getSsMethod('method');
+                $method = Tools::getSsMethod();
 
                 if (isset($CallbackDataExplode[1])) {
                     if (in_array($CallbackDataExplode[1], $method)) {

+ 1 - 1
src/Utils/Tools.php

@@ -295,7 +295,7 @@ final class Tools
         return false;
     }
 
-    public static function getSsMethod($type): array
+    public static function getSsMethod(string $type = ''): array
     {
         return match ($type) {
             'ss_obfs' => [

+ 1 - 1
tests/App/Utils/ToolsTest.php

@@ -286,7 +286,7 @@ class ToolsTest extends TestCase
             'chacha20-ietf-poly1305',
             'xchacha20-ietf-poly1305',
         ];
-        $result4 = Tools::getSsMethod('');
+        $result4 = Tools::getSsMethod();
         $this->assertEquals($expected4, $result4);
     }