baodan/docs/baodanppt集成计划.md

300 lines
8.4 KiB
Markdown
Raw Normal View History

2026-07-23 13:10:50 +08:00
# baodanppt 集成计划
> **目标**:在现有保险智能客服系统中集成 baodanpptPPT 生成)功能
> **日期**2026-07-23
---
## 一、现状分析
### 1.1 三个系统的技术栈
| 系统 | 技术栈 | 端口 | 入口 |
|------|--------|------|------|
| **Flask API** | Python Flask + SQLAlchemy | 5001 | `api/insurance/app.py` |
| **Vue 前端** | Vue 3 + TypeScript + Element Plus + Vite | 9080 | `frontend/src/App.vue` |
| **baodanppt** | Bun + TypeScript + 原生 HTML/JS | 3000 | `baodanppt/src/api/server.ts` |
### 1.2 baodanppt 前端特点
- **独立 SPA**:纯 HTML/JS无框架依赖运行在 `http://localhost:3000`
- **4 步流程**:上传 → 解析 → 生成 → 结果
- **API 调用**:所有接口以 `/api/` 开头,调用自己的 Bun 后端
- **静态文件**:前端代码在 `baodanppt/public/` 目录
### 1.3 现有前端结构
```
frontend/src/
├── App.vue # 布局 + 侧边栏导航
├── router/index.ts # Vue Router 路由定义
├── pages/ # 页面组件
├── components/ # 公共组件
├── composables/ # 组合式函数
└── utils/api.ts # Axios 实例 (baseURL: /insurance)
```
侧边栏导航在 `App.vue` 中,分两个区域:
- **功能菜单**:智能问答(/chat、产品推荐已注释
- **系统管理**:管理首页、用户管理、权限管理等(需 admin 权限)
---
## 二、集成方案
### 推荐方案iframe 嵌入 + API 代理
**理由**
1. baodanppt 前端是独立的原生 JS SPA**不适合重写为 Vue 组件**(工作量巨大且无收益)
2. iframe 嵌入是**最小改动方案**:只需创建一个 Vue 包装页面 + 代理 API 请求
3. 两个系统的 UI 风格差异大Element Plus vs 原生 Tailwindiframe 天然隔离样式冲突
### 架构图
```
用户浏览器
┌─ Vue 前端 (port 9080) ─────────────────────────┐
│ App.vue 侧边栏 │
│ ├── /chat → ChatPage.vue │
│ ├── /ppt → PptPage.vue (iframe) │
│ └── /admin/* → 管理页面 │
│ │
│ Vite 代理: │
│ /insurance/* → Flask API (5001) │
│ /ppt-api/* → baodanppt Bun (3000) │
└───────────────────────────────────────────────────┘
```
---
## 三、详细实施步骤
### 步骤 1启动 baodanppt 后端服务
baodanppt 的 Bun 后端需要作为常驻服务运行。
**文件**`baodanppt/src/api/server.ts`(已有,不需修改)
**启动命令**
```bash
cd baodanppt && bun run src/api/server.ts
# 监听 port 3000
```
**修改**:将 baodanppt 端口改为非冲突端口(如 3001或通过环境变量控制
```bash
PORT=3001 bun run src/api/server.ts
```
### 步骤 2配置 Vite 代理
**文件**`frontend/vite.config.ts`
新增一条代理规则,将 `/ppt-api/` 请求转发到 baodanppt 后端:
```typescript
// 在现有 proxy 配置中新增
'/ppt-api': {
target: 'http://localhost:3001',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/ppt-api/, ''),
}
```
这样前端访问 `/ppt-api/upload` 会被代理到 `http://localhost:3001/upload`
### 步骤 3创建 PptPage.vue 包装组件
**文件**`frontend/src/pages/PptPage.vue`(新建)
```vue
<template>
<div class="ppt-page">
<iframe
ref="iframeRef"
:src="pptUrl"
class="ppt-iframe"
frameborder="0"
allow="clipboard-write"
/>
</div>
</template>
<script setup lang="ts">
import { ref, computed } from 'vue'
const iframeRef = ref<HTMLIFrameElement>()
// iframe 地址:指向 baodanppt 前端
// 开发环境http://localhost:3001
// 生产环境:需要配置实际地址
const pptUrl = computed(() => {
// 从环境变量或配置中读取 baodanppt 地址
return import.meta.env.VITE_PPT_BASE_URL || 'http://localhost:3001'
})
</script>
<style scoped>
.ppt-page {
width: 100%;
height: calc(100vh - 60px); /* 减去顶部 header 高度 */
overflow: hidden;
}
.ppt-iframe {
width: 100%;
height: 100%;
border: none;
}
</style>
```
### 步骤 4添加路由
**文件**`frontend/src/router/index.ts`
在路由数组中新增:
```typescript
{
path: '/ppt',
name: 'PptGenerator',
component: () => import('@/pages/PptPage.vue'),
meta: {
requiresAuth: true,
title: 'PPT生成',
},
},
```
### 步骤 5添加侧边栏导航项
**文件**`frontend/src/App.vue`
在"功能菜单"区域(`智能问答` 下方)添加:
```vue
<!-- 桌面端侧边栏(约 line 122-192 -->
<el-menu-item index="/ppt">
<el-icon><Document /></el-icon>
<span>PPT生成</span>
</el-menu-item>
<!-- 移动端抽屉菜单(约 line 31-101 -->
<el-menu-item index="/ppt">
<el-icon><Document /></el-icon>
<span>PPT生成</span>
</el-menu-item>
```
### 步骤 6配置环境变量
**文件**`frontend/.env.development`(新建)
```bash
VITE_PPT_BASE_URL=http://localhost:3001
```
**文件**`frontend/.env.production`
```bash
VITE_PPT_BASE_URL=/ppt # 生产环境同源部署
```
---
## 四、生产环境部署方案
### 方案 A同源部署推荐
在生产环境中baodanppt 的静态文件由 Nginx 直接托管API 请求反向代理到 Bun 后端:
```nginx
# Nginx 配置片段
location /ppt/ {
alias /path/to/baodanppt/public/;
try_files $uri $uri/ /ppt/index.html;
}
location /ppt-api/ {
proxy_pass http://127.0.0.1:3001/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
```
此时 `VITE_PPT_BASE_URL=/ppt`iframe 加载 `/ppt/index.html`
### 方案 B独立端口
baodanppt 运行在独立端口3001前端直接指向 `http://domain:3001`
**缺点**:跨域、端口暴露、用户体验不统一。
---
## 五、需要修改的文件清单
| 文件 | 操作 | 改动量 |
|------|------|--------|
| `frontend/vite.config.ts` | 新增 `/ppt-api` 代理规则 | ~5 行 |
| `frontend/src/pages/PptPage.vue` | **新建** iframe 包装页面 | ~30 行 |
| `frontend/src/router/index.ts` | 新增 `/ppt` 路由 | ~8 行 |
| `frontend/src/App.vue` | 侧边栏新增"PPT生成"菜单项2 处) | ~4 行 |
| `frontend/.env.development` | **新建** 环境变量 | 1 行 |
| `baodanppt/src/api/server.ts` | 端口改为环境变量控制(已有 `PORT` | 0 行(已支持) |
| **合计** | | **~48 行** |
---
## 六、风险与注意事项
### 6.1 iframe 通信
当前方案不需要 iframe 通信。如果未来需要从 Vue 主应用向 baodanppt 传递用户信息(如 JWT token可通过
- URL 参数:`?token=xxx`
- `postMessage` API
### 6.2 样式隔离
iframe 天然隔离样式,不会影响 Element Plus 主题。
### 6.3 认证统一
baodanppt 当前使用 `X-API-Key` 认证。如果需要与主系统 JWT 统一:
- **短期方案**baodanppt 的 `APP_API_KEY` 设为空(开放模式)
- **长期方案**:在 baodanppt 的 Bun 后端添加 JWT 验证中间件
### 6.4 文件路径
baodanppt 的 `KNOWLEDGE_ROOT` 硬编码了 macOS 路径(`/Users/soldier/Desktop/公司介绍`)。部署到服务器时需要修改为环境变量或配置文件。
### 6.5 Python 依赖
baodanppt 需要 Python 3.11 + PyMuPDF + pdfplumber + python-pptx。部署时需要确保服务器安装了这些依赖。
---
## 七、验证标准
1. ✅ 访问 `http://localhost:9080/ppt` 能看到 baodanppt 的上传页面
2. ✅ 上传 PDF 文件能正常调用 `/ppt-api/upload`
3. ✅ AI 解析流程正常完成
4. ✅ PPT 生成并返回下载链接
5. ✅ 侧边栏"PPT生成"菜单项高亮正确
6. ✅ 移动端抽屉菜单中也有"PPT生成"入口
7. ✅ 页面刷新后保持在 PPT 生成页面
---
## 八、后续优化(可选)
| 优化项 | 说明 | 优先级 |
|--------|------|--------|
| JWT 统一认证 | 让 baodanppt 复用主系统的 JWT | 中 |
| 会话关联 | 将 PPT 生成会话与主系统用户绑定 | 中 |
| 风格统一 | 将 baodanppt 前端渐进式迁移到 Vue + Element Plus | 低 |
| 数据库集成 | 将生成记录存入主系统数据库 | 低 |
| Nginx 生产配置 | 配置反向代理和静态文件托管 | 高 |