一、 技术栈分析
1.1 后端 (Backend)
| 层面 | 技术 | 版本/说明 |
|---|---|---|
| 语言 | Python | 3.11 |
| Web 框架 | FastAPI | ≥0.104.0,异步 ASGI 框架 |
| ASGI 服务器 | Uvicorn | ≥0.24.0,支持热重载 |
| ORM | SQLAlchemy | ≥2.0.23,声明式映射 |
| 数据库 | SQLite | 通过 SQLAlchemy 连接,文件 db.sqlite3 |
| 数据校验 | Pydantic | ≥2.5.0,Schema 定义与序列化 |
| HTTP 客户端 | httpx | ≥0.25.2,异步流式请求豆包 API |
| AI 接口 | 豆包 (ByteDance Doubao) | SSE 流式对话,兼容 OpenAI 格式 |
| 环境配置 | python-dotenv | ≥1.0.0,.env 文件管理密钥 |
| CORS | FastAPI CORSMiddleware | 允许所有来源 |
后端架构特点:
- SSE (Server-Sent Events) 流式输出,
StreamingResponse+text/event-stream - 三层路由:
/api/chat、/api/conversations、/api/roles - 数据库自动初始化 + 种子数据(
seed_roles) - 会话管理:自动创建/复用会话,消息历史轮次限制
1.2 前端 (Frontend)
| 层面 | 技术 | 版本/说明 |
|---|---|---|
| 框架 | UniApp (Vue 3) | 3.0.0-alpha,跨平台框架 |
| 视图层 | Vue 3 | ≥3.4.21,Composition API + <script setup> |
| 构建工具 | Vite | 5.2.8,开发代理 + HMR |
| 语言 | TypeScript | ≥5.4.2 |
| 状态管理 | Pinia | ≥2.1.7,Composition Store 风格 |
| SSE 客户端 | XMLHttpRequest | 原生,onprogress 实现流式读取 |
| HTTP 请求 | uni.request | UniApp 内置,非流式 API 调用 |
| 目标平台 | H5 (Web) + 微信小程序 | dev:h5 / dev:mp-weixin |
前端架构特点:
- Vite 代理 /api → http://127.0.0.1:8000,SSE 响应头防缓冲处理
- 微信风格 UI:绿色气泡、左滑删除、打字指示器
- 自定义 Markdown 渲染:代码块保护 → 行内代码 → HTML 转义 → 格式替换 → 段落包裹
- 触摸 + 鼠标双端滑动事件支持
1.3 数据流
用户输入 → Pinia Store → XMLHttpRequest SSE POST /api/chat/stream
↓
Vite Proxy (5173 → 8000)
↓
FastAPI StreamingResponse
↓
chat_service → doubao_service
↓
httpx → 豆包 API (SSE 流式)
↓
delta/done/error 事件逐行返回
↓
XHR onprogress → appendStreamDelta → Vue 响应式更新
项目的 AI 调用层已经兼容 OpenAI Chat Completions 格式(/chat/completions + Authorization: Bearer + choices[0].delta.content),所以切换到任何兼容此格式的 API 只需修改 .env 配置。
二、 AI 接口配置
编辑 backend/.env 文件,修改以下三个关键字段:
配置项说明
| 变量 | 说明 | 默认值 |
|---|---|---|
DOUBAO_API_KEY |
API 密钥,填 Bearer 后的值 |
空 |
DOUBAO_API_URL |
Chat Completions 端点地址 | 豆包火山引擎地址 |
DOUBAO_MODEL |
模型名称 | doubao-1.5-pro-32k-250115 |
DOUBAO_ENDPOINT_ID |
豆包专用,其他 API 留空 | 空 |
REQUEST_TIMEOUT |
请求超时秒数 | 120 |
MAX_HISTORY_ROUNDS |
上下文历史轮数 | 20 |
1. 切换到 OpenAI
DOUBAO_API_KEY=sk-你的OpenAI密钥
DOUBAO_API_URL=https://api.openai.com/v1/chat/completions
DOUBAO_MODEL=gpt-4o
DOUBAO_ENDPOINT_ID=
2. 切换到 DeepSeek
DOUBAO_API_KEY=sk-你的DeepSeek密钥
DOUBAO_API_URL=https://api.deepseek.com/v1/chat/completions
DOUBAO_MODEL=deepseek-chat
DOUBAO_ENDPOINT_ID=
3. 切换到其他兼容 API(如通义千问、Kimi、本地 Ollama 等)
# 通义千问
DOUBAO_API_KEY=sk-你的密钥
DOUBAO_API_URL=https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions
DOUBAO_MODEL=qwen-plus
DOUBAO_ENDPOINT_ID=
# Kimi (Moonshot)
DOUBAO_API_KEY=sk-你的密钥
DOUBAO_API_URL=https://api.moonshot.cn/v1/chat/completions
DOUBAO_MODEL=moonshot-v1-8k
DOUBAO_ENDPOINT_ID=
# 本地 Ollama
DOUBAO_API_KEY=ollama
DOUBAO_API_URL=http://127.0.0.1:11434/v1/chat/completions
DOUBAO_MODEL=llama3
DOUBAO_ENDPOINT_ID=
修改 .env 后重启后端即可生效(uvicorn --reload 模式下修改 .env 不会自动重载,需手动重启)。
三、 Linux 云服务器部署流程
1. 服务器准备
sudo apt update && sudo apt install -y python3 python3-pip python3-venv nodejs npm nginx git
# Python 3.11+(如果系统版本低)
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt install -y python3.11 python3.11-venv python3.11-dev
2. 上传项目
cd /opt
git clone <你的仓库地址> uniapp
3. 后端部署
cd /opt/uniapp/backend
python3.11 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
cp .env .env.production
vim .env.production
# 修改 DOUBAO_API_KEY、DOUBAO_MODEL 等
# 测试启动
uvicorn main:app --host 127.0.0.1 --port 8000
4. 前端构建
cd /opt/uniapp/uniapp-im
npm install
npm run build:h5
构建产物在 dist/build/h5/,纯静态文件,由 Nginx 托管。
5. Nginx 配置
# /etc/nginx/sites-available/uniapp-im
server {
listen 80;
server_name your-domain.com;
location / {
root /opt/uniapp/uniapp-im/dist/build/h5;
index index.html;
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# SSE 关键配置
proxy_http_version 1.1;
proxy_set_header Connection '';
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 300s;
}
}
sudo ln -s /etc/nginx/sites-available/uniapp-im /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
6. 后端进程管理(Systemd + Uvicorn)
SSE 流式输出依赖 ASGI 协议,必须使用 Uvicorn 而非 WSGI 服务器。
# /etc/systemd/system/uniapp-backend.service
[Unit]
Description=UniApp IM Chat Backend
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/uniapp/backend
EnvironmentFile=/opt/uniapp/backend/.env.production
ExecStart=/opt/uniapp/backend/venv/bin/uvicorn main:app --host 127.0.0.1 --port 8000 --workers 2
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable uniapp-backend
sudo systemctl start uniapp-backend
# 查看状态 / 日志
sudo systemctl status uniapp-backend
sudo journalctl -u uniapp-backend -f
Uvicorn 多进程说明:
--workers N启动 N 个工作进程,每个进程独立持有 SQLite 连接。如果并发高需换 PostgreSQL,SQLite 写锁会限制多 worker 写入性能。
7. HTTPS(可选但推荐)
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.com
sudo certbot renew --dry-run
8. 防火墙
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
四、整体架构
用户浏览器
↓ HTTPS (443)
Nginx
├── / → 静态文件 (dist/build/h5)
└── /api/* → proxy_pass → Uvicorn ASGI (127.0.0.1:8000)
↓
豆包/OpenAI API
五、关键注意事项
- SSE 必须用 ASGI:Uvicorn 原生支持异步长连接,WSGI(如 Gunicorn sync worker)会阻塞 SSE 流式输出
- Nginx 必须关闭缓冲:
proxy_buffering off+proxy_cache off+proxy_http_version 1.1+Connection '',否则流式输出被缓冲成一次性返回 proxy_read_timeout 300s:AI 响应可能较慢,避免 Nginx 超时断开- 生产环境不要用
--reload:仅开发用,生产用--workers 2多进程 - SQLite 适合小规模:多 worker 并发写入受限,高并发换 PostgreSQL,改
DATABASE_URL即可
六、截目截图




评论
评论列表