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

3 years ago
  1. 'use strict';
  2. const MD5 = require('md5.js');
  3. import {iconData, typeHeader } from "./../contact";
  4. class Helper {
  5. hideScroll(type){
  6. let body = document.getElementsByTagName('body')[0];
  7. if (type === 1) {
  8. body.style.overflowY = 'hidden';
  9. body.style.height = '100%';
  10. } else {
  11. body.style.overflowY = '';
  12. body.style.height = '';
  13. }
  14. };
  15. /**
  16. * @description 字符串截取
  17. * @param val
  18. * @param len
  19. */
  20. cutStringLen(val, len = 10) {
  21. let fix = '...';
  22. let newLength = 0;
  23. let newStr = "";
  24. let chineseRegex = /[^\x00-\xff]/g;
  25. let singleChar = "";
  26. let strLength = val.replace(chineseRegex, "**").length;
  27. for (let i = 0; i < strLength; i++) {
  28. singleChar = val.charAt(i).toString();
  29. if (singleChar.match(chineseRegex) != null) {
  30. newLength += 2;
  31. } else {
  32. newLength++;
  33. }
  34. if (newLength > len) {
  35. break;
  36. }
  37. newStr += singleChar;
  38. }
  39. if (strLength > len) {
  40. newStr += fix;
  41. }
  42. return newStr;
  43. }
  44. checkVarType(obj) {
  45. let toString = Object.prototype.toString;
  46. let map = {
  47. '[object Boolean]': 'boolean',
  48. '[object Number]': 'number',
  49. '[object String]': 'string',
  50. '[object Function]': 'function',
  51. '[object Array]': 'array',
  52. '[object Date]': 'date',
  53. '[object RegExp]': 'regExp',
  54. '[object Undefined]': 'undefined',
  55. '[object Null]': 'null',
  56. '[object Object]': 'object',
  57. '[object Blob]' : 'blob'
  58. };
  59. return map[toString.call(obj)];
  60. }
  61. getID() {
  62. return this.random(1111111, 9999999);
  63. }
  64. md5Fn(str, hex = 'hex'){
  65. return new MD5()['update'](str)['digest'](hex);
  66. }
  67. random(min, max) {
  68. let Range = max - min;
  69. let Rand = Math.random();
  70. return (min + Math.round(Rand * Range));
  71. }
  72. parseURL(url) {
  73. if (!url) {
  74. url = window.location.href;
  75. }
  76. let a = document.createElement('a');
  77. a.href = url;
  78. return {
  79. source: url,
  80. protocol: a.protocol.replace(':', ''),
  81. host: a.hostname,
  82. port: a.port,
  83. query: a.search,
  84. params: (function() {
  85. let ret = {},
  86. seg = a.search.replace(/^\?/, '').split('&'),
  87. len = seg.length, i = 0, s;
  88. for (; i < len; i++) {
  89. if (!seg[i]) {
  90. continue;
  91. }
  92. s = seg[i].split('=');
  93. if (s[1]) {
  94. ret[s[0]] = s[1];
  95. }
  96. }
  97. return ret;
  98. })(),
  99. file: (a.pathname.match(/\/([^\/?#]+)$/i) || [, ''])[1],
  100. hash: a.hash.replace('#', ''),
  101. path: a.pathname.replace(/^([^\/])/, '/$1'),
  102. relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [, ''])[1],
  103. segments: a.pathname.replace(/^\//, '').split('/')
  104. };
  105. }
  106. /***
  107. * @description 获取文件类型
  108. * @param blob
  109. */
  110. checkFileType(blob){
  111. let type = typeHeader['unkown'];
  112. if(typeHeader[blob.type]) {
  113. type = typeHeader[blob.type];
  114. }
  115. return type;
  116. }
  117. /**
  118. * @description 获取文件base64流
  119. * @param blob
  120. * @param file
  121. * @returns {Promise<unknown>}
  122. */
  123. fileReaderBase64(blob, file){
  124. return new Promise((resolve, reject)=>{
  125. let reader = new FileReader();
  126. reader.onload = (e)=> {
  127. resolve(e.target['result']);
  128. };
  129. reader.onerror = ()=>{
  130. reject('读取文件错误')
  131. };
  132. reader.readAsDataURL(blob);
  133. });
  134. }
  135. /**
  136. * @description 获取文件相关信息
  137. * @param url
  138. * @param name
  139. * @returns {Promise<unknown>}
  140. */
  141. getFileBase64(url='',name = '') {
  142. return new Promise((resolve, reject) => {
  143. let getName = (type)=> {
  144. let str = url;
  145. if(str.indexOf('?')) str = url.split('?')[0];
  146. let arr = str.split('/');
  147. return arr[arr.length - 1];
  148. };
  149. let x = new XMLHttpRequest();
  150. x.open("GET", url, true);
  151. x.responseType = "blob";
  152. x.onload = (e) => {
  153. console.log('XMLHttpRequest',e);
  154. if (e.target['status'] === 200) {
  155. //console.log('this.checkFileType(e.target[\'response\'])',url,this.checkFileType(e.target['response']));
  156. let temp = {
  157. type: this.checkFileType(e.target['response']),
  158. size: e.target['response']['size'],
  159. name: name ? name: getName(this.checkFileType(e.target['response'])),
  160. };
  161. this.fileReaderBase64(e.target['response'], temp)
  162. .then(res=>{
  163. temp['url'] = res;
  164. temp['icon'] = this.getIcon(temp['type']);
  165. temp['response'] = e.target['response'];
  166. resolve(temp);
  167. })
  168. .catch(res=>{
  169. reject(res)
  170. })
  171. } else if (e.target['status'] === 404) {
  172. console.error('error', e);
  173. reject('您下载的文件不存在!');
  174. } else {
  175. console.error('error', e);
  176. reject('网络错误!');
  177. }
  178. };
  179. x.onerror = (e) => {
  180. console.log('onerror')
  181. console.log('error', e);
  182. reject('网络错误!');
  183. }
  184. x.send();
  185. })
  186. }
  187. /**
  188. * @description 获取图片相应的图片
  189. * @param type
  190. * @returns {string}
  191. */
  192. getIcon(type='') {
  193. let temp = '';
  194. if(iconData[type.toLocaleLowerCase()]) {
  195. temp = iconData[type.toLocaleLowerCase()];
  196. }
  197. return temp;
  198. }
  199. /**
  200. * @description 判断俩个需要处理的数字谁的小数点后位数多
  201. * 以多的为准值乘以10的小数位的幂数相加以后再除以10的小数位的幂数
  202. * @param currentNum
  203. * @param targetNum
  204. */
  205. checkFloatMore(currentNum, targetNum){
  206. let sq1, sq2;
  207. try {sq1 = currentNum.toString().split(".")[1].length;}
  208. catch (e) {sq1 = 0;}
  209. try {sq2 = targetNum.toString().split(".")[1].length;}
  210. catch (e) {sq2 = 0;}
  211. return Math.pow(10, Math.max(sq1, sq2));
  212. }
  213. /**
  214. * @description 两个小数相加
  215. * @param currentNum
  216. * @param targetNum
  217. * @return number
  218. */
  219. addFloatNumber(currentNum, targetNum){
  220. let power = this.checkFloatMore(currentNum, targetNum);
  221. return (currentNum * power + targetNum * power) / power;
  222. }
  223. /**
  224. * @description 两个小数减
  225. * @param currentNum
  226. * @param targetNum
  227. * @return number
  228. */
  229. cutFloatNumber(currentNum, targetNum) {
  230. let power = this.checkFloatMore(currentNum, targetNum);
  231. return (currentNum * power - targetNum * power) / power;
  232. }
  233. /**
  234. * @description 计算两个小数相乘
  235. * @param currentNum
  236. * @param targetNum
  237. * @returns {number}
  238. */
  239. multiplyFloatNumber(currentNum, targetNum){
  240. let m = 0, s1 = currentNum.toString(), s2 = targetNum.toString();
  241. try {m += s1.split(".")[1].length;} catch (e) {}
  242. try {m += s2.split(".")[1].length;} catch (e) {}
  243. return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
  244. }
  245. /**
  246. * @description 计算两个小数相除
  247. * @param currentNum
  248. * @param targetNum
  249. * @returns {number}
  250. */
  251. divisionFloatNumber(currentNum, targetNum){
  252. let t1 = 0, t2 = 0, r1, r2;
  253. try {t1 = currentNum.toString().split(".")[1].length} catch (e) {}
  254. try {t2 = targetNum.toString().split(".")[1].length} catch (e) {}
  255. r1 = Number(currentNum.toString().replace(".", ""))
  256. r2 = Number(targetNum.toString().replace(".", ""))
  257. return (r1 / r2) * Math.pow(10, t2 - t1);
  258. }
  259. /**
  260. * @description 创建node节点
  261. * @param options {object}
  262. * @param options.fid 文件ID唯一id必填
  263. * @param options.name 文件名称选填
  264. * @param options.url //文件地址(必填)
  265. * @param Vue Vue类 必填
  266. * @param view vue文件必填
  267. */
  268. createElement(options, Vue, view){
  269. console.log('PDF预览功能', options);
  270. let str = `${options.name}${options['fid']}`;
  271. let elId = `img-${this.md5Fn(str)}`;
  272. let ele = document.getElementById(elId);
  273. if (ele) {
  274. ele.style.display = "block";
  275. this.hideScroll(1);
  276. return ele;
  277. }
  278. const View = Vue.extend(view);
  279. let $view = new View({
  280. el: document.createElement('div')
  281. });
  282. options['ele'] = elId;
  283. $view.options = options;
  284. $view.close = (id) => {
  285. let ele = document.getElementById(id);
  286. ele.style.display = "none";
  287. this.hideScroll(-1);
  288. };
  289. document.body.appendChild($view.$el);
  290. this.hideScroll(1);
  291. }
  292. }
  293. export default new Helper();