Files
Neo-ZQYY/docs/prd/Neo_Specs/review-audit/P8-NS1-01.md
Neo 6f8f12314f feat: 累积功能变更 — 聊天集成、租户管理、小程序更新、ETL 增强、迁移脚本
包含多个会话的累积代码变更:
- backend: AI 聊天服务、触发器调度、认证增强、WebSocket、调度器最小间隔
- admin-web: ETL 状态页、任务管理、调度配置、登录优化
- miniprogram: 看板页面、聊天集成、UI 组件、导航更新
- etl: DWS 新任务(finance_area_daily/board_cache)、连接器增强
- tenant-admin: 项目初始化
- db: 19 个迁移脚本(etl_feiqiu 11 + zqyy_app 8)
- packages/shared: 枚举和工具函数更新
- tools: 数据库工具、报表生成、健康检查
- docs: PRD/架构/部署/合约文档更新

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 00:03:48 +08:00

3.5 KiB
Raw Permalink Blame History

P8→NS1/RNS1 缺失项 #1三看板 Tab 切换的缓存策略

简要结论

  • 状态:⚠️ 部分解决
  • 风险等级:🔴
  • 三看板 Tab 切换已实现,但采用页面跳转而非组件切换,切换回来时不保持筛选状态和滚动位置。

详细审查

审查范围

  • apps/miniprogram/miniprogram/app.jsontabBar 配置)
  • apps/miniprogram/miniprogram/custom-tab-bar/index.ts(自定义 TabBar
  • apps/miniprogram/miniprogram/components/board-tab-bar/board-tab-bar.ts(看板内 Tab 组件)
  • apps/miniprogram/miniprogram/pages/board-finance/board-finance.ts(财务看板 Tab 切换)
  • apps/miniprogram/miniprogram/pages/board-coach/board-coach.ts(助教看板 Tab 切换)
  • apps/miniprogram/miniprogram/pages/board-customer/board-customer.ts(客户看板 Tab 切换)

发现

  1. Tab 切换方式:页面跳转,非组件内切换

    • app.json 中 tabBar 仅注册了 board-finance 为 tabBar 页面
    • board-customerboard-coach 是普通页面(非 tabBar 页面)
    • board-finance 切换到其他看板使用 wx.navigateTo()(页面栈压入)
    • board-coach/board-customer 切换到 board-finance 使用 wx.switchTab()(清空页面栈)
  2. 筛选状态不保持

    • 每个看板页面的筛选状态(selectedSortselectedDimensionselectedTime 等)存储在 Page data 中
    • 使用 wx.navigateTo 跳转时,离开的页面会被销毁(返回时重新 onLoad
    • 使用 wx.switchTab 回到 board-finance 时,该页面会触发 onShow 但不会重新 onLoadtabBar 页面有缓存)
    • board-coachboard-customer 作为非 tabBar 页面,每次进入都会重新创建
  3. 滚动位置不保持

    • 三个看板页面均无滚动位置保存/恢复逻辑
    • 页面重新加载后滚动位置归零
  4. 切换动画

    • 未实现 P8 定义的切换动画
    • 使用微信默认的页面跳转动画(右滑进入/左滑返回)

证据

// board-finance.ts — 切换到其他看板
onTabChange(e: WechatMiniprogram.TouchEvent) {
    const tab = e.currentTarget.dataset.tab as string
    if (tab === 'customer') {
      wx.navigateTo({ url: '/pages/board-customer/board-customer' })
    } else if (tab === 'coach') {
      wx.navigateTo({ url: '/pages/board-coach/board-coach' })
    }
}

// board-coach.ts — 切换回财务看板
onTabChange(e: WechatMiniprogram.TouchEvent) {
    const tab = e.currentTarget.dataset.tab as string
    if (tab === 'finance') {
      wx.switchTab({ url: '/pages/board-finance/board-finance' })
    } else if (tab === 'customer') {
      wx.navigateTo({ url: '/pages/board-customer/board-customer' })
    }
}
// app.json — 仅 board-finance 是 tabBar 页面
"tabBar": {
    "custom": true,
    "list": [
      { "pagePath": "pages/task-list/task-list", "text": "任务" },
      { "pagePath": "pages/board-finance/board-finance", "text": "看板" },
      { "pagePath": "pages/my-profile/my-profile", "text": "我的" }
    ]
}

建议

  1. 方案 A推荐:将筛选状态持久化到 getApp().globalDatawx.setStorageSync,页面 onLoad 时恢复
  2. 方案 B:将三个看板合并为一个页面,使用 wx:ifhidden 切换内容区域,天然保持状态
  3. 滚动位置可通过 onPageScroll 记录 + onLoadwx.pageScrollTo 恢复
  4. 切换动画可通过 CSS transition 在顶部 Tab 区域实现高亮滑动效果