导出:sqlite3 在线备份 API 对 data/users.db 做一致快照 → zip(users.db + manifest.json:schema_version/逐表行数/apk 清单)+ 可选 data/apks/*.apk。 导出文件读入内存(BytesIO)发送后即删磁盘副本,避免 Windows 流式句柄锁残留。 导入:上传 zip/db → 暂存校验(integrity + 必需表 app_meta/user/task_job/ device_group + schema 版本提示)→ 确认应用:先自动快照当前库到 data/backups/pre_restore_*.db,再把备份落到 data/restore_pending/,由 web_server.py 在 init_db 之前 consume 换库——TaskManager 启动时才读库入内存、 Windows 不能热替换正被持有的库文件,故导入必须重启生效。 新增 web/system_api.py(export/preview/apply,全 @admin_required)与目录常量 BACKUP_DIR/RESTORE_STAGING_DIR/RESTORE_PENDING_DIR;.gitignore 排除运行产物。
34 lines
1.4 KiB
Python
34 lines
1.4 KiB
Python
"""Web 层蓝图包:web_server.py 只保留 app 初始化与装配,路由按功能域拆分。
|
|
|
|
模块划分(按功能定位问题):
|
|
auth — 登录/登出/CSRF/权限装饰器/页面路由(/、/wall)
|
|
monitor — 状态/运行控制/设备操作/远程看屏
|
|
tasks — 任务计划/分组/自定义动作/元素抓取/步骤测试
|
|
admin — 用户管理/日志
|
|
tools — adb 终端/剪贴板注入/应用版本
|
|
devices — 设备池管理
|
|
apks — 应用管理
|
|
tailscale — Tailscale 管理
|
|
system — 系统数据备份导出/导入
|
|
"""
|
|
from flask import Blueprint
|
|
|
|
|
|
def register_blueprints(app):
|
|
"""注册全部蓝图(url_prefix 为空,路由路径保持原样)。"""
|
|
from .auth import bp as auth_bp
|
|
from .monitor import bp as monitor_bp
|
|
from .tasks_api import bp as tasks_bp
|
|
from .admin_api import bp as admin_bp
|
|
from .tools_api import bp as tools_bp
|
|
from .devices_api import bp as devices_bp
|
|
from .apks_api import bp as apks_bp
|
|
from .tailscale_api import bp as tailscale_bp
|
|
from . import agent_api as _agent_mod
|
|
from .agent_api import bp as agent_bp
|
|
_agent_mod.set_app(app)
|
|
from .system_api import bp as system_bp
|
|
for bp in (auth_bp, monitor_bp, tasks_bp, admin_bp, tools_bp,
|
|
devices_bp, apks_bp, tailscale_bp, agent_bp, system_bp):
|
|
app.register_blueprint(bp)
|