You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

321 lines
8.2 KiB

'use strict';
const MD5 = require('md5.js');
import {iconData, typeHeader } from "./../contact";
class Helper {
hideScroll(type){
let body = document.getElementsByTagName('body')[0];
if (type === 1) {
body.style.overflowY = 'hidden';
body.style.height = '100%';
} else {
body.style.overflowY = '';
body.style.height = '';
}
};
/**
* @description 字符串截取
* @param val
* @param len
*/
cutStringLen(val, len = 10) {
let fix = '...';
let newLength = 0;
let newStr = "";
let chineseRegex = /[^\x00-\xff]/g;
let singleChar = "";
let strLength = val.replace(chineseRegex, "**").length;
for (let i = 0; i < strLength; i++) {
singleChar = val.charAt(i).toString();
if (singleChar.match(chineseRegex) != null) {
newLength += 2;
} else {
newLength++;
}
if (newLength > len) {
break;
}
newStr += singleChar;
}
if (strLength > len) {
newStr += fix;
}
return newStr;
}
checkVarType(obj) {
let toString = Object.prototype.toString;
let map = {
'[object Boolean]': 'boolean',
'[object Number]': 'number',
'[object String]': 'string',
'[object Function]': 'function',
'[object Array]': 'array',
'[object Date]': 'date',
'[object RegExp]': 'regExp',
'[object Undefined]': 'undefined',
'[object Null]': 'null',
'[object Object]': 'object',
'[object Blob]' : 'blob'
};
return map[toString.call(obj)];
}
getID() {
return this.random(1111111, 9999999);
}
md5Fn(str, hex = 'hex'){
return new MD5()['update'](str)['digest'](hex);
}
random(min, max) {
let Range = max - min;
let Rand = Math.random();
return (min + Math.round(Rand * Range));
}
parseURL(url) {
if (!url) {
url = window.location.href;
}
let a = document.createElement('a');
a.href = url;
return {
source: url,
protocol: a.protocol.replace(':', ''),
host: a.hostname,
port: a.port,
query: a.search,
params: (function() {
let ret = {},
seg = a.search.replace(/^\?/, '').split('&'),
len = seg.length, i = 0, s;
for (; i < len; i++) {
if (!seg[i]) {
continue;
}
s = seg[i].split('=');
if (s[1]) {
ret[s[0]] = s[1];
}
}
return ret;
})(),
file: (a.pathname.match(/\/([^\/?#]+)$/i) || [, ''])[1],
hash: a.hash.replace('#', ''),
path: a.pathname.replace(/^([^\/])/, '/$1'),
relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [, ''])[1],
segments: a.pathname.replace(/^\//, '').split('/')
};
}
/***
* @description 获取文件类型
* @param blob
*/
checkFileType(blob){
let type = typeHeader['unkown'];
if(typeHeader[blob.type]) {
type = typeHeader[blob.type];
}
return type;
}
/**
* @description 获取文件base64流
* @param blob
* @param file
* @returns {Promise<unknown>}
*/
fileReaderBase64(blob, file){
return new Promise((resolve, reject)=>{
let reader = new FileReader();
reader.onload = (e)=> {
resolve(e.target['result']);
};
reader.onerror = ()=>{
reject('读取文件错误')
};
reader.readAsDataURL(blob);
});
}
/**
* @description 获取文件相关信息
* @param url
* @param name
* @returns {Promise<unknown>}
*/
getFileBase64(url='',name = '') {
return new Promise((resolve, reject) => {
let getName = (type)=> {
let str = url;
if(str.indexOf('?')) str = url.split('?')[0];
let arr = str.split('/');
return arr[arr.length - 1];
};
let x = new XMLHttpRequest();
x.open("GET", url, true);
x.responseType = "blob";
x.onload = (e) => {
console.log('XMLHttpRequest',e);
if (e.target['status'] === 200) {
//console.log('this.checkFileType(e.target[\'response\'])',url,this.checkFileType(e.target['response']));
let temp = {
type: this.checkFileType(e.target['response']),
size: e.target['response']['size'],
name: name ? name: getName(this.checkFileType(e.target['response'])),
};
this.fileReaderBase64(e.target['response'], temp)
.then(res=>{
temp['url'] = res;
temp['icon'] = this.getIcon(temp['type']);
temp['response'] = e.target['response'];
resolve(temp);
})
.catch(res=>{
reject(res)
})
} else if (e.target['status'] === 404) {
console.error('error', e);
reject('您下载的文件不存在!');
} else {
console.error('error', e);
reject('网络错误!');
}
};
x.onerror = (e) => {
console.log('onerror')
console.log('error', e);
reject('网络错误!');
}
x.send();
})
}
/**
* @description 获取图片相应的图片
* @param type
* @returns {string}
*/
getIcon(type='') {
let temp = '';
if(iconData[type.toLocaleLowerCase()]) {
temp = iconData[type.toLocaleLowerCase()];
}
return temp;
}
/**
* @description 判断俩个需要处理的数字谁的小数点后位数多,
* 以多的为准,值乘以10的小数位的幂数,相加以后,再除以10的小数位的幂数
* @param currentNum
* @param targetNum
*/
checkFloatMore(currentNum, targetNum){
let sq1, sq2;
try {sq1 = currentNum.toString().split(".")[1].length;}
catch (e) {sq1 = 0;}
try {sq2 = targetNum.toString().split(".")[1].length;}
catch (e) {sq2 = 0;}
return Math.pow(10, Math.max(sq1, sq2));
}
/**
* @description 两个小数相加
* @param currentNum
* @param targetNum
* @return number
*/
addFloatNumber(currentNum, targetNum){
let power = this.checkFloatMore(currentNum, targetNum);
return (currentNum * power + targetNum * power) / power;
}
/**
* @description 两个小数减
* @param currentNum
* @param targetNum
* @return number
*/
cutFloatNumber(currentNum, targetNum) {
let power = this.checkFloatMore(currentNum, targetNum);
return (currentNum * power - targetNum * power) / power;
}
/**
* @description 计算两个小数相乘
* @param currentNum
* @param targetNum
* @returns {number}
*/
multiplyFloatNumber(currentNum, targetNum){
let m = 0, s1 = currentNum.toString(), s2 = targetNum.toString();
try {m += s1.split(".")[1].length;} catch (e) {}
try {m += s2.split(".")[1].length;} catch (e) {}
return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
}
/**
* @description 计算两个小数相除
* @param currentNum
* @param targetNum
* @returns {number}
*/
divisionFloatNumber(currentNum, targetNum){
let t1 = 0, t2 = 0, r1, r2;
try {t1 = currentNum.toString().split(".")[1].length} catch (e) {}
try {t2 = targetNum.toString().split(".")[1].length} catch (e) {}
r1 = Number(currentNum.toString().replace(".", ""))
r2 = Number(targetNum.toString().replace(".", ""))
return (r1 / r2) * Math.pow(10, t2 - t1);
}
/**
* @description 创建node节点
* @param options {object}
* @param options.fid 文件ID,唯一id(必填)
* @param options.name 文件名称(选填)
* @param options.url //文件地址(必填)
* @param Vue Vue类 (必填)
* @param view vue文件(必填)
*/
createElement(options, Vue, view){
console.log('PDF预览功能', options);
let str = `${options.name}${options['fid']}`;
let elId = `img-${this.md5Fn(str)}`;
let ele = document.getElementById(elId);
if (ele) {
ele.style.display = "block";
this.hideScroll(1);
return ele;
}
const View = Vue.extend(view);
let $view = new View({
el: document.createElement('div')
});
options['ele'] = elId;
$view.options = options;
$view.close = (id) => {
let ele = document.getElementById(id);
ele.style.display = "none";
this.hideScroll(-1);
};
document.body.appendChild($view.$el);
this.hideScroll(1);
}
}
export default new Helper();