284 lines
7.1 KiB
TypeScript
284 lines
7.1 KiB
TypeScript
import { RouteRecordRaw } from 'vue-router';
|
|
import cloneDeep from 'lodash/cloneDeep';
|
|
|
|
/**
|
|
* TODO: 转化权限路由数据为路由菜单数据
|
|
* @param route
|
|
*/
|
|
export const permissionListToRouteData = (
|
|
permissionList: Array<any>
|
|
): RouteRecordRaw[] => {
|
|
return permissionList;
|
|
};
|
|
|
|
/**
|
|
* TODO: 手机号校验
|
|
* @param str
|
|
*/
|
|
export function checkMobilephone(str: string) {
|
|
const regex = /^(?:(?:\+|00)86)?1[3-9]\d{9}$/;
|
|
if (!regex.test(str)) {
|
|
return false;
|
|
} else {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @description 手机号校验
|
|
* @param str
|
|
* @returns
|
|
*/
|
|
export function validatePhone(mobile: string) {
|
|
const tel = /^0\d{2,3}-?\d{7,8}$/;
|
|
const phone = /^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1}))+\d{8})$/;
|
|
if (mobile.length == 11) {
|
|
//手机号码
|
|
if (phone.test(mobile)) {
|
|
console.log(mobile);
|
|
return true;
|
|
}
|
|
} else if (mobile.length == 13 && mobile.indexOf('-') != -1) {
|
|
//电话号码
|
|
if (tel.test(mobile)) {
|
|
console.log(mobile);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* TODO: 车牌号校验(新能源+非新能源)
|
|
* @param str
|
|
*/
|
|
export function checkPlateNumber(str: string) {
|
|
const regex =
|
|
/(^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$)|(^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{5}[A-Z0-9挂学警港澳]{1}$)/;
|
|
if (!regex.test(str)) {
|
|
return false;
|
|
} else {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 动态获取工程图片地址
|
|
* @param name
|
|
* @param suffix
|
|
* @returns
|
|
*/
|
|
export const getImages = (name: string, suffix = 'png'): string => {
|
|
const path = `/src/assets/images/${name}.${suffix}`;
|
|
const modules = import.meta.glob('/src/assets/images/*', { eager: true });
|
|
return (modules[path] as any).default;
|
|
};
|
|
|
|
/**
|
|
* 转化时间格式的方法
|
|
* @param val
|
|
* @returns
|
|
*/
|
|
export const formatDate = (val: string | number): string | boolean => {
|
|
let isAllowParse = typeof val === 'number';
|
|
|
|
// 查看是否是能被格式化的格式
|
|
if (typeof val === 'string') {
|
|
const NOTDATE = Number.isNaN(Date.parse(val));
|
|
if (!NOTDATE) {
|
|
isAllowParse = true;
|
|
}
|
|
}
|
|
|
|
if (!isAllowParse) {
|
|
return isAllowParse;
|
|
}
|
|
|
|
const TEMPDATE = new Date(val);
|
|
|
|
// 自动补全0
|
|
const completeZero = (val: number) => {
|
|
const stringVal = val.toString();
|
|
return stringVal.padStart(2, '0');
|
|
};
|
|
|
|
return `${TEMPDATE.getFullYear()}-${completeZero(
|
|
TEMPDATE.getMonth() + 1
|
|
)}-${completeZero(TEMPDATE.getDate())} ${completeZero(
|
|
TEMPDATE.getHours()
|
|
)}:${completeZero(TEMPDATE.getMinutes())}:${completeZero(
|
|
TEMPDATE.getSeconds()
|
|
)}`;
|
|
};
|
|
|
|
const formFieldCNMap = {
|
|
sentVehicleUser: '交车人',
|
|
checkUserName: '验车人',
|
|
acceptUserName: '接收人',
|
|
checkAddress: '验收地点'
|
|
};
|
|
|
|
/**
|
|
* 输入框校验长度、特殊字符
|
|
* @param str
|
|
*/
|
|
export function validatorString({ field }, str: string, callback: any) {
|
|
// 非空
|
|
if (!str) {
|
|
return callback(new Error(`请输入${formFieldCNMap[field] ?? '必填项'}`));
|
|
}
|
|
|
|
// 空格输入校验
|
|
const spaceRegex = new RegExp(/\s+/g);
|
|
if (str && spaceRegex.test(str)) {
|
|
return callback(new Error('不支持含有空格'));
|
|
}
|
|
|
|
const regex = /[!@#$%^&*?><|\\\\]/;
|
|
if (str && regex.test(str)) {
|
|
return callback(new Error('不支持特殊字符'));
|
|
}
|
|
|
|
const tooLong = str.length > 32;
|
|
if (tooLong) {
|
|
return callback(new Error('输入长度不得超过32个字符'));
|
|
}
|
|
|
|
return callback();
|
|
}
|
|
|
|
/**
|
|
* 非必填输入框校验长度、特殊字符
|
|
* @param str
|
|
*/
|
|
export function validatorStringNoRequired(_: any, str: string, callback: any) {
|
|
// 空格输入校验
|
|
const spaceRegex = new RegExp(/\s+/g);
|
|
if (str && spaceRegex.test(str)) {
|
|
return callback(new Error('不支持含有空格'));
|
|
}
|
|
|
|
const regex = /[!@#$%^&*?><|\\\\]/;
|
|
if (str && regex.test(str)) {
|
|
return callback(new Error('不支持特殊字符'));
|
|
}
|
|
|
|
const tooLong = str ? str.length > 32 : false;
|
|
if (str && tooLong) {
|
|
return callback(new Error('输入长度不得超过32个字符'));
|
|
}
|
|
|
|
return callback();
|
|
}
|
|
|
|
// 字符为64位
|
|
export function validatorStringNoRequired64(
|
|
_: any,
|
|
str: string,
|
|
callback: any
|
|
) {
|
|
// 空格输入校验
|
|
const spaceRegex = new RegExp(/\s+/g);
|
|
if (str && spaceRegex.test(str)) {
|
|
return callback(new Error('不支持含有空格'));
|
|
}
|
|
|
|
const regex = /[!@#$%^&*?><|\\\\]/;
|
|
if (str && regex.test(str)) {
|
|
return callback(new Error('不支持特殊字符'));
|
|
}
|
|
|
|
const tooLong = str ? str.length > 64 : false;
|
|
if (str && tooLong) {
|
|
return callback(new Error('输入长度不得超过64个字符'));
|
|
}
|
|
|
|
return callback();
|
|
}
|
|
|
|
/**
|
|
* 备注校验纯空格/特殊字符/超长字段
|
|
* @param str
|
|
*/
|
|
export function validatorRemark(_: any, str: string, callback: any) {
|
|
// 非空
|
|
// if (str && /^\s*$/.test(str)) {
|
|
// return callback(new Error('不支持纯空格'));
|
|
// }
|
|
// 空格输入校验
|
|
const spaceRegex = /^\s*$/;
|
|
if (str && spaceRegex.test(str)) {
|
|
return callback(new Error('不支持仅空格输入'));
|
|
}
|
|
const regex = /[!@#$%^&*?><|\\\\]/;
|
|
if (regex.test(str)) {
|
|
return callback(new Error('不支持特殊字符'));
|
|
}
|
|
|
|
const tooLong = str ? str.length > 500 : false;
|
|
if (str && tooLong) {
|
|
return callback(new Error('不得超过500个字符'));
|
|
}
|
|
|
|
return callback();
|
|
}
|
|
// 不需要检查长度
|
|
export function validatorRemarkNoLength(_: any, str: string, callback: any) {
|
|
// 空格输入校验
|
|
const spaceRegex = /^\s*$/;
|
|
if (str && spaceRegex.test(str)) {
|
|
return callback(new Error('不支持仅空格输入'));
|
|
}
|
|
const regex = /[!@#$%^&*?><|\\\\]/;
|
|
if (regex.test(str)) {
|
|
return callback(new Error('不支持特殊字符'));
|
|
}
|
|
|
|
return callback();
|
|
}
|
|
|
|
/**
|
|
* @description 根据路径生成缓存标识
|
|
*/
|
|
export const getCacheByUrl = (routePath: string) => {
|
|
if (routePath) {
|
|
let target = cloneDeep(routePath.split('?')[0]);
|
|
if (target[0] === '/') {
|
|
target = target.replace('/', '');
|
|
}
|
|
target = target.replace(/\//g, '-');
|
|
target = target.replace(/:/g, '@');
|
|
// const sourceStr = formValue.value.url.split('?')[0].replace('/', '');
|
|
return target;
|
|
}
|
|
};
|
|
|
|
import {
|
|
API_URL,
|
|
API_URL_OUTER,
|
|
API_PATH,
|
|
ACCESS_TOKEN_HEADER_NAME,
|
|
ACCESS_TOKEN_STORAGE_KEY
|
|
} from '@/constants';
|
|
import { useStorage } from '@vueuse/core';
|
|
export const getBaseUrlAndHeaders = () => {
|
|
const innerApi = ['127.0.0.1:5173', '10.105.148.2:19098'];
|
|
// 判断内外网
|
|
// 如果是内网 则用VITE_APP_API_URL 否则用外网 VITE_APP_API_URL_OUTER
|
|
const apiUrl = innerApi.includes(window.location.host)
|
|
? API_URL
|
|
: API_URL_OUTER;
|
|
const baseURL =
|
|
import.meta.env.VITE_APP_PROXY === 'OPEN'
|
|
? '/api' + API_PATH
|
|
: apiUrl + API_PATH;
|
|
const defautlTokenValue = localStorage.getItem(ACCESS_TOKEN_STORAGE_KEY);
|
|
const token = useStorage(
|
|
ACCESS_TOKEN_STORAGE_KEY,
|
|
defautlTokenValue,
|
|
localStorage
|
|
);
|
|
const headers = { [ACCESS_TOKEN_HEADER_NAME]: token.value };
|
|
return { baseURL, headers };
|
|
};
|