This repository has been archived on 2026-05-19. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
obsidian/金山办公作业/Week05/PLAN.md
T

513 lines
14 KiB
Markdown
Raw Normal View History

2026-04-20 22:47:51 +08:00
# 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 "更新时间"
2026-04-22 10:10:19 +08:00
tinyint is_deleted "软删除标记"
2026-04-20 22:47:51 +08:00
}
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 "更新时间"
2026-04-22 10:10:19 +08:00
tinyint is_deleted "软删除标记"
2026-04-20 22:47:51 +08:00
}
```
### 3.2 表结构设计思路
1. **用户表 (users)**
- 使用 UUID 作为主键,安全性更高
- 用户名设置唯一索引,防止重复注册
- 密码字段存储 bcrypt 哈希值,严禁明文
- 包含标准时间戳字段
2026-04-22 10:10:19 +08:00
- 支持软删除(is_deleted)
2026-04-20 22:47:51 +08:00
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. ✅ 三份文档完整且清晰
---