1. 09 Feb, 2026 6 commits
  2. 08 Feb, 2026 17 commits
    • 将独立的接口联调文档合并到统一的 API 集成日志中
      
      变更内容:
      - 将计划书模块接口文档合并到 docs/api-docs/API 集成日志.md
      - 新增计划书模块(2个接口)
        • 接口1: 提交计划书表单(待后端开发)
        • 接口2: 查询计划书状态(待后端开发)
      - 更新总体进度:27 → 29 个接口
      - 更新版本号:v2.5 → v2.6
      - 删除独立的 docs/接口联调注意事项.md
      
      文档规范:
      - 遵循项目统一的接口文档结构
      - 所有接口集成记录集中在 API 集成日志中维护
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
    • 修复问题:
      - 修复表单提交时数据为空的问题(submit 中立即重置导致)
      - 添加金额字段格式化显示(分 → 元),便于调试查看
      
      代码改动:
      - 移除 submit() 中的 resetForm() 调用,让父组件先处理数据
      - 新增 formatAmounts() 函数转换金额单位(分 → 元)
      - 优化日志输出:同时显示格式化数据(元)和原始数据(分)
      - 表单重置逻辑统一由 close() 函数处理
      
      文档新增:
      - docs/接口联调注意事项.md - 完整的 API 联调指南
        - 数据单位规范(金额字段单位为"分")
        - 接口联调流程和注意事项
        - 金额转换工具函数
        - 常见问题和解决方案
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
    • 创建 AmountKeyboard 组件替代 AmountInput 输入框,实现数字键盘交互:
      
      核心功能:
      - 点击弹出数字键盘(右列模式,包含小数点)
      - 金额显示弹窗(渐变背景 + 装饰圆圈)
      - 输入验证(1个小数点,2位小数)
      - 千分位分隔符显示
      - 集成 GlobalPopupManager 解决嵌套弹窗层级
      
      技术实现:
      - nut-number-keyboard @input 事件(单字符传递)
      - 字符累加逻辑:String(inputValue) + String(val)
      - 输入验证:split('.') 检查小数点和小数位数量
      - toFixed(2) 确保保存格式一致性
      - watch(showKeyboard) 同步键盘和弹窗状态
      
      问题解决:
      1. Vue渲染错误:使用 kebab-case 组件名
      2. 键盘被底部按钮遮挡:使用 GlobalPopupManager
      3. 单字符输入:实现字符累加
      4. 字符串相加变数字相加:显式 String() 转换
      5. 输入验证阻塞:初始化为空字符串
      6. 保存格式问题:使用 toFixed(2)
      7. 自动关闭bug:时间判断过滤
      8. 状态同步:watch 同步关闭金额弹窗
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
    • 新增功能:
      - 创建 GlobalPopupManager 全局弹窗管理器
      - 实现 useParentPopup 和 useGlobalPopup 接口
      - 支持多弹窗同时打开和多层嵌套
      
      新增组件:
      - PlanPopupNew: 支持全局弹窗管理的父弹窗组件
      - DatePickerGlobal: 使用全局管理器的日期选择器
      - SelectPickerGlobal: 使用全局管理器的下拉选择器
      - AgePickerGlobal: 使用全局管理器的年龄选择器
      
      技术方案:
      - 子弹窗打开时自动隐藏父弹窗底部按钮
      - 所有子弹窗关闭时自动恢复底部按钮
      - 使用 watch 监听全局状态,解决时序问题
      - 支持多个子弹窗同时打开
      
      迁移工作:
      - 更新 PlanFormContainer 使用 PlanPopupNew
      - 更新所有计划模板使用 Global 版本字段组件
      
      文档:
      - 创建 GlobalPopupManager 技术文档
      - 包含架构设计、API 文档、使用指南
      
      影响文件:
      - src/components/PlanFormContainer.vue (修复结束标签错误)
      - src/components/PlanPopupNew.vue (新组件)
      - src/components/PlanFields/GlobalPopupManager.js (核心管理器)
      - src/components/PlanFields/DatePickerGlobal.vue (新组件)
      - src/components/PlanFields/SelectPickerGlobal.vue (新组件)
      - src/components/PlanFields/AgePickerGlobal.vue (新组件)
      - src/components/PlanTemplates/*.vue (更新导入)
      - docs/GlobalPopupManager-弹窗管理器.md (技术文档)
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
    • 修复问题:
      - 表单关闭后再次打开数据依然存在
      - 第一次点击确认按钮没有值
      - 输入过程中数据意外丢失
      
      问题根因:
      - Vue 3 v-model 每次更新都创建新对象
      - reactive() 只在初始化时读取 props
      - watch 监听策略不当导致数据丢失
      
      解决方案:
      - 区分"重置"和"正常更新"
      - 重置判断:从有数据 → 空对象
      - 正常更新:只合并新字段,不删除已有字段
      
      影响文件:
      - PlanFormContainer.vue - 父组件,使用 nextTick 延迟重置
      - LifeInsuranceTemplate.vue - 子组件,优化 watch 策略
      - CriticalIllnessTemplate.vue - 子组件,优化 watch 策略
      - SavingsTemplate.vue - 子组件,优化 watch 策略
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
    • - 移除年龄联动相关的所有 console.log 调试语句
      - 更新 CHANGELOG.md 记录年龄与出生年月日联动优化
      
      影响文件:
      - src/components/PlanFields/AgePicker.vue
      - src/components/PlanTemplates/LifeInsuranceTemplate.vue
      - src/components/PlanTemplates/CriticalIllnessTemplate.vue
      - src/components/PlanTemplates/SavingsTemplate.vue
      - docs/CHANGELOG.md
      hookehuyr authored
    • - 调整字段顺序:年龄在前,出生年月日在后
      - 实现年龄 → 出生年月日自动计算(默认1月1日)
      - 保留出生年月日 → 年龄双向联动
      - 简化占位符文案,避免用户理解混乱
      - 修复 AgePicker 组件不触发 change 事件的问题
      - 添加调试日志便于排查问题
      
      影响文件:
      - src/components/PlanFields/AgePicker.vue: 添加 change 事件支持
      - src/components/PlanTemplates/LifeInsuranceTemplate.vue: 调整逻辑
      - src/components/PlanTemplates/CriticalIllnessTemplate.vue: 调整逻辑
      - src/components/PlanTemplates/SavingsTemplate.vue: 调整逻辑
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
    • ### 新增功能
      - LoadMoreList 组件支持动态高度测量
        - 使用 Taro.createSelectorQuery() 运行时测量
        - 新增 hasFooter prop(TabBar 页面)
        - 新增 extraBottomSpace prop(固定按钮等)
        - 支持响应式监听 props 变化
        - 支持页面生命周期重新测量(useDidShow)
        - 自动处理底部安全区域
      
      ### 修复
      - 修复 4 个页面的双重滚动问题
        - feedback-list, favorites, material-list, product-center
        - 添加页面容器 height: 100vh 和 overflow: hidden
      - 移除所有调试 console.log,保持代码整洁
      
      ### 配置更新
      - feedback-list: extraBottomSpace=280(固定按钮)
      - favorites: hasFooter=false
      - material-list: hasFooter=false
      - product-center: hasFooter=false
      - search: hasFooter=false
      - message: hasFooter=false
      - week-hot-material: hasFooter=false
      
      ### 文档
      - CHANGELOG.md: 记录双重滚动问题修复
      - lessons-learned.md: 添加坑 5(双重滚动问题)
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
    • - 更新当前实现状态,说明LoadMoreList已使用scroll-view
      - 补充缺少的功能清单(scrollTop prop、@scroll事件等)
      - 明确不实施原因:需求不明确、技术储备充足、优先级评估
      - 新增实施时机判断标准和启动条件
      - 新增工作量评估(5.5-9.5小时)
      - 新增风险评估(5个风险项及缓解措施)
      - 新增实施建议(技术验证、分阶段实施、充分测试)
      - 添加文档维护记录
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
    • 更新内容:
      - 记录 LoadMoreList 组件底部 padding 堆叠问题的修复
      - 记录搜索页滚动加载优化
      - 记录 LESS 修饰符类样式堆叠坑的经验教训
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
    • 问题描述:
      - .load-more-content 基础类有 padding: 32rpx(所有边)
      - .load-more-content.scrollable 修饰符类添加 padding-bottom
      - 两者堆叠导致底部 padding ≈ 192rpx + safe-area(过高)
      
      解决方案:
      - 修改 .scrollable 修饰符类,从只添加 padding-bottom 改为覆盖整个 padding 属性
      - 使用 padding: 32rpx 32rpx calc(160rpx + env(safe-area-inset-bottom))
      - 防止与基础类的 padding 堆叠
      
      影响文件:
      - src/components/LoadMoreList/index.vue: 修复 padding 堆叠问题
      - docs/lessons-learned.md: 添加 LESS 修饰符类样式堆叠坑的记录
      - src/pages/search/index.config.js: 添加 disableScroll 配置
      - src/pages/search/index.vue: 简化 shouldEnableScrollLoad 逻辑
      
      测试:
      - ✅ material-list 页面底部 padding 正常
      - ✅ search 页面底部 padding 正常
      - ✅ 所有使用 LoadMoreList 的页面都受益于这个修复
      
      经验教训:
      ⚠️ LESS 嵌套选择器中,修饰符类的属性会与基础类堆叠
      ✅ 需要覆盖基础类的 padding/margin/border 等属性时,重写整个属性而不是只写子属性
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
    • hookehuyr authored
    • ## 新增功能
      - 创建事件总线工具 (src/utils/eventBus.js)
      - 支持跨页面事件通信,无需直接依赖
      
      ## 页面修改
      - feedback-list 页面:监听反馈提交事件并刷新列表
      - favorites 页面:监听收藏更新事件并刷新列表
      - feedback 页面:提交成功后发送事件
      
      ## Composable 修改
      - useCollectOperation:收藏操作成功后发送事件
      
      ## 问题修复
      - 修复 favorites 和 feedback-list 页面使用 useDidShow 导致的列表意外刷新问题
      - 改用事件总线模式,仅在特定事件触发时刷新列表
      - LoadMoreList 页面仅使用 useLoad 进行一次性初始化
      
      ## 文档更新
      - 更新 docs/lessons-learned.md,新增"跨页面通信"章节
      - 记录事件总线实现模式和 useDidShow 陷阱解决方案
      
      ## 技术方案
      - 跨页面操作:使用事件总线(收藏、提交反馈)
      - 单页面操作:使用本地更新(删除收藏)
      - LoadMoreList 页面:useLoad + 事件总线,避免 useDidShow
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
    • - 添加"文档重组:全面中文化"条目
      - 清理重复的 LoadMoreList 迁移记录
      - 记录文档文件名全面改为中文的变更
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
    • - 删除旧版英文/混合命名文档,迁移到中文文件名
      - 重新组织 docs/guides/ 和 docs/reports/ 目录
      - 更新 docs/README.md 以反映新结构
      - 删除已废弃的 form-sn-mapping.json(配置已迁移到代码)
      
      影响范围:
      - 文档重组(guides、reports、mcp、plan 目录)
      - 新增中文命名文档(API 使用指南、变更日志检查等)
      - 更新文档索引和交叉引用
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
    • - 添加文档整理条目
      - 记录文档结构重组和中文命名规则
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
    • **主要变更**:
      - 将组件相关文档移动到 guides/components/
        - LoadMoreList 迁移指南.md
        - LoadMoreList 完整使用指南.md
      - 将 API/Mock 相关文档移动到 api-specs/数据文档/
        - Mock 数据完整总结.md
        - Mock 数据设置指南.md
        - API 集成日志.md
      - 将测试相关文档移动到相应目录
        - 滚动加载测试指南.md → guides/testing/
        - 计划测试实施报告.md → reports/测试报告/
      - 更新所有文档中的相对路径引用
      - 添加文档命名使用中文规则到全局规则
      
      **详细信息**:
      - **影响文件**: docs/ 目录下所有文档
      - **技术栈**: 文档组织
      - **测试状态**: N/A
      - **备注**: 提升文档可维护性和查找效率
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
  3. 07 Feb, 2026 6 commits
    • hookehuyr authored
    • - message 页面:添加下拉刷新功能
      - product-center 页面:保留搜索、tabs、计划书弹窗
      - material-list 页面:保留分类缓存、搜索防抖
      - search 页面:保留双列表、自动 tab 切换、三种状态
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
    • - 创建通用加载更多列表组件 LoadMoreList
        * 支持自定义头部、列表项、空状态插槽
        * 内置触底加载、加载状态、动画效果
        * 优化动画延迟策略(前10项逐个显示,其余立即显示)
      - 迁移 week-hot-material 页面使用新组件
        * 代码量减少 ~18%
        * 移除重复的分页逻辑和样式
      - 修复样式问题
        * 修复列表项黑色圆点(list-style: none)
        * 使用原生 Less 替代 TailwindCSS(兼容性更好)
      - 创建迁移指南文档
      - 减少 mock 数据延迟(100-300ms)用于开发测试
      
      技术栈: Vue 3 + Composition API + Taro
      收益: 提高代码复用性,降低维护成本,统一用户体验
      hookehuyr authored
    • - 修复搜索页面布局:顶部固定(NavHeader+SearchBar+Tabs+ResultCount)+ 列表滚动
      - 修复搜索分页hasMore计算时机bug(首次搜索显示没有更多的问题)
      - 实现环境判断的Mock数据自动切换
        - 开发环境(pnpm dev:weapp)使用mock数据
        - 生产环境(pnpm build:weapp)使用真实API
        - 使用process.env.NODE_ENV === 'development'自动判断
      - 更新5个页面使用环境变量判断
      - 新增开发工作流文档到lessons-learned.md
      
      修改文件:
      - src/pages/search/index.vue: 修复布局和分页逻辑
      - src/pages/week-hot-material/index.vue: 环境判断
      - src/pages/message/index.vue: 环境判断
      - src/pages/material-list/index.vue: 环境判断
      - src/pages/product-center/index.vue: 环境判断
      - docs/lessons-learned.md: 新增开发工作流章节Mock数据环境自动切换模式
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
    • - 新增"最新更新"部分,记录计划书功能优化、样式改进、认证优化
      - 更新常见问题快速解决表,新增嵌套弹窗和401重定向问题
      - 更新 Composables 表格,新增 useCollectOperation
      - 更新页面列表,新增消息、产品中心、周热门资料、分类列表页面
      - 更新组件库说明,新增 PlanFields 组件集
      - 同步组件自包含原则到最佳实践部分
      
      🤖 Generated with assistance from Claude Code
      hookehuyr authored
    • - 将边框颜色从 gray-50 更新为 gray-200
      - 更新 PlanPopup 组件类型定义导入路径
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
  4. 06 Feb, 2026 11 commits
    • 使用 Vue provide/inject 模式实现父子弹窗通信:
      - PlanPopup 提供 popupControl 给所有后代组件
      - 子组件注入 popupControl 并在打开/关闭时调用
      - 当子弹窗打开时,自动隐藏父弹窗的底部按钮
      - 子弹窗关闭时,自动恢复父弹窗的底部按钮
      
      影响文件:
      - PlanPopup: 提供 popupControl,添加 childPopupCount 计数器
      - AgePicker/DatePicker/SelectPicker: 注入 popupControl
      - AmountInput: 添加弹窗控制支持
      - index: 小调整
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
    • - 按钮文本:从返回首页改为完成
      - 按钮逻辑:使用 Taro.navigateBack() 返回上一页
      - 移除 useGo hook 依赖
      
      原因:结果页可能从多个入口进入,返回上一页更符合用户操作流程
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
    • hookehuyr authored
    • - 将列表容器从 view 改为 scroll-view 组件以支持滚动加载
      - 实现 scroll-view 的 @scrolltolower 事件处理
      - 添加防抖机制避免频繁触发加载(300ms)
      - 移除所有 console.log 调试语句
      - 优化代码结构,移除未使用的函数参数
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
    • - 增大产品卡片标题字体(28rpx → 32rpx)
      - 调整标签样式(更圆润、优化内边距)
      - 调整文档列表项(图标更大、文件名显示2行)
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
    • hookehuyr authored
    • 详细记录:
      - 修复401重定向死循环问题
      - 修复登录页返回报错问题
      - 智能跳转优化
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
    • 核心改动:
      1. 401拦截器智能选择跳转方式
         - 导航栈只有1页时使用 reLaunch(清空栈)
         - 导航栈有多页时使用 redirectTo(替换当前页)
         - 保存当前路径到 router store(用于登录后跳回)
      
      2. NavHeader组件智能返回逻辑
         - 检查导航栈长度
         - 导航栈只有1页时跳转首页(避免返回报错)
         - 导航栈有多页时正常返回
      
      3. 登录页智能跳转
         - 登录成功后读取 router store 保存的路径
         - 有保存路径则跳转回原页面
         - 无保存路径则跳转到首页
      
      解决问题:
      - ✅ 修复401重定向导致的死循环问题
      - ✅ 修复登录页点击返回报错 "navigateBack:fail cannot navigate back at first page"
      - ✅ 提升用户体验(登录后回到原页面而非总是首页)
      
      技术细节:
      - 正确使用 Pinia store:const store = routerStore()
      - 理解导航 API 差异:navigateTo(入栈)、redirectTo(替换)、reLaunch(清空栈)
      
      影响文件:
      - src/utils/request.js - 401拦截器优化
      - src/components/NavHeader.vue - 返回逻辑优化
      - src/pages/login/index.vue - 登录成功后智能跳转
      - components.d.ts - TypeScript声明自动更新
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
    • - 全局基础字体大小从默认值增加到 30rpx
      - 首页网格导航图标容器从 88rpx 增加到 100rpx
      - 首页网格导航图标大小从 24 增加到 28
      - 首页网格导航标签文字从 26rpx 增加到 28rpx
      - 底部导航栏图标大小从 24 增加到 28
      - 底部导航栏文字从 20rpx 增加到 24rpx
      
      这些改动改善了触摸目标和文字可读性,特别是在移动设备上。
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
    • - 从 2 列网格布局改为单列水平卡片布局
      - 图片尺寸从 200rpx 增加到 220rpx
      - 使用圆形文字按钮替代 NutUI 按钮组件
      - 优化标签显示逻辑,显示所有标签而非仅前 2 个
      
      技术细节:
      - 布局:flex 布局,图片固定宽度 220rpx
      - 按钮:纯文字按钮,详情为浅蓝背景,计划书为深蓝背景
      - 间距:使用 gap、mt-auto 等优化视觉层次
      
      影响文件:
      - src/pages/product-center/index.vue
      - components.d.ts (自动更新)
      - docs/CHANGELOG.md
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored
    • 移除 h-screen flex-col 布局,改用页面级滚动
      - NavHeader 和搜索栏使用 sticky top-0 固定
      - 列表容器使用页面级滚动(移除 overflow-y-auto)
      - 删除 mock 数据相关代码
      
      Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
      hookehuyr authored