feat: 顶栏新增「系统」栏目——数据备份导出/导入恢复子分栏(仅管理员)
monitor.html:导航 .tabs 追加「系统」(data-perm=admin) + #tab-system 面板, 内含「数据备份 / 导入恢复」两个子分栏;base.js _activeSubs 记忆子分栏并在 showTab 里切回;system.js:导出(含 APK 勾选→zip 下载)、导入(选文件→ 校验预览:文件/schema/表行数/告警→确认应用,原生 confirm),全程含 「全量快照含密钥」警告与重启生效提示。
This commit is contained in:
@@ -365,6 +365,7 @@ body{background:var(--bg);font-family:var(--body);color:var(--text);font-size:14
|
||||
<button class="tab" data-tab="users" onclick="showTab('users')" data-perm="admin">用户</button>
|
||||
<button class="tab" data-tab="tools" onclick="showTab('tools')" data-perm="admin">工具</button>
|
||||
<button class="tab" data-tab="agent" onclick="showTab('agent')" data-perm="admin">AI 控制台</button>
|
||||
<button class="tab" data-tab="system" onclick="showTab('system')" data-perm="admin">系统</button>
|
||||
</div>
|
||||
<div class="user-info">
|
||||
<span id="me-username">...</span>
|
||||
@@ -850,9 +851,51 @@ body{background:var(--bg);font-family:var(--body);color:var(--text);font-size:14
|
||||
<div class="list-pager" id="pager-groups"></div>
|
||||
<div class="help">管理设备分组,用于任务按分组执行。分组内的设备需先在<b>设备池管理</b>中确认(不在池内的设备不参与调度)。</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ========== Tab 9: 系统(仅管理员) ========== -->
|
||||
<div id="tab-system" class="tab-panel">
|
||||
<div class="page-title">系统</div>
|
||||
<div class="page-sub">系统数据备份导出/导入(仅管理员)</div>
|
||||
|
||||
<div class="sub-tabs">
|
||||
<button class="sub-tab active" data-sub="backup" onclick="showSubTab('system','backup')">数据备份</button>
|
||||
<button class="sub-tab" data-sub="restore" onclick="showSubTab('system','restore')">导入恢复</button>
|
||||
</div>
|
||||
|
||||
<!-- 子分栏 1:数据备份 -->
|
||||
<div class="sub-panel active" id="system-sub-backup">
|
||||
<div class="help">
|
||||
<b>导出</b>当前系统数据为 zip:含 <code>users.db</code>(用户 / 任务计划 / 设备分组 / 自定义动作 /
|
||||
设备池 / AI 会话 / 经验库等全部表,SQLite 在线一致快照)+ 可选的 <code>apks/</code> 应用文件。
|
||||
恢复用:换机 / 整库迁移 / 出问题前留底。
|
||||
</div>
|
||||
<div class="toolbar" style="gap:8px">
|
||||
<label style="display:inline-flex;align-items:center;gap:4px;margin:0 6px">
|
||||
<input type="checkbox" id="backup-include-apk" checked> 包含 APK 文件(体积较大,~100MB 级)
|
||||
</label>
|
||||
<button class="btn btn-primary" onclick="doExportBackup()">导出备份</button>
|
||||
<span id="backup-status" class="text-muted"></span>
|
||||
</div>
|
||||
<div style="background:#fff8e1;border:1px solid #ffe082;color:#8a6d00;padding:8px 12px;border-radius:6px;margin:8px 0">
|
||||
⚠️ 备份为<b>全量快照</b>:含用户口令哈希、AI 配置里的 API Key 等敏感信息,请妥善保管,勿外传、勿提交到 git。
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 子分栏 2:导入恢复 -->
|
||||
<div class="sub-panel" id="system-sub-restore">
|
||||
<div class="help">
|
||||
<b>导入恢复</b>:上传平台导出的 <code>.zip</code> 或 <code>.db</code> → 先<b>校验预览</b> →
|
||||
确认后系统会<b>自动备份当前库</b>并把恢复任务挂起,<b>重启 web_server 后生效</b>(导入将覆盖现有全部数据)。
|
||||
</div>
|
||||
<div class="toolbar" style="gap:8px">
|
||||
<input type="file" id="restore-file" accept=".zip,.db">
|
||||
<button class="btn" onclick="previewRestore()">上传并预览</button>
|
||||
<button class="btn btn-danger" id="btn-apply-restore" onclick="applyRestore()" style="display:none">确认应用导入</button>
|
||||
<span id="restore-status" class="text-muted"></span>
|
||||
</div>
|
||||
<div id="restore-preview" style="margin-top:8px"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><!-- /.content -->
|
||||
@@ -918,5 +961,6 @@ body{background:var(--bg);font-family:var(--body);color:var(--text);font-size:14
|
||||
<script src="/static/admin/apps.js"></script>
|
||||
<script src="/static/admin/admin.js"></script>
|
||||
<script src="/static/admin/agent.js"></script>
|
||||
<script src="/static/admin/system.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user