界面布局优化

This commit is contained in:
2026-07-23 23:14:56 +08:00
parent c2fec22587
commit be4e0aec14
8 changed files with 281 additions and 127 deletions
+55 -37
View File
@@ -28,12 +28,7 @@
<!-- Logo 区域(可替换) -->
<div class="login-logo">
<svg viewBox="0 0 64 64" preserveAspectRatio="xMidYMid meet" style="width:100%; height:100%; display:block;" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="4" y="4" width="56" height="56" rx="16" stroke="#4a7cff" stroke-width="2" opacity="0.3"/>
<path d="M20 44L32 20L44 44H36L32 36L28 44H20Z" fill="#4a7cff" opacity="0.9"/>
<circle cx="32" cy="32" r="4" fill="#4a7cff" opacity="0.6"/>
<path d="M32 12V18M32 46V52M14 32H20M44 32H50M18 18L22 22M42 42L46 46M18 46L22 42M42 22L46 18" stroke="#4a7cff" stroke-width="1.5" stroke-linecap="round" opacity="0.4"/>
</svg>
<img src="/static/logo.svg" alt="frpc-console" class="logo-img" />
<span class="logo-text">frpc-console</span>
</div>
@@ -45,15 +40,18 @@
<div class="login-form">
<div class="input-group">
<label>用户名(至少 5 位)</label>
<input v-model="registerForm.username" type="text" placeholder="设置管理员用户名" @keydown.enter="doRegister" />
<input v-model="registerForm.username" type="text" placeholder="设置管理员用户名"
@keydown.enter="doRegister" />
</div>
<div class="input-group">
<label>密码</label>
<input v-model="registerForm.password" type="password" placeholder="至少8位,含大小写/数字/特殊字符" @keydown.enter="doRegister" />
<input v-model="registerForm.password" type="password" placeholder="至少8位,含大小写/数字/特殊字符"
@keydown.enter="doRegister" />
</div>
<div class="input-group">
<label>确认密码</label>
<input v-model="registerForm.confirmPassword" type="password" placeholder="再次输入密码" @keydown.enter="doRegister" />
<input v-model="registerForm.confirmPassword" type="password" placeholder="再次输入密码"
@keydown.enter="doRegister" />
</div>
<button class="login-btn" @click="doRegister" :disabled="registering">
{{ registering ? '注册中...' : '注册' }}
@@ -70,11 +68,13 @@
<div class="login-form">
<div class="input-group">
<label>user</label>
<input v-model="loginForm.username" type="text" placeholder="用户名" @keydown.enter="doLogin" />
<input v-model="loginForm.username" type="text" placeholder="用户名"
@keydown.enter="doLogin" />
</div>
<div class="input-group">
<label>passwd</label>
<input v-model="loginForm.password" type="password" placeholder="密码" @keydown.enter="doLogin" />
<input v-model="loginForm.password" type="password" placeholder="密码"
@keydown.enter="doLogin" />
</div>
<button class="login-btn" @click="doLogin" :disabled="loading">
{{ loading ? '登录中...' : '登录' }}
@@ -90,14 +90,14 @@
<!-- 顶部导航(含 Logo 小标) -->
<div class="top-bar">
<div class="top-left">
<svg viewBox="0 0 28 28" preserveAspectRatio="xMidYMid meet" style="width:100%; height:100%; display:block;" fill="none" xmlns="http://www.w3.org/2000/svg" style="flex-shrink:0;">
<rect x="2" y="2" width="24" height="24" rx="6" stroke="#4a7cff" stroke-width="1.5" opacity="0.3"/>
<path d="M9 19L14 9L19 19H16L14 16L12 19H9Z" fill="#4a7cff" opacity="0.9"/>
<circle cx="14" cy="14" r="2" fill="#4a7cff" opacity="0.5"/>
</svg>
<span class="logo">frpc-console</span>
<span class="status-dot" :class="{ active: frpcRunning }"></span>
<span class="status-text">{{ frpcRunning ? 'frpc 运行中' : 'frpc 已停止' }}</span>
<img src="/static/logo.svg" alt="frpc-console" class="nav-logo" />
<div class="brand-info">
<span class="logo-text">frpc-console</span>
<span class="status-wrapper">
<span class="status-dot" :class="{ active: frpcRunning }"></span>
<span class="status-text">{{ frpcRunning ? 'frpc 运行中' : 'frpc 已停止' }}</span>
</span>
</div>
</div>
<div class="top-right">
<span class="user-name">{{ loginForm.username }}</span>
@@ -107,8 +107,10 @@
<!-- Tab 栏 -->
<div class="tab-bar">
<span class="tab-item" :class="{ active: activeTab === 'proxies' }" @click="activeTab = 'proxies'">隧道列表</span>
<span class="tab-item" :class="{ active: activeTab === 'config' }" @click="activeTab = 'config'">全局配置信息</span>
<span class="tab-item" :class="{ active: activeTab === 'proxies' }"
@click="activeTab = 'proxies'">隧道列表</span>
<span class="tab-item" :class="{ active: activeTab === 'config' }"
@click="activeTab = 'config'">全局配置信息</span>
</div>
<!-- 内容区 -->
@@ -130,11 +132,13 @@
</div>
<div class="form-row">
<label>新密码</label>
<input v-model="passwordChange.newPassword" type="password" placeholder="至少8位,含大小写/数字/特殊字符" />
<input v-model="passwordChange.newPassword" type="password"
placeholder="至少8位,含大小写/数字/特殊字符" />
</div>
<div class="form-row">
<label>确认新密码</label>
<input v-model="passwordChange.confirmPassword" type="password" placeholder="再次输入新密码" />
<input v-model="passwordChange.confirmPassword" type="password"
placeholder="再次输入新密码" />
</div>
<button class="save-btn" @click="changePassword">修改密码</button>
<p v-if="passwordChangeError" class="login-error">{{ passwordChangeError }}</p>
@@ -172,22 +176,32 @@
<span>{{ showDetail ? '收起全部配置 ▲' : '展开全部配置 ▼' }}</span>
</div>
<div v-show="showDetail" class="detail-panel">
<div class="form-row"><label>Server Address</label><input v-model="globalConfig.serverAddr" /></div>
<div class="form-row"><label>Server Port</label><input type="number" v-model="globalConfig.serverPort" /></div>
<div class="form-row"><label>Token</label><input type="password" v-model="globalConfig.token" /></div>
<div class="form-row"><label>Server Address</label><input
v-model="globalConfig.serverAddr" /></div>
<div class="form-row"><label>Server Port</label><input type="number"
v-model="globalConfig.serverPort" /></div>
<div class="form-row"><label>Token</label><input type="password"
v-model="globalConfig.token" /></div>
<div class="form-row">
<label>Log Level</label>
<select v-model="globalConfig.logLevel">
<option value="trace">trace</option><option value="debug">debug</option>
<option value="info">info</option><option value="warn">warn</option>
<option value="trace">trace</option>
<option value="debug">debug</option>
<option value="info">info</option>
<option value="warn">warn</option>
<option value="error">error</option>
</select>
</div>
<div class="form-row"><label>Log Max Days</label><input type="number" v-model="globalConfig.logMaxDays" /></div>
<div class="form-row"><label>TCP Mux Keepalive</label><input type="number" v-model="globalConfig.tcpMuxKeepalive" /></div>
<div class="form-row"><label>Heartbeat Interval</label><input type="number" v-model="globalConfig.heartbeatInterval" /></div>
<div class="form-row"><label>Heartbeat Timeout</label><input type="number" v-model="globalConfig.heartbeatTimeout" /></div>
<div class="form-row"><label>Pool Count</label><input type="number" v-model="globalConfig.poolCount" /></div>
<div class="form-row"><label>Log Max Days</label><input type="number"
v-model="globalConfig.logMaxDays" /></div>
<div class="form-row"><label>TCP Mux Keepalive</label><input type="number"
v-model="globalConfig.tcpMuxKeepalive" /></div>
<div class="form-row"><label>Heartbeat Interval</label><input type="number"
v-model="globalConfig.heartbeatInterval" /></div>
<div class="form-row"><label>Heartbeat Timeout</label><input type="number"
v-model="globalConfig.heartbeatTimeout" /></div>
<div class="form-row"><label>Pool Count</label><input type="number"
v-model="globalConfig.poolCount" /></div>
<button class="save-btn" @click="saveConfig">保存配置并热加载</button>
</div>
</div>
@@ -245,13 +259,17 @@
<div class="form-row">
<label>类型</label>
<select v-model="dialogForm.type">
<option value="tcp">tcp</option><option value="udp">udp</option>
<option value="http">http</option><option value="https">https</option>
<option value="tcp">tcp</option>
<option value="udp">udp</option>
<option value="http">http</option>
<option value="https">https</option>
</select>
</div>
<div class="form-row"><label>本地 IP</label><input v-model="dialogForm.localIP" /></div>
<div class="form-row"><label>本地端口</label><input type="number" v-model="dialogForm.localPort" /></div>
<div class="form-row"><label>远程端口</label><input type="number" v-model="dialogForm.remotePort" /></div>
<div class="form-row"><label>本地端口</label><input type="number" v-model="dialogForm.localPort" />
</div>
<div class="form-row"><label>远程端口</label><input type="number" v-model="dialogForm.remotePort" />
</div>
</div>
<div class="dialog-actions">
<button class="btn-cancel" @click="dialogVisible = false">取消</button>