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
+ }
+ }
+}