plus-ui/src/utils/ruoyi.ts
2025-07-26 13:30:24 +08:00

309 lines
8.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import moment from 'moment';
// 日期格式化
export function parseTime(time: any, pattern?: string) {
if (arguments.length === 0 || !time) {
return null;
}
const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}';
let date;
if (typeof time === 'object') {
date = time;
} else {
if (typeof time === 'string' && /^[0-9]+$/.test(time)) {
time = parseInt(time);
} else if (typeof time === 'string') {
time = time
.replace(new RegExp(/-/gm), '/')
.replace('T', ' ')
.replace(new RegExp(/\.[\d]{3}/gm), '');
}
if (typeof time === 'number' && time.toString().length === 10) {
time = time * 1000;
}
date = new Date(time);
}
const formatObj: { [key: string]: any } = {
y: date.getFullYear(),
m: date.getMonth() + 1,
d: date.getDate(),
h: date.getHours(),
i: date.getMinutes(),
s: date.getSeconds(),
a: date.getDay()
};
return format.replace(/{(y|m|d|h|i|s|a)+}/g, (result: string, key: string) => {
let value = formatObj[key];
// Note: getDay() returns 0 on Sunday
if (key === 'a') {
return ['日', '一', '二', '三', '四', '五', '六'][value];
}
if (result.length > 0 && value < 10) {
value = '0' + value;
}
return value || 0;
});
}
/**
* 添加日期范围
* @param params
* @param dateRange
* @param propName
*/
export const addDateRange = (params: any, dateRange: any[], propName?: string) => {
const search = params;
search.params = typeof search.params === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {};
dateRange = Array.isArray(dateRange) ? dateRange : [];
if (typeof propName === 'undefined') {
search.params['beginTime'] = dateRange[0];
search.params['endTime'] = dateRange[1];
} else {
search.params['begin' + propName] = dateRange[0];
search.params['end' + propName] = dateRange[1];
}
return search;
};
export function addDateRange2(params, dateRange, addDay = true) {
const search = params;
dateRange = Array.isArray(dateRange) ? dateRange : [];
if (addDay) {
search['beginTime'] = dateRange[0];
search['endTime'] = moment(dateRange[1]).add(1, 'days').format('yyyy-MM-DD');
} else {
search['beginTime'] = dateRange[0];
search['endTime'] = dateRange[1];
}
return search;
}
export function addDateRange3(params, dateRange, addDay = true) {
const search = params;
dateRange = Array.isArray(dateRange) ? dateRange : [];
if (addDay) {
search['beginTime'] = dateRange[0] + ' 00:00:00';
search['endTime'] = moment(dateRange[1]).add(1, 'days').format('yyyy-MM-DD') + ' 00:00:00';
} else {
search['beginTime'] = dateRange[0] + ' 00:00:00';
search['endTime'] = dateRange[1] + ' 00:00:00';
}
return search;
}
// 表单重置
export function resetForm(refName) {
if (this.$refs[refName]) {
this.$refs[refName].resetFields();
}
}
// 回显数据字典
export const selectDictLabel = (datas: any, value: number | string) => {
if (value === undefined) {
return '';
}
const actions: Array<string | number> = [];
Object.keys(datas).some((key) => {
if (datas[key].value == '' + value) {
actions.push(datas[key].label);
return true;
}
});
if (actions.length === 0) {
actions.push(value);
}
return actions.join('');
};
// 回显数据字典(字符串数组)
export const selectDictLabels = (datas: any, value: any, separator: any) => {
if (value === undefined || value.length === 0) {
return '';
}
if (Array.isArray(value)) {
value = value.join(',');
}
const actions: any[] = [];
const currentSeparator = undefined === separator ? ',' : separator;
const temp = value.split(currentSeparator);
Object.keys(value.split(currentSeparator)).some((val) => {
let match = false;
Object.keys(datas).some((key) => {
if (datas[key].value == '' + temp[val]) {
actions.push(datas[key].label + currentSeparator);
match = true;
}
});
if (!match) {
actions.push(temp[val] + currentSeparator);
}
});
return actions.join('').substring(0, actions.join('').length - 1);
};
// 字符串格式化(%s )
export function sprintf(str: string) {
if (arguments.length !== 0) {
let flag = true,
i = 1;
str = str.replace(/%s/g, function () {
const arg = arguments[i++];
if (typeof arg === 'undefined') {
flag = false;
return '';
}
return arg;
});
return flag ? str : '';
}
}
// 转换字符串undefined,null等转化为""
export const parseStrEmpty = (str: any) => {
if (!str || str == 'undefined' || str == 'null') {
return '';
}
return str;
};
// 数据合并
export const mergeRecursive = (source: any, target: any) => {
for (const p in target) {
try {
if (target[p].constructor == Object) {
source[p] = mergeRecursive(source[p], target[p]);
} else {
source[p] = target[p];
}
} catch (e) {
source[p] = target[p];
}
}
return source;
};
/**
* 构造树型结构数据
* @param {*} data 数据源
* @param {*} id id字段 默认 'id'
* @param {*} parentId 父节点字段 默认 'parentId'
* @param {*} children 孩子节点字段 默认 'children'
*/
export const handleTree = <T>(data: any[], id?: string, parentId?: string, children?: string): T[] => {
const config: {
id: string;
parentId: string;
childrenList: string;
} = {
id: id || 'id',
parentId: parentId || 'parentId',
childrenList: children || 'children'
};
const childrenListMap: any = {};
const tree: T[] = [];
for (const d of data) {
const id = d[config.id];
childrenListMap[id] = d;
if (!d[config.childrenList]) {
d[config.childrenList] = [];
}
}
for (const d of data) {
const parentId = d[config.parentId];
const parentObj = childrenListMap[parentId];
if (!parentObj) {
tree.push(d);
} else {
parentObj[config.childrenList].push(d);
}
}
return tree;
};
/**
* 参数处理
* @param {*} params 参数
*/
export const tansParams = (params: any) => {
let result = '';
for (const propName of Object.keys(params)) {
const value = params[propName];
const part = encodeURIComponent(propName) + '=';
if (value !== null && value !== '' && typeof value !== 'undefined') {
if (typeof value === 'object') {
for (const key of Object.keys(value)) {
if (value[key] !== null && value[key] !== '' && typeof value[key] !== 'undefined') {
const params = propName + '[' + key + ']';
const subPart = encodeURIComponent(params) + '=';
result += subPart + encodeURIComponent(value[key]) + '&';
}
}
} else {
result += part + encodeURIComponent(value) + '&';
}
}
}
return result;
};
// 返回项目路径
export const getNormalPath = (p: string): string => {
if (p.length === 0 || !p || p === 'undefined') {
return p;
}
const res = p.replace('//', '/');
if (res[res.length - 1] === '/') {
return res.slice(0, res.length - 1);
}
return res;
};
// 验证是否为blob格式
export const blobValidate = (data: any) => {
return data.type !== 'application/json';
};
/**
* 姓名隐藏,只展示第一位,其余替换为 *
*/
export function getHiddenName(data) {
if (!data) return '';
const surname = data.substr(0, 1);
const star = '*'.repeat(data.length - 1);
return surname + star;
}
/**
* 详细地址隐藏数字包含中文数字,替换为 *
*/
export function getHiddenDetailAddress(data) {
const chineseNumbers = ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十'];
if (!data || data.length === 0) {
return '';
}
const tempResult = data.replace(/\d/g, '*');
let result = '';
for (let i = 0; i < tempResult.length; i++) {
if (chineseNumbers.includes(tempResult[i])) {
result += '*';
} else {
result += tempResult[i];
}
}
return result;
}
//手机号隐藏中间四位
export function getPhon(data) {
// 检查是否为有效的11位手机号
if (!/^1[3-9]\d{9}$/.test(data)) {
return data; // 非手机号格式直接返回原数据
}
// 使用正则表达式替换中间四位为星号
return data.replace(/^(\d{3})\d{4}(\d{4})$/, '$1****$2');
}
export default {
handleTree
};