# 2026-06-08 登录 IP 门禁 + SPA 无感切换 — 验证报告

## 自动化验证（Agent）

| 检查 | 结果 | 证据 |
|------|------|------|
| `pytest tests/test_login_access.py` | PASS | 7/7 |
| `bash scripts/local_verify.sh` | PASS | smoke + test_api 26/26 + ruff |
| `cd frontend && npm run build` | PASS | vue-tsc + vite |
| `bash deploy/pre_deploy_check.sh` | PASS | 7/7 gates |

## 功能点核对

| ID | 验收项 | 本地 | 生产 |
|----|--------|------|------|
| P0-1 | 白名单开启 + 非名单 IP → 无登录表单 | 代码 + 单测 | API 可访问 |
| P0-2 | 白名单 IP / 白名单关闭 → 正常表单 | 单测 | 待浏览器 |
| P1-1 | 登录成功 `router.replace` | 代码审查 | 待浏览器 |
| P2-1 | 侧栏切页 keep-alive 命中 | 代码审查 | 待浏览器 |
| P2-2 | 再激活 silent 刷新 | 代码审查 | 待浏览器 |
| P3-1 | Dashboard/Servers stats 共享缓存 key | 代码审查 | — |
| P4-1 | 侧栏 hover 200ms 预取 chunk | 代码审查 | Network 面板 |
| P4-2 | Dashboard/Servers 首次 loading 骨架屏 | 代码审查 | 待浏览器 |

## 生产部署

| 项 | 值 |
|----|-----|
| 方式 | tar + scp 同步代码（Gitea 500 绕过）+ `docker compose build nexus` |
| 时间 | 2026-06-08 |
| 远程健康 | `/health` → ok · `/app/` → 200 |
| 外网 | `https://api.synaglobal.vip/health` → ok |

## 用户终验清单

1. **非白名单 IP**（或临时关闭本机 IP）：打开 `/app/#/login` — 仅提示卡 + 客户端 IP，无用户名/密码/TOTP/登录按钮。
2. **白名单 IP 登录**：正常表单 → 登录成功跳转仪表盘，无明显白屏。
3. **侧栏往返**：Dashboard → Servers → Scripts → Push → Files → Dashboard，观察 DOM 保留与无全屏 blocking overlay。
4. **ScriptRuns 详情**：从脚本页进入执行详情，返回列表再进另一详情，数据正确切换。

## 回滚

```bash
git revert <commit>
bash deploy/deploy-production.sh
```

P0 单独 revert 不影响已登录 JWT 会话。
