JianJiAI聊天助手工具项目分享

一、 技术栈分析

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 代理 /apihttp://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 即可

六、截目截图

Image

Image

Image

Image

  • 全屏阅读F11
  • 打赏支持
  • 快速评论

评论

评论列表

文章目录

    查看评论
    小程序码 微信扫码访问小程序