refactor: 统一中文文案并简化组件结构,提升代码可读性

移除 chrome.i18n 后,将各功能页面、布局与工具模块的 UI 文案改为内联中文;
删除冗余注释与过度抽象(如 ToolCard、StatCard),精简 props 与状态管理;
同步优化 JsonTools、StorageCleaner、Timestamp、TestDataGenerator、Dashboard、
Base64Converter、RightClickRestorer、TextStatistics、TopBar、RouterProvider、
ThemeModeProvider 及生成器库与 utils 工具文件。
This commit is contained in:
雨霖铃
2026-06-27 10:49:36 +08:00
parent f3a9838017
commit d38bafe237
85 changed files with 324 additions and 864 deletions
-1
View File
@@ -37,7 +37,6 @@ import { cn } from '@/lib/utils';
| `business.ts` | 业务数据生成器(订单号、价格、日期、状态等) |
| `technical.ts` | 技术数据生成器(UUID、IPv4、URL |
| `basic.ts` | 基础类型生成器(整数、浮点数、布尔值、字符串) |
| `types.ts` | 生成器库内部类型与通用选项 |
使用示例:
-17
View File
@@ -1,14 +1,6 @@
/**
* 基础类型生成器
* 包含:随机整数、随机浮点数、随机字符串、从列表选择
*/
import type { GeneratorDefinition } from '@/types/testDataGenerator';
import { randomInt, randomPick } from './random';
/**
* 随机整数生成器
*/
export const randomIntGenerator: GeneratorDefinition = {
id: 'randomInt',
name: '随机整数',
@@ -43,9 +35,6 @@ export const randomIntGenerator: GeneratorDefinition = {
},
};
/**
* 随机浮点数生成器
*/
export const randomFloat: GeneratorDefinition = {
id: 'randomFloat',
name: '随机浮点数',
@@ -85,9 +74,6 @@ export const randomFloat: GeneratorDefinition = {
},
};
/**
* 随机字符串生成器
*/
export const randomString: GeneratorDefinition = {
id: 'randomString',
name: '随机字符串',
@@ -166,9 +152,6 @@ export const randomString: GeneratorDefinition = {
},
};
/**
* 从列表选择生成器
*/
export const fromList: GeneratorDefinition = {
id: 'fromList',
name: '从列表选择',
-47
View File
@@ -1,14 +1,6 @@
/**
* 业务数据生成器
* 包含:订单号、价格、日期、状态、数量、评分、折扣、库存
*/
import type { GeneratorDefinition } from '@/types/testDataGenerator';
import { randomInt, randomPick } from './random';
/**
* 格式化日期
*/
function formatDate(date: Date, format: string): string {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
@@ -26,9 +18,6 @@ function formatDate(date: Date, format: string): string {
.replace('ss', seconds);
}
/**
* 订单号生成器
*/
export const orderId: GeneratorDefinition = {
id: 'orderId',
name: '订单号',
@@ -68,9 +57,6 @@ export const orderId: GeneratorDefinition = {
},
};
/**
* 价格生成器
*/
export const price: GeneratorDefinition = {
id: 'price',
name: '价格',
@@ -142,9 +128,6 @@ export const price: GeneratorDefinition = {
},
};
/**
* 生成心理定价(如 9.99, 19.9, 99
*/
function generatePsychologicalPrice(min: number, max: number): number {
const patterns = [
() => {
@@ -167,9 +150,6 @@ function generatePsychologicalPrice(min: number, max: number): number {
return price;
}
/**
* 生成真实分布价格(对数正态分布)
*/
function generateRealisticPrice(min: number, max: number): number {
const mean = (Math.log(min) + Math.log(max)) / 2;
const stdDev = (Math.log(max) - Math.log(min)) / 4;
@@ -182,9 +162,6 @@ function generateRealisticPrice(min: number, max: number): number {
return Math.max(min, Math.min(max, value));
}
/**
* 日期生成器
*/
export const date: GeneratorDefinition = {
id: 'date',
name: '日期',
@@ -235,9 +212,6 @@ export const date: GeneratorDefinition = {
},
};
/**
* 状态生成器
*/
export const status: GeneratorDefinition = {
id: 'status',
name: '状态',
@@ -290,9 +264,6 @@ export const status: GeneratorDefinition = {
},
};
/**
* 数量生成器
*/
export const quantity: GeneratorDefinition = {
id: 'quantity',
name: '数量',
@@ -339,9 +310,6 @@ export const quantity: GeneratorDefinition = {
},
};
/**
* 泊松分布随机数
*/
function poissonRandom(lambda: number): number {
const L = Math.exp(-lambda);
let k = 0;
@@ -353,9 +321,6 @@ function poissonRandom(lambda: number): number {
return k - 1;
}
/**
* 评分生成器
*/
export const rating: GeneratorDefinition = {
id: 'rating',
name: '评分',
@@ -410,9 +375,6 @@ export const rating: GeneratorDefinition = {
},
};
/**
* 偏向高分的随机数(模拟真实评分分布)
*/
function skewedRandom(min: number, max: number): number {
// 使用 Beta 分布模拟评分偏向
const alpha = 3;
@@ -425,9 +387,6 @@ function skewedRandom(min: number, max: number): number {
return min + x * (max - min);
}
/**
* 折扣生成器
*/
export const discount: GeneratorDefinition = {
id: 'discount',
name: '折扣',
@@ -479,9 +438,6 @@ export const discount: GeneratorDefinition = {
},
};
/**
* 生成心理折扣(如 5%, 10%, 20%, 30%
*/
function generatePsychologicalDiscount(min: number, max: number): number {
const psychologicalDiscounts = [5, 10, 15, 20, 25, 30, 40, 50, 60, 70, 80];
const validDiscounts = psychologicalDiscounts.filter((d) => d >= min && d <= max);
@@ -491,9 +447,6 @@ function generatePsychologicalDiscount(min: number, max: number): number {
return randomInt(min, max);
}
/**
* 库存生成器
*/
export const stock: GeneratorDefinition = {
id: 'stock',
name: '库存',
-20
View File
@@ -1,17 +1,9 @@
/**
* 生成器库索引
* 导出所有生成器和分类配置
*/
import type { GeneratorDefinition, GeneratorCategory } from '@/types/testDataGenerator';
import { personalGenerators } from './personal';
import { businessGenerators } from './business';
import { technicalGenerators } from './technical';
import { basicGenerators } from './basic';
/**
* 生成器分类配置
*/
export const generatorCategories: GeneratorCategory[] = [
{ id: 'personal', name: '个人信息', icon: 'User' },
{ id: 'business', name: '业务数据', icon: 'Briefcase' },
@@ -19,9 +11,6 @@ export const generatorCategories: GeneratorCategory[] = [
{ id: 'basic', name: '基础类型', icon: 'Hash' },
];
/**
* 所有生成器列表
*/
export const allGenerators: GeneratorDefinition[] = [
...personalGenerators,
...businessGenerators,
@@ -29,23 +18,14 @@ export const allGenerators: GeneratorDefinition[] = [
...basicGenerators,
];
/**
* 根据 ID 获取生成器
*/
export function getGeneratorById(id: string): GeneratorDefinition | undefined {
return allGenerators.find((g) => g.id === id);
}
/**
* 根据分类 ID 获取生成器列表
*/
export function getGeneratorsByCategory(categoryId: string): GeneratorDefinition[] {
return allGenerators.filter((g) => g.categoryId === categoryId);
}
/**
* 搜索生成器
*/
export function searchGenerators(query: string): GeneratorDefinition[] {
const lowerQuery = query.toLowerCase();
return allGenerators.filter(
-42
View File
@@ -1,12 +1,6 @@
/**
* 个人信息生成器
* 包含:中文姓名、邮箱、手机号、身份证号、中文地址、年龄
*/
import type { GeneratorDefinition } from '@/types/testDataGenerator';
import { randomInt, randomPick } from './random';
// 中文姓氏
const SURNAMES = [
'王',
'李',
@@ -60,7 +54,6 @@ const SURNAMES = [
'阎',
];
// 中文名字常用字
const NAME_CHARS = [
'伟',
'芳',
@@ -114,10 +107,8 @@ const NAME_CHARS = [
'慧',
];
// 邮箱域名
const EMAIL_DOMAINS = ['qq.com', '163.com', '126.com', 'gmail.com', 'outlook.com', 'hotmail.com'];
// 省份
const PROVINCES = [
'北京市',
'天津市',
@@ -153,7 +144,6 @@ const PROVINCES = [
'新疆维吾尔自治区',
];
// 城市
const CITIES: Record<string, string[]> = {
: ['东城区', '西城区', '朝阳区', '海淀区'],
: ['黄浦区', '徐汇区', '长宁区', '静安区'],
@@ -163,9 +153,6 @@ const CITIES: Record<string, string[]> = {
: ['成都市', '绵阳市', '德阳市', '宜宾市'],
};
/**
* 中文姓名生成器
*/
export const chineseName: GeneratorDefinition = {
id: 'chineseName',
name: '中文姓名',
@@ -179,9 +166,6 @@ export const chineseName: GeneratorDefinition = {
},
};
/**
* 邮箱生成器
*/
export const email: GeneratorDefinition = {
id: 'email',
name: '邮箱',
@@ -208,9 +192,6 @@ export const email: GeneratorDefinition = {
},
};
/**
* 手机号生成器
*/
export const chinesePhone: GeneratorDefinition = {
id: 'chinesePhone',
name: '手机号',
@@ -241,9 +222,6 @@ export const chinesePhone: GeneratorDefinition = {
},
};
/**
* 身份证号生成器
*/
export const idCard: GeneratorDefinition = {
id: 'idCard',
name: '身份证号',
@@ -268,20 +246,12 @@ export const idCard: GeneratorDefinition = {
generate: (params) => {
const regions = ['110101', '310101', '440103', '440305', '510104', '330102'];
const region = params.region === 'random' ? randomPick(regions) : (params.region as string);
// 出生日期 1960-2005年
const year = randomInt(1960, 2005);
const month = String(randomInt(1, 12)).padStart(2, '0');
const day = String(randomInt(1, 28)).padStart(2, '0');
const birthday = `${year}${month}${day}`;
// 顺序码
const sequence = String(randomInt(1, 999)).padStart(3, '0');
// 前17位
const prefix17 = region + birthday + sequence;
// 校验码
const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
const checkCodes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
let sum = 0;
@@ -317,9 +287,6 @@ export const idCard: GeneratorDefinition = {
},
};
/**
* 中文地址生成器
*/
export const chineseAddress: GeneratorDefinition = {
id: 'chineseAddress',
name: '中文地址',
@@ -348,9 +315,6 @@ export const chineseAddress: GeneratorDefinition = {
},
};
/**
* 年龄生成器
*/
export const age: GeneratorDefinition = {
id: 'age',
name: '年龄',
@@ -402,9 +366,6 @@ export const age: GeneratorDefinition = {
},
};
/**
* 正态分布随机数
*/
function normalRandom(min: number, max: number): number {
const mean = (min + max) / 2;
const stdDev = (max - min) / 6;
@@ -417,9 +378,6 @@ function normalRandom(min: number, max: number): number {
return Math.max(min, Math.min(max, value));
}
/**
* 人口统计分布随机数(模拟真实年龄分布)
*/
function demographicRandom(): number {
const ageGroups = [
{ min: 0, max: 14, weight: 0.18 },
-31
View File
@@ -1,14 +1,6 @@
/**
* 技术数据生成器
* 包含:UUID、IPv4、URL
*/
import type { GeneratorDefinition } from '@/types/testDataGenerator';
import { randomInt, randomPick } from './random';
/**
* UUID 生成器
*/
export const uuid: GeneratorDefinition = {
id: 'uuid',
name: 'UUID',
@@ -65,9 +57,6 @@ export const uuid: GeneratorDefinition = {
},
};
/**
* 生成 UUID v4
*/
function generateUUIDv4(): string {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
const r = (Math.random() * 16) | 0;
@@ -76,9 +65,6 @@ function generateUUIDv4(): string {
});
}
/**
* 生成 UUID v1(简化版本,模拟时间戳)
*/
function generateUUIDv1(): string {
const now = Date.now();
const timeLow = (now & 0xffffffff).toString(16).padStart(8, '0');
@@ -92,9 +78,6 @@ function generateUUIDv1(): string {
return `${timeLow}-${timeMid}-${timeHi.toString(16)}-${clockSeq.toString(16)}-${node}`;
}
/**
* IPv4 生成器
*/
export const ipv4: GeneratorDefinition = {
id: 'ipv4',
name: 'IPv4',
@@ -129,16 +112,10 @@ export const ipv4: GeneratorDefinition = {
},
};
/**
* 生成完全随机 IPv4
*/
function generateRandomIPv4(): string {
return Array.from({ length: 4 }, () => randomInt(0, 255)).join('.');
}
/**
* 生成内网 IPv4
*/
function generatePrivateIPv4(): string {
const ranges = [
{ prefix: '10', second: () => randomInt(0, 255) },
@@ -153,9 +130,6 @@ function generatePrivateIPv4(): string {
return `${range.prefix}.${range.second()}.${randomInt(1, 254)}.${randomInt(1, 254)}`;
}
/**
* 生成公网 IPv4
*/
function generatePublicIPv4(): string {
let first: number;
do {
@@ -165,9 +139,6 @@ function generatePublicIPv4(): string {
return `${first}.${randomInt(0, 255)}.${randomInt(0, 255)}.${randomInt(1, 254)}`;
}
/**
* URL 生成器
*/
export const url: GeneratorDefinition = {
id: 'url',
name: 'URL',
@@ -237,8 +208,6 @@ export const url: GeneratorDefinition = {
path = `/${randomPick(['about', 'contact', 'products', 'services', 'blog'])}`;
}
}
// 添加查询参数
let query = '';
if (Math.random() > 0.5) {
const params = new URLSearchParams();
-48
View File
@@ -1,48 +0,0 @@
/**
* 生成器内部类型定义
* 与 testDataGenerator.ts 分离,用于生成器库内部
*/
import type { GeneratorDefinition, GeneratorCategory } from '@/types/testDataGenerator';
export type { GeneratorDefinition, GeneratorCategory };
/**
* 生成器注册表
*/
export interface GeneratorRegistry {
/** 分类列表 */
categories: GeneratorCategory[];
/** 生成器列表 */
generators: GeneratorDefinition[];
}
/**
* 随机数生成选项
*/
export interface RandomOptions {
/** 最小值 */
min?: number;
/** 最大值 */
max?: number;
/** 是否包含最小值 */
includeMin?: boolean;
/** 是否包含最大值 */
includeMax?: boolean;
}
/**
* 字符集选项
*/
export interface CharsetOptions {
/** 是否包含大写字母 */
uppercase?: boolean;
/** 是否包含小写字母 */
lowercase?: boolean;
/** 是否包含数字 */
digits?: boolean;
/** 是否包含特殊字符 */
special?: boolean;
/** 自定义字符集 */
custom?: string;
}