Files
ai-learning-platform/docs/技术架构设计.md
T
yuzhiran-dev 538de50bb1 注册支持用户名/手机号/邮箱 + 镜像站部署脚本 + AI 助手 Tool Calling 重构
- Prisma User 模型新增 username 字段(唯一索引)
- 注册先查重复再创建,返回友好中文提示(非 500)
- 登录支持用户名/手机号/邮箱三种方式
- 前端注册表单增加用户名输入框,预校验 2-20 位格式
- 新增 scripts/deploy.sh:一键构建并部署主站+镜像站+重启后端+重载 Nginx
- 镜像站 www.yuzhiran.com.cn Nginx 配置与主站同步
- AI 助手架构升级:用户端/管理后台均采用完整 Tool Calling 架构
- 新增 UserAiAssistantService(18 工具)+ AiAssistantController
- admin 助手新增 search + mark-all-notifications-read 工具
- 修复注册 500 错误:catch Prisma P2002 → BadRequestException
- Baidu Analytics Script 注入 root layout
2026-06-01 23:14:42 +08:00

288 lines
11 KiB
Markdown
Executable File
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.
# 宇之然 AI - 技术架构设计文档
> 版本:v1.1
> 日期:2026-05-29
---
## 1. 系统总体架构
### 1.1 架构分层
```
┌─────────────────────────────────────────────────────────────────────┐
│ 客户端层 │
│ ┌────────────────────┐ ┌──────────────────┐ │
│ │ Next.js │ │ 微信小程序 │ │
│ │ 官网 (静态导出) │ │ (规划中) │ │
│ └────────────────────┘ └──────────────────┘ │
└──────────────────────────┬──────────────────────────────────────────┘
┌──────────────────────────▼──────────────────────────────────────────┐
│ API 网关层 (NestJS) │
│ Nginx → PM2 → NestJS │
│ 限流 / JWT 鉴权 / 日志 / 路由转发 │
└──────────────────────────┬──────────────────────────────────────────┘
┌──────────────────────────▼──────────────────────────────────────────┐
│ 业务服务层 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 用户服务 │ │ 内容服务 │ │ 课程服务 │ │ 沙箱服务 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 社区服务 │ │ 支付服务 │ │ 搜索服务 │ │ 审核服务 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└──────────────────────────┬──────────────────────────────────────────┘
┌──────────────────────────▼──────────────────────────────────────────┐
│ AI 网关层 │
│ 统一 API → 模型路由 → 流式响应 │
│ qnaigc 兼容接口 → DeepSeek / SenseNova / 其他 OpenAI 兼容模型 │
└──────────────────────────┬──────────────────────────────────────────┘
┌──────────────────────────▼──────────────────────────────────────────┐
│ 数据层 │
│ MySQL 8.0 │ Redis 7 │
│ (主库) │ (缓存/会话) │
└─────────────────────────────────────────────────────────────────────┘
```
---
## 2. 技术选型详述
### 2.1 前端(官网)
| 技术 | 版本 | 说明 |
|------|------|------|
| Next.js | 14+ | React 框架,静态导出 (`output: 'export'`) |
| TypeScript | 5.x | 类型安全 |
| TailwindCSS | 3.x | 原子化 CSS |
| Shadcn/ui | latest | UI 组件库 |
| next-themes | latest | 暗黑模式切换 |
### 2.2 移动端(规划中)
| 技术 | 说明 |
|------|------|
| 微信小程序 | 后续规划 |
| Taro / uni-app | 评估中 |
### 2.3 后端
| 技术 | 版本 | 说明 |
|------|------|------|
| Node.js | 20 LTS | 运行时 |
| NestJS | 10.x | Node.js 后端框架 |
| Prisma | 5.x | ORMMySQL |
| JWT | - | 鉴权(Access Token 2h + Refresh Token 7d|
### 2.4 数据库
| 组件 | 用途 | 部署 |
|------|------|------|
| MySQL 8.0 | 业务主库(用户/课程/订单等) | 本地 / 云 RDS |
| Redis 7 | 缓存/会话/限流计数器 | 本地 / 云 Redis |
### 2.5 AI 网关
```
用户请求 → AIGatewayService
├── 模型路由(基于 modelMap 配置)
│ ├── general → OPENAI_MODEL (default: deepseek/deepseek-v4-flash)
│ ├── deepseek-v4-flash → deepseek/deepseek-v4-flash
│ └── sensenova-6.7-flash-lite → sensenova-6.7-flash-lite
├── 流式响应 (ReadableStream SSE)
└── 用量统计
```
AI 通过 OpenAI 兼容 API (`api.qnaigc.com`) 统一接入,不直接对接各模型厂商。
---
## 3. 数据库设计概要
### 3.1 核心表结构 (Prisma Schema)
```
users — 用户表
├── id, phone, email, password_hash, avatar, status, created_at
├── profiles — 用户扩展信息
└── learn_records — 学习记录
courses — 课程表
├── id, title, description, cover, category, price, status
├── chapters — 章节表
├── lessons — 课时表
└── lesson_progress — 学习进度
prompts — 提示词表
├── id, title, content, category, tags, author_id, status
├── prompt_favorites — 收藏
└── prompt_comments — 评论
tools — AI 工具表
├── id, name, description, url, category, icon, status
└── tool_reviews — 评价
models — 模型百科表
├── id, name, provider, params, features, benchmark, status
└── model_comparisons — 对比评测
sandbox_sessions — AI 沙箱会话表
├── id, user_id, model, messages, tokens, duration, created_at
└── sandbox_quota — 用户沙箱额度
orders — 订单表
├── id, user_id, amount, plan_type, status, pay_channel, paid_at
└── subscriptions — 订阅记录
contents — 内容(文章/资讯)
├── id, title, content, category, tags, author, status, view_count
└── content_comments — 评论
admin_users — 管理员表
├── id, username, password_hash, role, permission, last_login
└── admin_logs — 操作日志
skills — 技能包表
├── id, name, description, category, difficulty, system_prompt, icon
└── skill_tasks — 练习任务
```
### 3.2 Schema 管理
- 使用 Prisma Migrate 管理 schema 变更
- migration 文件位于 `backend/prisma/migrations/`
- 种子数据在 `backend/prisma/seed.ts`
---
## 4. API 设计规范
### 4.1 命名规范
```
GET /api/v1/courses — 课程列表
GET /api/v1/courses/:id — 课程详情
POST /api/v1/courses — 创建课程(管理端)
PUT /api/v1/courses/:id — 更新课程(管理端)
DELETE /api/v1/courses/:id — 删除课程(管理端)
POST /api/v1/auth/login — 登录
POST /api/v1/auth/register — 注册
POST /api/v1/auth/refresh — 刷新 token
POST /api/v1/sandbox/chat — AI 沙箱对话
GET /api/v1/sandbox/history — 对话历史
GET /api/v1/sandbox/quota — 沙箱额度查询
POST /api/v1/orders/create — 创建订单
GET /api/v1/orders/:id — 订单查询
POST /api/v1/orders/callback — 支付回调
GET /api/v1/skills — 技能列表(支持过滤)
GET /api/v1/skills/:id — 技能详情
GET /api/v1/skills/categories — 技能分类
GET /api/v1/skills/difficulties — 难度等级
```
### 4.2 通用响应格式
```json
{
"code": 0,
"message": "success",
"data": {},
"meta": {
"page": 1,
"pageSize": 20,
"total": 100
}
}
```
---
## 5. 部署架构
### 5.1 当前部署
```
┌─────────────┐
│ PM2 │
│ (进程管理) │
└──────┬──────┘
┌───────────┼───────────┐
│ │ │
┌──────▼──┐ ┌─────▼────┐ ┌───▼────┐
│ Node.js │ │ NestJS │ │ Redis │
│ server.js│ │ API 服务 │ │ │
│ (静态) │ │ PM2 │ └────────┘
└─────────┘ └─────┬────┘
┌──────▼──────┐
│ MySQL │
│ 8.0 │
└─────────────┘
```
| 服务 | 端口 | 管理方式 |
|------|------|----------|
| 前端 (静态文件) | 3000 | PM2: `node server.js` |
| 后端 (NestJS) | 4000 | PM2: `node dist/main.js` |
| MySQL | 3306 | 系统服务 |
| Redis | 6379 | 系统服务 |
### 5.2 构建流程
```
# 前端
npm run build → out/ (静态文件)
pm2 restart frontend
# 后端
npx nest build → dist/
pm2 restart backend --update-env
```
### 5.3 环境
| 环境 | 用途 |
|------|------|
| 开发 (dev) | 本地 `npm run dev` / `npm run start:dev` |
| 生产 (production) | PM2 + 静态导出 |
---
## 6. 性能与安全
### 6.1 性能目标
| 指标 | 目标 |
|------|------|
| API 响应时间 (P95) | < 200ms |
| 首屏加载时间 | < 1.5s |
| AI 对话首 Token 延迟 | < 1s |
| 静态页面加载 | 即时(CDN 缓存) |
### 6.2 安全措施
- HTTPS 全站加密
- JWT 鉴权(沙箱等核心 API
- API 限流
- 密码 bcrypt 加密
- 敏感信息脱敏
---
## 7. 技术债务与演进路线
| 阶段 | 任务 |
|------|------|
| 当前 | 单体 NestJS + Next.js 静态导出 |
| V2 | AI 网关独立部署 |
| V3 | 微信小程序上线 |
| V4 | 服务化拆分 |