index.html 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. <!DOCTYPE HTML>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="utf-8"/>
  5. <title>数据Mock工具 - FeHelper</title>
  6. <link rel="stylesheet" href="index.css"/>
  7. <script type="text/javascript" src="../static/vendor/evalCore.min.js"></script>
  8. <script type="text/javascript" src="../static/vendor/vue/vue.js"></script>
  9. </head>
  10. <body>
  11. <div class="wrapper" id="pageContainer">
  12. <!-- 现代化顶部导航栏 -->
  13. <div class="main-navbar">
  14. <div class="navbar-brand">
  15. <a href="https://fehelper.com" target="_blank" class="brand-link">
  16. <img src="../static/img/fe-16.png" alt="fehelper"/>
  17. <span class="brand-text">FeHelper</span>
  18. <span class="brand-subtitle">数据Mock工具</span>
  19. </a>
  20. </div>
  21. <div class="navbar-actions">
  22. <a href="#" @click="openOptionsPage($event)" class="nav-item other-tools-link">
  23. <i class="nav-icon">⊕</i>
  24. <span>探索更多实用工具</span>
  25. <span class="tool-market-badge">工具市场</span>
  26. </a>
  27. <a href="#" @click="openDonateModal($event)" class="nav-item donate-link">
  28. <i class="nav-icon">❤</i>
  29. <span>打赏鼓励</span>
  30. </a>
  31. </div>
  32. </div>
  33. <div class="panel panel-default">
  34. <!-- 主要内容 - 左右布局 -->
  35. <div class="panel-body" v-cloak>
  36. <div class="main-content-layout">
  37. <!-- 左侧配置操作区 -->
  38. <div class="config-section">
  39. <!-- 快速模板 -->
  40. <div class="template-section template-top">
  41. <h4>快速模板</h4>
  42. <div class="template-buttons">
  43. <button @click="loadTemplate('user')" class="btn btn-template">用户信息</button>
  44. <button @click="loadTemplate('employee')" class="btn btn-template">员工信息</button>
  45. <button @click="loadTemplate('product')" class="btn btn-template">商品信息</button>
  46. <button @click="loadTemplate('order')" class="btn btn-template">订单信息</button>
  47. <button @click="loadTemplate('api')" class="btn btn-template">API测试数据</button>
  48. </div>
  49. </div>
  50. <!-- 操作按钮 -->
  51. <div class="action-buttons action-buttons-top">
  52. <button @click="generateData" class="btn btn-success">生成数据</button>
  53. <button @click="selectAll" class="btn btn-info">全选</button>
  54. <button @click="clearAll" class="btn btn-warning">清空</button>
  55. </div>
  56. <!-- 数据类型选择区域 -->
  57. <div class="data-type-section">
  58. <h4>选择数据类型</h4>
  59. <div class="data-type-tabs">
  60. <button class="data-tab"
  61. :class="{ active: activeTab === 'personal' }"
  62. @click="activeTab = 'personal'">
  63. 个人信息
  64. </button>
  65. <button class="data-tab"
  66. :class="{ active: activeTab === 'business' }"
  67. @click="activeTab = 'business'">
  68. 商业数据
  69. </button>
  70. <button class="data-tab"
  71. :class="{ active: activeTab === 'technical' }"
  72. @click="activeTab = 'technical'">
  73. 技术数据
  74. </button>
  75. <button class="data-tab"
  76. :class="{ active: activeTab === 'custom' }"
  77. @click="activeTab = 'custom'">
  78. 自定义数据
  79. </button>
  80. </div>
  81. </div>
  82. <!-- 个人信息数据 -->
  83. <div v-show="activeTab === 'personal'" class="data-content">
  84. <div class="field-group">
  85. <h5>基本信息</h5>
  86. <div class="field-row">
  87. <label><input type="checkbox" v-model="selectedFields.name"> 姓名</label>
  88. <label><input type="checkbox" v-model="selectedFields.email"> 邮箱</label>
  89. <label><input type="checkbox" v-model="selectedFields.phone"> 手机号</label>
  90. <label><input type="checkbox" v-model="selectedFields.idCard"> 身份证号</label>
  91. </div>
  92. <div class="field-row">
  93. <label><input type="checkbox" v-model="selectedFields.gender"> 性别</label>
  94. <label><input type="checkbox" v-model="selectedFields.age"> 年龄</label>
  95. <label><input type="checkbox" v-model="selectedFields.birthday"> 生日</label>
  96. <label><input type="checkbox" v-model="selectedFields.address"> 地址</label>
  97. </div>
  98. </div>
  99. </div>
  100. <!-- 商业数据 -->
  101. <div v-show="activeTab === 'business'" class="data-content">
  102. <div class="field-group">
  103. <h5>商业信息</h5>
  104. <div class="field-row">
  105. <label><input type="checkbox" v-model="selectedFields.company"> 公司名称</label>
  106. <label><input type="checkbox" v-model="selectedFields.department"> 部门</label>
  107. <label><input type="checkbox" v-model="selectedFields.position"> 职位</label>
  108. <label><input type="checkbox" v-model="selectedFields.salary"> 薪资</label>
  109. </div>
  110. <div class="field-row">
  111. <label><input type="checkbox" v-model="selectedFields.bankCard"> 银行卡号</label>
  112. <label><input type="checkbox" v-model="selectedFields.creditCard"> 信用卡号</label>
  113. <label><input type="checkbox" v-model="selectedFields.price"> 价格</label>
  114. <label><input type="checkbox" v-model="selectedFields.currency"> 货币</label>
  115. </div>
  116. </div>
  117. </div>
  118. <!-- 技术数据 -->
  119. <div v-show="activeTab === 'technical'" class="data-content">
  120. <div class="field-group">
  121. <h5>技术信息</h5>
  122. <div class="field-row">
  123. <label><input type="checkbox" v-model="selectedFields.uuid"> UUID</label>
  124. <label><input type="checkbox" v-model="selectedFields.ip"> IP地址</label>
  125. <label><input type="checkbox" v-model="selectedFields.mac"> MAC地址</label>
  126. <label><input type="checkbox" v-model="selectedFields.userAgent"> User Agent</label>
  127. </div>
  128. <div class="field-row">
  129. <label><input type="checkbox" v-model="selectedFields.url"> URL</label>
  130. <label><input type="checkbox" v-model="selectedFields.domain"> 域名</label>
  131. <label><input type="checkbox" v-model="selectedFields.password"> 密码</label>
  132. <label><input type="checkbox" v-model="selectedFields.token"> Token</label>
  133. </div>
  134. <div class="field-row">
  135. <label><input type="checkbox" v-model="selectedFields.color"> 颜色值</label>
  136. <label><input type="checkbox" v-model="selectedFields.timestamp"> 时间戳</label>
  137. <label><input type="checkbox" v-model="selectedFields.filename"> 文件名</label>
  138. <label><input type="checkbox" v-model="selectedFields.mimeType"> MIME类型</label>
  139. </div>
  140. </div>
  141. </div>
  142. <!-- 自定义数据 -->
  143. <div v-show="activeTab === 'custom'" class="data-content">
  144. <div class="field-group">
  145. <h5>自定义规则</h5>
  146. <div class="custom-input">
  147. <label>字段名称:</label>
  148. <input type="text" v-model="customField.name" placeholder="请输入字段名">
  149. </div>
  150. <div class="custom-input">
  151. <label>数据类型:</label>
  152. <select v-model="customField.type">
  153. <option value="string">字符串</option>
  154. <option value="number">数字</option>
  155. <option value="boolean">布尔值</option>
  156. <option value="date">日期</option>
  157. <option value="array">数组</option>
  158. </select>
  159. </div>
  160. <div class="custom-input">
  161. <label>生成规则:</label>
  162. <input type="text" v-model="customField.rule" placeholder="如:长度10-20的随机字符串">
  163. </div>
  164. <button @click="addCustomField" class="btn btn-primary">添加字段</button>
  165. </div>
  166. <div v-if="customFields.length > 0" class="custom-fields-list">
  167. <h5>已添加字段</h5>
  168. <div v-for="(field, index) in customFields" :key="index" class="custom-field-item">
  169. <span>{{ field.name }} ({{ field.type }})</span>
  170. <button @click="removeCustomField(index)" class="btn-remove">删除</button>
  171. </div>
  172. </div>
  173. </div>
  174. <!-- 生成配置 -->
  175. <div class="generate-config">
  176. <div class="config-row">
  177. <label>生成数量:</label>
  178. <input type="number" v-model="generateCount" min="1" max="1000" value="10">
  179. </div>
  180. <div class="config-row">
  181. <label>输出格式:</label>
  182. <select v-model="outputFormat">
  183. <option value="json">JSON</option>
  184. <option value="csv">CSV</option>
  185. <option value="sql">SQL INSERT</option>
  186. <option value="xml">XML</option>
  187. </select>
  188. </div>
  189. </div>
  190. </div>
  191. <!-- 右侧结果展示区 -->
  192. <div class="result-section">
  193. <div class="result-panel">
  194. <div class="result-header">
  195. <h4 v-if="generatedData">生成结果 ({{ generateCount }} 条)</h4>
  196. <h4 v-else>数据结果</h4>
  197. <div class="result-actions">
  198. <span class="data-size" v-if="generatedData">{{ dataSize }}</span>
  199. <span class="data-size" v-else>等待生成</span>
  200. <button @click="copyResult" class="btn btn-primary btn-sm" :disabled="!generatedData">复制结果</button>
  201. <button @click="downloadData" class="btn btn-secondary btn-sm" :disabled="!generatedData">下载文件</button>
  202. </div>
  203. </div>
  204. <div class="result-content">
  205. <div v-if="!generatedData" class="empty-result">
  206. <div class="empty-icon">📊</div>
  207. <div class="empty-text">
  208. <h5>暂无生成结果</h5>
  209. <p>请选择数据字段并点击"生成数据"按钮</p>
  210. </div>
  211. </div>
  212. <pre v-else>{{ generatedData }}</pre>
  213. </div>
  214. </div>
  215. </div>
  216. </div>
  217. </div>
  218. </div>
  219. </div>
  220. <script type="text/javascript" src="fake-data-lib.js"></script>
  221. <script type="text/javascript" src="index.js"></script>
  222. </body>
  223. </html>