1.dayjs
import dayjs from 'dayjs';
const DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss';
const DATE_FORMAT = 'YYYY-MM-DD';
export function formatToDateTime(date?: dayjs.ConfigType, format = DATE_TIME_FORMAT): string {
return dayjs(date).format(format);
}
export function formatToDate(date?: dayjs.ConfigType, format = DATE_FORMAT): string {
return dayjs(date).format(format);
}
export const dateUtil = dayjs;
2.localstorage
import { reactive } from 'vue';
interface StorageOptions {
namespace?: string;
storage?: Storage;
}
const DEFAULT_NAMESPACE = 'app';
const DEFAULT_STORAGE = window.localStorage;
const DEFAULT_EXPIRES = 7 * 24 * 60 * 60 * 1000; // 7 天
export function createStorage(options: StorageOptions = {}) {
const { namespace = DEFAULT_NAMESPACE, storage = DEFAULT_STORAGE } = options;
const key = (name: string) => `${namespace}:${name}`;
const set = <T>(name: string, value: T, expires: number | null = DEFAULT_EXPIRES) => {
const data = {
value,
expires: typeof expires === 'number' ? Date.now() + expires : null,
};
storage.setItem(key(name), JSON.stringify(data));
};
const get = <T>(name: string): T => {
const data = storage.getItem(key(name));
if (data) {
const { value, expires } = JSON.parse(data);
if (!expires || Date.now() < expires) {
return value;
}
remove(name);
}
return null as any;
};
const remove = (name: string) => {
storage.removeItem(key(name));
};
const clear = () => {
storage.clear();
};
return reactive({
set,
get,
remove,
clear,
});
}
3.axios
import axios from 'axios';
import { responseSuccess, responseError } from './interceptors/response';
import { getToken } from '@/utils/auth';
const service = axios.create({
baseURL: import.meta.env.VITE_APP_BASE_URL,
timeout: 10000,
});
service.interceptors.request.use(
(config) => {
config.headers['X-Airdoc-Client'] = 'c10b3355-1667-4bfb-bd06-7e7494325c99';
const token: string = getToken();
if (token) {
config.headers.Authorization = token;
}
return config;
},
(error) => {
Promise.reject(error);
},
);
service.interceptors.response.use(responseSuccess as any, responseError);
export default service;
import { AxiosResponse, AxiosError } from 'axios';
import { Code, ResponseData } from '../types';
import { showFailToast } from 'vant';
export function responseSuccess(response: AxiosResponse<ResponseData>) {
if (response) {
const { data, headers } = response;
const { errorCode: code, message } = data;
if (code === 0) {
return data;
} else {
showFailToast(message);
}
} else {
return Promise.reject();
}
}
export function responseError(error: AxiosError) {
const { response, code, message: msg } = error || {};
console.log(response, '-----response-----');
console.log(code, '-----code-----');
console.log(msg, '-----message-----');
const err: string = error.toString();
try {
if (code === 'ECONNABORTED' && msg.includes('timeout')) {
showFailToast('请求超时,请刷新页面后重试');
}
if (code === 'ERR_BAD_RESPONSE') {
showFailToast('服务器错误,请稍后重试');
}
if (err && err.includes('Network Error')) {
showFailToast('网络异常');
}
} catch (error) {
throw new Error(error as any);
}
if (response) {
const errRes: any = response.data;
}
}
4. cryptojs
import CryptoJS from 'crypto-js';
import { LoginParams } from '@/api/model/userModel';
export const encryption = (loginForm: LoginParams) => {
let key: any = '201603152020BABC';
let iv: any = 'BABC202003152016';
const encryptArr: string[] = ['password'];
const type: any = '';
const result = JSON.parse(JSON.stringify(loginForm));
if (type === 'Base64') {
encryptArr.forEach((ele) => {
result[ele] = btoa(result[ele]);
});
} else {
encryptArr.forEach((ele) => {
const encryptStr = result[ele];
key = CryptoJS.enc.Latin1.parse(key);
iv = CryptoJS.enc.Latin1.parse(iv);
const encrypted = CryptoJS.AES.encrypt(encryptStr, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
});
result[ele] = encrypted.toString();
});
}
return result;
};