baodan/AGENTS.md
wsb1224 e3479f0546 上线阻断问题全部修复
#	问题	修复	文件
1	前端构建失败(引号错误)	size="small type=" → size="small" type="	PosterHistoryPage.vue
2	migrate_014 ORM vs 缺失列	全部改为原始 SQL,不再引用 ORM 模型	migrate_014.py
3	cleanup 字段名错误	output_path → ppt_path	cleanup.py
4	文案生成 case 越权	添加 case.user_id != user_id 校验	poster/service.py
5	存储路径未接通持久化卷	全部改用 get_storage_root()(默认 /app/api/storage/insurance)	config.py, ppt/routes.py, poster/service.py, poster/tasks.py
高风险问题修复
#	问题	修复	文件
6	migrate_019 rollback 撤销成功字段	每个 ALTER 后立即 commit,失败只回滚当前语句	migrate_019.py
7	迁移锁 Windows 不兼容 + 句柄未持久化	全局变量保存锁句柄,支持 Windows msvcrt	api/insurance/db/__init__.py
8	PDF 校验异常时放行	异常返回 False(文件损坏)	security.py
9	健康检查始终返回成功	缺少关键资源时返回 503 + missing 列表	poster/routes.py
10	短密钥掩码泄露原值	≤4 字符返回 ****	ppt_admin_service.py
11	设置无键名白名单	添加 _ALLOWED_SETTING_KEYS 白名单	ppt_admin_service.py
12	容器重启任务永久 stuck	添加 recover_stale_tasks() 启动恢复函数	poster/tasks.py, ppt/parse_worker.py
2026-07-27 13:52:09 +08:00

166 lines
7.8 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.

# 保险智能客服系统
## 项目概述
基于 BaoDan 源码的保险行业智能客服系统。**直接在 BaoDan 源码上开发**,自研代码放在 `api/insurance/` 目录下,与 BaoDan 代码物理隔离,只改 BaoDan 的 `main.py` 注册路由。
## 架构
```
用户浏览器 / 企微 H5
┌─ BaoDan 服务(你的代码 + BaoDan 代码,同一进程)────────┐
│ BaoDan WebApp对话界面
│ BaoDan 管理后台(知识库/Prompt/模型/日志) │
│ 你的 Extensions
│ · api/insurance/wecom/ 企微机器人 + OAuth │
│ · api/insurance/recommend/ 产品推荐 │
│ · api/insurance/permissions/角色权限 │
│ └── api/insurance/stats/ 数据统计 │
└────────────────────────────────────────────────────────┘
└── 你的前端Vue 3独立项目
```
## 核心原则
1. **在 BaoDan 源码上开发**,自研代码放 `api/insurance/`,与 BaoDan 代码隔离
2. **只改 BaoDan 的 `main.py`**(注册路由)和 `web/.env.local`(开启 iframe其余 BaoDan 文件不动
3. **复用 BaoDan 基础设施**认证、数据库、Redis、日志全部用 BaoDan 现有的,不重复造轮子
4. **BaoDan 升级安全**:你的代码在独立目录,升级时只合并 `main.py` 那几行改动
5. **前端独立**Vue 3 项目,对话页面 iframe 嵌入 BaoDan WebApp
## 目录结构
```
baodanagent/
├── api/
│ └── insurance/ # ★ 你的全部自研代码
│ ├── app.py # Flask 应用入口
│ ├── config.py # 公共配置
│ ├── routes.py # Blueprint 路由注册
│ ├── admin/ # 管理后台(用户/部门/模板/通知)
│ ├── auth/ # 认证(企微 OAuth + 账密登录)
│ ├── chat/ # 对话功能iframe 嵌入 BaoDan
│ ├── db/ # 数据库 + 自定义迁移migrate_001~013
│ ├── kb/ # 知识库管理
│ ├── middleware/ # 认证中间件
│ ├── models/ # SQLAlchemy 数据模型12 个)
│ ├── recommend/ # 产品推荐Workflow 调用)
│ ├── stats/ # 数据统计
│ ├── utils/ # 工具函数(审计/邮件/错误处理)
│ └── wecom/ # 企微机器人 + OAuth
├── frontend/ # 你的前端(独立 Vue 3 项目)
│ ├── src/
│ │ ├── pages/ # 页面视图(用户端 + 管理端)
│ │ ├── components/ # 公共组件
│ │ ├── composables/ # 组合式函数
│ │ └── utils/ # 工具函数api.ts
│ └── dist/ # 构建产物
├── deploy/ # 部署配置SQL/init.sql, nginx.conf, logo
├── scripts/ # 脚本目录(按用途分类)
│ ├── deploy/ # 部署脚本deploy-baodanagent.sh 等)
│ ├── build/ # 构建脚本build-and-push.sh, package.sh
│ ├── tools/ # 工具脚本check-env.sh, docker-cleanup.sh
│ ├── setup/ # 初始化脚本create_admin.py 等)
│ └── README.md # 脚本索引说明
├── tests/ # 测试文件
├── docs/ # 项目文档19 篇)
├── patches/ # Dify 源码补丁
├── plugin_files/ # Dify 插件定义
├── docker-compose.dify.yml # Docker Compose数据库 + Redis
├── docker-compose.frontend.yml # Docker Compose前端容器
├── Dockerfile.dify-custom # API 镜像(添加 insurance 模块)
├── Dockerfile.web-custom # Web 镜像(替换品牌)
├── Dockerfile.frontend # 前端镜像(静态服务 + 反向代理)
├── serve.py # 前端静态服务 + API 反向代理
├── dify-main/ # Dify 开源基座(参考,不直接修改)
└── deploy-package/ # 预构建部署包Docker 镜像 tarballs
```
## 修改 BaoDan 源码清单
| 文件 | 改动 | 改动量 |
|------|------|:---:|
| `api/main.py` | 注册 insurance Blueprint | ~5 行 |
| `web/.env.local` | 开启 iframe 嵌入 | 1 行 |
| **合计** | **只改 2 个 BaoDan 文件** | **~6 行** |
## 开发规范
详见 `docs/保险智能客服系统_编码规范.md`,关键点:
- 自研代码全部放在 `api/insurance/` 下,不往 BaoDan 其他目录写代码
- 后端文件名/变量名snake_case
- 前端组件名/变量名camelCase / PascalCase
- 复用 BaoDan 的数据库连接、Redis、日志系统
- 统一响应格式:`{"code": 0, "message": "success", "data": {...}}`
- 注释用中文commit message 用英文
## 运行方式
```bash
# 1. 启动 BaoDan源码模式
cd baodan-main
./dev/setup # 安装依赖
./dev/start-api # 后端(含你的 insurance 模块)
./dev/start-worker # Celery Worker
./dev/start-web # 前端
# 2. 启动你的 Vue 前端
cd frontend
pnpm install && pnpm dev
# 3. 验证
curl http://localhost:5001/api/health
curl http://localhost:5001/api/wecom/callback # 企微回调
```
## 开发文档
所有文档已整理到 `docs/` 目录,完整索引见 [docs/README.md](docs/README.md)
- `docs/保险智能客服系统_需求文档.md` — 完整需求
- `docs/保险智能客服系统_API接口文档.md` — 45 个 API 接口
- `docs/保险智能客服系统_编码规范.md` — 编码标准
- `docs/保险智能客服系统_测试用例.md` — 测试用例
- `docs/前端开发计划.md` — 前端开发详细计划
- `docs/后续开发计划.md` — 项目状态 + 未完成功能
- `docs/开发任务清单.md` — 412 项可勾选任务
- `docs/API_curl示例.md` — 接口调试 curl 示例
- `docs/部署文档_完整版.md` — 完整部署文档
- `docs/保险智能客服系统_文档规范.md` — 文档编写标准
## BaoDan 对接要点
- 复用 BaoDan 的数据库连接SQLAlchemy自研表直接用 BaoDan 的 DB
- 复用 BaoDan 的认证系统,在上面叠加你的角色权限
- 调 BaoDan 的 RAG 引擎:**直接 import Python 函数**,不走 HTTP
- 调 BaoDan 的 Workflow通过 Python API 调用,不走 HTTP
- 按险种筛选:创建多个 BaoDan 应用,你的路由代码按用户选择分发
## BaoDan 升级流程
```bash
cd baodan-main
git stash # 暂存你的 insurance/ 目录改动
git pull origin main # 拉取 BaoDan 新版本
git stash pop # 恢复你的改动
# 如果 main.py 有冲突 → 手动合并(只合并注册路由的 5 行)
# 如果 .env.local 有冲突 → 重新加那一行
# insurance/ 目录永远不会冲突(新增的目录)
```
## 注意事项
- `.env` 文件不要提交到 Git
- BaoDan 的 `NEXT_PUBLIC_ALLOW_EMBED` 必须开启才能 iframe 嵌入
- 企微回调必须在 5 秒内返回 `success`,异步处理消息
- BaoDan WebApp 和你的前端必须**同源部署**
- 自研表的数据库迁移用 Alembic放在 `api/insurance/db/`