apifox-mock-generator 1.3.8 → 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.
- package/CHANGELOG.md +29 -0
- package/README.md +509 -1184
- package/dist/package.json +1 -1
- package/dist/src/config/apifox-mock-mappings.d.ts +140 -0
- package/dist/src/config/apifox-mock-mappings.d.ts.map +1 -0
- package/dist/src/config/apifox-mock-mappings.js +140 -0
- package/dist/src/config/apifox-mock-mappings.js.map +1 -0
- package/dist/src/config/mock-mappings-loader.d.ts.map +1 -1
- package/dist/src/config/mock-mappings-loader.js +2 -12
- package/dist/src/config/mock-mappings-loader.js.map +1 -1
- package/dist/src/core/apifox-client.js +11 -9
- package/dist/src/core/apifox-client.js.map +1 -1
- package/dist/src/core/mock-config-loader.d.ts +4 -4
- package/dist/src/core/mock-config-loader.d.ts.map +1 -1
- package/dist/src/core/mock-config-loader.js.map +1 -1
- package/dist/src/generators/templates/mock-template.d.ts.map +1 -1
- package/dist/src/generators/templates/mock-template.js +0 -4
- package/dist/src/generators/templates/mock-template.js.map +1 -1
- package/dist/src/scripts/generate-mock.js +16 -5
- package/dist/src/scripts/generate-mock.js.map +1 -1
- package/dist/src/server/remote-proxy.js +1 -1
- package/dist/src/server/remote-proxy.js.map +1 -1
- package/dist/src/server/route-handler.d.ts +4 -0
- package/dist/src/server/route-handler.d.ts.map +1 -1
- package/dist/src/server/route-handler.js +47 -11
- package/dist/src/server/route-handler.js.map +1 -1
- package/dist/src/server/route-loader.d.ts.map +1 -1
- package/dist/src/server/route-loader.js +6 -57
- package/dist/src/server/route-loader.js.map +1 -1
- package/dist/src/types/index.d.ts +13 -16
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/types/mock/aiAnalytics/anomalyDetection/getAnomalyDetection.d.ts +38 -0
- package/dist/src/types/mock/aiAnalytics/anomalyDetection/getAnomalyDetection.d.ts.map +1 -0
- package/dist/src/types/mock/aiAnalytics/anomalyDetection/getAnomalyDetection.js +4 -0
- package/dist/src/types/mock/aiAnalytics/anomalyDetection/getAnomalyDetection.js.map +1 -0
- package/dist/src/types/mock/aiAnalytics/anomalyDetection/list.d.ts +11 -0
- package/dist/src/types/mock/aiAnalytics/anomalyDetection/list.d.ts.map +1 -0
- package/dist/src/types/mock/aiAnalytics/anomalyDetection/list.js +4 -0
- package/dist/src/types/mock/aiAnalytics/anomalyDetection/list.js.map +1 -0
- package/dist/src/types/mock/aiAnalytics/smartSql/insert.d.ts +23 -0
- package/dist/src/types/mock/aiAnalytics/smartSql/insert.d.ts.map +1 -0
- package/dist/src/types/mock/aiAnalytics/smartSql/insert.js +4 -0
- package/dist/src/types/mock/aiAnalytics/smartSql/insert.js.map +1 -0
- package/dist/src/types/mock/{v1/tenant/user/unlink.d.ts → aiAnalytics/smartSql/list.d.ts} +9 -9
- package/dist/src/types/mock/aiAnalytics/smartSql/list.d.ts.map +1 -0
- package/dist/src/types/mock/aiAnalytics/smartSql/list.js +4 -0
- package/dist/src/types/mock/aiAnalytics/smartSql/list.js.map +1 -0
- package/dist/src/types/mock/{v1/user/avatar.d.ts → aiAnalytics/smartSql/naturalLanguageToSql.d.ts} +9 -9
- package/dist/src/types/mock/aiAnalytics/smartSql/naturalLanguageToSql.d.ts.map +1 -0
- package/dist/src/types/mock/aiAnalytics/smartSql/naturalLanguageToSql.js +4 -0
- package/dist/src/types/mock/aiAnalytics/smartSql/naturalLanguageToSql.js.map +1 -0
- package/dist/src/types/mock/{v1/user/self.d.ts → aiAnalytics/smartSql/selectBySql.d.ts} +6 -9
- package/dist/src/types/mock/aiAnalytics/smartSql/selectBySql.d.ts.map +1 -0
- package/dist/src/types/mock/aiAnalytics/smartSql/selectBySql.js +4 -0
- package/dist/src/types/mock/aiAnalytics/smartSql/selectBySql.js.map +1 -0
- package/dist/src/types/mock/aiAnalytics/smartSql/update.d.ts +25 -0
- package/dist/src/types/mock/aiAnalytics/smartSql/update.d.ts.map +1 -0
- package/dist/src/types/mock/aiAnalytics/smartSql/update.js +4 -0
- package/dist/src/types/mock/aiAnalytics/smartSql/update.js.map +1 -0
- package/dist/src/types/mock/aiAnalytics/smartSql.d.ts +26 -0
- package/dist/src/types/mock/aiAnalytics/smartSql.d.ts.map +1 -0
- package/dist/src/types/mock/aiAnalytics/smartSql.js +4 -0
- package/dist/src/types/mock/aiAnalytics/smartSql.js.map +1 -0
- package/dist/src/types/mock/ai_query.d.ts +17 -0
- package/dist/src/types/mock/ai_query.d.ts.map +1 -0
- package/dist/src/types/mock/ai_query.js +4 -0
- package/dist/src/types/mock/ai_query.js.map +1 -0
- package/dist/src/types/mock/auth/login/test.d.ts +11 -0
- package/dist/src/types/mock/auth/login/test.d.ts.map +1 -0
- package/dist/src/types/mock/auth/login/test.js +4 -0
- package/dist/src/types/mock/auth/login/test.js.map +1 -0
- package/dist/src/types/mock/auth/login.d.ts +11 -0
- package/dist/src/types/mock/auth/login.d.ts.map +1 -0
- package/dist/src/types/mock/auth/login.js +4 -0
- package/dist/src/types/mock/auth/login.js.map +1 -0
- package/dist/src/types/mock/auth/login1.d.ts +11 -0
- package/dist/src/types/mock/auth/login1.d.ts.map +1 -0
- package/dist/src/types/mock/auth/login1.js +4 -0
- package/dist/src/types/mock/auth/login1.js.map +1 -0
- package/dist/src/types/mock/auth/logout.d.ts +11 -0
- package/dist/src/types/mock/auth/logout.d.ts.map +1 -0
- package/dist/src/types/mock/auth/logout.js +4 -0
- package/dist/src/types/mock/auth/logout.js.map +1 -0
- package/dist/src/types/mock/auto-login/auth.d.ts +29 -0
- package/dist/src/types/mock/auto-login/auth.d.ts.map +1 -0
- package/dist/src/types/mock/auto-login/auth.js +4 -0
- package/dist/src/types/mock/auto-login/auth.js.map +1 -0
- package/dist/src/types/mock/auto-login/redirect.d.ts +15 -0
- package/dist/src/types/mock/auto-login/redirect.d.ts.map +1 -0
- package/dist/src/types/mock/auto-login/redirect.js +4 -0
- package/dist/src/types/mock/auto-login/redirect.js.map +1 -0
- package/dist/src/types/mock/captchaImage.d.ts +14 -0
- package/dist/src/types/mock/captchaImage.d.ts.map +1 -0
- package/dist/src/types/mock/captchaImage.js +4 -0
- package/dist/src/types/mock/captchaImage.js.map +1 -0
- package/dist/src/types/mock/chainmaker/getChainInfo.d.ts +12 -0
- package/dist/src/types/mock/chainmaker/getChainInfo.d.ts.map +1 -0
- package/dist/src/types/mock/chainmaker/getChainInfo.js +4 -0
- package/dist/src/types/mock/chainmaker/getChainInfo.js.map +1 -0
- package/dist/src/types/mock/chainmaker/getLatestBlock.d.ts +19 -0
- package/dist/src/types/mock/chainmaker/getLatestBlock.d.ts.map +1 -0
- package/dist/src/types/mock/chainmaker/getLatestBlock.js +4 -0
- package/dist/src/types/mock/chainmaker/getLatestBlock.js.map +1 -0
- package/dist/src/types/mock/chainmaker/getLatestBlockHeight.d.ts +13 -0
- package/dist/src/types/mock/chainmaker/getLatestBlockHeight.d.ts.map +1 -0
- package/dist/src/types/mock/chainmaker/getLatestBlockHeight.js +4 -0
- package/dist/src/types/mock/chainmaker/getLatestBlockHeight.js.map +1 -0
- package/dist/src/types/mock/chainmaker/query.d.ts +27 -0
- package/dist/src/types/mock/chainmaker/query.d.ts.map +1 -0
- package/dist/src/types/mock/chainmaker/query.js +4 -0
- package/dist/src/types/mock/chainmaker/query.js.map +1 -0
- package/dist/src/types/mock/common/log/export.d.ts +27 -0
- package/dist/src/types/mock/common/log/export.d.ts.map +1 -0
- package/dist/src/types/mock/common/log/export.js +4 -0
- package/dist/src/types/mock/common/log/export.js.map +1 -0
- package/dist/src/types/mock/common/log/permissionLog/export.d.ts +24 -0
- package/dist/src/types/mock/common/log/permissionLog/export.d.ts.map +1 -0
- package/dist/src/types/mock/common/log/permissionLog/export.js +4 -0
- package/dist/src/types/mock/common/log/permissionLog/export.js.map +1 -0
- package/dist/src/types/mock/common/log/permissionLog.d.ts +64 -0
- package/dist/src/types/mock/common/log/permissionLog.d.ts.map +1 -0
- package/dist/src/types/mock/common/log/permissionLog.js +4 -0
- package/dist/src/types/mock/common/log/permissionLog.js.map +1 -0
- package/dist/src/types/mock/common/log.d.ts +87 -0
- package/dist/src/types/mock/common/log.d.ts.map +1 -0
- package/dist/src/types/mock/common/log.js +4 -0
- package/dist/src/types/mock/common/log.js.map +1 -0
- package/dist/src/types/mock/create-user.d.ts +36 -0
- package/dist/src/types/mock/create-user.d.ts.map +1 -0
- package/dist/src/types/mock/create-user.js +4 -0
- package/dist/src/types/mock/create-user.js.map +1 -0
- package/dist/src/types/mock/dataaccleration/asynctask/add.d.ts +36 -0
- package/dist/src/types/mock/dataaccleration/asynctask/add.d.ts.map +1 -0
- package/dist/src/types/mock/dataaccleration/asynctask/add.js +4 -0
- package/dist/src/types/mock/dataaccleration/asynctask/add.js.map +1 -0
- package/dist/src/types/mock/dataaccleration/asynctask/delete.d.ts +16 -0
- package/dist/src/types/mock/dataaccleration/asynctask/delete.d.ts.map +1 -0
- package/dist/src/types/mock/dataaccleration/asynctask/delete.js +4 -0
- package/dist/src/types/mock/dataaccleration/asynctask/delete.js.map +1 -0
- package/dist/src/types/mock/dataaccleration/asynctask/list.d.ts +48 -0
- package/dist/src/types/mock/dataaccleration/asynctask/list.d.ts.map +1 -0
- package/dist/src/types/mock/dataaccleration/asynctask/list.js +4 -0
- package/dist/src/types/mock/dataaccleration/asynctask/list.js.map +1 -0
- package/dist/src/types/mock/dataaccleration/asynctask/taskId.d.ts +38 -0
- package/dist/src/types/mock/dataaccleration/asynctask/taskId.d.ts.map +1 -0
- package/dist/src/types/mock/dataaccleration/asynctask/taskId.js +4 -0
- package/dist/src/types/mock/dataaccleration/asynctask/taskId.js.map +1 -0
- package/dist/src/types/mock/dataaccleration/asynctask.d.ts +37 -0
- package/dist/src/types/mock/dataaccleration/asynctask.d.ts.map +1 -0
- package/dist/src/types/mock/dataaccleration/asynctask.js +4 -0
- package/dist/src/types/mock/dataaccleration/asynctask.js.map +1 -0
- package/dist/src/types/mock/datasets.d.ts +19 -0
- package/dist/src/types/mock/datasets.d.ts.map +1 -0
- package/dist/src/types/mock/datasets.js +4 -0
- package/dist/src/types/mock/datasets.js.map +1 -0
- package/dist/src/types/mock/file/download.d.ts +15 -0
- package/dist/src/types/mock/file/download.d.ts.map +1 -0
- package/dist/src/types/mock/file/download.js +4 -0
- package/dist/src/types/mock/file/download.js.map +1 -0
- package/dist/src/types/mock/file/upload.d.ts +6 -0
- package/dist/src/types/mock/file/upload.d.ts.map +1 -0
- package/dist/src/types/mock/file/upload.js +4 -0
- package/dist/src/types/mock/file/upload.js.map +1 -0
- package/dist/src/types/mock/getInfo.d.ts +68 -0
- package/dist/src/types/mock/getInfo.d.ts.map +1 -0
- package/dist/src/types/mock/getInfo.js +4 -0
- package/dist/src/types/mock/getInfo.js.map +1 -0
- package/dist/src/types/mock/login.d.ts +31 -0
- package/dist/src/types/mock/login.d.ts.map +1 -0
- package/dist/src/types/mock/login.js +4 -0
- package/dist/src/types/mock/login.js.map +1 -0
- package/dist/src/types/mock/nl2sql/query.d.ts +22 -0
- package/dist/src/types/mock/nl2sql/query.d.ts.map +1 -0
- package/dist/src/types/mock/nl2sql/query.js +4 -0
- package/dist/src/types/mock/nl2sql/query.js.map +1 -0
- package/dist/src/types/mock/order/export.d.ts +32 -0
- package/dist/src/types/mock/order/export.d.ts.map +1 -0
- package/dist/src/types/mock/order/export.js +4 -0
- package/dist/src/types/mock/order/export.js.map +1 -0
- package/dist/src/types/mock/order/insert.d.ts +16 -0
- package/dist/src/types/mock/order/insert.d.ts.map +1 -0
- package/dist/src/types/mock/order/insert.js +4 -0
- package/dist/src/types/mock/order/insert.js.map +1 -0
- package/dist/src/types/mock/order/list.d.ts +60 -0
- package/dist/src/types/mock/order/list.d.ts.map +1 -0
- package/dist/src/types/mock/order/list.js +4 -0
- package/dist/src/types/mock/order/list.js.map +1 -0
- package/dist/src/types/mock/order/receive.d.ts +31 -0
- package/dist/src/types/mock/order/receive.d.ts.map +1 -0
- package/dist/src/types/mock/order/receive.js +4 -0
- package/dist/src/types/mock/order/receive.js.map +1 -0
- package/dist/src/types/mock/order.d.ts +128 -0
- package/dist/src/types/mock/order.d.ts.map +1 -0
- package/dist/src/types/mock/order.js +4 -0
- package/dist/src/types/mock/order.js.map +1 -0
- package/dist/src/types/mock/query.d.ts +19 -0
- package/dist/src/types/mock/query.d.ts.map +1 -0
- package/dist/src/types/mock/query.js +4 -0
- package/dist/src/types/mock/query.js.map +1 -0
- package/dist/src/types/mock/service/report/page.d.ts +52 -0
- package/dist/src/types/mock/service/report/page.d.ts.map +1 -0
- package/dist/src/types/mock/service/report/page.js +4 -0
- package/dist/src/types/mock/service/report/page.js.map +1 -0
- package/dist/src/types/mock/service/report/service-options.d.ts +47 -0
- package/dist/src/types/mock/service/report/service-options.d.ts.map +1 -0
- package/dist/src/types/mock/service/report/service-options.js +4 -0
- package/dist/src/types/mock/service/report/service-options.js.map +1 -0
- package/dist/src/types/mock/service/report/submit.d.ts +31 -0
- package/dist/src/types/mock/service/report/submit.d.ts.map +1 -0
- package/dist/src/types/mock/service/report/submit.js +4 -0
- package/dist/src/types/mock/service/report/submit.js.map +1 -0
- package/dist/src/types/mock/serviceInfo/list.d.ts +22 -0
- package/dist/src/types/mock/serviceInfo/list.d.ts.map +1 -0
- package/dist/src/types/mock/serviceInfo/list.js +4 -0
- package/dist/src/types/mock/serviceInfo/list.js.map +1 -0
- package/dist/src/types/mock/study-deal/etm/orderStatusToDepSync.d.ts +20 -0
- package/dist/src/types/mock/study-deal/etm/orderStatusToDepSync.d.ts.map +1 -0
- package/dist/src/types/mock/study-deal/etm/orderStatusToDepSync.js +4 -0
- package/dist/src/types/mock/study-deal/etm/orderStatusToDepSync.js.map +1 -0
- package/dist/src/types/mock/study-deal/etm/productDspInfoSync.d.ts +80 -0
- package/dist/src/types/mock/study-deal/etm/productDspInfoSync.d.ts.map +1 -0
- package/dist/src/types/mock/study-deal/etm/productDspInfoSync.js +4 -0
- package/dist/src/types/mock/study-deal/etm/productDspInfoSync.js.map +1 -0
- package/dist/src/types/mock/system/user/checkPhoneNumber.d.ts +20 -0
- package/dist/src/types/mock/system/user/checkPhoneNumber.d.ts.map +1 -0
- package/dist/src/types/mock/system/user/checkPhoneNumber.js +4 -0
- package/dist/src/types/mock/system/user/checkPhoneNumber.js.map +1 -0
- package/dist/src/types/mock/system/user/updatePhoneNumber.d.ts +22 -0
- package/dist/src/types/mock/system/user/updatePhoneNumber.d.ts.map +1 -0
- package/dist/src/types/mock/system/user/updatePhoneNumber.js +4 -0
- package/dist/src/types/mock/system/user/updatePhoneNumber.js.map +1 -0
- package/dist/src/types/mock/{v1/user/password.d.ts → system/user/updatePwd.d.ts} +5 -8
- package/dist/src/types/mock/system/user/updatePwd.d.ts.map +1 -0
- package/dist/src/types/mock/system/user/updatePwd.js +4 -0
- package/dist/src/types/mock/system/user/updatePwd.js.map +1 -0
- package/dist/src/types/mock/user/info.d.ts +45 -0
- package/dist/src/types/mock/user/info.d.ts.map +1 -0
- package/dist/src/types/mock/user/info.js +4 -0
- package/dist/src/types/mock/user/info.js.map +1 -0
- package/dist/src/utils/file-utils.d.ts +8 -2
- package/dist/src/utils/file-utils.d.ts.map +1 -1
- package/dist/src/utils/file-utils.js +21 -6
- package/dist/src/utils/file-utils.js.map +1 -1
- package/package.json +1 -1
- package/dist/src/generators/templates/smart-mock-rules.d.ts +0 -47
- package/dist/src/generators/templates/smart-mock-rules.d.ts.map +0 -1
- package/dist/src/generators/templates/smart-mock-rules.js +0 -643
- package/dist/src/generators/templates/smart-mock-rules.js.map +0 -1
- package/dist/src/types/mock/list.d.ts +0 -12
- package/dist/src/types/mock/list.d.ts.map +0 -1
- package/dist/src/types/mock/list.js +0 -4
- package/dist/src/types/mock/list.js.map +0 -1
- package/dist/src/types/mock/test.d.ts +0 -12
- package/dist/src/types/mock/test.d.ts.map +0 -1
- package/dist/src/types/mock/test.js +0 -4
- package/dist/src/types/mock/test.js.map +0 -1
- package/dist/src/types/mock/v1/auth/captcha.d.ts +0 -18
- package/dist/src/types/mock/v1/auth/captcha.d.ts.map +0 -1
- package/dist/src/types/mock/v1/auth/captcha.js +0 -4
- package/dist/src/types/mock/v1/auth/captcha.js.map +0 -1
- package/dist/src/types/mock/v1/auth/login/tenant.d.ts +0 -26
- package/dist/src/types/mock/v1/auth/login/tenant.d.ts.map +0 -1
- package/dist/src/types/mock/v1/auth/login/tenant.js +0 -4
- package/dist/src/types/mock/v1/auth/login/tenant.js.map +0 -1
- package/dist/src/types/mock/v1/auth/login/username.d.ts +0 -32
- package/dist/src/types/mock/v1/auth/login/username.d.ts.map +0 -1
- package/dist/src/types/mock/v1/auth/login/username.js +0 -4
- package/dist/src/types/mock/v1/auth/login/username.js.map +0 -1
- package/dist/src/types/mock/v1/auth/logout.d.ts +0 -13
- package/dist/src/types/mock/v1/auth/logout.d.ts.map +0 -1
- package/dist/src/types/mock/v1/auth/logout.js +0 -4
- package/dist/src/types/mock/v1/auth/logout.js.map +0 -1
- package/dist/src/types/mock/v1/role/list.d.ts +0 -48
- package/dist/src/types/mock/v1/role/list.d.ts.map +0 -1
- package/dist/src/types/mock/v1/role/list.js +0 -4
- package/dist/src/types/mock/v1/role/list.js.map +0 -1
- package/dist/src/types/mock/v1/role/pagedList.d.ts +0 -54
- package/dist/src/types/mock/v1/role/pagedList.d.ts.map +0 -1
- package/dist/src/types/mock/v1/role/pagedList.js +0 -4
- package/dist/src/types/mock/v1/role/pagedList.js.map +0 -1
- package/dist/src/types/mock/v1/role/permission.d.ts +0 -25
- package/dist/src/types/mock/v1/role/permission.d.ts.map +0 -1
- package/dist/src/types/mock/v1/role/permission.js +0 -4
- package/dist/src/types/mock/v1/role/permission.js.map +0 -1
- package/dist/src/types/mock/v1/role/permissions.d.ts +0 -25
- package/dist/src/types/mock/v1/role/permissions.d.ts.map +0 -1
- package/dist/src/types/mock/v1/role/permissions.js +0 -4
- package/dist/src/types/mock/v1/role/permissions.js.map +0 -1
- package/dist/src/types/mock/v1/role.d.ts +0 -119
- package/dist/src/types/mock/v1/role.d.ts.map +0 -1
- package/dist/src/types/mock/v1/role.js +0 -4
- package/dist/src/types/mock/v1/role.js.map +0 -1
- package/dist/src/types/mock/v1/tenant/permission/tree.d.ts +0 -56
- package/dist/src/types/mock/v1/tenant/permission/tree.d.ts.map +0 -1
- package/dist/src/types/mock/v1/tenant/permission/tree.js +0 -4
- package/dist/src/types/mock/v1/tenant/permission/tree.js.map +0 -1
- package/dist/src/types/mock/v1/tenant/permissions.d.ts +0 -52
- package/dist/src/types/mock/v1/tenant/permissions.d.ts.map +0 -1
- package/dist/src/types/mock/v1/tenant/permissions.js +0 -4
- package/dist/src/types/mock/v1/tenant/permissions.js.map +0 -1
- package/dist/src/types/mock/v1/tenant/user/disabled.d.ts +0 -25
- package/dist/src/types/mock/v1/tenant/user/disabled.d.ts.map +0 -1
- package/dist/src/types/mock/v1/tenant/user/disabled.js +0 -4
- package/dist/src/types/mock/v1/tenant/user/disabled.js.map +0 -1
- package/dist/src/types/mock/v1/tenant/user/list.d.ts +0 -60
- package/dist/src/types/mock/v1/tenant/user/list.d.ts.map +0 -1
- package/dist/src/types/mock/v1/tenant/user/list.js +0 -4
- package/dist/src/types/mock/v1/tenant/user/list.js.map +0 -1
- package/dist/src/types/mock/v1/tenant/user/pagedList.d.ts +0 -60
- package/dist/src/types/mock/v1/tenant/user/pagedList.d.ts.map +0 -1
- package/dist/src/types/mock/v1/tenant/user/pagedList.js +0 -4
- package/dist/src/types/mock/v1/tenant/user/pagedList.js.map +0 -1
- package/dist/src/types/mock/v1/tenant/user/role.d.ts +0 -25
- package/dist/src/types/mock/v1/tenant/user/role.d.ts.map +0 -1
- package/dist/src/types/mock/v1/tenant/user/role.js +0 -4
- package/dist/src/types/mock/v1/tenant/user/role.js.map +0 -1
- package/dist/src/types/mock/v1/tenant/user/unlink.d.ts.map +0 -1
- package/dist/src/types/mock/v1/tenant/user/unlink.js +0 -4
- package/dist/src/types/mock/v1/tenant/user/unlink.js.map +0 -1
- package/dist/src/types/mock/v1/tenant/user.d.ts +0 -36
- package/dist/src/types/mock/v1/tenant/user.d.ts.map +0 -1
- package/dist/src/types/mock/v1/tenant/user.js +0 -4
- package/dist/src/types/mock/v1/tenant/user.js.map +0 -1
- package/dist/src/types/mock/v1/user/avatar.d.ts.map +0 -1
- package/dist/src/types/mock/v1/user/avatar.js +0 -4
- package/dist/src/types/mock/v1/user/avatar.js.map +0 -1
- package/dist/src/types/mock/v1/user/info.d.ts +0 -36
- package/dist/src/types/mock/v1/user/info.d.ts.map +0 -1
- package/dist/src/types/mock/v1/user/info.js +0 -4
- package/dist/src/types/mock/v1/user/info.js.map +0 -1
- package/dist/src/types/mock/v1/user/password.d.ts.map +0 -1
- package/dist/src/types/mock/v1/user/password.js +0 -4
- package/dist/src/types/mock/v1/user/password.js.map +0 -1
- package/dist/src/types/mock/v1/user/permission/tree.d.ts +0 -37
- package/dist/src/types/mock/v1/user/permission/tree.d.ts.map +0 -1
- package/dist/src/types/mock/v1/user/permission/tree.js +0 -4
- package/dist/src/types/mock/v1/user/permission/tree.js.map +0 -1
- package/dist/src/types/mock/v1/user/permissions.d.ts +0 -35
- package/dist/src/types/mock/v1/user/permissions.d.ts.map +0 -1
- package/dist/src/types/mock/v1/user/permissions.js +0 -4
- package/dist/src/types/mock/v1/user/permissions.js.map +0 -1
- package/dist/src/types/mock/v1/user/self.d.ts.map +0 -1
- package/dist/src/types/mock/v1/user/self.js +0 -4
- package/dist/src/types/mock/v1/user/self.js.map +0 -1
- package/dist/src/types/mock/v1/user/tenant/list.d.ts +0 -24
- package/dist/src/types/mock/v1/user/tenant/list.d.ts.map +0 -1
- package/dist/src/types/mock/v1/user/tenant/list.js +0 -4
- package/dist/src/types/mock/v1/user/tenant/list.js.map +0 -1
- package/dist/src/types/mock/v1/user/tenants.d.ts +0 -22
- package/dist/src/types/mock/v1/user/tenants.d.ts.map +0 -1
- package/dist/src/types/mock/v1/user/tenants.js +0 -4
- package/dist/src/types/mock/v1/user/tenants.js.map +0 -1
- package/dist/src/types/mock/v1/user.d.ts +0 -35
- package/dist/src/types/mock/v1/user.d.ts.map +0 -1
- package/dist/src/types/mock/v1/user.js +0 -4
- package/dist/src/types/mock/v1/user.js.map +0 -1
- package/dist/src/types/v1/tenant/permissions.d.ts +0 -16
- package/dist/src/types/v1/tenant/permissions.d.ts.map +0 -1
- package/dist/src/types/v1/tenant/permissions.js +0 -4
- 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
|
-
[](https://www.npmjs.com/package/apifox-mock-generator)
|
|
4
|
-
|
|
5
|
-
从 Apifox 拉取 API 接口并生成本地 Mock 数据和 TypeScript 类型文件的 npm 包。
|
|
6
|
-
|
|
7
|
-
##
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
-
|
|
12
|
-
- 📝
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
-
|
|
218
|
-
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
}
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
{
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
-
|
|
420
|
-
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
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
|
+
[](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
|
+

|
|
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) 获取完整更新日志。
|