1.创建vue项目

# npm 6.x
npm init vite@latest vite-vue3 --template vue

# npm 7+, 需要额外的双横线:
npm init vite@latest vite-vue3 -- --template vue 

2.进入项目目录,安装各种模块

# 安装路由
npm install vue-router

# 安装网络请求模块
npm install axios

# 安装状态管理模块
npm install vuex@next 或 npm install pinia 

3.编写配置文件

配置@符号表示src目录,以及代理等:

// 修改vite.config.js文件
import { resolve } from 'path'

const pathResolve = dir => {
  return resolve(__dirname, ".", dir)
}

const alias = {
  '@': pathResolve("src")
}

export default defineConfig({
  resolve: {alias},
  server: {
    port: 3001,
    host: '0.0.0.0',
    open: false,
    proxy: {
      '/settlement/': 'http://192.168.13.224:51000/'
    },
  },
  plugins: [vue()]
})

配置路由文件:

 1) 在src目录下创建router/index.js 点击查看参考代码

// router/index.js文件
import { createRouter, createWebHashHistory, createWebHistory } from 'vue-router'

const router = createRouter({
  history: createWebHashHistory(),
  routes: [
    {
      path: '/',
      redirect: '/h5',
    },
    {
      path: '/h5',
      component: () => import('@/layout/h5.vue'),
      redirect: '/h5/subApplication',
      children: [
        {
          path: 'makeCollections',
          component: () => import('@/views/makeCollections.vue'),
          meta: {title: '收款信息'}
        },
      ]
    },
    {
      path: '/agreement',
      component: () => import('@/views/agreement.vue'),
      meta: {title: '用户协议'}
    },
  ],
  scrollBehavior(to, from, savedPosition) {
    if (savedPosition) {
      return savedPosition
    } else {
      return { left: 0, top: 0 }
    }
  }
})

router.beforeEach((to, from, next) => {
  if(to.meta && to.meta.title) {
    document.title = to.meta.title
  }
  next()
})

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

 2) 在main.js中添加如下代码

import router from './router'

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

配置网络请求文件:在src目录下创建utils/request.js 点击查看参考代码

// utils/request.js文件
import axios from 'axios'
const baseURL = import.meta.env.VITE_BASE_URL
import store from './store'

const service = axios.create({
  baseURL,
  timeout: 50000
})

// 请求前的统一处理
service.interceptors.request.use(config => {
  if (store.getters.token) {
    config.headers['Authorization'] = 'Bearer ' + store.getters.token
  }
  return config;
}, error => {
  return Promise.reject(error)
})

service.interceptors.response.use(response => {
  const res = response.data
  if (response.config.url.includes('returnAll')) {
    return Promise.resolve(res);
  } else if (res.result && res.result.success) {
    return Promise.resolve(res.data);
  }

  alert(res.result ? res.result.message : '' )
  return Promise.reject(null)
}, error => {
  return Promise.reject(error);
})

export default service
// 在组件中直接引入请求文件即可使用
import request from '@/utils/request'

request.post(...).then(res => {}) 

配置vuex全局变量:

 1) 在src目录下创建utils/store.js 点击查看参考代码

// utils/store.js文件
import Vuex from 'vuex'

const store = new Vuex.Store({
  state:{
    // 登录用户信息
    userInfo: {},
    token: ''
  },
  mutations: {
    // 登录用户信息
    setUserInfo (state, obj) {
      state.userInfo = obj
    },
    // 设置token
    setToken (state, val) {
      state.token = val
    }
  },
  actions: {
    logout ({ commit, state }) {
      return new Promise((resolve, reject) => {
        try {
          commit('setToken', '')
          resolve()
        } catch(e) {
          reject()
        }
      })
    }
  },
  getters: {
    userInfo: state => state.userInfo,
    token: state => state.token,
  }
})

export default store

 2) 在main.js中添加如下代码

import store from '@/utils/store'

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

 3) 使用

import { useStore } from 'vuex'

const store = useStore()
const token = computed(() => store.state.token)
store.commit('setUserInfo', {id:1})

创建公用方法文件:

 1) 在src目录下创建utils/utils.js 点击查看参考代码

// utils/utils.js文件

// 获取网址参数值
function getUrlParam(name) {
  let reg = new RegExp("(?|&)" + name + "=([^&]*)(&|$)")
  let r = (window.location.search || window.location.hash).match(reg)
  if (r != null) return r[2]
  return null
}

// 时间字符串格式修改(eg:format="yyyy-MM-dd hh:mm:ss")
function dateFormat(date, format) {
  if (!date) {
    return ''
  } else if (typeof date === 'string') {
    date = new Date(date.replace(/-/g,'/'))
  } else if (typeof date === 'number') {
    date = new Date(date)
  }

  let o = {
    "M+" : date.getMonth() + 1, // month
    "d+" : date.getDate(), // day
    "h+" : date.getHours(), // hour
    "m+" : date.getMinutes(), // minute
    "s+" : date.getSeconds(), // second
    "q+" : Math.floor((date.getMonth() + 3) / 3), // quarter
    "S" : date.getMilliseconds()  // millisecond
  }

  if (/(y+)/.test(format)) {  
    format = format.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));  
  }

  for (let k in o) {  
    if (new RegExp("(" + k + ")").test(format)) {  
      format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));  
    }
  }
  return format;
}
export default { getUrlParam, dateFormat }

 2) 使用import { dateFormat } from '@/utils/utils'