Files
Neo-ZQYY/docs/miniprogram-dev/api-audit/chat-history.md

6.5 KiB
Raw Blame History

chat-history 页面数据来源排查

排查日期2026-03-18 页面路径pages/chat-history/chat-history 排查范围chat-history.ts / .wxml / .wxss / .json + 引用的 mock-data.ts / sort.ts / time.ts

概览

分类 数量 说明
A. Mock 数据 5 字段 全部列表数据来自 mockChatHistory,无真实 API
B. 硬编码数据 5 处 ICON_GRADIENTS 配色、延迟常量、回退值、跳转路径
C. 已对接 API 0 页面尚未对接任何后端接口
D. 前端计算/派生 4 字段 timeLabeliconGradientpageStatestatusBarHeight
E. 路由参数 0 本页无接收路由参数(跳转时传出 historyId
F. WXML 硬编码文案 6 处 加载/错误/空态/底部提示等 UI 文案

一、Mock 数据(来自 mock-data.ts

数据源:import { mockChatHistory } from '../../utils/mock-data' 类型定义:ChatHistoryItem

# 字段 类型 Mock 值示例 说明
1 id string 'chat-001' 对话记录唯一 ID
2 title string '张伟消费分析' 对话标题
3 lastMessage string '已记录。下次回访张伟时...' 最后一条消息摘要
4 timestamp string '2026-03-05T14:02:03+08:00' ISO 8601 时间戳
5 customerName string? '张伟' / undefined 可选,关联客户名

Mock 数据条数4 条(mockChatHistory 数组长度)


二、硬编码数据

# 位置 说明
1 chat-history.ts 顶部常量 ICON_GRADIENTS 6 组 CSS 渐变色 VI 规范 §6.2 AI 图标配色系统indigo/purple/red/orange/yellow/blue
2 chat-history.tsloadData() setTimeout(..., 400) 模拟网络延迟 400ms联调时需替换为真实异步调用
3 chat-history.tsonPullDownRefresh() setTimeout(() => wx.stopPullDownRefresh(), 600) 下拉刷新 600ms 后停止,联调时需与真实请求回调绑定
4 chat-history.tsonLoad() sysInfo.statusBarHeight || 44 状态栏高度回退值 44当前 WXML 中未消费该值)
5 chat-history.tsonItemTap() '/pages/chat/chat?historyId=' + id 跳转路径硬编码

三、已对接 API

无。 页面当前 0 个真实 API 调用。

代码中有明确 TODO 注释:

// TODO: 替换为真实 API 调用
const sorted = sortByTimestamp(mockChatHistory)

四、前端计算/派生数据

# 字段 计算逻辑 依赖
1 timeLabel formatRelativeTime(item.timestamp) time.ts → 将 ISO 时间戳转为「刚刚/N分钟前/N小时前/N天前/MM-DD/YYYY-MM-DD」
2 iconGradient ICON_GRADIENTS[Math.floor(Math.random() * ICON_GRADIENTS.length)] 从 6 色渐变数组中随机取一个(每次渲染结果不同)
3 pageState 状态机:'loading''normal' / 'empty' / 'error' 根据 list.length === 0 判断空态,catch 进入错误态
4 statusBarHeight wx.getWindowInfo().statusBarHeight || 44 系统 API 获取(当前 WXML 未消费此值)

五、路由参数

本页无接收路由参数。 onLoad() 未读取 options 参数。

传出参数(跳转时):

目标页 参数 来源
/pages/chat/chat historyId={item.id} 列表项的 id 字段(当前为 Mock

六、WXML 硬编码文案

# 位置 文案 说明
1 加载态 toast 加载中... loading 浮层文案
2 错误态 emoji 😵 错误图标emoji
3 错误态文案 加载失败,请重试 错误提示
4 错误态按钮 重新加载 重试按钮文案
5 空态描述 暂无对话记录 <t-empty description="暂无对话记录" />
6 底部提示 — 已加载全部记录 — 列表底部 footer

七、联调 TODO

7.1 必须替换的 Mock 数据

优先级 改动项 当前状态 联调目标
P0 mockChatHistory → 真实 API loadData() 中直接引用 mock 数组 调用后端 GET /api/chat/history 或类似接口,返回 ChatHistoryItem[]
P0 移除 setTimeout(…, 400) 模拟延迟 硬编码 400ms 替换为 wx.request / 封装的 http.get() 异步调用
P1 下拉刷新绑定真实请求 onPullDownRefresh 中 600ms 后固定停止 在 API 回调中调用 wx.stopPullDownRefresh()

7.2 需确认的接口契约

字段 问题 建议
id Mock 为 chat-001 格式,后端实际 ID 格式? 确认是 UUID / 自增 ID / 其他
title 对话标题由谁生成?后端还是前端? 确认接口是否返回 title
lastMessage 是否需要截断?最大长度? 确认接口返回的是完整消息还是摘要
timestamp 后端返回格式ISO 8601 / Unix ms formatRelativeTime 两种都支持
customerName 可选字段,后端是否一定返回? 确认接口契约中该字段的 nullable 语义

7.3 需关注的前端逻辑

项目 说明
iconGradient 随机分配 每次渲染/刷新颜色会变,是否需要按 id 哈希固定?
statusBarHeight 未使用 data.statusBarHeight 已计算但 WXML 中无消费,可能是自定义导航栏残留代码
分页/无限滚动 当前一次性加载全部,数据量大时需要分页
错误态重试 onRetry 调用 loadData(),联调后需确认错误处理(网络超时/401/500 等)
import { mockChatHistory } 联调完成后需删除此 import 及 mock-data.ts 中对应导出

7.4 引用的工具函数(无需改动)

函数 文件 用途 联调影响
sortByTimestamp() utils/sort.ts timestamp 降序排列 纯函数,无需改动
formatRelativeTime() utils/time.ts 时间戳 → 相对时间文案 纯函数,无需改动

7.5 引用的组件

组件 路径 数据依赖
ai-float-button /components/ai-float-button/ 无 props 传入,组件内部自治
dev-fab /components/dev-fab/ 开发调试用浮动按钮,上线前移除
t-loading TDesign 无数据依赖
t-icon TDesign name/size/color 硬编码
t-empty TDesign description 硬编码