Files
SproutGate/sproutgate-frontend/前端文档.md

95 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SproutGate 前端文档
## 技术栈
- **运行时**React 18
- **构建工具**Vite 5`@vitejs/plugin-react`
- **Markdown 渲染**`marked`(用于资料等富文本展示)
- **样式**:全局 `src/styles.css`
无专门路由库:根据 `window.location.pathname``App.jsx` 中分支渲染各视图。
**OAuth 与授权页**:若 URL 带有 `redirect_uri` / `return_url` 且当前路径不是 **`/authorize`**、也不是管理/用户列表/公开用户页,`useLayoutEffect` 会将浏览器 **`replace`** 到 **`{BASE_URL}authorize`** 并保留查询串,用于独立授权确认(`OAuthConsentScreen` + `UserPortal``oauthStandalone`)。顶栏在授权流程下提供「拒绝 / 取消」(`buildAuthDenyCallbackUrl`)。
## 目录结构(要点)
| 路径 | 说明 |
|------|------|
| `src/main.jsx` | 入口;生产环境可选注册 `public/sw.js` |
| `src/App.jsx` | 壳层:开屏、随机背景、按路径切换三大视图、管理员入口弹窗、图片预览 |
| `src/config.js` | `API_BASE`、OAuth 查询解析(`getAuthFlowFromSearch`,含 `scope``scopes`)、`buildAuthCallbackUrl` / `buildAuthDenyCallbackUrl``formatOAuthRedirectLabel``persistAuthClientFromFlow` / `authClientFetchHeaders`、地理与日期展示工具等 |
| `src/styles.css` | 全站样式(含 `.oauth-consent*``.oauth-authorize-*` 授权页) |
| `src/components/` | `UserPortal``OAuthConsentScreen``PublicUserPage``PublicUserListPage``AdminPanel``SplashScreen``RandomSiteBackground``AvatarImg` 等 |
| `src/components/userPortal/` | 用户门户局部:`UserPortalAuthSection``UserPortalProfileSection` 等 |
| `public/` | 静态资源(如 `logo192.png` |
## 环境与 API 地址
后端 API 基址由 **`src/config.js`** 中的 `API_BASE` 决定:
1.**`VITE_API_BASE`**`.env` / `.env.local`)有值,则使用该地址(尾部 `/` 会自动去掉)。
2. 否则:**开发模式**`vite` / `import.meta.env.DEV`)默认 `http://localhost:8080`**生产构建**默认 `https://auth.api.shumengya.top`
本地联调后端示例(在 `sproutgate-frontend` 目录):
```bash
# .env.local
VITE_API_BASE=http://localhost:8080
```
部署到其它域名时,务必设置 `VITE_API_BASE` 为实际网关或后端地址,再执行 `npm run build`
其它与 `config.js` 相关的常量(一般不必改):
| 常量 | 用途 |
|------|------|
| `LOGO_192_SRC` | 顶栏 logo`import.meta.env.BASE_URL` 以支持子路径部署 |
| `RAND_BG_API_ORIGIN` | 全站随机背景 API`https://randbg.api.smyhub.com` |
| `CLIENT_GEO_LOOKUP_URL` | 浏览器侧 IP/地理,与后端「最后访问」元数据配合 |
## 前端「路由」与页面
表格中为**部署在站点根路径**`vite.config` 默认 `base: '/'`)时的 `pathname`。子路径部署时,实际 pathname 会带前缀,需与 Vite **`base`** 一致(顶栏链接已通过 `new URL(..., origin + BASE_URL)` 生成)。
| 路径模式 | 组件 | 说明 |
|----------|------|------|
| `/` | `UserPortal` | 登录、注册、OAuth 查询参数(`redirect_uri``client_id` 等)、个人资料、签到等;无 `oauthStandalone` |
| `/authorize` | `UserPortal``oauthStandalone` | 第三方授权专用壳:无/无效回跳时错误提示;登录后展示 `OAuthConsentScreen`,不并排展示完整资料区 |
| `/users` | `PublicUserListPage` | 调用 `GET /api/public/users` 的公开用户目录 |
| `/user``/user/:account` | `PublicUserPage` | 公开资料与主页赞等(`account` 来自路径,支持 URL 编码) |
| `/admin` 或子路径以 `/admin` 开头 | `AdminPanel` | 管理后台(需有效管理员 Token见下 |
管理员入口:**连点顶栏 logo 5 次** 打开弹窗,输入与后端一致的 **`X-Admin-Token`**;校验通过后 Token 写入 `localStorage``sproutgate_admin_token`)并跳转到带 `BASE_URL` 前缀的 `admin` 路径。
## 与后端的约定
- 所有业务请求使用 **`API_BASE`** 拼接路径,例如 `${API_BASE}/api/auth/login`
- 认证接口在适用场景下可附带 **`authClientFetchHeaders()`** 返回的 **`X-Auth-Client`** / **`X-Auth-Client-Name`**(来自统一登录 URL 的 `client_id` / `client_name`,经 `sessionStorage` 持久化本会话)。
- 访问上报、地理展示等可按需传 **`X-Visit-Ip`**、**`X-Visit-Location`**(和 CORS 允许的头一致,详见后端文档)。
- 公开用户列表、主页、点赞分别对应后端 **`GET /api/public/users`**、**`GET /api/public/users/:account`**、**`POST /api/public/users/:account/like`**(点赞需 Bearer
- 管理端请求使用 **`X-Admin-Token`**(或后端支持的 Query `token`),与后端持久化的管理员配置一致(见 **`sproutgate-backend/后端文档.md`**)。
具体 REST 路径与说明以 **`sproutgate-backend/后端文档.md`**、根目录 **`萌芽账户认证中心-第三方应用API接入文档.md`** 及 **`AGENTS.md`** 为准。
## npm 脚本
| 命令 | 说明 |
|------|------|
| `npm install` | 安装依赖 |
| `npm run dev` | 启动 Vite 开发服务器(`--host`,默认端口以终端输出为准,常为 `5173` |
| `npm run build` | 生产构建,输出到 `dist/` |
| `npm run preview` | 本地预览构建结果(`--host` |
根目录若使用 `sproutgate.bat` / `sproutgate.sh``dev`,通常会同时拉起后端与前端,详见仓库 `AGENTS.md`
## 构建与部署注意
- **`VITE_API_BASE`** 在构建时注入,修改后需重新 **`npm run build`**。
- 若站点部署在子路径,需配置 Vite **`base`**(如 `vite.config`),顶栏 logo 已通过 `BASE_URL` 避免裂图。
- 生产环境若开启 Service Worker需保证 `public/sw.js` 与缓存策略符合实际 CDN/域名。
## 安全提示
- 勿把真实管理员 Token、用户口令写入前端仓库管理员 Token 仅用于请求头,存 `localStorage` 有 XSS 风险,生产环境应强化 CSP 与依赖审计。
- `.env.local` 通常列入 `.gitignore`,避免将内网 API 地址误提交。