一款专为武夷岩茶爱好者设计的品鉴打分与对比工具。支持多款茶样逐项打分、横向对比、排名推荐,以及 AI 品鉴分析。
| 品鉴打分 | 对比表格 |
![]() |
![]() |
| 排名结果 | AI 报告 |
![]() |
![]() |
| 品茶笔记 | 后台管理 |
![]() |
![]() |
| 功能 | 说明 |
|---|---|
| 🎯 逐款打分 | 七大维度(香气、汤色、醇厚度、顺滑度、回甘、不苦涩、整体愉悦),每项 1-5 分 |
| 📊 对比表格 | 多款茶样横向对比,信息行 + 评分维度 + 派生指标,最高分自动高亮 |
| 🏆 排名推荐 | 可视化排名进度条,自动推荐得分最高的茶样 |
| 📡 风味雷达图 | SVG 雷达图展示各款茶的风味轮廓,支持多茶叠加对比,可交互勾选显示/隐藏 |
| 📷 茶样照片 | 支持上传茶样图片,自动缩放优化 |
| ✏️ 动态字段 | 茶样信息字段(品种、产地、价格等)可在后台自由配置 |
| 💰 派生指标 | 根据价格和净重自动计算单价,色块渐变直观对比。指标可在后台自定义 |
| 🤖 AI 品鉴分析 | 接入大模型,自动生成逐款点评、横向对比、选购建议、冲泡建议 |
| 💬 AI 助手对话 | 浮动 AI 助手,可随时基于评分数据对话、追问品鉴建议 |
| 📝 品茶笔记 | 支持 Markdown 编辑、标题、彩色卡片展示、AI 对话划词收藏(新建或追加到已有笔记) |
| ⚙️ 后台管理 | 大模型配置、维度/字段/指标自定义、系统提示词编辑、数据备份恢复 |
| 🔐 用户认证 | JWT 认证,首个用户自动成为管理员,支持多用户 |
| 💾 备份恢复 | 一键导出/导入 ZIP 备份,含茶样数据、配置和图片 |
- Python 3.10+
- Node.js 18+(仅开发前端时需要)
# 1. 克隆项目
git clone https://github.com/xianyuwu/tea-taster.git
cd tea-taster
# 2. 创建虚拟环境
python3 -m venv .venv
source .venv/bin/activate
# 3. 安装后端依赖
pip install -r requirements.txt
# 4. 配置环境变量
cp .env.example .env
# 编辑 .env 设置 SECRET_KEY 和 OPENAI_API_KEY
# 5. 启动后端(端口 5001)
python main.py
# 6. 前端开发(另开终端,可选)
cd frontend
npm install
npx vite --port 3003 # 端口可自定义,API 自动代理到 5001访问:
- 品鉴页面:
http://localhost:5001(或:3003开发模式) - API 文档:
http://localhost:5001/docs
# 1. 配置环境变量
cp .env.example .env
# 编辑 .env 设置 SECRET_KEY(必填)和其他可选项
# 2. 启动
docker compose up -d --build
# 3. 访问
# http://your-domainDocker Compose 包含:
- app 服务:FastAPI 后端 + 前端静态文件
- nginx 服务:反向代理 + TLS 终止 + 静态文件缓存
支持所有兼容 OpenAI 协议的模型服务。配置方式:
- 管理后台配置(推荐):登录后进入管理后台 → 大模型配置 → 填写 API Key、模型名称、Base URL
- 环境变量:
.env文件中设置OPENAI_API_KEY
API Key 优先级:环境变量 > .env 文件 > 管理后台配置
| 服务商 | Base URL | 模型示例 |
|---|---|---|
| OpenAI | https://api.openai.com/v1 |
gpt-4o、gpt-4o-mini |
| DeepSeek | https://api.deepseek.com/v1 |
deepseek-chat |
| 阿里通义 | https://dashscope.aliyuncs.com/compatible-mode/v1 |
qwen-plus |
| 月之暗面 | https://api.moonshot.cn/v1 |
moonshot-v1-8k |
系统有三个 AI 功能,都通过 OpenAI 兼容协议调用大模型,SSE 流式返回。
触发:品鉴页 → 报告标签 → 点击「AI 分析」
- 后端从数据库收集所有有评分的茶样,拼成文本(各维度分数、总分、备注、额外字段)
- System Prompt 定义 AI 为「资深武夷岩茶品鉴师」,要求从逐款点评、横向对比、选购建议、冲泡建议四个角度输出(可在管理后台自定义)
- 调用大模型流式生成,每个 SSE chunk 实时推送到前端逐字渲染
- 流结束后 BackgroundTask 将完整报告写入数据库(单例
Report.id=1,重新分析覆盖) - 茶样分数变更时自动标记报告为「过时」,前端提示重新分析
触发:排名列表页 → 点击「AI 生成推荐理由」
- 后端收集评分数据,按总分排序找出第一名茶样
- 使用独立的推荐 Prompt(不含 System Prompt),要求为第一名茶写 4-5 句购买推荐:核心风味、消费场景、独特优势、总结推荐语
- 流式返回后存入
Report.recommend列(与主报告分开存储) - 前端在排名列表的推荐卡片中展示,支持重新生成
触发:点击右下角 🤖 浮动按钮打开聊天面板
- 首次对话时前端自动注入两条隐藏上下文:评分数据文本 + 已有报告内容
- 每次请求携带完整对话历史(上下文 + 所有历史消息 + 当前问题),后端透传给大模型
- 对话不做持久化,历史存在前端 Zustand store 中
- 支持重新生成、点赞/点踩(持久化到数据库)、选中文字收藏到笔记
设计要点:对话管理在前端,后端只做 LLM 代理;和报告共用同一个 System Prompt,保证角色一致。
**后端**:FastAPI + SQLAlchemy 2.0 async + Alembic + JWT 认证app/
├── __init__.py # FastAPI 工厂 + 中间件
├── config.py # 配置(pydantic-settings)
├── db.py # 数据库引擎 + 会话管理
├── models.py # ORM 模型(User, Tea, Report, Note, ConfigItem, AiFeedback)
├── routers/ # 7 个 APIRouter
│ ├── auth.py # 注册/登录/刷新/改密码
│ ├── teas.py # 茶样 CRUD + 照片上传
│ ├── notes.py # 笔记 CRUD
│ ├── config_routes.py # 系统配置
│ ├── dimensions.py # 维度/字段/指标
│ ├── ai.py # AI 分析 + 对话(SSE)
│ └── backup.py # 备份/恢复/清空
├── services/ # 业务逻辑层
│ ├── tea_service.py
│ ├── note_service.py
│ ├── config_service.py
│ ├── ai_service.py
│ ├── backup_service.py
│ └── storage.py # 存储抽象层(Local/S3)
├── schemas/ # Pydantic 请求/响应模型
└── utils/ # JWT 认证、错误处理、速率限制、校验
前端:React 19 + Vite + Zustand + React Router
frontend/src/
├── api/ # API 调用层(token 自动注入 + 401 刷新)
├── stores/ # Zustand 状态管理
├── pages/ # 页面组件(Login/Tasting/Admin)
├── components/ # UI 组件(tea/ai/note/auth/ui)
├── hooks/ # SSE 流式读取
└── styles/ # CSS 变量 + 全局样式(茶色主题)
数据存储:SQLite(默认,可切换 PostgreSQL)+ 文件存储(本地/S3)
| 方法 | 路径 | 说明 |
|---|---|---|
POST |
/api/auth/register-first |
首个用户注册(自动成为管理员) |
POST |
/api/auth/register |
注册新用户(需管理员) |
POST |
/api/auth/login |
登录 |
POST |
/api/auth/refresh |
刷新 Token |
GET |
/api/auth/me |
当前用户信息 |
PUT |
/api/auth/password |
修改密码 |
| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/api/teas |
获取所有茶样 |
POST |
/api/teas |
添加茶样 |
PUT |
/api/teas/:id |
更新茶样 |
DELETE |
/api/teas/:id |
删除茶样 |
POST |
/api/teas/:id/photo |
上传茶样图片 |
| 方法 | 路径 | 说明 |
|---|---|---|
POST |
/api/ai/analyze |
AI 品鉴分析报告(SSE 流式) |
POST |
/api/ai/recommend |
AI 购买推荐理由(SSE 流式) |
POST |
/api/ai/chat |
AI 品鉴助手对话(SSE 流式) |
POST |
/api/ai/feedback |
提交对话反馈(点赞/点踩) |
GET |
/api/ai/feedback |
批量获取对话反馈状态 |
GET |
/api/report |
获取已保存的报告 |
DELETE |
/api/report |
删除报告 |
| 方法 | 路径 | 说明 |
|---|---|---|
GET/POST/PUT/DELETE |
/api/notes[/:id] |
笔记 CRUD |
GET/PUT |
/api/config |
系统配置 |
POST |
/api/config/test |
测试大模型连接 |
GET/PUT |
/api/dimensions |
评分维度 |
GET/PUT |
/api/tea-fields |
茶样字段 |
GET/PUT |
/api/derived-metrics |
派生指标 |
POST |
/api/backup |
创建备份 |
GET |
/api/backups |
备份列表 |
DELETE |
/api/backups/:name |
删除备份 |
POST |
/api/restore |
从备份恢复 |
DELETE |
/api/data |
清空所有数据 |
# 数据库迁移(模型变更后)
alembic revision --autogenerate -m "description"
alembic upgrade head
# 前端构建
cd frontend && npm run build
# 运行测试
pytest
# 从旧 JSON 数据迁移(一次性)
python scripts/migrate_json_to_sqlite.pyMIT License






