包含多个会话的累积代码变更: - 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>
81 lines
3.5 KiB
Markdown
81 lines
3.5 KiB
Markdown
# P8→NS1/RNS1 缺失项 #1:三看板 Tab 切换的缓存策略
|
||
|
||
## 简要结论
|
||
- 状态:⚠️ 部分解决
|
||
- 风险等级:🔴 高
|
||
- 三看板 Tab 切换已实现,但采用页面跳转而非组件切换,切换回来时不保持筛选状态和滚动位置。
|
||
|
||
## 详细审查
|
||
|
||
### 审查范围
|
||
- `apps/miniprogram/miniprogram/app.json`(tabBar 配置)
|
||
- `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-customer` 和 `board-coach` 是普通页面(非 tabBar 页面)
|
||
- 从 `board-finance` 切换到其他看板使用 `wx.navigateTo()`(页面栈压入)
|
||
- 从 `board-coach`/`board-customer` 切换到 `board-finance` 使用 `wx.switchTab()`(清空页面栈)
|
||
|
||
2. **筛选状态不保持**
|
||
- 每个看板页面的筛选状态(`selectedSort`、`selectedDimension`、`selectedTime` 等)存储在 Page data 中
|
||
- 使用 `wx.navigateTo` 跳转时,离开的页面会被销毁(返回时重新 `onLoad`)
|
||
- 使用 `wx.switchTab` 回到 `board-finance` 时,该页面会触发 `onShow` 但不会重新 `onLoad`(tabBar 页面有缓存)
|
||
- 但 `board-coach` 和 `board-customer` 作为非 tabBar 页面,每次进入都会重新创建
|
||
|
||
3. **滚动位置不保持**
|
||
- 三个看板页面均无滚动位置保存/恢复逻辑
|
||
- 页面重新加载后滚动位置归零
|
||
|
||
4. **切换动画**
|
||
- 未实现 P8 定义的切换动画
|
||
- 使用微信默认的页面跳转动画(右滑进入/左滑返回)
|
||
|
||
### 证据
|
||
|
||
```typescript
|
||
// 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' })
|
||
}
|
||
}
|
||
```
|
||
|
||
```json
|
||
// 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().globalData` 或 `wx.setStorageSync`,页面 `onLoad` 时恢复
|
||
2. **方案 B**:将三个看板合并为一个页面,使用 `wx:if` 或 `hidden` 切换内容区域,天然保持状态
|
||
3. 滚动位置可通过 `onPageScroll` 记录 + `onLoad` 时 `wx.pageScrollTo` 恢复
|
||
4. 切换动画可通过 CSS transition 在顶部 Tab 区域实现高亮滑动效果
|