# 组件和工具函数库 这是从 `clue_info.vue` 页面重构提取出来的可复用组件和工具函数集合。 ## 🧩 组件列表 ### 1. ClientInfoCard - 客户信息卡片 显示客户基本信息的卡片组件,包含客户头像、姓名、电话等信息。 **位置**: `components/client-info-card/client-info-card.vue` **Props**: - `clientInfo`: Object - 客户信息对象 **Events**: - `call`: 拨打电话事件,参数: phoneNumber **使用示例**: ```vue ``` ### 2. StudentInfoCard - 学生信息卡片 显示学生信息的卡片组件,支持展开/收起操作按钮。 **位置**: `components/student-info-card/student-info-card.vue` **Props**: - `student`: Object - 学生信息对象 - `actions`: Array - 操作按钮配置(可选) - `showDetails`: Boolean - 是否显示详细信息(默认true) **Events**: - `toggle-actions`: 切换操作面板事件 - `action`: 操作按钮点击事件,参数: { action, student } **使用示例**: ```vue ``` ### 3. TabSwitcher - 标签切换组件 通用的标签页切换组件。 **位置**: `components/tab-switcher/tab-switcher.vue` **Props**: - `tabs`: Array - 标签配置数组 [{ id, name }] - `activeTabId`: String|Number - 当前激活标签ID **Events**: - `tab-change`: 标签切换事件,参数: { tabId, index, tab } **使用示例**: ```vue ``` ### 4. FitnessRecordCard - 体测记录卡片 显示体测记录数据和相关PDF报告的卡片组件。 **位置**: `components/fitness-record-card/fitness-record-card.vue` **Props**: - `record`: Object - 体测记录对象 **Events**: - `file-click`: 文件点击事件,参数: { file, record } **使用示例**: ```vue ``` ### 5. CallRecordCard - 通话记录卡片 显示通话记录详情的卡片组件。 **位置**: `components/call-record-card/call-record-card.vue` **Props**: - `record`: Object - 通话记录对象 **使用示例**: ```vue ``` ## 🛠️ 工具函数库 ### 核心工具函数 以下函数已添加到 `common/util.js` 中: #### 1. safeGet(obj, path, defaultValue) 安全访问对象属性,避免undefined错误。 ```javascript const name = this.$util.safeGet(clientInfo, 'customerResource.name', '未知客户') ``` #### 2. formatFileSize(bytes) 格式化文件大小为可读格式。 ```javascript this.$util.formatFileSize(1024000) // "1 MB" ``` #### 3. formatAge(age) 格式化年龄显示(小数转年龄+月份)。 ```javascript this.$util.formatAge(9.05) // "9岁5个月" ``` #### 4. formatGender(gender) 格式化性别显示。 ```javascript this.$util.formatGender(1) // "男" this.$util.formatGender(2) // "女" ``` #### 5. makePhoneCall(phoneNumber, successCallback, failCallback) 拨打电话的通用方法。 ```javascript this.$util.makePhoneCall('13800138000') ``` #### 6. navigateToPage(url, params) 页面跳转的通用方法,自动处理参数拼接。 ```javascript this.$util.navigateToPage('/pages/detail/index', { id: 123, name: '测试' }) // 结果: /pages/detail/index?id=123&name=测试 ``` #### 7. getCurrentDate() 获取当前日期 YYYY-MM-DD 格式。 ```javascript const today = this.$util.getCurrentDate() // "2024-01-15" ``` ## 📁 文件结构 ``` components/ ├── client-info-card/ │ └── client-info-card.vue ├── student-info-card/ │ └── student-info-card.vue ├── tab-switcher/ │ └── tab-switcher.vue ├── fitness-record-card/ │ └── fitness-record-card.vue ├── call-record-card/ │ └── call-record-card.vue ├── index.js # 组件导出索引 └── README.md # 本文档 common/ ├── util.js # 扩展后的工具函数库 └── utils-index.js # 工具函数导出索引 ``` ## 🚀 使用方式 ### 在页面中使用组件 1. **直接导入使用**: ```vue ``` 2. **批量导入**: ```javascript // 从索引文件导入 import { ClientInfoCard, StudentInfoCard } from '@/components/index.js' ``` ### 使用工具函数 工具函数已集成到全局 `$util` 对象中,可直接使用: ```vue ``` ## 💡 重构优势 1. **代码复用**: 组件和工具函数可在多个页面中复用 2. **维护性**: 集中管理,修改一处影响全局 3. **可测试性**: 独立组件易于单元测试 4. **性能优化**: 减少重复代码,提升应用性能 5. **开发效率**: 标准化组件提升开发速度 ## 📋 迁移指南 原 `clue_info.vue` 中的代码可按以下方式迁移: 1. 替换工具函数调用: - `this.safeGet()` → `this.$util.safeGet()` - `this.formatAge()` → `this.$util.formatAge()` - `this.makeCall()` → `this.$util.makePhoneCall()` 2. 替换组件代码: - 客户信息展示区域 → `` - 学生信息展示区域 → `` - 标签切换区域 → `` - 体测记录展示 → `` - 通话记录展示 → `` 3. 事件处理: - 保持原有事件处理逻辑 - 通过组件events获取用户操作