|
@@ -2,7 +2,7 @@
|
|
* 判断对象类型
|
|
* 判断对象类型
|
|
* @param {*} obj 对象
|
|
* @param {*} obj 对象
|
|
*/
|
|
*/
|
|
-export function objTypeOf(obj) {
|
|
|
|
|
|
+export function objTypeOf(obj: any): string {
|
|
const map = {
|
|
const map = {
|
|
'[object Boolean]': 'boolean',
|
|
'[object Boolean]': 'boolean',
|
|
'[object Number]': 'number',
|
|
'[object Number]': 'number',
|
|
@@ -24,10 +24,7 @@ export function objTypeOf(obj) {
|
|
* @param {Object} target 目标对象
|
|
* @param {Object} target 目标对象
|
|
* @param {Object} sources 源对象
|
|
* @param {Object} sources 源对象
|
|
*/
|
|
*/
|
|
-export function objAssign<T extends object>(
|
|
|
|
- target: object,
|
|
|
|
- sources: object
|
|
|
|
-): T {
|
|
|
|
|
|
+export function objAssign<T extends object>(target: T, sources: object): T {
|
|
const targ = { ...target };
|
|
const targ = { ...target };
|
|
Object.keys(targ).forEach((k) => {
|
|
Object.keys(targ).forEach((k) => {
|
|
targ[k] = Object.prototype.hasOwnProperty.call(sources, k)
|
|
targ[k] = Object.prototype.hasOwnProperty.call(sources, k)
|
|
@@ -42,7 +39,7 @@ export function objAssign<T extends object>(
|
|
* @param {Object} target 目标对象
|
|
* @param {Object} target 目标对象
|
|
* @param {Object} sources 源对象
|
|
* @param {Object} sources 源对象
|
|
*/
|
|
*/
|
|
-export function objModifyAssign(target: object, sources: object) {
|
|
|
|
|
|
+export function objModifyAssign(target: object, sources: object): void {
|
|
Object.keys(target).forEach((k) => {
|
|
Object.keys(target).forEach((k) => {
|
|
if (Object.prototype.hasOwnProperty.call(sources, k)) {
|
|
if (Object.prototype.hasOwnProperty.call(sources, k)) {
|
|
target[k] = sources[k];
|
|
target[k] = sources[k];
|
|
@@ -50,72 +47,6 @@ export function objModifyAssign(target: object, sources: object) {
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
-/**
|
|
|
|
- * 文件流下载
|
|
|
|
- * @param {Object} option 文件下载设置
|
|
|
|
- */
|
|
|
|
-export function download(option) {
|
|
|
|
- const defOpt = {
|
|
|
|
- type: 'get',
|
|
|
|
- url: '',
|
|
|
|
- data: '',
|
|
|
|
- fileName: '',
|
|
|
|
- header: '',
|
|
|
|
- };
|
|
|
|
- const opt = objAssign(defOpt, option);
|
|
|
|
-
|
|
|
|
- return new Promise((resolve, reject) => {
|
|
|
|
- const xhr = new XMLHttpRequest();
|
|
|
|
- xhr.open(opt.type.toUpperCase(), opt.url, true);
|
|
|
|
- xhr.responseType = 'blob';
|
|
|
|
-
|
|
|
|
- // header set
|
|
|
|
- if (opt.header && objTypeOf(opt.header) === 'object') {
|
|
|
|
- Object.keys(opt.header).forEach((key) => {
|
|
|
|
- xhr.setRequestHeader(key, opt.header[key]);
|
|
|
|
- });
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- xhr.onload = () => {
|
|
|
|
- if (this.readyState === 4 && this.status === 200) {
|
|
|
|
- if (this.response.size < 1024) {
|
|
|
|
- reject(new Error('文件不存在!'));
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- const blob = this.response;
|
|
|
|
- let pdfUrl = '';
|
|
|
|
- const uRl = window.URL || window.webkitURL;
|
|
|
|
- if (uRl && uRl.createObjectURL) {
|
|
|
|
- pdfUrl = uRl.createObjectURL(blob);
|
|
|
|
- } else {
|
|
|
|
- reject(new Error('浏览器不兼容!'));
|
|
|
|
- }
|
|
|
|
- const a = document.createElement('a');
|
|
|
|
- a.download = opt.fileName;
|
|
|
|
- a.href = pdfUrl;
|
|
|
|
- document.body.appendChild(a);
|
|
|
|
- a.click();
|
|
|
|
- a.parentNode.removeChild(a);
|
|
|
|
- resolve(true);
|
|
|
|
- } else {
|
|
|
|
- reject(new Error('请求错误!'));
|
|
|
|
- }
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- if (opt.type.toUpperCase() === 'POST') {
|
|
|
|
- const fromData = new FormData();
|
|
|
|
- Object.keys(opt.data).forEach((key) => {
|
|
|
|
- fromData.append(key, opt.data[key]);
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
- xhr.send(fromData);
|
|
|
|
- } else {
|
|
|
|
- xhr.send();
|
|
|
|
- }
|
|
|
|
- });
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
/**
|
|
/**
|
|
* 获取随机code,默认获取16位
|
|
* 获取随机code,默认获取16位
|
|
* @param {Number} len 推荐8的倍数
|
|
* @param {Number} len 推荐8的倍数
|
|
@@ -137,7 +68,7 @@ export function randomCode(len = 16) {
|
|
* 序列化参数
|
|
* 序列化参数
|
|
* @param {Object} params 参数对象
|
|
* @param {Object} params 参数对象
|
|
*/
|
|
*/
|
|
-export function qsParams(params) {
|
|
|
|
|
|
+export function qsParams(params: Record<string, any>) {
|
|
return Object.entries(params)
|
|
return Object.entries(params)
|
|
.map((el) => `${el[0]}=${el[1]}`)
|
|
.map((el) => `${el[0]}=${el[1]}`)
|
|
.join('&');
|
|
.join('&');
|
|
@@ -176,7 +107,7 @@ export function formatDate(
|
|
* 获取时间长度文字
|
|
* 获取时间长度文字
|
|
* @param {Number} timeNumber 时间数值,单位:毫秒
|
|
* @param {Number} timeNumber 时间数值,单位:毫秒
|
|
*/
|
|
*/
|
|
-export function timeNumberToText(timeNumber) {
|
|
|
|
|
|
+export function timeNumberToText(timeNumber: number): string {
|
|
const DAY_TIME = 24 * 60 * 60 * 1000;
|
|
const DAY_TIME = 24 * 60 * 60 * 1000;
|
|
const HOUR_TIME = 60 * 60 * 1000;
|
|
const HOUR_TIME = 60 * 60 * 1000;
|
|
const MINUTE_TIME = 60 * 1000;
|
|
const MINUTE_TIME = 60 * 1000;
|
|
@@ -187,24 +118,22 @@ export function timeNumberToText(timeNumber) {
|
|
if (residueTime >= DAY_TIME) {
|
|
if (residueTime >= DAY_TIME) {
|
|
day = Math.floor(residueTime / DAY_TIME);
|
|
day = Math.floor(residueTime / DAY_TIME);
|
|
residueTime -= day * DAY_TIME;
|
|
residueTime -= day * DAY_TIME;
|
|
- day += '天';
|
|
|
|
}
|
|
}
|
|
if (residueTime >= HOUR_TIME) {
|
|
if (residueTime >= HOUR_TIME) {
|
|
hour = Math.floor(residueTime / HOUR_TIME);
|
|
hour = Math.floor(residueTime / HOUR_TIME);
|
|
residueTime -= hour * HOUR_TIME;
|
|
residueTime -= hour * HOUR_TIME;
|
|
- hour += '小时';
|
|
|
|
}
|
|
}
|
|
if (residueTime >= MINUTE_TIME) {
|
|
if (residueTime >= MINUTE_TIME) {
|
|
minute = Math.floor(residueTime / MINUTE_TIME);
|
|
minute = Math.floor(residueTime / MINUTE_TIME);
|
|
residueTime -= minute * MINUTE_TIME;
|
|
residueTime -= minute * MINUTE_TIME;
|
|
- minute += '分钟';
|
|
|
|
}
|
|
}
|
|
if (residueTime >= SECOND_TIME) {
|
|
if (residueTime >= SECOND_TIME) {
|
|
second = Math.round(residueTime / SECOND_TIME);
|
|
second = Math.round(residueTime / SECOND_TIME);
|
|
- second += '秒';
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- return [day, hour, minute, second].filter((item) => !!item).join('');
|
|
|
|
|
|
+ return [`${day}天`, `${hour}小时`, `${minute}分钟`, `${second}秒`]
|
|
|
|
+ .filter((item) => !!item)
|
|
|
|
+ .join('');
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -212,7 +141,7 @@ export function timeNumberToText(timeNumber) {
|
|
* @param {Number} timeNumber 时间数值,单位:毫秒
|
|
* @param {Number} timeNumber 时间数值,单位:毫秒
|
|
* @param {Number} wainingTime 最大剩余警告时间数值,单位:毫秒
|
|
* @param {Number} wainingTime 最大剩余警告时间数值,单位:毫秒
|
|
*/
|
|
*/
|
|
-export function residueFloorTime(timeNumber, wainingTime = 0) {
|
|
|
|
|
|
+export function residueFloorTime(timeNumber: number, wainingTime = 0) {
|
|
if (timeNumber < 0) {
|
|
if (timeNumber < 0) {
|
|
return { status: 'danger', title: '已过期' };
|
|
return { status: 'danger', title: '已过期' };
|
|
}
|
|
}
|
|
@@ -254,7 +183,7 @@ export function residueFloorTime(timeNumber, wainingTime = 0) {
|
|
};
|
|
};
|
|
}
|
|
}
|
|
|
|
|
|
-export function parseTimeRangeDateAndTime(startTime, endTime) {
|
|
|
|
|
|
+export function parseTimeRangeDateAndTime(startTime: number, endTime: number) {
|
|
if (!startTime || !endTime)
|
|
if (!startTime || !endTime)
|
|
return {
|
|
return {
|
|
date: '',
|
|
date: '',
|
|
@@ -270,7 +199,10 @@ export function parseTimeRangeDateAndTime(startTime, endTime) {
|
|
};
|
|
};
|
|
}
|
|
}
|
|
|
|
|
|
-export function parseTimeRangeDateAndTimeContent(startTime, endTime) {
|
|
|
|
|
|
+export function parseTimeRangeDateAndTimeContent(
|
|
|
|
+ startTime: number,
|
|
|
|
+ endTime: number
|
|
|
|
+) {
|
|
const { date, time } = parseTimeRangeDateAndTime(startTime, endTime);
|
|
const { date, time } = parseTimeRangeDateAndTime(startTime, endTime);
|
|
return `${date} ${time}`;
|
|
return `${date} ${time}`;
|
|
}
|
|
}
|
|
@@ -286,7 +218,7 @@ export function localNowDateTime() {
|
|
*
|
|
*
|
|
* @param {Number} time 时间戳
|
|
* @param {Number} time 时间戳
|
|
*/
|
|
*/
|
|
-export function getTimeDatestamp(time) {
|
|
|
|
|
|
+export function getTimeDatestamp(time: number) {
|
|
const date = formatDate('YYYY-MM-DD HH:mm', new Date(time)).split(' ')[0];
|
|
const date = formatDate('YYYY-MM-DD HH:mm', new Date(time)).split(' ')[0];
|
|
return new Date(`${date} 00:00:00`).getTime();
|
|
return new Date(`${date} 00:00:00`).getTime();
|
|
}
|
|
}
|
|
@@ -295,7 +227,7 @@ export function getTimeDatestamp(time) {
|
|
* 获取指定元素个数的数组
|
|
* 获取指定元素个数的数组
|
|
* @param {Number} num
|
|
* @param {Number} num
|
|
*/
|
|
*/
|
|
-export function getNumList(num) {
|
|
|
|
|
|
+export function getNumList(num: number) {
|
|
return '#'.repeat(num).split('');
|
|
return '#'.repeat(num).split('');
|
|
}
|
|
}
|
|
|
|
|
|
@@ -303,7 +235,7 @@ export function getNumList(num) {
|
|
* 清除html标签
|
|
* 清除html标签
|
|
* @param {String} str html字符串
|
|
* @param {String} str html字符串
|
|
*/
|
|
*/
|
|
-export function removeHtmlTag(str) {
|
|
|
|
|
|
+export function removeHtmlTag(str: string) {
|
|
return str.replace(/<[^>]+>/g, '');
|
|
return str.replace(/<[^>]+>/g, '');
|
|
}
|
|
}
|
|
|
|
|
|
@@ -311,7 +243,7 @@ export function removeHtmlTag(str) {
|
|
* 计算总数
|
|
* 计算总数
|
|
* @param {Array} dataList 需要统计的数组
|
|
* @param {Array} dataList 需要统计的数组
|
|
*/
|
|
*/
|
|
-export function calcSum(dataList) {
|
|
|
|
|
|
+export function calcSum(dataList: number[]) {
|
|
if (!dataList.length) return 0;
|
|
if (!dataList.length) return 0;
|
|
return dataList.reduce((total, item) => {
|
|
return dataList.reduce((total, item) => {
|
|
return total + item;
|
|
return total + item;
|
|
@@ -322,31 +254,31 @@ export function calcSum(dataList) {
|
|
* 计算评卷数
|
|
* 计算评卷数
|
|
* @param {Array} dataList 需要统计的数组
|
|
* @param {Array} dataList 需要统计的数组
|
|
*/
|
|
*/
|
|
-export function calcAvg(dataList) {
|
|
|
|
|
|
+export function calcAvg(dataList: number[]) {
|
|
if (!dataList.length) return 0;
|
|
if (!dataList.length) return 0;
|
|
return calcSum(dataList) / dataList.length;
|
|
return calcSum(dataList) / dataList.length;
|
|
}
|
|
}
|
|
|
|
|
|
/** 获取数组最大数 */
|
|
/** 获取数组最大数 */
|
|
-export function maxNum(dataList) {
|
|
|
|
|
|
+export function maxNum(dataList: number[]) {
|
|
if (!dataList.length) return 0;
|
|
if (!dataList.length) return 0;
|
|
return Math.max.apply(null, dataList);
|
|
return Math.max.apply(null, dataList);
|
|
}
|
|
}
|
|
|
|
|
|
-export function isEmptyObject(obj) {
|
|
|
|
|
|
+export function isEmptyObject(obj: object) {
|
|
return !Object.keys(obj).length;
|
|
return !Object.keys(obj).length;
|
|
}
|
|
}
|
|
|
|
|
|
-export function humpToLowLine(a) {
|
|
|
|
|
|
+export function humpToLowLine(a: string) {
|
|
return a
|
|
return a
|
|
.replace(/([A-Z])/g, '-$1')
|
|
.replace(/([A-Z])/g, '-$1')
|
|
.toLowerCase()
|
|
.toLowerCase()
|
|
.slice(1);
|
|
.slice(1);
|
|
}
|
|
}
|
|
|
|
|
|
-export function pickByNotNull(params) {
|
|
|
|
|
|
+export function pickByNotNull(params: Record<string, any>) {
|
|
const nData = {};
|
|
const nData = {};
|
|
- Object.entries(params).forEach(([key, val]) => {
|
|
|
|
|
|
+ (Object.entries(params) as [string, any][]).forEach(([key, val]) => {
|
|
if (val === null || val === 'null' || val === '') return;
|
|
if (val === null || val === 'null' || val === '') return;
|
|
nData[key] = val;
|
|
nData[key] = val;
|
|
});
|
|
});
|
|
@@ -358,7 +290,7 @@ export function autoSubmitForm(url: string, params: Record<string, any>) {
|
|
form.action = url;
|
|
form.action = url;
|
|
form.method = 'post';
|
|
form.method = 'post';
|
|
|
|
|
|
- Object.entries(params).forEach(([key, val]) => {
|
|
|
|
|
|
+ (Object.entries(params) as [string, any][]).forEach(([key, val]) => {
|
|
const input = document.createElement('input');
|
|
const input = document.createElement('input');
|
|
input.type = 'hidden';
|
|
input.type = 'hidden';
|
|
input.name = key;
|
|
input.name = key;
|
|
@@ -369,7 +301,7 @@ export function autoSubmitForm(url: string, params: Record<string, any>) {
|
|
form.submit();
|
|
form.submit();
|
|
}
|
|
}
|
|
|
|
|
|
-export function blobToText(blob) {
|
|
|
|
|
|
+export function blobToText(blob: Blob): Promise<string | ArrayBuffer | null> {
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
const reader = new FileReader();
|
|
const reader = new FileReader();
|
|
reader.readAsText(blob, 'utf-8');
|
|
reader.readAsText(blob, 'utf-8');
|
|
@@ -382,16 +314,19 @@ export function blobToText(blob) {
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
-export function parseHrefParam(urlStr, paramName = null): any {
|
|
|
|
- if (!urlStr) return '';
|
|
|
|
|
|
+export function parseHrefParam(
|
|
|
|
+ urlStr: string,
|
|
|
|
+ paramName = ''
|
|
|
|
+): Record<string, any> | null {
|
|
|
|
+ if (!urlStr) return null;
|
|
const url = new URL(urlStr);
|
|
const url = new URL(urlStr);
|
|
|
|
|
|
const urlParams = new URLSearchParams(url.search);
|
|
const urlParams = new URLSearchParams(url.search);
|
|
|
|
|
|
- if (paramName) return urlParams.get(paramName);
|
|
|
|
|
|
+ if (paramName) return urlParams.get(paramName as string);
|
|
|
|
|
|
const params = {};
|
|
const params = {};
|
|
- urlParams.entries().forEach(([k, v]) => {
|
|
|
|
|
|
+ (urlParams.entries() as [string, string][]).forEach(([k, v]) => {
|
|
params[k] = v;
|
|
params[k] = v;
|
|
});
|
|
});
|
|
return params;
|
|
return params;
|
|
@@ -402,14 +337,15 @@ export function parseHrefParam(urlStr, paramName = null): any {
|
|
* @param data 字典数据
|
|
* @param data 字典数据
|
|
* @returns option列表
|
|
* @returns option列表
|
|
*/
|
|
*/
|
|
-export function dictToOption(
|
|
|
|
- dict: Record<any, string>
|
|
|
|
-): Array<{ value: any; label: string }> {
|
|
|
|
- const options = [];
|
|
|
|
|
|
+export function dictToOption(dict: Record<any, string>) {
|
|
|
|
+ const options = [] as Array<{
|
|
|
|
+ value: number | string | boolean;
|
|
|
|
+ label: string;
|
|
|
|
+ }>;
|
|
const booleanStrs = ['true', 'false'];
|
|
const booleanStrs = ['true', 'false'];
|
|
Object.keys(dict).forEach((k) => {
|
|
Object.keys(dict).forEach((k) => {
|
|
options.push({
|
|
options.push({
|
|
- value: booleanStrs.includes(k) ? JSON.parse(k) : k,
|
|
|
|
|
|
+ value: booleanStrs.includes(k) ? (JSON.parse(k) as boolean) : k,
|
|
label: dict[k],
|
|
label: dict[k],
|
|
});
|
|
});
|
|
});
|
|
});
|