feat: 维护 Tab(STF 容器一键重启 + adb 远程终端,含设备快捷选择/卸载 agent/重连)
This commit is contained in:
@@ -58,6 +58,7 @@ body{background:var(--bg);font-family:-apple-system,"Segoe UI",Roboto,"PingFang
|
||||
.list-pager{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:8px 0 20px}
|
||||
.list-pager .lp-total{font-size:12px;color:var(--text-light);margin-right:auto}
|
||||
.list-search{width:240px}
|
||||
.adb-console{background:#0f172a;color:#e2e8f0;font-family:monospace;font-size:12px;padding:12px;border-radius:8px;min-height:200px;max-height:420px;overflow:auto;white-space:pre-wrap;word-break:break-all}
|
||||
|
||||
/* 区块标题 */
|
||||
.section-title{font-size:15px;font-weight:600;color:var(--text);margin:0 0 12px;padding-bottom:8px;border-bottom:2px solid var(--primary);display:inline-block}
|
||||
@@ -267,13 +268,14 @@ select.form-control{cursor:pointer}
|
||||
<div class="tabs">
|
||||
<button class="tab active" onclick="showTab('monitor')">监控</button>
|
||||
<button class="tab" onclick="showTab('tasks')">任务</button>
|
||||
<button class="tab" onclick="showTab('apps')">应用</button>
|
||||
<button class="tab" onclick="showTab('apps')" data-perm="apks">应用</button>
|
||||
<button class="tab" onclick="showTab('groups')">分组</button>
|
||||
<button class="tab" onclick="showTab('logs')">日志</button>
|
||||
<button class="tab" onclick="showTab('users')">用户</button>
|
||||
<button class="tab" onclick="showTab('logs')" data-perm="logs">日志</button>
|
||||
<button class="tab" onclick="showTab('users')" data-perm="admin">用户</button>
|
||||
<button class="tab" onclick="showTab('maintenance')" data-perm="admin">维护</button>
|
||||
</div>
|
||||
<div class="user-info">
|
||||
<span>admin</span>
|
||||
<span id="me-username">...</span>
|
||||
<a href="/logout">退出</a>
|
||||
</div>
|
||||
</nav>
|
||||
@@ -464,15 +466,73 @@ select.form-control{cursor:pointer}
|
||||
</div>
|
||||
<table class="table">
|
||||
<thead><tr>
|
||||
<th>ID</th><th>用户名</th><th>管理员</th><th>操作</th>
|
||||
<th>ID</th><th>用户名</th><th>管理员</th><th>权限</th><th>操作</th>
|
||||
</tr></thead>
|
||||
<tbody id="tb-users"></tbody>
|
||||
</table>
|
||||
<div class="list-pager" id="pager-users"></div>
|
||||
</div>
|
||||
|
||||
<!-- ========== Tab 7: 维护(仅管理员) ========== -->
|
||||
<div id="tab-maintenance" class="tab-panel">
|
||||
<div class="page-title">维护</div>
|
||||
<div class="page-sub">管理员专用:STF 服务管理与 adb 远程终端</div>
|
||||
|
||||
<div class="section-title">STF 服务</div>
|
||||
<div class="toolbar">
|
||||
<button class="btn btn-danger" onclick="restartStf()">一键重启 STF 容器</button>
|
||||
<span id="stf-restart-status" class="text-muted" style="margin-left:10px"></span>
|
||||
</div>
|
||||
<div class="help" style="margin-top:8px">
|
||||
通过 SSH 到部署机执行 <code>docker restart</code>(目标与容器名可用环境变量
|
||||
<code>STF_SSH_TARGET</code> / <code>STF_DOCKER_CONTAINER</code> 配置)。
|
||||
影响:STF 约 30 秒不可用,期间设备占用状态重置;<b>有任务在运行时会被拒绝执行</b>。
|
||||
</div>
|
||||
|
||||
<div class="section-title" style="margin-top:16px">adb 远程终端</div>
|
||||
<div class="help">选中目标设备后,命令里的 <code>-s <设备></code> 自动附加,直接写
|
||||
<code>shell ls /sdcard</code> 即可。离线设备也可选,用"重连设备"恢复。
|
||||
<b>禁止 kill-server / disconnect</b>(会中断 STF provider 的设备监控)。</div>
|
||||
<div style="display:flex;gap:8px;margin:8px 0;align-items:center">
|
||||
<label style="font-size:12px;color:var(--text-light)">目标设备</label>
|
||||
<select id="adb-device" class="form-control" style="flex:1;max-width:340px;font-family:monospace"></select>
|
||||
<button class="btn btn-xs" onclick="loadAdbDevices()" title="刷新设备列表">刷新</button>
|
||||
</div>
|
||||
<div style="display:flex;gap:8px;margin:8px 0">
|
||||
<input type="text" id="adb-cmd-input" class="form-control" style="flex:1;font-family:monospace"
|
||||
placeholder="shell ls /sdcard(选中设备后 -s 自动附加)"
|
||||
onkeydown="if(event.key==='Enter')runAdbCmd()">
|
||||
<button class="btn btn-primary" onclick="runAdbCmd()">执行</button>
|
||||
</div>
|
||||
<div style="display:flex;gap:6px;margin-bottom:8px;flex-wrap:wrap">
|
||||
<button class="btn btn-xs" onclick="fillAdbCmd('adb devices')">adb devices</button>
|
||||
<button class="btn btn-xs" onclick="fillAdbCmd('shell dumpsys window | grep mCurrentFocus')">前台App</button>
|
||||
<button class="btn btn-xs" onclick="fillAdbCmd('shell ls /sdcard')">列文件</button>
|
||||
<button class="btn btn-xs" onclick="fillAdbCmd('shell screencap -p /sdcard/shot.png')">截屏</button>
|
||||
<button class="btn btn-xs" onclick="fillAdbCmd('shell pm list packages -3')">已装应用</button>
|
||||
</div>
|
||||
<div style="display:flex;gap:6px;margin-bottom:8px;flex-wrap:wrap">
|
||||
<button class="btn btn-xs btn-danger" onclick="uninstallStfAgent()" title="卸载 jp.co.cyberagent.stf,STF 会在设备重连时重新推送">卸载 STF agent(卡死时用)</button>
|
||||
<button class="btn btn-xs" onclick="reconnectAdbDevice()" title="重新 adb connect 该设备">重连设备</button>
|
||||
<button class="btn btn-xs" onclick="checkStfAgent()" title="查看 jp.co.cyberagent.stf 是否已安装">检查 agent</button>
|
||||
</div>
|
||||
<pre id="adb-output" class="adb-console">(执行命令后输出显示在这里)</pre>
|
||||
</div>
|
||||
|
||||
</div><!-- /.content -->
|
||||
|
||||
<!-- ========== 测试此步骤弹窗 ========== -->
|
||||
<div id="test-overlay" class="modal-overlay" onclick="if(event.target===this)closeTestModal()">
|
||||
<div class="modal" id="test-modal-box">
|
||||
<div class="modal-header">
|
||||
<h3 id="test-modal-title">测试步骤</h3>
|
||||
<button class="close" onclick="closeTestModal()">×</button>
|
||||
</div>
|
||||
<div class="modal-body" id="test-modal-body"></div>
|
||||
<div class="modal-footer"><button class="btn" onclick="closeTestModal()">关闭</button></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ========== 模态框 ========== -->
|
||||
<div id="modal-overlay" class="modal-overlay" onclick="if(event.target===this)closeModal()">
|
||||
<div class="modal" id="modal-box">
|
||||
|
||||
Reference in New Issue
Block a user