v3-admin-vite 整合pont的詳細(xì)過(guò)程
需求
目前后端的Admin模板使用的是v3-admin-vite,需要整合pont接口,方便前后端統(tǒng)一一體化開(kāi)發(fā)
安裝PONT
按照官方的文檔,將pont engine安裝好,然后在項(xiàng)目根目錄執(zhí)行pont start。注意生成代碼路徑要修改一下,因?yàn)関3-admin-vite是放到src下
數(shù)據(jù)源是swagger的API地址,swagger配置方式略。下一步在VSCode里安裝pont工具,這樣就可以生成js api代碼了,但是在生成前,建議修改一下配置。
格式統(tǒng)一化
如果直接生成,生成的代碼會(huì)由于 prettier 的關(guān)系出現(xiàn)不少錯(cuò)誤提示。解決的辦法是參考根目錄下v3-admin-vite的prettier.config.js,修改一下根目錄下的pont-config.json,讓它們保持一致
然后VSCode下切換到pont面板以此點(diǎn)擊拉取遠(yuǎn)程數(shù)據(jù)源,生成接口代碼:
然后代碼就生成好了,生成的代碼是這么個(gè)對(duì)應(yīng)關(guān)系:
每個(gè)導(dǎo)出的方法一個(gè)ts文件
整合請(qǐng)求
前面弄完了,v3和pont的請(qǐng)求還是各干各的。需要將它們整合起來(lái)。
v3的請(qǐng)求在src/util/services.ts
pont的請(qǐng)求在src/services/pontCore.ts
修改pontCore.ts,以適配v3-admin的請(qǐng)求。實(shí)際上,除了個(gè)別狀態(tài)碼有差別,大部分也是兼容ccframe的,但是有幾個(gè)問(wèn)題
1)請(qǐng)求長(zhǎng)度問(wèn)題,pont默認(rèn)里post請(qǐng)求是將所有的參數(shù)生成到URL請(qǐng)求的,見(jiàn)這部分代碼
這個(gè)干了兩個(gè)事情:
1)把路徑占位符例如{id}替換為param里的id,并從param里刪除
2)把param剩余的參數(shù)掛到URL后面
所以如果POST發(fā)送參數(shù)過(guò)長(zhǎng),這樣會(huì)導(dǎo)致URL請(qǐng)求超過(guò)承載長(zhǎng)度,不適合發(fā)送大量的數(shù)據(jù),因此需要擴(kuò)充表單發(fā)送的方式,當(dāng)post請(qǐng)求時(shí)以表單編碼發(fā)送。
本著最小修改原則,我們只需要修改pontTemplate.ts,不使用PontCore,采用v3 admin的請(qǐng)求:
import { Interface, BaseClass, Property, CodeGenerator, Surrounding } from 'pont-engine' export default class MyGenerator extends CodeGenerator { getInterfaceContentInDeclaration(inter: Interface) { const requestParams = inter.getRequestParams() const paramsCode = inter.getParamsCode('Params') return ` export ${paramsCode} export type Response = ${inter.responseType} export const init: Response; export function request(${requestParams}): Promise<Response>; ` } getBaseClassInDeclaration(base: BaseClass) { const originProps = base.properties base.properties = base.properties.map((prop) => { return new Property({ ...prop, required: false }) }) const result = super.getBaseClassInDeclaration(base) base.properties = originProps return result } getInterfaceContent(inter: Interface) { //const method = inter.method.toUpperCase() const axiosParamKey = 'GET' == inter.method.toUpperCase() ? 'params' : 'data' // 如果是GET,放param,如果是POST/PUT,放data const requestParams = inter.getRequestParams(this.surrounding) const paramsCode = inter.getParamsCode('Params', this.surrounding) return ` /** * @desc ${inter.description} */ import * as defs from '../../baseClass'; import { request as service } from '../../../utils/service'; export ${paramsCode} export const init = ${inter.response.getInitialValue()}; export function request(${requestParams}, jsonPost: boolean = false) { return service({url:"${inter.path}", ...${inter.getRequestContent()}, ${axiosParamKey}: params, jsonPost}) } ` } }
嘗試一下:
import './../../services/' API.commonAdmin.doLogin .request({ loginId: 'admin', userPsw: 'ssss', sid: '8888', validateCode: 'nere' }) .then((res) => { console.log('*****', res) })
能夠看到請(qǐng)求輸出。但是報(bào)找不到參數(shù),發(fā)現(xiàn)請(qǐng)求被編碼成application/json格式了,當(dāng)然接收不到了(如果要接收必須用@RequestBody)。由于我們請(qǐng)求大部分都是form格式的key-value數(shù)據(jù),很少有結(jié)構(gòu)化的數(shù)據(jù),因此,需要默認(rèn)為application/x-www-form-urlencoded編碼,但是預(yù)留一個(gè)參數(shù)可以傳遞json數(shù)據(jù)支持結(jié)構(gòu)化數(shù)據(jù),因此在模板里添加了一個(gè)jsonPost變量,當(dāng)開(kāi)啟時(shí),采用application/json編碼,修改src/utils/service.ts的請(qǐng)求部分如下:
/** 擴(kuò)展了jsonPost參數(shù) */ export interface AxiosRequestConfigEx extends AxiosRequestConfig { jsonPost?: boolean } /** 創(chuàng)建請(qǐng)求方法 */ function createRequest(service: AxiosInstance) { return function <T>(config: AxiosRequestConfigEx): Promise<T> { const token = getToken() const defaultConfig = { headers: { // 攜帶 Token Authorization: token ? `Bearer ${token}` : undefined, 'Content-Type': 'application/x-www-form-urlencoded' //默認(rèn)form編碼,少量超大對(duì)象使用jsonPost }, timeout: 10000, //默認(rèn)10秒請(qǐng)求超時(shí) baseURL: import.meta.env.VITE_BASE_API, data: {} } // 將默認(rèn)配置 defaultConfig 和傳入的自定義配置 config 進(jìn)行合并成為 mergeConfig const mergeConfig = merge(defaultConfig, config) if (config.jsonPost == true) { mergeConfig.headers['content-type'] = 'application/json' } return service(mergeConfig) } }
這樣配合模板里傳入的jsonPost變量,當(dāng)jsonPost傳true時(shí),可以使用json body進(jìn)行傳遞
整合返回
整合請(qǐng)求后基本上本文可以結(jié)束了,但是項(xiàng)目里由于對(duì)返回進(jìn)行了一些新的約定。需要進(jìn)行調(diào)整,此部分直接修改v3-admin-vite的service.ts請(qǐng)求返回部分即可,不在本文贅述
到此這篇關(guān)于v3-admin-vite 整合pont的文章就介紹到這了,更多相關(guān)v3-admin-vite 整合pont內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript高級(jí)程序設(shè)計(jì) 讀書(shū)筆記之八 Function類及閉包
Function類及閉包,學(xué)習(xí)js的朋友可以參考下2012-02-02uni-app中實(shí)現(xiàn)元素拖動(dòng)效果
這篇文章主要介紹了uni-app中實(shí)現(xiàn)元素拖動(dòng)效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01Js查找字符串中出現(xiàn)次數(shù)最多的字符及個(gè)數(shù)實(shí)例解析
這篇文章主要介紹了Js查找字符串中出現(xiàn)次數(shù)最多的字符及個(gè)數(shù) ,本文分為傳統(tǒng)寫法和正則寫法兩種方法給大家介紹了js查找字符串出現(xiàn)次數(shù)最多的字符及個(gè)數(shù),非常不錯(cuò),感興趣的朋友參考下吧2016-09-09