在企业级中后台系统中,数据面板是最常见的业务场景。随着业务发展,会面临:
核心问题:如何让非技术人员也能配置数据面板,而不是依赖代码开发?
解决方案:配置驱动的开发模式 —— 前端定义 Schema 规范,后端/配置平台生成配置,前端根据配置动态渲染 UI。
┌─────────────────────────────────────────────────────────┐
│ Schema Configuration │
│ { filters, stats, table, ... } │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ Schema Registry │
│ 解析 Schema → 分发到对应组件 │
└─────────────────────────────────────────────────────────┘
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Filter │ │ Stats │ │ Table │
│ Renderer │ │ Renderer │ │ Renderer │
└──────────┘ └──────────┘ └──────────┘
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Input │ │ Card │ │ Column │
│ Select │ │ Chart │ │ Sort │
│ Date │ │ Number │ │ Filter │
└──────────┘ └──────────┘ └──────────┘
interface SchemaV1 {
version: 1;
filters: FilterItem[];
stats: StatItem[];
table: TableConfig;
}
// 未来可扩展
interface SchemaV2 extends SchemaV1 {
version: 2;
actions: ActionItem[]; // 行操作按钮
permissions?: string[]; // 权限控制
}
type FilterFieldType = 'input' | 'select' | 'dateRange' | 'cascader' | 'treeSelect';
type StatWidgetType = 'number' | 'chart' | 'progress' | 'trend';
type ColumnRenderType = 'text' | 'tag' | 'image' | 'link' | 'custom';
| 能力维度 | 考察点 |
|---|---|
| 抽象能力 | Schema 设计是否合理,是否便于扩展 |
| 组件化思维 | 是否做到高内聚低耦合 |
| TypeScript | 类型定义是否严谨,泛型运用 |
| 性能意识 | 大数据量处理、缓存策略 |
| 工程化 | 目录结构、命名规范、代码组织 |
| 架构设计 | 可扩展性、配置校验、版本管理 |
npm install
npm run dev
访问 http://localhost:3000/dashboard
├── app/
│ └── dashboard/page.tsx # 页面入口
├── components/dashboard/
│ ├── FilterForm.tsx # 筛选表单
│ ├── StatCards.tsx # 统计卡片
│ └── DataTable.tsx # 数据表格
└── lib/
├── schema.tsx # Schema 类型定义
└── request.ts # 请求封装