423 lines
24 KiB
Markdown
423 lines
24 KiB
Markdown
# 规则管理
|
||
|
||
## 功能概览
|
||
|
||
| 功能 | 说明 | 优先级 |
|
||
| -------- | -------------------- | ------ |
|
||
| 保存规则 | 将当前配置保存为模板 | P0 |
|
||
| 规则列表 | 查看所有已保存的规则 | P0 |
|
||
| 规则搜索 | 按关键词搜索规则 | P1 |
|
||
| 规则编辑 | 修改已保存的规则 | P0 |
|
||
| 规则删除 | 删除不需要的规则 | P0 |
|
||
| 规则加载 | 一键加载规则配置 | P0 |
|
||
| 规则复制 | 复制规则配置 | P1 |
|
||
| 规则导出 | 导出为 JSON 文件 | P1 |
|
||
| 规则导入 | 从 JSON 文件导入 | P1 |
|
||
|
||
## 规则数量限制
|
||
|
||
- **最大规则数量**: 20 条
|
||
- **超出限制**: 当规则数量达到 20 条时,保存按钮置灰,提示"已达到最大规则数量"
|
||
- **解决方式**: 用户需要删除已有规则后才能保存新规则
|
||
|
||
---
|
||
|
||
## 数据结构
|
||
|
||
> **与源码对齐**:类型定义见 `src/types/testDataGenerator.ts`。规则**不**持久化生成数量与导出格式(由页面 `GenerateOptions` 状态管理)。
|
||
|
||
### 规则模板
|
||
|
||
```typescript
|
||
interface DataRule {
|
||
id: string;
|
||
name: string;
|
||
description?: string;
|
||
fields: FieldConfig[];
|
||
createdAt: number;
|
||
updatedAt: number;
|
||
lastUsedAt?: number;
|
||
useCount: number;
|
||
}
|
||
```
|
||
|
||
### 字段配置
|
||
|
||
```typescript
|
||
interface FieldConfig {
|
||
id: string;
|
||
name: string;
|
||
description?: string;
|
||
generatorId: string; // 生成器 ID,对应 lib/generators 中的 id
|
||
params: Record<string, unknown>;
|
||
required: boolean;
|
||
nullRate: number; // 空值率 0-100,仅 required=false 时生效
|
||
unique: boolean;
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 功能详情
|
||
|
||
### 1. 保存规则
|
||
|
||
**触发方式**: 用户点击"保存规则"按钮
|
||
|
||
**界面设计**:
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────┐
|
||
│ 保存规则 │
|
||
├─────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ 规则信息 │
|
||
│ ┌───────────────────────────────────────────────────────────────┐ │
|
||
│ │ 规则名称: │ │
|
||
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
|
||
│ │ │ [电商用户数据 - 测试用 ]│ │ │
|
||
│ │ └─────────────────────────────────────────────────────────┘ │ │
|
||
│ │ │ │
|
||
│ │ 规则描述 (可选): │ │
|
||
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
|
||
│ │ │ [用于测试用户注册功能,包含姓名、邮箱、手机号 ]│ │ │
|
||
│ │ └─────────────────────────────────────────────────────────┘ │ │
|
||
│ │ │ │
|
||
│ └───────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ 规则预览 │
|
||
│ ┌───────────────────────────────────────────────────────────────┐ │
|
||
│ │ 字段数量: 4 个 │ │
|
||
│ │ • name (中文姓名) │ │
|
||
│ │ • email (邮箱地址) │ │
|
||
│ │ • phone (手机号) │ │
|
||
│ │ • age (年龄) │ │
|
||
│ │ │ │
|
||
│ │ 生成数量: 100 条 │ │
|
||
│ │ 数据格式: JSON │ │
|
||
│ └───────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ [保存] [取消] │
|
||
│ │
|
||
└─────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
**保存逻辑**:
|
||
|
||
1. 验证规则名称不为空
|
||
2. 检查规则数量是否达到上限(20 条)
|
||
3. 若达上限,`save()` 返回 `null`,UI 应阻止或提示
|
||
4. 生成唯一 ID,写入 `createdAt`/`updatedAt`,`useCount` 初始为 0
|
||
5. 调用 `ruleStorage.save()`;仅当返回值非 `null` 时视为成功(`localStorage` 写入失败同样返回 `null`)
|
||
|
||
---
|
||
|
||
### 2. 规则列表
|
||
|
||
**界面设计**:
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────┐
|
||
│ 规则管理 │
|
||
├─────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ 搜索: [搜索规则名称... ] │
|
||
│ │
|
||
│ 规则列表 (已保存 15/20 条) │
|
||
│ ┌───────────────────────────────────────────────────────────────┐ │
|
||
│ │ │ │
|
||
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
|
||
│ │ │ 电商用户数据 - 测试用 │ │ │
|
||
│ │ │ ─────────────────────────────────────────────────────── │ │ │
|
||
│ │ │ 用于测试用户注册功能,包含姓名、邮箱、手机号 │ │ │
|
||
│ │ │ 4 个字段 | 100 条 | JSON │ │ │
|
||
│ │ │ 2024-01-15 14:30 创建 | 2024-01-20 10:15 最后使用 │ │ │
|
||
│ │ │ │ │ │
|
||
│ │ │ [加载] [复制] [导出] [编辑] [删除] │ │ │
|
||
│ │ └─────────────────────────────────────────────────────────┘ │ │
|
||
│ │ │ │
|
||
│ └───────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ [导入规则] [导出全部] [清空全部] │
|
||
│ │
|
||
└─────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
**列表项信息**:
|
||
|
||
- 规则名称
|
||
- 规则描述
|
||
- 字段数量、生成数量、数据格式
|
||
- 创建时间、最后使用时间
|
||
- 操作按钮
|
||
|
||
---
|
||
|
||
### 3. 规则搜索
|
||
|
||
**搜索逻辑**:
|
||
|
||
- 支持按规则名称搜索
|
||
- 支持按规则描述搜索
|
||
- 搜索为模糊匹配,不区分大小写
|
||
|
||
**实现方式**(`src/utils/ruleStorage.ts`):
|
||
|
||
```typescript
|
||
import * as ruleStorage from '@/utils/ruleStorage';
|
||
|
||
function searchRules(query: string): DataRule[] {
|
||
return ruleStorage.search(query);
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 4. 规则编辑
|
||
|
||
**界面设计**:
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────┐
|
||
│ 编辑规则 - 电商用户数据 │
|
||
├─────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ 基本信息 │
|
||
│ ┌───────────────────────────────────────────────────────────────┐ │
|
||
│ │ 规则名称: [电商用户数据 - 测试用 ]│ │
|
||
│ │ 规则描述: [用于测试用户注册功能,包含姓名、邮箱、手机号 ]│ │
|
||
│ └───────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ 字段配置 (可直接编辑) │
|
||
│ ┌───────────────────────────────────────────────────────────────┐ │
|
||
│ │ │ │
|
||
│ │ 1. name [中文姓名 ▼] [配置] [删除] [上移][下移] │ │
|
||
│ │ 2. email [邮箱地址 ▼] [配置] [删除] [上移][下移] │ │
|
||
│ │ 3. phone [手机号 ▼] [配置] [删除] [上移][下移] │ │
|
||
│ │ 4. age [年龄 ▼] [配置] [删除] [上移][下移] │ │
|
||
│ │ │ │
|
||
│ │ [+ 添加字段] │ │
|
||
│ │ │ │
|
||
│ └───────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ 生成选项 │
|
||
│ ┌───────────────────────────────────────────────────────────────┐ │
|
||
│ │ 数量: [100] 格式: [JSON ▼] │ │
|
||
│ └───────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ [保存修改] [取消] │
|
||
│ │
|
||
└─────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
**编辑逻辑**:
|
||
|
||
1. 加载原规则配置到编辑器
|
||
2. 用户修改配置
|
||
3. 点击保存时调用 `ruleStorage.update()`;返回非 `null` 才更新 `updatedAt` 并提示成功
|
||
|
||
---
|
||
|
||
### 5. 规则删除
|
||
|
||
**删除流程**:
|
||
|
||
1. 点击删除按钮
|
||
2. 弹出确认对话框
|
||
3. 确认后删除规则
|
||
4. 刷新规则列表
|
||
|
||
**确认对话框**:
|
||
|
||
```
|
||
┌─────────────────────────────────────────┐
|
||
│ 确认删除 │
|
||
├─────────────────────────────────────────┤
|
||
│ │
|
||
│ 确定要删除规则 "电商用户数据" 吗? │
|
||
│ │
|
||
│ 此操作不可撤销。 │
|
||
│ │
|
||
│ [取消] [删除] │
|
||
│ │
|
||
└─────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
### 6. 规则加载
|
||
|
||
**加载流程**:
|
||
|
||
1. 点击"加载"按钮
|
||
2. 将规则配置应用到当前编辑器
|
||
3. 更新预览数据
|
||
4. 记录使用时间和次数
|
||
|
||
**实现方式**:
|
||
|
||
```typescript
|
||
function loadRule(ruleId: string): void {
|
||
const rule = ruleStorage.getById(ruleId);
|
||
if (!rule) return;
|
||
|
||
setFields(rule.fields);
|
||
ruleStorage.recordUse(ruleId);
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 7. 规则复制
|
||
|
||
**复制逻辑**:
|
||
|
||
1. 点击"复制"按钮
|
||
2. 创建规则的副本
|
||
3. 名称添加「(副本)」后缀(默认 `duplicate(id, '(副本)')`)
|
||
4. 生成新的 ID
|
||
5. 保存为新规则
|
||
|
||
---
|
||
|
||
### 8. 规则导出
|
||
|
||
**导出界面**:
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────┐
|
||
│ 导出规则 │
|
||
├─────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ 选择要导出的规则: │
|
||
│ ┌───────────────────────────────────────────────────────────────┐ │
|
||
│ │ ☑ 电商用户数据 - 测试用 (4个字段, 100条) │ │
|
||
│ │ ☑ 电商订单数据 - 测试用 (6个字段, 500条) │ │
|
||
│ │ ☐ 用户登录数据 - 测试用 (3个字段, 50条) │ │
|
||
│ │ │ │
|
||
│ │ [全选] [全不选] │ │
|
||
│ └───────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ 导出格式: │
|
||
│ ┌───────────────────────────────────────────────────────────────┐ │
|
||
│ │ ○ 导出为单个 JSON 文件 (所有规则合并) │ │
|
||
│ │ ● 导出为多个 JSON 文件 (每个规则一个文件) │ │
|
||
│ └───────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ [导出] [取消] │
|
||
│ │
|
||
└─────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
**导出格式**(`exportRules()` 返回 `DataRule[]` 的 JSON 字符串,无外层包装):
|
||
|
||
```json
|
||
[
|
||
{
|
||
"id": "rule_123456",
|
||
"name": "电商用户数据 - 测试用",
|
||
"description": "用于测试用户注册功能",
|
||
"fields": [],
|
||
"createdAt": 1704067200000,
|
||
"updatedAt": 1704067200000,
|
||
"useCount": 0
|
||
}
|
||
]
|
||
```
|
||
|
||
---
|
||
|
||
### 9. 规则导入
|
||
|
||
**导入界面**:
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────┐
|
||
│ 导入规则 │
|
||
├─────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ 选择导入方式: │
|
||
│ ┌───────────────────────────────────────────────────────────────┐ │
|
||
│ │ │ │
|
||
│ │ ○ 从文件导入 │ │
|
||
│ │ ┌─────────────────────────────────────────────────────┐ │ │
|
||
│ │ │ 拖拽文件到这里,或 [点击选择文件] │ │ │
|
||
│ │ │ 支持格式: .json │ │ │
|
||
│ │ └─────────────────────────────────────────────────────┘ │ │
|
||
│ │ │ │
|
||
│ │ ○ 从剪贴板粘贴 │ │
|
||
│ │ ┌─────────────────────────────────────────────────────┐ │ │
|
||
│ │ │ 粘贴 JSON 规则内容... │ │ │
|
||
│ │ └─────────────────────────────────────────────────────┘ │ │
|
||
│ │ │ │
|
||
│ └───────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ 预览导入内容: │
|
||
│ ┌───────────────────────────────────────────────────────────────┐ │
|
||
│ │ 格式验证通过 │ │
|
||
│ │ 规则数量: 2 个 │ │
|
||
│ │ • 电商用户数据 (4个字段) │ │
|
||
│ │ • 电商订单数据 (6个字段) │ │
|
||
│ └───────────────────────────────────────────────────────────────┘ │
|
||
│ │
|
||
│ [导入] [取消] │
|
||
│ │
|
||
└─────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
**导入逻辑**:
|
||
|
||
1. 解析 JSON 文件
|
||
2. 验证格式是否正确
|
||
3. 预览导入内容
|
||
4. 确认后逐条导入
|
||
5. 生成新 ID 避免冲突
|
||
6. 处理导入结果(成功/失败数量)
|
||
|
||
---
|
||
|
||
## 存储机制
|
||
|
||
### 本地存储
|
||
|
||
使用 `localStorage`,键名 `testDataGenerator_rules`。API 为**命名导出函数**(见 `src/utils/ruleStorage.ts`):
|
||
|
||
| 函数 | 说明 |
|
||
| ------------------------------------------------------ | ---------------------------------- |
|
||
| `getAll()` / `getById()` / `getByName()` | 读取 |
|
||
| `save()` / `update()` / `deleteRule()` / `duplicate()` | 写入;失败时返回 `null` 或 `false` |
|
||
| `recordUse()` | 递增 `useCount`、更新 `lastUsedAt` |
|
||
| `search()` / `getRecent()` | 搜索与最近使用 |
|
||
| `exportRules()` / `importRules()` | 导入导出 JSON 数组 |
|
||
| `clear()` | 清空全部规则 |
|
||
|
||
写入失败(如 `QuotaExceededError`)时,内部 `setAll()` 返回 `false`,`save`/`update` 返回 `null`,`deleteRule` 返回 `false`,并在控制台输出 `[ruleStorage] 保存规则失败`。调用方须检查返回值,避免误报成功。
|
||
|
||
```typescript
|
||
import * as ruleStorage from '@/utils/ruleStorage';
|
||
|
||
const saved = ruleStorage.save({ name: '示例', fields });
|
||
if (!saved) {
|
||
// 达上限或 localStorage 不可用
|
||
}
|
||
```
|
||
|
||
### 存储限制
|
||
|
||
- **规则数量限制**: 最多 20 条
|
||
- localStorage 容量: 5-10MB(浏览器限制)
|
||
- 单个规则约 1-5KB
|
||
- 预计可存储 1000-5000 个规则(但受数量限制,最多 20 条)
|
||
|
||
---
|
||
|
||
## 功能亮点
|
||
|
||
| 亮点 | 说明 |
|
||
| -------- | ------------------------------ |
|
||
| 本地存储 | 数据保存在浏览器本地,无需后端 |
|
||
| 快速复用 | 一键加载已保存的规则 |
|
||
| 导入导出 | 支持 JSON 文件导入导出 |
|
||
| 使用统计 | 记录使用次数和时间 |
|
||
| 搜索筛选 | 支持关键词搜索 |
|