# 组件复用性分析报告 ## 一、项目组件盘点 ### 1.1 现有自定义组件(10个) | 组件名称 | 路径 | 功能描述 | 使用频率 | 状态 | |---------|------|---------|---------|------| | navbar | /components/navbar | 自定义导航栏 | 高(15+页面) | ✅ 良好 | | pagination | /components/pagination | 分页组件 | 中(5页面) | ✅ 良好 | | popup | /components/popup | 通用弹窗 | 高(8页面) | ⚠️ 需优化 | | calendar | /components/calendar | 日历组件 | 低(未使用) | ❓ 待确认 | | pickerArea | /components/pickerArea | 省市区选择器 | 低(1页面) | ✅ 可用 | | uploadFile | /components/uploadFile | 文件上传 | 低(1页面) | ✅ 可用 | | ec-canvas | /components/ec-canvas | ECharts图表 | 中(2页面) | ✅ 良好 | | customPoster | /components/customPoster | 海报生成 | 低(未使用) | ❓ 待确认 | | star | /components/star | 星星动画 | 低(未使用) | ❓ 待确认 | | popupDoctor | /components/popupDoctor | 医生信息弹窗 | 低(未使用) | ❓ 待确认 | ### 1.2 TabBar组件(2个) | 组件名称 | 路径 | 使用端 | 使用频率 | |---------|------|--------|---------| | doctor-tab-bar | /components/doctor-tab-bar | 药店端 | 4页面 | | ground-tab-bar | /components/ground-tab-bar | 地推端 | 3页面 | **复用建议:** 两个组件功能相似,可合并为 `tab-bar` 组件,通过配置区分不同角色。 --- ## 二、组件复用价值评估矩阵 ### 2.1 高优先级组件(建议立即提取) | 组件名称 | 使用频率 | 功能独立性 | 通用性 | 复杂度 | 复用价值 | 优先级 | |---------|---------|-----------|--------|--------|---------|--------| | **项目选择器** | 3次 | 高 | 高 | 低 | ⭐⭐⭐⭐⭐ | P0 | | **统计卡片** | 4次 | 高 | 高 | 中 | ⭐⭐⭐⭐⭐ | P0 | | **日期选择逻辑** | 5次 | 高 | 高 | 中 | ⭐⭐⭐⭐ | P1 | ### 2.2 中优先级组件(建议后续提取) | 组件名称 | 使用频率 | 功能独立性 | 通用性 | 复杂度 | 复用价值 | 优先级 | |---------|---------|-----------|--------|--------|---------|--------| | **状态标签** | 2次 | 高 | 中 | 低 | ⭐⭐⭐ | P2 | | **个人信息页面** | 6次 | 中 | 中 | 高 | ⭐⭐⭐ | P2 | | **登录页面** | 2次 | 中 | 中 | 高 | ⭐⭐⭐ | P2 | | **修改昵称/手机页面** | 4次 | 中 | 中 | 中 | ⭐⭐⭐ | P2 | ### 2.3 低优先级组件(保持现状) | 组件名称 | 使用频率 | 功能独立性 | 通用性 | 复杂度 | 复用价值 | 优先级 | |---------|---------|-----------|--------|--------|---------|--------| | **患者卡片** | 1次 | 中 | 低 | 高 | ⭐⭐ | P3 | | **上传材料弹窗** | 1次 | 高 | 中 | 中 | ⭐⭐ | P3 | --- ## 三、详细组件分析 ### 3.1 项目选择器(ProjectPicker) **使用位置:** 1. 地推端首页:`/ground/pages/home/index.wxml` 2. 药店端首页:`/doctor/pages/home/index.wxml` 3. 患者列表页:`/doctor/pages/patientList/index.wxml` **代码相似度:** 90% **主要差异:** - 主题色不同(地推端蓝色 #4A8DFF,药店端橙色 #FF8A4C) - 样式细节略有差异 **提取收益:** - 减少重复代码约 60 行 - 统一项目切换交互体验 - 便于后续维护 **组件接口设计:** ```typescript interface ProjectPickerProps { projectList: Array<{ projectId: number; projectName: string }>; currentProjectName: string; themeColor: string; // 主题色 onChange: (projectId: number) => void; } ``` ### 3.2 统计卡片(StatCard) **使用位置:** 1. 地推端首页:`/ground/pages/home/index.wxml`(2处) 2. 药店端首页:`/doctor/pages/home/index.wxml`(2处) 3. 地推端统计页:`/ground/pages/stat/index.wxml` 4. 药店端统计页:`/doctor/pages/stat/index.wxml` **代码相似度:** 88% **主要差异:** - 地推端显示"药店数",药店端不显示 - 数据字段名称略有不同 - 主题色不同 **提取收益:** - 减少重复代码约 200 行 - 统一统计卡片样式 - 支持配置化展示 **组件接口设计:** ```typescript interface StatCardProps { title: string; tip?: string; data: Array<{ name: string; value: number }>; showIndicationStats?: boolean; indicationStats?: Array; themeColor: string; } ``` ### 3.3 日期选择逻辑(DatePickerMixin) **使用位置:** 1. 地推端首页:日期筛选逻辑 2. 药店端首页:日期筛选逻辑 3. 患者列表页:时间筛选 4. 地推端统计页:日期筛选 5. 药店端统计页:日期筛选 **代码相似度:** 85% **重复逻辑:** - 日期格式化函数 - 日期范围验证 - 日/月模式切换 - 日期选择器事件处理 **提取收益:** - 减少重复代码约 150 行 - 统一日期处理逻辑 - 避免日期相关 bug **Mixin接口设计:** ```typescript interface DatePickerMixin { // 数据 startDate: string; endDate: string; statType: 'day' | 'month'; // 方法 formatDate(date: string): string; formatMonth(date: string): string; validateDateRange(start: string, end: string): boolean; onDateChange(e: CustomEvent): void; prevDate(): void; nextDate(): void; } ``` ### 3.4 状态标签(StatusTag) **使用位置:** 1. 患者列表页:跳转状态、入组状态、审核状态 **代码相似度:** 80% **状态定义:** ```typescript // 跳转/入组状态 const statusOptions = [ { value: '', label: '全部' }, { value: 0, label: '未跳转/未入组' }, { value: 1, label: '已跳转/已入组' }, ]; // 审核状态 const auditStatusMap = { 0: { label: '未审核', class: 's2' }, 1: { label: '审核中', class: 's2' }, 2: { label: '已通过', class: 's1' }, 3: { label: '已驳回', class: 's1' }, }; ``` **提取收益:** - 统一状态展示样式 - 便于新增状态类型 ### 3.5 个人信息相关页面 **涉及页面:** - 地推端:my、changeNickname、changeTel(3个页面) - 药店端:my、changeNickname、changeTel(3个页面) **代码相似度:** 95% **主要差异:** - API接口地址不同 - 数据字段名称不同 - 主题色不同 **提取建议:** 创建通用页面模板,通过配置区分: ```typescript interface ProfileConfig { role: 'promoter' | 'pharmacist'; themeColor: string; apiEndpoints: { getProfile: string; updateAvatar: string; updateName: string; updatePhone: string; logout: string; }; } ``` --- ## 四、组件提取实施建议 ### 4.1 第一阶段:高优先级组件(1-2周) 1. **项目选择器** - 创建 `/components/project-picker/` - 替换 3 个页面的使用 - 编写组件文档 2. **统计卡片** - 创建 `/components/stat-card/` - 替换 4 个页面的使用 - 编写组件文档 3. **日期选择Mixin** - 创建 `/mixins/date-picker.ts` - 在 5 个页面中引入使用 - 编写使用文档 ### 4.2 第二阶段:中优先级组件(2-3周) 1. **状态标签组件** 2. **个人信息页面模板** 3. **登录页面模板** ### 4.3 第三阶段:优化与文档(1周) 1. 完善组件文档 2. 编写使用示例 3. 代码审查与优化 --- ## 五、预期收益 ### 5.1 代码量减少 | 组件 | 预计减少代码行数 | |------|----------------| | 项目选择器 | 60 行 | | 统计卡片 | 200 行 | | 日期选择Mixin | 150 行 | | 状态标签 | 80 行 | | 个人信息页面 | 300 行 | | **总计** | **约 800 行** | ### 5.2 维护效率提升 - 统一交互体验 - 减少重复 bug - 便于功能迭代 - 新功能开发效率提升 30% ### 5.3 代码质量提升 - 提高代码可读性 - 降低耦合度 - 提升可测试性 --- ## 六、风险评估与应对措施 | 风险点 | 影响 | 应对措施 | |--------|------|----------| | 组件耦合度高 | 提取困难 | 先解耦再提取,保持原有功能 | | 样式差异大 | 统一困难 | 通过 props 配置主题色和样式 | | 替换影响功能 | 回归测试 | 分阶段替换,每阶段充分测试 | | 接口差异 | 逻辑复杂 | 使用配置化方式处理差异 | --- ## 七、下一步行动 1. **立即开始**:项目选择器组件提取 2. **本周完成**:统计卡片组件提取 3. **下周开始**:日期选择Mixin提取 4. **持续进行**:组件文档编写 --- *报告生成时间:2026-03-05* *分析师:AI Assistant*