[{"data":1,"prerenderedAt":1367},["ShallowReactive",2],{"docsNavigation":3,"blogNavigation":53,"/blog/apifox-api-generation":95,"/blog/apifox-api-generation-surround":1362},[4,38],{"title":5,"path":6,"stem":7,"children":8,"icon":37},"常用网站","/docs/getting-started","1.docs/1.getting-started/1.index",[9,12,17,22,27,32],{"title":10,"path":6,"stem":7,"icon":11},"区块链相关(前端)","i-lucide-box",{"title":13,"path":14,"stem":15,"icon":16},"图片压缩","/docs/getting-started/photo-compression","1.docs/1.getting-started/2.photo-compression","i-lucide-image",{"title":18,"path":19,"stem":20,"icon":21},"组件库","/docs/getting-started/component-library","1.docs/1.getting-started/3.component-library","i-lucide-puzzle",{"title":23,"path":24,"stem":25,"icon":26},"图表库","/docs/getting-started/charts","1.docs/1.getting-started/4.charts","i-lucide-bar-chart-3",{"title":28,"path":29,"stem":30,"icon":31},"CSS","/docs/getting-started/css","1.docs/1.getting-started/5.css","i-lucide-palette",{"title":33,"path":34,"stem":35,"icon":36},"调试测试工具","/docs/getting-started/test","1.docs/1.getting-started/6.test","i-lucide-bug",false,{"title":39,"path":40,"stem":41,"children":42,"page":37},"常用工具","/docs/essentials","1.docs/2.essentials",[43,48],{"title":44,"path":45,"stem":46,"icon":47},"uni-helper","/docs/essentials/uni-helper","1.docs/2.essentials/1.uni-helper","i-lucide-settings",{"title":49,"path":50,"stem":51,"icon":52},"工作流可视化库","/docs/essentials/workflow-libraries","1.docs/2.essentials/2.workflow-libraries","i-lucide-workflow",[54],{"title":55,"path":56,"stem":57,"children":58,"page":37},"Blog","/blog","3.blog",[59,63,67,71,75,79,83,87,91],{"title":60,"path":61,"stem":62},"Vue 3 中 \u003CTransition> 报错：组件根节点无法被动画化的解决方案","/blog/asian-cuisine","3.blog/1.asian-cuisine",{"title":64,"path":65,"stem":66},"使用 openapi-ts-request 自动生成 API 请求代码","/blog/apifox-api-generation","3.blog/2.apifox-api-generation",{"title":68,"path":69,"stem":70},"解决 uni.upload 多文件上传限制：使用 fetch + FormData 实现 H5 环境下的多文件上传","/blog/file-upload-issue-solution","3.blog/3.file-upload-issue-solution",{"title":72,"path":73,"stem":74},"Wangeditor中被div包裹的img标签被过滤问题解决方案","/blog/wangeditor-img-filter-issue","3.blog/4.wangeditor-img-filter-issue",{"title":76,"path":77,"stem":78},"Nuxt项目部署后报错 “Cannot load payload /_payload.json” 的修复","/blog/nuxt-payload-extraction","3.blog/5.nuxt-payload-extraction",{"title":80,"path":81,"stem":82},"Nuxt项目导入nuxt-echarts实现图表渲染","/blog/nuxt-echarts-implementation","3.blog/6.nuxt-echarts-implementation",{"title":84,"path":85,"stem":86},"Reown+Wagmi 在 UniApp+Vite 项目中的问题与解决方案","/blog/reown-wagmi-uniapp-issues","3.blog/7.reown-wagmi-uniapp-issues",{"title":88,"path":89,"stem":90},"数字滚动动画组件 - Vue 动画最佳实践","/blog/number-scroll-animation","3.blog/8.number-scroll-animation",{"title":92,"path":93,"stem":94},"新电脑安装 nvm 卡住？无需修改配置文件，一行命令完美解决！","/blog/nvm-install-solution","3.blog/9.nvm-install-solution",{"id":96,"title":64,"authors":97,"badge":102,"body":104,"date":1354,"description":1355,"extension":1356,"image":1357,"meta":1359,"navigation":192,"path":65,"seo":1360,"stem":66,"__hash__":1361},"posts/3.blog/2.apifox-api-generation.md",[98],{"name":99,"avatar":100},"qibmz",{"src":101},"/image/avatar.avif",{"label":103},"work",{"type":105,"value":106,"toc":1344},"minimark",[107,119,124,130,133,140,934,938,1028,1031,1034,1042,1045,1048,1273,1276,1311,1314,1328,1334,1340],[108,109,110,111,118],"p",{},"在现代前端开发中，与后端 API 的对接是一项重要且重复性高的工作。为了提高开发效率并减少手动编写 API 请求代码的工作量，我们可以使用 ",[112,113,117],"a",{"href":114,"rel":115},"https://github.com/superwf/openapi-ts-request",[116],"nofollow","openapi-ts-request"," 工具，根据 Apifox 文档自动生成 TypeScript 类型安全的 API 请求文件。",[120,121,123],"h2",{"id":122},"什么是-openapi-ts-request","什么是 openapi-ts-request？",[108,125,126,129],{},[127,128,117],"code",{}," 是一个基于 OpenAPI 规范的代码生成工具，它可以从 API 文档自动生成类型定义和请求函数。通过与 Apifox 平台集成，我们可以直接从项目文档生成完整的 API 客户端代码。",[120,131,132],{"id":132},"配置说明",[108,134,135,136,139],{},"首先，在项目根目录下创建配置文件，例如 ",[127,137,138],{},"openapi-ts.config.ts","：",[141,142,143,835,892],"code-tree",{"default-value":138},[144,145,150],"pre",{"className":146,"code":147,"filename":138,"language":148,"meta":149,"style":149},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import type { GenerateServiceProps } from 'openapi-ts-request'\n\nexport default [\n  {\n    serversPath: './src/api/openApiRequest',\n    requestLibPath: `import request from '@/http/openApiRequest';\\n import { CustomRequestOptions } from '@/http/interceptor';`,\n    requestOptionsType: 'CustomRequestOptions',\n    reactQueryMode: 'vue',\n    enableLogging: true,\n    isGenJavaScript: false,\n    apifoxConfig: {\n      oasVersion: '3.1',\n      projectId: '66666',//项目ID 需要拥有项目导出权限\n      apifoxToken: 'APS-xxxx',  //apifox中获取的token\n    },\n    hook: {\n      // 生成自定义方法名称的函数\n      customFunctionName: (data) => {\n        // 查找路径中第一个'{'的位置，用于处理带参数的路径\n        const index = data.path.indexOf('{')\n        let newPath = data.path\n        if (index !== -1) {\n          // 如果路径中有参数（用{}表示），则截取参数前的部分\n          newPath = data.path.slice(0, index - 1)\n        }\n        // 定义首字母大写函数\n        const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1)\n        // 分割路径并过滤空字符串\n        const paths = newPath.split('/').filter(path => path)\n        // 获取倒数第二个路径段并首字母大写\n        const secondLastPath = capitalize(paths[paths.length - 2])\n        // 获取最后一个路径段并首字母大写\n        const lastPath = capitalize(paths[paths.length - 1])\n        // 返回组合的方法名：HTTP方法名 + 倒数第二路径 + 最后路径(如：get:/api/user/list -> getUserList,post:/api/user/add -> postAddUser)\n        return `${data.method}${secondLastPath}${lastPath}`\n      },\n    },\n  },\n] as GenerateServiceProps[]\n","ts","",[127,151,152,187,194,206,212,233,258,275,292,306,319,330,347,369,389,395,405,411,436,442,481,499,526,532,567,573,579,641,647,691,697,732,738,768,774,804,810,815,821],{"__ignoreMap":149},[153,154,157,161,164,168,172,175,178,181,184],"span",{"class":155,"line":156},"line",1,[153,158,160],{"class":159},"s7zQu","import",[153,162,163],{"class":159}," type",[153,165,167],{"class":166},"sMK4o"," {",[153,169,171],{"class":170},"sTEyZ"," GenerateServiceProps",[153,173,174],{"class":166}," }",[153,176,177],{"class":159}," from",[153,179,180],{"class":166}," '",[153,182,117],{"class":183},"sfazB",[153,185,186],{"class":166},"'\n",[153,188,190],{"class":155,"line":189},2,[153,191,193],{"emptyLinePlaceholder":192},true,"\n",[153,195,197,200,203],{"class":155,"line":196},3,[153,198,199],{"class":159},"export",[153,201,202],{"class":159}," default",[153,204,205],{"class":170}," [\n",[153,207,209],{"class":155,"line":208},4,[153,210,211],{"class":166},"  {\n",[153,213,215,219,222,224,227,230],{"class":155,"line":214},5,[153,216,218],{"class":217},"swJcz","    serversPath",[153,220,221],{"class":166},":",[153,223,180],{"class":166},[153,225,226],{"class":183},"./src/api/openApiRequest",[153,228,229],{"class":166},"'",[153,231,232],{"class":166},",\n",[153,234,236,239,241,244,247,250,253,256],{"class":155,"line":235},6,[153,237,238],{"class":217},"    requestLibPath",[153,240,221],{"class":166},[153,242,243],{"class":166}," `",[153,245,246],{"class":183},"import request from '@/http/openApiRequest';",[153,248,249],{"class":170},"\\n",[153,251,252],{"class":183}," import { CustomRequestOptions } from '@/http/interceptor';",[153,254,255],{"class":166},"`",[153,257,232],{"class":166},[153,259,261,264,266,268,271,273],{"class":155,"line":260},7,[153,262,263],{"class":217},"    requestOptionsType",[153,265,221],{"class":166},[153,267,180],{"class":166},[153,269,270],{"class":183},"CustomRequestOptions",[153,272,229],{"class":166},[153,274,232],{"class":166},[153,276,278,281,283,285,288,290],{"class":155,"line":277},8,[153,279,280],{"class":217},"    reactQueryMode",[153,282,221],{"class":166},[153,284,180],{"class":166},[153,286,287],{"class":183},"vue",[153,289,229],{"class":166},[153,291,232],{"class":166},[153,293,295,298,300,304],{"class":155,"line":294},9,[153,296,297],{"class":217},"    enableLogging",[153,299,221],{"class":166},[153,301,303],{"class":302},"sfNiH"," true",[153,305,232],{"class":166},[153,307,309,312,314,317],{"class":155,"line":308},10,[153,310,311],{"class":217},"    isGenJavaScript",[153,313,221],{"class":166},[153,315,316],{"class":302}," false",[153,318,232],{"class":166},[153,320,322,325,327],{"class":155,"line":321},11,[153,323,324],{"class":217},"    apifoxConfig",[153,326,221],{"class":166},[153,328,329],{"class":166}," {\n",[153,331,333,336,338,340,343,345],{"class":155,"line":332},12,[153,334,335],{"class":217},"      oasVersion",[153,337,221],{"class":166},[153,339,180],{"class":166},[153,341,342],{"class":183},"3.1",[153,344,229],{"class":166},[153,346,232],{"class":166},[153,348,350,353,355,357,360,362,365],{"class":155,"line":349},13,[153,351,352],{"class":217},"      projectId",[153,354,221],{"class":166},[153,356,180],{"class":166},[153,358,359],{"class":183},"66666",[153,361,229],{"class":166},[153,363,364],{"class":166},",",[153,366,368],{"class":367},"sHwdD","//项目ID 需要拥有项目导出权限\n",[153,370,372,375,377,379,382,384,386],{"class":155,"line":371},14,[153,373,374],{"class":217},"      apifoxToken",[153,376,221],{"class":166},[153,378,180],{"class":166},[153,380,381],{"class":183},"APS-xxxx",[153,383,229],{"class":166},[153,385,364],{"class":166},[153,387,388],{"class":367},"  //apifox中获取的token\n",[153,390,392],{"class":155,"line":391},15,[153,393,394],{"class":166},"    },\n",[153,396,398,401,403],{"class":155,"line":397},16,[153,399,400],{"class":217},"    hook",[153,402,221],{"class":166},[153,404,329],{"class":166},[153,406,408],{"class":155,"line":407},17,[153,409,410],{"class":367},"      // 生成自定义方法名称的函数\n",[153,412,414,418,420,423,427,430,434],{"class":155,"line":413},18,[153,415,417],{"class":416},"s2Zo4","      customFunctionName",[153,419,221],{"class":166},[153,421,422],{"class":166}," (",[153,424,426],{"class":425},"sHdIc","data",[153,428,429],{"class":166},")",[153,431,433],{"class":432},"spNyl"," =>",[153,435,329],{"class":166},[153,437,439],{"class":155,"line":438},19,[153,440,441],{"class":367},"        // 查找路径中第一个'{'的位置，用于处理带参数的路径\n",[153,443,445,448,451,454,457,460,463,465,468,471,473,476,478],{"class":155,"line":444},20,[153,446,447],{"class":432},"        const",[153,449,450],{"class":170}," index",[153,452,453],{"class":166}," =",[153,455,456],{"class":170}," data",[153,458,459],{"class":166},".",[153,461,462],{"class":170},"path",[153,464,459],{"class":166},[153,466,467],{"class":416},"indexOf",[153,469,470],{"class":217},"(",[153,472,229],{"class":166},[153,474,475],{"class":183},"{",[153,477,229],{"class":166},[153,479,480],{"class":217},")\n",[153,482,484,487,490,492,494,496],{"class":155,"line":483},21,[153,485,486],{"class":432},"        let",[153,488,489],{"class":170}," newPath",[153,491,453],{"class":166},[153,493,456],{"class":170},[153,495,459],{"class":166},[153,497,498],{"class":170},"path\n",[153,500,502,505,507,510,513,516,520,523],{"class":155,"line":501},22,[153,503,504],{"class":159},"        if",[153,506,422],{"class":217},[153,508,509],{"class":170},"index",[153,511,512],{"class":166}," !==",[153,514,515],{"class":166}," -",[153,517,519],{"class":518},"sbssI","1",[153,521,522],{"class":217},") ",[153,524,525],{"class":166},"{\n",[153,527,529],{"class":155,"line":528},23,[153,530,531],{"class":367},"          // 如果路径中有参数（用{}表示），则截取参数前的部分\n",[153,533,535,538,540,542,544,546,548,551,553,556,558,560,562,565],{"class":155,"line":534},24,[153,536,537],{"class":170},"          newPath",[153,539,453],{"class":166},[153,541,456],{"class":170},[153,543,459],{"class":166},[153,545,462],{"class":170},[153,547,459],{"class":166},[153,549,550],{"class":416},"slice",[153,552,470],{"class":217},[153,554,555],{"class":518},"0",[153,557,364],{"class":166},[153,559,450],{"class":170},[153,561,515],{"class":166},[153,563,564],{"class":518}," 1",[153,566,480],{"class":217},[153,568,570],{"class":155,"line":569},25,[153,571,572],{"class":166},"        }\n",[153,574,576],{"class":155,"line":575},26,[153,577,578],{"class":367},"        // 定义首字母大写函数\n",[153,580,582,584,587,589,591,594,596,600,602,604,607,609,612,614,616,618,620,623,626,629,631,633,635,637,639],{"class":155,"line":581},27,[153,583,447],{"class":432},[153,585,586],{"class":170}," capitalize",[153,588,453],{"class":166},[153,590,422],{"class":166},[153,592,593],{"class":425},"str",[153,595,221],{"class":166},[153,597,599],{"class":598},"sBMFI"," string",[153,601,429],{"class":166},[153,603,433],{"class":432},[153,605,606],{"class":170}," str",[153,608,459],{"class":166},[153,610,611],{"class":416},"charAt",[153,613,470],{"class":217},[153,615,555],{"class":518},[153,617,429],{"class":217},[153,619,459],{"class":166},[153,621,622],{"class":416},"toUpperCase",[153,624,625],{"class":217},"() ",[153,627,628],{"class":166},"+",[153,630,606],{"class":170},[153,632,459],{"class":166},[153,634,550],{"class":416},[153,636,470],{"class":217},[153,638,519],{"class":518},[153,640,480],{"class":217},[153,642,644],{"class":155,"line":643},28,[153,645,646],{"class":367},"        // 分割路径并过滤空字符串\n",[153,648,650,652,655,657,659,661,664,666,668,671,673,675,677,680,682,684,686,689],{"class":155,"line":649},29,[153,651,447],{"class":432},[153,653,654],{"class":170}," paths",[153,656,453],{"class":166},[153,658,489],{"class":170},[153,660,459],{"class":166},[153,662,663],{"class":416},"split",[153,665,470],{"class":217},[153,667,229],{"class":166},[153,669,670],{"class":183},"/",[153,672,229],{"class":166},[153,674,429],{"class":217},[153,676,459],{"class":166},[153,678,679],{"class":416},"filter",[153,681,470],{"class":217},[153,683,462],{"class":425},[153,685,433],{"class":432},[153,687,688],{"class":170}," path",[153,690,480],{"class":217},[153,692,694],{"class":155,"line":693},30,[153,695,696],{"class":367},"        // 获取倒数第二个路径段并首字母大写\n",[153,698,700,702,705,707,709,711,714,717,719,721,724,726,729],{"class":155,"line":699},31,[153,701,447],{"class":432},[153,703,704],{"class":170}," secondLastPath",[153,706,453],{"class":166},[153,708,586],{"class":416},[153,710,470],{"class":217},[153,712,713],{"class":170},"paths",[153,715,716],{"class":217},"[",[153,718,713],{"class":170},[153,720,459],{"class":166},[153,722,723],{"class":170},"length",[153,725,515],{"class":166},[153,727,728],{"class":518}," 2",[153,730,731],{"class":217},"])\n",[153,733,735],{"class":155,"line":734},32,[153,736,737],{"class":367},"        // 获取最后一个路径段并首字母大写\n",[153,739,741,743,746,748,750,752,754,756,758,760,762,764,766],{"class":155,"line":740},33,[153,742,447],{"class":432},[153,744,745],{"class":170}," lastPath",[153,747,453],{"class":166},[153,749,586],{"class":416},[153,751,470],{"class":217},[153,753,713],{"class":170},[153,755,716],{"class":217},[153,757,713],{"class":170},[153,759,459],{"class":166},[153,761,723],{"class":170},[153,763,515],{"class":166},[153,765,564],{"class":518},[153,767,731],{"class":217},[153,769,771],{"class":155,"line":770},34,[153,772,773],{"class":367},"        // 返回组合的方法名：HTTP方法名 + 倒数第二路径 + 最后路径(如：get:/api/user/list -> getUserList,post:/api/user/add -> postAddUser)\n",[153,775,777,780,783,785,787,790,793,796,798,801],{"class":155,"line":776},35,[153,778,779],{"class":159},"        return",[153,781,782],{"class":166}," `${",[153,784,426],{"class":170},[153,786,459],{"class":166},[153,788,789],{"class":170},"method",[153,791,792],{"class":166},"}${",[153,794,795],{"class":170},"secondLastPath",[153,797,792],{"class":166},[153,799,800],{"class":170},"lastPath",[153,802,803],{"class":166},"}`\n",[153,805,807],{"class":155,"line":806},36,[153,808,809],{"class":166},"      },\n",[153,811,813],{"class":155,"line":812},37,[153,814,394],{"class":166},[153,816,818],{"class":155,"line":817},38,[153,819,820],{"class":166},"  },\n",[153,822,824,827,830,832],{"class":155,"line":823},39,[153,825,826],{"class":170},"] ",[153,828,829],{"class":159},"as",[153,831,171],{"class":598},[153,833,834],{"class":170},"[]\n",[144,836,841],{"className":837,"code":838,"filename":839,"language":840,"meta":149,"style":149},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"scripts\": {\n    \"openapi-ts-request\": \"openapi-ts\"\n  }\n}\n","package.json","json",[127,842,843,847,862,882,887],{"__ignoreMap":149},[153,844,845],{"class":155,"line":156},[153,846,525],{"class":166},[153,848,849,852,855,858,860],{"class":155,"line":189},[153,850,851],{"class":166},"  \"",[153,853,854],{"class":432},"scripts",[153,856,857],{"class":166},"\"",[153,859,221],{"class":166},[153,861,329],{"class":166},[153,863,864,867,869,871,873,876,879],{"class":155,"line":196},[153,865,866],{"class":166},"    \"",[153,868,117],{"class":598},[153,870,857],{"class":166},[153,872,221],{"class":166},[153,874,875],{"class":166}," \"",[153,877,878],{"class":183},"openapi-ts",[153,880,881],{"class":166},"\"\n",[153,883,884],{"class":155,"line":208},[153,885,886],{"class":166},"  }\n",[153,888,889],{"class":155,"line":214},[153,890,891],{"class":166},"}\n",[144,893,898],{"className":894,"code":895,"filename":896,"language":897,"meta":149,"style":149},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# 安装依赖\npnpm add -D openapi-ts-request\n\n# 运行生成命令\npnpm openapi-ts-request\n","终端命令","bash",[127,899,900,905,919,923,928],{"__ignoreMap":149},[153,901,902],{"class":155,"line":156},[153,903,904],{"class":367},"# 安装依赖\n",[153,906,907,910,913,916],{"class":155,"line":189},[153,908,909],{"class":598},"pnpm",[153,911,912],{"class":183}," add",[153,914,915],{"class":183}," -D",[153,917,918],{"class":183}," openapi-ts-request\n",[153,920,921],{"class":155,"line":196},[153,922,193],{"emptyLinePlaceholder":192},[153,924,925],{"class":155,"line":208},[153,926,927],{"class":367},"# 运行生成命令\n",[153,929,930,932],{"class":155,"line":214},[153,931,909],{"class":598},[153,933,918],{"class":183},[935,936,937],"h3",{"id":937},"配置项详解",[939,940,941,954],"table",{},[942,943,944],"thead",{},[945,946,947,951],"tr",{},[948,949,950],"th",{},"配置项",[948,952,953],{},"说明",[955,956,957,968,978,988,998,1008,1018],"tbody",{},[945,958,959,965],{},[960,961,962],"td",{},[127,963,964],{},"serversPath",[960,966,967],{},"生成文件的存放路径",[945,969,970,975],{},[960,971,972],{},[127,973,974],{},"requestLibPath",[960,976,977],{},"自定义请求库的引入路径",[945,979,980,985],{},[960,981,982],{},[127,983,984],{},"requestOptionsType",[960,986,987],{},"请求选项的类型定义",[945,989,990,995],{},[960,991,992],{},[127,993,994],{},"reactQueryMode",[960,996,997],{},"设置为 'vue' 以适配 Vue 项目",[945,999,1000,1005],{},[960,1001,1002],{},[127,1003,1004],{},"enableLogging",[960,1006,1007],{},"是否启用日志输出",[945,1009,1010,1015],{},[960,1011,1012],{},[127,1013,1014],{},"isGenJavaScript",[960,1016,1017],{},"是否生成 JavaScript 代码（false 表示生成 TypeScript）",[945,1019,1020,1025],{},[960,1021,1022],{},[127,1023,1024],{},"apifoxConfig",[960,1026,1027],{},"Apifox 项目配置",[120,1029,1030],{"id":1030},"生成的文件结构",[108,1032,1033],{},"运行命令后，工具会在指定位置自动生成以下文件：",[144,1035,1040],{"className":1036,"code":1038,"language":1039},[1037],"language-text","src/\n└── api/\n    └── openApiRequest/\n        ├── common.ts\n        ├── index.ts\n        ├── types.ts\n        └── v1.ts\n","text",[127,1041,1038],{"__ignoreMap":149},[120,1043,1044],{"id":1044},"生成代码示例",[108,1046,1047],{},"生成的 API 请求函数具有完整的类型支持：",[144,1049,1053],{"className":1050,"code":1051,"language":1052,"meta":149,"style":149},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","/** 派遣战舰远征 POST /api/v1/game/warshipAdventure */\nexport async function postGameWarshipAdventure({\n  body,\n  options,\n}: {\n  body: API.PostGameWarshipAdventureBody;\n  options?: CustomRequestOptions;\n}) {\n  return request\u003CAPI.PostGameWarshipAdventureResponse>(\n    '/api/v1/game/warshipAdventure',\n    {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      data: body,\n      ...(options || {}),\n    }\n  );\n}\n","typescript",[127,1054,1055,1060,1076,1083,1090,1097,1114,1126,1133,1158,1170,1175,1191,1200,1221,1225,1237,1257,1262,1269],{"__ignoreMap":149},[153,1056,1057],{"class":155,"line":156},[153,1058,1059],{"class":367},"/** 派遣战舰远征 POST /api/v1/game/warshipAdventure */\n",[153,1061,1062,1064,1067,1070,1073],{"class":155,"line":189},[153,1063,199],{"class":159},[153,1065,1066],{"class":432}," async",[153,1068,1069],{"class":432}," function",[153,1071,1072],{"class":416}," postGameWarshipAdventure",[153,1074,1075],{"class":166},"({\n",[153,1077,1078,1081],{"class":155,"line":196},[153,1079,1080],{"class":425},"  body",[153,1082,232],{"class":166},[153,1084,1085,1088],{"class":155,"line":208},[153,1086,1087],{"class":425},"  options",[153,1089,232],{"class":166},[153,1091,1092,1095],{"class":155,"line":214},[153,1093,1094],{"class":166},"}:",[153,1096,329],{"class":166},[153,1098,1099,1101,1103,1106,1108,1111],{"class":155,"line":235},[153,1100,1080],{"class":217},[153,1102,221],{"class":166},[153,1104,1105],{"class":598}," API",[153,1107,459],{"class":166},[153,1109,1110],{"class":598},"PostGameWarshipAdventureBody",[153,1112,1113],{"class":166},";\n",[153,1115,1116,1118,1121,1124],{"class":155,"line":260},[153,1117,1087],{"class":217},[153,1119,1120],{"class":166},"?:",[153,1122,1123],{"class":598}," CustomRequestOptions",[153,1125,1113],{"class":166},[153,1127,1128,1131],{"class":155,"line":277},[153,1129,1130],{"class":166},"})",[153,1132,329],{"class":166},[153,1134,1135,1138,1141,1144,1147,1149,1152,1155],{"class":155,"line":294},[153,1136,1137],{"class":159},"  return",[153,1139,1140],{"class":416}," request",[153,1142,1143],{"class":166},"\u003C",[153,1145,1146],{"class":598},"API",[153,1148,459],{"class":166},[153,1150,1151],{"class":598},"PostGameWarshipAdventureResponse",[153,1153,1154],{"class":166},">",[153,1156,1157],{"class":217},"(\n",[153,1159,1160,1163,1166,1168],{"class":155,"line":308},[153,1161,1162],{"class":166},"    '",[153,1164,1165],{"class":183},"/api/v1/game/warshipAdventure",[153,1167,229],{"class":166},[153,1169,232],{"class":166},[153,1171,1172],{"class":155,"line":321},[153,1173,1174],{"class":166},"    {\n",[153,1176,1177,1180,1182,1184,1187,1189],{"class":155,"line":332},[153,1178,1179],{"class":217},"      method",[153,1181,221],{"class":166},[153,1183,180],{"class":166},[153,1185,1186],{"class":183},"POST",[153,1188,229],{"class":166},[153,1190,232],{"class":166},[153,1192,1193,1196,1198],{"class":155,"line":349},[153,1194,1195],{"class":217},"      headers",[153,1197,221],{"class":166},[153,1199,329],{"class":166},[153,1201,1202,1205,1208,1210,1212,1214,1217,1219],{"class":155,"line":371},[153,1203,1204],{"class":166},"        '",[153,1206,1207],{"class":217},"Content-Type",[153,1209,229],{"class":166},[153,1211,221],{"class":166},[153,1213,180],{"class":166},[153,1215,1216],{"class":183},"application/json",[153,1218,229],{"class":166},[153,1220,232],{"class":166},[153,1222,1223],{"class":155,"line":391},[153,1224,809],{"class":166},[153,1226,1227,1230,1232,1235],{"class":155,"line":397},[153,1228,1229],{"class":217},"      data",[153,1231,221],{"class":166},[153,1233,1234],{"class":170}," body",[153,1236,232],{"class":166},[153,1238,1239,1242,1244,1247,1250,1253,1255],{"class":155,"line":407},[153,1240,1241],{"class":166},"      ...",[153,1243,470],{"class":217},[153,1245,1246],{"class":170},"options",[153,1248,1249],{"class":166}," ||",[153,1251,1252],{"class":166}," {}",[153,1254,429],{"class":217},[153,1256,232],{"class":166},[153,1258,1259],{"class":155,"line":413},[153,1260,1261],{"class":166},"    }\n",[153,1263,1264,1267],{"class":155,"line":438},[153,1265,1266],{"class":217},"  )",[153,1268,1113],{"class":166},[153,1270,1271],{"class":155,"line":444},[153,1272,891],{"class":166},[120,1274,1275],{"id":1275},"优势特点",[1277,1278,1279,1287,1293,1299,1305],"ol",{},[1280,1281,1282,1286],"li",{},[1283,1284,1285],"strong",{},"类型安全","：自动生成 TypeScript 类型定义，编译时捕获错误",[1280,1288,1289,1292],{},[1283,1290,1291],{},"减少重复工作","：无需手动编写 API 请求函数",[1280,1294,1295,1298],{},[1283,1296,1297],{},"与 Apifox 集成","：直接从最新的 API 文档生成代码",[1280,1300,1301,1304],{},[1283,1302,1303],{},"可定制化","：通过 hooks 自定义函数命名规则",[1280,1306,1307,1310],{},[1283,1308,1309],{},"Vue 生态适配","：支持 Vue 项目中的请求模式",[120,1312,1313],{"id":1313},"最佳实践",[1277,1315,1316,1319,1322,1325],{},[1280,1317,1318],{},"将生成的 API 文件加入版本控制",[1280,1320,1321],{},"定期重新生成以同步最新的 API 变更",[1280,1323,1324],{},"结合 Git hooks 在提交前自动更新 API 代码",[1280,1326,1327],{},"在 CI/CD 流程中验证生成的代码",[108,1329,1330,1331,1333],{},"通过使用 ",[127,1332,117],{},"，我们可以显著提高 API 对接的效率，同时确保类型安全，减少人为错误。",[1335,1336,1337],"blockquote",{},[108,1338,1339],{},"（注：文档内容由 Copilot 生成）",[1341,1342,1343],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":149,"searchDepth":189,"depth":189,"links":1345},[1346,1347,1350,1351,1352,1353],{"id":122,"depth":189,"text":123},{"id":132,"depth":189,"text":132,"children":1348},[1349],{"id":937,"depth":196,"text":937},{"id":1030,"depth":189,"text":1030},{"id":1044,"depth":189,"text":1044},{"id":1275,"depth":189,"text":1275},{"id":1313,"depth":189,"text":1313},"2025-12-04T00:00:00.000Z","介绍如何根据 Apifox 文档自动生成类型安全的 API 请求文件，提高开发效率","md",{"src":1358},"https://picsum.photos/id/106/640/360",{},{"title":64,"description":1355},"SmbNN4HWjlwr7sIFtQtcOJW-Wv39NDxwGN4rghG3wuQ",[1363,1365],{"title":60,"path":61,"stem":62,"description":1364,"children":-1},"[Vue warn]: Component inside \u003CTransition> renders non-element root node that cannot be  （导致页面切换后无法渲染）",{"title":68,"path":69,"stem":70,"description":1366,"children":-1},"探讨如何在 H5 环境下通过 fetch + FormData 解决 uni.upload 无法在一个接口上传多个文件的问题",1774239530039]