hookehuyr

docs: 更新 API 集成日志和经验教训文档

API 集成日志:
- 完成 3 个待联调接口联调(addAPI, weekHotAPI, fileListAPI)
- 新增待联调接口快速清单(便于快速定位)
- 新增 myPlanListAPI 接口定义(我的计划书列表)
- 更新进度追踪:29个接口,82.8% 已完成

经验教训文档:
- 新增"复杂功能修改的系统性问题"章节
- 记录计划书模块开发中的系统性问题
- 提供系统化修改流程解决方案(5步完整流程)
- 包含反面案例和正面案例对比

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
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
......