vue3+axios自動化api

語言: CN / TW / HK

theme: channing-cyan

程式碼生成器

概述

在實踐中,我們發現相關後臺請求的程式碼重複率非常高,新增和修改都費力,並且是沒技術含量的體力活。 但又必須要這樣做,不適合以公共函式的形式重用,為了解決這個重複的體力活,我們開發了程式碼生成器,用工具來代替體力活。

對於前後端的資料互動都可以歸納為是對實體的 新增、修改、刪除、查詢。

程式碼生成器的原理是也是按照對實體的增、刪、改、查規範,利用 NodeJs 根據介面的配置檔案(包含請求路徑、請求選項)按指定模板建立統一符合開發規範的 js 檔案到工程指定目錄下。

示例

以下通過一個使用者的實體配置,講解由程式碼生成器生成的程式碼檔案。

1、新建檔案 /coder/schemas/system.js 以下配置實現使用者的增、刪、改、列表查詢、詳情查詢、介面呼叫。

javascript module.exports = { name: '系統管理模組', model: [ { title: '選單管理', name: 'menu', methods: ['add', 'remove', 'edit', 'list', 'info'], path: '/system/menu', },

TIP

新建實體配置檔案必須要在/coder/schemas/目錄下,可以建目錄。

2、執行命令 npm run coder 生成程式碼,程式碼檔案目錄在 src/api/system.js, 目錄結構如下:

約定

程式碼生成器生成的程式碼需要與後端介面有預先的約定

請求 URL 的約定

前後端分離開發最佳實踐是採用 RESTful 的介面形式進行通訊,在此我們對請求 URL 進行統一的規範約定。

| 請求型別 | 前端預定的方法字首 | 請求方法型別 | api 地址的字尾對映 | | ---------- | ------------------ | ------------ | ------------------ | | 新增 | add | post | /add | | 更新 | edit | put | /edit | | 刪除 | remove | delete | /remove | | 分頁列表 | page | get | /page | | 不分頁列表 | list | get | /list | | 匯出 | export | get | /export | | 詳情 | info | get | /info | | 唯一校驗 | unique | get | /unique |

請求傳參的約定

GET 請求需要中文轉碼,匯出 export 請求responseType = 'blob'

if (config.method === 'get') config.paramsSerializer = (params) => qs.stringify(params, { arrayFormat: 'comma' });

分頁列表,請求引數約定

| 引數名 | 說明 | | --------- | ----------------------------------------------------------------------- | | pageSize | 每頁幾條資料 | | pageNum | 頁碼,從 1 開始 | | needCount | needCount:1,需要總數,處理不需要總條數的情況(後臺效能優化),預設為 1 |

分頁列表 響應示例

javascript code: 200, data: { rows: [{ id: "2" },{ id: "4" },{ id: "5" }], total: 3 }, msg: "請求成功"

響應碼 code 的約定

200:執行成功 401:未登入(需要重新登入) 403:許可權不足 404: 訪問資源不存在 418: 聯合登陸失敗 500:系統內部錯誤(非業務程式碼裡顯式丟擲的異常,例如由於資料不正確導致空指標異常、資料庫異常等等)

請求跨域問題解決方案

前後端分離開發模式,由於前後端可以進行單獨部署,請求跨域問題很常見,解決方法主要有兩種方式:

1.採用 nginx 代理 2.介面響應頭開啟 Cross (推薦)

響應頭需要做以下配置, 同時後端需要開放 OPTIONS 型別的請求,跨域帶 cookie 的請求時,瀏覽器先試探性發送 OPTIONS 請求,成功後才發起真正的請求

javascript Access-Control-Allow-Credentials:true Access-Control-Allow-Origin:請求的host

如:

javascript Access-Control-Allow-Credentials:true Access-Control-Allow-Origin:http://www.fbknav.cn:98

如果介面不需跨域帶 cookie 驗證資訊,可以簡單設定

javascript Access-Control-Allow-Origin: *

全域性配置

當後端提供的介面與約定的規範不一致的時候,可以通過配置進行相應的調整做適配,但建議還是按前端建議的約定規範。

配置說明coder/config.js

```javascript module.exports = { // 架構配置檔案目錄 schemasDir: "./schemas/",

// 模板檔案目錄 templatesDir: "./templates/",

// api請求地址字首 pathPrefix: "API_HOST",

// api支援的請求方法 methods: [ "add", // 新增資料 "edit", // 更新資料 "remove", // 刪除資料 "page", // 列表資料,響應資料含有分頁資訊,如:總數、當前頁碼、頁大小 "list", // 不分頁列表資料 "export", // 根據條件匯出 "info", // 詳情查詢 "unique", // 唯一校驗 ],

// 資料請求型別對應http請求方法的對映 methodTypeMap: { add: "post", edit: "put", remove: "delete", page: "get", list: "get", export: "get", info: "get", unique: "get", },

// 資料請求型別對應api地址的字尾對映 methodSuffixMap: { add: "/add", edit: "/edit", remove: "/remove", page: "/page", list: "/list", export: "/export", info: "/info", unique: "/unique", },

// 請求方法對應的中文註釋 methodCommentMap: { add: "新增<%=cname%>", edit: "更新<%=cname%>", remove: "刪除<%=cname%>", page: "獲取<%=cname%>分頁列表", list: "獲取<%=cname%>不分頁列表", export: "根據條件匯出<%=cname%>", info: "獲取<%=cname%>單條資訊詳情", unique: "<%=cname%>欄位去重校驗", },

// 是否開啟生成批量刪除 batchEnabled: true,

// 生成api檔案路徑 outApiPath: "../src/api/", }; ```

模型配置

一個標準的模型配置檔案如下,建議相同的實體操作都在一個檔案裡配置。

javascript module.exports = { name: "系統管理模組", // 模組名稱,用來生成註釋文件 model: { path: "/api/users", // 介面地址路徑,必須 title: "", // 介面說明,用來生成註釋文件 name: "", // 方法名,methods + name使用駝峰法生成完整的方法名,可選 prefix: "", // 介面地址字首,可選,預設為`coder/config.js`中的pathPrefix, 名稱必須要在 src/config/index.js中定義,否則報錯 methods: [ "add", // 新增資料 "edit", // 更新資料 "remove", // 刪除資料 "page", // 列表資料,響應資料含有分頁資訊,如:總數、當前頁碼、頁大小 "list", // 不分頁列表資料 "export", // 根據條件匯出 "info", // 詳情查詢 "unique", // 唯一校驗 ], // 生成請求方法,沒有該引數時預設全部,如需要自定義,書寫名稱即可 options: {}, // axios 引數選項,可選 disabled: false, // 是否禁用該配置項, 設定為true,程式碼生成器將忽略該配置 }, };

1、實現對一個實體進行增、刪、改、查、匯出、唯一性校驗

javascript module.exports = { name: "系統管理模組", model: { path: "/api/user", }, };

2、只需要增、刪、改、查中得某些操作,可以指定生成你需要的方法

javascript module.exports = { name: "系統管理模組", model: { path: '/api/user', // 需要生成的方法,可以按需要設定 methods: ['add', 'edit', 'remove', 'list', 'info'], } }

3、自定義方法配置

javascript module.exports = { name: "系統管理模組", model: { title: "登入介面", name: "login", methods: "auth", path: "/auth/login", options: { method: "post", }, }, };

4、指定請求介面地址字首

javascript module.exports = { name: "系統管理模組", model: { title: "登入介面", name: "login", methods: "auth", prefix: "OTHER_PATH", // 設定與全域性配置不同的字首,OTHER_PATH 在 src/config/index.js中定義 path: "/auth/login", options: { method: "post", }, }, };

「其他文章」