docs: 添加 10 份技术文档,README 改为中文
- 01-architecture.md: 架构概览 - 02-backend-services.md: 后端服务层 - 03-frontend-interaction.md: 前端交互设计 - 04-database-design.md: 数据库设计 - 05-api-reference.md: API 接口文档 - 06-sse-streaming.md: SSE 流式传输 - 07-llm-integration.md: LLM 集成 - 08-deployment.md: 部署运维 - 09-development-guide.md: 开发指南 - 10-troubleshooting.md: 故障排查
This commit is contained in:
@@ -0,0 +1,163 @@
|
||||
# 架构概览
|
||||
|
||||
## 项目简介
|
||||
|
||||
PR-Helper 是一个自托管的 Web 服务,用于从 Git 历史自动生成 PR 描述并执行 AI 代码审查。专为内部/本地使用设计(无认证)。
|
||||
|
||||
## 技术栈
|
||||
|
||||
| 层级 | 技术 |
|
||||
|------|------|
|
||||
| 后端 | Go + Gin + MySQL + go-git |
|
||||
| 前端 | Go html/template + HTMX + D3.js + diff2html + Tailwind CSS |
|
||||
| LLM | OpenAI 兼容 API(SSE 流式传输) |
|
||||
| 部署 | Docker |
|
||||
|
||||
## 目录结构
|
||||
|
||||
```
|
||||
PR-Helper/
|
||||
├── main.go # 应用入口
|
||||
├── config/ # 配置加载
|
||||
│ └── config.go
|
||||
├── database/ # 数据库初始化和迁移
|
||||
│ └── db.go
|
||||
├── handlers/ # HTTP 处理器(页面 + JSON API + SSE)
|
||||
│ ├── auth.go # 认证处理
|
||||
│ ├── generate.go # PR 生成 SSE 端点
|
||||
│ ├── pages.go # 页面渲染
|
||||
│ ├── repos.go # 仓库管理 API
|
||||
│ ├── review.go # 代码审查 SSE 端点
|
||||
│ ├── settings.go # 设置 API
|
||||
│ └── middleware.go # 中间件
|
||||
├── models/ # 数据模型
|
||||
│ ├── repository.go # 仓库模型
|
||||
│ ├── analysis.go # 分析结果模型
|
||||
│ └── settings.go # 默认设置
|
||||
├── services/ # 业务逻辑
|
||||
│ ├── git.go # Git 操作(克隆、差异、图形数据)
|
||||
│ ├── llm.go # LLM API 调用(SSE 流式)
|
||||
│ ├── generate.go # PR 描述生成
|
||||
│ ├── review.go # AI 代码审查
|
||||
│ ├── cache.go # 仓库缓存管理
|
||||
│ └── notes.go # 审查笔记
|
||||
├── templates/ # Go HTML 模板
|
||||
│ ├── layouts/ # 布局模板
|
||||
│ ├── pages/ # 页面模板
|
||||
│ └── partials/ # 局部模板
|
||||
├── static/ # 静态资源
|
||||
│ ├── css/ # Tailwind 输出
|
||||
│ ├── js/ # 自定义 JS
|
||||
│ └── lib/ # 第三方库
|
||||
└── data/ # 数据存储
|
||||
└── repos/ # 克隆的仓库缓存
|
||||
```
|
||||
|
||||
## 数据流
|
||||
|
||||
```
|
||||
浏览器 ↔ Gin 处理器 → 服务层(git/llm)→ MySQL + 文件系统(data/)
|
||||
```
|
||||
|
||||
### 请求流程
|
||||
|
||||
1. **浏览器** 发起 HTTP 请求(HTMX 或 fetch)
|
||||
2. **Gin 路由** 匹配处理器函数
|
||||
3. **中间件** 验证会话和用户认证
|
||||
4. **处理器** 解析请求参数
|
||||
5. **服务层** 执行业务逻辑
|
||||
6. **数据库/文件系统** 持久化数据
|
||||
7. **SSE 流** 返回实时更新(可选)
|
||||
|
||||
## 核心模块
|
||||
|
||||
### 配置模块 (config/)
|
||||
|
||||
- 从 `.env` 文件加载环境变量
|
||||
- 提供默认值
|
||||
- 生成随机会话密钥(如未配置)
|
||||
|
||||
### 数据库模块 (database/)
|
||||
|
||||
- MySQL 连接管理
|
||||
- 自动迁移(CREATE TABLE IF NOT EXISTS)
|
||||
- 增量迁移(ALTER TABLE,忽略重复列错误)
|
||||
- 默认设置初始化
|
||||
|
||||
### 处理器模块 (handlers/)
|
||||
|
||||
- **页面处理器**: 渲染 HTML 模板
|
||||
- **仓库处理器**: 克隆、删除、拉取、获取图形/差异
|
||||
- **生成处理器**: PR 描述生成(SSE 流式)
|
||||
- **审查处理器**: AI 代码审查(SSE 流式)
|
||||
- **设置处理器**: 读取/更新用户设置
|
||||
|
||||
### 服务模块 (services/)
|
||||
|
||||
- **git.go**: 使用 go-git 库执行 Git 操作
|
||||
- **llm.go**: OpenAI 兼容 API 调用,支持流式响应
|
||||
- **generate.go**: 从提交历史和差异生成 PR 描述
|
||||
- **review.go**: Top-N 策略的 AI 代码审查
|
||||
- **cache.go**: 仓库缓存生命周期管理
|
||||
|
||||
### 前端模块 (static/js/)
|
||||
|
||||
- **sse.js**: SSE 客户端,支持 POST 请求
|
||||
- **graph.js**: D3.js Git 图形可视化
|
||||
- **diff-viewer.js**: diff2html 差异查看器
|
||||
- **review-inline.js**: 内联 AI 建议
|
||||
- **markdown.js**: Markdown 渲染
|
||||
- **note-editor.js**: 审查笔记编辑器
|
||||
|
||||
## 关键设计决策
|
||||
|
||||
### 1. SSE 流式传输
|
||||
|
||||
选择 SSE 而非 WebSocket 的原因:
|
||||
- 单向服务器到客户端通信足够
|
||||
- HTTP 兼容性更好
|
||||
- 实现更简单
|
||||
- 自动重连
|
||||
|
||||
### 2. Top-N 策略
|
||||
|
||||
大型差异处理:
|
||||
- 按变更行数排序文件
|
||||
- 只分析前 N 个文件(默认 20)
|
||||
- 每个文件独立分析
|
||||
- 最后生成汇总
|
||||
|
||||
### 3. 三级审查笔记
|
||||
|
||||
- `overall`: 整体审查笔记
|
||||
- `file`: 文件级别笔记
|
||||
- `suggestion`: 建议级别笔记
|
||||
|
||||
### 4. 会话认证
|
||||
|
||||
- 基于 Cookie 的会话
|
||||
- 7 天过期
|
||||
- HttpOnly 标记
|
||||
- 随机会话密钥
|
||||
|
||||
## 扩展性考虑
|
||||
|
||||
### 水平扩展
|
||||
|
||||
- 无状态设计(会话存储在 Cookie)
|
||||
- 数据库可外部化
|
||||
- 文件存储可替换为对象存储
|
||||
|
||||
### LLM 集成
|
||||
|
||||
- 支持任何 OpenAI 兼容 API
|
||||
- 每用户独立配置
|
||||
- 可扩展为多模型支持
|
||||
|
||||
## 安全考虑
|
||||
|
||||
- 仅限内部使用(无认证)
|
||||
- 不暴露到公网
|
||||
- SQL 参数化查询
|
||||
- 会话 HttpOnly
|
||||
- 凭证不明文存储在 JSON 响应中
|
||||
Reference in New Issue
Block a user