diff --git a/src/main.js b/src/main.js index a23bcd8..7ae3dd0 100644 --- a/src/main.js +++ b/src/main.js @@ -4,7 +4,9 @@ import "babel-polyfill"; import "es6-promise/auto"; import ElementUI from "element-ui"; import "element-ui/lib/theme-chalk/index.css"; -import { Message } from "element-ui"; +import { + Message +} from "element-ui"; Vue.use(ElementUI); import App from "./App.vue"; import store from "./store"; @@ -22,18 +24,26 @@ import "./utils/dialog"; import "./plugins"; // import "./utils/directive/focus"; import echarts from "echarts"; -import { getCookie } from "./utils/utils.js"; +import { + getCookie +} from "./utils/utils.js"; import apiConfig from "../config/api.config.js"; import vueEsign from "vue-esign"; import animated from "animate.css"; // npm install animate.css --save安装,在引入 import formatTime from "./utils/filters.js"; import arrDiff from "./utils/array.js"; -import { Loading } from "element-ui"; +import { + Loading +} from "element-ui"; import countdown from "./utils/countdown.js"; import "./utils/rem.js"; Vue.use(animated); Vue.use(vueEsign); +import { + thousands +} from '@/utils/index.js' + import Vue from "vue"; import Router from "vue-router"; import router from "./router"; @@ -44,10 +54,13 @@ Vue.use(VueAxios, axios); axios.defaults.baseURL = apiConfig.baseUrl; Vue.use(Print); //注册 -import { message } from "./utils/resetMessage.js"; //现在提示弹窗每次只弹一条 +import { + message +} from "./utils/resetMessage.js"; //现在提示弹窗每次只弹一条 // import VueParticles from 'vue-particles' // Vue.use(VueParticles) +Vue.prototype.$thousands = thousands Vue.prototype.$message = message; Vue.prototype.$countdown = countdown; Vue.prototype.bus = new Vue(); @@ -66,7 +79,7 @@ export function getNextDate(date, day) { } axios.defaults.withCredentials = true; //让ajax携带cookie // 全局过滤器--时间戳格式化时间//.padStart(2 , "0") 不足两位的,用0填充 -Vue.filter("dateFormat", function(originVal) { +Vue.filter("dateFormat", function (originVal) { const dt = new Date(originVal); const y = dt.getFullYear(); const m = (dt.getMonth() + 1 + "").padStart(2, "0"); @@ -76,7 +89,7 @@ Vue.filter("dateFormat", function(originVal) { const ss = (dt.getSeconds() + "").padStart(2, "0"); return `${y}-${m}-${d} ${hh}:${mm}:${ss}`; }); -Vue.filter("dateMonth", function(originVal) { +Vue.filter("dateMonth", function (originVal) { const dt = new Date(originVal); const y = dt.getFullYear(); const m = (dt.getMonth() + 1 + "").padStart(2, "0"); @@ -86,10 +99,10 @@ Vue.filter("dateMonth", function(originVal) { const ss = (dt.getSeconds() + "").padStart(2, "0"); return `${y}-${m}-${d}`; }); -Vue.filter("phone", function(phone) { +Vue.filter("phone", function (phone) { return phone.substring(0, 3) + "****" + phone.substring(phone.length - 4); }); -Vue.filter("identityNum", function(identityNum) { +Vue.filter("identityNum", function (identityNum) { return ( identityNum.substring(0, 4) + "**************" + @@ -97,11 +110,11 @@ Vue.filter("identityNum", function(identityNum) { ); }); -Vue.filter("money", function(money) { +Vue.filter("money", function (money) { return (money * 1).toFixed(2); }); -Vue.prototype.openLoading = function() { +Vue.prototype.openLoading = function () { const loading = this.$loading({ // 声明一个loading对象 lock: true, // 是否锁屏 @@ -112,7 +125,7 @@ Vue.prototype.openLoading = function() { body: true, customClass: "mask" // 遮罩层新增类名 }); - setTimeout(function() { + setTimeout(function () { // 设定定时器,超时5S后自动关闭遮罩层,避免请求失败时,遮罩层一直存在的问题 loading.close(); // 关闭遮罩层 }, 5000); @@ -151,7 +164,9 @@ router.beforeEach((to, from, next) => { message: "请先登录", duration: 2000 }); - next({ path: "/login" }); + next({ + path: "/login" + }); } }); Vue.directive("role", { @@ -178,7 +193,9 @@ new Vue({ el: "#app", router, store, - components: { App }, + components: { + App + }, template: "" }); diff --git a/src/pages/discount-coupon/issue/components/edit.vue b/src/pages/discount-coupon/issue/components/edit.vue index 568e47d..bebf3fc 100644 --- a/src/pages/discount-coupon/issue/components/edit.vue +++ b/src/pages/discount-coupon/issue/components/edit.vue @@ -56,7 +56,7 @@ - + @@ -120,37 +120,17 @@ export default { shareCommissionRules: [ { required: true, message: '请选择分享提成规则', trigger: ['blur', 'change'] }, ], - couponNum: [{ required: true, message: '优惠券数量', trigger: 'blur' }], - shareAmount: [ - { required: true, message: '请输入分润', trigger: 'blur' }, - { - pattern: /^\d*(?:\.\d{0,2})?$/, - //pattern: /^1[3456789]\d{9}$/, - message: '最多能输入两位小数', - trigger: 'blur', - }, - ], - phone: [ - { required: true, message: '请输入联系方式', trigger: 'blur' }, - { min: 11, max: 11, message: '请输入11位手机号码', trigger: 'blur' }, - { - pattern: /^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$/, - //pattern: /^1[3456789]\d{9}$/, - message: '请输入正确的手机号码', - trigger: 'blur', - }, - ], - imgUrl: [{ required: true, message: '请上传活动图片', trigger: 'change' }], - region: [{ required: true, message: '请选择活动区域', trigger: 'change' }], + // imageUrl: [{ required: true, message: '请上传活动图片', trigger: ['blur', 'change'] }], }, } }, methods: { + // ============================== 操作 ============================== // // 下一步 handleNext() { this.$refs.form.validate((valid) => { if (valid) { - this.$emit('next', 2) + this.$emit('next', 2, this.form) } else { return false } @@ -164,6 +144,7 @@ export default { this.$refs.form.resetFields() this.$baseMessage('重置成功', 'success') }, + // ============================== 第三方插件方法 ============================== // // 选择图片后返回 handleImage(file) { let form = Object.assign({}, this.form); @@ -190,4 +171,7 @@ export default { justify-content: center; padding: 50px 0; } +.form .el-form-item { + margin-bottom: 15px; +} diff --git a/src/pages/discount-coupon/issue/components/template.vue b/src/pages/discount-coupon/issue/components/template.vue index 60ea7f1..e7702cc 100644 --- a/src/pages/discount-coupon/issue/components/template.vue +++ b/src/pages/discount-coupon/issue/components/template.vue @@ -34,9 +34,15 @@ export default { data() { return { choose: 0, + form: {} } }, methods: { + // 切换步骤时传过来的数据 + handleData(form) { + this.form = Object.assign({}, form); + console.log('form', form); + }, handleChoose(num) { this.choose = num }, diff --git a/src/pages/discount-coupon/issue/index.vue b/src/pages/discount-coupon/issue/index.vue index 83a2b05..ef91b71 100644 --- a/src/pages/discount-coupon/issue/index.vue +++ b/src/pages/discount-coupon/issue/index.vue @@ -94,8 +94,10 @@ export default { this.form = Object.assign({}, form) }, // 下一步 - handleNext(active) { + handleNext(active, form) { this.active = active + let activeName = active == 1 ? 'edit' : active == 2 ? 'templates' : 'complete' + this.$refs[activeName].handleData(fiorm) }, }, } diff --git a/src/utils/index.js b/src/utils/index.js index a97f222..8232439 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -1,526 +1,550 @@ -/** - * @description 格式化时间 - * @param time - * @param cFormat - * @returns {string|null} - */ -export function parseTime(time, pattern) { - if (arguments.length === 0 || !time) { - return null; - } - const format = pattern || "{y}-{m}-{d} {h}:{i}:{s}"; - let date; - if (typeof time === "object") { - date = time; - } else { - if (typeof time === "string" && /^[0-9]+$/.test(time)) { - time = parseInt(time); - } else if (typeof time === "string") { - time = time.replace(new RegExp(/-/gm), "/"); - } - if (typeof time === "number" && time.toString().length === 10) { - time = 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]; - // Note: getDay() returns 0 on Sunday - if (key === "a") { - return ["日", "一", "二", "三", "四", "五", "六"][value]; - } - if (result.length > 0 && value < 10) { - value = "0" + value; - } - return value || 0; - }); - return time_str; -} - -/** - * 表单刷新重置 - * @param {String} refName - */ -export function resetForm(refName) { - if (this.$refs[refName]) { - this.$refs[refName].resetFields(); - } -} - -/** - * 添加日期范围 - * @param {Object} params - * @param {Array} dateRange - */ -export function addDateRange(params, dateRange) { - var search = params; - search.beginTime = ""; - search.endTime = ""; - if (null != dateRange && "" != dateRange) { - search.beginTime = this.dateRange[0]; - search.endTime = this.dateRange[1]; - } - return search; -} - -/** - * @description 格式化时间 - * @param time - * @param option - * @returns {string} - */ -export function formatTime(time, option) { - if (("" + time).length === 10) { - time = parseInt(time) * 1000; - } else { - time = +time; - } - 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() + - "分" - ); - } -} - -/** - * @description 将url请求参数转为json格式 - * @param url - * @returns {{}|any} - */ -export function paramObj(url) { - const search = url.split("?")[1]; - if (!search) { - return {}; - } - return JSON.parse( - '{"' + - decodeURIComponent(search) - .replace(/"/g, '\\"') - .replace(/&/g, '","') - .replace(/=/g, '":"') - .replace(/\+/g, " ") + - '"}' - ); -} - -/** - * @description 父子关系的数组转换成树形结构数据 - * @param data - * @returns {*} - */ -export function translateDataToTree(data) { - const parent = data.filter( - value => value.parentId === "undefined" || value.parentId == null - ); - const children = data.filter( - value => value.parentId !== "undefined" && value.parentId != null - ); - const translator = (parent, children) => { - parent.forEach(parent => { - children.forEach((current, index) => { - if (current.parentId === parent.id) { - const temp = JSON.parse(JSON.stringify(children)); - temp.splice(index, 1); - translator([current], temp); - typeof parent.children !== "undefined" - ? parent.children.push(current) - : (parent.children = [current]); - } - }); - }); - }; - translator(parent, children); - return parent; -} - -/** - * @description 树形结构数据转换成父子关系的数组 - * @param data - * @returns {[]} - */ -export function translateTreeToData(data) { - const result = []; - data.forEach(item => { - const loop = data => { - result.push({ - id: data.id, - name: data.name, - parentId: data.parentId - }); - const child = data.children; - if (child) { - for (let i = 0; i < child.length; i++) { - loop(child[i]); - } - } - }; - loop(item); - }); - return result; -} - -/** - * @description 10位时间戳转换 - * @param time - * @returns {string} - */ -export function tenBitTimestamp(time) { - const date = new Date(time * 1000); - const y = date.getFullYear(); - let m = date.getMonth() + 1; - m = m < 10 ? "" + m : m; - let d = date.getDate(); - d = d < 10 ? "" + d : d; - let h = date.getHours(); - h = h < 10 ? "0" + h : h; - let minute = date.getMinutes(); - let second = date.getSeconds(); - minute = minute < 10 ? "0" + minute : minute; - second = second < 10 ? "0" + second : second; - return y + "年" + m + "月" + d + "日 " + h + ":" + minute + ":" + second; //组合 -} - -/** - * @description 13位时间戳转换 - * @param time - * @returns {string} - */ -export function thirteenBitTimestamp(time) { - const date = new Date(time / 1); - const y = date.getFullYear(); - let m = date.getMonth() + 1; - m = m < 10 ? "" + m : m; - let d = date.getDate(); - d = d < 10 ? "" + d : d; - let h = date.getHours(); - h = h < 10 ? "0" + h : h; - let minute = date.getMinutes(); - let second = date.getSeconds(); - minute = minute < 10 ? "0" + minute : minute; - second = second < 10 ? "0" + second : second; - return y + "年" + m + "月" + d + "日 " + h + ":" + minute + ":" + second; //组合 -} - -/** - * @description 获取随机id - * @param length - * @returns {string} - */ -export function uuid(length = 32) { - const num = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; - let str = ""; - for (let i = 0; i < length; i++) { - str += num.charAt(Math.floor(Math.random() * num.length)); - } - return str; -} - -/** - * @description m到n的随机数 - * @param m - * @param n - * @returns {number} - */ -export function random(m, n) { - return Math.floor(Math.random() * (m - n) + n); -} - -/** - * @description addEventListener - * @type {function(...[*]=)} - */ -export const on = (function() { - return function(element, event, handler, useCapture = false) { - if (element && event && handler) { - element.addEventListener(event, handler, useCapture); - } - }; -})(); - -/** - * @description removeEventListener - * @type {function(...[*]=)} - */ -export const off = (function() { - return function(element, event, handler, useCapture = false) { - if (element && event) { - element.removeEventListener(event, handler, useCapture); - } - }; -})(); - -/** - * 构造树型结构数据 - * @param {*} data 数据源 - * @param {*} id id字段 默认 'id' - * @param {*} parentId 父节点字段 默认 'parentId' - * @param {*} children 孩子节点字段 默认 'children' - * @param {*} rootId 根Id 默认 0 - */ -export function handleTree(data, id, parentId, children, rootId) { - console.log(data); - id = id || "id"; - parentId = parentId || "parentId"; - children = children || "children"; - rootId = rootId || 0; - //对源数据深度克隆 - const cloneData = JSON.parse(JSON.stringify(data)); - //循环所有项 - const treeData = cloneData.filter(father => { - let branchArr = cloneData.filter(child => { - //返回每一项的子级数组 - return father[id] === child[parentId]; - }); - branchArr.length > 0 ? (father.children = branchArr) : ""; - //返回第一层 - return father[parentId] === rootId; - }); - // console.log('treeData', treeData) - return treeData != "" ? treeData : data; -} - -// blob方式下载文件 -export function download(res, filename) { - let blob = new Blob([res]); - // console.log('blob', blob) - var a = document.createElement("a"); - var url = window.URL.createObjectURL(blob); - a.href = url; - a.download = decodeURIComponent(filename); - a.click(); - window.URL.revokeObjectURL(url); -} - -// -------------------------- 正整数的正则表达式 ------------------------- // -export function expression(value) { - var pattern = /^[1-9][0-9]*$/; // 正整数的正则表达式 - // 不符合正整数时 - if (!pattern.test(value)) { - // input 框绑定的内容为空 - value = parseFloat(value); - } - return value; -} - -// -------------------------- 获取指定日期上一天、下一天 ------------------------- // -export function getNextDate(date, day) { - var dd = new Date(date); - dd.setDate(dd.getDate() + day); - var y = dd.getFullYear(); - var m = - dd.getMonth() + 1 < 10 ? "0" + (dd.getMonth() + 1) : dd.getMonth() + 1; - var d = dd.getDate() < 10 ? "0" + dd.getDate() : dd.getDate(); - return y + "-" + m + "-" + d; -} - -// -------------------------- 基于只能输入数字与小数点情况下获取两位小数 ------------------------- // -export function parseNumber(values) { - if (values.split(".")[1]) { - return values.split(".")[1].length > 2 - ? parseFloat( - values.split(".")[0] + - "." + - values - .split(".")[1] - .toString() - .slice(0, 2) - ) - : parseFloat(values.split(".")[0] + "." + values.split(".")[1]); - } else { - return values; - } -} - -/** - * 构造下拉选择型结构数据 - * @param {*} data 数据源 - * @param {*} label 展示字段 - * @param {*} value 实际值字段 - */ -export function handleSelectOption(data, labelField, valueField) { - const cloneData = JSON.parse(JSON.stringify(data)); - let result = []; - data.forEach(item => { - result.push({ label: item[labelField], value: item[valueField] }); - }); - return result; -} - -/** - * 构造下拉选择型结构数据 - * @param {*} data 数据源 - * @param {*} label 展示字段 - * @param {*} value 实际值字段 - */ -export function copyObject(data) { - return JSON.parse(JSON.stringify(data)); -} - -/** - * 获取单据状态 - * @param {*} key 状态值 - */ -export function getDocStatus(key) { - let status; - switch (key) { - case "1": - status = "已提交"; - break; - case "2": - status = "已撤回"; - break; - case "3": - status = "审核中"; - break; - case "4": - status = "审核通过"; - break; - case "5": - status = "审核不通过"; - break; - case "6": - status = "已关闭"; - break; - default: - // '0' - status = "已保存"; - break; - } - return status; -} -/** - * 判断是否为空或空串 - * @param {object} data - */ -function isEmpty(data) { - return data == "" || data == null || data == undefined; -} - -/** - * @description 计算两个时间并格式化 - * @param startTime - * @param endTime - * @returns {string} - */ -export function compoteFormatTime(startTime, endTime) { - if (isEmpty(startTime) || isEmpty(endTime)) { - return ""; - } - let st = new Date(startTime); - let et = new Date(endTime); - let time = et.getTime() - st.getTime(); - return compoteFormatTimestamp(time); - // 返回 几天 几时 几分 几秒 -} - -/** - * @description 将时间戳格式化 - * @param timestamp - * @returns {string} - */ -export function compoteFormatTimestamp(timestamp) { - let result = ""; - // 时间差(秒) - let time = timestamp / 1000; - const ds = 86400; - const hs = 3600; - const ms = 60; - // 向下取整数 - let day = parseInt(time / ds); - let hours = parseInt((time - day * ds) / hs); - let minute = parseInt((time - day * ds - hours * hs) / ms); - let second = time - day * ds - hours * hs - minute * ms; - if (day != 0) { - result += day + "天"; - } - if (day != 0 || hours != 0) { - result += hours + "时"; - } - if (hours != 0 || minute != 0) { - result += minute + "分"; - } - result += second + "秒"; - return result; - // 返回 几天 几时 几分 几秒 -} - -/** - * 表格合计项 - * @param {object} param - */ -export function getTableSummation(param) { - const { columns, data } = param; - const sums = []; - const fields = ["price", "number", "amount"]; - columns.forEach((column, index) => { - if (index === 0) { - sums[index] = "合计"; - return; - } - if (fields.includes(column.property)) { - const values = data.map(item => Number(item[column.property])); - if (!values.every(value => isNaN(value))) { - sums[index] = values.reduce((prev, curr) => { - let prevV = new this.$Decimal(prev); - let currV = new this.$Decimal(curr); - const value = Number(curr); - if (!isNaN(value)) { - return prevV.add(currV).toNumber(); - } else { - return new this.$Decimal(prev).toNumber(); - } - }, 0); - } else { - sums[index] = ""; - } - } else { - sums[index] = ""; - } - }); - return sums; -} - -export function stateFormat(row, column, cellValue) { - if (cellValue) { - return Number(cellValue) - .toFixed(2) - .replace(/(\d)(?=(\d{3})+\.)/g, ($0, $1) => { - return $1 + ","; - }) - .replace(/\.$/, ""); - } -} +/** + * @description 格式化时间 + * @param time + * @param cFormat + * @returns {string|null} + */ +export function parseTime(time, pattern) { + if (arguments.length === 0 || !time) { + return null; + } + const format = pattern || "{y}-{m}-{d} {h}:{i}:{s}"; + let date; + if (typeof time === "object") { + date = time; + } else { + if (typeof time === "string" && /^[0-9]+$/.test(time)) { + time = parseInt(time); + } else if (typeof time === "string") { + time = time.replace(new RegExp(/-/gm), "/"); + } + if (typeof time === "number" && time.toString().length === 10) { + time = 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]; + // Note: getDay() returns 0 on Sunday + if (key === "a") { + return ["日", "一", "二", "三", "四", "五", "六"][value]; + } + if (result.length > 0 && value < 10) { + value = "0" + value; + } + return value || 0; + }); + return time_str; +} + +/** + * 表单刷新重置 + * @param {String} refName + */ +export function resetForm(refName) { + if (this.$refs[refName]) { + this.$refs[refName].resetFields(); + } +} + +/** + * 添加日期范围 + * @param {Object} params + * @param {Array} dateRange + */ +export function addDateRange(params, dateRange) { + var search = params; + search.beginTime = ""; + search.endTime = ""; + if (null != dateRange && "" != dateRange) { + search.beginTime = this.dateRange[0]; + search.endTime = this.dateRange[1]; + } + return search; +} + +/** + * @description 格式化时间 + * @param time + * @param option + * @returns {string} + */ +export function formatTime(time, option) { + if (("" + time).length === 10) { + time = parseInt(time) * 1000; + } else { + time = +time; + } + 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() + + "分" + ); + } +} + +/** + * @description 将url请求参数转为json格式 + * @param url + * @returns {{}|any} + */ +export function paramObj(url) { + const search = url.split("?")[1]; + if (!search) { + return {}; + } + return JSON.parse( + '{"' + + decodeURIComponent(search) + .replace(/"/g, '\\"') + .replace(/&/g, '","') + .replace(/=/g, '":"') + .replace(/\+/g, " ") + + '"}' + ); +} + +/** + * @description 父子关系的数组转换成树形结构数据 + * @param data + * @returns {*} + */ +export function translateDataToTree(data) { + const parent = data.filter( + value => value.parentId === "undefined" || value.parentId == null + ); + const children = data.filter( + value => value.parentId !== "undefined" && value.parentId != null + ); + const translator = (parent, children) => { + parent.forEach(parent => { + children.forEach((current, index) => { + if (current.parentId === parent.id) { + const temp = JSON.parse(JSON.stringify(children)); + temp.splice(index, 1); + translator([current], temp); + typeof parent.children !== "undefined" ? + parent.children.push(current) : + (parent.children = [current]); + } + }); + }); + }; + translator(parent, children); + return parent; +} + +/** + * @description 树形结构数据转换成父子关系的数组 + * @param data + * @returns {[]} + */ +export function translateTreeToData(data) { + const result = []; + data.forEach(item => { + const loop = data => { + result.push({ + id: data.id, + name: data.name, + parentId: data.parentId + }); + const child = data.children; + if (child) { + for (let i = 0; i < child.length; i++) { + loop(child[i]); + } + } + }; + loop(item); + }); + return result; +} + +/** + * @description 10位时间戳转换 + * @param time + * @returns {string} + */ +export function tenBitTimestamp(time) { + const date = new Date(time * 1000); + const y = date.getFullYear(); + let m = date.getMonth() + 1; + m = m < 10 ? "" + m : m; + let d = date.getDate(); + d = d < 10 ? "" + d : d; + let h = date.getHours(); + h = h < 10 ? "0" + h : h; + let minute = date.getMinutes(); + let second = date.getSeconds(); + minute = minute < 10 ? "0" + minute : minute; + second = second < 10 ? "0" + second : second; + return y + "年" + m + "月" + d + "日 " + h + ":" + minute + ":" + second; //组合 +} + +/** + * @description 13位时间戳转换 + * @param time + * @returns {string} + */ +export function thirteenBitTimestamp(time) { + const date = new Date(time / 1); + const y = date.getFullYear(); + let m = date.getMonth() + 1; + m = m < 10 ? "" + m : m; + let d = date.getDate(); + d = d < 10 ? "" + d : d; + let h = date.getHours(); + h = h < 10 ? "0" + h : h; + let minute = date.getMinutes(); + let second = date.getSeconds(); + minute = minute < 10 ? "0" + minute : minute; + second = second < 10 ? "0" + second : second; + return y + "年" + m + "月" + d + "日 " + h + ":" + minute + ":" + second; //组合 +} + +/** + * @description 获取随机id + * @param length + * @returns {string} + */ +export function uuid(length = 32) { + const num = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; + let str = ""; + for (let i = 0; i < length; i++) { + str += num.charAt(Math.floor(Math.random() * num.length)); + } + return str; +} + +/** + * @description m到n的随机数 + * @param m + * @param n + * @returns {number} + */ +export function random(m, n) { + return Math.floor(Math.random() * (m - n) + n); +} + +/** + * @description addEventListener + * @type {function(...[*]=)} + */ +export const on = (function () { + return function (element, event, handler, useCapture = false) { + if (element && event && handler) { + element.addEventListener(event, handler, useCapture); + } + }; +})(); + +/** + * @description removeEventListener + * @type {function(...[*]=)} + */ +export const off = (function () { + return function (element, event, handler, useCapture = false) { + if (element && event) { + element.removeEventListener(event, handler, useCapture); + } + }; +})(); + +/** + * 构造树型结构数据 + * @param {*} data 数据源 + * @param {*} id id字段 默认 'id' + * @param {*} parentId 父节点字段 默认 'parentId' + * @param {*} children 孩子节点字段 默认 'children' + * @param {*} rootId 根Id 默认 0 + */ +export function handleTree(data, id, parentId, children, rootId) { + console.log(data); + id = id || "id"; + parentId = parentId || "parentId"; + children = children || "children"; + rootId = rootId || 0; + //对源数据深度克隆 + const cloneData = JSON.parse(JSON.stringify(data)); + //循环所有项 + const treeData = cloneData.filter(father => { + let branchArr = cloneData.filter(child => { + //返回每一项的子级数组 + return father[id] === child[parentId]; + }); + branchArr.length > 0 ? (father.children = branchArr) : ""; + //返回第一层 + return father[parentId] === rootId; + }); + // console.log('treeData', treeData) + return treeData != "" ? treeData : data; +} + +// blob方式下载文件 +export function download(res, filename) { + let blob = new Blob([res]); + // console.log('blob', blob) + var a = document.createElement("a"); + var url = window.URL.createObjectURL(blob); + a.href = url; + a.download = decodeURIComponent(filename); + a.click(); + window.URL.revokeObjectURL(url); +} + +// -------------------------- 正整数的正则表达式 ------------------------- // +export function expression(value) { + var pattern = /^[1-9][0-9]*$/; // 正整数的正则表达式 + // 不符合正整数时 + if (!pattern.test(value)) { + // input 框绑定的内容为空 + value = parseFloat(value); + } + return value; +} + +// -------------------------- 获取指定日期上一天、下一天 ------------------------- // +export function getNextDate(date, day) { + var dd = new Date(date); + dd.setDate(dd.getDate() + day); + var y = dd.getFullYear(); + var m = + dd.getMonth() + 1 < 10 ? "0" + (dd.getMonth() + 1) : dd.getMonth() + 1; + var d = dd.getDate() < 10 ? "0" + dd.getDate() : dd.getDate(); + return y + "-" + m + "-" + d; +} + +// -------------------------- 基于只能输入数字与小数点情况下获取两位小数 ------------------------- // +export function parseNumber(values) { + if (values.split(".")[1]) { + return values.split(".")[1].length > 2 ? + parseFloat( + values.split(".")[0] + + "." + + values + .split(".")[1] + .toString() + .slice(0, 2) + ) : + parseFloat(values.split(".")[0] + "." + values.split(".")[1]); + } else { + return values; + } +} + +/** + * 构造下拉选择型结构数据 + * @param {*} data 数据源 + * @param {*} label 展示字段 + * @param {*} value 实际值字段 + */ +export function handleSelectOption(data, labelField, valueField) { + const cloneData = JSON.parse(JSON.stringify(data)); + let result = []; + data.forEach(item => { + result.push({ + label: item[labelField], + value: item[valueField] + }); + }); + return result; +} + +/** + * 构造下拉选择型结构数据 + * @param {*} data 数据源 + * @param {*} label 展示字段 + * @param {*} value 实际值字段 + */ +export function copyObject(data) { + return JSON.parse(JSON.stringify(data)); +} + +/** + * 获取单据状态 + * @param {*} key 状态值 + */ +export function getDocStatus(key) { + let status; + switch (key) { + case "1": + status = "已提交"; + break; + case "2": + status = "已撤回"; + break; + case "3": + status = "审核中"; + break; + case "4": + status = "审核通过"; + break; + case "5": + status = "审核不通过"; + break; + case "6": + status = "已关闭"; + break; + default: + // '0' + status = "已保存"; + break; + } + return status; +} +/** + * 判断是否为空或空串 + * @param {object} data + */ +function isEmpty(data) { + return data == "" || data == null || data == undefined; +} + +/** + * @description 计算两个时间并格式化 + * @param startTime + * @param endTime + * @returns {string} + */ +export function compoteFormatTime(startTime, endTime) { + if (isEmpty(startTime) || isEmpty(endTime)) { + return ""; + } + let st = new Date(startTime); + let et = new Date(endTime); + let time = et.getTime() - st.getTime(); + return compoteFormatTimestamp(time); + // 返回 几天 几时 几分 几秒 +} + +/** + * @description 将时间戳格式化 + * @param timestamp + * @returns {string} + */ +export function compoteFormatTimestamp(timestamp) { + let result = ""; + // 时间差(秒) + let time = timestamp / 1000; + const ds = 86400; + const hs = 3600; + const ms = 60; + // 向下取整数 + let day = parseInt(time / ds); + let hours = parseInt((time - day * ds) / hs); + let minute = parseInt((time - day * ds - hours * hs) / ms); + let second = time - day * ds - hours * hs - minute * ms; + if (day != 0) { + result += day + "天"; + } + if (day != 0 || hours != 0) { + result += hours + "时"; + } + if (hours != 0 || minute != 0) { + result += minute + "分"; + } + result += second + "秒"; + return result; + // 返回 几天 几时 几分 几秒 +} + +/** + * 表格合计项 + * @param {object} param + */ +export function getTableSummation(param) { + const { + columns, + data + } = param; + const sums = []; + const fields = ["price", "number", "amount"]; + columns.forEach((column, index) => { + if (index === 0) { + sums[index] = "合计"; + return; + } + if (fields.includes(column.property)) { + const values = data.map(item => Number(item[column.property])); + if (!values.every(value => isNaN(value))) { + sums[index] = values.reduce((prev, curr) => { + let prevV = new this.$Decimal(prev); + let currV = new this.$Decimal(curr); + const value = Number(curr); + if (!isNaN(value)) { + return prevV.add(currV).toNumber(); + } else { + return new this.$Decimal(prev).toNumber(); + } + }, 0); + } else { + sums[index] = ""; + } + } else { + sums[index] = ""; + } + }); + return sums; +} + +export function stateFormat(row, column, cellValue) { + if (cellValue) { + return Number(cellValue) + .toFixed(2) + .replace(/(\d)(?=(\d{3})+\.)/g, ($0, $1) => { + return $1 + ","; + }) + .replace(/\.$/, ""); + } +} +/** + * @description (/\d{1,3}(?=(\d{3})+$)/g, '$&,') 只能正数使用 + */ +// -------------------------- 千分号 ------------------------- // +export function thousands(value) { + ; + /\d{1,3}(?=(\d{3})+$)/g, '$&,' + if (value) { + if (value.includes('.')) { + let array = value.split('.') + let data = array[0].replace(/\d{1,3}(?=(\d{3})+$)/g, '$&,') + return data + '.' + array[1] + } else { + let data = value.replace(/\d{1,3}(?=(\d{3})+$)/g, '$&,') + return data + } + } +}