Files
InfoGenie/InfoGenie-frontend/前端文档.md
树萌芽 6b3fcc1791 security: stop tracking env files; admin gate via VITE_SITE_ADMIN_GATE; Redis/cache/docs
Remove InfoGenie-frontend and Go .env from version control; add .env.example templates; ignore .claude local settings. Admin UI reads site gate from env only. Note: rotate secrets if repo history was ever public.

Made-with: Cursor
2026-04-03 16:10:12 +08:00

181 lines
7.8 KiB
Markdown
Raw Permalink 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.
# 万象口袋 — 前端文档
**技术栈**React 18 · React Router 6 · Tailwind CSS v4 · axios · Vite 6
**包名**`infogenie-frontend`(见 `package.json`
---
## 命令
| 命令 | 说明 |
|------|------|
| `npm run dev` / `npm start` | 开发服务器Vite默认端口 3000 |
| `npm run build` | 生产构建,输出 `dist/` |
| `npm run preview` | 本地预览 `dist/` 构建结果 |
---
## 项目结构(关键文件)
```
infogenie-frontend/
├── index.html ← Vite HTML 入口(根目录,非 public/
├── vite.config.js ← Vite 配置React 插件、Tailwind 插件、路径别名)
├── package.json
├── .env.development ← 开发环境变量VITE_*
├── .env.production ← 生产环境变量
├── public/ ← 静态资源(不参与构建,直接复制到 dist/
│ ├── assets/logo.png
│ ├── icons/
│ ├── aimodelapp/ ← AI 小应用静态页
│ ├── smallgame/ ← 小游戏静态页
│ └── toolbox/ ← 工具箱静态页
└── src/
├── index.js ← React 根挂载
├── App.js ← 路由、布局、全局 Provider
├── components/ ← 公共组件(含 FullscreenEmbed、SmallGameIcons 等)
├── pages/ ← 页面组件(含 AdminPage、SmallGamePage
├── contexts/ ← 全局 Context
├── hooks/ ← 自定义 Hooks如 useFeatureCardClickStats
├── utils/ ← Axios 封装、可见性过滤等
├── config/ ← 环境变量解析、Api60sConfig、StaticPageConfig
└── styles/
├── index.css ← Tailwind 入口 + 全局 base 样式 + 自定义动画
└── shared.js ← 设计系统组件Tailwind 函数组件)
```
---
## Vite 配置(`vite.config.js`
| 特性 | 说明 |
|------|------|
| `@vitejs/plugin-react` | React Fast Refresh + JSX 转换(含 `.js` 扩展名支持) |
| `@tailwindcss/vite` | Tailwind CSS v4 Vite 插件 |
| `treat-js-as-jsx` | 内联插件,使 `.js` 文件中的 JSX 正常编译 |
| `resolve.alias['@']` | `@/` 映射到 `src/` |
| `base: '/'` | 部署根路径 |
| `server.port: 3000` | 开发服务器端口 |
---
## 环境变量(`src/config/env.js`
变量名使用 Vite 规范的 **`VITE_`** 前缀(通过 `import.meta.env` 访问):
| 变量 | 作用 | 开发默认 / 生产默认 |
|------|------|---------------------|
| `VITE_API_URL` | 万象口袋 **Go 后端** 根地址 | dev`http://127.0.0.1:5002`prod 见 `.env.production` |
| `VITE_AUTH_URL` | 认证中心 **页面** 域名 | `https://auth.shumengya.top` |
| `VITE_AUTH_API_URL` | 认证中心 **API** 根地址 | `https://auth.api.shumengya.top` |
| `VITE_DEBUG` | 调试开关 | `'true'` 开启 |
| `VITE_SITE_ADMIN_GATE` | 管理员后台口令,须与后端 `INFOGENIE_SITE_ADMIN_TOKEN` 一致 | 本地写在 `.env.development`,勿提交 |
运行时可通过 `window.ENV_CONFIG` 查看解析结果(若已注入)。
> **迁移注意**:由 CRA 迁出后,原 `REACT_APP_*` 已统一为 `VITE_*`。
---
## 主应用结构(`src/`
### 路由(`src/App.js`
| 路径 | 页面 |
|------|------|
| `/` | 首页 |
| `/login` | 登录 |
| `/auth/callback` | 认证回调 |
| `/60sapi` · `/60sapi/:itemId` | 60s API 列表与详情 |
| `/smallgame` | 休闲游戏 |
| `/toolbox` | 工具箱 |
| `/aimodel` | AI 应用(需登录) |
| `/profile` | 个人中心 |
| `/admin` | **管理员后台**(本地 `admin_token` 校验) |
| `*` | 重定向首页 |
### 管理员后台(`src/pages/AdminPage.js`
- 浏览器 **`localStorage.admin_token`** 与内置口令一致方可进入(与后端 **`INFOGENIE_SITE_ADMIN_TOKEN`** 用于接口时是同一套站点管理员概念)。
- **功能分区**(左侧):概览、**状态监控**、AI 上游、60s 数据源、60s 前台展示、AI 前台展示。
- **状态监控**
- 并行请求 **`GET /api/health`**MySQL / 60s 上游 / Redis Ping**`GET /api/admin/site/diagnostics`**进程监听、MySQL/Redis 连接目标、库名/用户、SMTP、认证中心 URL 等;**不含密码**)。
- 请求诊断接口时携带头 **`X-Site-Admin-Token: <admin_token>`**。
- 「刷新探测与配置」会同时刷新上述两个数据源。
### 休闲游戏页(`src/pages/SmallGamePage.js`
- 游戏列表来自 **`src/config/StaticPageConfig.js`** 的 `SMALL_GAMES`
- 卡片图标由 **`src/components/SmallGameIcons.js`** 按 `game.id` 渲染 **Emoji**(如 2048→🔢、俄罗斯方块→🧱 等),嵌入在 **`FeatureCardIcon`** 内。
### 其他关键组件
- **`RandomSiteBackground`**:全站随机背景,毛玻璃模糊,会话级缓存。
- **`Header` / `Footer` / `Navigation`**:导航与布局。
- **`FullscreenEmbed`**:全屏 iframe游戏、工具箱、AI 静态页),支持注入 token、加载超时提示。
- **`ParticleEffect`**:全局点击粒子动画。
---
## 样式系统(`src/styles/`
### Tailwind CSS v4
- **入口**`src/styles/index.css`,顶部 `@import "tailwindcss"`
- **配置**Tailwind v4 CSS-first无独立 `tailwind.config.js`,自定义动画通过 `@theme` 块定义
自定义动画(可直接在 className 中使用):
| 类名 | 效果 | 用途 |
|------|------|------|
| `animate-page-enter` | `opacity: 0→1, translateY: 20px→0, 0.8s` | 页面进入 |
| `animate-fade-up` | `opacity: 0→1, translateY: 12px→0, 0.35s` | 卡片网格出现 |
### 设计系统(`src/styles/shared.js`
所有组件均为 **React 函数组件**,接受 `className` prop可与 Tailwind 类合并):
- **`PageWrapper`**、**`Container`**、**`FeatureGrid`**、**`CatalogCard`**、**`FeatureCard`**
- **`FeatureCardUseCount`**:卡片右上角点击次数角标
- **`ModuleCard`**:首页大模块卡片(`Link`
- **`accentFromGradient`**:从 gradient 字符串提取首色
---
## HTTP`src/utils/api.js`
- axios 实例默认 `baseURL = ENV_CONFIG.API_URL`,请求头自动带 `Bearer token`
- `import.meta.env.DEV` 控制仅开发环境打印 URL
- 支持 `skipErrorToast: true`,用于静默失败场景(如点击统计)
---
## 静态资源(`public/`
与 Vite 主站并列的大量**免构建**页面:
- **`public/aimodelapp/<应用名>/`**AI 小应用HTML + `script.js` + 可选 `env.js`)。
- 统一聊天入口:**`public/aimodelapp/shared/ai-chat.js`**。
- **优先**请求 **`POST /api/aimodelapp/chat/stream`**SSE失败或无内容时回退 **`POST /api/aimodelapp/chat`**。
- **`public/smallgame/`**、**`public/toolbox/`**:独立页,由 **`FullscreenEmbed`** 打开。
`aimodelapp` 子目录的 **`env.js`** / **`API_CONFIG`** 需指向与主站一致的 Go 后端地址(通常与 `VITE_API_URL` 同源或同网段)。
---
## 与后端协作要点
1. **登录**token 存 `localStorage`AI 与受保护接口依赖 JWT萌芽认证中心签发
2. **AI**:静态页通过配置的 API 调 Go 的 `/api/aimodelapp/*`;流式为 **`text/event-stream`**。
3. **站点开关**60s / AI 应用显隐由 `GET /api/site/*-disabled` 等驱动。
4. **卡片统计**:列表页 `CatalogCard`**`feature-card-clicks`** 接口对接;可选 Redis 缓存由后端控制。
5. **管理员**:写配置类接口需后端配置 **`INFOGENIE_SITE_ADMIN_TOKEN`**,与前端管理员口令一致。
---
## 其他文档
- **Go 后端 API、Redis、健康与诊断**[`infogenie-backend-go/后端文档.md`](../infogenie-backend-go/后端文档.md)
- **仓库总览与多模块说明**[`../README.md`](../README.md)