- 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()
}
})