- npm create vite@latest 项目名称(根据提示如下图所示,选择需要的功能)

- 配置Element-plus
yarn add element-plus
yarn -D unplugin-vue-components unplugin-auto-import
- 更改vite配置
import { defineConfig } from 'vite'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'export default defineConfig({plugins: [AutoImport({resolvers: [ElementPlusResolver()],}),Components({resolvers: [ElementPlusResolver()],}),],
})
<el-button style="width: 100%;" type="primary">按 钮</el-button>
- pinia数据持久化
yarn add pinia-plugin-persistedstate
import { createPinia } from "pinia";
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'const pinia = createPinia();
pinia.use(piniaPluginPersistedstate)
export default pinia;
import { ref, computed } from 'vue'
import { defineStore } from 'pinia'export const useCounterStore = defineStore('counter', () => {const count = ref(0)const doubleCount = computed(() => count.value * 2)function increment() {count.value++}return { count, doubleCount, increment }
}, {persist: true
})
- 配置请求方法(axios)
yarn add axios
import axios from 'axios';
const abortControllerMap = new Map();
const generateRequestId = (config: any) => {return `${config.url}`;
};const service = axios.create({baseURL: import.meta.env.VITE_API_URL,timeout: 500000,
});service.interceptors.request.use((config) => {const requestId = generateRequestId(config);if (abortControllerMap.has(requestId) && config.abortable) {abortControllerMap.get(requestId).abort();}const controller = new AbortController();config.signal = controller.signal;abortControllerMap.set(requestId, controller);const { token } = JSON.parse(localStorage.getItem('x-userInfo') || '{}');if (token) {config.headers['Authorization'] = `Bearer ${token}`;}return config;},(error) => {return Promise.reject(error);}
);service.interceptors.response.use((response) => {const res = response.data;const requestId = generateRequestId(response.config);if (abortControllerMap.has(requestId)) {abortControllerMap.delete(requestId);}if (response.request.responseType === "blob" ||response.request.responseType === "arraybuffer") {return res;}if (res.error_code === 400004) {return Promise.reject(res);} else if (res.error_code !== 0) {return Promise.reject(new Error(res.message || 'Error'));} else {return res;}},(error) => {if (axios.isCancel(error)) {console.log('请求被取消:', error.message);return Promise.reject({ type: 'abort', message: 'Request canceled' });}console.log('请求错误 ', error);return Promise.reject(error);}
);
export function get(url: any, params: any, config = {}) {return service({url,method: 'get',params,...config,});
}
export function post(url: string, data: any, config = {}) {return service({url,method: 'post',data,...config,});
}
export function cancelRequest(config: any) {const requestId = generateRequestId(config);if (abortControllerMap.has(requestId)) {abortControllerMap.get(requestId).abort();return true;}return false;
}
export function cancelAllRequests() {abortControllerMap.forEach(controller => controller.abort());abortControllerMap.clear();
}export default service;
import request from '@/utils/request';export function loginApi(data) {return request({url: '/app/user/login',method: 'post',data,abortable: true})
}
declare module 'axios' {interface AxiosRequestConfig {abortable?: boolean;}
}
- 如果没有登录跳转到登录页面
import router from '@/router';router.beforeEach((to, from, next) => {if (to.name !== 'login' && !localStorage.getItem('token')) {next({ name: 'login' })} else {next()}
})