10 KiB
Executable File
10 KiB
Executable File
InfoGenie 万象口袋
跨平台多功能聚合 Web 应用:资讯榜单、工具箱、小游戏、AI 工具等。
项目概述
InfoGenie 采用前后端分离架构:
- 前端:React 18(CRA)+ React Router + Styled Components,PWA;核心导航在 SPA 内,大量能力以
public/下静态 HTML 嵌入(FullscreenEmbed)。 - 后端:Go + Gin + GORM + MySQL,提供健康检查、AI 代理等 REST 接口;用户登录与资料以**萌芽账户统一认证中心(Sprout Gate)**为准,详见仓库根目录
SPROUT_GATE_API_DOCS.md。 - 个人中心:仅只读展示认证中心同步的资料与统计;每日签到、改资料、领萌芽币请在认证中心完成,本站不提供签到按钮。
部署环境(示例)
| 环境 | 地址 |
|---|---|
| 前端 | https://infogenie.shumengya.top |
| 后端 API | https://infogenie.api.shumengya.top |
| 认证中心 | 见前端 REACT_APP_AUTH_URL 配置 |
技术架构
前端
| 技术 | 用途 |
|---|---|
| React 18、React Router 6 | UI 与路由 |
| Styled Components | 组件样式 |
| Axios | 请求封装(业务 API + 认证中心 API) |
| react-hot-toast | 提示 |
| Service Worker | PWA 离线缓存 |
后端(InfoGenie-go-backend/)
| 技术 | 用途 |
|---|---|
| Go、Gin | HTTP 服务 |
| GORM | MySQL ORM |
| JWT(与 Sprout Gate 颁发令牌配合) | 鉴权相关逻辑以实际代码为准 |
| godotenv | 环境变量 |
数据库
- MySQL:业务数据(如 AI 使用记录等),具体表结构见 Go 迁移/模型。
架构特点
- 混合前端:列表页在 React(如
Api60sPage、ToolboxPage),详情以 iframe 全屏嵌入静态页,统一走FullscreenEmbed。 - 60s API 静态页:
public/60sapi/**.html;路由/60sapi/:itemId(Api60sItemPage)通过Api60sConfig.js中API_ITEM_STATIC_HTML映射到对应 HTML。内嵌时加载public/60sapi/ig-embed.js,在 iframe 内隐藏静态页自带顶栏,避免与外层重复。 - 模块化:前端
components/、pages/、config/;后端internal/handler、internal/service等分层。
功能模块(摘要)
- 60s API:周期资讯、热门榜单、实用功能、娱乐消遣等;配置见
infogenie-frontend/src/config/Api60sConfig.js。 - 工具箱:
public/toolbox/下分图片处理/实用工具/网页小玩具/学习工具四类,入口ToolboxPage(分类标签 + 卡片),点击嵌入;配置项offlineOk为真的工具在卡片上标 「可离线」(PWA 缓存后页面可本地加载,调用外网 API 或网络流仍要联网)。个人主页模板目录仅作临时资源,不参与工具箱配置与展示,上线前可整体从public/剔除以减小体积。 - AI 应用:入口
AiModelPage,静态页在public/aimodelapp/;提示词集中在public/aimodelapp/shared/ai-prompts.js,统一请求/api/aimodelapp/chat。上游 API Base / Key / 默认模型 可由管理员在/admin写入 MySQL 表site_ai_runtime(GET/PUT /api/admin/site/ai-runtime),优先于ai_config.json。 - 休闲游戏:
public/smallgame/。 - AI 工具:
public/aimodelapp/等,消耗萌芽币策略以后端与认证中心对接为准。 - 管理入口:连续点击 Header Logo 5 次 输入管理员令牌进入
/admin(详见前端实现)。 - 60s 功能展示开关:条目定义仍在前端
Api60sConfig.js;是否展示由后端 MySQL 表site_60s_disabled控制。公开接口GET /api/site/60s-disabled返回{ "disabled": ["itemId", ...] };管理保存PUT /api/admin/site/60s-disabled(请求头X-Site-Admin-Token)需与后端环境变量INFOGENIE_SITE_ADMIN_TOKEN一致(开发环境可与管理员口令相同,见InfoGenie-go-backend/.env.development)。 - 60s 上游节点:由表
site_60s_upstream(source_id:self|official)决定;GET /api/site/60s-source供前端静默拉取(不在/60sapi列表页展示域名);管理员PUT /api/admin/site/60s-source。静态页用sixty-runtime.js+ URL 参数sixty_base,由Api60sItemPage注入 iframe。
项目结构(当前)
InfoGenie/
├── InfoGenie-go-backend/ # Go + Gin 后端
│ ├── cmd/server/ # 入口 main
│ ├── internal/ # handler / service / model / router 等
│ └── go.mod
├── infogenie-frontend/
│ ├── public/
│ │ ├── 60sapi/ # 60s 类静态页 + ig-embed.js
│ │ ├── toolbox/
│ │ ├── smallgame/
│ │ ├── aimodelapp/
│ │ ├── index.html # 入口与 PWA 启动屏
│ │ └── manifest.json
│ ├── scripts/
│ │ └── inject-ig-embed.js # 批量为 60s 静态页注入 ig-embed(可选)
│ ├── src/
│ │ ├── App.js # 路由
│ │ ├── components/ # Header、FullscreenEmbed、…
│ │ ├── pages/ # 含 Api60sPage、Api60sItemPage、UserProfilePage、AdminPage…
│ │ ├── contexts/UserContext.js
│ │ ├── config/ # env.js、Api60sConfig.js、StaticPageConfig.js
│ │ └── utils/api.js
│ └── package.json
├── SPROUT_GATE_API_DOCS.md # 萌芽统一认证接入说明(若在本仓库)
└── README.md # 本文件
API 端点(Go 后端,常见前缀 /api)
具体以 InfoGenie-go-backend/internal/router 为准,常见包括:
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | / |
服务信息 |
| GET | /api/health |
健康检查 |
| GET | /api/auth/check 等 |
与历史兼容的鉴权检查(若仍保留) |
| POST | /api/aimodelapp/* |
各类 AI 能力代理 |
| GET | /api/aimodelapp/coins |
与 AI 消耗相关的查询 |
用户资料、签到等以 认证中心 OpenAPI 为准(前端通过 REACT_APP_AUTH_API_URL 访问)。
快速开始
环境要求
- Go 1.21+(以后端
go.mod为准) - Node.js 16+、npm
- MySQL(开发/测试库连接串见后端
.env或文档)
后端
cd InfoGenie-go-backend
# 配置 .env 中数据库、密钥、认证中心等
go run ./cmd/server
# 默认示例端口见 main 或配置,常见为 :5002
后端 Docker 部署(可选)
在 InfoGenie-go-backend/ 目录:
-
准备
.env.production(数据库、邮件、INFOGENIE_SITE_ADMIN_TOKEN等),不要将其提交到仓库;镜像内不包含该文件。 -
构建并启动(宿主机端口
12364→ 容器内5002,容器名infogenie-backend-go):docker compose up -d --build -
健康检查:
http://<服务器IP>:12364/api/health(或经反向代理后的域名)。 -
前端
REACT_APP_API_URL应指向对外的 API 地址(例如经 Nginx 反代到127.0.0.1:12364的https://infogenie.api.shumengya.top)。
详见该目录下 Dockerfile、docker-compose.yml。
前端
cd infogenie-frontend
npm install
npm start
# http://localhost:3000
生产构建:
npm run build
前端环境变量(示例)
| 变量 | 说明 |
|---|---|
REACT_APP_API_URL |
万象口袋 Go 后端根地址 |
REACT_APP_AUTH_URL |
认证中心前端地址 |
REACT_APP_AUTH_API_URL |
认证中心 API 根地址 |
以上变量在 构建时 写入前端包(Create React App)。修改后需重新执行 npm run build。
生产部署(前端)
-
安装与构建(在
infogenie-frontend/目录)npm ci npm run build产物为
build/:静态资源 + 单页index.html。 -
构建前设置环境变量(按线上域名填写,勿提交含密钥的
.env到仓库):- Linux/macOS:
REACT_APP_API_URL=https://你的后端域名 npm run build - 或复制
infogenie-frontend/.env.production.example为.env.production后执行npm run build。
- Linux/macOS:
-
Web 服务器
- 将
build/内全部文件部署到站点根目录(或子路径;若子路径需设置 CRA 的homepage并确认PUBLIC_URL)。 - 必须配置 SPA 回退:所有未命中静态文件的路径应返回
index.html,否则刷新/toolbox、/60sapi/xxx等会 404。 - Nginx 示例(站点根部署):
server { listen 443 ssl; server_name infogenie.example.com; root /var/www/infogenie/build; index index.html; location / { try_files $uri $uri/ /index.html; } location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ { expires 7d; add_header Cache-Control "public, immutable"; } }
- 将
-
HTTPS
- 全站建议 HTTPS;OAuth 回调域名须与认证中心登记一致。
-
PWA
- 生产环境会注册 Service Worker(见
src/index.js)。更新前端后用户可能需刷新或等待 SW 更新;大版本升级可 bumppublic/manifest.json的version/name便于识别。
- 生产环境会注册 Service Worker(见
-
后端
- 单独部署
InfoGenie-go-backend(示例:https://infogenie.api.shumengya.top),与前端站点(示例:https://infogenie.shumengya.top)分域时,前端构建需设置REACT_APP_API_URL为后端根地址。 - CORS:后端中间件
internal/middleware/cors.go为宽松策略(放行任意 Origin 并回显),便于跨域;若需收紧可改为白名单。
- 单独部署
前端路由
| 路径 | 说明 |
|---|---|
/ |
首页 |
/login |
跳转统一登录 |
/auth/callback |
OAuth 回调 |
/60sapi |
60s API 分类列表 |
/60sapi/:itemId |
嵌入对应静态 HTML |
/toolbox |
工具箱列表 |
/smallgame |
小游戏 |
/aimodel |
AI 应用 |
/profile |
个人中心(只读) |
/admin |
管理员后台(令牌) |
* |
未匹配 → 首页 |
联系方式与许可
- 演示:https://infogenie.shumengya.top
- ICP:蜀ICP备2025151694号(以实际页脚为准)
- 许可证:Apache License 2.0 — 见 LICENSE
万象口袋 · 多功能聚合应用