vue3+ Ant Design Vue 项目搭建

1,390 阅读5分钟

vue3+ Ant Design Vue PC端项目搭建

使用vue3 + vite + js + Ant Design Vue + axios + pinia + scss 搭建
elementPlus适合后台管理系统,Ant Design Vue适合C端使用。
这里默认是已经安装vue环境和vite的。

一、项目初始化

npm init vite@latest my-vue-app -- --template vue
cd my-vue-app
npm install
npm run dev

// 其中my-vue-app为项目名称。
// 安装选择js,完成以上四步安装后能够正常启动即完成项目初始化。
// 初始化项目之后,package.json文件如下:
"scripts": {
   "dev": "vite",
   "build": "vite build",
   "preview": "vite preview"
}

// 将"dev": "vite"修改成"dev": "vite --open"即可在项目启动自动打开浏览器。

二、添加路由

npm install vue-router@4

1、创建项目页面vue文件。
在src下面创建views文件夹,views内部文件如下:

  • Home (文件夹)
    • index.vue (文件)
    • composables (文件夹)
    • components (文件夹)
  • 404 (文件夹)
    • index.vue (文件)
    • composables (文件夹)
    • components (文件夹)

2、设置@路由
vite.config.js文件:

export default defineConfig({
  plugins: [vue()],
  // start
  resolve: {
    extensions: ['.vue', '.js', '.css'],
    alias: {
      '@': path.resolve(__dirname, './src')
    },
  },
  // end
})

3、添加完路由依赖后,在src文件夹里面创建一个router文件夹,并在router文件夹里面创建一个index.js文件。

import { createRouter, createWebHashHistory } from 'vue-router'

const routes = [{
  path: "/",
  redirect: "/Home",
  meta: { title: '首页' }
}, {
  path: "/Home",
  name: "Home",
  component: () => import('@/views/Home/index.vue'),
  meta: { title: '首页' },
  children: []
}, {
  path: "/404",
  name: "NotFound",
  component: () => import('@/views/404/index.vue'),
  meta: { title: '404页面' },
  children: []
}]

const router = createRouter({
  history: createWebHashHistory(),
  routes,
  scrollBehavior() {
    return {
      top: 0
    }
  }
})

// 路由拦截
router.beforeEach((to, from, next) => {
  if (to.matched.length === 0) {
    // 不存在的路由地址
    next('/404')
  } else {
    next()
  }
})

router.afterEach((to, from) => {
})

export default router

4、App.vue配置

<template>
  <router-view v-slot="{ Component }">
    <transition name="el-fade-in" mode="out-in">
      <component :is="Component" />
    </transition>
  </router-view>
</template>

<script setup></script>

<style scoped></style>

5、mian.js引用路由

import router from './router/index'

const app = createApp(App)
app.use(router)

三、安装Ant Design Vue

Ant Design Vue 中文官网

npm i --save ant-design-vue

main.js

import Antd from 'ant-design-vue'
import 'ant-design-vue/dist/antd.css'

const app = createApp(App)
app.use(Antd)

四、安装pinia
在mian.js中引用

import { createPinia } from 'pinia'

const app = createApp(App)
app.use(createPinia())

在src文件夹下面创建store文件夹,在store文件夹下创建index.js文件

import { defineStore } from "pinia"

export const userStore = defineStore({
  id: "mooc", // id是唯一的,如果有多个文件,ID不能重复
  state: () => {
    return {
      userInfo: null,
    }
  },
  actions: {
    setInfo(data) {
      this.userInfo = data
    },
    // 用户退出,清除本地数据
    logout() {
      this.userInfo = null
      sessionStorage.clear()
      localStorage.clear()
    },
  },
  // 开启数据缓存,在 strategies 里自定义 key 值,并将存放位置由 sessionStorage 改为 localStorage
  // 默认所有 state 都会进行缓存,你可以通过 paths 指定要持久化的字段,其他的则不会进行持久化,如:paths: ['userInfo'] 替换key的位置
  persist: {
    enabled: true,
    strategies: [
      {
        key: "moocs",
        storage: localStorage,
      },
    ],
  },
})

安装pinia持久化插件

npm i pinia-plugin-persist

main.js

import { createPinia } from 'pinia'
import piniaPluginPersist from 'pinia-plugin-persist'
const store = createPinia()
store.use(piniaPluginPersist)

const app = createApp(App)
app.use(store)

五、安装axios

npm install axios --save

在src目录下新建一个api文件夹,在里面新建request.js、index.js文件
request.js内容:

import axios from 'axios'

// 创建一个 axios 实例
const service = axios.create({
  timeout: 0 // 不设置前端超时时间,
})

// 添加请求拦截器
service.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么,如添加token
    // config.headers['Authorization'] = 'Bearer ' + token
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
service.interceptors.response.use(
  function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response.data
  },
  function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    // console.log(error)
    return Promise.reject(error.msg)
  }
)

export default service

index.js内容:

// 导入axios实例
import httpRequest from '@/api/request'

// 获取用户信息
export function getUserInfo(param) {
  return httpRequest({
    url: 'your api url',
    method: 'post',
    data: param,
  })
}

vite.config.js中可以配置反向代理、多环境自动切换等。

六、安装scss

npm install sass

七、项目搭建完成

进行此步大致项目搭建完成,总结个别重要文件如下:

// vite.config.js 文件

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'
export const url = 'https://crm.guoketest.com/'
// url可以通过多环境配置获取

export default defineConfig({
  plugins: [vue()],
  resolve: {
    extensions: ['.vue', '.js', '.css'],
    alias: {
      '@': path.resolve(__dirname, './src')
    },
  },
  build: {
    outDir: 'dist', // 打包后的文件夹名称
    assetsDir: "assets", // 指定静态资源存放路径 
  },
  base: './',
  server: {
    cors: true, //默认启用并允许任何源
    proxy: {
      '/system': { // 系统管理模块
        target: url, //接口域名
        changeOrigin: true,             //是否跨域
        ws: true,                       //是否代理 websockets
        secure: false,                   //是否https接口
        force: true, //强制预构建依赖
        pathRewrite: {                  //路径重置
          '^/system': ''
        }
      },
      '/auth': { // 登录相关
        target: url, //接口域名
        changeOrigin: true,             //是否跨域
        ws: true,                       //是否代理 websockets
        secure: false,                   //是否https接口
        force: true, //强制预构建依赖
        pathRewrite: {                  //路径重置
          '^/auth': ''
        }
      }
    }
  },
})

// main.js 文件

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import Antd from 'ant-design-vue'
import 'ant-design-vue/dist/antd.css'
import router from './router/index'
import { createPinia } from 'pinia'
// 引入持久化插件
import piniaPluginPersist from 'pinia-plugin-persist'
const store = createPinia()
store.use(piniaPluginPersist)


const app = createApp(App)
app.use(router)
app.use(Antd)
app.use(store)
app.mount('#app')

// src/store/index.js 文件

import { defineStore } from "pinia"

export const userStore = defineStore({
  id: "mooc", // id是唯一的,如果有多个文件,ID不能重复
  state: () => {
    return {
      userInfo: null,
    }
  },
  actions: {
    setInfo(data) {
      this.userInfo = data
    },
    // 用户退出,清除本地数据
    logout() {
      this.userInfo = null
      sessionStorage.clear()
      localStorage.clear()
    },
  },
  persist: {
    enabled: true,
    strategies: [
      {
        key: "moocs",
        storage: localStorage,
      },
    ],
  },
})
// src/router/index.js 文件

import { createRouter, createWebHashHistory } from 'vue-router'
const routes = [{
  path: "/",
  redirect: "/Home",
  meta: { title: '首页' }
}, {
  path: "/Home",
  name: "Home",
  component: () => import('@/views/Home/index.vue'),
  meta: { title: '首页' },
  children: []
}, {
  path: "/404",
  name: "NotFound",
  component: () => import('@/views/404/index.vue'),
  meta: { title: '404页面' },
  children: []
}]

const router = createRouter({
  history: createWebHashHistory(),
  routes,
  scrollBehavior() {
    return {
      top: 0
    }
  }
})

// 路由拦截
router.beforeEach((to, from, next) => {
  if (to.matched.length === 0) {
    next('/404')
  } else {
    next()
  }
})

router.afterEach((to, from) => {
})
export default router
// sec/api/request.js 文件

import axios from 'axios'

// 创建一个 axios 实例
const service = axios.create({
	timeout: 0 // 不设置前端超时时间,
})

// 添加请求拦截器
service.interceptors.request.use(
	function (config) {
		// 在发送请求之前做些什么,如添加token
		// config.headers['Authorization'] = 'Bearer ' + token
		return config
	},
	function (error) {
		// 对请求错误做些什么
		return Promise.reject(error)
	}
)

// 添加响应拦截器
service.interceptors.response.use(
	function (response) {
		// 2xx 范围内的状态码都会触发该函数。
		// 对响应数据做点什么
		return response.data
	},
	function (error) {
		// 超出 2xx 范围的状态码都会触发该函数。
		// 对响应错误做点什么
		// console.log(error)
		return Promise.reject(error.msg)
	}
)

export default service

注:
1、公用vue组件,如菜单栏;
2、请求、响应数据的过滤;
3、多环境配置;
4、其他第三方插件引用,如echarts等;
5、其他自定义文件、组件;
都可以在此基础上添加升级来达到目标。