补充 docs/dashboard/ 目录,包含: - dashboard-frontend-dev-spec.md - dashboard-frontend-technical-architecture.md - boss-dashboard-development-guide.md - crmeb-front-mysql-remote-connections.md Co-authored-by: Cursor <cursoragent@cursor.com>
1213 lines
22 KiB
Markdown
1213 lines
22 KiB
Markdown
# Dashboard 前端项目 Dev Spec
|
||
|
||
基于以下文档整理:
|
||
|
||
- `docs/dashboard/dashboard-frontend-technical-architecture.md`
|
||
- `docs/dashboard/boss-dashboard-development-guide.md`
|
||
|
||
本文档是独立 Dashboard 前端项目的详细开发说明,不依赖当前商城后台前端技术架构。开发团队应按本文档从 0 初始化一个新的前端项目,先完成可演示、可确认的 Mock 版老板驾驶舱,再接入后端真实接口。
|
||
|
||
## 1. 项目目标
|
||
|
||
建设一个独立的经营分析 Dashboard 前端项目,用于承载:
|
||
|
||
- 老板驾驶舱首页
|
||
- 昨日经营复盘
|
||
- 今日 10:15 / 14:55 节点快报
|
||
- 经营趋势分析
|
||
- 用户、团队、商品排行
|
||
- 风险预警中心
|
||
- KPI 下钻与明细查看
|
||
|
||
第一阶段目标不是做完整 BI 平台,而是快速交付一套老板能看、能确认、能下钻的经营驾驶舱前端。
|
||
|
||
## 2. 技术栈定稿
|
||
|
||
本项目采用以下技术栈:
|
||
|
||
- 框架:`React 19`
|
||
- 语言:`TypeScript`
|
||
- 构建:`Vite`
|
||
- 包管理:`pnpm`
|
||
- 路由:`React Router`
|
||
- UI:`Vant React` 或等价移动端组件库
|
||
- 服务端状态:`TanStack Query`
|
||
- 客户端状态:`Zustand`
|
||
- 请求库:`Axios`
|
||
- 图表:`Apache ECharts`
|
||
- Mock:`MSW`
|
||
- 单元测试:`Vitest`
|
||
- 组件测试:`React Testing Library`
|
||
- E2E:`Playwright`
|
||
- 样式:`CSS Modules` + `CSS Variables`
|
||
- 代码规范:`ESLint` + `Prettier`
|
||
|
||
说明:
|
||
|
||
- 第一版按 H5 移动端优先开发,默认目标设备是老板手机浏览器、企业微信内置浏览器和移动端 WebView。
|
||
- 第一版不使用微前端。
|
||
- 第一版不做低代码 BI 编辑器。
|
||
- 第一版不做多租户 SaaS 架构。
|
||
- 第一版不直接复用当前商城后台前端工程。
|
||
- 第一版不采用 PC 后台表格密集型布局。
|
||
|
||
## 3. 项目初始化规范
|
||
|
||
### 3.1 项目名称
|
||
|
||
建议项目目录:
|
||
|
||
```text
|
||
dashboard-frontend/
|
||
```
|
||
|
||
建议应用名:
|
||
|
||
```text
|
||
mall-ops-dashboard
|
||
```
|
||
|
||
### 3.2 Node 版本
|
||
|
||
建议:
|
||
|
||
```text
|
||
Node.js >= 20
|
||
pnpm >= 9
|
||
```
|
||
|
||
### 3.3 环境变量
|
||
|
||
必须提供:
|
||
|
||
```text
|
||
VITE_APP_ENV=development
|
||
VITE_API_BASE_URL=http://localhost:30032/api/admin
|
||
VITE_MOCK_ENABLED=true
|
||
VITE_APP_TITLE=经营驾驶舱
|
||
VITE_BUILD_VERSION=local
|
||
```
|
||
|
||
环境文件:
|
||
|
||
```text
|
||
.env.local
|
||
.env.development
|
||
.env.staging
|
||
.env.production
|
||
```
|
||
|
||
### 3.4 必备脚本
|
||
|
||
`package.json` 至少提供:
|
||
|
||
```json
|
||
{
|
||
"scripts": {
|
||
"dev": "vite",
|
||
"build": "tsc -b && vite build",
|
||
"preview": "vite preview",
|
||
"typecheck": "tsc -b --noEmit",
|
||
"lint": "eslint .",
|
||
"format": "prettier --write .",
|
||
"test": "vitest",
|
||
"test:ui": "vitest --ui",
|
||
"test:e2e": "playwright test"
|
||
}
|
||
}
|
||
```
|
||
|
||
## 4. 目录结构规范
|
||
|
||
最终目录建议:
|
||
|
||
```text
|
||
dashboard-frontend/
|
||
public/
|
||
src/
|
||
app/
|
||
App.tsx
|
||
main.tsx
|
||
providers/
|
||
AppProviders.tsx
|
||
QueryProvider.tsx
|
||
ThemeProvider.tsx
|
||
router/
|
||
routes.tsx
|
||
routeGuards.tsx
|
||
layouts/
|
||
BasicLayout.tsx
|
||
MobileLayout.tsx
|
||
assets/
|
||
images/
|
||
icons/
|
||
components/
|
||
common/
|
||
charts/
|
||
kpi/
|
||
table/
|
||
feedback/
|
||
layout/
|
||
features/
|
||
boss-dashboard/
|
||
daily-report/
|
||
today-snapshot/
|
||
risk-center/
|
||
data-drill/
|
||
services/
|
||
api/
|
||
http/
|
||
mock/
|
||
adapters/
|
||
stores/
|
||
appStore.ts
|
||
dashboardStore.ts
|
||
permissionStore.ts
|
||
hooks/
|
||
utils/
|
||
types/
|
||
styles/
|
||
tests/
|
||
.env.development
|
||
.env.production
|
||
package.json
|
||
vite.config.ts
|
||
tsconfig.json
|
||
```
|
||
|
||
## 5. 分层职责
|
||
|
||
### 5.1 `app`
|
||
|
||
负责应用级能力:
|
||
|
||
- 应用入口
|
||
- 全局 Provider
|
||
- 路由注册
|
||
- 布局
|
||
- 权限守卫
|
||
- 主题注入
|
||
- 全局错误边界
|
||
|
||
不得放具体业务逻辑。
|
||
|
||
### 5.2 `features`
|
||
|
||
负责业务模块。
|
||
|
||
每个模块内部必须自包含:
|
||
|
||
```text
|
||
features/<feature-name>/
|
||
pages/
|
||
components/
|
||
hooks/
|
||
api.ts
|
||
types.ts
|
||
constants.ts
|
||
mock.ts
|
||
```
|
||
|
||
模块之间不能互相直接引用内部组件。如确有复用,应提升到 `components` 或 `services`。
|
||
|
||
### 5.3 `components`
|
||
|
||
负责跨业务模块复用组件。
|
||
|
||
建议分类:
|
||
|
||
- `common`:空态、加载态、错误态、页面标题
|
||
- `charts`:通用图表封装
|
||
- `kpi`:指标卡、指标组、环比同比
|
||
- `table`:统一表格封装
|
||
- `feedback`:风险标签、状态标签、异常提示
|
||
- `layout`:页面区域、卡片网格、筛选栏
|
||
|
||
### 5.4 `services`
|
||
|
||
负责外部数据访问和数据适配。
|
||
|
||
必须包含:
|
||
|
||
- HTTP 客户端
|
||
- API 方法
|
||
- 请求拦截器
|
||
- 响应解包
|
||
- 错误处理
|
||
- Mock handlers
|
||
- DTO 到 ViewModel 的 adapter
|
||
|
||
### 5.5 `stores`
|
||
|
||
只存客户端状态,不存接口返回的大业务数据。
|
||
|
||
可以存:
|
||
|
||
- 当前主题
|
||
- 菜单折叠状态
|
||
- 当前公司
|
||
- 当前 Dashboard 筛选条件
|
||
- 当前今日快报版本
|
||
- 用户偏好
|
||
|
||
不应该存:
|
||
|
||
- KPI 接口结果
|
||
- 趋势图接口结果
|
||
- 风险列表接口结果
|
||
- 排行榜接口结果
|
||
|
||
这些应由 `TanStack Query` 管理。
|
||
|
||
## 6. 路由设计
|
||
|
||
### 6.1 一级路由
|
||
|
||
建议路由:
|
||
|
||
```text
|
||
/h5/dashboard
|
||
/h5/dashboard/boss
|
||
/h5/dashboard/daily-report
|
||
/h5/dashboard/today-snapshot
|
||
/h5/dashboard/risk-center
|
||
/h5/dashboard/drill/user
|
||
/h5/dashboard/drill/order
|
||
/h5/dashboard/drill/product
|
||
/h5/dashboard/drill/team
|
||
/login
|
||
/403
|
||
/404
|
||
```
|
||
|
||
### 6.2 H5 导航结构
|
||
|
||
第一版不使用 PC 侧边菜单,使用移动端底部 Tab + 页面内快捷入口。
|
||
|
||
底部 Tab:
|
||
|
||
```text
|
||
首页
|
||
日报
|
||
快报
|
||
风险
|
||
我的
|
||
```
|
||
|
||
首页内快捷入口:
|
||
|
||
```text
|
||
用户排行
|
||
团队排行
|
||
商品排行
|
||
资金池
|
||
下钻明细
|
||
导出/分享
|
||
```
|
||
|
||
### 6.3 路由参数规范
|
||
|
||
Dashboard 页面筛选条件尽量进入 URL。
|
||
|
||
示例:
|
||
|
||
```text
|
||
/h5/dashboard/boss?date=2026-05-10&range=yesterday&slot=1015
|
||
/h5/dashboard/risk-center?level=red&type=fund
|
||
/h5/dashboard/drill/user?uid=93231&from=risk-center
|
||
```
|
||
|
||
## 7. 页面开发规范
|
||
|
||
### 7.1 老板驾驶舱页面
|
||
|
||
路径:
|
||
|
||
```text
|
||
features/boss-dashboard/pages/BossDashboardPage.tsx
|
||
```
|
||
|
||
页面结构:
|
||
|
||
```text
|
||
BossDashboardPage
|
||
MobileStickyHeader
|
||
MobileDateFilterSheet
|
||
YesterdayOverviewSection
|
||
TodaySnapshotSection
|
||
TrendSection
|
||
RankSection
|
||
RiskAlertSection
|
||
BottomTabBar
|
||
```
|
||
|
||
### 7.2 首屏内容
|
||
|
||
首屏必须优先展示:
|
||
|
||
- 页面标题:经营驾驶舱
|
||
- 当前数据口径:默认昨日
|
||
- 今日快报入口:10:15 / 14:55
|
||
- 昨日核心 KPI
|
||
- 今日快报状态
|
||
|
||
老板打开手机页面后,首屏不滚动也应看到昨日经营是否正常,以及今日 10:15 / 14:55 快报当前状态。
|
||
|
||
### 7.3 KPI 区域
|
||
|
||
第一版必须包含:
|
||
|
||
- 昨日成交金额
|
||
- 昨日订单数
|
||
- 昨日采购用户数
|
||
- 昨日新增用户数
|
||
- 昨日新增寄售商品数
|
||
- 昨日个人奖金发放
|
||
- 昨日推广奖金发放
|
||
- 昨日待支付 / 待结算金额
|
||
|
||
资金池 KPI:
|
||
|
||
- 余额总额
|
||
- 优惠券总额
|
||
- 个人奖金总额
|
||
- 推广奖金总额
|
||
- 积分总额
|
||
- 待审核提现金额
|
||
|
||
H5 展示规则:
|
||
|
||
- 首屏只展示最核心 4 个 KPI:成交金额、订单数、采购用户数、新增用户。
|
||
- 其余 KPI 收在“查看更多经营指标”折叠区。
|
||
- 资金池 KPI 单独成组,默认折叠,避免手机首屏过长。
|
||
- KPI 卡片采用双列小卡;金额类重点指标可跨两列展示。
|
||
|
||
### 7.4 今日快报区域
|
||
|
||
今日快报必须和昨日复盘视觉上区分。
|
||
|
||
必须展示:
|
||
|
||
- 快报版本:10:15 / 14:55
|
||
- 快报状态:待生成 / 已生成 / 生成失败 / 临时数据
|
||
- 生成时间
|
||
- 累计采购用户数
|
||
- 累计订单数
|
||
- 累计成交金额
|
||
- 累计支付金额
|
||
- 新增寄售商品数
|
||
- 个人奖金变化
|
||
- 推广奖金变化
|
||
- 团队 Top 10 简表
|
||
|
||
未到生成时间时:
|
||
|
||
```text
|
||
10:15 快报待生成,预计 10:15 后可查看。
|
||
```
|
||
|
||
生成失败时:
|
||
|
||
```text
|
||
今日 10:15 快报生成失败,请查看最近一次成功快照或联系技术处理。
|
||
```
|
||
|
||
### 7.5 趋势区域
|
||
|
||
第一版至少两个图:
|
||
|
||
- 交易趋势:成交金额 + 订单数
|
||
- 用户与奖金趋势:新增用户 + 奖金发放
|
||
|
||
第二版扩展:
|
||
|
||
- 采购用户趋势
|
||
- 寄售商品趋势
|
||
- 提现趋势
|
||
- 风险数量趋势
|
||
|
||
### 7.6 排行区域
|
||
|
||
第一版三个榜单:
|
||
|
||
- 高价值用户 Top 20
|
||
- 团队贡献 Top 10
|
||
- 高货值未成交商品 Top 20
|
||
|
||
榜单必须支持点击下钻。
|
||
|
||
H5 展示规则:
|
||
|
||
- 排行榜默认每个榜单展示前 5 条。
|
||
- 点击“查看全部”进入独立列表页。
|
||
- 列表行高度不低于 48px,保证触控区域足够。
|
||
|
||
### 7.7 风险预警区域
|
||
|
||
第一版风险类型:
|
||
|
||
- 资金异常
|
||
- 订单异常
|
||
- 商品异常
|
||
- 用户异常
|
||
- 数据质量异常
|
||
|
||
风险等级:
|
||
|
||
- 红色:当天必须处理
|
||
- 黄色:需要关注
|
||
- 灰色:数据质量或低优先级问题
|
||
|
||
风险列表字段:
|
||
|
||
- 风险等级
|
||
- 风险类型
|
||
- 风险标题
|
||
- 风险描述
|
||
- 关联对象
|
||
- 发现时间
|
||
- 操作按钮
|
||
|
||
## 8. 组件开发规范
|
||
|
||
### 8.1 KPI 组件
|
||
|
||
组件路径:
|
||
|
||
```text
|
||
components/kpi/KpiCard.tsx
|
||
components/kpi/KpiGrid.tsx
|
||
```
|
||
|
||
`KpiCard` 入参:
|
||
|
||
```ts
|
||
type KpiCardProps = {
|
||
title: string;
|
||
value: string | number;
|
||
unit?: string;
|
||
trendValue?: number;
|
||
trendLabel?: string;
|
||
status?: 'normal' | 'success' | 'warning' | 'danger';
|
||
loading?: boolean;
|
||
onClick?: () => void;
|
||
};
|
||
```
|
||
|
||
显示规则:
|
||
|
||
- `loading=true` 显示骨架屏。
|
||
- `value=null` 或 `undefined` 显示 `--`。
|
||
- `status=danger` 使用风险色。
|
||
- 有 `onClick` 时鼠标悬浮显示可点击状态。
|
||
|
||
### 8.2 今日快报组件
|
||
|
||
组件路径:
|
||
|
||
```text
|
||
features/boss-dashboard/components/TodaySnapshotSection.tsx
|
||
features/today-snapshot/components/SnapshotStatusTag.tsx
|
||
```
|
||
|
||
状态枚举:
|
||
|
||
```ts
|
||
type SnapshotStatus = 'pending' | 'success' | 'failed' | 'temporary';
|
||
type SnapshotSlot = '1015' | '1455';
|
||
```
|
||
|
||
展示要求:
|
||
|
||
- `pending`:显示预计生成时间。
|
||
- `success`:显示生成时间和指标。
|
||
- `failed`:显示错误摘要和最近一次成功快照入口。
|
||
- `temporary`:显示“临时数据,不作为日报结论”。
|
||
|
||
### 8.3 图表组件
|
||
|
||
组件路径:
|
||
|
||
```text
|
||
components/charts/BaseChart.tsx
|
||
components/charts/LineTrendChart.tsx
|
||
components/charts/DualAxisChart.tsx
|
||
components/charts/RankBarChart.tsx
|
||
```
|
||
|
||
所有图表必须支持:
|
||
|
||
- loading
|
||
- empty
|
||
- error
|
||
- resize
|
||
- theme
|
||
- fullscreen
|
||
|
||
业务页面不得直接写复杂 ECharts option,应通过图表组件和 adapter 生成。
|
||
|
||
### 8.4 风险标签组件
|
||
|
||
组件路径:
|
||
|
||
```text
|
||
components/feedback/RiskLevelTag.tsx
|
||
components/feedback/RiskTypeTag.tsx
|
||
```
|
||
|
||
颜色规范:
|
||
|
||
- red:资金高危、当天必须处理
|
||
- orange:业务波动,需要关注
|
||
- gray:数据质量问题
|
||
|
||
## 9. 类型定义规范
|
||
|
||
### 9.1 全局基础类型
|
||
|
||
路径:
|
||
|
||
```text
|
||
types/common.ts
|
||
```
|
||
|
||
建议定义:
|
||
|
||
```ts
|
||
type DateString = string;
|
||
type DateTimeString = string;
|
||
type MoneyString = string;
|
||
type PercentString = string;
|
||
|
||
type ApiResponse<T> = {
|
||
code: number;
|
||
message: string;
|
||
data: T;
|
||
};
|
||
```
|
||
|
||
### 9.2 Dashboard 类型
|
||
|
||
路径:
|
||
|
||
```text
|
||
features/boss-dashboard/types.ts
|
||
```
|
||
|
||
核心类型:
|
||
|
||
```ts
|
||
type DashboardOverview = {
|
||
date: DateString;
|
||
generatedAt: DateTimeString;
|
||
kpis: KpiMetric[];
|
||
fundPool: KpiMetric[];
|
||
todaySnapshots: TodaySnapshotSummary[];
|
||
trends: TrendPanelData[];
|
||
ranks: RankPanelData[];
|
||
risks: RiskAlert[];
|
||
};
|
||
|
||
type KpiMetric = {
|
||
key: string;
|
||
title: string;
|
||
value: number | string | null;
|
||
unit?: string;
|
||
trendValue?: number;
|
||
trendLabel?: string;
|
||
status: 'normal' | 'success' | 'warning' | 'danger';
|
||
drill?: DrillLink;
|
||
};
|
||
|
||
type DrillLink = {
|
||
path: string;
|
||
query?: Record<string, string | number>;
|
||
};
|
||
```
|
||
|
||
## 10. API 开发规范
|
||
|
||
### 10.1 API 文件
|
||
|
||
建议:
|
||
|
||
```text
|
||
services/http/client.ts
|
||
services/http/error.ts
|
||
services/api/dashboard.ts
|
||
features/boss-dashboard/api.ts
|
||
features/risk-center/api.ts
|
||
```
|
||
|
||
### 10.2 接口列表
|
||
|
||
第一版前端按以下接口契约开发:
|
||
|
||
```text
|
||
GET /dashboard/overview?date=YYYY-MM-DD
|
||
GET /dashboard/today-snapshot?date=YYYY-MM-DD&slot=1015|1455
|
||
GET /dashboard/trends?range=7|30
|
||
GET /dashboard/ranks?date=YYYY-MM-DD&type=user|team|product
|
||
GET /dashboard/risks?date=YYYY-MM-DD&level=red|yellow|gray
|
||
GET /dashboard/drill-options
|
||
```
|
||
|
||
### 10.3 请求封装要求
|
||
|
||
HTTP Client 必须处理:
|
||
|
||
- baseURL
|
||
- token
|
||
- timeout
|
||
- requestId
|
||
- 401 跳登录
|
||
- 403 跳无权限页
|
||
- 500 统一提示
|
||
- 网络异常提示
|
||
- 响应解包
|
||
|
||
### 10.4 Adapter 要求
|
||
|
||
后端 DTO 不直接进入组件。
|
||
|
||
必须经过:
|
||
|
||
```text
|
||
API Response -> DTO -> Adapter -> ViewModel -> Component
|
||
```
|
||
|
||
Adapter 必须处理:
|
||
|
||
- 空值兜底
|
||
- 金额格式化前的数值规范化
|
||
- 日期字符串规范化
|
||
- 枚举转换
|
||
- 风险等级映射
|
||
- drill link 生成
|
||
|
||
## 11. Mock 开发规范
|
||
|
||
### 11.1 Mock 工具
|
||
|
||
使用 `MSW`。
|
||
|
||
目录:
|
||
|
||
```text
|
||
services/mock/
|
||
browser.ts
|
||
handlers.ts
|
||
data/
|
||
dashboard.ts
|
||
risks.ts
|
||
ranks.ts
|
||
```
|
||
|
||
### 11.2 Mock 启用规则
|
||
|
||
环境变量:
|
||
|
||
```text
|
||
VITE_MOCK_ENABLED=true
|
||
```
|
||
|
||
当开启 Mock:
|
||
|
||
- 浏览器请求由 MSW 拦截。
|
||
- API 方法不需要改。
|
||
- 页面表现应与真实 API 一致。
|
||
|
||
### 11.3 必备 Mock 场景
|
||
|
||
必须提供:
|
||
|
||
- 昨日经营正常
|
||
- 昨日经营明显下滑
|
||
- 今日 10:15 已生成
|
||
- 今日 14:55 待生成
|
||
- 今日快报生成失败
|
||
- 今日临时数据
|
||
- 风险列表为空
|
||
- 风险列表包含红黄灰
|
||
- 趋势图空数据
|
||
- 某个接口 500
|
||
- 某个接口超时
|
||
|
||
## 12. 状态管理规范
|
||
|
||
### 12.1 Query Key
|
||
|
||
统一管理 Query Key:
|
||
|
||
```text
|
||
services/api/queryKeys.ts
|
||
```
|
||
|
||
命名示例:
|
||
|
||
```ts
|
||
dashboardKeys.overview(date)
|
||
dashboardKeys.todaySnapshot(date, slot)
|
||
dashboardKeys.trends(range)
|
||
dashboardKeys.ranks(date, type)
|
||
dashboardKeys.risks(filters)
|
||
```
|
||
|
||
### 12.2 自动刷新
|
||
|
||
刷新策略:
|
||
|
||
- 昨日 overview:不自动刷新。
|
||
- 今日 10:15 / 14:55 快报:到达节点后刷新一次。
|
||
- 临时实时查看:可 60 秒刷新一次。
|
||
- 风险预警:可 1 到 5 分钟刷新一次。
|
||
- 页面不可见时暂停刷新。
|
||
|
||
### 12.3 Zustand Store
|
||
|
||
建议:
|
||
|
||
```text
|
||
stores/dashboardStore.ts
|
||
```
|
||
|
||
状态:
|
||
|
||
- selectedDate
|
||
- selectedRange
|
||
- selectedSnapshotSlot
|
||
- isFullscreen
|
||
- riskFilterDraft
|
||
|
||
注意:
|
||
|
||
- Store 只放 UI 状态。
|
||
- 接口数据不进 Store。
|
||
|
||
## 13. 样式与视觉规范
|
||
|
||
### 13.1 主题
|
||
|
||
支持:
|
||
|
||
- 默认浅色主题
|
||
- 深色移动端主题
|
||
|
||
第一版可先实现浅色主题,但 CSS Variables 需要预留深色主题变量。
|
||
|
||
### 13.2 布局
|
||
|
||
建议:
|
||
|
||
- 页面按移动端 H5 优先设计,核心适配宽度为 360px、375px、390px、414px。
|
||
- 在 PC 浏览器打开时,内容区最大宽度建议限制为 430px 并居中,模拟手机页面。
|
||
- 页面采用单列信息流布局。
|
||
- KPI 使用 2 列卡片网格,重点金额卡片可跨 2 列。
|
||
- 图表区域单列展示,每个图表高度建议 220px 到 280px。
|
||
- 底部固定 TabBar,高度纳入安全区计算。
|
||
- 顶部筛选可用吸顶 Header + 弹出式筛选面板,不使用 PC 横向筛选表单。
|
||
|
||
### 13.2.1 H5 适配要求
|
||
|
||
- 使用 `viewport-fit=cover`,适配 iPhone 安全区。
|
||
- 底部操作区必须增加 `safe-area-inset-bottom`。
|
||
- 点击热区不小于 44px。
|
||
- 页面横向不得出现滚动条。
|
||
- 长数字允许缩小字号或换行,但不得溢出卡片。
|
||
- 图表 tooltip 必须适合触摸,不依赖鼠标 hover。
|
||
- 重要筛选项使用弹层、分段控件或底部 ActionSheet。
|
||
|
||
### 13.3 数字格式
|
||
|
||
金额:
|
||
|
||
```text
|
||
¥1,234,567.89
|
||
```
|
||
|
||
积分:
|
||
|
||
```text
|
||
1,234,567.000
|
||
```
|
||
|
||
比例:
|
||
|
||
```text
|
||
12.34%
|
||
```
|
||
|
||
缺失值:
|
||
|
||
```text
|
||
--
|
||
```
|
||
|
||
### 13.4 状态颜色
|
||
|
||
建议:
|
||
|
||
- 正常:参考图中的活力橙/珊瑚橙主色或默认色
|
||
- 增长:绿色
|
||
- 下降:活力橙或警示橙
|
||
- 高危:红色
|
||
- 待生成:灰色
|
||
- 失败:红色
|
||
|
||
## 14. 权限规范
|
||
|
||
### 14.1 角色
|
||
|
||
第一版建议角色:
|
||
|
||
- `boss`:老板,查看全部经营数据。
|
||
- `manager`:经营管理人员,可查看大部分数据。
|
||
- `operator`:运营人员,可查看非敏感数据。
|
||
- `readonly`:只读角色。
|
||
|
||
### 14.2 权限点
|
||
|
||
建议:
|
||
|
||
```text
|
||
dashboard:view
|
||
dashboard:fund:view
|
||
dashboard:risk:view
|
||
dashboard:export
|
||
dashboard:drill
|
||
```
|
||
|
||
### 14.3 前端权限处理
|
||
|
||
- 无页面权限:跳转 403。
|
||
- 无模块权限:模块显示无权限状态。
|
||
- 无字段权限:金额或手机号脱敏。
|
||
- 无导出权限:隐藏导出按钮。
|
||
|
||
## 15. 下钻规范
|
||
|
||
### 15.1 下钻入口
|
||
|
||
必须支持:
|
||
|
||
- KPI 卡片点击下钻
|
||
- 图表点位点击下钻
|
||
- 排行榜行点击下钻
|
||
- 风险项点击下钻
|
||
|
||
### 15.2 下钻上下文
|
||
|
||
跳转时携带:
|
||
|
||
- 来源页面
|
||
- 日期范围
|
||
- 指标 key
|
||
- 关联对象 ID
|
||
- 风险 ID
|
||
|
||
示例:
|
||
|
||
```text
|
||
/dashboard/drill/user?uid=93231&from=boss-dashboard&metric=highValueUser
|
||
```
|
||
|
||
### 15.3 返回逻辑
|
||
|
||
从下钻页返回驾驶舱时:
|
||
|
||
- 保留日期范围
|
||
- 保留快报版本
|
||
- 保留滚动位置可选
|
||
|
||
## 16. 错误与空态规范
|
||
|
||
### 16.1 页面级错误
|
||
|
||
整个页面关键接口失败时显示页面级错误。
|
||
|
||
需要包含:
|
||
|
||
- 错误标题
|
||
- 错误描述
|
||
- 重试按钮
|
||
- 返回首页按钮
|
||
|
||
### 16.2 区块级错误
|
||
|
||
某个模块失败时,只影响该模块。
|
||
|
||
例如:
|
||
|
||
- 趋势图失败,不影响 KPI。
|
||
- 风险列表失败,不影响今日快报。
|
||
|
||
### 16.3 空态
|
||
|
||
空态文案示例:
|
||
|
||
```text
|
||
暂无风险预警
|
||
暂无今日快报数据
|
||
暂无符合条件的排行数据
|
||
```
|
||
|
||
## 17. 性能规范
|
||
|
||
### 17.1 首屏
|
||
|
||
要求:
|
||
|
||
- 首屏优先加载 KPI 和今日快报。
|
||
- 排行榜和风险列表可延迟加载。
|
||
- 图表组件懒加载。
|
||
|
||
### 17.2 数据请求
|
||
|
||
要求:
|
||
|
||
- 并行请求互不依赖模块。
|
||
- 同一 Query Key 请求去重。
|
||
- 重试次数不超过 2 次。
|
||
- 今日实时临时查看才允许定时刷新。
|
||
|
||
### 17.3 图表性能
|
||
|
||
要求:
|
||
|
||
- 图表组件卸载时销毁实例。
|
||
- 窗口变化时节流 resize。
|
||
- 大数据量趋势图做采样或限制时间范围。
|
||
|
||
## 18. 测试规范
|
||
|
||
### 18.1 单元测试
|
||
|
||
必须覆盖:
|
||
|
||
- 金额格式化
|
||
- 日期范围计算
|
||
- 风险等级映射
|
||
- DTO 到 ViewModel adapter
|
||
- Query Key 生成
|
||
|
||
### 18.2 组件测试
|
||
|
||
必须覆盖:
|
||
|
||
- KPI 卡 loading、empty、normal、danger 状态。
|
||
- 今日快报 pending、success、failed、temporary 状态。
|
||
- 风险列表空态和多级风险展示。
|
||
- 图表 empty 和 error 状态。
|
||
|
||
### 18.3 E2E 测试
|
||
|
||
必须覆盖:
|
||
|
||
- 使用移动端 viewport 打开老板驾驶舱,默认展示昨日。
|
||
- 切换 10:15 快报。
|
||
- 切换 14:55 快报。
|
||
- 点击 KPI 下钻。
|
||
- 点击风险项进入下钻页。
|
||
- 接口失败时页面不白屏。
|
||
- 底部 Tab 能正常切换。
|
||
- 筛选弹层能正常打开、选择和关闭。
|
||
|
||
## 19. 开发阶段拆分
|
||
|
||
### Phase 1:项目脚手架
|
||
|
||
交付:
|
||
|
||
- Vite + React + TypeScript 项目
|
||
- 路由
|
||
- H5 Layout
|
||
- 移动端 UI 组件库
|
||
- Query Provider
|
||
- Zustand Store
|
||
- MSW Mock
|
||
- ESLint / Prettier / Vitest
|
||
|
||
验收:
|
||
|
||
- 本地可启动。
|
||
- 页面可访问。
|
||
- Mock 请求可返回数据。
|
||
|
||
### Phase 2:老板驾驶舱 Mock 页面
|
||
|
||
交付:
|
||
|
||
- 老板驾驶舱页面
|
||
- KPI 卡片
|
||
- 今日快报
|
||
- 趋势图
|
||
- 排行榜
|
||
- 风险预警
|
||
- 下钻按钮
|
||
- 底部 TabBar
|
||
- 移动端筛选弹层
|
||
|
||
验收:
|
||
|
||
- 不依赖后端即可完整展示页面。
|
||
- 四种快报状态可切换验证。
|
||
- 风险红黄灰状态可展示。
|
||
- 375px 手机宽度下无横向滚动。
|
||
|
||
### Phase 3:接口契约与 API 层
|
||
|
||
交付:
|
||
|
||
- API 方法
|
||
- Query Hooks
|
||
- Adapter
|
||
- TypeScript 类型
|
||
- Mock 与真实 API 可切换
|
||
|
||
验收:
|
||
|
||
- 页面组件不直接依赖后端 DTO。
|
||
- 替换真实 API 时页面改动最小。
|
||
|
||
### Phase 4:真实联调
|
||
|
||
交付:
|
||
|
||
- 接入真实后端接口。
|
||
- 对账关键指标。
|
||
- 完成下钻链路。
|
||
- 完成权限控制。
|
||
|
||
验收:
|
||
|
||
- 昨日经营数据与后端口径一致。
|
||
- 今日快报数据与节点口径一致。
|
||
- 核心 KPI 可下钻。
|
||
|
||
### Phase 5:上线增强
|
||
|
||
交付:
|
||
|
||
- 错误监控
|
||
- 性能优化
|
||
- 导出能力
|
||
- 深色主题
|
||
- E2E 测试
|
||
|
||
验收:
|
||
|
||
- 生产可部署。
|
||
- 关键路径测试通过。
|
||
- 异常场景不白屏。
|
||
|
||
## 20. 前端验收清单
|
||
|
||
### 页面验收
|
||
|
||
- 老板驾驶舱默认展示昨日经营复盘。
|
||
- 今日 10:15 / 14:55 快报入口清晰。
|
||
- 未到时间显示待生成。
|
||
- 生成失败显示失败状态。
|
||
- 临时数据有明确提示。
|
||
- KPI、趋势、排行、风险布局清晰。
|
||
- 手机首屏能看见核心经营结果。
|
||
- 底部 TabBar 和筛选弹层交互顺畅。
|
||
|
||
### 数据验收
|
||
|
||
- Mock 数据覆盖全部状态。
|
||
- 金额格式统一。
|
||
- 日期格式统一。
|
||
- 空值显示 `--`。
|
||
- 接口失败有降级展示。
|
||
|
||
### 交互验收
|
||
|
||
- 日期范围可切换。
|
||
- 快报版本可切换。
|
||
- KPI 可点击。
|
||
- 风险项可点击。
|
||
- 下钻后可返回。
|
||
|
||
### 工程验收
|
||
|
||
- TypeScript 无类型错误。
|
||
- Lint 通过。
|
||
- 单元测试通过。
|
||
- 组件测试覆盖关键状态。
|
||
- 生产构建成功。
|
||
|
||
## 21. 与后端协作边界
|
||
|
||
前端负责:
|
||
|
||
- 页面展示
|
||
- 交互状态
|
||
- Mock 数据
|
||
- 接口调用
|
||
- 数据适配
|
||
- 图表渲染
|
||
- 下钻跳转
|
||
|
||
后端负责:
|
||
|
||
- 指标口径
|
||
- SQL 聚合
|
||
- 快照生成
|
||
- 风险规则
|
||
- 权限数据
|
||
- 导出数据
|
||
|
||
前端不得在页面中自行计算复杂资金口径,例如个人奖金、推广奖金、积分健康检查等核心经营指标。前端只做展示和简单格式化。
|
||
|
||
## 22. 第一版不做
|
||
|
||
- 不做拖拽搭建大屏。
|
||
- 不做用户自定义图表。
|
||
- 不做复杂多租户。
|
||
- 不做 PC 版完整后台。
|
||
- 不做所有历史明细管理功能。
|
||
- 不在前端硬编码真实敏感数据。
|
||
- 不把后端财务口径搬到前端计算。
|
||
|
||
## 23. 交付物
|
||
|
||
第一版前端应交付:
|
||
|
||
- 独立 Dashboard 前端项目
|
||
- 老板驾驶舱 Mock 页面
|
||
- Mock 数据集
|
||
- API 契约类型
|
||
- 通用 KPI 组件
|
||
- 通用图表组件
|
||
- 今日快报组件
|
||
- 风险预警组件
|
||
- 下钻页面基础框架
|
||
- 基础测试
|
||
- 构建部署说明
|
||
|
||
## 24. 推荐开发顺序
|
||
|
||
1. 初始化项目和工程规范。
|
||
2. 搭建 Layout、路由、主题和 Provider。
|
||
3. 接入 MSW,准备 Dashboard Mock 数据。
|
||
4. 开发移动端底部 Tab、吸顶 Header、筛选弹层。
|
||
5. 开发 KPI、快报、图表、排行、风险基础组件。
|
||
6. 组装老板驾驶舱 H5 页面。
|
||
7. 做空态、错误态、loading 态。
|
||
8. 做下钻路由和跳转参数。
|
||
9. 给老板用手机确认页面展示。
|
||
10. 冻结接口字段。
|
||
11. 接真实 API 并联调。
|
||
|
||
## 25. 最终要求
|
||
|
||
第一版成功标准:
|
||
|
||
- 老板能在一个页面看懂昨日经营是否正常。
|
||
- 老板能在 10:15 和 14:55 后看到今日节点快报。
|
||
- 老板能在手机 H5 页面顺畅查看核心指标、排行和风险。
|
||
- 页面在无后端情况下也能通过 Mock 完整演示。
|
||
- 后端接口上线后,前端只替换数据源,不大改页面。
|
||
- 核心 KPI、排行和风险项都具备下钻能力。
|