Files
trade-assistant/PROGRESS.md
T
TradeMate Dev 4755cc75ba feat: 管理后台完整可用 + 注册登录记日志 + 提取信息结构化展示 + 微信配置就绪
- 管理后台用户/统计/日志/配置四页签全部对接真实后端API
- auth注册/登录/游客/微信登录事件写入usage_logs表
- 提取信息结果从原始JSON改为卡片式字段列表(中文标签)
- 管理后台搜索按钮增加加载态和结果数提示
- 配置WECHAT_APP_ID/WECHAT_APP_SECRET
- 客户/产品/报价单CRUD页面完整(导出导入批量操作)
2026-05-18 23:50:48 +08:00

243 lines
11 KiB
Markdown
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.
# TradeMate (外贸小助手) - 项目进度文档
**更新时间**: 2026-05-18 20:00
**状态**: ✅ 管理后台完整可用 + 微信登录配置就绪 + 提取信息结构化展示
---
## 一、服务状态
| 服务 | 地址 | 状态 |
|------|------|------|
| 后端 API | http://localhost:8000 | ✅ 运行中 |
| 前端 H5 | http://localhost:5173 | ✅ 运行中 |
| API 文档 | http://localhost:8000/docs | ✅ 可用 |
| Redis | localhost:6379 | ✅ 运行中 |
| PostgreSQL | localhost:5432 | ✅ 运行中 |
**测试用户**:
- 手机号: `13800138099` (或注册新用户)
- 密码: `testpass123`
---
## 二、已完成的工作
### 1. Bug 修复 (共 13 个)
| 序号 | 文件 | 问题描述 | 状态 |
|------|------|----------|------|
| 1 | `app/main.py` | 中间件顺序错误 - TierMiddleware 需要最先执行 | ✅ 已修复 |
| 2 | `app/core/middleware.py` | 缺少 getattr 防御性检查 | ✅ 已修复 |
| 3 | `app/models/user.py` | Product.user_id 缺少 ForeignKey | ✅ 已修复 |
| 4 | `app/models/customer.py` | Customer/Conversation.user_id 缺少 ForeignKey | ✅ 已修复 |
| 5 | `app/models/quotation.py` | Quotation.user_id 缺少 ForeignKey | ✅ 已修复 |
| 6 | `app/api/v1/deps.py` | get_current_user_id 读取参数而非 HTTP Header | ✅ 已修复 |
| 7 | `app/core/security.py` | passlib 与 bcrypt 版本不兼容 | ✅ 已替换为直接 bcrypt |
| 8 | `app/ai/providers/openai.py` | max_tokens=1000 不足,导致 Sensenova content 为 None | ✅ 已增加到 3000 |
| 9 | `app/ai/providers/openai.py` | Sensenova 特殊 reasoning 字段未处理 | ✅ 已增强 fallback 逻辑 |
| 10 | `src/App.vue` + 全局样式 | H5 底部导航覆盖内容 — uni-page 高度未扣除 tabbar | ✅ 设置 `height: calc(100% - 50px)` + `overflow-y: auto` |
| 11 | `app/api/v1/auth.py` + `deps.py` | **API 500 根因** — 旧 token `sub``guest_xxx`(非 UUID),DB UUID 列查询抛 500,CORS 头无法返回 → 浏览器误报 CORS 错误 | ✅ 游客 ID 改为合法 UUID;`get_current_user_id` 校验 UUID 格式,旧 token 返回 401 |
| 12 | `backend/.env` + `app/main.py` | CORS 配置不当 — `allow_origins` 包含 `*` + FRONTEND_URL 被忽略 | ✅ 去掉通配符,FRONTEND_URL 指向 `http://localhost:5173` |
| 13 | `uni-app/src/utils/api.js` | 前端直连后端端口 → 跨域请求 | ✅ BASE_URL 改为 `/api/v1` 走 Vite proxy,同源请求消除 CORS |
### 2. 游客模式 (Guest Mode) 实现 ✅
#### 后端实现
| 功能 | 接口 | 说明 |
|------|------|------|
| 游客登录 | `POST /api/v1/auth/login/guest` | 生成 JWT,包含 `is_guest: true`,无需数据库用户 |
| 公开翻译 | `POST /api/v1/translate/public/translate` | 无需认证,支持中英互译 |
| 公开信息提取 | `POST /api/v1/translate/public/extract` | 无需认证,提取客户询盘信息 |
**游客登录返回示例**:
```json
{
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"refresh_token": "eyJhbGciOiJIUzI1NiIs...",
"token_type": "bearer",
"user": {
"id": "guest_185039a65035",
"phone": null,
"username": "游客用户",
"tier": "guest",
"is_guest": true
}
}
```
#### 前端实现
| 文件 | 变更 |
|------|------|
| `src/utils/api.js` | 新增 `authApi.guestLogin()``translateApi.publicTranslate()``translateApi.publicExtract()` 方法 |
| `src/pages/login/login.vue` | "快速体验"按钮调用游客登录并存储 token |
| `src/pages/index/index.vue` | 游客模式下使用公开 API 端点 |
#### 游客模式测试结果
| 测试项 | 结果 |
|--------|------|
| 游客登录 | ✅ 返回 JWT,包含 `is_guest: true` |
| 公开翻译 (EN→ZH) | ✅ 正常工作 |
| 公开翻译 (ZH→EN) | ✅ 正常工作 |
| 公开信息提取 | ✅ 正确提取 intent、product、quantity、contact_info |
### 3. 问题根因分析
**Sensenova API 返回 None 的问题**:
- 原因: Sensenova 模型有 `reasoning` 字段(思考过程),当 `max_tokens` 不足时,模型先用 tokens 思考,还没输出 content 就被截断了
- 解决方案:
1. 增加 `max_tokens` 从 1000 到 3000
2. 增强 fallback 逻辑:当 `content` 为 None 时,尝试从 `reasoning` 中提取最终答案,支持多种模式匹配
### 4. 基础 API 测试通过
| 功能 | 接口 | 状态 |
|------|------|------|
| 健康检查 | `GET /health` | ✅ 200 |
| 用户注册 | `POST /api/v1/auth/register` | ✅ 200 |
| 用户登录 | `POST /api/v1/auth/login` | ✅ 200 |
| 游客登录 | `POST /api/v1/auth/login/guest` | ✅ 200 |
| 获取用户信息 | `GET /api/v1/auth/me` | ✅ 200 |
| 产品 CRUD | `/api/v1/products/*` | ✅ 正常 |
| 客户 CRUD | `/api/v1/customers/*` | ✅ 正常 |
| 数据分析 | `/api/v1/analytics/*` | ✅ 正常 |
| 套餐计划 | `GET /api/v1/payment/plans` | ✅ 正常 |
### 5. AI 功能测试 (全部通过 ✅)
| 功能 | 接口 | 状态 | 测试结果 |
|------|------|------|----------|
| 翻译 | `POST /api/v1/translate/` | ✅ 正常 | 中译英、英译中都正常 |
| 智能回复 | `POST /api/v1/translate/reply` | ✅ 正常 | 生成 2 种风格回复建议 |
| 信息提取 | `POST /api/v1/translate/extract` | ✅ 正常 | 正确提取客户意图、产品、数量 |
| 公开翻译 | `POST /api/v1/translate/public/translate` | ✅ 正常 | 无需认证,中英互译 |
| 公开提取 | `POST /api/v1/translate/public/extract` | ✅ 正常 | 无需认证,提取信息 |
| 营销文案 | `POST /api/v1/marketing/generate` | ✅ 正常 | 生成 3 种风格文案 |
| 报价单生成 | `POST /api/v1/quotations/generate-from-inquiry` | ✅ 正常 | 从询盘自动生成报价单 |
| 数据分析 | `GET /api/v1/analytics/overview` | ✅ 正常 | 客户/翻译/报价单统计 |
### 6. 前端 H5 服务
前端 uni-app + Vue 3 项目已启动:
- 地址: http://localhost:5173
- 后端 API 代理配置: Vite proxy (`/api``http://localhost:8000`)
**前端功能**:
- 登录页: 支持 "快速体验" 进入游客模式,微信登录按钮 H5 隐藏(条件编译)
- 首页: 游客模式显示快速体验区域,支持翻译和信息提取;登录用户显示统计卡片、待跟进客户、快捷操作
- 游客模式: 使用公开 API 端点,无需登录
### 7. 底部导航修复 & 自定义 tabbar 升级
| 阶段 | 改动 | 说明 |
|------|------|------|
| 切回原生 tabbar | `pages.json` custom: true → false | 解决自定义 tabbar 因 `position: fixed` + 父级 `transform` 定位异常问题 |
| 清理 CSS 遗留 | `App.vue` 删除 tabbar 相关 CSS | 删除 `height: calc(100% - 50px)``z-index` 等,让框架自动管理原生 tabbar 布局 |
| 恢复快捷按钮 | `index.vue` quick-actions 恢复 | 首页快捷操作按钮重新显示 |
| 升级自定义 tabbar | `pages.json` custom: false → true | 切回自定义 tabbar 支持 emoji 图标 |
| 修复 emoji 渲染 | `custom-tab-bar/index.vue` | `line-height: 1``1.5`,追加 emoji 字体族 `Apple Color Emoji, Segoe UI Emoji, Noto Color Emoji` |
### 9. 管理后台完整可用 + 注册登录日志
| 功能 | 文件 | 说明 |
|------|------|------|
| 用户管理(列表/搜索/改套餐/改角色/启用禁用) | `admin.py` + `admin.vue` | 全部对接真实 API |
| 使用统计 | `admin.py` | 查询 `usage_logs` 表,含今日各功能调用 + 7日趋势 |
| 操作日志 | `admin.py` | 带筛选器(动作/用户ID/日期范围)+ 分页 |
| 系统配置 | `admin.vue` | 卡片表单(input/switch/textarea),按配置项逐字段编辑 |
| 注册/登录记日志 | `auth.py` | `user.register`/`user.login`/`user.login_guest`/`user.wechat_login` 写入 `usage_logs` |
| 管理后台搜索按钮反馈 | `admin.vue` | 按钮加载态 "搜索中..." + 结果数 toast |
### 10. 提取信息结果结构化展示
| 文件 | 改前 | 改后 |
|------|------|------|
| `translate.vue` | 显示原始 JSON | 卡片式字段列表(字段名中文,如"产品名称""数量" |
| `index.vue` | 显示原始 JSON | 同上 |
### 11. 微信静默登录配置
`.env` 已写入 `WECHAT_APP_ID`/`WECHAT_APP_SECRET`,前端 `login.vue` 已内置:
- **微信小程序**`uni.login()` → code → `/auth/wechat-login`
- **H5 微信浏览器**:公众号 OAuth `snsapi_base` 静默授权
### 8. 首页快捷入口重新设计
底部导航已有"翻译、客户、营销、报价",首页快捷入口原先完全重复。重新设计为从"更多功能"区提取最高频功能:
| 原快捷入口 | 新快捷入口 | 说明 |
|-----------|-----------|------|
| 智能翻译 → 底部导航已有 | **产品库** | 外贸人每天查产品 |
| 客户管理 → 底部导航已有 | **跟进** | 写跟进是日常高频动作,带待办角标 |
| 营销文案 → 底部导航已有 | **数据** | 一键看业务概览 |
| 报价单 → 底部导航已有 | **通知** | 及时看消息提醒,带未读角标 |
同时 `goToPage` 函数重构为按 tabbar 页面列表自动判断 `switchTab`/`navigateTo`,不再硬编码。
---
## 三、待办事项
### 中优先级
1. 管理后台统计/日志页有数据验证(目前 `usage_logs` 为空,显示暂无数据)
### 低优先级
1. 测试 WhatsApp 集成
2. 性能优化测试
3. 自定义 tabbar emoji 渲染效果验证(若仍有问题,改用 `iconPath`/`selectedIconPath` 图片图标)
---
## 四、技术栈
| 层级 | 技术 |
|------|------|
| 后端 | FastAPI + SQLAlchemy + asyncpg |
| 数据库 | PostgreSQL + Redis |
| AI 提供商 | Sensenova (星火大模型), Spark (科大讯飞) |
| 前端 | uni-app + Vue 3 + Vite |
---
## 五、历史变更记录
| 日期 | 变更内容 |
|------|----------|
| 2026-05-12 | 修复 9 个 Bug,启动后端+前端服务,完成所有 API 测试,AI 功能全部正常 |
| 2026-05-12 | 实现游客模式:新增 `/api/v1/auth/login/guest``/api/v1/translate/public/*` 端点,前端支持游客体验 |
| 2026-05-12 | 修复 H5 底部导航覆盖问题:精简 App.vueuni-page 设置 `calc(100% - 50px)` + 独立滚动 |
| 2026-05-13 | 修复 CORS + API 500 根因:游客 UUID 格式、Vite proxy 替代直连、CORS 配置修正 |
| 2026-05-13 | 自定义 tabbar 升级:切回 `custom: true`,修复 emoji `line-height` 和字体族 |
| 2026-05-13 | 首页快捷入口重新设计:产品库/跟进/数据/通知,替换原有重复项 |
| 2026-05-18 | 管理后台完整可用(用户/统计/日志/配置)+ 注册登录记日志 + 提取信息结构化展示 + 微信登录配置就绪 |
---
**启动脚本**: `/tmp/start_trademate.sh`
**日志文件**:
- 后端: `/tmp/trademate_backend.log`
- 前端: `/tmp/trademate_frontend.log`
---
## 六、快速验证
用户可以在浏览器中访问:
- **前端 H5**: http://localhost:5173
- **API 文档**: http://localhost:8000/docs
**游客模式体验**:
1. 点击 "快速体验" 按钮
2. 无需登录即可体验翻译和信息提取功能
**注册用户登录**:
- 手机号: `13800138099`
- 密码: `testpass123`
---
*本文档由任务进度跟踪系统维护*