|
| 1 | +AIBackend - 简易AI问答后端 (Golang + PostgreSQL) |
| 2 | + |
| 3 | +简介 |
| 4 | +- 使用 Gin + GORM + PostgreSQL 实现的简易问答后端,支持: |
| 5 | + - 用户注册/登录(JWT) |
| 6 | + - 会话与消息存储(PostgreSQL) |
| 7 | + - 基于角色的模型访问控制(free/pro/admin) |
| 8 | + - 上下文对话与流式输出(SSE) |
| 9 | + - 可插拔的模型提供方接口(默认 Mock,便于本地演示) |
| 10 | + |
| 11 | +快速开始 |
| 12 | +1) 准备 Postgres 并创建数据库,例如:aibackend |
| 13 | + |
| 14 | +2) 配置环境变量(可创建 .env 文件) |
| 15 | +- DATABASE_URL=postgres://<user>:<pass>@localhost:5432/aibackend?sslmode=disable |
| 16 | +- JWT_SECRET=change-me |
| 17 | +- ADDR=:8080 |
| 18 | + |
| 19 | +3) 运行 |
| 20 | +- go run ./cmd/server |
| 21 | + |
| 22 | +4) 健康检查 |
| 23 | +- GET http://localhost:8080/health -> {"status":"ok"} |
| 24 | + |
| 25 | +API 文档 |
| 26 | +- 见 docs/api.md,包含注册、登录、会话、聊天(支持 SSE 流式)等接口说明与 curl 示例。 |
| 27 | + |
| 28 | +模型提供方 |
| 29 | +- 默认使用 MockProvider(无需外部 Key,本地直接演示)。 |
| 30 | +- OpenAI 兼容:当设置 OPENAI_API_KEY 时,自动切换为 OpenAI Chat Completions 协议(支持流式)。 |
| 31 | + - 环境变量: |
| 32 | + - OPENAI_API_KEY=你的密钥 |
| 33 | + - OPENAI_API_BASE=自定义 Endpoint(可选,默认 https://api.openai.com) |
| 34 | + - Chat 请求将发送到 {OPENAI_API_BASE}/v1/chat/completions(stream=true),并解析 SSE 的 data: 行,提取 choices[0].delta.content。 |
| 35 | +- 若需接入火山引擎(Volcengine)或其他厂商: |
| 36 | + 1. 在 internal/provider 中实现 LLMProvider 接口。 |
| 37 | + 2. 在 NewProviderFromEnv 中根据环境变量选择对应 Provider。 |
| 38 | + 3. 在 ChatService 中无需改动,保持调用接口不变。 |
| 39 | + |
| 40 | +项目结构 |
| 41 | +- cmd/server/main.go 程序入口 |
| 42 | +- internal/db 数据库连接与迁移 |
| 43 | +- internal/models GORM 模型(User/Conversation/Message) |
| 44 | +- internal/provider 模型提供方接口与 Mock 实现 |
| 45 | +- internal/services Auth 与 Chat 业务逻辑 |
| 46 | +- internal/httpserver Gin 路由与 HTTP 处理器 |
| 47 | +- pkg/auth JWT 生成与解析 |
| 48 | +- pkg/middleware Gin 中间件(鉴权与模型权限) |
| 49 | +- docs/api.md API 文档 |
| 50 | + |
| 51 | +角色与模型权限(示例) |
| 52 | +- free: [mock-mini] |
| 53 | +- pro: [mock-mini, mock-pro] |
| 54 | +- admin: [mock-mini, mock-pro, mock-admin] |
| 55 | + |
| 56 | +注意 |
| 57 | +- 初次运行会自动迁移数据库表结构。 |
| 58 | +- 流式输出采用 SSE(text/event-stream)。 |
| 59 | +- 若未设置 DATABASE_URL,程序会尝试使用本地默认串,但数据库必须实际可连接。 |
| 60 | + |
| 61 | + |
| 62 | + |
| 63 | +前端(Web) |
| 64 | +- 本项目内置了一个简单的 Web 前端,覆盖了后端的全部核心功能: |
| 65 | + - 注册/登录(JWT 持久化在 localStorage) |
| 66 | + - 查看会话列表、查看会话消息 |
| 67 | + - 发起聊天(支持非流式与流式输出) |
| 68 | + - 模型选择(会提示当前角色可用的模型范围,越权将被后端拦截) |
| 69 | +- 代码位置:web/ |
| 70 | + - index.html 页面骨架 |
| 71 | + - css/styles.css 样式 |
| 72 | + - js/state.js 本地状态与 Token 管理 |
| 73 | + - js/api.js 封装所有后端 API 调用(含流式解析) |
| 74 | + - js/auth.js 登录与注册表单逻辑 |
| 75 | + - js/chat.js 会话/消息渲染与发送消息(含流式处理) |
| 76 | + - js/main.js 应用入口与视图切换 |
| 77 | + |
| 78 | +如何使用前端 |
| 79 | +1) 启动后端: |
| 80 | + - go run ./cmd/server |
| 81 | +2) 打开浏览器访问: |
| 82 | + - http://localhost:8080 |
| 83 | +3) 在首页进行注册或登录: |
| 84 | + - 你可以选择角色(free/pro/admin),不同角色允许的模型不同: |
| 85 | + - free: [mock-mini] |
| 86 | + - pro: [mock-mini, mock-pro] |
| 87 | + - admin:[mock-mini, mock-pro, mock-admin] |
| 88 | +4) 进入应用后: |
| 89 | + - 左侧为会话列表,可点击切换; |
| 90 | + - 右侧为消息区与输入框; |
| 91 | + - 顶部可切换模型、开启/关闭“流式输出”; |
| 92 | + - 点击“+ 新建对话”开始新的会话; |
| 93 | + - 输入问题后按“发送”即可,开启“流式输出”时可看到回复逐步出现。 |
| 94 | + |
| 95 | +注意事项 |
| 96 | +- 前端与后端同域部署(由 Gin 静态服务提供),无需额外配置 CORS; |
| 97 | +- 流式回复采用 fetch ReadableStream 解析服务端的 text/event-stream(后端使用 POST 返回 SSE 风格数据,无法直接用 EventSource,因此用 fetch 流解析); |
| 98 | +- 若模型越权,后端会返回 403,前端会在输入区下方给出提示; |
| 99 | +- Mock 模型会回显你的输入,便于本地验证体验。 |
0 commit comments