import store from '../store' /* eslint-disable one-var */ /** * Created by jiachenpan on 16/11/18. */ /** * 表格时间格式化 */ export function formatDate(cellValue) { if (cellValue === null || cellValue === '') return '' var date = new Date(cellValue) var year = date.getFullYear() var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1 var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate() var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours() var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes() var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds() return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds } export function parseTime(time, cFormat) { if (arguments.length === 0) { return null } const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}' let date if (typeof time === 'object') { date = time } else { if (('' + time).length === 10) time = parseInt(time) * 1000 date = new Date(time) } const formatObj = { y: date.getFullYear(), m: date.getMonth() + 1, d: date.getDate(), h: date.getHours(), i: date.getMinutes(), s: date.getSeconds(), a: date.getDay() } const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { let value = formatObj[key] if (key === 'a') return ['一', '二', '三', '四', '五', '六', '日'][value - 1] if (result.length > 0 && value < 10) { value = '0' + value } return value || 0 }) return time_str } // 根据字典类型名称获取字典数据列表 export function getDicDataListByTypeName(typeName) { // 所有字典类型信息 const allDicTypeList = store.getters.dicTypeList // 所有字典数据信息 const allDicDataList = store.getters.dicDataList let data = [] allDicTypeList.filter(dicType => dicType.typeName === typeName).filter(dicType => { data = allDicDataList.filter(dicData => dicType.id === dicData.typeId) }) return data } /** * 根据年月获取当前月的最后一天 * @param date 例如:2020-01 * @returns {*} */ export function getLastDayByDate(date) { date = date.split('-') return date.join('-') + '-' + new Date(date[0], date[1], 0).getDate() } export function formatTime(time, option) { time = +time * 1000 const d = new Date(time) const now = Date.now() const diff = (now - d) / 1000 if (diff < 30) { return '刚刚' } else if (diff < 3600) { // less 1 hour return Math.ceil(diff / 60) + '分钟前' } else if (diff < 3600 * 24) { return Math.ceil(diff / 3600) + '小时前' } else if (diff < 3600 * 24 * 2) { return '1天前' } if (option) { return parseTime(time, option) } else { return d.getMonth() + 1 + '月' + d.getDate() + '日' + d.getHours() + '时' + d.getMinutes() + '分' } } // 格式化时间 export function getQueryObject(url) { url = url == null ? window.location.href : url const search = url.substring(url.lastIndexOf('?') + 1) const obj = {} const reg = /([^?&=]+)=([^?&=]*)/g search.replace(reg, (rs, $1, $2) => { const name = decodeURIComponent($1) let val = decodeURIComponent($2) val = String(val) obj[name] = val return rs }) return obj } /** *get getByteLen * @param {Sting} val input value * @returns {number} output value */ export function getByteLen(val) { let len = 0 for (let i = 0; i < val.length; i++) { if (val[i].match('/[^\x00-\xff]/ig') != null) { len += 1 } else { len += 0.5 } } return Math.floor(len) } export function cleanArray(actual) { const newArray = [] for (let i = 0; i < actual.length; i++) { if (actual[i]) { newArray.push(actual[i]) } } return newArray } export function param(json) { if (!json) return '' return cleanArray(Object.keys(json).map(key => { if (json[key] === undefined) return '' return encodeURIComponent(key) + '=' + encodeURIComponent(json[key]) })).join('&') } export function param2Obj(url) { const search = url.split('?')[1] if (!search) { return {} } return JSON.parse('{"' + decodeURIComponent(search).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g, '":"') + '"}') } export function html2Text(val) { const div = document.createElement('div') div.innerHTML = val return div.textContent || div.innerText } export function objectMerge(target, source) { /* Merges two objects, giving the last one precedence */ if (typeof target !== 'object') { target = {} } if (Array.isArray(source)) { return source.slice() } for (const property in source) { if (source.hasOwnProperty(property)) { const sourceProperty = source[property] if (typeof sourceProperty === 'object') { target[property] = objectMerge(target[property], sourceProperty) continue } target[property] = sourceProperty } } return target } export function scrollTo(element, to, duration) { if (duration <= 0) return const difference = to - element.scrollTop const perTick = difference / duration * 10 setTimeout(() => { element.scrollTop = element.scrollTop + perTick if (element.scrollTop === to) return scrollTo(element, to, duration - 10) }, 10) } export function toggleClass(element, className) { if (!element || !className) { return } let classString = element.className const nameIndex = classString.indexOf(className) if (nameIndex === -1) { classString += '' + className } else { classString = classString.substr(0, nameIndex) + classString.substr(nameIndex + className.length) } element.className = classString } export const pickerOptions = [{ text: '今天', onClick(picker) { const end = new Date() const start = new Date(new Date().toDateString()) end.setTime(start.getTime()) picker.$emit('pick', [start, end]) } }, { text: '最近一周', onClick(picker) { const end = new Date(new Date().toDateString()) const start = new Date() start.setTime(end.getTime() - 3600 * 1000 * 24 * 7) picker.$emit('pick', [start, end]) } }, { text: '最近一个月', onClick(picker) { const end = new Date(new Date().toDateString()) const start = new Date() start.setTime(start.getTime() - 3600 * 1000 * 24 * 30) picker.$emit('pick', [start, end]) } }, { text: '最近三个月', onClick(picker) { const end = new Date(new Date().toDateString()) const start = new Date() start.setTime(start.getTime() - 3600 * 1000 * 24 * 90) picker.$emit('pick', [start, end]) } }] export function getTime(type) { if (type === 'start') { return new Date().getTime() - 3600 * 1000 * 24 * 90 } else { return new Date(new Date().toDateString()) } } export function debounce(func, wait, immediate) { let timeout, args, context, timestamp, result const later = function() { // 据上一次触发时间间隔 const last = +new Date() - timestamp // 上次被包装函数被调用时间间隔last小于设定时间间隔wait if (last < wait && last > 0) { timeout = setTimeout(later, wait - last) } else { timeout = null // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用 if (!immediate) { result = func.apply(context, args) if (!timeout) context = args = null } } } return function(...args) { context = this timestamp = +new Date() const callNow = immediate && !timeout // 如果延时不存在,重新设定延时 if (!timeout) timeout = setTimeout(later, wait) if (callNow) { result = func.apply(context, args) context = args = null } return result } } export function deepClone(source) { if (!source && typeof source !== 'object') { throw new Error('error arguments', 'shallowClone') } const targetObj = source.constructor === Array ? [] : {} for (const keys in source) { if (source.hasOwnProperty(keys)) { if (source[keys] && typeof source[keys] === 'object') { targetObj[keys] = source[keys].constructor === Array ? [] : {} targetObj[keys] = deepClone(source[keys]) } else { targetObj[keys] = source[keys] } } } return targetObj } function getMoney(s, n) { n = n > 0 && n <= 20 ? n : 2 s = parseFloat((s + '').replace(/[^\d\.-]/g, '')).toFixed(n) + '' var l = s.split('.')[0].split('').reverse(), r = s.split('.')[1] let t = '' for (let i = 0; i < l.length; i++) { t += l[i] + ((i + 1) % 3 === 0 && (i + 1) !== l.length ? ',' : '') } return t.split('').reverse().join('') + '.' + r } export function money_format(val, n) { if (typeof val !== 'undefined') { const money = val / 10000 return getMoney(money, n) } } export function num_Fixed(val) { const n = 2 if (typeof val !== 'undefined') { const money = val / 10000 const num = Number(money) return num.toFixed(n) } } export function makeMap(str, expectsLowerCase) { const map = Object.create(null) const list = str.split(',') for (let i = 0; i < list.length; i++) { map[list[i]] = true } return expectsLowerCase ? val => map[val.toLowerCase()] : val => map[val] } export const exportDefault = 'export default ' export const beautifierConf = { html: { indent_size: '2', indent_char: ' ', max_preserve_newlines: '-1', preserve_newlines: false, keep_array_indentation: false, break_chained_methods: false, indent_scripts: 'separate', brace_style: 'end-expand', space_before_conditional: true, unescape_strings: false, jslint_happy: false, end_with_newline: true, wrap_line_length: '110', indent_inner_html: true, comma_first: false, e4x: true, indent_empty_lines: true }, js: { indent_size: '2', indent_char: ' ', max_preserve_newlines: '-1', preserve_newlines: false, keep_array_indentation: false, break_chained_methods: false, indent_scripts: 'normal', brace_style: 'end-expand', space_before_conditional: true, unescape_strings: false, jslint_happy: true, end_with_newline: true, wrap_line_length: '110', indent_inner_html: true, comma_first: false, e4x: true, indent_empty_lines: true } } export function isExternal(path) { return /^(https?:|mailto:|tel:)/.test(path) } // 首字母大小 export function titleCase(str) { return str.replace(/( |^)[a-z]/g, L => L.toUpperCase()) } export function isNumberStr(str) { return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str) } /** * 下载文件 * @param obj 数据流 * @param name 文件名称 * @param suffix 文件后缀 */ export function downloadFile(obj, name, suffix) { const url = window.URL.createObjectURL(new Blob([obj])) buildClick(url, name, suffix) window.URL.revokeObjectURL(url) } /** * 根据链接下载文件 * @param url * @param name * @param suffix */ export function downloadFileUrl(url, name, suffix) { buildClick(url, name, suffix) } function buildClick(url, name, suffix) { const link = document.createElement('a') link.style.display = 'none' link.setAttribute('href', url) const fileName = name + '.' + suffix link.setAttribute('download', fileName) document.body.appendChild(link) link.click() document.body.removeChild(link) }