baodan/docs/baodanppt集成计划.md

300 lines
8.4 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.

# 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 生产配置 | 配置反向代理和静态文件托管 | 高 |