本文件回答:公开域与私有域各有哪些页面、每页调哪些接口、登录态与路由规则。 依赖:api.md、auth.md、architecture.md
前端为单一 Vue 3 + Vite SPA 构建,通过两个域名区分公开与私有:
| 域名 | 角色 | 说明 |
|---|---|---|
example.com |
公开域 | 匿名可访问,展示公开内容,无登录入口 |
app.example.com |
私有域 | 登录后使用,笔记管理、设置、Token 等 |
www.example.com 301 重定向到 example.com;window.location.hostname 判断当前域,加载对应的路由表;/api/*(后端同源托管,不跨域)。Domain 设为 app.example.com,不设 .example.com;该配置由环境变量 HAVEN_COOKIE_DOMAIN 提供,见 architecture.md 第四节。cookie 属性细节见 auth.md 第三节规则 2。
| 路径 | 页面 | 调用的接口 |
|---|---|---|
/ |
公开笔记列表(首页) | GET /api/public/notes |
/notes/:id |
公开笔记详情 | GET /api/public/notes/:id |
/search?q= |
公开搜索 | GET /api/public/search |
/portfolio |
作品集展示 | GET /api/public/portfolio |
规则:
/search?q=<tag 名>。| 路径 | 页面 | 调用的接口 |
|---|---|---|
/login |
登录页(含 TOTP 第二步) | POST /api/auth/login、POST /api/auth/login/totp |
/ |
笔记列表(工作台首页) | GET /api/notes |
/notes/:id |
笔记详情 / 编辑 | GET /api/notes/:id、PATCH /api/notes/:id、POST /api/notes/:id/publish、POST /api/notes/:id/unpublish、DELETE /api/notes/:id |
/notes/new |
新建笔记 | POST /api/notes |
/search?q= |
私有搜索 | GET /api/search |
/tags |
标签管理 | GET /api/tags、POST /api/tags、DELETE /api/tags/:id |
/portfolio |
作品集管理 | GET /api/public/portfolio、POST /api/portfolio、PATCH /api/portfolio/:id、DELETE /api/portfolio/:id、仓库链接的增删改 |
/settings |
设置入口 | GET /api/me |
/settings/security |
密码、TOTP | POST /api/auth/password、POST /api/auth/totp/* |
/settings/sessions |
会话管理 | GET /api/sessions、DELETE /api/sessions/:id |
/settings/devices |
授信设备管理 | GET /api/trusted-devices、DELETE /api/trusted-devices/:id |
/settings/tokens |
API Token 管理 | GET /api/tokens、POST /api/tokens、DELETE /api/tokens/:id |
/preview/notes/:id |
公开笔记预览(可选) | GET /api/public/notes/:id |
规则:
/login 外,所有页面需要登录,router guard 统一处理;/login;?redirect= 参数);/settings/tokens 页面若收到 403(当前会话未通过 TOTP),页面内提示“管理 Token 需要完成 TOTP 验证”,并提供跳转到 /settings/security 完成验证的按钮,不强制登出。/login 页面显示账号密码表单;POST /api/auth/login;totp_required: false → 登录完成,跳转目标页;totp_required: true → 表单切换为 TOTP 输入框,暂存 temp_token(内存变量,不落 localStorage);POST /api/auth/login/totp;temp_token 过期 → 回到账号密码步骤,提示“登录已超时,请重新登录”。auth store(Pinia):当前用户、auth_type、totp_enabled、Token 的 scope;GET /api/me 初始化;/login;/settings/tokens 的 TOTP 引导)。frontend/src/api/ 下按领域分文件:auth.ts、notes.ts、tags.ts、search.ts、portfolio.ts、sessions.ts、devices.ts、tokens.ts、me.ts;ApiError,含 error、message、fields;/api/...),不写死域名,靠当前域自动路由;NoteCard、TagBadge、SearchBar、LoginForm、TotpForm、SettingsNav;