a163297de4
* docs(AGENTS.md): 添加 Git Commit 必须使用中文描述的规范 * docs: 更新测试数据生成器功能设计文档 * refactor: 删除死代码 * docs: 统一测试数据生成器文档,移除 SQL/TypeScript 导出,修复接口命名不一致 * feat: 实现测试数据生成器功能 * docs: 更新 README 和 AGENTS 文档,补充测试数据生成器模块说明
24 KiB
24 KiB
规则管理
功能概览
| 功能 | 说明 | 优先级 |
|---|---|---|
| 保存规则 | 将当前配置保存为模板 | P0 |
| 规则列表 | 查看所有已保存的规则 | P0 |
| 规则搜索 | 按关键词搜索规则 | P1 |
| 规则编辑 | 修改已保存的规则 | P0 |
| 规则删除 | 删除不需要的规则 | P0 |
| 规则加载 | 一键加载规则配置 | P0 |
| 规则复制 | 复制规则配置 | P1 |
| 规则导出 | 导出为 JSON 文件 | P1 |
| 规则导入 | 从 JSON 文件导入 | P1 |
规则数量限制
- 最大规则数量: 20 条
- 超出限制: 当规则数量达到 20 条时,保存按钮置灰,提示"已达到最大规则数量"
- 解决方式: 用户需要删除已有规则后才能保存新规则
数据结构
规则模板
interface DataRule {
id: string; // 唯一标识
name: string; // 规则名称
description?: string; // 规则描述
fields: FieldConfig[]; // 字段配置
options: {
total: number; // 生成数量
format: 'json' | 'csv';
defaultEmptyRate: number; // 默认空值率(0-100)
};
metadata: {
createdAt: number; // 创建时间
updatedAt: number; // 更新时间
lastUsedAt?: number; // 最后使用时间
useCount: number; // 使用次数
};
}
字段配置
interface FieldConfig {
id: string; // 字段唯一标识
name: string; // 字段名
generator: string; // 生成器名称
params: Record<string, any>; // 生成器参数
unique: boolean; // 唯一性约束
required: boolean; // 是否必填
emptyRate?: number; // 选填字段的空值概率(0-100)
}
功能详情
1. 保存规则
触发方式: 用户点击"保存规则"按钮
界面设计:
┌─────────────────────────────────────────────────────────────────────┐
│ 保存规则 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 规则信息 │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ 规则名称: │ │
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
│ │ │ [电商用户数据 - 测试用 ]│ │ │
│ │ └─────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ 规则描述 (可选): │ │
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
│ │ │ [用于测试用户注册功能,包含姓名、邮箱、手机号 ]│ │ │
│ │ └─────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
│ 规则预览 │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ 字段数量: 4 个 │ │
│ │ • name (中文姓名) │ │
│ │ • email (邮箱地址) │ │
│ │ • phone (手机号) │ │
│ │ • age (年龄) │ │
│ │ │ │
│ │ 生成数量: 100 条 │ │
│ │ 数据格式: JSON │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
│ [保存] [取消] │
│ │
└─────────────────────────────────────────────────────────────────────┘
保存逻辑:
- 验证规则名称不为空
- 检查规则数量是否达到上限(20 条)
- 如果达到上限,显示提示"已达到最大规则数量"
- 生成唯一 ID
- 设置创建时间和更新时间
- 初始化使用次数为 0
- 保存到 localStorage
2. 规则列表
界面设计:
┌─────────────────────────────────────────────────────────────────────┐
│ 规则管理 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 搜索: [搜索规则名称... ] │
│ │
│ 规则列表 (已保存 15/20 条) │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
│ │ │ 电商用户数据 - 测试用 │ │ │
│ │ │ ─────────────────────────────────────────────────────── │ │ │
│ │ │ 用于测试用户注册功能,包含姓名、邮箱、手机号 │ │ │
│ │ │ 4 个字段 | 100 条 | JSON │ │ │
│ │ │ 2024-01-15 14:30 创建 | 2024-01-20 10:15 最后使用 │ │ │
│ │ │ │ │ │
│ │ │ [加载] [复制] [导出] [编辑] [删除] │ │ │
│ │ └─────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
│ [导入规则] [导出全部] [清空全部] │
│ │
└─────────────────────────────────────────────────────────────────────┘
列表项信息:
- 规则名称
- 规则描述
- 字段数量、生成数量、数据格式
- 创建时间、最后使用时间
- 操作按钮
3. 规则搜索
搜索逻辑:
- 支持按规则名称搜索
- 支持按规则描述搜索
- 搜索为模糊匹配,不区分大小写
实现方式:
search(keyword: string): DataRule[] {
const rules = this.getAll();
const lowerKeyword = keyword.toLowerCase();
return rules.filter(r =>
r.name.toLowerCase().includes(lowerKeyword) ||
r.description?.toLowerCase().includes(lowerKeyword)
);
}
4. 规则编辑
界面设计:
┌─────────────────────────────────────────────────────────────────────┐
│ 编辑规则 - 电商用户数据 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 基本信息 │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ 规则名称: [电商用户数据 - 测试用 ]│ │
│ │ 规则描述: [用于测试用户注册功能,包含姓名、邮箱、手机号 ]│ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
│ 字段配置 (可直接编辑) │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 1. name [中文姓名 ▼] [配置] [删除] [上移][下移] │ │
│ │ 2. email [邮箱地址 ▼] [配置] [删除] [上移][下移] │ │
│ │ 3. phone [手机号 ▼] [配置] [删除] [上移][下移] │ │
│ │ 4. age [年龄 ▼] [配置] [删除] [上移][下移] │ │
│ │ │ │
│ │ [+ 添加字段] │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
│ 生成选项 │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ 数量: [100] 格式: [JSON ▼] │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
│ [保存修改] [取消] │
│ │
└─────────────────────────────────────────────────────────────────────┘
编辑逻辑:
- 加载原规则配置到编辑器
- 用户修改配置
- 点击保存时更新规则
- 更新 metadata.updatedAt
- 保存到 localStorage
5. 规则删除
删除流程:
- 点击删除按钮
- 弹出确认对话框
- 确认后删除规则
- 刷新规则列表
确认对话框:
┌─────────────────────────────────────────┐
│ 确认删除 │
├─────────────────────────────────────────┤
│ │
│ 确定要删除规则 "电商用户数据" 吗? │
│ │
│ 此操作不可撤销。 │
│ │
│ [取消] [删除] │
│ │
└─────────────────────────────────────────┘
6. 规则加载
加载流程:
- 点击"加载"按钮
- 将规则配置应用到当前编辑器
- 更新预览数据
- 记录使用时间和次数
实现方式:
loadRule(ruleId: string): void {
const rule = this.storage.getById(ruleId);
// 应用规则配置
this.setFields(rule.fields);
this.setOptions(rule.options);
// 记录使用
this.storage.recordUse(ruleId);
// 更新预览
this.updatePreview();
}
7. 规则复制
复制逻辑:
- 点击"复制"按钮
- 创建规则的副本
- 名称添加"(副本)"后缀
- 生成新的 ID
- 保存为新规则
8. 规则导出
导出界面:
┌─────────────────────────────────────────────────────────────────────┐
│ 导出规则 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 选择要导出的规则: │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ ☑ 电商用户数据 - 测试用 (4个字段, 100条) │ │
│ │ ☑ 电商订单数据 - 测试用 (6个字段, 500条) │ │
│ │ ☐ 用户登录数据 - 测试用 (3个字段, 50条) │ │
│ │ │ │
│ │ [全选] [全不选] │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
│ 导出格式: │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ ○ 导出为单个 JSON 文件 (所有规则合并) │ │
│ │ ● 导出为多个 JSON 文件 (每个规则一个文件) │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
│ [导出] [取消] │
│ │
└─────────────────────────────────────────────────────────────────────┘
导出格式:
{
"version": "1.0",
"exportedAt": "2024-01-20T10:15:45.000Z",
"rules": [
{
"id": "rule_123456",
"name": "电商用户数据 - 测试用",
"description": "用于测试用户注册功能",
"fields": [...],
"options": {...},
"metadata": {...}
}
]
}
9. 规则导入
导入界面:
┌─────────────────────────────────────────────────────────────────────┐
│ 导入规则 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 选择导入方式: │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ○ 从文件导入 │ │
│ │ ┌─────────────────────────────────────────────────────┐ │ │
│ │ │ 拖拽文件到这里,或 [点击选择文件] │ │ │
│ │ │ 支持格式: .json │ │ │
│ │ └─────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ○ 从剪贴板粘贴 │ │
│ │ ┌─────────────────────────────────────────────────────┐ │ │
│ │ │ 粘贴 JSON 规则内容... │ │ │
│ │ └─────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
│ 预览导入内容: │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ 格式验证通过 │ │
│ │ 规则数量: 2 个 │ │
│ │ • 电商用户数据 (4个字段) │ │
│ │ • 电商订单数据 (6个字段) │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
│ [导入] [取消] │
│ │
└─────────────────────────────────────────────────────────────────────┘
导入逻辑:
- 解析 JSON 文件
- 验证格式是否正确
- 预览导入内容
- 确认后逐条导入
- 生成新 ID 避免冲突
- 处理导入结果(成功/失败数量)
存储机制
本地存储
使用 localStorage 存储规则数据:
class RuleStorage {
private readonly STORAGE_KEY = 'testDataGenerator_rules';
// 获取所有规则
getAll(): DataRule[] {
const data = localStorage.getItem(this.STORAGE_KEY);
return data ? JSON.parse(data) : [];
}
// 保存规则
save(rule: DataRule): { success: boolean; message?: string } {
const rules = this.getAll();
// 规则数量限制:最多 20 条
const MAX_RULES = 20;
if (rules.length >= MAX_RULES) {
return {
success: false,
message: `已达到最大规则数量(${MAX_RULES}条),请删除一些规则后再保存`,
};
}
rules.push(rule);
localStorage.setItem(this.STORAGE_KEY, JSON.stringify(rules));
return { success: true };
}
// 更新规则
update(id: string, updates: Partial<DataRule>): void {
const rules = this.getAll();
const index = rules.findIndex((r) => r.id === id);
if (index !== -1) {
rules[index] = { ...rules[index], ...updates };
localStorage.setItem(this.STORAGE_KEY, JSON.stringify(rules));
}
}
// 删除规则
delete(id: string): void {
const rules = this.getAll();
const filtered = rules.filter((r) => r.id !== id);
localStorage.setItem(this.STORAGE_KEY, JSON.stringify(filtered));
}
// 记录使用
recordUse(id: string): void {
const rules = this.getAll();
const rule = rules.find((r) => r.id === id);
if (rule) {
rule.metadata.lastUsedAt = Date.now();
rule.metadata.useCount++;
localStorage.setItem(this.STORAGE_KEY, JSON.stringify(rules));
}
}
}
存储限制
- 规则数量限制: 最多 20 条
- localStorage 容量: 5-10MB(浏览器限制)
- 单个规则约 1-5KB
- 预计可存储 1000-5000 个规则(但受数量限制,最多 20 条)
功能亮点
| 亮点 | 说明 |
|---|---|
| 本地存储 | 数据保存在浏览器本地,无需后端 |
| 快速复用 | 一键加载已保存的规则 |
| 导入导出 | 支持 JSON 文件导入导出 |
| 使用统计 | 记录使用次数和时间 |
| 搜索筛选 | 支持关键词搜索 |