apifox-mock-generator 1.3.7 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +509 -1184
  3. package/dist/package.json +1 -1
  4. package/dist/src/config/apifox-mock-mappings.d.ts +140 -0
  5. package/dist/src/config/apifox-mock-mappings.d.ts.map +1 -0
  6. package/dist/src/config/apifox-mock-mappings.js +140 -0
  7. package/dist/src/config/apifox-mock-mappings.js.map +1 -0
  8. package/dist/src/config/mock-mappings-loader.d.ts +29 -0
  9. package/dist/src/config/mock-mappings-loader.d.ts.map +1 -0
  10. package/dist/src/config/mock-mappings-loader.js +48 -0
  11. package/dist/src/config/mock-mappings-loader.js.map +1 -0
  12. package/dist/src/core/apifox-client.js +11 -9
  13. package/dist/src/core/apifox-client.js.map +1 -1
  14. package/dist/src/core/endpoint-filter.d.ts.map +1 -1
  15. package/dist/src/core/endpoint-filter.js +19 -3
  16. package/dist/src/core/endpoint-filter.js.map +1 -1
  17. package/dist/src/core/mock-config-loader.d.ts +4 -4
  18. package/dist/src/core/mock-config-loader.d.ts.map +1 -1
  19. package/dist/src/core/mock-config-loader.js.map +1 -1
  20. package/dist/src/core/openapi-converter.d.ts.map +1 -1
  21. package/dist/src/core/openapi-converter.js +2 -1
  22. package/dist/src/core/openapi-converter.js.map +1 -1
  23. package/dist/src/generators/templates/mock-template.d.ts.map +1 -1
  24. package/dist/src/generators/templates/mock-template.js +52 -34
  25. package/dist/src/generators/templates/mock-template.js.map +1 -1
  26. package/dist/src/generators/templates/type-template.js +37 -2
  27. package/dist/src/generators/templates/type-template.js.map +1 -1
  28. package/dist/src/scripts/generate-mock.js +16 -5
  29. package/dist/src/scripts/generate-mock.js.map +1 -1
  30. package/dist/src/server/remote-proxy.js +1 -1
  31. package/dist/src/server/remote-proxy.js.map +1 -1
  32. package/dist/src/server/route-handler.d.ts +4 -0
  33. package/dist/src/server/route-handler.d.ts.map +1 -1
  34. package/dist/src/server/route-handler.js +47 -11
  35. package/dist/src/server/route-handler.js.map +1 -1
  36. package/dist/src/server/route-loader.d.ts.map +1 -1
  37. package/dist/src/server/route-loader.js +6 -57
  38. package/dist/src/server/route-loader.js.map +1 -1
  39. package/dist/src/types/index.d.ts +15 -16
  40. package/dist/src/types/index.d.ts.map +1 -1
  41. package/dist/src/types/mock/aiAnalytics/anomalyDetection/getAnomalyDetection.d.ts +38 -0
  42. package/dist/src/types/mock/aiAnalytics/anomalyDetection/getAnomalyDetection.d.ts.map +1 -0
  43. package/dist/src/types/mock/aiAnalytics/anomalyDetection/getAnomalyDetection.js +4 -0
  44. package/dist/src/types/mock/aiAnalytics/anomalyDetection/getAnomalyDetection.js.map +1 -0
  45. package/dist/src/types/mock/aiAnalytics/anomalyDetection/list.d.ts +11 -0
  46. package/dist/src/types/mock/aiAnalytics/anomalyDetection/list.d.ts.map +1 -0
  47. package/dist/src/types/mock/aiAnalytics/anomalyDetection/list.js +4 -0
  48. package/dist/src/types/mock/aiAnalytics/anomalyDetection/list.js.map +1 -0
  49. package/dist/src/types/mock/aiAnalytics/smartSql/insert.d.ts +23 -0
  50. package/dist/src/types/mock/aiAnalytics/smartSql/insert.d.ts.map +1 -0
  51. package/dist/src/types/mock/aiAnalytics/smartSql/insert.js +4 -0
  52. package/dist/src/types/mock/aiAnalytics/smartSql/insert.js.map +1 -0
  53. package/dist/src/types/mock/{v1/tenant/user/unlink.d.ts → aiAnalytics/smartSql/list.d.ts} +9 -9
  54. package/dist/src/types/mock/aiAnalytics/smartSql/list.d.ts.map +1 -0
  55. package/dist/src/types/mock/aiAnalytics/smartSql/list.js +4 -0
  56. package/dist/src/types/mock/aiAnalytics/smartSql/list.js.map +1 -0
  57. package/dist/src/types/mock/{v1/auth/login/tenant.d.ts → aiAnalytics/smartSql/naturalLanguageToSql.d.ts} +7 -10
  58. package/dist/src/types/mock/aiAnalytics/smartSql/naturalLanguageToSql.d.ts.map +1 -0
  59. package/dist/src/types/mock/aiAnalytics/smartSql/naturalLanguageToSql.js +4 -0
  60. package/dist/src/types/mock/aiAnalytics/smartSql/naturalLanguageToSql.js.map +1 -0
  61. package/dist/src/types/mock/{v1/user/self.d.ts → aiAnalytics/smartSql/selectBySql.d.ts} +6 -9
  62. package/dist/src/types/mock/aiAnalytics/smartSql/selectBySql.d.ts.map +1 -0
  63. package/dist/src/types/mock/aiAnalytics/smartSql/selectBySql.js +4 -0
  64. package/dist/src/types/mock/aiAnalytics/smartSql/selectBySql.js.map +1 -0
  65. package/dist/src/types/mock/aiAnalytics/smartSql/update.d.ts +25 -0
  66. package/dist/src/types/mock/aiAnalytics/smartSql/update.d.ts.map +1 -0
  67. package/dist/src/types/mock/aiAnalytics/smartSql/update.js +4 -0
  68. package/dist/src/types/mock/aiAnalytics/smartSql/update.js.map +1 -0
  69. package/dist/src/types/mock/aiAnalytics/smartSql.d.ts +26 -0
  70. package/dist/src/types/mock/aiAnalytics/smartSql.d.ts.map +1 -0
  71. package/dist/src/types/mock/aiAnalytics/smartSql.js +4 -0
  72. package/dist/src/types/mock/aiAnalytics/smartSql.js.map +1 -0
  73. package/dist/src/types/mock/ai_query.d.ts +17 -0
  74. package/dist/src/types/mock/ai_query.d.ts.map +1 -0
  75. package/dist/src/types/mock/ai_query.js +4 -0
  76. package/dist/src/types/mock/ai_query.js.map +1 -0
  77. package/dist/src/types/mock/auth/login/test.d.ts +11 -0
  78. package/dist/src/types/mock/auth/login/test.d.ts.map +1 -0
  79. package/dist/src/types/mock/auth/login/test.js +4 -0
  80. package/dist/src/types/mock/auth/login/test.js.map +1 -0
  81. package/dist/src/types/mock/auth/login.d.ts +11 -0
  82. package/dist/src/types/mock/auth/login.d.ts.map +1 -0
  83. package/dist/src/types/mock/auth/login.js +4 -0
  84. package/dist/src/types/mock/auth/login.js.map +1 -0
  85. package/dist/src/types/mock/auth/login1.d.ts +11 -0
  86. package/dist/src/types/mock/auth/login1.d.ts.map +1 -0
  87. package/dist/src/types/mock/auth/login1.js +4 -0
  88. package/dist/src/types/mock/auth/login1.js.map +1 -0
  89. package/dist/src/types/mock/auth/logout.d.ts +11 -0
  90. package/dist/src/types/mock/auth/logout.d.ts.map +1 -0
  91. package/dist/src/types/mock/auth/logout.js +4 -0
  92. package/dist/src/types/mock/auth/logout.js.map +1 -0
  93. package/dist/src/types/mock/auto-login/auth.d.ts +29 -0
  94. package/dist/src/types/mock/auto-login/auth.d.ts.map +1 -0
  95. package/dist/src/types/mock/auto-login/auth.js +4 -0
  96. package/dist/src/types/mock/auto-login/auth.js.map +1 -0
  97. package/dist/src/types/mock/auto-login/redirect.d.ts +15 -0
  98. package/dist/src/types/mock/auto-login/redirect.d.ts.map +1 -0
  99. package/dist/src/types/mock/auto-login/redirect.js +4 -0
  100. package/dist/src/types/mock/auto-login/redirect.js.map +1 -0
  101. package/dist/src/types/mock/captchaImage.d.ts +14 -0
  102. package/dist/src/types/mock/captchaImage.d.ts.map +1 -0
  103. package/dist/src/types/mock/captchaImage.js +4 -0
  104. package/dist/src/types/mock/captchaImage.js.map +1 -0
  105. package/dist/src/types/mock/chainmaker/getChainInfo.d.ts +12 -0
  106. package/dist/src/types/mock/chainmaker/getChainInfo.d.ts.map +1 -0
  107. package/dist/src/types/mock/chainmaker/getChainInfo.js +4 -0
  108. package/dist/src/types/mock/chainmaker/getChainInfo.js.map +1 -0
  109. package/dist/src/types/mock/chainmaker/getLatestBlock.d.ts +19 -0
  110. package/dist/src/types/mock/chainmaker/getLatestBlock.d.ts.map +1 -0
  111. package/dist/src/types/mock/chainmaker/getLatestBlock.js +4 -0
  112. package/dist/src/types/mock/chainmaker/getLatestBlock.js.map +1 -0
  113. package/dist/src/types/mock/chainmaker/getLatestBlockHeight.d.ts +13 -0
  114. package/dist/src/types/mock/chainmaker/getLatestBlockHeight.d.ts.map +1 -0
  115. package/dist/src/types/mock/chainmaker/getLatestBlockHeight.js +4 -0
  116. package/dist/src/types/mock/chainmaker/getLatestBlockHeight.js.map +1 -0
  117. package/dist/src/types/mock/chainmaker/query.d.ts +27 -0
  118. package/dist/src/types/mock/chainmaker/query.d.ts.map +1 -0
  119. package/dist/src/types/mock/chainmaker/query.js +4 -0
  120. package/dist/src/types/mock/chainmaker/query.js.map +1 -0
  121. package/dist/src/types/mock/common/log/export.d.ts +27 -0
  122. package/dist/src/types/mock/common/log/export.d.ts.map +1 -0
  123. package/dist/src/types/mock/common/log/export.js +4 -0
  124. package/dist/src/types/mock/common/log/export.js.map +1 -0
  125. package/dist/src/types/mock/common/log/permissionLog/export.d.ts +24 -0
  126. package/dist/src/types/mock/common/log/permissionLog/export.d.ts.map +1 -0
  127. package/dist/src/types/mock/common/log/permissionLog/export.js +4 -0
  128. package/dist/src/types/mock/common/log/permissionLog/export.js.map +1 -0
  129. package/dist/src/types/mock/common/log/permissionLog.d.ts +64 -0
  130. package/dist/src/types/mock/common/log/permissionLog.d.ts.map +1 -0
  131. package/dist/src/types/mock/common/log/permissionLog.js +4 -0
  132. package/dist/src/types/mock/common/log/permissionLog.js.map +1 -0
  133. package/dist/src/types/mock/common/log.d.ts +87 -0
  134. package/dist/src/types/mock/common/log.d.ts.map +1 -0
  135. package/dist/src/types/mock/common/log.js +4 -0
  136. package/dist/src/types/mock/common/log.js.map +1 -0
  137. package/dist/src/types/mock/create-user.d.ts +36 -0
  138. package/dist/src/types/mock/create-user.d.ts.map +1 -0
  139. package/dist/src/types/mock/create-user.js +4 -0
  140. package/dist/src/types/mock/create-user.js.map +1 -0
  141. package/dist/src/types/mock/dataaccleration/asynctask/add.d.ts +36 -0
  142. package/dist/src/types/mock/dataaccleration/asynctask/add.d.ts.map +1 -0
  143. package/dist/src/types/mock/dataaccleration/asynctask/add.js +4 -0
  144. package/dist/src/types/mock/dataaccleration/asynctask/add.js.map +1 -0
  145. package/dist/src/types/mock/dataaccleration/asynctask/delete.d.ts +16 -0
  146. package/dist/src/types/mock/dataaccleration/asynctask/delete.d.ts.map +1 -0
  147. package/dist/src/types/mock/dataaccleration/asynctask/delete.js +4 -0
  148. package/dist/src/types/mock/dataaccleration/asynctask/delete.js.map +1 -0
  149. package/dist/src/types/mock/dataaccleration/asynctask/list.d.ts +48 -0
  150. package/dist/src/types/mock/dataaccleration/asynctask/list.d.ts.map +1 -0
  151. package/dist/src/types/mock/dataaccleration/asynctask/list.js +4 -0
  152. package/dist/src/types/mock/dataaccleration/asynctask/list.js.map +1 -0
  153. package/dist/src/types/mock/dataaccleration/asynctask/taskId.d.ts +38 -0
  154. package/dist/src/types/mock/dataaccleration/asynctask/taskId.d.ts.map +1 -0
  155. package/dist/src/types/mock/dataaccleration/asynctask/taskId.js +4 -0
  156. package/dist/src/types/mock/dataaccleration/asynctask/taskId.js.map +1 -0
  157. package/dist/src/types/mock/dataaccleration/asynctask.d.ts +37 -0
  158. package/dist/src/types/mock/dataaccleration/asynctask.d.ts.map +1 -0
  159. package/dist/src/types/mock/dataaccleration/asynctask.js +4 -0
  160. package/dist/src/types/mock/dataaccleration/asynctask.js.map +1 -0
  161. package/dist/src/types/mock/datamask/rule/add.d.ts +27 -0
  162. package/dist/src/types/mock/datamask/rule/add.d.ts.map +1 -0
  163. package/dist/src/types/mock/datamask/rule/add.js +4 -0
  164. package/dist/src/types/mock/datamask/rule/add.js.map +1 -0
  165. package/dist/src/types/mock/datamask/rule/applyCount.d.ts +18 -0
  166. package/dist/src/types/mock/datamask/rule/applyCount.d.ts.map +1 -0
  167. package/dist/src/types/mock/datamask/rule/applyCount.js +4 -0
  168. package/dist/src/types/mock/datamask/rule/applyCount.js.map +1 -0
  169. package/dist/src/types/mock/datamask/rule/delete.d.ts +21 -0
  170. package/dist/src/types/mock/datamask/rule/delete.d.ts.map +1 -0
  171. package/dist/src/types/mock/datamask/rule/delete.js +4 -0
  172. package/dist/src/types/mock/datamask/rule/delete.js.map +1 -0
  173. package/dist/src/types/mock/datamask/rule/find-name.d.ts +20 -0
  174. package/dist/src/types/mock/datamask/rule/find-name.d.ts.map +1 -0
  175. package/dist/src/types/mock/datamask/rule/find-name.js +4 -0
  176. package/dist/src/types/mock/datamask/rule/find-name.js.map +1 -0
  177. package/dist/src/types/mock/datamask/rule/find.d.ts +45 -0
  178. package/dist/src/types/mock/datamask/rule/find.d.ts.map +1 -0
  179. package/dist/src/types/mock/datamask/rule/find.js +4 -0
  180. package/dist/src/types/mock/datamask/rule/find.js.map +1 -0
  181. package/dist/src/types/mock/datamask/rule/page.d.ts +64 -0
  182. package/dist/src/types/mock/datamask/rule/page.d.ts.map +1 -0
  183. package/dist/src/types/mock/datamask/rule/page.js +4 -0
  184. package/dist/src/types/mock/datamask/rule/page.js.map +1 -0
  185. package/dist/src/types/mock/{v1/user/avatar.d.ts → datamask/rule/preview.d.ts} +9 -9
  186. package/dist/src/types/mock/datamask/rule/preview.d.ts.map +1 -0
  187. package/dist/src/types/mock/datamask/rule/preview.js +4 -0
  188. package/dist/src/types/mock/datamask/rule/preview.js.map +1 -0
  189. package/dist/src/types/mock/datamask/rule/update.d.ts +29 -0
  190. package/dist/src/types/mock/datamask/rule/update.d.ts.map +1 -0
  191. package/dist/src/types/mock/datamask/rule/update.js +4 -0
  192. package/dist/src/types/mock/datamask/rule/update.js.map +1 -0
  193. package/dist/src/types/mock/datamask/rule/user.d.ts +30 -0
  194. package/dist/src/types/mock/datamask/rule/user.d.ts.map +1 -0
  195. package/dist/src/types/mock/datamask/rule/user.js +4 -0
  196. package/dist/src/types/mock/datamask/rule/user.js.map +1 -0
  197. package/dist/src/types/mock/datamask/task/add.d.ts +33 -0
  198. package/dist/src/types/mock/datamask/task/add.d.ts.map +1 -0
  199. package/dist/src/types/mock/datamask/task/add.js +4 -0
  200. package/dist/src/types/mock/datamask/task/add.js.map +1 -0
  201. package/dist/src/types/mock/datamask/task/delete.d.ts +20 -0
  202. package/dist/src/types/mock/datamask/task/delete.d.ts.map +1 -0
  203. package/dist/src/types/mock/datamask/task/delete.js +4 -0
  204. package/dist/src/types/mock/datamask/task/delete.js.map +1 -0
  205. package/dist/src/types/mock/datamask/task/find.d.ts +51 -0
  206. package/dist/src/types/mock/datamask/task/find.d.ts.map +1 -0
  207. package/dist/src/types/mock/datamask/task/find.js +4 -0
  208. package/dist/src/types/mock/datamask/task/find.js.map +1 -0
  209. package/dist/src/types/mock/datamask/task/listField.d.ts +22 -0
  210. package/dist/src/types/mock/datamask/task/listField.d.ts.map +1 -0
  211. package/dist/src/types/mock/datamask/task/listField.js +4 -0
  212. package/dist/src/types/mock/datamask/task/listField.js.map +1 -0
  213. package/dist/src/types/mock/datamask/task/listTable.d.ts +15 -0
  214. package/dist/src/types/mock/datamask/task/listTable.d.ts.map +1 -0
  215. package/dist/src/types/mock/datamask/task/listTable.js +4 -0
  216. package/dist/src/types/mock/datamask/task/listTable.js.map +1 -0
  217. package/dist/src/types/mock/datamask/task/page.d.ts +76 -0
  218. package/dist/src/types/mock/datamask/task/page.d.ts.map +1 -0
  219. package/dist/src/types/mock/datamask/task/page.js +4 -0
  220. package/dist/src/types/mock/datamask/task/page.js.map +1 -0
  221. package/dist/src/types/mock/datamask/task/update.d.ts +35 -0
  222. package/dist/src/types/mock/datamask/task/update.d.ts.map +1 -0
  223. package/dist/src/types/mock/datamask/task/update.js +4 -0
  224. package/dist/src/types/mock/datamask/task/update.js.map +1 -0
  225. package/dist/src/types/mock/datasets.d.ts +19 -0
  226. package/dist/src/types/mock/datasets.d.ts.map +1 -0
  227. package/dist/src/types/mock/datasets.js +4 -0
  228. package/dist/src/types/mock/datasets.js.map +1 -0
  229. package/dist/src/types/mock/file/download.d.ts +15 -0
  230. package/dist/src/types/mock/file/download.d.ts.map +1 -0
  231. package/dist/src/types/mock/file/download.js +4 -0
  232. package/dist/src/types/mock/file/download.js.map +1 -0
  233. package/dist/src/types/mock/file/upload.d.ts +6 -0
  234. package/dist/src/types/mock/file/upload.d.ts.map +1 -0
  235. package/dist/src/types/mock/file/upload.js +4 -0
  236. package/dist/src/types/mock/file/upload.js.map +1 -0
  237. package/dist/src/types/mock/getInfo.d.ts +68 -0
  238. package/dist/src/types/mock/getInfo.d.ts.map +1 -0
  239. package/dist/src/types/mock/getInfo.js +4 -0
  240. package/dist/src/types/mock/getInfo.js.map +1 -0
  241. package/dist/src/types/mock/login.d.ts +31 -0
  242. package/dist/src/types/mock/login.d.ts.map +1 -0
  243. package/dist/src/types/mock/login.js +4 -0
  244. package/dist/src/types/mock/login.js.map +1 -0
  245. package/dist/src/types/mock/nl2sql/query.d.ts +22 -0
  246. package/dist/src/types/mock/nl2sql/query.d.ts.map +1 -0
  247. package/dist/src/types/mock/nl2sql/query.js +4 -0
  248. package/dist/src/types/mock/nl2sql/query.js.map +1 -0
  249. package/dist/src/types/mock/order/export.d.ts +32 -0
  250. package/dist/src/types/mock/order/export.d.ts.map +1 -0
  251. package/dist/src/types/mock/order/export.js +4 -0
  252. package/dist/src/types/mock/order/export.js.map +1 -0
  253. package/dist/src/types/mock/order/insert.d.ts +16 -0
  254. package/dist/src/types/mock/order/insert.d.ts.map +1 -0
  255. package/dist/src/types/mock/order/insert.js +4 -0
  256. package/dist/src/types/mock/order/insert.js.map +1 -0
  257. package/dist/src/types/mock/order/list.d.ts +60 -0
  258. package/dist/src/types/mock/order/list.d.ts.map +1 -0
  259. package/dist/src/types/mock/order/list.js +4 -0
  260. package/dist/src/types/mock/order/list.js.map +1 -0
  261. package/dist/src/types/mock/order/receive.d.ts +31 -0
  262. package/dist/src/types/mock/order/receive.d.ts.map +1 -0
  263. package/dist/src/types/mock/order/receive.js +4 -0
  264. package/dist/src/types/mock/order/receive.js.map +1 -0
  265. package/dist/src/types/mock/order.d.ts +128 -0
  266. package/dist/src/types/mock/order.d.ts.map +1 -0
  267. package/dist/src/types/mock/order.js +4 -0
  268. package/dist/src/types/mock/order.js.map +1 -0
  269. package/dist/src/types/mock/query.d.ts +19 -0
  270. package/dist/src/types/mock/query.d.ts.map +1 -0
  271. package/dist/src/types/mock/query.js +4 -0
  272. package/dist/src/types/mock/query.js.map +1 -0
  273. package/dist/src/types/mock/service/report/page.d.ts +52 -0
  274. package/dist/src/types/mock/service/report/page.d.ts.map +1 -0
  275. package/dist/src/types/mock/service/report/page.js +4 -0
  276. package/dist/src/types/mock/service/report/page.js.map +1 -0
  277. package/dist/src/types/mock/service/report/service-options.d.ts +47 -0
  278. package/dist/src/types/mock/service/report/service-options.d.ts.map +1 -0
  279. package/dist/src/types/mock/service/report/service-options.js +4 -0
  280. package/dist/src/types/mock/service/report/service-options.js.map +1 -0
  281. package/dist/src/types/mock/service/report/submit.d.ts +31 -0
  282. package/dist/src/types/mock/service/report/submit.d.ts.map +1 -0
  283. package/dist/src/types/mock/service/report/submit.js +4 -0
  284. package/dist/src/types/mock/service/report/submit.js.map +1 -0
  285. package/dist/src/types/mock/serviceInfo/list.d.ts +22 -0
  286. package/dist/src/types/mock/serviceInfo/list.d.ts.map +1 -0
  287. package/dist/src/types/mock/serviceInfo/list.js +4 -0
  288. package/dist/src/types/mock/serviceInfo/list.js.map +1 -0
  289. package/dist/src/types/mock/study-deal/etm/orderStatusToDepSync.d.ts +20 -0
  290. package/dist/src/types/mock/study-deal/etm/orderStatusToDepSync.d.ts.map +1 -0
  291. package/dist/src/types/mock/study-deal/etm/orderStatusToDepSync.js +4 -0
  292. package/dist/src/types/mock/study-deal/etm/orderStatusToDepSync.js.map +1 -0
  293. package/dist/src/types/mock/study-deal/etm/productDspInfoSync.d.ts +80 -0
  294. package/dist/src/types/mock/study-deal/etm/productDspInfoSync.d.ts.map +1 -0
  295. package/dist/src/types/mock/study-deal/etm/productDspInfoSync.js +4 -0
  296. package/dist/src/types/mock/study-deal/etm/productDspInfoSync.js.map +1 -0
  297. package/dist/src/types/mock/system/user/checkPhoneNumber.d.ts +20 -0
  298. package/dist/src/types/mock/system/user/checkPhoneNumber.d.ts.map +1 -0
  299. package/dist/src/types/mock/system/user/checkPhoneNumber.js +4 -0
  300. package/dist/src/types/mock/system/user/checkPhoneNumber.js.map +1 -0
  301. package/dist/src/types/mock/system/user/updatePhoneNumber.d.ts +22 -0
  302. package/dist/src/types/mock/system/user/updatePhoneNumber.d.ts.map +1 -0
  303. package/dist/src/types/mock/system/user/updatePhoneNumber.js +4 -0
  304. package/dist/src/types/mock/system/user/updatePhoneNumber.js.map +1 -0
  305. package/dist/src/types/mock/{v1/user/password.d.ts → system/user/updatePwd.d.ts} +5 -8
  306. package/dist/src/types/mock/system/user/updatePwd.d.ts.map +1 -0
  307. package/dist/src/types/mock/system/user/updatePwd.js +4 -0
  308. package/dist/src/types/mock/system/user/updatePwd.js.map +1 -0
  309. package/dist/src/types/mock/user/info.d.ts +45 -0
  310. package/dist/src/types/mock/user/info.d.ts.map +1 -0
  311. package/dist/src/types/mock/user/info.js +4 -0
  312. package/dist/src/types/mock/user/info.js.map +1 -0
  313. package/dist/src/utils/file-utils.d.ts +8 -2
  314. package/dist/src/utils/file-utils.d.ts.map +1 -1
  315. package/dist/src/utils/file-utils.js +21 -6
  316. package/dist/src/utils/file-utils.js.map +1 -1
  317. package/package.json +1 -1
  318. package/dist/src/generators/templates/smart-mock-rules.d.ts +0 -47
  319. package/dist/src/generators/templates/smart-mock-rules.d.ts.map +0 -1
  320. package/dist/src/generators/templates/smart-mock-rules.js +0 -643
  321. package/dist/src/generators/templates/smart-mock-rules.js.map +0 -1
  322. package/dist/src/types/mock/list.d.ts +0 -12
  323. package/dist/src/types/mock/list.d.ts.map +0 -1
  324. package/dist/src/types/mock/list.js +0 -4
  325. package/dist/src/types/mock/list.js.map +0 -1
  326. package/dist/src/types/mock/test.d.ts +0 -12
  327. package/dist/src/types/mock/test.d.ts.map +0 -1
  328. package/dist/src/types/mock/test.js +0 -4
  329. package/dist/src/types/mock/test.js.map +0 -1
  330. package/dist/src/types/mock/v1/auth/captcha.d.ts +0 -18
  331. package/dist/src/types/mock/v1/auth/captcha.d.ts.map +0 -1
  332. package/dist/src/types/mock/v1/auth/captcha.js +0 -4
  333. package/dist/src/types/mock/v1/auth/captcha.js.map +0 -1
  334. package/dist/src/types/mock/v1/auth/login/tenant.d.ts.map +0 -1
  335. package/dist/src/types/mock/v1/auth/login/tenant.js +0 -4
  336. package/dist/src/types/mock/v1/auth/login/tenant.js.map +0 -1
  337. package/dist/src/types/mock/v1/auth/login/username.d.ts +0 -32
  338. package/dist/src/types/mock/v1/auth/login/username.d.ts.map +0 -1
  339. package/dist/src/types/mock/v1/auth/login/username.js +0 -4
  340. package/dist/src/types/mock/v1/auth/login/username.js.map +0 -1
  341. package/dist/src/types/mock/v1/auth/logout.d.ts +0 -13
  342. package/dist/src/types/mock/v1/auth/logout.d.ts.map +0 -1
  343. package/dist/src/types/mock/v1/auth/logout.js +0 -4
  344. package/dist/src/types/mock/v1/auth/logout.js.map +0 -1
  345. package/dist/src/types/mock/v1/role/list.d.ts +0 -48
  346. package/dist/src/types/mock/v1/role/list.d.ts.map +0 -1
  347. package/dist/src/types/mock/v1/role/list.js +0 -4
  348. package/dist/src/types/mock/v1/role/list.js.map +0 -1
  349. package/dist/src/types/mock/v1/role/permissions.d.ts +0 -25
  350. package/dist/src/types/mock/v1/role/permissions.d.ts.map +0 -1
  351. package/dist/src/types/mock/v1/role/permissions.js +0 -4
  352. package/dist/src/types/mock/v1/role/permissions.js.map +0 -1
  353. package/dist/src/types/mock/v1/role.d.ts +0 -113
  354. package/dist/src/types/mock/v1/role.d.ts.map +0 -1
  355. package/dist/src/types/mock/v1/role.js +0 -4
  356. package/dist/src/types/mock/v1/role.js.map +0 -1
  357. package/dist/src/types/mock/v1/tenant/permissions.d.ts +0 -52
  358. package/dist/src/types/mock/v1/tenant/permissions.d.ts.map +0 -1
  359. package/dist/src/types/mock/v1/tenant/permissions.js +0 -4
  360. package/dist/src/types/mock/v1/tenant/permissions.js.map +0 -1
  361. package/dist/src/types/mock/v1/tenant/user/disabled.d.ts +0 -25
  362. package/dist/src/types/mock/v1/tenant/user/disabled.d.ts.map +0 -1
  363. package/dist/src/types/mock/v1/tenant/user/disabled.js +0 -4
  364. package/dist/src/types/mock/v1/tenant/user/disabled.js.map +0 -1
  365. package/dist/src/types/mock/v1/tenant/user/list.d.ts +0 -60
  366. package/dist/src/types/mock/v1/tenant/user/list.d.ts.map +0 -1
  367. package/dist/src/types/mock/v1/tenant/user/list.js +0 -4
  368. package/dist/src/types/mock/v1/tenant/user/list.js.map +0 -1
  369. package/dist/src/types/mock/v1/tenant/user/role.d.ts +0 -25
  370. package/dist/src/types/mock/v1/tenant/user/role.d.ts.map +0 -1
  371. package/dist/src/types/mock/v1/tenant/user/role.js +0 -4
  372. package/dist/src/types/mock/v1/tenant/user/role.js.map +0 -1
  373. package/dist/src/types/mock/v1/tenant/user/unlink.d.ts.map +0 -1
  374. package/dist/src/types/mock/v1/tenant/user/unlink.js +0 -4
  375. package/dist/src/types/mock/v1/tenant/user/unlink.js.map +0 -1
  376. package/dist/src/types/mock/v1/tenant/user.d.ts +0 -36
  377. package/dist/src/types/mock/v1/tenant/user.d.ts.map +0 -1
  378. package/dist/src/types/mock/v1/tenant/user.js +0 -4
  379. package/dist/src/types/mock/v1/tenant/user.js.map +0 -1
  380. package/dist/src/types/mock/v1/user/avatar.d.ts.map +0 -1
  381. package/dist/src/types/mock/v1/user/avatar.js +0 -4
  382. package/dist/src/types/mock/v1/user/avatar.js.map +0 -1
  383. package/dist/src/types/mock/v1/user/info.d.ts +0 -36
  384. package/dist/src/types/mock/v1/user/info.d.ts.map +0 -1
  385. package/dist/src/types/mock/v1/user/info.js +0 -4
  386. package/dist/src/types/mock/v1/user/info.js.map +0 -1
  387. package/dist/src/types/mock/v1/user/password.d.ts.map +0 -1
  388. package/dist/src/types/mock/v1/user/password.js +0 -4
  389. package/dist/src/types/mock/v1/user/password.js.map +0 -1
  390. package/dist/src/types/mock/v1/user/permissions.d.ts +0 -35
  391. package/dist/src/types/mock/v1/user/permissions.d.ts.map +0 -1
  392. package/dist/src/types/mock/v1/user/permissions.js +0 -4
  393. package/dist/src/types/mock/v1/user/permissions.js.map +0 -1
  394. package/dist/src/types/mock/v1/user/self.d.ts.map +0 -1
  395. package/dist/src/types/mock/v1/user/self.js +0 -4
  396. package/dist/src/types/mock/v1/user/self.js.map +0 -1
  397. package/dist/src/types/mock/v1/user/tenants.d.ts +0 -22
  398. package/dist/src/types/mock/v1/user/tenants.d.ts.map +0 -1
  399. package/dist/src/types/mock/v1/user/tenants.js +0 -4
  400. package/dist/src/types/mock/v1/user/tenants.js.map +0 -1
  401. package/dist/src/types/mock/v1/user.d.ts +0 -35
  402. package/dist/src/types/mock/v1/user.d.ts.map +0 -1
  403. package/dist/src/types/mock/v1/user.js +0 -4
  404. package/dist/src/types/mock/v1/user.js.map +0 -1
  405. package/dist/src/types/v1/tenant/permissions.d.ts +0 -16
  406. package/dist/src/types/v1/tenant/permissions.d.ts.map +0 -1
  407. package/dist/src/types/v1/tenant/permissions.js +0 -4
  408. package/dist/src/types/v1/tenant/permissions.js.map +0 -1
package/README.md CHANGED
@@ -1,1184 +1,509 @@
1
- # Apifox Mock Generator
2
-
3
- [![npm version](https://img.shields.io/npm/v/apifox-mock-generator.svg)](https://www.npmjs.com/package/apifox-mock-generator)
4
-
5
- 从 Apifox 拉取 API 接口并生成本地 Mock 数据和 TypeScript 类型文件的 npm 包。
6
-
7
- ## 🌟 为什么选择这个工具?
8
-
9
- - ⚡ **零配置路由** - 自动发现和加载 Mock 路由,无需手动注册
10
- - 🔥 **即时生效** - 热重载支持,修改 Mock 数据立即生效
11
- - 🎯 **精准控制** - 强大的 API 筛选功能,服务端 + 客户端双重过滤
12
- - 📝 **类型安全** - 自动生成 TypeScript 类型,开发更高效
13
- - 🎨 **代码质量** - 自动格式化,生成的代码符合最佳实践
14
- - 📦 **开箱即用** - 作为 npm 包安装,集成简单
15
-
16
- ## 功能特性
17
-
18
- ### 核心功能
19
-
20
- - 🚀 **Apifox 集成** - 自动从 Apifox 项目拉取 API 接口定义(支持 OpenAPI 3.0)
21
- - 📝 **类型生成** - 生成 TypeScript 类型文件(.ts 格式),支持复杂类型、嵌套对象、枚举等
22
- - 🎭 **Apifox Mock** - **✨ 直接使用 Apifox 的 mock 规则**,无需本地配置,完全继承 Apifox 的数据生成能力
23
- - 🌐 **Mock 服务器** - 基于 Express 的本地 Mock 服务,快速响应,支持 CORS
24
-
25
- ### 高级特性
26
-
27
- - 🔥 **热重载** - 修改 Mock 文件自动生效,无需重启服务器
28
- - 🎯 **API 筛选** - 支持路径、方法、标签、操作 ID 等多维度筛选
29
- - ⚡ **增量更新** - 智能识别文件变化,仅更新必要内容
30
- - 🎨 **代码格式化** - 使用 Prettier 自动格式化生成的代码
31
- - 🔄 **动态路由** - 自动发现和加载 Mock 路由,零配置
32
- - **智能参数校验** - 根据参数来源(query/body)进行差异化校验,符合HTTP协议标准
33
-
34
- ## 📦 安装
35
-
36
- 在你的 Vue/React/任意前端项目中安装:
37
-
38
- ```bash
39
- pnpm add apifox-mock-generator -D
40
- ```
41
-
42
- ## 🚀 快速开始
43
-
44
- ### 前置条件
45
-
46
- 在开始使用之前,请确保满足以下条件:
47
-
48
- - ✅ **Node.js 16+** - 确保已安装 Node.js 16 或更高版本
49
- - ✅ **项目编译** - 运行 `npm run build` 编译 TypeScript 代码
50
- - ✅ **Apifox 配置** - 创建 `apifox.config.json` 配置文件(用于 API 文档同步和 Mock 数据生成)
51
- - ✅ **Mock 配置** - 创建 `mock.config.js` 配置文件(用于 Mock 服务器运行时配置)
52
- - ✅ **Mock 文件生成** - 运行 `npm run generate` 生成 Mock 文件
53
-
54
- ### 1. 创建配置文件
55
-
56
- **创建 Apifox 配置文件** - 用于 API 文档同步和 Mock 数据生成:
57
-
58
- 在你的项目根目录创建 `apifox.config.json`:
59
-
60
- ```json
61
- {
62
- "projectId": "7219799",
63
- "token": "APS-XQrLSqLE4q0FOb0bGhaqYvTxSUQQFPeO",
64
- "mockDir": "./mock",
65
- "typesDir": "./src/types/mock",
66
- "apiFilter": {
67
- "scope": {
68
- "type": "ALL",
69
- "excludedByTags": ["设计中", "已废弃"],
70
- "folderPaths": []
71
- },
72
- "includePaths": [],
73
- "excludePaths": [],
74
- "includeMethods": []
75
- }
76
- }
77
- ```
78
-
79
- **创建 Mock 服务器配置文件** - 用于控制 Mock 服务器运行时行为:
80
-
81
- 创建 `mock.config.js`:
82
-
83
- ```javascript
84
- export default {
85
- model: 'mock',
86
- https: false,
87
- port: 10000,
88
- target: 'http://localhost:8080',
89
- remoteTarget: true,
90
- handleMapPath(req) {
91
- const url = req.req.url.slice(1);
92
- const splitUrl = url.split('/');
93
- const fileName = splitUrl[splitUrl.length - 1].split('?')[0];
94
- const relativePath = splitUrl.splice(0, splitUrl.length - 1).join('/');
95
- return {
96
- relativePath,
97
- fileName
98
- };
99
- }
100
- };
101
- ```
102
-
103
- ### 2. 配置 package.json 脚本
104
-
105
- ```json
106
- {
107
- "scripts": {
108
- "auto-mock": "apifox-mock generate",
109
- "mock": "apifox-mock serve",
110
- "mock:dev": "apifox-mock dev"
111
- }
112
- }
113
- ```
114
-
115
- ### 3. 生成 Mock 和类型文件
116
-
117
- ```bash
118
- pnpm auto-mock
119
- ```
120
-
121
- ### 4. 启动 Mock 服务器
122
-
123
- ```bash
124
- pnpm mock
125
- ```
126
-
127
- > ⚠️ **执行前提条件**:
128
- >
129
- > - 必须先运行 `npm run generate` 生成 Mock 文件
130
- > - 确保 `apifox.config.json` 配置文件存在且配置正确
131
- > - 确保 `mock/` 对应项目根目录存在且包含有效的 Mock 文件
132
-
133
- ### 5. 配置代理(Vite 项目)
134
-
135
- 在 `vite.config.ts` 中:
136
-
137
- ```typescript
138
- export default defineConfig({
139
- server: {
140
- proxy: {
141
- '/api': {
142
- target: 'http://localhost:10000', // 指向 Mock 服务器端口
143
- changeOrigin: true,
144
- rewrite: path => path.replace(/^\/api/, '')
145
- }
146
- }
147
- }
148
- });
149
- ```
150
-
151
- ### 6. 使用生成的类型
152
-
153
- ```typescript
154
- import type { LoginRequest, LoginResponse } from './src/types/api/auth/login';
155
-
156
- const login = async (data: LoginRequest): Promise<LoginResponse> => {
157
- const response = await fetch('/api/auth/login', {
158
- method: 'POST',
159
- body: JSON.stringify(data)
160
- });
161
- return response.json();
162
- };
163
- ```
164
-
165
- ## 🔧 配置说明
166
-
167
- 本项目使用两个配置文件来管理不同的功能:
168
-
169
- ### 📋 配置文件作用
170
-
171
- **1. `apifox.config.json`** - API 文档同步配置
172
-
173
- - **作用**:配置 Apifox 项目信息和生成路径
174
- - **功能**:负责从 Apifox 同步 API 文档,生成 Mock 数据和 TypeScript 类型定义
175
- - **使用时机**:运行 `npm run generate` 时使用
176
-
177
- **2. `mock.config.js`** - Mock 服务器运行时配置
178
-
179
- - **作用**:配置 Mock 服务器的运行时行为
180
- - **功能**:控制服务器端口、工作模式、代理目标等
181
- - **使用时机**:运行 `npm run mock` 时使用
182
-
183
- ### 基础配置
184
-
185
- - `projectId`: Apifox 项目 ID(在项目设置中查看)
186
- - `token`: Apifox API Token(在账号设置中生成)
187
- - `mockDir`: Mock 文件生成目录(默认:`./mock`)
188
- - `typesDir`: TypeScript 类型文件生成目录(默认:`./src/types/api`)
189
- - `apiFilter`: API 筛选配置(可选)
190
-
191
- ### ⚠️ 重要配置说明
192
-
193
- #### 1. Prettier 忽略配置
194
-
195
- **需要将 `mock` 文件夹添加到 `.prettierrc` 的忽略文件中**,主要原因是格式化文件会影响 Mock.js 语法。
196
-
197
- 在项目根目录创建或更新 `.prettierignore` 文件:
198
-
199
- ```bash
200
- # .prettierignore
201
- mock/
202
- ```
203
-
204
- 或者在 `.prettierrc.json` 中添加忽略配置:
205
-
206
- ```json
207
- {
208
- "ignorePath": ".prettierignore"
209
- }
210
- ```
211
-
212
- #### 2. Mock 目录配置
213
-
214
- **⚠️ 重要:`"mockDir": "./mock"` 不要更改**,因为 Mock 服务会去项目目录下查找 `mock` 文件。
215
-
216
- - Mock 服务器启动时会自动扫描项目根目录下的 `mock/` 文件夹
217
- - 如果修改了 `mockDir` 路径,可能导致 Mock 服务无法正确加载数据
218
- - 建议保持默认配置:`"mockDir": "./mock"`
219
-
220
- ### API 筛选配置
221
-
222
- 通过 `apiFilter` 配置项,您可以精确控制需要导出和生成的 API 接口。支持**服务端过滤**(Apifox API)和**客户端过滤**(生成时)。
223
-
224
- #### 完整配置示例
225
-
226
- ```json
227
- {
228
- "projectId": "YOUR_PROJECT_ID",
229
- "token": "YOUR_APIFOX_TOKEN",
230
- "outputDir": "./apifox-output",
231
- "mockDir": "./generated/mock",
232
- "typesDir": "./generated/types",
233
- "apiFilter": {
234
- "scope": {
235
- "type": "ALL",
236
- "excludedByTags": ["设计中", "已废弃"]
237
- },
238
- "includePaths": ["/api/auth/**", "/api/user/**"],
239
- "excludePaths": ["/api/admin/**"],
240
- "includeMethods": ["GET", "POST"]
241
- }
242
- }
243
- ```
244
-
245
- #### 服务端过滤(Apifox API)
246
-
247
- **`scope` 配置** - 控制从 Apifox 导出哪些接口:
248
-
249
- | 参数 | 类型 | 说明 |
250
- | ---------------- | ---------------------------- | --------------------------------------------------------- |
251
- | `type` | `'ALL' \| 'FOLDER' \| 'TAG'` | 导出类型:全部/按文件夹/按标签 |
252
- | `includedByTags` | `string[]` | 包含的标签 |
253
- | `excludedByTags` | `string[]` | 排除的接口状态(支持中文:`设计中`、`已废弃`、`待定` 等) |
254
- | `folderPaths` | `string[]` | 文件夹路径列表(支持多个中文文件夹名称匹配) |
255
-
256
- > 📝 **注意**: 系统默认启用 Apifox 扩展属性和文件夹标签功能,无需额外配置。
257
-
258
- #### 接口状态映射
259
-
260
- `excludedByTags` 支持中文状态配置,系统会自动映射到 Apifox 的英文状态:
261
-
262
- | 中文状态 | 英文状态 | 说明 |
263
- | -------- | ------------ | -------------- |
264
- | `设计中` | `designing` | 接口正在设计中 |
265
- | `开发中` | `developing` | 接口正在开发中 |
266
- | `已完成` | `completed` | 接口开发完成 |
267
- | `已废弃` | `deprecated` | 接口已废弃 |
268
- | `待定` | `pending` | 接口状态待定 |
269
- | `测试中` | `testing` | 接口正在测试 |
270
- | `已发布` | `published` | 接口已发布 |
271
-
272
- #### 客户端过滤(生成时)
273
-
274
- 在生成 Mock 和类型文件时进行二次过滤:
275
-
276
- | 参数 | 类型 | 说明 |
277
- | ---------------- | ---------- | ----------------------------------------- |
278
- | `includePaths` | `string[]` | 只包含这些路径(支持 `*` 和 `**` 通配符) |
279
- | `excludePaths` | `string[]` | 排除这些路径 |
280
- | `includeMethods` | `string[]` | 只包含这些 HTTP 方法 |
281
- | `excludeMethods` | `string[]` | 排除这些 HTTP 方法 |
282
-
283
- #### 常用场景
284
-
285
- **场景 1:导出所有接口,排除已废弃**
286
-
287
- ```json
288
- {
289
- "apiFilter": {
290
- "scope": {
291
- "type": "ALL",
292
- "excludedByTags": ["已废弃"]
293
- }
294
- }
295
- }
296
- ```
297
-
298
- **场景 2:只导出指定文件夹**
299
-
300
- ```json
301
- {
302
- "apiFilter": {
303
- "scope": {
304
- "type": "FOLDER",
305
- "folderPath": "用户模块/用户管理"
306
- }
307
- }
308
- }
309
- ```
310
-
311
- **场景 3:按标签导出**
312
-
313
- ```json
314
- {
315
- "apiFilter": {
316
- "scope": {
317
- "type": "TAG",
318
- "includedByTags": ["用户管理", "商品管理"]
319
- }
320
- }
321
- }
322
- ```
323
-
324
- **场景 4:服务端 + 客户端双重过滤**
325
-
326
- ```json
327
- {
328
- "apiFilter": {
329
- "scope": {
330
- "type": "ALL",
331
- "excludedByTags": ["已废弃"]
332
- },
333
- "includePaths": ["/api/v1/**"],
334
- "excludeMethods": ["DELETE"]
335
- }
336
- }
337
- ```
338
-
339
- ### Mock 服务器配置
340
-
341
- **配置文件**:`mock.config.js`
342
- **主要作用**:控制 Mock 服务器的运行时行为,包括端口、工作模式、代理目标等
343
-
344
- 通过 `mock.config.js` 配置文件,您可以灵活配置 Mock 服务器的行为,支持多种工作模式和动态配置。
345
-
346
- #### 创建 Mock 配置文件
347
-
348
- 在项目根目录创建 `mock.config.js`:
349
-
350
- **基础配置示例**:
351
-
352
- ```javascript
353
- export default {
354
- model: 'mock', // 工作模式
355
- port: 10000, // Mock 服务器端口
356
- target: 'http://localhost:8080', // 后端服务器地址
357
- remoteTarget: true
358
- };
359
- ```
360
-
361
- **完整配置示例**:
362
-
363
- ```javascript
364
- /**
365
- * Mock 服务器配置文件
366
- */
367
-
368
- export default {
369
- // 工作模式:'proxy', 'mock',访问服务器或者访问本地数据。可以在query中写入$_mock,$_proxy定义单个请求
370
- model: 'mock',
371
- // 是否开启https
372
- https: false,
373
- // 本地服务的端口
374
- port: 10000,
375
- // 默认代理至系统测试环境, 请配置本地host
376
- target: 'http://xxx.xxxx.com.cn',
377
- // 开始remote参数, 通过url中remote=xxx来代理多个后端地址, 需要mock直接在url中设置remote=mock即可
378
- remoteTarget: true,
379
- // 处理映射路径
380
- handleMapPath(req) {
381
- const url = req.req.url.slice(1);
382
- const splitUrl = url.split('/');
383
- const fileName = splitUrl[splitUrl.length - 1].split('?')[0];
384
- const relativePath = splitUrl.splice(0, splitUrl.length - 1).join('/');
385
- if (!fileName || !relativePath) {
386
- console.log('无映射路径文件名fileName值: ', fileName);
387
- console.log(
388
- '无映射路径文件路径relativePath值: ',
389
- relativePath || '空映射路径'
390
- );
391
- return {
392
- fileName: fileName || 'fileName',
393
- relativePath: relativePath || './'
394
- };
395
- }
396
- return {
397
- relativePath,
398
- fileName
399
- };
400
- }
401
- };
402
- ```
403
-
404
- #### 配置选项说明
405
-
406
- | 参数 | 类型 | 默认值 | 说明 |
407
- | --------------- | ---------- | ------- | ---------------------------------------------------- |
408
- | `model` | `string` | `mock` | 工作模式:`mock`(本地数据)或 `proxy`(代理到远程) |
409
- | `https` | `boolean` | `false` | 是否开启 HTTPS |
410
- | `port` | `number` | `10000` | Mock 服务器端口 |
411
- | `target` | `string` | - | 远程服务器目标地址(代理模式使用) |
412
- | `remoteTarget` | `boolean` | `true` | 是否支持 URL 参数控制(`?remote=mock`) |
413
- | `handleMapPath` | `function` | - | 路径映射处理函数,用于解析请求路径 |
414
-
415
- #### 工作模式说明
416
-
417
- **1. Mock 模式(默认)**
418
-
419
- - 优先返回本地生成的 Mock 数据
420
- - 适合前端开发阶段
421
-
422
- **2. Proxy 模式**
423
-
424
- - 所有请求转发到 `target` 指定的远程服务器
425
- - 适合联调阶段
426
-
427
- **3. 动态切换**
428
-
429
- - 通过 URL 参数控制单个请求的行为:
430
- - `?$_mock` - 强制使用 Mock 数据
431
- - `?$_proxy` - 强制使用代理
432
- - `?remote=mock` - 使用 Mock 模式
433
-
434
- **4. 智能路由控制(check\_ 函数)**
435
-
436
- 系统支持通过 `check_` 函数实现更精细的路由控制:
437
-
438
- ```javascript
439
- // Mock 文件中定义控制函数
440
- export const check_PostRole = function () {
441
- // true: 使用本地 Mock 数据
442
- // false: 使用远程服务器数据
443
- return false; // 使用远程数据
444
- };
445
- ```
446
-
447
- **工作原理:**
448
-
449
- - 当 `check_` 函数返回 `true` 时,使用本地 Mock 数据
450
- - 当 `check_` 函数返回 `false` 时,尝试使用远程服务器数据
451
- - 如果远程服务器未配置或不可用,自动回退到本地 Mock 数据
452
-
453
- **重要配置说明:**
454
-
455
- ⚠️ **远程服务器配置**:确保 `target` 配置为真实可用的服务器地址
456
-
457
- ```javascript
458
- // mock.config.js
459
- export default {
460
- model: 'mock',
461
- port: 10000,
462
- target: 'http://your-real-api-server.com', // ⚠️ 必须是真实可用的地址
463
- remoteTarget: true
464
- };
465
- ```
466
-
467
- 如果 `target` 配置为占位符地址(如 `http://xxx.xxxx.com.cn`),系统会正确回退到本地 Mock 数据,这是预期的行为。
468
-
469
- ### MockPort、Target 和 Vite Proxy 的关系
470
-
471
- 理解这三个配置项的关系对于正确配置开发环境非常重要:
472
-
473
- #### 配置关系图
474
-
475
- ```
476
- 前端应用 (Vite Dev Server)
477
- (API 请求 /api/v1/xxx)
478
- Vite Proxy 配置
479
- (转发到 mockPort)
480
- Mock 服务器 (mockPort: 10000)
481
- (根据 model 配置)
482
- ├─ Mock 模式: 返回本地数据
483
- └─ Proxy 模式: 代理到 target
484
-
485
- 真实后端服务器 (target: http://xxx.com)
486
- ```
487
-
488
- #### 具体配置示例
489
-
490
- **1. Apifox 配置 (apifox.config.json)**
491
-
492
- ```json
493
- {
494
- "projectId": "YOUR_PROJECT_ID",
495
- "token": "YOUR_TOKEN",
496
- "mockDir": "./mock",
497
- "typesDir": "./src/types/mock"
498
- }
499
- ```
500
-
501
- **2. Vite 代理配置 (vite.config.ts)**
502
-
503
- ```typescript
504
- export default defineConfig({
505
- server: {
506
- proxy: {
507
- '/api': {
508
- target: 'http://localhost:10000', // 指向 Mock 服务器
509
- changeOrigin: true,
510
- rewrite: path => path.replace(/^\/api/, '')
511
- }
512
- }
513
- }
514
- });
515
- ```
516
-
517
- #### 数据流向说明
518
-
519
- 1. **前端请求**: `http://localhost:5173/api/v1/user/info`
520
- 2. **Vite 代理**: 转发到 `http://localhost:10000/v1/user/info`
521
- 3. **Mock 服务器**: 根据 `model` 配置决定:
522
- - `model: 'mock'`: 返回本地生成的 Mock 数据
523
- - `model: 'proxy'`: 代理到 `http://localhost:8080/v1/user/info`
524
-
525
- #### 环境切换示例
526
-
527
- **开发阶段 (Mock 模式)**
528
-
529
- ```javascript
530
- // mock.config.js
531
- export default {
532
- model: 'mock', // 使用本地 Mock 数据
533
- port: 10000,
534
- target: 'http://localhost:8080'
535
- };
536
- ```
537
-
538
- **联调阶段 (Proxy 模式)**
539
-
540
- ```javascript
541
- // mock.config.js
542
- export default {
543
- model: 'proxy', // 代理到真实后端
544
- port: 10000,
545
- target: 'http://test-api.company.com'
546
- };
547
- ```
548
-
549
- **混合模式 (URL 参数控制)**
550
-
551
- ```javascript
552
- // mock.config.js
553
- export default {
554
- model: 'mock', // 默认 Mock 模式
555
- port: 10000,
556
- target: 'http://localhost:8080'
557
- };
558
-
559
- // 使用方式:
560
- // http://localhost:5173/api/v1/user/info -> Mock 数据
561
- // http://localhost:5173/api/v1/user/info?$_proxy -> 真实后端数据
562
- ```
563
-
564
- ### 获取 Apifox Token
565
-
566
- 1. 登录 [Apifox](https://www.apifox.cn/)
567
- 2. 进入「个人设置」→「访问令牌」
568
- 3. 创建新的访问令牌
569
- 4. 复制 Token 到 `apifox.config.json`
570
-
571
- ## 📖 CLI 命令
572
-
573
- 安装后,你可以使用 `apifox-mock` 命令:
574
-
575
- ```bash
576
- # 生成 Mock 和类型文件
577
- apifox-mock generate
578
-
579
- # 启动 Mock 服务器
580
- apifox-mock serve
581
-
582
- # 开发模式(生成 + 服务)
583
- apifox-mock dev
584
- ```
585
-
586
- 或者通过 npm scripts:
587
-
588
- ```bash
589
- npm run auto-mock
590
- npm run mock
591
- npm run mock:dev
592
- ```
593
-
594
- ## 🎯 高级用法
595
-
596
- ### 🔧 智能参数校验
597
-
598
- 本工具采用**智能参数校验策略**,根据参数来源(query参数 vs body参数)进行差异化处理,符合HTTP协议标准。
599
-
600
- #### 校验策略
601
-
602
- | 参数来源 | 类型校验 | 说明 |
603
- | ------------- | -------- | ------------------------------------------- |
604
- | **Query参数** | ❌ 跳过 | URL查询参数永远是字符串,类型转换是后端职责 |
605
- | **Body参数** | ✅ 校验 | 请求体参数支持严格类型校验 |
606
-
607
- #### 工作原理
608
-
609
- ```javascript
610
- // 生成的Mock文件中的参数校验逻辑
611
- let originQuery = options.req.query; // URL查询参数
612
- let bodyParams = JSON.parse(options.data || '{}'); // 请求体参数
613
-
614
- // 合并参数,body参数优先级更高
615
- let apiParams = { ...originQuery, ...bodyParams };
616
-
617
- // 智能校验:只对body参数进行类型校验
618
- if (
619
- apiParams.hasOwnProperty(param.paramKey) &&
620
- bodyParams.hasOwnProperty(param.paramKey)
621
- ) {
622
- // 参数来自body,进行类型校验
623
- if (
624
- lodash[param.paramType] &&
625
- !lodash[param.paramType](apiParams[param.paramKey])
626
- ) {
627
- return { code: 1, msg: '参数类型错误: ' + param.paramKey };
628
- }
629
- }
630
- // query参数跳过类型校验
631
- ```
632
-
633
- #### 实际应用场景
634
-
635
- **场景1:GET请求 - 只有query参数**
636
-
637
- ```javascript
638
- GET /api/users?pageNum=1&pageSize=10
639
- // ✅ pageNum和pageSize跳过类型校验,因为来自URL查询参数
640
- ```
641
-
642
- **场景2:POST请求 - 只有body参数**
643
-
644
- ```javascript
645
- POST /api/users
646
- Body: { "name": "张三", "age": 25 }
647
- // ✅ name和age进行类型校验,因为来自请求体
648
- ```
649
-
650
- **场景3:POST请求 - 混合参数**
651
-
652
- ```javascript
653
- POST /api/users?pageNum=1
654
- Body: { "name": "张三", "age": 25 }
655
- // ✅ pageNum跳过类型校验(来自query),name和age进行类型校验(来自body)
656
- ```
657
-
658
- #### 优势
659
-
660
- - ✅ **符合HTTP标准** - 正确处理URL查询参数的特性
661
- - ✅ **灵活校验** - 支持query和body参数的差异化处理
662
- - ✅ **向后兼容** - 保持必要参数的存在性校验
663
- - ✅ **开发友好** - 避免因query参数类型导致的误报
664
-
665
- ### 🎭 Apifox Mock 规则
666
-
667
- 本工具**直接使用 Apifox 中配置的 mock 规则**,无需在本地重复配置。只需在 Apifox 中设置好字段的 mock 规则,生成时会自动应用。
668
-
669
- #### 工作原理
670
-
671
- 1. **在 Apifox 中配置** - 为每个字段设置 mock 规则(支持 Mock.js 语法和 Apifox 模板语法)
672
- 2. **自动拉取规则** - 工具自动从 Apifox 导出的 OpenAPI 数据中提取 mock 规则
673
- 3. **智能转换** - 自动将 Apifox 模板语法(如 `{{$string.uuid}}`)转换为 Mock.js 语法(如 `@guid`)
674
- 4. **生成 Mock 文件** - 工具自动提取并转换 Apifox 的 mock 规则,生成本地 Mock 文件
675
-
676
- #### 示例
677
-
678
- 在 Apifox 中配置字段的 mock 规则:
679
-
680
- ```
681
- 字段名: id
682
- 类型: string
683
- Mock 规则: {{$string.uuid}} ← Apifox 模板语法
684
-
685
- 字段名: name
686
- 类型: string
687
- Mock 规则: {{$person.fullName(locale='zh_CN')}}
688
-
689
- 字段名: code
690
- 类型: number
691
- Mock 规则: @integer(0, 999) ← Mock.js 语法
692
- ```
693
-
694
- 生成的 Mock 文件会自动转换:
695
-
696
- ```javascript
697
- Mock.mock({
698
- code: '@integer(0, 999)', // 直接使用 Mock.js 规则
699
- data: {
700
- id: '@guid', // {{$string.uuid}} → @guid
701
- name: '@cname', // {{$person.fullName(locale='zh_CN')}} → @cname
702
- email: '@email' // 直接使用 Mock.js 规则
703
- }
704
- });
705
- ```
706
-
707
- #### 优势
708
-
709
- - ✅ **统一管理** - 在 Apifox 中统一管理所有 mock 规则,团队协作更方便
710
- - ✅ **完全一致** - 本地 Mock 数据与 Apifox 云端 Mock 保持一致
711
- - ✅ **智能转换** - 自动转换 Apifox 模板语法为 Mock.js 语法,无缝兼容
712
- - ✅ **双语法支持** - 同时支持 Mock.js 语法(`@xxx`)和 Apifox 模板语法(`{{$xxx}}`)
713
-
714
- #### 回退策略
715
-
716
- 如果字段没有配置 Apifox mock 规则,会使用以下回退策略:
717
-
718
- 1. **示例值** - 使用 schema 中定义的 `example`
719
- 2. **枚举值** - 使用 `enum` 中的值(通过 `@pick` 随机选择)
720
- 3. **基本规则** - 根据字段类型使用简单的默认规则(如字符串用 `@cword(3,8)`)
721
-
722
- ### 自定义 Mock 数据
723
-
724
- 修改生成的 Mock 文件(如 `mock/api/auth/login.js`):
725
-
726
- ```javascript
727
- export default {
728
- method: 'POST',
729
- path: '/api/auth/login',
730
- response: {
731
- code: 0,
732
- message: 'success',
733
- data: {
734
- token: 'custom-token-12345', // 自定义数据
735
- userId: 10086
736
- }
737
- }
738
- };
739
- ```
740
-
741
- > ⚠️ 注意:重新运行 `apifox-mock generate` 会覆盖自定义的修改
742
-
743
- ### 热重载
744
-
745
- Mock 服务器支持热重载,修改 Mock 文件后会自动生效,无需重启:
746
-
747
- ```bash
748
- npm run mock:serve
749
- # 修改 mock 文件,保存后立即生效
750
- ```
751
-
752
- ## 🔄 工作流程
753
-
754
- ### 架构说明
755
-
756
- 作为 npm 包安装到你的项目中,工作模式如下:
757
-
758
- ```
759
- ┌─────────────────────────────────────────────────────────────┐
760
- │ 你的前端项目 (如 Vue) │
761
- ├─────────────────────────────────────────────────────────────┤
762
- │ │
763
- │ ┌──────────────────────────────────────────────────────┐ │
764
- │ │ Apifox 平台 │ │
765
- │ │ OpenAPI 数据 │ │
766
- │ └───────────────┬──────────────────────────────────────┘ │
767
- │ │ ① 拉取 API │
768
- │ ↓ │
769
- │ ┌──────────────────────────────────────────────────────┐ │
770
- │ │ apifox-mock-generator (npm 包) │ │
771
- │ │ • apifox-mock generate - 生成文件 │ │
772
- │ │ • apifox-mock serve - 启动服务器 │ │
773
- │ └───────────────┬──────────────────────────────────────┘ │
774
- │ │ ② 生成 │
775
- │ ↓ │
776
- │ ┌──────────────────────────────────────────────────────┐ │
777
- │ │ 配置文件 │ │
778
- │ │ • apifox.config.json - API 生成配置 │ │
779
- │ │ • mock.config.js - Mock 服务器配置 │ │
780
- │ └───────────────┬──────────────────────────────────────┘ │
781
- │ │ ③ 生成 │
782
- │ ↓ │
783
- │ ┌──────────────────────────────────────────────────────┐ │
784
- │ │ 生成的文件 │ │
785
- │ │ • mock/ - Mock 数据文件 │ │
786
- │ │ • src/types/api/ - TypeScript 类型 │ │
787
- │ └──────┬───────────────────────────────────────────┬───┘ │
788
- │ │ │ │
789
- │ │ ④ 导入类型 │ ⑤ HTTP 请求
790
- │ ↓ ↓ │
791
- │ ┌─────────────────┐ ┌─────────────────┐ │
792
- │ │ 前端代码 │ Vite Proxy │ Mock 服务器 │ │
793
- │ │ (localhost:5173)│ ─────────────> │ (localhost:10000)│ │
794
- │ │ │ /api/** │ │ │
795
- │ │ • 业务逻辑 │ │ • 工作模式切换 │ │
796
- │ │ • API 调用 │ <───────────── │ • Mock/Proxy │ │
797
- │ │ • TS 类型 │ 响应数据 │ • 热重载 │ │
798
- │ └─────────────────┘ └─────────┬───────┘ │
799
- │ │ │
800
- │ │ ⑥ 代理 │
801
- │ ↓ │
802
- │ ┌─────────────┐ │
803
- │ │ 真实后端 │ │
804
- │ │ (target) │ │
805
- │ └─────────────┘ │
806
- └─────────────────────────────────────────────────────────────┘
807
- ```
808
-
809
- ### 详细步骤
810
-
811
- #### 1️⃣ 安装并配置
812
-
813
- ```bash
814
- # 在你的 Vue 项目目录
815
- npm install apifox-mock-generator --save-dev
816
-
817
- # 创建 Apifox 配置文件
818
- vim apifox.config.json
819
-
820
- # 创建 Mock 服务器配置文件
821
- vim mock.config.js
822
-
823
- # 配置 package.json
824
- ```
825
-
826
- #### 2️⃣ 生成文件
827
-
828
- ```bash
829
- npm run mock:generate
830
- ```
831
-
832
- 执行过程:
833
-
834
- - 从 Apifox 拉取 API 定义
835
- - 应用筛选规则
836
- - 生成 TypeScript 类型 → `src/types/api/`
837
- - 生成 Mock 数据 → `mock/`
838
-
839
- #### 3️⃣ 启动 Mock 服务器
840
-
841
- ```bash
842
- npm run mock:serve
843
- ```
844
-
845
- Mock 服务器会根据 `mock.config.js` 配置启动在指定端口(默认 10000)。
846
-
847
- #### 4️⃣ 配置前端代理
848
-
849
- ```typescript
850
- // vite.config.ts
851
- export default defineConfig({
852
- server: {
853
- proxy: {
854
- '/api': {
855
- target: 'http://localhost:10000', // 指向 Mock 服务器端口
856
- changeOrigin: true,
857
- rewrite: path => path.replace(/^\/api/, '')
858
- }
859
- }
860
- }
861
- });
862
- ```
863
-
864
- #### 5️⃣ 环境切换
865
-
866
- **开发阶段 (Mock 模式)**
867
-
868
- ```javascript
869
- // mock.config.js
870
- export default {
871
- model: 'mock', // 使用本地 Mock 数据
872
- port: 10000,
873
- target: 'http://localhost:8080'
874
- };
875
- ```
876
-
877
- **联调阶段 (Proxy 模式)**
878
-
879
- ```javascript
880
- // mock.config.js
881
- export default {
882
- model: 'proxy', // 代理到真实后端
883
- port: 10000,
884
- target: 'http://test-api.company.com'
885
- };
886
- ```
887
-
888
- #### 6️⃣ 在代码中使用
889
-
890
- ```typescript
891
- // 导入类型
892
- import type { LoginRequest, LoginResponse } from '@/types/api/auth/login';
893
-
894
- // 发起请求(自动代理到 Mock 服务器)
895
- const response = await fetch('/api/auth/login', {
896
- method: 'POST',
897
- body: JSON.stringify(data)
898
- });
899
- ```
900
-
901
- ### 项目结构
902
-
903
- 安装后,你的项目结构:
904
-
905
- ```
906
- your-vue-project/
907
- ├── node_modules/
908
- │ └── apifox-mock-generator/ # npm 包
909
- ├── src/
910
- │ ├── types/
911
- │ │ └── api/ # ✨ 生成的类型文件
912
- │ │ ├── auth/
913
- │ │ │ └── login.ts
914
- │ │ └── user/
915
- │ │ └── info.ts
916
- │ └── components/
917
- ├── mock/ # ✨ 生成的 Mock 文件
918
- │ └── api/
919
- │ ├── auth/
920
- │ │ └── login.js
921
- │ └── user/
922
- │ └── info.js
923
- ├── apifox.config.json # ⚙️ 配置文件
924
- ├── mock.config.js # ⚙️ 配置文件
925
- ├── vite.config.ts # 配置代理
926
- └── package.json
927
- ```
928
-
929
- ### 优势
930
-
931
- ✅ **集成简单** - 作为 npm 包安装,无需单独项目
932
- ✅ **类型安全** - 生成的类型文件直接在项目中使用
933
- ✅ **真实环境** - 通过 HTTP Mock,完全模拟真实 API
934
- ✅ **热重载** - 修改 Mock 数据立即生效
935
- ✅ **团队协作** - 配置和类型可以提交到 Git 共享
936
-
937
- ## 📁 项目结构
938
-
939
- ```
940
- apifox-mock-generator/
941
- ├── src/ # 源代码
942
- │ ├── core/ # 核心模块
943
- │ │ ├── apifox-client.ts # Apifox API 客户端
944
- │ │ ├── config-loader.ts # 配置加载器
945
- │ │ ├── endpoint-filter.ts # 端点过滤器
946
- │ │ └── openapi-converter.ts # OpenAPI 转换器
947
- │ ├── generators/ # 生成器模块
948
- │ │ ├── templates/ # 模板生成
949
- │ │ │ ├── mock-template.ts # Mock 文件模板(使用 Apifox mock 规则)
950
- │ │ │ └── type-template.ts # TypeScript 类型模板
951
- │ │ ├── mock-generator.ts # Mock 文件生成器
952
- │ │ └── type-generator.ts # 类型文件生成器
953
- │ ├── server/ # Mock 服务器模块
954
- │ │ ├── express-server.ts # Express 服务器配置
955
- │ │ ├── hot-reload.ts # 热重载功能
956
- │ │ ├── route-loader.ts # 路由加载器
957
- │ │ ├── route-manager.ts # 路由管理器
958
- │ │ ├── route-matcher.ts # 路由匹配器
959
- │ │ └── validation.ts # 参数校验
960
- │ ├── utils/ # 工具函数
961
- │ │ ├── block-updater.ts # 增量更新工具
962
- │ │ ├── code-formatter.ts # 代码格式化
963
- │ │ ├── file-operations.ts # 文件操作
964
- │ │ ├── file-helper.ts # 文件助手(统一导出)
965
- │ │ ├── logger.ts # 日志工具
966
- │ │ ├── path-utils.ts # 路径工具
967
- │ │ └── type-mapping.ts # 类型映射
968
- │ ├── scripts/ # 脚本入口
969
- │ │ ├── generate-mock.ts # 生成脚本主入口
970
- │ │ └── serve-mock.ts # 服务器脚本主入口
971
- │ ├── types/ # 类型定义
972
- │ │ └── index.ts # 公共类型
973
- │ └── index.ts # 包入口文件
974
- ├── generated/ # 生成的文件(自动)
975
- │ ├── mock/ # Mock 数据
976
- │ └── types/ # TypeScript 类型
977
- ├── dist/ # 编译输出
978
- ├── apifox.config.json # 配置文件
979
- ├── package.json
980
- └── tsconfig.json
981
- ```
982
-
983
- ### 🏗️ 架构设计
984
-
985
- 项目采用**模块化分层架构**,职责清晰分离:
986
-
987
- | 层级 | 目录 | 职责 |
988
- | ---------- | ------------- | --------------------------------------------- |
989
- | **核心层** | `core/` | Apifox API 交互、配置加载、OpenAPI 转换和过滤 |
990
- | **生成层** | `generators/` | Mock 和 TypeScript 类型生成、代码模板 |
991
- | **服务层** | `server/` | Express 服务器、动态路由、热重载、参数校验 |
992
- | **工具层** | `utils/` | 文件操作、增量更新、代码格式化、日志输出 |
993
- | **脚本层** | `scripts/` | CLI 命令入口(generate、serve) |
994
- | **类型层** | `types/` | 公共 TypeScript 类型定义 |
995
-
996
- ## 🛠️ 脚本说明
997
-
998
- | 命令 | 说明 |
999
- | ------------------ | ------------------------------------------- |
1000
- | `npm run build` | 编译 TypeScript 代码 |
1001
- | `npm run generate` | 一键生成(拉取 API + 生成 Mock + 生成类型) |
1002
- | `npm run serve` | 启动 Mock 服务器 |
1003
- | `npm run dev` | 开发模式(generate + serve) |
1004
-
1005
- ## 📚 技术栈
1006
-
1007
- - **语言**: TypeScript 5.3+
1008
- - **运行时**: Node.js 16+
1009
- - **Web 框架**: Express 4.x
1010
- - **HTTP 客户端**: Axios
1011
- - **Mock 数据**: @faker-js/faker, Mock.js
1012
- - **文件监听**: Chokidar
1013
- - **代码格式化**: Prettier
1014
- - **日志工具**: Chalk
1015
- - **API 工具**: Apifox CLI
1016
-
1017
- ## ⚠️ 已知限制
1018
-
1019
- 当前版本暂不支持以下特性:
1020
-
1021
- - ⚠️ OpenAPI 2.0 (Swagger) - 仅支持 OpenAPI 3.0
1022
- - ⚠️ 文件上传/下载类型
1023
- - ⚠️ WebSocket 协议
1024
- - ⚠️ GraphQL
1025
-
1026
- ## 💡 常见问题
1027
-
1028
- ### 1. 拉取 API 失败?
1029
-
1030
- 检查:
1031
-
1032
- - `projectId` 和 `token` 是否正确
1033
- - Token 是否有「项目维护者」或「管理员」权限
1034
- - 网络连接是否正常
1035
-
1036
- ### 2. 端口被占用?
1037
-
1038
- 修改 `mock.config.js` 中的 `port` 配置。
1039
-
1040
- ### 3. 没有生成任何文件?
1041
-
1042
- 检查:
1043
-
1044
- - `apiFilter` 筛选规则是否过于严格
1045
- - Apifox 项目中是否有匹配的接口
1046
- - 查看终端输出的错误信息
1047
- - 确认 Apifox Token 是否有正确的权限
1048
-
1049
- ### 4. 类型生成不准确?
1050
-
1051
- 建议:
1052
-
1053
- - 在 Apifox 中完善接口的数据模型定义
1054
- - 使用 JSON Schema 定义清晰的数据结构
1055
- - 为每个字段添加描述和示例
1056
-
1057
- ### 5. 热重载不生效?
1058
-
1059
- 确认:
1060
-
1061
- - Mock 文件保存成功
1062
- - 查看终端是否有文件变化的提示
1063
- - 检查文件路径是否在 `mockDir` 配置的目录下
1064
-
1065
- ### 6. 启动 Mock 服务器失败?
1066
-
1067
- 检查以下条件:
1068
-
1069
- - ✅ **配置文件存在** - 确保 `apifox.config.json` 在项目根目录
1070
- - ✅ **Mock 目录存在** - 确保 `mock/` 目录存在且不为空
1071
- - ✅ **项目已编译** - 运行 `npm run build` 编译代码
1072
- - ✅ **Mock 文件已生成** - 先运行 `npm run generate` 生成 Mock 文件
1073
- - ✅ **端口未被占用** - 检查 `mock.config.js` 中 `port` 配置的端口是否可用
1074
-
1075
- 常见错误及解决方案:
1076
-
1077
- ```bash
1078
- # 错误:未找到 apifox.config.json 配置文件
1079
- # 解决:创建配置文件
1080
- cp apifox.config.json.example apifox.config.json
1081
-
1082
- # 错误:未找到 Mock 目录
1083
- # 解决:先生成 Mock 文件
1084
- npm run generate
1085
-
1086
- # 错误:未找到任何 Mock 文件
1087
- # 解决:检查 API 筛选配置,确保有匹配的接口
1088
- ```
1089
-
1090
- ### 7. check\_ 函数不生效?
1091
-
1092
- **问题现象:** 配置了 `check_` 函数但似乎没有生效
1093
-
1094
- **解决方案:**
1095
-
1096
- 1. **检查函数命名**:确保函数名格式正确
1097
-
1098
- ```javascript
1099
- // ✅ 正确格式
1100
- export const check_PostRole = function () {
1101
- return false; // 使用远程数据
1102
- };
1103
-
1104
- // ❌ 错误格式
1105
- export const checkPostRole = function () { ... }
1106
- ```
1107
-
1108
- 2. **检查远程服务器配置**:
1109
-
1110
- ```javascript
1111
- // mock.config.js
1112
- export default {
1113
- target: 'http://your-real-api-server.com', // ⚠️ 必须是真实可用的地址
1114
- remoteTarget: true
1115
- };
1116
- ```
1117
-
1118
- 3. **验证函数返回值**:
1119
- - `return true` - 使用本地 Mock 数据
1120
- - `return false` - 使用远程服务器数据
1121
-
1122
- 4. **检查控制台输出**:函数被调用时会有日志输出
1123
- ```javascript
1124
- export const check_PostRole = function () {
1125
- console.log('🔍 check_PostRole 被调用了!');
1126
- return false;
1127
- };
1128
- ```
1129
-
1130
- **重要说明:** 如果 `target` 配置为占位符地址(如 `http://xxx.xxxx.com.cn`),系统会正确回退到本地 Mock 数据,这是预期的行为。要真正测试远程代理功能,需要配置真实可用的服务器地址。
1131
-
1132
- ### 💡 最佳实践
1133
-
1134
- | 场景 | 建议 |
1135
- | ------------- | -------------------------------------------------------- |
1136
- | **配置文件** | 首次配置好提交上库之后,apiFilter配置不提交上库 |
1137
- | **类型文件** | 建议提交到 Git,团队共享类型定义 |
1138
- | **Mock 数据** | apifox接口有变化时,若对应业务有调整,mock需一并提交处理 |
1139
- | **切换环境** | 后端完成后只需修改代理配置,代码无需改动 |
1140
-
1141
- ## 📝 更新日志
1142
-
1143
- 详见 [CHANGELOG.md](./CHANGELOG.md) 获取完整更新日志。
1144
- `
1145
-
1146
- ## 🤝 贡献
1147
-
1148
- 欢迎贡献代码、报告问题或提出建议!
1149
-
1150
- 1. Fork 本仓库
1151
- 2. 创建特性分支 (`git checkout -b feature/AmazingFeature`)
1152
- 3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
1153
- 4. 推送到分支 (`git push origin feature/AmazingFeature`)
1154
- 5. 创建 Pull Request
1155
-
1156
- ## 📄 License
1157
-
1158
- MIT License
1159
-
1160
- Copyright (c) 2025
1161
-
1162
- Permission is hereby granted, free of charge, to any person obtaining a copy
1163
- of this software and associated documentation files (the "Software"), to deal
1164
- in the Software without restriction, including without limitation the rights
1165
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1166
- copies of the Software, and to permit persons to whom the Software is
1167
- furnished to do so, subject to the following conditions:
1168
-
1169
- The above copyright notice and this permission notice shall be included in all
1170
- copies or substantial portions of the Software.
1171
-
1172
- ## 🙏 致谢
1173
-
1174
- - [Apifox](https://www.apifox.cn/) - API 设计、开发、测试一体化协作平台
1175
- - [Express](https://expressjs.com/) - 快速的 Node.js Web 框架
1176
- - [TypeScript](https://www.typescriptlang.org/) - JavaScript 的超集
1177
- - [@faker-js/faker](https://fakerjs.dev/) - 生成真实感测试数据
1178
- - [Chalk](https://github.com/chalk/chalk) - 终端彩色输出
1179
-
1180
- ---
1181
-
1182
- 如有问题或建议,欢迎提 [Issue](https://github.com/lukemora/apifox-mock-generator/issues)!
1183
-
1184
- ⭐ 如果这个项目对你有帮助,请给一个 Star!
1
+ # Apifox Mock Generator
2
+
3
+ [![npm version](https://img.shields.io/npm/v/apifox-mock-generator.svg)](https://www.npmjs.com/package/apifox-mock-generator)
4
+
5
+ 从 Apifox 拉取 API 接口并生成本地 Mock 数据和 TypeScript 类型文件的 npm 包。
6
+
7
+ ## 功能特性
8
+
9
+ ### 核心功能
10
+
11
+ - 🚀 **Apifox 集成** - 自动从 Apifox 项目拉取 API 接口定义(支持 OpenAPI 3.0)
12
+ - 📝 **类型生成** - 生成 TypeScript 类型文件(.ts 格式),支持复杂类型、嵌套对象、枚举等
13
+ - 🎭 **Apifox Mock** - **✨ 直接使用 Apifox 的 mock 规则**,无需本地配置,完全继承 Apifox 的数据生成能力
14
+ - 🌐 **Mock 服务器** - 基于 Express 的本地 Mock 服务,快速响应,支持 CORS
15
+ - 🎯 **灵活切换** - 支持接口精细控制 Mock/Proxy 模式
16
+ - 🔄 **动态代理** - 通过页面 URL 参数快速切换后端环境,无需修改配置
17
+
18
+ ## 📦 安装
19
+
20
+ 在你的任意前端项目中安装:
21
+
22
+ ```bash
23
+ pnpm add apifox-mock-generator -D
24
+
25
+ pnpm add apifox-mock-generator -D -W
26
+ ```
27
+
28
+ ## 🚀 快速开始
29
+
30
+ ### 1. 创建配置文件
31
+
32
+ **创建 Apifox 配置文件** - 用于 API 文档同步和 Mock 数据生成:
33
+
34
+ 在你的项目根目录创建 `apifox.config.json`:
35
+
36
+ ```json
37
+ {
38
+ "projectId": "7219799",
39
+ "token": "APS-XQrLSqLE4q0FOb0bGhaqYvTxSUQQFPeO",
40
+ "mockDir": "./mock",
41
+ "typesDir": "./src/types/mock",
42
+ "generate": "all",
43
+ "apiFilter": {
44
+ "scope": {
45
+ "excludedByTags": ["设计中", "已废弃"],
46
+ "folderPaths": []
47
+ },
48
+ "includePaths": [],
49
+ "excludePaths": [],
50
+ "includeMethods": []
51
+ }
52
+ }
53
+ ```
54
+
55
+ **创建 Mock 服务器配置文件** - 用于控制 Mock 服务器运行时行为:
56
+
57
+ 创建 `mock.config.js`:
58
+
59
+ ```javascript
60
+ export default {
61
+ model: 'mock',
62
+ https: false,
63
+ port: 10000,
64
+ target: 'http://localhost:8080',
65
+ remoteTarget: true,
66
+ mockRoutes: [],
67
+ proxyRoutes: []
68
+ };
69
+ ```
70
+
71
+ ### 2. 配置 package.json 脚本
72
+
73
+ ```json
74
+ {
75
+ "scripts": {
76
+ "auto-mock": "apifox-mock generate",
77
+ "mock": "apifox-mock serve"
78
+ }
79
+ }
80
+ ```
81
+
82
+ ### 3. 生成 Mock 和类型文件
83
+
84
+ ```bash
85
+ pnpm auto-mock
86
+ ```
87
+
88
+ ### 4. 启动 Mock 服务器
89
+
90
+ ```bash
91
+ pnpm mock
92
+ ```
93
+
94
+ ### 5. 配置代理(Vite 项目)
95
+
96
+ 在 `vite.config.ts` 中:
97
+
98
+ ```typescript
99
+ export default defineConfig({
100
+ server: {
101
+ proxy: {
102
+ '/api': {
103
+ target: 'http://localhost:10000', // 指向 Mock 服务器端口(10000为mock.config.js 中的port)
104
+ changeOrigin: true,
105
+ rewrite: path => path.replace(/^\/api/, '')
106
+ }
107
+ }
108
+ }
109
+ });
110
+ ```
111
+
112
+ ### 6. 使用生成的类型
113
+
114
+ ```typescript
115
+ import type { DatamaskRuleAddPost } from './src/types/api/auth/login';
116
+
117
+ const login = async (
118
+ data: DatamaskRuleAddPost.ReqData
119
+ ): Promise<DatamaskRuleAddPost.Res> => {
120
+ const response = await fetch('/api/auth/login', {
121
+ method: 'POST',
122
+ body: JSON.stringify(data)
123
+ });
124
+ return response.json();
125
+ };
126
+ ```
127
+
128
+ ## 🔧 配置说明
129
+
130
+ 本项目使用两个配置文件来管理不同的功能:
131
+
132
+ ### 📋 配置文件作用
133
+
134
+ **1. `apifox.config.json`** - API 文档同步配置
135
+
136
+ - **作用**:配置 Apifox 项目信息和生成路径
137
+ - **功能**:负责从 Apifox 同步 API 文档,生成 Mock 数据和 TypeScript 类型定义
138
+ - **使用时机**:运行 `pnpm auto-mock` 时使用
139
+
140
+ **2. `mock.config.js`** - Mock 服务器运行时配置
141
+
142
+ - **作用**:配置 Mock 服务器的运行时行为
143
+ - **功能**:控制服务器端口、工作模式、代理目标等
144
+ - **使用时机**:运行 `pnpm mock` 时使用
145
+
146
+ ### apifox基础配置
147
+
148
+ - `projectId`: Apifox 项目 ID(在项目设置中查看)
149
+ - `token`: Apifox API Token(在账号设置中生成, 需账号在当前项目中有管理员及以上权限)
150
+ - `branchId`: 项目分支名称(number类型,有key则必须有值)
151
+ - `mockDir`: Mock 文件生成目录(默认:`./mock`)
152
+ - `typesDir`: TypeScript 类型文件生成目录(默认:`./src/types/mock`)
153
+ - `generate`: 生成范围(可选,默认 `all`)。可选值:
154
+ - `all` 同时生成 Mock TS 类型
155
+ - `mock` 只生成 Mock 文件
156
+ - `types` 只生成 TS 类型
157
+ - `apiFilter`: API 筛选配置(可选)
158
+
159
+ #### branchId 获取方法
160
+
161
+ ![branchId获取图解](./img/branchId.png)
162
+
163
+ #### API 筛选配置
164
+
165
+ 通过 `apiFilter` 配置项,您可以精确控制需要导出和生成的 API 接口。
166
+
167
+ **`scope` 配置** - 导出范围配置:
168
+
169
+ | 参数 | 类型 | 说明 |
170
+ | ---------------- | ---------- | ---------------------------------------------------------------- |
171
+ | `includedByTags` | `string[]` | 包含的标签列表 |
172
+ | `excludedByTags` | `string[]` | 排除的接口状态(支持中文:`设计中`、`已废弃`、`待确定` 等) |
173
+ | `folderPaths` | `string[]` | 文件夹路径列表(支持多个中文文件夹名称匹配,支持前缀匹配子目录) |
174
+
175
+ **其他过滤配置**:
176
+
177
+ | 参数 | 类型 | 说明 |
178
+ | ---------------- | ---------- | ----------------------------------------- |
179
+ | `includePaths` | `string[]` | 只包含这些路径(支持 `*` 和 `**` 通配符) |
180
+ | `excludePaths` | `string[]` | 排除这些路径(支持 `*` 和 `**` 通配符) |
181
+ | `includeMethods` | `string[]` | 只包含这些 HTTP 方法 |
182
+ | `excludeMethods` | `string[]` | 排除这些 HTTP 方法 |
183
+
184
+ ### Mock 服务器配置
185
+
186
+ **配置文件**:`mock.config.js`
187
+ **主要作用**:控制 Mock 服务器的运行时行为,包括端口、工作模式、代理目标等
188
+
189
+ 通过 `mock.config.js` 配置文件,您可以灵活配置 Mock 服务器的行为,支持多种工作模式和动态配置。
190
+
191
+ #### 配置选项说明
192
+
193
+ | 参数 | 类型 | 默认值 | 说明 |
194
+ | -------------- | ---------- | ------- | ------------------------------------------------------- |
195
+ | `model` | `string` | `mock` | 工作模式:`mock`(本地数据)或 `proxy`(代理到远程) |
196
+ | `https` | `boolean` | `false` | 是否开启 HTTPS |
197
+ | `port` | `number` | `10000` | Mock 服务器端口 |
198
+ | `target` | `string` | - | 远程服务器目标地址(代理模式使用) |
199
+ | `remoteTarget` | `boolean` | `true` | 是否支持页面 URL 参数控制(`?remote=mock/https://xxx`) |
200
+ | `mockRoutes` | `string[]` | `[]` | 强制使用 Mock 的路由列表(可选) |
201
+ | `proxyRoutes` | `string[]` | `[]` | 强制使用 Proxy 的路由列表(可选) |
202
+
203
+ #### 工作模式说明
204
+
205
+ **1. Mock 模式(默认)**
206
+
207
+ - 优先返回本地生成的 Mock 数据
208
+ - 适合前端开发阶段
209
+
210
+ **2. Proxy 模式**
211
+
212
+ - 所有请求转发到 `target` 指定的远程服务器
213
+ - 适合联调阶段
214
+
215
+ **3. 页面级控制(推荐)**
216
+
217
+ - 通过页面 URL `?remote` 参数控制所有接口:
218
+ - `?remote=mock` - 所有接口使用 Mock 数据
219
+ - `?remote=https://api.test.com` - 所有接口代理到指定地址
220
+ - 无需修改每个接口调用,自动从 Referer 识别
221
+
222
+ **4. 按接口粒度控制**
223
+
224
+ 通过 `mockRoutes` 和 `proxyRoutes` 配置实现精细控制:
225
+
226
+ ```javascript
227
+ // mock.config.js
228
+ export default {
229
+ model: 'proxy', // 联调环境默认直连
230
+ port: 10000,
231
+ target: 'http://api.dev.company.com',
232
+ remoteTarget: true,
233
+
234
+ // 这些接口强制使用 Mock(即使 model='proxy')
235
+ mockRoutes: [
236
+ '/auth/login', // 匹配所有方法
237
+ 'GET /user/info' // 只匹配 GET 方法
238
+ ],
239
+
240
+ // 这些接口强制直连后端(即使 model='mock')
241
+ proxyRoutes: ['POST /payment/pay', '/health']
242
+ };
243
+ ```
244
+
245
+ **优先级规则:**
246
+
247
+ ```
248
+ 页面 remote > mockRoutes/proxyRoutes > model
249
+ ```
250
+
251
+ ### ⚠️ 重要配置说明
252
+
253
+ #### 1. Prettier 忽略配置
254
+
255
+ **需要将 `mock` 文件夹添加到 `.prettierrc` 的忽略文件中**,主要原因是格式化文件会影响 Mock.js 语法。
256
+
257
+ 在项目根目录创建或更新 `.prettierignore` 文件:
258
+
259
+ ```bash
260
+ # .prettierignore
261
+ mock/
262
+ ```
263
+
264
+ #### 2. Mock 目录配置
265
+
266
+ **⚠️ 重要:`"mockDir": "./mock"` 不要更改**,因为 Mock 服务会去项目目录下查找 `mock` 文件。
267
+
268
+ - Mock 服务器启动时会自动扫描项目根目录下的 `mock/` 文件夹
269
+ - 如果修改了 `mockDir` 路径,可能导致 Mock 服务无法正确加载数据
270
+ - 建议保持默认配置:`"mockDir": "./mock"`
271
+
272
+ ### MockPort、Target 和 Vite Proxy 的关系
273
+
274
+ 理解这三个配置项的关系对于正确配置开发环境非常重要:
275
+
276
+ #### 配置关系图
277
+
278
+ ```
279
+ 前端应用 (Vite Dev Server)
280
+ (API 请求 /api/v1/xxx)
281
+ Vite Proxy 配置
282
+ ↓ (转发到 mockPort)
283
+ Mock 服务器 (mockPort: 10000)
284
+ ↓ (根据 model 配置)
285
+ ├─ Mock 模式: 返回本地数据
286
+ └─ Proxy 模式: 代理到 target
287
+
288
+ 真实后端服务器 (target: http://xxx.com)
289
+ ```
290
+
291
+ #### 数据流向说明
292
+
293
+ 1. **前端请求**: `http://localhost:5173/api/v1/user/info`
294
+ 2. **Vite 代理**: 转发到 `http://localhost:10000/v1/user/info`
295
+ 3. **Mock 服务器**: 根据 `model` 配置决定:
296
+ - `model: 'mock'`: 返回本地生成的 Mock 数据
297
+ - `model: 'proxy'`: 代理到 `http://localhost:8080/v1/user/info`
298
+
299
+ ### 🎭 Apifox Mock 规则
300
+
301
+ #### 工作原理
302
+
303
+ 1. **在 Apifox 中配置** - 为每个字段设置 mock 规则(支持 Mock.js 语法和 Apifox 模板语法)
304
+ 2. **自动拉取规则** - 工具自动从 Apifox 导出的 OpenAPI 数据中提取 mock 规则
305
+ 3. **智能转换** - 自动将 Apifox 模板语法(如 `{{$string.uuid}}`)转换为 Mock.js 语法(如 `@guid`)
306
+ 4. **生成 Mock 文件** - 工具自动提取并转换 Apifox 的 mock 规则,生成本地 Mock 文件
307
+
308
+ #### 回退策略
309
+
310
+ 如果字段没有配置 Apifox mock 规则,会使用以下回退策略:
311
+
312
+ 1. **示例值** - 使用 schema 中定义的 `example`(字段示例值)
313
+ 2. **枚举值** - 使用 `enum` 中的值(通过 `@pick` 随机选择)
314
+ 3. **基本规则** - 根据字段类型使用简单的默认规则(如字符串用 `@cword(3,8)`)
315
+
316
+ ### 自定义 Mock 数据
317
+
318
+ 修改生成的 Mock 文件(如 `mock/api/auth/login.js`):
319
+
320
+ ```javascript
321
+ export default {
322
+ method: 'POST',
323
+ path: '/api/auth/login',
324
+ response: {
325
+ code: 0,
326
+ message: 'success',
327
+ data: {
328
+ token: 'custom-token-12345', // 自定义数据
329
+ userId: 10086
330
+ }
331
+ }
332
+ };
333
+ ```
334
+
335
+ > ⚠️ 注意:重新运行 `apifox-mock generate` 会覆盖自定义的修改
336
+
337
+ ## 🔄 工作流程
338
+
339
+ 作为 npm 包安装到你的项目中,工作模式如下:
340
+
341
+ ```
342
+ ┌─────────────────────────────────────────────────────────────┐
343
+ │ 你的前端项目 (如 Vue) │
344
+ ├─────────────────────────────────────────────────────────────┤
345
+ │ │
346
+ │ ┌──────────────────────────────────────────────────────┐ │
347
+ │ │ Apifox 平台 │ │
348
+ │ │ OpenAPI 数据 │ │
349
+ │ └───────────────┬──────────────────────────────────────┘ │
350
+ │ │ ① 拉取 API │
351
+ │ ↓ │
352
+ │ ┌──────────────────────────────────────────────────────┐ │
353
+ │ │ apifox-mock-generator (npm 包) │ │
354
+ │ • apifox-mock generate - 生成文件 │ │
355
+ │ • apifox-mock serve - 启动服务器 │ │
356
+ └───────────────┬──────────────────────────────────────┘ │
357
+ │ │ ② 生成 │
358
+ │ ↓ │
359
+ │ ┌──────────────────────────────────────────────────────┐ │
360
+ │ │ 配置文件 │ │
361
+ │ │ • apifox.config.json - API 生成配置 │ │
362
+ │ │ • mock.config.js - Mock 服务器配置 │ │
363
+ │ └───────────────┬──────────────────────────────────────┘ │
364
+ │ │ ③ 生成 │
365
+ │ ↓ │
366
+ │ ┌──────────────────────────────────────────────────────┐ │
367
+ │ │ 生成的文件 │ │
368
+ │ │ • mock/ - Mock 数据文件 │ │
369
+ │ • src/types/mock/ - TypeScript 类型 │ │
370
+ └──────┬───────────────────────────────────────────┬───┘ │
371
+ │ │ │ │
372
+ │ │ ④ 导入类型 │ ⑤ HTTP 请求
373
+ │ ↓ ↓ │
374
+ ┌─────────────────┐ ┌─────────────────┐ │
375
+ │ 前端代码 │ Vite Proxy │ Mock 服务器 │ │
376
+ │ (localhost:3000)│ ─────────────> │ (localhost:10000)│ │
377
+ │ │ /api/** │ │ │
378
+ │ • 业务逻辑 │ │ • 工作模式切换 │ │
379
+ │ • API 调用 │ <───────────── │ • Mock/Proxy │ │
380
+ │ • TS 类型 │ 响应数据 │ • 热重载 │ │
381
+ │ └─────────────────┘ └─────────┬───────┘ │
382
+ │ │ │
383
+ │ │ 代理 │
384
+ │ ↓ │
385
+ │ ┌─────────────┐ │
386
+ │ │ 真实后端 │ │
387
+ │ │ (target) │ │
388
+ │ └─────────────┘ │
389
+ └─────────────────────────────────────────────────────────────┘
390
+ ```
391
+
392
+ ## ⚠️ 已知限制
393
+
394
+ 当前版本暂不支持以下特性:
395
+
396
+ - ⚠️ OpenAPI 2.0 (Swagger) - 仅支持 OpenAPI 3.0
397
+ - ⚠️ 文件上传/下载类型
398
+ - ⚠️ WebSocket 协议
399
+ - ⚠️ GraphQL
400
+
401
+ ## 💡 常见问题
402
+
403
+ ### 1. 拉取 API 失败?
404
+
405
+ 检查:
406
+
407
+ - `projectId` `token` 是否正确
408
+ - Token 是否有「项目维护者」或「管理员」权限
409
+ - 网络连接是否正常
410
+
411
+ ### 2. 端口被占用?
412
+
413
+ 修改 `mock.config.js` 中的 `port` 配置。
414
+
415
+ ### 3. 没有生成任何文件?
416
+
417
+ 检查:
418
+
419
+ - `apiFilter` 筛选规则是否过于严格
420
+ - Apifox 项目中是否有匹配的接口
421
+ - 查看终端输出的错误信息
422
+ - 确认 Apifox Token 是否有正确的权限
423
+
424
+ ### 4. 类型生成不准确?
425
+
426
+ 建议:
427
+
428
+ - 在 Apifox 中完善接口的类型定义,枚举等需要通过字段的高级设置才有效
429
+ - 为每个字段添加描述和示例
430
+
431
+ ### 5. 热重载不生效?
432
+
433
+ 确认:
434
+
435
+ - Mock 文件保存成功
436
+ - 查看终端是否有文件变化的提示
437
+ - 检查文件路径是否在 `mockDir` 配置的目录下
438
+
439
+ ### 6. 启动 Mock 服务器失败?
440
+
441
+ 检查以下条件:
442
+
443
+ - **配置文件存在** - 确保 `apifox.config.json` 在项目根目录
444
+ - ✅ **Mock 目录存在** - 确保 `mock/` 目录存在且不为空
445
+ - ✅ **Mock 文件已生成** - 先运行 `pnpm auto-mock` 生成 Mock 文件
446
+ - ✅ **端口未被占用** - 检查 `mock.config.js` 中 `port` 配置的端口是否可用
447
+
448
+ 常见错误及解决方案:
449
+
450
+ ```bash
451
+ # 错误:未找到 apifox.config.json 配置文件
452
+ # 解决:创建配置文件
453
+
454
+ # 错误:未找到 Mock 目录
455
+ # 解决:先生成 Mock 文件
456
+ pnpm auto-mock
457
+
458
+ # 错误:未找到任何 Mock 文件
459
+ # 解决:检查 API 筛选配置,确保有匹配的接口
460
+ ```
461
+
462
+ ### 7. mockRoutes/proxyRoutes 配置不生效?
463
+
464
+ **问题现象:** 配置了 mockRoutes 或 proxyRoutes 但接口没有按预期工作
465
+
466
+ **解决方案:**
467
+
468
+ 1. **检查路径格式**:
469
+
470
+ ```javascript
471
+ // ✅ 正确格式
472
+ mockRoutes: [
473
+ '/auth/login', // 匹配所有方法
474
+ 'GET /user/info' // 只匹配 GET 方法
475
+ ];
476
+
477
+ // 错误格式
478
+ mockRoutes: [
479
+ 'auth/login', // 缺少开头的 /
480
+ '/user/*', // 不支持通配符
481
+ /\/api\/.*/ // 不支持正则
482
+ ];
483
+ ```
484
+
485
+ 2. **检查优先级**:确保没有被更高优先级的配置覆盖
486
+
487
+ ```
488
+ 页面 remote > mockRoutes/proxyRoutes > model
489
+ ```
490
+
491
+ 3. **验证路径匹配**:路径必须完全匹配(区分大小写)
492
+
493
+ 4. **重新编译**:修改配置后记得重新编译
494
+ ```bash
495
+ pnpm mock
496
+ ```
497
+
498
+ ### 💡 最佳实践
499
+
500
+ | 场景 | 建议 |
501
+ | ------------- | ---------------------------------------------------------- |
502
+ | **配置文件** | 首次配置好提交上库之后,apiFilter配置不提交上库 |
503
+ | **类型文件** | 建议提交到 Git,团队共享类型定义 |
504
+ | **Mock 数据** | apifox接口有变化时,若对应业务有调整,mock建议一并提交处理 |
505
+ | **切换环境** | 后端完成后只需修改代理配置,代码无需改动 |
506
+
507
+ ## 📝 更新日志
508
+
509
+ 详见 [CHANGELOG.md](./CHANGELOG.md) 获取完整更新日志。