# 实施说明 — 浏览器网站导航（收藏）

> 设计：`docs/design/specs/2026-06-11-browser-nav-bookmarks-design.md`

## 涉及文件（计划）

| 文件 | 动作 |
|------|------|
| `server/utils/browser_ui_state.py` | ✅ `nav_links` 解析与上限 |
| `server/api/browser.py` | ✅ `BrowserNavLinkState` / PUT 字段 |
| `tests/test_browser_ui_state.py` | ✅ `test_parse_nav_links` |
| `frontend/src/composables/useGlobalBrowser.ts` | `navLinks` + add/update/remove + persist |
| `frontend/src/components/GlobalBrowserPanel.vue` | 侧栏 Tab、列表、添加/编辑对话框、空白页快捷入口 |
| `docs/changelog/2026-06-11-browser-nav-bookmarks.md` | 完成后记录 |

## 前端步骤

1. `BrowserNavLink` 类型与 `applyServerState` / `persistState` 带上 `nav_links`
2. `addNavLink(title, url)` · `updateNavLink(id, …)` · `removeNavLink(id)`
3. `addCurrentPageToNav()` — 取 `activeTab.url` 或 `addressDraft`
4. 侧栏：`sidebarMode: 'nav' | 'history' | null`
5. 对话框：`v-dialog` 名称 + URL，`normalizeBrowserUrl` 校验
6. 空白页：`v-chip` / 列表展示 `navLinks`，点击 `openUrl`

## 测试要点

```bash
pytest tests/test_browser_ui_state.py -q
cd frontend && npm run type-check
```

- 添加 3 条导航 → PUT → GET 往返一致
- 超 64 条截断；非法 URL 过滤
- UI：编辑后刷新仍显示

## 回滚

- 前端未发版：仅后端多返回空 `nav_links`，兼容
- 回滚前端：导航 UI 消失，DB 中 JSON 保留无害

## 依赖

- 全局浮动浏览器（`GlobalBrowserPanel` + `/api/browser/state`）已上线
