目錄
項目初始化
環(huán)境準備
初始化項目
項目配置
一、eslint配置
.eslint.cjs配置文件
?vue3環(huán)境代碼校驗插件
安裝指令
修改.eslintrc.cjs配置文件?
.eslintignore忽略文件
1.4運行腳本?
二、配置prettier?
2.1安裝依賴包
2.2.prettierrc.json添加規(guī)則?
2.3.prettierignore忽略文件
?三、配置stylelint
3.1.stylelintrc.cjs配置文件
3.2.stylelintignore忽略文件
3.3運行腳本
四、配置husky
安裝husky
執(zhí)行
五、配置commitlint
六、強制使用pnpm包管理器工具
三、項目集成
集成element-plus
src別名的配置
環(huán)境變量的配置
SVG圖標配置
svg封裝為全局組件
集成sass
mock數(shù)據(jù)
axios二次封裝
API接口統(tǒng)一管理
項目初始化
今天來帶大家從0開始搭建一個vue3版本的后臺管理系統(tǒng)。一個項目要有統(tǒng)一的規(guī)范,需要使用eslint+stylelint+prettier來對我們的代碼質(zhì)量做檢測和修復,需要使用husky來做commit攔截,需要使用commitlint來統(tǒng)一提交規(guī)范,需要使用preinstall來統(tǒng)一包管理工具。
下面我們就用這一套規(guī)范來初始化我們的項目,集成一個規(guī)范的模版。
環(huán)境準備
- node v16.14.2
- pnpm 8.0.0
初始化項目
本項目使用vite進行構(gòu)建,vite官方中文文檔參考:cn.vitejs.dev/guide/
pnpm:performant npm ,意味“高性能的 npm”。pnpm由npm/yarn衍生而來,解決了npm/yarn內(nèi)部潛在的bug,極大的優(yōu)化了性能,擴展了使用場景。被譽為“最先進的包管理工具”
pnpm安裝指令
npm i -g pnpm
項目初始化命令:?
pnpm create vite
進入到項目根目錄pnpm install安裝全部依賴.安裝完依賴運行程序:pnpm run dev
運行完畢項目跑在http://127.0.0.1:5173/,可以訪問你得項目啦
項目配置
一、eslint配置
eslint中文官網(wǎng):ESLint - Pluggable JavaScript linter - ESLint中文
ESLint最初是由Nicholas C. Zakas?于2013年6月創(chuàng)建的開源項目。它的目標是提供一個插件化的javascript代碼檢測工具
首先安裝eslint
pnpm i eslint -D
生成配置文件:.eslint.cjs
npx eslint --init
.eslint.cjs配置文件
module.exports = {
//運行環(huán)境
"env": {
"browser": true,//瀏覽器端
"es2021": true,//es2021
},
//規(guī)則繼承
"extends": [
//全部規(guī)則默認是關(guān)閉的,這個配置項開啟推薦規(guī)則,推薦規(guī)則參照文檔
//比如:函數(shù)不能重名、對象不能出現(xiàn)重復key
"eslint:recommended",
//vue3語法規(guī)則
"plugin:vue/vue3-essential",
//ts語法規(guī)則
"plugin:@typescript-eslint/recommended"
],
//要為特定類型的文件指定處理器
"overrides": [
],
//指定解析器:解析器
//Esprima 默認解析器
//Babel-ESLint babel解析器
//@typescript-eslint/parser ts解析器
"parser": "@typescript-eslint/parser",
//指定解析器選項
"parserOptions": {
"ecmaVersion": "latest",//校驗ECMA最新版本
"sourceType": "module"http://設(shè)置為"script"(默認),或者"module"代碼在ECMAScript模塊中
},
//ESLint支持使用第三方插件。在使用插件之前,您必須使用npm安裝它
//該eslint-plugin-前綴可以從插件名稱被省略
"plugins": [
"vue",
"@typescript-eslint"
],
//eslint規(guī)則
"rules": {
}
}
?vue3環(huán)境代碼校驗插件
# 讓所有與prettier規(guī)則存在沖突的Eslint rules失效,并使用prettier進行代碼檢查
"eslint-config-prettier": "^8.6.0",
"eslint-plugin-import": "^2.27.5",
"eslint-plugin-node": "^11.1.0",
# 運行更漂亮的Eslint,使prettier規(guī)則優(yōu)先級更高,Eslint優(yōu)先級低
"eslint-plugin-prettier": "^4.2.1",
# vue.js的Eslint插件(查找vue語法錯誤,發(fā)現(xiàn)錯誤指令,查找違規(guī)風格指南
"eslint-plugin-vue": "^9.9.0",
# 該解析器允許使用Eslint校驗所有babel code
"@babel/eslint-parser": "^7.19.1",
安裝指令
pnpm install -D eslint-plugin-import eslint-plugin-vue eslint-plugin-node eslint-plugin-prettier eslint-config-prettier eslint-plugin-node @babel/eslint-parser
修改.eslintrc.cjs配置文件?
// @see https://eslint.bootcss.com/docs/rules/
module.exports = {
env: {
browser: true,
es2021: true,
node: true,
jest: true,
},
/* 指定如何解析語法 */
parser: 'vue-eslint-parser',
/** 優(yōu)先級低于 parse 的語法解析配置 */
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
parser: '@typescript-eslint/parser',
jsxPragma: 'React',
ecmaFeatures: {
jsx: true,
},
},
/* 繼承已有的規(guī)則 */
extends: [
'eslint:recommended',
'plugin:vue/vue3-essential',
'plugin:@typescript-eslint/recommended',
'plugin:prettier/recommended',
],
plugins: ['vue', '@typescript-eslint'],
/*
* "off" 或 0 ==> 關(guān)閉規(guī)則
* "warn" 或 1 ==> 打開的規(guī)則作為警告(不影響代碼執(zhí)行)
* "error" 或 2 ==> 規(guī)則作為一個錯誤(代碼不能執(zhí)行,界面報錯)
*/
rules: {
// eslint(https://eslint.bootcss.com/docs/rules/)
'no-var': 'error', // 要求使用 let 或 const 而不是 var
'no-multiple-empty-lines': ['warn', { max: 1 }], // 不允許多個空行
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-unexpected-multiline': 'error', // 禁止空余的多行
'no-useless-escape': 'off', // 禁止不必要的轉(zhuǎn)義字符
// typeScript (https://typescript-eslint.io/rules)
'@typescript-eslint/no-unused-vars': 'error', // 禁止定義未使用的變量
'@typescript-eslint/prefer-ts-expect-error': 'error', // 禁止使用 @ts-ignore
'@typescript-eslint/no-explicit-any': 'off', // 禁止使用 any 類型
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/no-namespace': 'off', // 禁止使用自定義 TypeScript 模塊和命名空間。
'@typescript-eslint/semi': 'off',
// eslint-plugin-vue (https://eslint.vuejs.org/rules/)
'vue/multi-word-component-names': 'off', // 要求組件名稱始終為 “-” 鏈接的單詞
'vue/script-setup-uses-vars': 'error', // 防止<script setup>使用的變量<template>被標記為未使用
'vue/no-mutating-props': 'off', // 不允許組件 prop的改變
'vue/attribute-hyphenation': 'off', // 對模板中的自定義組件強制執(zhí)行屬性命名樣式
},
}
.eslintignore忽略文件
dist
node_modules
1.4運行腳本?
package.json新增兩個運行腳本
"scripts": {
"lint": "eslint src",
"fix": "eslint src --fix",
}
二、配置prettier?
有了eslint,為什么還要有prettier?eslint針對的是javascript,他是一個檢測工具,包含js語法以及少部分格式問題,在eslint看來,語法對了就能保證代碼正常運行,格式問題屬于其次;
而prettier屬于格式化工具,它看不慣格式不統(tǒng)一,所以它就把eslint沒干好的事接著干,另外,prettier支持
包含js在內(nèi)的多種語言。
總結(jié)起來,eslint和prettier這倆兄弟一個保證js代碼質(zhì)量,一個保證代碼美觀。
2.1安裝依賴包
pnpm install -D eslint-plugin-prettier prettier eslint-config-prettier
2.2.prettierrc.json添加規(guī)則?
{
"singleQuote": true,
"semi": false,
"bracketSpacing": true,
"htmlWhitespaceSensitivity": "ignore",
"endOfLine": "auto",
"trailingComma": "all",
"tabWidth": 2
}
2.3.prettierignore忽略文件
/dist/*
/html/*
.local
/node_modules/**
**/*.svg
**/*.sh
/public/*
通過pnpm run lint去檢測語法,如果出現(xiàn)不規(guī)范格式,通過pnpm run fix 修改
?三、配置stylelint
stylelint為css的lint工具??筛袷交痗ss代碼,檢查css語法錯誤與不合理的寫法,指定css書寫順序等。
我們的項目中使用scss作為預處理器,安裝以下依賴:
pnpm add sass sass-loader stylelint postcss postcss-scss postcss-html stylelint-config-prettier stylelint-config-recess-order stylelint-config-recommended-scss stylelint-config-standard stylelint-config-standard-vue stylelint-scss stylelint-order stylelint-config-standard-scss -D
3.1.stylelintrc.cjs
配置文件
官網(wǎng):Home | Stylelint中文文檔 | Stylelint中文網(wǎng)
// @see https://stylelint.bootcss.com/
module.exports = {
extends: [
'stylelint-config-standard', // 配置stylelint拓展插件
'stylelint-config-html/vue', // 配置 vue 中 template 樣式格式化
'stylelint-config-standard-scss', // 配置stylelint scss插件
'stylelint-config-recommended-vue/scss', // 配置 vue 中 scss 樣式格式化
'stylelint-config-recess-order', // 配置stylelint css屬性書寫順序插件,
'stylelint-config-prettier', // 配置stylelint和prettier兼容
],
overrides: [
{
files: ['**/*.(scss|css|vue|html)'],
customSyntax: 'postcss-scss',
},
{
files: ['**/*.(html|vue)'],
customSyntax: 'postcss-html',
},
],
ignoreFiles: [
'**/*.js',
'**/*.jsx',
'**/*.tsx',
'**/*.ts',
'**/*.json',
'**/*.md',
'**/*.yaml',
],
/**
* null => 關(guān)閉該規(guī)則
* always => 必須
*/
rules: {
'value-keyword-case': null, // 在 css 中使用 v-bind,不報錯
'no-descending-specificity': null, // 禁止在具有較高優(yōu)先級的選擇器后出現(xiàn)被其覆蓋的較低優(yōu)先級的選擇器
'function-url-quotes': 'always', // 要求或禁止 URL 的引號 "always(必須加上引號)"|"never(沒有引號)"
'no-empty-source': null, // 關(guān)閉禁止空源碼
'selector-class-pattern': null, // 關(guān)閉強制選擇器類名的格式
'property-no-unknown': null, // 禁止未知的屬性(true 為不允許)
'block-opening-brace-space-before': 'always', //大括號之前必須有一個空格或不能有空白符
'value-no-vendor-prefix': null, // 關(guān)閉 屬性值前綴 --webkit-box
'property-no-vendor-prefix': null, // 關(guān)閉 屬性前綴 -webkit-mask
'selector-pseudo-class-no-unknown': [
// 不允許未知的選擇器
true,
{
ignorePseudoClasses: ['global', 'v-deep', 'deep'], // 忽略屬性,修改element默認樣式的時候能使用到
},
],
},
}
3.2.stylelintignore忽略文件
/node_modules/*
/dist/*
/html/*
/public/*
3.3運行腳本
"scripts": {
"lint:style": "stylelint src/**/*.{css,scss,vue} --cache --fix"
}
最后配置統(tǒng)一的prettier來格式化我們的js和css,html代碼?
"scripts": {
"dev": "vite --open",
"build": "vue-tsc && vite build",
"preview": "vite preview",
"lint": "eslint src",
"fix": "eslint src --fix",
"format": "prettier --write \"./**/*.{html,vue,ts,js,json,md}\"",
"lint:eslint": "eslint src/**/*.{ts,vue} --cache --fix",
"lint:style": "stylelint src/**/*.{css,scss,vue} --cache --fix"
},
當我們運行pnpm run format
的時候,會把代碼直接格式化
四、配置husky
在上面我們已經(jīng)集成好了我們代碼校驗工具,但是需要每次手動的去執(zhí)行命令才會格式化我們的代碼。如果有人沒有格式化就提交了遠程倉庫中,那這個規(guī)范就沒什么用。所以我們需要強制讓開發(fā)人員按照代碼規(guī)范來提交。
要做到這件事情,就需要利用husky在代碼提交之前觸發(fā)git hook(git在客戶端的鉤子),然后執(zhí)行pnpm run format
來自動的格式化我們的代碼。
安裝husky
pnpm install -D husky
執(zhí)行
npx husky-init
會在根目錄下生成個一個.husky目錄,在這個目錄下面會有一個pre-commit文件,這個文件里面的命令在我們執(zhí)行commit的時候就會執(zhí)行
在.husky/pre-commit
文件添加如下命令:
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
pnpm run format
當我們對代碼進行commit操作的時候,就會執(zhí)行命令,對代碼進行格式化,然后再提交。
?
五、配置commitlint
對于我們的commit信息,也是有統(tǒng)一規(guī)范的,不能隨便寫,要讓每個人都按照統(tǒng)一的標準來執(zhí)行,我們可以利用commitlint來實現(xiàn)。
安裝包
pnpm add @commitlint/config-conventional @commitlint/cli -D
添加配置文件,新建commitlint.config.cjs
(注意是cjs),然后添加下面的代碼:
module.exports = {
extends: ['@commitlint/config-conventional'],
// 校驗規(guī)則
rules: {
'type-enum': [
2,
'always',
[
'feat',
'fix',
'docs',
'style',
'refactor',
'perf',
'test',
'chore',
'revert',
'build',
],
],
'type-case': [0],
'type-empty': [0],
'scope-empty': [0],
'scope-case': [0],
'subject-full-stop': [0, 'never'],
'subject-case': [0, 'never'],
'header-max-length': [0, 'always', 72],
},
}
在package.json
中配置scripts命令
# 在scrips中添加下面的代碼
{
"scripts": {
"commitlint": "commitlint --config commitlint.config.cjs -e -V"
},
}
配置結(jié)束,現(xiàn)在當我們填寫commit
信息的時候,前面就需要帶著下面的subject
'feat',//新特性、新功能
'fix',//修改bug
'docs',//文檔修改
'style',//代碼格式修改, 注意不是 css 修改
'refactor',//代碼重構(gòu)
'perf',//優(yōu)化相關(guān),比如提升性能、體驗
'test',//測試用例修改
'chore',//其他修改, 比如改變構(gòu)建流程、或者增加依賴庫、工具等
'revert',//回滾到上一個版本
'build',//編譯相關(guān)的修改,例如發(fā)布版本、對項目構(gòu)建或者依賴的改動
配置husky
npx husky add .husky/commit-msg
在生成的commit-msg文件中添加下面的命令
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
pnpm commitlint
當我們 commit 提交信息時,就不能再隨意寫了,必須是 git commit -m 'fix: xxx' 符合類型的才可以,需要注意的是類型的后面需要用英文的 :,并且冒號后面是需要空一格的,這個是不能省略的
六、強制使用pnpm包管理器工具
團隊開發(fā)項目的時候,需要統(tǒng)一包管理器工具,因為不同包管理器工具下載同一個依賴,可能版本不一樣,
導致項目出現(xiàn)bug問題,因此包管理器工具需要統(tǒng)一管理?。?!
在根目錄創(chuàng)建scritps/preinstall.js
文件,添加下面的內(nèi)容
if (!/pnpm/.test(process.env.npm_execpath || '')) {
console.warn(
`\u001b[33mThis repository must using pnpm as the package manager ` +
` for scripts to work properly.\u001b[39m\n`,
)
process.exit(1)
}
配置命令
"scripts": {
"preinstall": "node ./scripts/preinstall.js"
}
當我們使用npm或者yarn來安裝包的時候,就會報錯了。原理就是在install的時候會觸發(fā)preinstall(npm提供的生命周期鉤子)這個文件里面的代碼。
三、項目集成
集成element-plus
硅谷甄選運營平臺,UI組件庫采用的element-plus,因此需要集成element-plus插件!??!
官網(wǎng)地址:一個 Vue 3 UI 框架 | Element Plus
pnpm install element-plus @element-plus/icons-vue
入口文件main.ts全局安裝element-plus,element-plus默認支持語言英語設(shè)置為中文
import ElementPlus from 'element-plus';
import 'element-plus/dist/index.css'
//@ts-ignore忽略當前文件ts類型的檢測否則有紅色提示(打包會失敗)
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
app.use(ElementPlus, {
locale: zhCn
})
Element Plus全局組件類型聲明
// tsconfig.json
{
"compilerOptions": {
// ...
"types": ["element-plus/global"]
}
}
配置完畢可以測試element-plus組件與圖標的使用.
src別名的配置
在開發(fā)項目的時候文件與文件關(guān)系可能很復雜,因此我們需要給src文件夾配置一個別名?。?!
// vite.config.ts
import {defineConfig} from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'
export default defineConfig({
plugins: [vue()],
resolve: {
alias: {
"@": path.resolve("./src") // 相對路徑別名配置,使用 @ 代替 src
}
}
})
TypeScript 編譯配置
// tsconfig.json
{
"compilerOptions": {
"baseUrl": "./", // 解析非相對模塊的基地址,默認是當前目錄
"paths": { //路徑映射,相對于baseUrl
"@/*": ["src/*"]
}
}
}
環(huán)境變量的配置
項目開發(fā)過程中,至少會經(jīng)歷開發(fā)環(huán)境、測試環(huán)境和生產(chǎn)環(huán)境(即正式環(huán)境)三個階段。不同階段請求的狀態(tài)(如接口地址等)不盡相同,若手動切換接口地址是相當繁瑣且易出錯的。于是環(huán)境變量配置的需求就應(yīng)運而生,我們只需做簡單的配置,把環(huán)境狀態(tài)切換的工作交給代碼。
開發(fā)環(huán)境(development)
顧名思義,開發(fā)使用的環(huán)境,每位開發(fā)人員在自己的dev分支上干活,開發(fā)到一定程度,同事會合并代碼,進行聯(lián)調(diào)。
測試環(huán)境(testing)
測試同事干活的環(huán)境啦,一般會由測試同事自己來部署,然后在此環(huán)境進行測試
生產(chǎn)環(huán)境(production)
生產(chǎn)環(huán)境是指正式提供對外服務(wù)的,一般會關(guān)掉錯誤報告,打開錯誤日志。(正式提供給客戶使用的環(huán)境。)
注意:一般情況下,一個環(huán)境對應(yīng)一臺服務(wù)器,也有的公司開發(fā)與測試環(huán)境是一臺服務(wù)器?。?!
項目根目錄分別添加 開發(fā)、生產(chǎn)和測試環(huán)境的文件!
.env.development
.env.production
.env.test
文件內(nèi)容
# 變量必須以 VITE_ 為前綴才能暴露給外部讀取
NODE_ENV = 'development'
VITE_APP_TITLE = '硅谷甄選運營平臺'
VITE_APP_BASE_API = '/dev-api'
NODE_ENV = 'production'
VITE_APP_TITLE = '硅谷甄選運營平臺'
VITE_APP_BASE_API = '/prod-api'
# 變量必須以 VITE_ 為前綴才能暴露給外部讀取
NODE_ENV = 'test'
VITE_APP_TITLE = '硅谷甄選運營平臺'
VITE_APP_BASE_API = '/test-api'
配置運行命令:package.json
"scripts": {
"dev": "vite --open",
"build:test": "vue-tsc && vite build --mode test",
"build:pro": "vue-tsc && vite build --mode production",
"preview": "vite preview"
},
通過import.meta.env獲取環(huán)境變量
SVG圖標配置
在開發(fā)項目的時候經(jīng)常會用到svg矢量圖,而且我們使用SVG以后,頁面上加載的不再是圖片資源,
這對頁面性能來說是個很大的提升,而且我們SVG文件比img要小的很多,放在項目中幾乎不占用資源。
安裝SVG依賴插件
pnpm install vite-plugin-svg-icons -D
在vite.config.ts
中配置插件
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import path from 'path'
export default () => {
return {
plugins: [
createSvgIconsPlugin({
// Specify the icon folder to be cached
iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
// Specify symbolId format
symbolId: 'icon-[dir]-[name]',
}),
],
}
}
入口文件導入
import 'virtual:svg-icons-register'
svg封裝為全局組件
因為項目很多模塊需要使用圖標,因此把它封裝為全局組件!??!
在src/components目錄下創(chuàng)建一個SvgIcon組件:代表如下
<template>
<div>
<svg :style="{ width: width, height: height }">
<use :xlink:href="prefix + name" :fill="color"></use>
</svg>
</div>
</template>
<script setup lang="ts">
defineProps({
//xlink:href屬性值的前綴
prefix: {
type: String,
default: '#icon-'
},
//svg矢量圖的名字
name: String,
//svg圖標的顏色
color: {
type: String,
default: ""
},
//svg寬度
width: {
type: String,
default: '16px'
},
//svg高度
height: {
type: String,
default: '16px'
}
})
</script>
<style scoped></style>
在src文件夾目錄下創(chuàng)建一個index.ts文件:用于注冊components文件夾內(nèi)部全部全局組件!??!
import SvgIcon from './SvgIcon/index.vue';
import type { App, Component } from 'vue';
const components: { [name: string]: Component } = { SvgIcon };
export default {
install(app: App) {
Object.keys(components).forEach((key: string) => {
app.component(key, components[key]);
})
}
}
在入口文件引入src/index.ts文件,通過app.use方法安裝自定義插件
import gloablComponent from './components/index';
app.use(gloablComponent);
集成sass
我們目前在組件內(nèi)部已經(jīng)可以使用scss樣式,因為在配置styleLint工具的時候,項目當中已經(jīng)安裝過sass sass-loader,因此我們再組件內(nèi)可以使用scss語法?。?!需要加上lang="scss"
<style scoped lang="scss"></style>
接下來我們?yōu)轫椖刻砑右恍┤值臉邮?/p>
在src/styles目錄下創(chuàng)建一個index.scss文件,當然項目中需要用到清除默認樣式,因此在index.scss引入reset.scss
@import reset.scss
在入口文件引入
import '@/styles'
但是你會發(fā)現(xiàn)在src/styles/index.scss全局樣式文件中沒有辦法使用變量.因此需要給項目中引入全局變量變量.因此需要給項目中引入全局變量.
在style/variable.scss創(chuàng)建一個variable.scss文件!
在vite.config.ts文件配置如下:
export default defineConfig((config) => {
css: {
preprocessorOptions: {
scss: {
javascriptEnabled: true,
additionalData: '@import "./src/styles/variable.scss";',
},
},
},
}
}
@import "./src/styles/variable.less";
后面的;
不要忘記,不然會報錯!
配置完畢你會發(fā)現(xiàn)scss提供這些全局變量可以在組件樣式中使用了?。?!
mock數(shù)據(jù)
安裝依賴:vite-plugin-mock - npm
pnpm install -D vite-plugin-mock mockjs
在 vite.config.js 配置文件啟用插件。
import { UserConfigExport, ConfigEnv } from 'vite'
import { viteMockServe } from 'vite-plugin-mock'
import vue from '@vitejs/plugin-vue'
export default ({ command })=> {
return {
plugins: [
vue(),
viteMockServe({
localEnabled: command === 'serve',
}),
],
}
}
在根目錄創(chuàng)建mock文件夾:去創(chuàng)建我們需要mock數(shù)據(jù)與接口!?。?/p>
在mock文件夾內(nèi)部創(chuàng)建一個user.ts文件
//用戶信息數(shù)據(jù)
function createUserList() {
return [
{
userId: 1,
avatar:
'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
username: 'admin',
password: '111111',
desc: '平臺管理員',
roles: ['平臺管理員'],
buttons: ['cuser.detail'],
routes: ['home'],
token: 'Admin Token',
},
{
userId: 2,
avatar:
'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
username: 'system',
password: '111111',
desc: '系統(tǒng)管理員',
roles: ['系統(tǒng)管理員'],
buttons: ['cuser.detail', 'cuser.user'],
routes: ['home'],
token: 'System Token',
},
]
}
export default [
// 用戶登錄接口
{
url: '/api/user/login',//請求地址
method: 'post',//請求方式
response: ({ body }) => {
//獲取請求體攜帶過來的用戶名與密碼
const { username, password } = body;
//調(diào)用獲取用戶信息函數(shù),用于判斷是否有此用戶
const checkUser = createUserList().find(
(item) => item.username === username && item.password === password,
)
//沒有用戶返回失敗信息
if (!checkUser) {
return { code: 201, data: { message: '賬號或者密碼不正確' } }
}
//如果有返回成功信息
const { token } = checkUser
return { code: 200, data: { token } }
},
},
// 獲取用戶信息
{
url: '/api/user/info',
method: 'get',
response: (request) => {
//獲取請求頭攜帶token
const token = request.headers.token;
//查看用戶信息是否包含有次token用戶
const checkUser = createUserList().find((item) => item.token === token)
//沒有返回失敗的信息
if (!checkUser) {
return { code: 201, data: { message: '獲取用戶信息失敗' } }
}
//如果有返回成功信息
return { code: 200, data: {checkUser} }
},
},
]
安裝axios
pnpm install axios
最后通過axios測試接口?。。?/p>
axios二次封裝
在開發(fā)項目的時候避免不了與后端進行交互,因此我們需要使用axios插件實現(xiàn)發(fā)送網(wǎng)絡(luò)請求。在開發(fā)項目的時候
我們經(jīng)常會把axios進行二次封裝。
目的:
1:使用請求攔截器,可以在請求攔截器中處理一些業(yè)務(wù)(開始進度條、請求頭攜帶公共參數(shù))
2:使用響應(yīng)攔截器,可以在響應(yīng)攔截器中處理一些業(yè)務(wù)(進度條結(jié)束、簡化服務(wù)器返回的數(shù)據(jù)、處理http網(wǎng)絡(luò)錯誤)
在根目錄下創(chuàng)建utils/request.ts
import axios from "axios";
import { ElMessage } from "element-plus";
//創(chuàng)建axios實例
let request = axios.create({
baseURL: import.meta.env.VITE_APP_BASE_API,
timeout: 5000
})
//請求攔截器
request.interceptors.request.use(config => {
return config;
});
//響應(yīng)攔截器
request.interceptors.response.use((response) => {
return response.data;
}, (error) => {
//處理網(wǎng)絡(luò)錯誤
let msg = '';
let status = error.response.status;
switch (status) {
case 401:
msg = "token過期";
break;
case 403:
msg = '無權(quán)訪問';
break;
case 404:
msg = "請求地址錯誤";
break;
case 500:
msg = "服務(wù)器出現(xiàn)問題";
break;
default:
msg = "無網(wǎng)絡(luò)";
}
ElMessage({
type: 'error',
message: msg
})
return Promise.reject(error);
});
export default request;
API接口統(tǒng)一管理
在開發(fā)項目的時候,接口可能很多需要統(tǒng)一管理。在src目錄下去創(chuàng)建api文件夾去統(tǒng)一管理項目的接口;文章來源:http://www.zghlxwxcb.cn/news/detail-465934.html
比如:下面方式文章來源地址http://www.zghlxwxcb.cn/news/detail-465934.html
//統(tǒng)一管理咱們項目用戶相關(guān)的接口
import request from '@/utils/request'
import type {
loginFormData,
loginResponseData,
userInfoReponseData,
} from './type'
//項目用戶相關(guān)的請求地址
enum API {
LOGIN_URL = '/admin/acl/index/login',
USERINFO_URL = '/admin/acl/index/info',
LOGOUT_URL = '/admin/acl/index/logout',
}
//登錄接口
export const reqLogin = (data: loginFormData) =>
request.post<any, loginResponseData>(API.LOGIN_URL, data)
//獲取用戶信息
export const reqUserInfo = () =>
request.get<any, userInfoReponseData>(API.USERINFO_URL)
//退出登錄
export const reqLogout = () => request.post<any, any>(API.LOGOUT_URL)
到了這里,關(guān)于搭建后臺管理系統(tǒng)模板(v3+ts+vite)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!