国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Vue3搭建后臺管理系統(tǒng)模板

這篇具有很好參考價值的文章主要介紹了Vue3搭建后臺管理系統(tǒng)模板。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

搭建后臺管理系統(tǒng)模板

2.1項目初始化

今天來帶大家從0開始搭建一個vue3版本的后臺管理系統(tǒng)。一個項目要有統(tǒng)一的規(guī)范,需要使用eslint+stylelint+prettier來對我們的代碼質(zhì)量做檢測和修復(fù),需要使用husky來做commit攔截,需要使用commitlint來統(tǒng)一提交規(guī)范,需要使用preinstall來統(tǒng)一包管理工具。

下面我們就用這一套規(guī)范來初始化我們的項目,集成一個規(guī)范的模版。

2.1.1環(huán)境準(zhǔn)備

  • node v16.14.2
  • pnpm 8.0.0

2.1.2初始化項目

本項目使用vite進(jìn)行構(gòu)建,vite官方中文文檔參考:cn.vitejs.dev/guide/

pnpm:performant npm ,意味“高性能的 npm”。pnpm由npm/yarn衍生而來,解決了npm/yarn內(nèi)部潛在的bug,極大的優(yōu)化了性能,擴(kuò)展了使用場景。被譽(yù)為“最先進(jìn)的包管理工具”

pnpm安裝指令

npm i -g pnpm

項目初始化命令:

pnpm create vite

進(jìn)入到項目根目錄pnpm install安裝全部依賴.安裝完依賴運行程序:pnpm run dev

運行完畢項目跑在http://127.0.0.1:5173/,可以訪問你得項目啦

2.2項目配置

一、eslint配置

eslint中文官網(wǎng):http://eslint.cn/

ESLint最初是由Nicholas C. Zakas 于2013年6月創(chuàng)建的開源項目。它的目標(biāo)是提供一個插件化的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ī)則默認(rèn)是關(guān)閉的,這個配置項開啟推薦規(guī)則,推薦規(guī)則參照文檔
       //比如:函數(shù)不能重名、對象不能出現(xiàn)重復(fù)key
        "eslint:recommended",
        //vue3語法規(guī)則
        "plugin:vue/vue3-essential",
        //ts語法規(guī)則
        "plugin:@typescript-eslint/recommended"
    ],
    //要為特定類型的文件指定處理器
    "overrides": [
    ],
    //指定解析器:解析器
    //Esprima 默認(rèn)解析器
    //Babel-ESLint babel解析器
    //@typescript-eslint/parser ts解析器
    "parser": "@typescript-eslint/parser",
    //指定解析器選項
    "parserOptions": {
        "ecmaVersion": "latest",//校驗ECMA最新版本
        "sourceType": "module"http://設(shè)置為"script"(默認(rèn)),或者"module"代碼在ECMAScript模塊中
    },
    //ESLint支持使用第三方插件。在使用插件之前,您必須使用npm安裝它
    //該eslint-plugin-前綴可以從插件名稱被省略
    "plugins": [
        "vue",
        "@typescript-eslint"
    ],
    //eslint規(guī)則
    "rules": {
    }
}
1.1vue3環(huán)境代碼校驗插件
# 讓所有與prettier規(guī)則存在沖突的Eslint rules失效,并使用prettier進(jìn)行代碼檢查
"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ī)風(fēng)格指南
"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
1.2修改.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>被標(biāo)記為未使用
    'vue/no-mutating-props': 'off', // 不允許組件 prop的改變
    'vue/attribute-hyphenation': 'off', // 對模板中的自定義組件強(qiáng)制執(zhí)行屬性命名樣式
  },
}

1.3.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作為預(yù)處理器,安裝以下依賴:

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):https://stylelint.bootcss.com/

// @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)閉強(qiáng)制選擇器類名的格式
    '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默認(rèn)樣式的時候能使用到
      },
    ],
  },
}
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"
  },

當(dāng)我們運行pnpm run format的時候,會把代碼直接格式化

四、配置husky

在上面我們已經(jīng)集成好了我們代碼校驗工具,但是需要每次手動的去執(zhí)行命令才會格式化我們的代碼。如果有人沒有格式化就提交了遠(yuǎn)程倉庫中,那這個規(guī)范就沒什么用。所以我們需要強(qiáng)制讓開發(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

當(dāng)我們對代碼進(jìn)行commit操作的時候,就會執(zhí)行命令,對代碼進(jìn)行格式化,然后再提交。

五、配置commitlint

對于我們的commit信息,也是有統(tǒng)一規(guī)范的,不能隨便寫,要讓每個人都按照統(tǒng)一的標(biāo)準(zhǔn)來執(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)在當(dāng)我們填寫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

當(dāng)我們 commit 提交信息時,就不能再隨意寫了,必須是 git commit -m 'fix: xxx' 符合類型的才可以,需要注意的是類型的后面需要用英文的 :,并且冒號后面是需要空一格的,這個是不能省略的

六、強(qiáng)制使用pnpm包管理器工具

團(tuán)隊開發(fā)項目的時候,需要統(tǒng)一包管理器工具,因為不同包管理器工具下載同一個依賴,可能版本不一樣,

導(dǎo)致項目出現(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"
}

當(dāng)我們使用npm或者yarn來安裝包的時候,就會報錯了。原理就是在install的時候會觸發(fā)preinstall(npm提供的生命周期鉤子)這個文件里面的代碼。

項目集成

3.1集成element-plus

硅谷甄選運營平臺,UI組件庫采用的element-plus,因此需要集成element-plus插件!??!

官網(wǎng)地址:https://element-plus.gitee.io/zh-CN/

pnpm install element-plus @element-plus/icons-vue

入口文件main.ts全局安裝element-plus,element-plus默認(rèn)支持語言英語設(shè)置為中文

import ElementPlus from 'element-plus';
import 'element-plus/dist/index.css'
//@ts-ignore忽略當(dāng)前文件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組件與圖標(biāo)的使用.

3.2src別名的配置

在開發(fā)項目的時候文件與文件關(guān)系可能很復(fù)雜,因此我們需要給src文件夾配置一個別名?。。?/p>

// 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": "./", // 解析非相對模塊的基地址,默認(rèn)是當(dāng)前目錄
    "paths": { //路徑映射,相對于baseUrl
      "@/*": ["src/*"] 
    }
  }
}

3.3環(huán)境變量的配置

項目開發(fā)過程中,至少會經(jīng)歷開發(fā)環(huán)境、測試環(huán)境和生產(chǎn)環(huán)境(即正式環(huán)境)三個階段。不同階段請求的狀態(tài)(如接口地址等)不盡相同,若手動切換接口地址是相當(dāng)繁瑣且易出錯的。于是環(huán)境變量配置的需求就應(yīng)運而生,我們只需做簡單的配置,把環(huán)境狀態(tài)切換的工作交給代碼。

開發(fā)環(huán)境(development)
顧名思義,開發(fā)使用的環(huán)境,每位開發(fā)人員在自己的dev分支上干活,開發(fā)到一定程度,同事會合并代碼,進(jìn)行聯(lián)調(diào)。

測試環(huán)境(testing)
測試同事干活的環(huán)境啦,一般會由測試同事自己來部署,然后在此環(huán)境進(jìn)行測試

生產(chǎn)環(huán)境(production)
生產(chǎn)環(huán)境是指正式提供對外服務(wù)的,一般會關(guān)掉錯誤報告,打開錯誤日志。(正式提供給客戶使用的環(huán)境。)

注意:一般情況下,一個環(huán)境對應(yīng)一臺服務(wù)器,也有的公司開發(fā)與測試環(huán)境是一臺服務(wù)器?。。?/p>

項目根目錄分別添加 開發(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)境變量

3.4SVG圖標(biāo)配置

在開發(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]',
      }),
    ],
  }
}

入口文件導(dǎo)入

import 'virtual:svg-icons-register'

3.4.1svg封裝為全局組件

因為項目很多模塊需要使用圖標(biāo),因此把它封裝為全局組件?。?!

在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圖標(biāo)的顏色
  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)部全部全局組件!?。?/p>

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);

3.5集成sass

我們目前在組件內(nèi)部已經(jīng)可以使用scss樣式,因為在配置styleLint工具的時候,項目當(dāng)中已經(jīng)安裝過sass sass-loader,因此我們再組件內(nèi)可以使用scss語法?。?!需要加上lang="scss"

<style scoped lang="scss"></style>

接下來我們?yōu)轫椖刻砑右恍┤值臉邮?/p>

在src/styles目錄下創(chuàng)建一個index.scss文件,當(dāng)然項目中需要用到清除默認(rèn)樣式,因此在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提供這些全局變量可以在組件樣式中使用了?。?!

3.6mock數(shù)據(jù)

安裝依賴:https://www.npmjs.com/package/vite-plugin-mock

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ù)與接口?。?!

在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>

3.7axios二次封裝

在開發(fā)項目的時候避免不了與后端進(jìn)行交互,因此我們需要使用axios插件實現(xiàn)發(fā)送網(wǎng)絡(luò)請求。在開發(fā)項目的時候

我們經(jīng)常會把a(bǔ)xios進(jìn)行二次封裝。

目的:

1:使用請求攔截器,可以在請求攔截器中處理一些業(yè)務(wù)(開始進(jìn)度條、請求頭攜帶公共參數(shù))

2:使用響應(yīng)攔截器,可以在響應(yīng)攔截器中處理一些業(yè)務(wù)(進(jìn)度條結(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;

3.8API接口統(tǒng)一管理

在開發(fā)項目的時候,接口可能很多需要統(tǒng)一管理。在src目錄下去創(chuàng)建api文件夾去統(tǒng)一管理項目的接口;

比如:下面方式文章來源地址http://www.zghlxwxcb.cn/news/detail-710006.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)于Vue3搭建后臺管理系統(tǒng)模板的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包