看板
This commit is contained in:
@@ -0,0 +1,350 @@
|
||||
// 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';
|
||||
Reference in New Issue
Block a user