fake-data-lib.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. /**
  2. * 假数据生成器核心库
  3. * 提供各种类型的假数据生成功能
  4. */
  5. class FakeDataGenerator {
  6. constructor() {
  7. this.init();
  8. }
  9. init() {
  10. // 中文姓氏
  11. this.surnames = [
  12. '王', '李', '张', '刘', '陈', '杨', '赵', '黄', '周', '吴',
  13. '徐', '孙', '胡', '朱', '高', '林', '何', '郭', '马', '罗',
  14. '梁', '宋', '郑', '谢', '韩', '唐', '冯', '于', '董', '萧'
  15. ];
  16. // 中文名字
  17. this.givenNames = [
  18. '伟', '芳', '娜', '秀英', '敏', '静', '丽', '强', '磊', '军',
  19. '洋', '勇', '艳', '杰', '娟', '涛', '明', '超', '秀兰', '霞',
  20. '平', '刚', '桂英', '永', '健', '鑫', '帅', '莉', '凯', '浩',
  21. '宇', '琳', '雅', '欣', '晨', '阳', '雪', '晴', '萌', '悦'
  22. ];
  23. // 公司名称后缀
  24. this.companySuffixes = [
  25. '有限公司', '股份有限公司', '科技有限公司', '贸易有限公司',
  26. '实业有限公司', '投资有限公司', '集团有限公司', '控股有限公司',
  27. '发展有限公司', '建设有限公司', '咨询有限公司', '服务有限公司'
  28. ];
  29. // 公司名称前缀
  30. this.companyPrefixes = [
  31. '阿里巴巴', '腾讯', '百度', '京东', '美团', '字节跳动', '滴滴',
  32. '小米', '华为', '网易', '新浪', '搜狐', '爱奇艺', '快手',
  33. '拼多多', '携程', '途牛', '去哪儿', '58同城', '赶集网',
  34. '优酷', '土豆', '乐视', '暴风', '金山', '猎豹', '360',
  35. '蚂蚁金服', '陆金所', '恒生电子', '同花顺', '东方财富'
  36. ];
  37. // 部门名称
  38. this.departments = [
  39. '技术部', '产品部', '运营部', '市场部', '销售部', '人事部',
  40. '财务部', '行政部', '法务部', '客服部', '设计部', '测试部',
  41. '运维部', '数据部', '商务部', '品牌部', '公关部', '投资部'
  42. ];
  43. // 职位名称
  44. this.positions = [
  45. '前端工程师', '后端工程师', '全栈工程师', '移动端工程师', 'DevOps工程师',
  46. '产品经理', '项目经理', '技术经理', '运营专员', '市场专员',
  47. 'UI设计师', 'UX设计师', '测试工程师', '数据分析师', '算法工程师',
  48. '架构师', 'CTO', 'CEO', 'COO', 'CFO', '总监', '主管', '专员'
  49. ];
  50. // 省份
  51. this.provinces = [
  52. '北京市', '上海市', '天津市', '重庆市', '河北省', '山西省',
  53. '辽宁省', '吉林省', '黑龙江省', '江苏省', '浙江省', '安徽省',
  54. '福建省', '江西省', '山东省', '河南省', '湖北省', '湖南省',
  55. '广东省', '海南省', '四川省', '贵州省', '云南省', '陕西省',
  56. '甘肃省', '青海省', '台湾省', '内蒙古自治区', '广西壮族自治区',
  57. '西藏自治区', '宁夏回族自治区', '新疆维吾尔自治区', '香港特别行政区', '澳门特别行政区'
  58. ];
  59. // 城市
  60. this.cities = [
  61. '北京', '上海', '广州', '深圳', '杭州', '南京', '武汉', '成都',
  62. '西安', '郑州', '青岛', '大连', '宁波', '厦门', '福州', '长沙',
  63. '济南', '重庆', '天津', '苏州', '无锡', '石家庄', '太原', '沈阳',
  64. '长春', '哈尔滨', '合肥', '南昌', '昆明', '贵阳', '兰州', '银川'
  65. ];
  66. // User Agent 列表
  67. this.userAgents = [
  68. 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
  69. 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
  70. 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
  71. 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0',
  72. 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15'
  73. ];
  74. // MIME 类型
  75. this.mimeTypes = [
  76. 'image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml',
  77. 'text/html', 'text/css', 'text/javascript', 'text/plain', 'text/csv',
  78. 'application/json', 'application/xml', 'application/pdf', 'application/zip',
  79. 'video/mp4', 'video/webm', 'audio/mp3', 'audio/wav', 'audio/ogg'
  80. ];
  81. // 文件扩展名
  82. this.fileExtensions = [
  83. 'jpg', 'png', 'gif', 'pdf', 'doc', 'docx', 'xls', 'xlsx',
  84. 'ppt', 'pptx', 'txt', 'csv', 'json', 'xml', 'zip', 'rar',
  85. 'mp4', 'avi', 'mov', 'mp3', 'wav', 'html', 'css', 'js'
  86. ];
  87. // 域名后缀
  88. this.domainSuffixes = [
  89. 'com', 'cn', 'net', 'org', 'edu', 'gov', 'mil', 'int',
  90. 'com.cn', 'net.cn', 'org.cn', 'edu.cn', 'gov.cn'
  91. ];
  92. // 邮箱域名
  93. this.emailDomains = [
  94. 'gmail.com', 'yahoo.com', 'hotmail.com', 'outlook.com', '163.com',
  95. '126.com', 'qq.com', 'sina.com', 'sohu.com', 'foxmail.com',
  96. 'aliyun.com', 'yeah.net', 'vip.sina.com', 'vip.163.com'
  97. ];
  98. }
  99. // 生成随机整数
  100. randomInt(min, max) {
  101. return Math.floor(Math.random() * (max - min + 1)) + min;
  102. }
  103. // 生成随机浮点数
  104. randomFloat(min, max, precision = 2) {
  105. const num = Math.random() * (max - min) + min;
  106. return parseFloat(num.toFixed(precision));
  107. }
  108. // 从数组中随机选择一个元素
  109. randomChoice(array) {
  110. return array[Math.floor(Math.random() * array.length)];
  111. }
  112. // 生成随机字符串
  113. randomString(length = 10, charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') {
  114. let result = '';
  115. for (let i = 0; i < length; i++) {
  116. result += charset.charAt(Math.floor(Math.random() * charset.length));
  117. }
  118. return result;
  119. }
  120. // 生成中文姓名
  121. generateName() {
  122. const surname = this.randomChoice(this.surnames);
  123. const givenNameLength = Math.random() > 0.7 ? 2 : 1; // 70%概率生成双字名
  124. let givenName = '';
  125. for (let i = 0; i < givenNameLength; i++) {
  126. givenName += this.randomChoice(this.givenNames);
  127. }
  128. return surname + givenName;
  129. }
  130. // 生成邮箱
  131. generateEmail() {
  132. const username = this.randomString(this.randomInt(6, 12));
  133. const domain = this.randomChoice(this.emailDomains);
  134. return `${username}@${domain}`;
  135. }
  136. // 生成手机号
  137. generatePhone() {
  138. const prefixes = ['130', '131', '132', '133', '134', '135', '136', '137', '138', '139',
  139. '150', '151', '152', '153', '155', '156', '157', '158', '159',
  140. '180', '181', '182', '183', '184', '185', '186', '187', '188', '189'];
  141. const prefix = this.randomChoice(prefixes);
  142. const suffix = this.randomString(8, '0123456789');
  143. return prefix + suffix;
  144. }
  145. // 生成身份证号
  146. generateIdCard() {
  147. // 地区码(简化)
  148. const areaCodes = ['110000', '120000', '130000', '140000', '150000', '210000', '220000', '230000'];
  149. const areaCode = this.randomChoice(areaCodes);
  150. // 生日(1970-2000年)
  151. const year = this.randomInt(1970, 2000);
  152. const month = this.randomInt(1, 12).toString().padStart(2, '0');
  153. const day = this.randomInt(1, 28).toString().padStart(2, '0');
  154. const birthday = `${year}${month}${day}`;
  155. // 顺序码
  156. const sequence = this.randomInt(100, 999).toString();
  157. // 校验码(简化为随机)
  158. const checkCode = this.randomChoice(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'X']);
  159. return areaCode.substring(0, 6) + birthday + sequence + checkCode;
  160. }
  161. // 生成性别
  162. generateGender() {
  163. return Math.random() > 0.5 ? '男' : '女';
  164. }
  165. // 生成年龄
  166. generateAge() {
  167. return this.randomInt(18, 65);
  168. }
  169. // 生成生日
  170. generateBirthday() {
  171. const year = this.randomInt(1960, 2005);
  172. const month = this.randomInt(1, 12);
  173. const day = this.randomInt(1, 28);
  174. return `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}`;
  175. }
  176. // 生成地址
  177. generateAddress() {
  178. const province = this.randomChoice(this.provinces);
  179. const city = this.randomChoice(this.cities);
  180. const district = this.randomChoice(['朝阳区', '海淀区', '西城区', '东城区', '丰台区', '石景山区']);
  181. const street = this.randomString(2, '一二三四五六七八九十') + '街道';
  182. const number = this.randomInt(1, 999) + '号';
  183. return `${province}${city}${district}${street}${number}`;
  184. }
  185. // 生成公司名称
  186. generateCompany() {
  187. const prefix = this.randomChoice(this.companyPrefixes);
  188. const suffix = this.randomChoice(this.companySuffixes);
  189. return prefix + suffix;
  190. }
  191. // 生成部门
  192. generateDepartment() {
  193. return this.randomChoice(this.departments);
  194. }
  195. // 生成职位
  196. generatePosition() {
  197. return this.randomChoice(this.positions);
  198. }
  199. // 生成薪资
  200. generateSalary() {
  201. return this.randomInt(5000, 50000);
  202. }
  203. // 生成银行卡号
  204. generateBankCard() {
  205. const prefixes = ['6225', '6222', '6228', '6229', '6227', '6223', '6226'];
  206. const prefix = this.randomChoice(prefixes);
  207. const suffix = this.randomString(12, '0123456789');
  208. return prefix + suffix;
  209. }
  210. // 生成信用卡号
  211. generateCreditCard() {
  212. const prefixes = ['4', '5', '6'];
  213. const prefix = this.randomChoice(prefixes);
  214. const suffix = this.randomString(15, '0123456789');
  215. return prefix + suffix;
  216. }
  217. // 生成价格
  218. generatePrice() {
  219. return this.randomFloat(0.01, 9999.99);
  220. }
  221. // 生成货币
  222. generateCurrency() {
  223. const currencies = ['CNY', 'USD', 'EUR', 'JPY', 'GBP', 'AUD', 'CAD', 'CHF', 'HKD', 'SGD'];
  224. return this.randomChoice(currencies);
  225. }
  226. // 生成UUID
  227. generateUUID() {
  228. return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
  229. const r = Math.random() * 16 | 0;
  230. const v = c === 'x' ? r : (r & 0x3 | 0x8);
  231. return v.toString(16);
  232. });
  233. }
  234. // 生成IP地址
  235. generateIP() {
  236. return `${this.randomInt(1, 255)}.${this.randomInt(0, 255)}.${this.randomInt(0, 255)}.${this.randomInt(1, 255)}`;
  237. }
  238. // 生成MAC地址
  239. generateMAC() {
  240. const chars = '0123456789ABCDEF';
  241. let mac = '';
  242. for (let i = 0; i < 6; i++) {
  243. if (i > 0) mac += ':';
  244. mac += this.randomString(2, chars);
  245. }
  246. return mac;
  247. }
  248. // 生成User Agent
  249. generateUserAgent() {
  250. return this.randomChoice(this.userAgents);
  251. }
  252. // 生成URL
  253. generateURL() {
  254. const protocols = ['http', 'https'];
  255. const domains = ['example.com', 'test.com', 'demo.com', 'sample.org', 'mock.net'];
  256. const paths = ['/', '/home', '/about', '/contact', '/products', '/services', '/blog'];
  257. const protocol = this.randomChoice(protocols);
  258. const domain = this.randomChoice(domains);
  259. const path = this.randomChoice(paths);
  260. return `${protocol}://${domain}${path}`;
  261. }
  262. // 生成域名
  263. generateDomain() {
  264. const name = this.randomString(this.randomInt(5, 15));
  265. const suffix = this.randomChoice(this.domainSuffixes);
  266. return `${name}.${suffix}`;
  267. }
  268. // 生成密码
  269. generatePassword() {
  270. const length = this.randomInt(8, 16);
  271. const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*';
  272. return this.randomString(length, chars);
  273. }
  274. // 生成Token
  275. generateToken() {
  276. return this.randomString(32, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789');
  277. }
  278. // 生成颜色值
  279. generateColor() {
  280. return '#' + this.randomString(6, '0123456789ABCDEF');
  281. }
  282. // 生成时间戳
  283. generateTimestamp() {
  284. const now = Date.now();
  285. const offset = this.randomInt(-365 * 24 * 60 * 60 * 1000, 365 * 24 * 60 * 60 * 1000);
  286. return now + offset;
  287. }
  288. // 生成文件名
  289. generateFilename() {
  290. const name = this.randomString(this.randomInt(5, 15));
  291. const ext = this.randomChoice(this.fileExtensions);
  292. return `${name}.${ext}`;
  293. }
  294. // 生成MIME类型
  295. generateMimeType() {
  296. return this.randomChoice(this.mimeTypes);
  297. }
  298. // 生成布尔值
  299. generateBoolean() {
  300. return Math.random() > 0.5;
  301. }
  302. // 生成日期
  303. generateDate() {
  304. const start = new Date(2020, 0, 1);
  305. const end = new Date();
  306. const timestamp = start.getTime() + Math.random() * (end.getTime() - start.getTime());
  307. return new Date(timestamp).toISOString().split('T')[0];
  308. }
  309. // 根据字段类型生成数据
  310. generateByType(type) {
  311. const generators = {
  312. name: () => this.generateName(),
  313. email: () => this.generateEmail(),
  314. phone: () => this.generatePhone(),
  315. idCard: () => this.generateIdCard(),
  316. gender: () => this.generateGender(),
  317. age: () => this.generateAge(),
  318. birthday: () => this.generateBirthday(),
  319. address: () => this.generateAddress(),
  320. company: () => this.generateCompany(),
  321. department: () => this.generateDepartment(),
  322. position: () => this.generatePosition(),
  323. salary: () => this.generateSalary(),
  324. bankCard: () => this.generateBankCard(),
  325. creditCard: () => this.generateCreditCard(),
  326. price: () => this.generatePrice(),
  327. currency: () => this.generateCurrency(),
  328. uuid: () => this.generateUUID(),
  329. ip: () => this.generateIP(),
  330. mac: () => this.generateMAC(),
  331. userAgent: () => this.generateUserAgent(),
  332. url: () => this.generateURL(),
  333. domain: () => this.generateDomain(),
  334. password: () => this.generatePassword(),
  335. token: () => this.generateToken(),
  336. color: () => this.generateColor(),
  337. timestamp: () => this.generateTimestamp(),
  338. filename: () => this.generateFilename(),
  339. mimeType: () => this.generateMimeType(),
  340. boolean: () => this.generateBoolean(),
  341. date: () => this.generateDate()
  342. };
  343. return generators[type] ? generators[type]() : null;
  344. }
  345. }
  346. // 导出为全局变量
  347. window.FakeDataGenerator = FakeDataGenerator;