# 保险智能客服系统 — 前端开发文档 > **文档版本**:V1.0 > **更新日期**:2026-06-25 > **技术栈**:Vue 3 + TypeScript + Element Plus + Vite --- ## 一、项目结构 ``` frontend/ ├── src/ │ ├── assets/ # 静态资源 │ ├── components/ # 公共组件 │ │ ├── ChatEmbed.vue # BaoDan 对话 iframe │ │ ├── ChatFilters.vue # 险种/保司筛选器 │ │ ├── ChatCopyButton.vue # 复制按钮 │ │ ├── RecommendForm.vue # 推荐表单 │ │ └── RecommendResult.vue # 推荐结果 │ ├── composables/ # 组合式函数 │ │ ├── useAuth.ts # 认证逻辑 │ │ └── useDraft.ts # 草稿保存 │ ├── constants/ # 常量定义 │ │ └── index.ts # 访客页面白名单等 │ ├── pages/ # 页面视图 │ │ ├── admin/ # 管理后台页面 │ │ ├── ChatPage.vue # 对话页面 │ │ ├── LoginPage.vue # 登录页面 │ │ ├── RecommendPage.vue # 推荐页面 │ │ └── RecommendHistory.vue # 历史方案 │ ├── router/ # 路由配置 │ │ └── index.ts │ ├── types/ # TypeScript 类型 │ │ └── index.ts │ ├── utils/ # 工具函数 │ │ └── api.ts # axios 封装 │ ├── App.vue # 主布局 │ └── main.ts # 入口文件 ├── package.json └── vite.config.ts ``` --- ## 二、待开发功能 ### 2.1 产品推荐联调 **目标**:联调 RecommendPage 与后端 API **修改文件**:`src/pages/RecommendPage.vue` **当前代码**: ```typescript async function onSubmit(formData: RecommendRequest) { loading.value = true try { const submitRes = await api.post('/recommend/generate', formData) const taskId = submitRes.data.task_id // ... 轮询逻辑 } catch { // 错误已由 api 拦截器处理 } } ``` **需要修改**: 1. 确认后端返回格式 2. 适配轮询逻辑 3. 处理超时情况 --- ### 2.2 推荐结果适配 **目标**:适配后端返回的方案格式 **修改文件**:`src/components/RecommendResult.vue` **后端返回格式**: ```json { "status": "done", "proposal": { "customer_name": "张三", "plans": [ { "name": "基础方案", "total_premium": 12000, "items": [ { "product_name": "XX重疾险", "coverage_amount": 300000, "annual_premium": 8000, "recommend_reason": "性价比高" } ], "summary": "适合预算有限的客户" } ], "disclaimer": "以上方案仅供参考" } } ``` **需要修改**: 1. 适配 plans 数组结构 2. 渲染产品表格 3. 显示总保费 --- ### 2.3 用户批量导入 **目标**:添加 Excel 批量导入功能 **修改文件**:`src/pages/admin/UsersPage.vue` **添加内容**: ```vue 批量导入 ``` **添加逻辑**: ```typescript const uploadHeaders = { Authorization: `Bearer ${localStorage.getItem('token')}` } function onImportSuccess(response: any) { if (response.code === 0) { ElMessage.success('导入成功') loadData() } else { ElMessage.error(response.message || '导入失败') } } function onImportError() { ElMessage.error('导入失败') } ``` --- ## 三、类型定义 ### 3.1 推荐相关类型 **文件**:`src/types/index.ts` ```typescript /** 推荐请求参数 */ export interface RecommendRequest { customer_name: string customer_age: number customer_gender: 'male' | 'female' health_status: '健康' | '有既往病史' | '慢性病' | '重大疾病史' occupation: string annual_income: number monthly_budget: number insurance_types: string[] coverage_amount: number coverage_period: string existing_policies?: ExistingPolicy[] } /** 已有保单 */ export interface ExistingPolicy { product_name: string insurance_type: string coverage_amount: number annual_premium: number } /** 推荐方案 */ export interface RecommendProposal { customer_name: string plans: InsurancePlan[] disclaimer: string } /** 保险方案 */ export interface InsurancePlan { name: string total_premium: number items: InsuranceItem[] summary: string } /** 保险产品 */ export interface InsuranceItem { product_name: string coverage_amount: number annual_premium: number recommend_reason: string } /** 推荐记录 */ export interface RecommendRecord { id: string customer_name: string insurance_types: string[] status: 'pending' | 'processing' | 'done' | 'failed' created_at: string completed_at?: string } ``` --- ## 四、API 调用规范 ### 4.1 请求格式 ```typescript import api from '@/utils/api' // GET 请求 const res = await api.get('/admin/users', { params: { page: 1 } }) // POST 请求 const res = await api.post('/recommend/generate', formData) // PUT 请求 const res = await api.put(`/admin/users/${id}`, userData) // DELETE 请求 const res = await api.delete(`/admin/users/${id}`) ``` ### 4.2 响应处理 ```typescript // axios 拦截器已处理 code !== 0 的情况 // 这里只需要处理成功情况 try { const res = await api.get('/admin/users') // res.data = { items: [...], total: 100 } users.value = res.data?.items || [] } catch (error) { // 错误已由拦截器显示 ElMessage } ``` ### 4.3 访客页面 ```typescript import { isGuestPage } from '@/constants' // 访客页面不发送 token if (!isGuestPage(window.location.pathname)) { const token = localStorage.getItem('token') if (token) { config.headers.Authorization = `Bearer ${token}` } } ``` --- ## 五、组件开发规范 ### 5.1 页面组件 ```vue ``` ### 5.2 表单组件 ```vue ``` --- ## 六、样式规范 ### 6.1 页面容器 ```css .page-container { padding: 20px; height: 100%; overflow: auto; box-sizing: border-box; } ``` ### 6.2 卡片样式 ```css .page-card { border-radius: 12px; box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05); } ``` ### 6.3 表格样式 ```css :deep(.el-table th) { background: #fafafa !important; color: #606266; font-weight: 600; } ``` --- ## 七、测试清单 | # | 页面 | 测试项 | 验证标准 | |---|------|--------|----------| | 1 | LoginPage | 账密登录 | 输入正确账密 → 跳转 /chat | | 2 | LoginPage | 表单校验 | 空表单提交 → 显示错误提示 | | 3 | ChatPage | 对话功能 | 发送消息 → 收到 AI 回答 | | 4 | ChatPage | 险种筛选 | 切换险种 → 对话正常 | | 5 | RecommendPage | 生成方案 | 填写表单 → 显示 3 套方案 | | 6 | RecommendPage | 导出 | 点击导出 → 下载文件 | | 7 | UsersPage | 用户列表 | 显示用户数据 | | 8 | UsersPage | 新增用户 | 填写表单 → 用户增加 | | 9 | UsersPage | 批量导入 | 上传 Excel → 用户增加 | | 10 | StatsPage | 统计数据 | 显示图表和数据 |