513 lines
14 KiB
Markdown
513 lines
14 KiB
Markdown
# AI 智能单词本 - 开发实施方案
|
||
|
||
## 项目概述
|
||
|
||
本项目是一个前后端分离的英语学习应用,通过 AI 生成单词释义和例句,帮助用户构建个人单词本。
|
||
|
||
---
|
||
|
||
## 一、技术架构设计
|
||
|
||
### 1.1 整体架构图
|
||
|
||
```mermaid
|
||
graph TB
|
||
subgraph "客户端层"
|
||
User[用户]
|
||
end
|
||
|
||
subgraph "应用层"
|
||
FE[Nginx / Vite]
|
||
BE[Go + Gin]
|
||
end
|
||
|
||
subgraph "数据层"
|
||
DB[(MySQL 8.0)]
|
||
end
|
||
|
||
subgraph "外部服务"
|
||
AI[AI大模型<br/>DeepSeek / 通义千问]
|
||
end
|
||
|
||
User --> FE
|
||
FE --> BE
|
||
BE --> AI
|
||
BE --> DB
|
||
|
||
style FE fill:#e1f5ff
|
||
style BE fill:#ffe1e1
|
||
style DB fill:#e1ffe1
|
||
style AI fill:#ffe1ff
|
||
```
|
||
|
||
### 1.2 核心技术栈
|
||
|
||
| 层级 | 技术选型 | 说明 |
|
||
|------|----------|------|
|
||
| 前端 | Vite + Vue3/React/Vanilla | 现代化构建工具,快速开发 |
|
||
| 前端服务器 | Nginx | 生产环境静态资源服务与反向代理 |
|
||
| 后端 | Go 1.21+ + Gin | 高性能 Web 框架 |
|
||
| 数据库 | MySQL 8.0 | 关系型数据库 |
|
||
| ORM | GORM | Go 语言 ORM 框架 |
|
||
| 身份认证 | JWT | 无状态 token 认证 |
|
||
| 配置管理 | Viper | 配置文件管理 |
|
||
| 容器化 | Docker + Docker Compose | 统一部署环境 |
|
||
|
||
### 1.3 跨域处理策略
|
||
|
||
```mermaid
|
||
graph LR
|
||
subgraph "开发环境"
|
||
FE[Vite<br/>proxy配置] -->|代理| BE[后端:8080]
|
||
end
|
||
|
||
subgraph "生产环境"
|
||
U[用户请求] --> FE2[Nginx:80]
|
||
FE2 -->|/api/* 代理转发| BE2[后端:8080]
|
||
FE2 -->|静态资源| SR[dist/]
|
||
end
|
||
```
|
||
|
||
**原则:后端代码严禁配置 CORS,统一通过代理解决跨域。**
|
||
|
||
---
|
||
|
||
## 二、目录结构规划
|
||
|
||
```
|
||
week05/homework/docker-gin
|
||
├── backend/ # 后端 Go 项目
|
||
│ ├── Dockerfile # Go 多阶段构建镜像
|
||
│ ├── main.go # 应用入口
|
||
│ ├── .env.example # 环境变量示例文件
|
||
│ ├── config/ # 配置管理
|
||
│ │ └── config.go # Viper 配置加载
|
||
│ ├── model/ # 数据模型层
|
||
│ │ ├── user.go # 用户模型
|
||
│ │ └── word.go # 单词模型
|
||
│ ├── api/ # 路由与控制器层
|
||
│ │ └── handler.go # 请求处理器
|
||
│ ├── service/ # 业务逻辑层
|
||
│ │ ├── auth.go # 认证服务
|
||
│ │ ├── ai.go # AI 调用服务
|
||
│ │ └── word.go # 单词业务
|
||
│ ├── middleware/ # 中间件
|
||
│ │ └── jwt.go # JWT 鉴权中间件
|
||
│ ├── utils/ # 工具函数
|
||
│ │ └── hash.go # 密码加密工具
|
||
│ └── go.mod # Go 依赖管理
|
||
│
|
||
├── frontend/ # 前端项目
|
||
│ ├── Dockerfile # Nginx 镜像构建
|
||
│ ├── nginx.conf # 生产环境 Nginx 配置
|
||
│ ├── package.json # 依赖管理
|
||
│ ├── vite.config.js/ts # Vite 配置(开发代理)
|
||
│ ├── index.html # HTML 入口
|
||
│ └── src/
|
||
│ ├── main.js/tsx # 应用入口
|
||
│ ├── api/ # API 请求封装
|
||
│ ├── components/ # 页面组件
|
||
│ │ ├── common/ # 公共组件
|
||
│ │ ├── auth/ # 登录/注册
|
||
│ │ └── word/ # 单词相关
|
||
│ ├── router/ # 路由配置
|
||
│ ├── store/ # 状态管理
|
||
│ └── utils/ # 工具函数
|
||
│
|
||
├── docs/ # 项目文档
|
||
│ ├── api.md # API 接口文档
|
||
│ ├── db.md # 数据库设计文档
|
||
│ └── init.sql # 数据库初始化脚本
|
||
│
|
||
├── docker-compose.yml # 容器编排配置
|
||
└── README.md # 项目说明与运行指南
|
||
```
|
||
|
||
---
|
||
|
||
## 三、数据库设计
|
||
|
||
### 3.1 ER 图
|
||
|
||
```mermaid
|
||
erDiagram
|
||
USER ||--|{ WORD : has
|
||
USER {
|
||
uuid id PK "用户ID"
|
||
string username UK "用户名"
|
||
string password "密码(hash)"
|
||
datetime created_at "创建时间"
|
||
datetime updated_at "更新时间"
|
||
tinyint is_deleted "软删除标记"
|
||
}
|
||
WORD {
|
||
uuid id PK "单词记录ID"
|
||
uuid user_id FK "所属用户ID"
|
||
string word "单词"
|
||
text definition "释义"
|
||
json examples "例句列表"
|
||
string ai_provider "AI模型来源"
|
||
datetime created_at "创建时间"
|
||
datetime updated_at "更新时间"
|
||
tinyint is_deleted "软删除标记"
|
||
}
|
||
```
|
||
|
||
### 3.2 表结构设计思路
|
||
|
||
1. **用户表 (users)**
|
||
- 使用 UUID 作为主键,安全性更高
|
||
- 用户名设置唯一索引,防止重复注册
|
||
- 密码字段存储 bcrypt 哈希值,严禁明文
|
||
- 包含标准时间戳字段
|
||
- 支持软删除(is_deleted)
|
||
|
||
2. **单词表 (words)**
|
||
- 使用 UUID 作为主键
|
||
- 通过 user_id 外键关联用户
|
||
- 单词字段设为索引,配合 user_id 提高查询效率
|
||
- 例句使用 JSON 类型存储 3 条数据
|
||
- 记录 AI 来源以支持多模型切换
|
||
- 支持软删除和分页查询
|
||
|
||
---
|
||
|
||
## 四、API 接口设计
|
||
|
||
### 4.1 接口总览
|
||
|
||
```mermaid
|
||
graph LR
|
||
subgraph "无需鉴权"
|
||
A[POST /api/auth/register]
|
||
B[POST /api/auth/login]
|
||
end
|
||
|
||
subgraph "需要鉴权"
|
||
C[GET /api/words/query]
|
||
D[POST /api/words/save]
|
||
E[GET /api/words/list]
|
||
F[DELETE /api/words/:id]
|
||
end
|
||
```
|
||
|
||
### 4.2 接口设计要点
|
||
|
||
| 接口 | 方法 | 说明 | 关键参数 |
|
||
|------|------|------|----------|
|
||
| 注册 | POST | 用户名密码注册 | username, password |
|
||
| 登录 | POST | 返回 JWT Token | username, password |
|
||
| 查询单词 | GET | AI 生成释义和例句 | word, ai_provider |
|
||
| 保存单词 | POST | 持久化到数据库 | word, definition, examples, ai_provider |
|
||
| 单词列表 | GET | 分页获取用户单词 | page, page_size |
|
||
| 删除单词 | DELETE | 软删除单词记录 | 路径参数 id |
|
||
|
||
---
|
||
|
||
## 五、核心功能实现步骤
|
||
|
||
### 5.1 数据库初始化流程
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant DC as docker-compose
|
||
participant M as MySQL容器
|
||
participant SQL as init.sql
|
||
|
||
DC->>M: 启动容器
|
||
DC->>M: 挂载 init.sql
|
||
M->>M: 初始化数据库
|
||
M->>SQL: 执行建表语句
|
||
SQL-->>M: 完成建表
|
||
M-->>DC: 准备就绪
|
||
```
|
||
|
||
**关键点:**
|
||
- 通过 docker-compose.yml 将 `docs/init.sql` 挂载到容器的 `/docker-entrypoint-initdb.d/` 目录
|
||
- MySQL 容器首次启动时自动执行该目录下的 SQL 脚本
|
||
- 严禁在代码中调用 GORM 的 AutoMigrate
|
||
|
||
### 5.2 用户认证流程
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant U as 用户
|
||
participant FE as 前端
|
||
participant BE as 后端
|
||
|
||
Note over U,BE: 注册流程
|
||
U->>FE: 提交用户名密码
|
||
FE->>BE: POST /api/auth/register
|
||
BE->>BE: 验证用户名重复
|
||
BE->>BE: bcrypt 哈希密码
|
||
BE->>BE: 存入数据库
|
||
BE-->>FE: 注册成功
|
||
|
||
Note over U,BE: 登录流程
|
||
U->>FE: 提交用户名密码
|
||
FE->>BE: POST /api/auth/login
|
||
BE->>BE: 验证用户存在
|
||
BE->>BE: bcrypt 验证密码
|
||
BE->>BE: 生成 JWT Token
|
||
BE-->>FE: 返回 Token
|
||
FE->>FE: 存入 localStorage
|
||
```
|
||
|
||
### 5.3 智能查询单词流程
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
A[接收查询请求<br/>word + ai_provider] --> B{鉴权检查}
|
||
B -->|失败| C[返回 401 错误]
|
||
B -->|通过| D{检查数据库}
|
||
D -->|已保存| E[直接返回数据库记录]
|
||
D -->|未保存| F[调用 AI 接口]
|
||
F --> G[解析 AI 响应]
|
||
G --> H[返回 AI 结果至前端<br/>不保存到数据库]
|
||
H --> I[前端展示查询结果]
|
||
I --> J{用户点击保存?}
|
||
J -->|是| K[前端调用保存接口]
|
||
J -->|否| L[结束]
|
||
K --> M[后端写入数据库]
|
||
```
|
||
|
||
### 5.4 AI 调用服务设计
|
||
|
||
```mermaid
|
||
graph TB
|
||
subgraph "AI 调用层"
|
||
Service[AI Service]
|
||
end
|
||
|
||
subgraph "AI 提供商"
|
||
DS[DeepSeek]
|
||
QW[通义千问]
|
||
end
|
||
|
||
Service -->|根据 ai_provider| DS
|
||
Service -->|根据 ai_provider| QW
|
||
|
||
DS -->|返回结构化 JSON| Service
|
||
QW -->|返回结构化 JSON| Service
|
||
|
||
```
|
||
|
||
---
|
||
|
||
## 六、开发环境配置
|
||
|
||
### 6.1 前端开发配置(Vite Proxy)
|
||
|
||
在 `vite.config.js/ts` 中配置代理,解决开发环境跨域问题:
|
||
|
||
```javascript
|
||
export default {
|
||
server: {
|
||
proxy: {
|
||
'/api': {
|
||
target: 'http://localhost:8080', // 后端服务地址
|
||
changeOrigin: true, // 改变请求源
|
||
}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 6.2 后端配置管理
|
||
|
||
使用 Viper 管理配置,支持从 `.env` 文件加载:
|
||
|
||
| 配置项 | 说明 | 示例 |
|
||
|--------|------|------|
|
||
| DB_HOST | 数据库地址 | db |
|
||
| DB_PORT | 数据库端口 | 3306 |
|
||
| DB_USER | 数据库用户 | root |
|
||
| DB_PASSWORD | 数据库密码 | password |
|
||
| DB_NAME | 数据库名 | wordbook |
|
||
| JWT_SECRET | JWT 签名密钥 | secret_key |
|
||
| DEEPSEEK_API_KEY | DeepSeek 密钥 | sk-xxx |
|
||
| QIANWEN_API_KEY | 通义千问密钥 | xxx |
|
||
|
||
---
|
||
|
||
## 七、容器化部署设计
|
||
|
||
### 7.1 网络架构图
|
||
|
||
```mermaid
|
||
graph TB
|
||
subgraph "宿主机"
|
||
Host[宿主机]
|
||
Port80[端口 80]
|
||
end
|
||
|
||
subgraph "Docker 网络"
|
||
Net[wordbook-network]
|
||
end
|
||
|
||
subgraph "frontend 容器"
|
||
Nginx[Nginx:80]
|
||
end
|
||
|
||
subgraph "backend 容器"
|
||
Gin[Gin:8080]
|
||
end
|
||
|
||
subgraph "db 容器"
|
||
MySQL[MySQL:3306]
|
||
end
|
||
|
||
Host --> Port80
|
||
Port80 -->|外部访问| Nginx
|
||
Nginx --> Net
|
||
Gin --> Net
|
||
MySQL --> Net
|
||
|
||
Nginx -.->|/api/* 代理| Gin
|
||
Gin -.->|数据库连接| MySQL
|
||
|
||
style Host fill:#f0f0f0
|
||
style Net fill:#e6f3ff
|
||
```
|
||
|
||
### 7.2 服务设计要点
|
||
|
||
| 服务 | 暴露端口 | 依赖 | 说明 |
|
||
|------|----------|------|------|
|
||
| frontend | 80:80 | backend | 对外唯一入口 |
|
||
| backend | 无 | db | 内部网络访问 |
|
||
| db | 无 | - | 内部网络访问 |
|
||
|
||
**安全考虑:**
|
||
- 只有 frontend 暴露端口到宿主机
|
||
- backend 和 db 仅在容器网络内通信
|
||
- 通过容器名相互访问(`http://backend:8080`)
|
||
|
||
### 7.3 Dockerfile 设计
|
||
|
||
**后端多阶段构建:**
|
||
```mermaid
|
||
graph LR
|
||
A[构建阶段<br/>golang:alpine] -->|编译| B[二进制文件]
|
||
B -->|复制| C[运行阶段<br/>alpine:latest]
|
||
C --> D[精简镜像]
|
||
```
|
||
|
||
**前端 Nginx 构建:**
|
||
```mermaid
|
||
graph LR
|
||
A[node:18-alpine<br/>Vite Build] -->|dist 产物| B[nginx:alpine<br/>复制 dist 并替换 nginx.conf]
|
||
```
|
||
|
||
---
|
||
|
||
## 八、开发实施顺序
|
||
|
||
### 阶段一:项目初始化
|
||
|
||
1. 创建项目目录结构
|
||
2. 初始化后端项目(go mod init)
|
||
3. 初始化前端项目(npm create vite@latest)
|
||
4. 配置 docker-compose.yml 基础框架
|
||
|
||
### 阶段二:数据库设计
|
||
|
||
1. 编写 `docs/init.sql` 建表语句
|
||
2. 编写 `docs/db.md` 数据库设计文档
|
||
3. 在 docker-compose 中配置 MySQL 初始化挂载
|
||
|
||
### 阶段三:后端开发
|
||
|
||
1. **配置层**:Viper 环境变量加载
|
||
2. **模型层**:定义 User 和 Word 结构体
|
||
3. **认证模块**:
|
||
- 用户注册逻辑
|
||
- 用户登录逻辑
|
||
- JWT 生成与验证中间件
|
||
4. **AI 调用模块**:
|
||
- DeepSeek 接口封装
|
||
- 通义千问接口封装
|
||
- Prompt 模板设计
|
||
5. **单词业务模块**:
|
||
- 查询逻辑(数据库检查 + AI 调用)
|
||
- 保存逻辑
|
||
- 列表查询(分页)
|
||
- 删除逻辑(软删除)
|
||
6. **API 路由**:注册所有接口
|
||
7. **API 文档**:编写 `docs/api.md`
|
||
|
||
### 阶段四:前端开发
|
||
|
||
1. **基础配置**:
|
||
- Vite proxy 配置
|
||
- API 请求封装(axios)
|
||
2. **认证页面**:
|
||
- 登录表单
|
||
- 注册表单
|
||
- Token 存储与管理
|
||
3. **单词学习页面**:
|
||
- 查询单词表单
|
||
- AI 结果展示
|
||
- 保存按钮
|
||
4. **单词本页面**:
|
||
- 单词列表展示
|
||
- 分页器
|
||
- 删除功能
|
||
5. **状态管理**:管理用户登录状态
|
||
|
||
### 阶段五:容器化部署
|
||
|
||
1. **后端 Dockerfile**:多阶段构建优化
|
||
2. **前端 Dockerfile**:Nginx 配置
|
||
3. **Nginx 反向代理**:配置 `/api/*` 路由
|
||
4. **Docker Compose 编排**:网络、依赖、环境变量
|
||
5. **本地测试**:完整流程验证
|
||
|
||
### 阶段六:文档编写
|
||
|
||
1. 编写 `README.md`:项目说明与运行指南
|
||
2. 完善 `docs/api.md`
|
||
3. 完善 `docs/db.md`
|
||
4. 整理代码注释
|
||
|
||
---
|
||
|
||
## 九、注意事项与最佳实践
|
||
|
||
### 9.1 安全注意事项
|
||
|
||
- ⚠️ **严禁明文存储密码**:必须使用 bcrypt 等加密算法
|
||
- ⚠️ **严禁后端配置 CORS**:统一通过代理解决跨域
|
||
- ⚠️ **严禁使用 AutoMigrate**:数据库初始化必须通过 SQL 脚本
|
||
- ⚠️ **敏感信息管理**:API Key 不应提交到代码仓库
|
||
|
||
### 9.2 开发规范
|
||
|
||
1. 代码风格遵循 Go 和各语言社区规范
|
||
2. 所有接口必须有明确的参数说明和返回示例
|
||
3. 数据库字段必须有清晰的注释
|
||
4. 容器镜像应尽可能精简
|
||
|
||
### 9.3 调试建议
|
||
|
||
- 开发时可以先单独启动后端和前端测试
|
||
- 使用 Docker Compose 日志查看:`docker-compose logs -f`
|
||
- 数据库连接问题检查网络配置和用户权限
|
||
|
||
---
|
||
|
||
## 十、验收标准
|
||
|
||
1. ✅ 项目目录结构符合要求
|
||
2. ✅ 用户可正常注册和登录
|
||
3. ✅ 可查询单词并获取 AI 生成的释义和例句
|
||
4. ✅ 可保存单词到个人单词本
|
||
5. ✅ 单词列表支持分页
|
||
6. ✅ 可删除已保存的单词
|
||
7. ✅ 使用 Docker Compose 一键启动
|
||
8. ✅ 生产环境通过 Nginx 反向代理访问
|
||
9. ✅ 三份文档完整且清晰
|
||
|
||
---
|
||
|