docs: 更新 API 集成日志和经验教训文档
API 集成日志: - 完成 3 个待联调接口联调(addAPI, weekHotAPI, fileListAPI) - 新增待联调接口快速清单(便于快速定位) - 新增 myPlanListAPI 接口定义(我的计划书列表) - 更新进度追踪:29个接口,82.8% 已完成 经验教训文档: - 新增"复杂功能修改的系统性问题"章节 - 记录计划书模块开发中的系统性问题 - 提供系统化修改流程解决方案(5步完整流程) - 包含反面案例和正面案例对比 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Showing
2 changed files
with
252 additions
and
1 deletions
This diff is collapsed. Click to expand it.
| ... | @@ -1943,6 +1943,257 @@ const USE_MOCK_DATA = process.env.NODE_ENV === 'development' | ... | @@ -1943,6 +1943,257 @@ const USE_MOCK_DATA = process.env.NODE_ENV === 'development' |
| 1943 | const USE_MOCK_DATA = true // 容易导致生产环境误用 | 1943 | const USE_MOCK_DATA = true // 容易导致生产环境误用 |
| 1944 | ``` | 1944 | ``` |
| 1945 | 1945 | ||
| 1946 | +### ❌ 坑:复杂功能修改的系统性问题 ⭐ 2026-02-09 新增 | ||
| 1947 | + | ||
| 1948 | +#### 问题描述 | ||
| 1949 | + | ||
| 1950 | +在修改复杂功能(如计划书模块的嵌套弹窗)时,出现了严重的系统性问题: | ||
| 1951 | +- 🔴 修改不系统:改一处忘一处,导致连锁错误 | ||
| 1952 | +- 🔴 缺少验证:没有主动添加调试日志并验证 | ||
| 1953 | +- 🔴 沟通低效:反复让用户复制粘贴错误信息 | ||
| 1954 | + | ||
| 1955 | +#### 错误模式 | ||
| 1956 | + | ||
| 1957 | +**典型的错误流程**: | ||
| 1958 | +```markdown | ||
| 1959 | +1. Claude Code: "我修改了文件 A" | ||
| 1960 | +2. User: [复制错误信息] | ||
| 1961 | +3. Claude Code: "哦,我忘记修改文件 B 了" | ||
| 1962 | +4. User: [复制错误信息] | ||
| 1963 | +5. Claude Code: "哦,我忘记修改文件 C 了" | ||
| 1964 | +6. ... 循环往复 | ||
| 1965 | +``` | ||
| 1966 | + | ||
| 1967 | +**问题根源**: | ||
| 1968 | +1. **没有全局视图**:只看到局部修改,没有整体规划 | ||
| 1969 | +2. **缺少验证机制**:修改后不主动验证,等待用户反馈 | ||
| 1970 | +3. **沟通方式错误**:依赖用户反馈,而不是主动检查 | ||
| 1971 | + | ||
| 1972 | +#### 解决方案:系统化修改流程 | ||
| 1973 | + | ||
| 1974 | +**对于复杂功能的修改,必须遵循以下流程**: | ||
| 1975 | + | ||
| 1976 | +##### 1. 📋 理解完整需求(开始修改前) | ||
| 1977 | + | ||
| 1978 | +```markdown | ||
| 1979 | +## 修改前检查清单 | ||
| 1980 | + | ||
| 1981 | +### 理解需求 | ||
| 1982 | +- [ ] 画出完整的数据流图 | ||
| 1983 | +- [ ] 列出所有受影响的文件 | ||
| 1984 | +- [ ] 确认修改的边界 | ||
| 1985 | +- [ ] 识别可能的副作用 | ||
| 1986 | + | ||
| 1987 | +### 影响分析 | ||
| 1988 | +- [ ] 哪些文件会修改? | ||
| 1989 | +- [ ] 哪些组件会受影响? | ||
| 1990 | +- [ ] 数据流会如何变化? | ||
| 1991 | +- [ ] 是否有现成的类似实现? | ||
| 1992 | +``` | ||
| 1993 | + | ||
| 1994 | +##### 2. 🧪 设计验证方案(修改前) | ||
| 1995 | + | ||
| 1996 | +```markdown | ||
| 1997 | +## 验证方案 | ||
| 1998 | + | ||
| 1999 | +### 调试日志规划 | ||
| 2000 | +在代码关键位置添加 console.log: | ||
| 2001 | +```javascript | ||
| 2002 | +// 示例:计划书弹窗 | ||
| 2003 | +console.log('[PlanPopup] 父弹窗状态变化:', { showParentFooter, showChildPopup }) | ||
| 2004 | +console.log('[PlanPopup] provide 数据:', { popupControl }) | ||
| 2005 | +console.log('[ChildPopup] 接收到的 provide:', injectedPopupControl) | ||
| 2006 | +console.log('[ChildPopup] 关闭子弹窗,通知父弹窗') | ||
| 2007 | +``` | ||
| 2008 | + | ||
| 2009 | +### 测试步骤 | ||
| 2010 | +1. 打开计划书页面 | ||
| 2011 | +2. 点击"申请计划书" | ||
| 2012 | +3. 观察控制台输出(应该看到父弹窗状态) | ||
| 2013 | +4. 点击"选择行业" | ||
| 2014 | +5. 观察控制台输出(应该看到子弹窗状态和父弹窗 footer 隐藏) | ||
| 2015 | +6. 关闭子弹窗 | ||
| 2016 | +7. 观察控制台输出(应该看到父弹窗 footer 恢复) | ||
| 2017 | +``` | ||
| 2018 | + | ||
| 2019 | +##### 3. ✋ 修改代码(一次性完成) | ||
| 2020 | + | ||
| 2021 | +```markdown | ||
| 2022 | +## 修改清单 | ||
| 2023 | + | ||
| 2024 | +### 受影响的文件 | ||
| 2025 | +- [ ] `src/components/PlanPopup/index.vue` - 父弹窗逻辑 | ||
| 2026 | +- [ ] `src/components/PlanFields/IndustryPicker.vue` - 子弹窗逻辑 | ||
| 2027 | +- [ ] `src/pages/plan/index.vue` - 页面集成 | ||
| 2028 | + | ||
| 2029 | +### 修改内容 | ||
| 2030 | +**文件 1: PlanPopup/index.vue** | ||
| 2031 | +- 添加 `provide` 传递控制方法 | ||
| 2032 | +- 响应 `popupControl` 的 `closeParent` 调用 | ||
| 2033 | +- 添加 console.log | ||
| 2034 | + | ||
| 2035 | +**文件 2: IndustryPicker.vue** | ||
| 2036 | +- 添加 `inject` 接收控制方法 | ||
| 2037 | +- 确认时调用 `popupControl.closeParent()` | ||
| 2038 | +- 添加 console.log | ||
| 2039 | + | ||
| 2040 | +**文件 3: plan/index.vue** | ||
| 2041 | +- 无需修改(仅用于验证) | ||
| 2042 | +``` | ||
| 2043 | + | ||
| 2044 | +##### 4. 🧞 提供验证指令 | ||
| 2045 | + | ||
| 2046 | +```markdown | ||
| 2047 | +## 验证指令 | ||
| 2048 | + | ||
| 2049 | +请按以下步骤验证修改: | ||
| 2050 | + | ||
| 2051 | +### 步骤 1:启动项目 | ||
| 2052 | +```bash | ||
| 2053 | +pnpm dev:weapp | ||
| 2054 | +``` | ||
| 2055 | + | ||
| 2056 | +### 步骤 2:导航到计划书页面 | ||
| 2057 | +在微信开发者工具中打开计划书页面 | ||
| 2058 | + | ||
| 2059 | +### 步骤 3:执行测试流程 | ||
| 2060 | +1. 点击"申请计划书"按钮 | ||
| 2061 | +2. 点击"选择行业"字段 | ||
| 2062 | +3. 选择任意行业 | ||
| 2063 | +4. 点击"确定"按钮 | ||
| 2064 | + | ||
| 2065 | +### 步骤 4:检查控制台输出 | ||
| 2066 | +**预期输出**: | ||
| 2067 | +``` | ||
| 2068 | +[PlanPopup] 父弹窗状态变化: { showParentFooter: true, showChildPopup: false } | ||
| 2069 | +[PlanPopup] provide 数据: { popupControl: { closeParent: [Function] } } | ||
| 2070 | +[ChildPopup] 接收到的 provide: { closeParent: [Function] } | ||
| 2071 | +[ChildPopup] 关闭子弹窗,通知父弹窗 | ||
| 2072 | +[PlanPopup] 收到关闭子弹窗通知,恢复 footer | ||
| 2073 | +``` | ||
| 2074 | + | ||
| 2075 | +### 步骤 5:观察页面行为 | ||
| 2076 | +**预期行为**: | ||
| 2077 | +- ✅ 父弹窗的 footer 在子弹窗打开时隐藏 | ||
| 2078 | +- ✅ 父弹窗的 footer 在子弹窗关闭时恢复 | ||
| 2079 | +- ✅ 没有层级冲突(子弹窗完全覆盖父弹窗底部) | ||
| 2080 | + | ||
| 2081 | +### 如果遇到错误 | ||
| 2082 | +请复制: | ||
| 2083 | +1. 控制台完整输出 | ||
| 2084 | +2. 页面截图(显示层级问题) | ||
| 2085 | +``` | ||
| 2086 | + | ||
| 2087 | +##### 5. 📝 等待反馈 | ||
| 2088 | + | ||
| 2089 | +**关键原则**: | ||
| 2090 | +- ✅ 一次性修改所有文件,不要分批 | ||
| 2091 | +- ✅ 添加详细的调试日志 | ||
| 2092 | +- ✅ 提供完整的验证步骤 | ||
| 2093 | +- ✅ 主动说明预期结果 | ||
| 2094 | +- ❌ 不要修改一个文件就问"对不对" | ||
| 2095 | +- ❌ 不要反复询问"有没有错误" | ||
| 2096 | +- ❌ 不要让用户反复复制粘贴 | ||
| 2097 | + | ||
| 2098 | +#### 实施要点 | ||
| 2099 | + | ||
| 2100 | +**✅ 我会做的**: | ||
| 2101 | +- ✅ 修改前列出所有受影响的文件 | ||
| 2102 | +- ✅ 添加 console.log 标注关键数据流 | ||
| 2103 | +- ✅ 给出完整的测试步骤 | ||
| 2104 | +- ✅ 主动说明"请运行后把 console 输出发给我" | ||
| 2105 | +- ✅ 一次性修改所有相关文件 | ||
| 2106 | + | ||
| 2107 | +**❌ 我不会做的**: | ||
| 2108 | +- ❌ 修改一个文件就问你"对不对" | ||
| 2109 | +- ❌ 让你反复复制粘贴错误 | ||
| 2110 | +- ❌ 没有整体计划就开始修改 | ||
| 2111 | + | ||
| 2112 | +#### 收益 | ||
| 2113 | + | ||
| 2114 | +**提升质量**: | ||
| 2115 | +- ✅ 一次性修改完整,减少返工 | ||
| 2116 | +- ✅ 有验证方案,快速定位问题 | ||
| 2117 | +- ✅ 减少沟通成本,提升效率 | ||
| 2118 | + | ||
| 2119 | +**提升体验**: | ||
| 2120 | +- ✅ 用户不需要反复复制粘贴 | ||
| 2121 | +- ✅ 验证步骤清晰明确 | ||
| 2122 | +- ✅ 问题定位快速准确 | ||
| 2123 | + | ||
| 2124 | +#### 适用场景 | ||
| 2125 | + | ||
| 2126 | +**必须使用系统化流程的场景**: | ||
| 2127 | +- 🔴 修改嵌套组件交互 | ||
| 2128 | +- 🔴 修改状态管理逻辑 | ||
| 2129 | +- 🔴 修改认证/权限流程 | ||
| 2130 | +- 🔴 修改跨页面通信 | ||
| 2131 | +- 🔴 涉及 3 个以上文件的修改 | ||
| 2132 | + | ||
| 2133 | +**可以简化的场景**: | ||
| 2134 | +- 🟢 修改单个文件的样式 | ||
| 2135 | +- 🟢 修改文案或简单逻辑 | ||
| 2136 | +- 🟢 添加 console.log 调试 | ||
| 2137 | +- 🟢 修复明显的 Bug | ||
| 2138 | + | ||
| 2139 | +#### 历史案例 | ||
| 2140 | + | ||
| 2141 | +**反面案例(2026-02-09)**: | ||
| 2142 | +```markdown | ||
| 2143 | +❌ 错误流程: | ||
| 2144 | +1. 修改 PlanPopup.vue → 用户测试 → 报错 | ||
| 2145 | +2. 修改 IndustryPicker.vue → 用户测试 → 报错 | ||
| 2146 | +3. 修改 PlanPopup.vue → 用户测试 → 又报错 | ||
| 2147 | +4. ... 循环往复,浪费时间 | ||
| 2148 | + | ||
| 2149 | +问题: | ||
| 2150 | +- 没有全局视图 | ||
| 2151 | +- 没有一次性修改所有文件 | ||
| 2152 | +- 没有添加调试日志 | ||
| 2153 | +- 没有提供验证步骤 | ||
| 2154 | +``` | ||
| 2155 | + | ||
| 2156 | +**正面案例(应该这样)**: | ||
| 2157 | +```markdown | ||
| 2158 | +✅ 正确流程: | ||
| 2159 | +1. 分析需求 → 列出 3 个受影响的文件 | ||
| 2160 | +2. 设计验证方案 → 规划 5 个调试日志点 | ||
| 2161 | +3. 一次性修改 3 个文件 → 添加 5 个 console.log | ||
| 2162 | +4. 提供验证步骤 → 说明预期输出 | ||
| 2163 | +5. 用户测试 → 一次性成功 | ||
| 2164 | + | ||
| 2165 | +收益: | ||
| 2166 | +- 减少返工 | ||
| 2167 | +- 快速定位问题 | ||
| 2168 | +- 提升效率 | ||
| 2169 | +``` | ||
| 2170 | + | ||
| 2171 | +#### 相关文件 | ||
| 2172 | + | ||
| 2173 | +- 计划书模块:`src/pages/plan/index.vue` | ||
| 2174 | +- 计划弹窗:`src/components/PlanPopup/index.vue` | ||
| 2175 | +- 表单字段:`src/components/PlanFields/` | ||
| 2176 | + | ||
| 2177 | +#### 最佳实践总结 | ||
| 2178 | + | ||
| 2179 | +⚠️ **强制要求**:修改复杂功能时,必须先规划后实施,一次性修改所有相关文件,并提供完整的验证方案。 | ||
| 2180 | + | ||
| 2181 | +```javascript | ||
| 2182 | +// ✅ 推荐流程 | ||
| 2183 | +1. 理解需求 → 画出数据流图 | ||
| 2184 | +2. 规划修改 → 列出所有受影响文件 | ||
| 2185 | +3. 设计验证 → 规划调试日志点 | ||
| 2186 | +4. 一次性修改 → 修改所有文件 + 添加日志 | ||
| 2187 | +5. 提供验证 → 给出测试步骤和预期结果 | ||
| 2188 | +6. 等待反馈 → 不要催促,不要反复询问 | ||
| 2189 | + | ||
| 2190 | +// ❌ 错误流程 | ||
| 2191 | +1. 修改文件 A → 问"对不对" → 报错 | ||
| 2192 | +2. 修改文件 B → 问"对不对" → 又报错 | ||
| 2193 | +3. 修改文件 A → 问"对不对" → 还报错 | ||
| 2194 | +4. ... 循环往复,浪费时间 | ||
| 2195 | +``` | ||
| 2196 | + | ||
| 1946 | --- | 2197 | --- |
| 1947 | 2198 | ||
| 1948 | ## 组件开发案例:AmountKeyboard 数字键盘组件 ⭐ 新增 | 2199 | ## 组件开发案例:AmountKeyboard 数字键盘组件 ⭐ 新增 |
| ... | @@ -2174,7 +2425,7 @@ const onConfirm = () => { | ... | @@ -2174,7 +2425,7 @@ const onConfirm = () => { |
| 2174 | 2425 | ||
| 2175 | --- | 2426 | --- |
| 2176 | 2427 | ||
| 2177 | -**最后更新**: 2026-02-08 | 2428 | +**最后更新**: 2026-02-09 |
| 2178 | **维护者**: Claude Code | 2429 | **维护者**: Claude Code |
| 2179 | **项目**: Manulife WeApp | 2430 | **项目**: Manulife WeApp |
| 2180 | 2431 | ... | ... |
-
Please register or login to post a comment