Files
InfoGenie/infogenie-backend-java/后端文档.md
2026-04-03 21:18:29 +08:00

155 lines
7.3 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.
# 万象口袋 — JavaSpring Boot后端文档
**技术栈**Java 17 · Spring Boot 3.5 · Spring Web · Spring Data JPA · Hibernate · MySQL · Spring Data RedisLettuce
**模块路径**Maven 工程 `infogenie-backend-java`(坐标 `com.smyhub.infogenie:infogenie-backend-java`
**入口**`com.smyhub.infogenie.infogeniebackendjava.InfogenieBackendJavaApplication` — 载入 `application.yaml`、连接 MySQL、按需使用 Redis、启动内嵌 Tomcat。
**与 Go 后端关系**:路由与 JSON 契约与 `infogenie-backend-go` 对齐,便于前端同一份 `REACT_APP_API_URL` 切换端口联调;生产环境当前以 Go 部署为主时,可将前端仍指向 Go 服务。
---
## 运行与配置
- 配置主文件:[`src/main/resources/application.yaml`](src/main/resources/application.yaml)(占位符 `${VAR:default}` 可被系统环境变量或 IDE Run Configuration 覆盖)。
- Spring Boot **不会自动读取** 仓库内 `.env.development`;该文件仅作文向 `application.yaml` 变量说明(也可自行在 IDE 中一条条导入为环境变量)。
- `**APP_PORT**`:默认 **5002**(与 Go 开发端口一致时需注意二选一占用;亦可改为 5003 等与 Go 错峰)。
- 数据库:通过 `DB_HOST``DB_PORT``DB_NAME``DB_USER``DB_PASSWORD` 注入 JDBC URLyaml 内已给开发用默认值,与 Go `.env.development` 常见配置一致)。
- 认证中心:`AUTH_CENTER_API_URL``app.auth-center-url`
- 站点管理:`INFOGENIE_SITE_ADMIN_TOKEN``app.site-admin-token`(请求头 `X-Site-Admin-Token`)。
### Redis可选
业务是否走缓存由 **`app.redis-enabled`**(环境变量 `REDIS_ENABLED`)决定;关闭时服务逻辑直连 MySQL不在启动阶段强制 Ping Redis。
| 变量 | 说明 |
| --- | --- |
| `REDIS_ENABLED` | `true` / `false`;映射 `app.redis-enabled` |
| `REDIS_HOST` / `REDIS_PORT` | `spring.data.redis.host` / `port` |
| `REDIS_PASSWORD` | 可选 |
| `REDIS_DB` | 逻辑库编号,默认与 yaml 中示例一致 |
| `REDIS_KEY_PREFIX` | `app.redis-key-prefix`,建议与 Go 前缀区分(如 `infogenie:java:` |
| `REDIS_SITE_TTL` | 站点类缓存 TTL`app.redis-site-ttl` |
站点只读接口对 `60s-disabled``60s-source``ai-model-disabled``feature-clicks:{section}` 等做 cache-aside管理端写入后删除对应 Key`SiteConfigService``FeatureClickService`)。
### 邮件(诊断展示)
管理页 diagnostics 中的 `mail` 块来自环境变量 `MAIL_HOST``MAIL_PORT``MAIL_USERNAME``MAIL_PASSWORD`(仅展示是否配置密码,不落明文)。
---
## 健康与诊断
### `GET /api/health`(公开)
响应形状与 Go 一致,供 `AdminPage.js``normalizeHealthPayload` 解析:
- **`status`**`running``degraded`MySQL 未连通或 60s 上游探测失败;**不**因 Redis 将整体标为 degraded与 Go 一致)。
- **`database`**`connected` / `disconnected`
- **`mysql`**`{ ok, status }`
- **`redis`**:未启用 `{ enabled: false }`;启用 `{ enabled: true, ok, error? }`
- **`backend_api`**`{ ok: true }`
- **`sixty_api`**`ok``source_id``base_url``label``probe_url``http_status``latency_ms``error`
**HTTP 状态**:始终 **200**(退化只体现在 JSON `status`),避免前端将健康拉取判为失败。
### `GET /api/admin/site/diagnostics`(需管理员)
请求头 `X-Site-Admin-Token``INFOGENIE_SITE_ADMIN_TOKEN` 一致。返回字段与 Go 对齐:`app``env``listen_addr``listen_port`)、`mysql``redis``sixty_upstream``auth_center.api_url``mail` 等(不含密钥明文)。
---
**根路径**`GET /` — 服务说明与主要 endpoint 列表(`version`**3.3.0-java**)。
---
## 数据库JPA
`spring.jpa.hibernate.ddl-auto: update` 启动时按实体同步表结构,与 Go `AutoMigrate` 使用同一组业务表:
| 实体 | 用途 |
| --- | --- |
| `AIConfig` | 多厂商 AI Key / Base / 模型 |
| `Site60sDisabled` | 60s 前台隐藏 `feature_id` |
| `SiteAIRuntime` | DeepSeek 兼容网关Base + Key + 默认模型),优先级高于部分 `AIConfig` |
| `Site60sUpstream` | 60s 上游(单例 `id=1` |
| `SiteAIModelDisabled` | AI 应用前台隐藏 `app_id` |
| `SiteFeatureCardClick` | 功能卡片点击(`section` + `item_id` 联合主键);增量 SQL 为 MySQL `INSERT … ON DUPLICATE KEY UPDATE`,对应 Repository 使用 `nativeQuery = true` |
---
## 路由与包结构概览
包根:`com.smyhub.infogenie.infogeniebackendjava`
| 包 | 说明 |
| --- | --- |
| `config` | `WebConfig`CORS`RedisConfig``RestTemplateConfig``AppProperties` |
| `controller` | `Health``Auth``User``SiteConfig``Admin``AIModel` |
| `service` | 站点配置、点击统计、AI 调用、AI 工具提示词、运行时配置、健康探测 |
| `repository` | Spring Data JPA |
| `entity` | JPA 实体 |
| `dto.request` / `dto.response` | 入参与出参;**管理端、`item_id` 等入参使用 snake_case**`@JsonProperty`与前端、Go 一致 |
| `filter` | `JwtAuthFilter`:将 `Authorization: Bearer` 转发认证中心 `POST …/api/auth/verify`,结果放入 request attribute |
| `util` | 管理员令牌校验、AI 辅助方法 |
### CORS
`WebConfig` 放宽常用 Method/Header`Authorization``X-Site-Admin-Token`)。
### 认证与用户
| 方法 | 路径 | 说明 |
| --- | --- | --- |
| GET | `/api/auth/check` | 可选 Bearer已登录则返回简要 user |
| GET | `/api/user/profile` | **需**有效 Bearer |
### 站点公开配置
| 方法 | 路径 | 说明 |
| --- | --- | --- |
| GET | `/api/site/60s-disabled` | 隐藏 60s id 列表 |
| GET | `/api/site/60s-source` | 当前 60s 节点 |
| GET | `/api/site/ai-model-disabled` | 隐藏 AI 应用 id |
| GET | `/api/site/feature-card-clicks?section=` | 点击统计 |
| POST | `/api/site/feature-card-clicks/increment` | body`section``item_id` |
### 站点管理(`X-Site-Admin-Token`
| 方法 | 路径 | 说明 |
| --- | --- | --- |
| PUT | `/api/admin/site/60s-disabled` | body`disabled` |
| PUT | `/api/admin/site/60s-source` | body`source_id` |
| PUT | `/api/admin/site/ai-model-disabled` | body`disabled` |
| GET/PUT | `/api/admin/site/ai-runtime` | GET 脱敏PUT body`api_base``api_key``default_model``default_provider` |
| GET | `/api/admin/site/diagnostics` | 配置快照 |
### AI`/api/aimodelapp`,需 Bearer
| 方法 | 路径 | 说明 |
| --- | --- | --- |
| POST | `/chat``/chat/stream` | 非流式 / SSE 透传 |
| POST | `/name-analysis` 等 | 垂直场景 |
| GET | `/models` | 白名单模型列表 |
上游解析与 Go 一致:`SiteAIRuntime` 在 base+key 齐全时优先;否则读 `AIConfig`deepseek/kimi
---
## 常用命令
```bash
cd infogenie-backend-java
./mvnw test
./mvnw spring-boot:run
```
---
## 与其他工程的关系
- 前端 SPA 通过 `REACT_APP_API_URL` 指向本服务或 Go 服务(路径相同,端口按实际进程调整)。
- 更完整的前端对接说明见 **`infogenie-frontend/前端文档.md`**Go 行为对照见 **`infogenie-backend-go/后端文档.md`**。