156 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
		
		
			
		
	
	
			156 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| 
								 | 
							
								/**
							 | 
						|||
| 
								 | 
							
								 * @Description: 扩展基类原型方法
							 | 
						|||
| 
								 | 
							
								 * @ComponentName: System.tools
							 | 
						|||
| 
								 | 
							
								 * @Author: wangzhigang11
							 | 
						|||
| 
								 | 
							
								 * @Date: 2022-06-24 19:35
							 | 
						|||
| 
								 | 
							
								 */
							 | 
						|||
| 
								 | 
							
								/**
							 | 
						|||
| 
								 | 
							
								 * 扩展基类原型方法,已载入全局基类,可直接调用
							 | 
						|||
| 
								 | 
							
								 * @module common/systemToolExtend
							 | 
						|||
| 
								 | 
							
								 * @Author: wangzhigang11
							 | 
						|||
| 
								 | 
							
								 * @Date: 2022-07-19 14:07
							 | 
						|||
| 
								 | 
							
								 */
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								import checkTypes from "@/utils/checkTypes";
							 | 
						|||
| 
								 | 
							
								const ArrayPrototype = Array.prototype
							 | 
						|||
| 
								 | 
							
								const NumberPrototype = Number.prototype
							 | 
						|||
| 
								 | 
							
								const StringPrototype = String.prototype
							 | 
						|||
| 
								 | 
							
								const FilePrototype = File.prototype
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								/**
							 | 
						|||
| 
								 | 
							
								 * 根据内容结果获取列表中的内容项
							 | 
						|||
| 
								 | 
							
								 * @function
							 | 
						|||
| 
								 | 
							
								 * @param { string } code  编码
							 | 
						|||
| 
								 | 
							
								 * @param { string } itemKey  列表项中的筛选项 默认为value
							 | 
						|||
| 
								 | 
							
								 * @example
							 | 
						|||
| 
								 | 
							
								 * const arr1 = [ { label: 'xxx', value: 1 }, { label: 'yyy', value: 2 } ]
							 | 
						|||
| 
								 | 
							
								 * arr1.getItemByCode(1) // -> { label: 'xxx', value: 1 }
							 | 
						|||
| 
								 | 
							
								 * * const arr2 = [ { a: '1', b: 2 }, { a: '3', b: 4 } ]
							 | 
						|||
| 
								 | 
							
								 * arr2.getItemByCode(1, 'a') // -> { a: '1', b: 2 }
							 | 
						|||
| 
								 | 
							
								 * @returns {object}
							 | 
						|||
| 
								 | 
							
								 */
							 | 
						|||
| 
								 | 
							
								ArrayPrototype.getItemByCode = function (code, itemKey = 'value') {
							 | 
						|||
| 
								 | 
							
								  if (!checkTypes.isArray(this)) return {}
							 | 
						|||
| 
								 | 
							
								  for (const item of this) {
							 | 
						|||
| 
								 | 
							
								    if (`${item[itemKey]}` === `${code}`) return item
							 | 
						|||
| 
								 | 
							
								  }
							 | 
						|||
| 
								 | 
							
								  return {}
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								/**
							 | 
						|||
| 
								 | 
							
								 * 根据逗号分割的内容获取结果
							 | 
						|||
| 
								 | 
							
								 * @param { string[] } code  需要查找的内容
							 | 
						|||
| 
								 | 
							
								 * @param { string } code  需要查找的内容
							 | 
						|||
| 
								 | 
							
								 * @param { object } option  查找的配置
							 | 
						|||
| 
								 | 
							
								 * @param { string } option.label  查找结果字符串的映射字段
							 | 
						|||
| 
								 | 
							
								 * @param { string } option.key  查找结果的键的映射字段
							 | 
						|||
| 
								 | 
							
								 * @param { string } option.separator  分割符,默认为','
							 | 
						|||
| 
								 | 
							
								 * @param { string } option.emptyText  查找结果无效时显示的内容
							 | 
						|||
| 
								 | 
							
								 * @example
							 | 
						|||
| 
								 | 
							
								 * const arr = [{id: 1, name: '小红'}, [id: 3, name: '小明']]
							 | 
						|||
| 
								 | 
							
								 * arr.getLabelByCodes('1,3', { label: 'name', key: 'id' }) // => '小红,小明'
							 | 
						|||
| 
								 | 
							
								 * arr.getLabelByCodes('1,3', { label: 'name', key: 'id', separator: '/' }) // => '小红/小明'
							 | 
						|||
| 
								 | 
							
								 * @returns {string}
							 | 
						|||
| 
								 | 
							
								 */
							 | 
						|||
| 
								 | 
							
								ArrayPrototype.getLabelByCodes = function (code, option = {}) {
							 | 
						|||
| 
								 | 
							
								  if (!checkTypes.isArray(this)) return ''
							 | 
						|||
| 
								 | 
							
								  const curCode = checkTypes.isNumber(code) && code === 0 ? '0' : code || ''
							 | 
						|||
| 
								 | 
							
								  let filterCode = []
							 | 
						|||
| 
								 | 
							
								  if (checkTypes.isArray(code)) {
							 | 
						|||
| 
								 | 
							
								    filterCode = code.filter(item => !!item)
							 | 
						|||
| 
								 | 
							
								  } else {
							 | 
						|||
| 
								 | 
							
								    filterCode = `${curCode}`.split(',').filter(item => !!item)
							 | 
						|||
| 
								 | 
							
								  }
							 | 
						|||
| 
								 | 
							
								  return filterCode.map(itemCode => {
							 | 
						|||
| 
								 | 
							
								    return this.getItemByCode(itemCode, option.key || 'value')[option.label || 'label'] || ''
							 | 
						|||
| 
								 | 
							
								  }).filter(item => item !== '').join(option.separator || ',') || option.emptyText || ''
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								ArrayPrototype.getIndexByCode = function (code, itemKey = 'value') {
							 | 
						|||
| 
								 | 
							
								  return this.findIndex(cur => cur[itemKey] === code)
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								ArrayPrototype.hasCode = function (code, key = 'value') {
							 | 
						|||
| 
								 | 
							
								  const filter = this.findIndex(item => item[key] === code)
							 | 
						|||
| 
								 | 
							
								  return filter >= 0
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								/**
							 | 
						|||
| 
								 | 
							
								 * 数据处理工具,保留小数点后几位,并添加单位
							 | 
						|||
| 
								 | 
							
								 * @function superFixed
							 | 
						|||
| 
								 | 
							
								 * @private
							 | 
						|||
| 
								 | 
							
								 * @param { number} len  保留位数
							 | 
						|||
| 
								 | 
							
								 * @param { string } unit  单位
							 | 
						|||
| 
								 | 
							
								 * @example
							 | 
						|||
| 
								 | 
							
								 * const test = 1
							 | 
						|||
| 
								 | 
							
								 * test.superFixed(2) // => 1.00
							 | 
						|||
| 
								 | 
							
								 * test.superFixed(2, '个') // => '1.00个'
							 | 
						|||
| 
								 | 
							
								 * @returns {string|number}
							 | 
						|||
| 
								 | 
							
								 */
							 | 
						|||
| 
								 | 
							
								NumberPrototype.superFixed = function (len = 0, unit = '') {
							 | 
						|||
| 
								 | 
							
								  return (this || 0).toFixed(len) + unit
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								/**
							 | 
						|||
| 
								 | 
							
								 * 数据处理工具,保留小数点后几位,并添加单位
							 | 
						|||
| 
								 | 
							
								 * @function superFixed
							 | 
						|||
| 
								 | 
							
								 * @param { number} len  保留位数
							 | 
						|||
| 
								 | 
							
								 * @param { string } unit  单位
							 | 
						|||
| 
								 | 
							
								 * @example
							 | 
						|||
| 
								 | 
							
								 * const test1 = '1'
							 | 
						|||
| 
								 | 
							
								 * test1.superFixed(2) // => 1.00
							 | 
						|||
| 
								 | 
							
								 * test1.superFixed(2) // => 1.00
							 | 
						|||
| 
								 | 
							
								 * const test2 = 1
							 | 
						|||
| 
								 | 
							
								 * test2.superFixed(2) // => 1.00
							 | 
						|||
| 
								 | 
							
								 * test2.superFixed(2, '个') // => '1.00个'
							 | 
						|||
| 
								 | 
							
								 * @returns {string|number}
							 | 
						|||
| 
								 | 
							
								 */
							 | 
						|||
| 
								 | 
							
								StringPrototype.superFixed = function (len = 0, unit = '') {
							 | 
						|||
| 
								 | 
							
								  // 如果是数字型字符串 返回保留后的
							 | 
						|||
| 
								 | 
							
								  if (/^[-\+]?[\d]*\.?[\d]*$/.test(this)) return Number(this).superFixed(len, unit)
							 | 
						|||
| 
								 | 
							
								  // 如果是其他字符串,返回本身
							 | 
						|||
| 
								 | 
							
								  return this
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								function base64ToBlob(base64) {
							 | 
						|||
| 
								 | 
							
								  const parts = base64.split(';base64,');
							 | 
						|||
| 
								 | 
							
								  const contentType = parts[0].split(':')[1];
							 | 
						|||
| 
								 | 
							
								  const raw = window.atob(parts[1]);
							 | 
						|||
| 
								 | 
							
								  const rawLength = raw.length;
							 | 
						|||
| 
								 | 
							
								  const uInt8Array = new Uint8Array(rawLength);
							 | 
						|||
| 
								 | 
							
								  for (let i = 0; i < rawLength; ++i) {
							 | 
						|||
| 
								 | 
							
								    uInt8Array[i] = raw.charCodeAt(i);
							 | 
						|||
| 
								 | 
							
								  }
							 | 
						|||
| 
								 | 
							
								  return new Blob([uInt8Array], {type: contentType});
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								StringPrototype.toFile = function () {
							 | 
						|||
| 
								 | 
							
								// 使用Base64字符串创建一个File对象
							 | 
						|||
| 
								 | 
							
								  return new File([base64ToBlob(this)], `file_${new Date().valueOf()}`, {
							 | 
						|||
| 
								 | 
							
								    type: 'image/png',
							 | 
						|||
| 
								 | 
							
								  })
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								/**
							 | 
						|||
| 
								 | 
							
								 * 文件转base64
							 | 
						|||
| 
								 | 
							
								 * @param {boolean} splitHeader 是否需要切掉base64头
							 | 
						|||
| 
								 | 
							
								 * @example
							 | 
						|||
| 
								 | 
							
								 * file.toBase64() // => 'image/jpeg;base64,VFZSSmVrMVVTWG8lM0Q='
							 | 
						|||
| 
								 | 
							
								 * file.toBase64(true) // => 'VFZSSmVrMVVTWG8lM0Q='
							 | 
						|||
| 
								 | 
							
								 * @returns {string}
							 | 
						|||
| 
								 | 
							
								 */
							 | 
						|||
| 
								 | 
							
								FilePrototype.toBase64 = function (splitHeader = false) {
							 | 
						|||
| 
								 | 
							
								  return new Promise((resolve, reject) => {
							 | 
						|||
| 
								 | 
							
								    const fileReader = new FileReader()
							 | 
						|||
| 
								 | 
							
								    fileReader.readAsDataURL(this)
							 | 
						|||
| 
								 | 
							
								    fileReader.onload = (e) => {
							 | 
						|||
| 
								 | 
							
								      let base64Str = e.target.result
							 | 
						|||
| 
								 | 
							
								      if (splitHeader) {
							 | 
						|||
| 
								 | 
							
								        base64Str = base64Str.substr(base64Str.indexOf(',') + 1)
							 | 
						|||
| 
								 | 
							
								      }
							 | 
						|||
| 
								 | 
							
								      resolve(base64Str)
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								  })
							 | 
						|||
| 
								 | 
							
								}
							 |