# P8→NS1/RNS1 缺失项 #2:财务看板分段加载策略 ## 简要结论 - 状态:⚠️ 部分解决 - 风险等级:🔴 高 - 后端 BOARD-3 API 一次返回全部 6 板块数据,无 sections 参数支持分段加载;前端仅赠送卡矩阵做了异步加载,其余板块为 mock 静态数据。 ## 详细审查 ### 审查范围 - `apps/backend/app/routers/xcx_board.py`(BOARD-3 路由定义) - `apps/backend/app/schemas/xcx_board.py`(FinanceBoardResponse schema) - `apps/backend/app/services/board_service.py`(get_finance_board 服务) - `apps/miniprogram/miniprogram/pages/board-finance/board-finance.ts`(前端加载逻辑) ### 发现 1. **后端 API 不支持分段加载** - BOARD-3 路由参数仅有 `time`、`area`、`compare`,无 `sections` 参数 - `FinanceBoardResponse` 一次性返回全部 6 个 Panel:`overview`、`recharge`、`revenue`、`cashflow`、`expense`、`coach_analysis` - `get_finance_board` 服务函数内部顺序构建所有板块数据,无条件跳过机制 2. **前端加载策略:大部分为 mock 静态数据** - `board-finance.ts` 中 `overview`、`revenue`、`cashflow`、`expense`、`coachAnalysis` 的数据全部在 Page data 中以空字符串初始化,未调用 API - 仅 `_loadGiftRows()` 方法通过 `fetchBoardFinance()` 加载了赠送卡矩阵(`recharge.giftRows`)和 AI 洞察数据 - 页面 `onLoad` 时直接设置 `pageState: 'normal'`,无整体数据加载流程 3. **唯一的区域条件过滤** - `recharge` 板块在 `selectedArea !== 'all'` 时通过 `wx:if` 隐藏(前端条件渲染) - 后端 schema 中 `recharge: RechargePanel | None` 支持 area≠all 时返回 null ### 证据 ```python # xcx_board.py — BOARD-3 路由,无 sections 参数 @router.get("/finance", response_model=FinanceBoardResponse) async def get_finance_board( time: FinanceTimeEnum = Query(default=FinanceTimeEnum.month), area: AreaFilterEnum = Query(default=AreaFilterEnum.all), compare: int = Query(default=0, ge=0, le=1), user: CurrentUser = Depends(require_permission("view_board_finance")), ): # FinanceBoardResponse — 一次返回全部 6 板块 class FinanceBoardResponse(CamelModel): overview: OverviewPanel recharge: RechargePanel | None revenue: RevenuePanel cashflow: CashflowPanel expense: ExpensePanel coach_analysis: CoachAnalysisPanel ``` ```typescript // board-finance.ts — 仅加载赠送卡数据,其余为 mock async _loadGiftRows() { const data = await fetchBoardFinance({ time: this.data.selectedTime, area: this.data.selectedArea, compare: this.data.compareEnabled ? 1 : 0, }) // 仅处理 giftRows 和 aiInsights } ``` ### 建议 1. **后端**:为 BOARD-3 API 增加可选 `sections` 查询参数(如 `sections=overview,recharge`),服务层按需构建板块,未请求的板块返回 null 2. **前端**:实现分段加载策略——首次加载仅请求 `overview`,用户滚动到对应板块时再按需请求其余板块(利用 IntersectionObserver 或 onPageScroll 触发) 3. 当前 mock 数据阶段此问题影响不大,但联调前必须完成分段加载改造,否则 6 板块全量查询会导致首屏加载缓慢