351 lines
10 KiB
TypeScript
351 lines
10 KiB
TypeScript
// post类型对象参数转为get类型url参数
|
||
import queryParams from './function/queryParams';
|
||
// 路由封装
|
||
import route from './function/route';
|
||
// 时间格式化
|
||
import timeFormat from './function/timeFormat';
|
||
// 时间戳格式化,返回多久之前
|
||
import timeFrom from './function/timeFrom';
|
||
// 颜色渐变相关,colorGradient-颜色渐变,hexToRgb-十六进制颜色转rgb颜色,rgbToHex-rgb转十六进制
|
||
import colorGradients from './function/colorGradient';
|
||
// 生成全局唯一guid字符串
|
||
import guid from './function/guid';
|
||
// 主题相关颜色,info|success|warning|primary|default|error,此颜色已在uview.scss中定义,但是为js中也能使用,故也定义一份
|
||
import { color } from './config/color';
|
||
import { getColor, setColor } from './function/color';
|
||
// 根据type获取图标名称
|
||
import type2icon from './function/type2icon';
|
||
// 打乱数组的顺序
|
||
import randomArray from './function/randomArray';
|
||
// 对象和数组的深度克隆
|
||
import deepClone from './function/deepClone';
|
||
// 对象深度拷贝
|
||
import deepMerge from './function/deepMerge';
|
||
// 添加单位
|
||
import addUnit from './function/addUnit';
|
||
// 规则检验
|
||
import test from './function/test';
|
||
// 随机数
|
||
import random from './function/random';
|
||
// 去除空格
|
||
import trim from './function/trim';
|
||
// toast提示,对uni.showToast的封装
|
||
import toast from './function/toast';
|
||
// 获取父组件参数
|
||
import getParent from './function/getParent';
|
||
// 获取整个父组件
|
||
import $parent from './function/$parent';
|
||
// 获取sys()和os()工具方法
|
||
// 获取设备信息,挂载到$u的sys()(system的缩写)属性中,
|
||
// 同时把安卓和ios平台的名称"ios"和"android"挂到$u.os()中,方便取用
|
||
import { sys, os } from './function/sys';
|
||
// 防抖方法
|
||
import debounce from './function/debounce';
|
||
// 节流方法
|
||
import throttle from './function/throttle';
|
||
// 获取元素的位置信息
|
||
import getRect from './function/getRect';
|
||
// 剪贴板
|
||
import { clipboard } from './function/clipboard';
|
||
// 配置信息
|
||
import config from './config/config';
|
||
// 各个需要fixed的地方的z-index配置文件
|
||
import zIndex from './config/zIndex';
|
||
import { mitt } from './util/mitt';
|
||
// http相关
|
||
import httpPlugin, {
|
||
Request,
|
||
http,
|
||
type RequestOptions,
|
||
type RequestConfig,
|
||
type RequestInterceptor,
|
||
type RequestMeta
|
||
} from './request/index';
|
||
|
||
/**
|
||
* @description 数字格式化
|
||
* @param number 要格式化的数字
|
||
* @param decimals 保留几位小数
|
||
* @param decimalPoint 小数点符号
|
||
* @param thousandsSeparator 千分位符号
|
||
* @returns 格式化后的数字
|
||
*/
|
||
export function formatPrice(
|
||
number: number | string,
|
||
decimals: number = 0,
|
||
decimalPoint: string = '.',
|
||
thousandsSeparator: string = ','
|
||
): string {
|
||
// 辅助函数:四舍五入到指定小数位
|
||
function round(num: number, precision: number): string {
|
||
const factor = Math.pow(10, precision);
|
||
return (Math.round(num * factor) / factor).toFixed(precision);
|
||
}
|
||
|
||
let numStr = String(number).replace(/[^0-9+\-Ee.]/g, '');
|
||
const n = !isFinite(+numStr) ? 0 : +numStr;
|
||
const prec = !isFinite(+decimals) ? 0 : Math.abs(decimals);
|
||
const sep = thousandsSeparator ?? ',';
|
||
const dec = decimalPoint ?? '.';
|
||
let s: string[] = [];
|
||
|
||
s = (prec ? round(n, prec) : Math.round(n).toString()).split('.');
|
||
const re = /(-?\d+)(\d{3})/;
|
||
while (re.test(s[0])) {
|
||
s[0] = s[0].replace(re, `$1${sep}$2`);
|
||
}
|
||
|
||
if ((s[1] || '').length < prec) {
|
||
s[1] = s[1] || '';
|
||
s[1] += '0'.repeat(prec - s[1].length);
|
||
}
|
||
return s.join(dec);
|
||
}
|
||
|
||
// 默认的姓名脱敏规则
|
||
export function formatName(name: string): string {
|
||
if (name.length === 2) {
|
||
return name.charAt(0) + '*';
|
||
} else if (name.length > 2) {
|
||
const masked = '*'.repeat(name.length - 2);
|
||
return name.charAt(0) + masked + name.charAt(name.length - 1);
|
||
} else {
|
||
return name;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @description 样式转换
|
||
* 对象转字符串,或者字符串转对象
|
||
* @param {object | string} customStyle 需要转换的目标
|
||
* @param {String} target 转换的目的,object-转为对象,string-转为字符串
|
||
* @returns {object|string}
|
||
*/
|
||
export function addStyle(
|
||
customStyle: Record<string, string> | string,
|
||
target: 'object' | 'string' = 'object'
|
||
): Record<string, string> | string {
|
||
// 字符串转字符串,对象转对象情形,直接返回
|
||
if (
|
||
test.empty(customStyle) ||
|
||
(typeof customStyle === 'object' && target === 'object') ||
|
||
(target === 'string' && typeof customStyle === 'string')
|
||
) {
|
||
return customStyle;
|
||
}
|
||
// 字符串转对象
|
||
if (target === 'object') {
|
||
// 去除字符串样式中的两端空格
|
||
const trimmedStyle = trim(customStyle as string);
|
||
const styleArray = trimmedStyle.split(';');
|
||
const style: Record<string, string> = {};
|
||
for (let i = 0; i < styleArray.length; i++) {
|
||
if (styleArray[i]) {
|
||
const item = styleArray[i].split(':');
|
||
if (item.length === 2) {
|
||
style[trim(item[0])] = trim(item[1]);
|
||
}
|
||
}
|
||
}
|
||
return style;
|
||
}
|
||
// 对象转字符串
|
||
let string = '';
|
||
for (const i in customStyle as Record<string, string>) {
|
||
if (Object.prototype.hasOwnProperty.call(customStyle, i)) {
|
||
const key = i.replace(/([A-Z])/g, '-$1').toLowerCase();
|
||
string += `${key}:${(customStyle as Record<string, string>)[i]};`;
|
||
}
|
||
}
|
||
return trim(string);
|
||
}
|
||
|
||
/**
|
||
* 将外部传入的样式格式化为可读的 CSS 样式。
|
||
* @param {object | object[]} styles 外部传入的样式对象或数组
|
||
* @returns {string} 格式化后的 CSS 样式字符串
|
||
*/
|
||
export function toStyle(...styles: Array<Record<string, any> | string | null | undefined>): string {
|
||
// 支持多参数:每个参数可以是 object 或 string,后面的参数优先级更高,会覆盖同名样式
|
||
// 如果传入单个数组(兼容旧调用),解构展开
|
||
if (styles.length === 1 && Array.isArray(styles[0])) {
|
||
styles = (styles[0] as any[]).slice();
|
||
}
|
||
|
||
// 用于合并样式的 Map,key 使用 kebab-case
|
||
const map = new Map<string, any>();
|
||
|
||
const processString = (str: string) => {
|
||
if (!str) return;
|
||
// 移除可能的末尾分号,再按分号分割
|
||
const parts = str.split(';');
|
||
for (let part of parts) {
|
||
part = part.trim();
|
||
if (!part) continue;
|
||
const idx = part.indexOf(':');
|
||
if (idx === -1) continue;
|
||
const key = trim(part.slice(0, idx));
|
||
const val = trim(part.slice(idx + 1));
|
||
if (key === '' || val === '') continue;
|
||
const k = kebabCase(key);
|
||
map.set(k, val);
|
||
}
|
||
};
|
||
|
||
const processObject = (obj: Record<string, any>) => {
|
||
if (!obj) return;
|
||
Object.keys(obj).forEach(key => {
|
||
const val = obj[key];
|
||
if (val == null || val === '') return;
|
||
const k = kebabCase(key);
|
||
map.set(k, val);
|
||
});
|
||
};
|
||
|
||
for (const item of styles) {
|
||
if (item == null || item === '') continue;
|
||
if (test.string(item)) {
|
||
processString(item as string);
|
||
} else if (test.array(item)) {
|
||
// 若传入数组作为参数,递归处理数组元素
|
||
(item as any[]).forEach(el => {
|
||
if (test.string(el)) processString(el as string);
|
||
else if (test.object(el)) processObject(el as Record<string, any>);
|
||
});
|
||
} else if (test.object(item)) {
|
||
processObject(item as Record<string, any>);
|
||
}
|
||
}
|
||
|
||
if (map.size === 0) return '';
|
||
|
||
// 按插入顺序构造样式字符串,值转成字符串
|
||
const result = Array.from(map.entries())
|
||
.map(([k, v]) => `${k}:${String(v)}`)
|
||
.join(';');
|
||
|
||
return result ? (result.endsWith(';') ? result : result + ';') : '';
|
||
}
|
||
|
||
/**
|
||
* 将驼峰命名转换为短横线命名。
|
||
* @param {string} word 待转换的词条
|
||
* @returns {string} 转换后的结果
|
||
*/
|
||
export function kebabCase(word: string): string {
|
||
// 使用正则表达式匹配所有大写字母,并在前面加上短横线,然后转换为小写
|
||
const newWord: string = word
|
||
.replace(/[A-Z]/g, function (match) {
|
||
return '-' + match;
|
||
})
|
||
.toLowerCase();
|
||
|
||
return newWord;
|
||
}
|
||
|
||
/**
|
||
* @description 进行延时,以达到可以简写代码的目的 比如: await uni.$u.sleep(20)将会阻塞20ms
|
||
* @param {number} value 堵塞时间 单位ms 毫秒
|
||
* @returns {Promise} 返回promise
|
||
*/
|
||
export function sleep(value: number = 30): Promise<boolean> {
|
||
return new Promise(resolve => {
|
||
setTimeout(() => {
|
||
resolve(true);
|
||
}, value);
|
||
});
|
||
}
|
||
|
||
export {
|
||
queryParams,
|
||
route,
|
||
timeFormat,
|
||
timeFrom,
|
||
guid,
|
||
color,
|
||
getColor,
|
||
setColor,
|
||
sys,
|
||
os,
|
||
type2icon,
|
||
randomArray,
|
||
deepClone,
|
||
deepMerge,
|
||
addUnit,
|
||
test,
|
||
random,
|
||
trim,
|
||
toast,
|
||
debounce,
|
||
throttle,
|
||
getRect,
|
||
getParent,
|
||
$parent,
|
||
clipboard,
|
||
config,
|
||
zIndex,
|
||
mitt
|
||
};
|
||
|
||
export const $u = {
|
||
queryParams: queryParams,
|
||
route: route,
|
||
timeFormat: timeFormat,
|
||
date: timeFormat, // 另名date
|
||
timeFrom,
|
||
colorGradient: colorGradients.colorGradient,
|
||
colorToRgba: colorGradients.colorToRgba,
|
||
guid,
|
||
color,
|
||
getColor,
|
||
setColor,
|
||
sys,
|
||
os,
|
||
type2icon,
|
||
randomArray,
|
||
hexToRgb: colorGradients.hexToRgb,
|
||
rgbToHex: colorGradients.rgbToHex,
|
||
test,
|
||
random,
|
||
deepClone,
|
||
deepMerge,
|
||
getParent,
|
||
$parent,
|
||
clipboard,
|
||
addUnit,
|
||
trim,
|
||
type: ['primary', 'success', 'error', 'warning', 'info'],
|
||
http,
|
||
toast,
|
||
config, // uView配置信息相关,比如版本号
|
||
zIndex,
|
||
debounce,
|
||
throttle,
|
||
mitt: mitt(),
|
||
getRect,
|
||
formatPrice,
|
||
formatName,
|
||
addStyle,
|
||
toStyle,
|
||
kebabCase,
|
||
sleep
|
||
};
|
||
|
||
// 颜色相关方法单独导出
|
||
export const { colorGradient, colorToRgba, hexToRgb, rgbToHex } = colorGradients;
|
||
// http相关导出
|
||
export {
|
||
Request,
|
||
httpPlugin,
|
||
http,
|
||
type RequestOptions,
|
||
type RequestConfig,
|
||
type RequestInterceptor,
|
||
type RequestMeta
|
||
};
|
||
|
||
export * from './hooks';
|
||
|
||
export * from './util/logger';
|
||
export * from './util/config-provider';
|