!242 代码合并

Merge pull request !242 from 杨耀威/yyw
This commit is contained in:
杨建炊 2024-11-04 06:47:52 +00:00 committed by Gitee
commit 8b3066b210
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
68 changed files with 170 additions and 84 deletions

View File

@ -1 +1 @@
#nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.searchBox[data-v-326a4ffe]{display:flex;align-items:center;flex-wrap:wrap;white-space:nowrap}.searchBox .row[data-v-326a4ffe]{font-size:14px;margin-bottom:20px;margin-right:15px;display:flex;align-items:center}.imgBox .img[data-v-326a4ffe]{width:55px;height:55px;border-radius:4px;margin:3px} #nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.searchBox[data-v-58bd27bb]{display:flex;align-items:center;flex-wrap:wrap;white-space:nowrap}.searchBox .row[data-v-58bd27bb]{font-size:14px;margin-bottom:20px;margin-right:15px;display:flex;align-items:center}.imgBox .img[data-v-58bd27bb]{width:55px;height:55px;border-radius:4px;margin:3px}

View File

@ -1 +1 @@
#nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.block[data-v-58627217]{margin-top:20px} #nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.block[data-v-660bbd5d]{margin-top:20px}

View File

@ -1 +1 @@
<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>erp</title><script defer="defer" src="js/chunk-vendors.04652b46.js"></script><script defer="defer" src="js/app.b70d2a52.js"></script><link href="css/chunk-vendors.77489a8d.css" rel="stylesheet"><link href="css/app.7e37f273.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but erp doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html> <!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>erp</title><script defer="defer" src="js/chunk-vendors.04652b46.js"></script><script defer="defer" src="js/app.3074cc07.js"></script><link href="css/chunk-vendors.77489a8d.css" rel="stylesheet"><link href="css/app.7e37f273.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but erp doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,2 +0,0 @@
"use strict";(self["webpackChunkerp"]=self["webpackChunkerp"]||[]).push([[192],{2175:function(t,e,r){r.r(e),r.d(e,{default:function(){return c}});var a=function(){var t=this,e=t._self._c;return e("div",[e("el-card",{staticClass:"box-card",attrs:{"body-style":{padding:"20px 20px 0 20px"}}},[e("el-form",{staticClass:"demo-form-inline",attrs:{inline:!0,model:t.formSearch}},[e("el-form-item",{attrs:{label:"团购状态"}},[e("el-select",{attrs:{placeholder:"团购状态"},model:{value:t.formSearch.status,callback:function(e){t.$set(t.formSearch,"status",e)},expression:"formSearch.status"}},[e("el-option",{attrs:{label:"未开始",value:"-5"}}),e("el-option",{attrs:{label:"跟团中",value:"1"}}),e("el-option",{attrs:{label:"预览中",value:"-10"}}),e("el-option",{attrs:{label:"已结束",value:"20"}})],1)],1),e("el-form-item",{attrs:{label:"活动标题"}},[e("el-input",{attrs:{placeholder:"活动标题"},model:{value:t.formSearch.title,callback:function(e){t.$set(t.formSearch,"title",e)},expression:"formSearch.title"}})],1),e("el-form-item",[e("el-button",{attrs:{type:"primary"},on:{click:function(e){return t.getGroupList()}}},[t._v("查询")]),e("el-button",{attrs:{type:"success"},on:{click:function(e){return t.groupAdd()}}},[t._v("新增团购")])],1)],1)],1),e("el-card",{staticClass:"box-card",staticStyle:{"margin-top":"10px"}},[e("el-table",{directives:[{name:"loading",rawName:"v-loading",value:t.loading,expression:"loading"}],staticStyle:{width:"100%"},attrs:{data:t.tableData,border:"","row-key":"id","tree-props":{children:"children"}}},[e("el-table-column",{attrs:{prop:"shop.name",label:"店铺"}}),e("el-table-column",{attrs:{prop:"title",label:"活动标题"}}),e("el-table-column",{attrs:{prop:"status",label:"团购状态"}}),e("el-table-column",{attrs:{label:"开团时间"},scopedSlots:t._u([{key:"default",fn:function(r){return[e("div",[t._v(t._s(r.row.start_time))]),e("div",[t._v("至")]),e("div",[t._v(t._s(r.row.end_time))])]}}])}),e("el-table-column",{attrs:{label:"手机查看"},scopedSlots:t._u([{key:"default",fn:function(t){return[e("el-image",{staticStyle:{width:"100px",height:"100px"},attrs:{src:t.row.qr_code_url}})]}}])}),e("el-table-column",{attrs:{prop:"create_status",label:"创建结果"}}),e("el-table-column",{attrs:{prop:"options",label:"操作"},scopedSlots:t._u([{key:"default",fn:function(r){return[0==r.row.parent_id?e("el-button",{attrs:{type:"text",size:"small"},on:{click:function(e){return t.groupEdit(r.row.id)}}},[t._v("编辑")]):t._e()]}}])})],1)],1)],1)},l=[],o=(r(560),r(5157)),n={data(){return{formSearch:{status:"",title:"",page:1,per_page:20},loading:!0,tableData:[]}},mounted(){this.getGroupList()},methods:{getGroupList(){(0,o.X8)(this.formSearch).then((t=>{this.tableData=t.data.data,this.loading=!1}))},groupAdd(){this.$router.push({path:"GROUP_GOODS_ADD",query:{id:0}})},groupEdit(t){this.$router.push({path:"GROUP_GOODS_EDIT",query:{id:t}})}}},u=n,i=r(1001),s=(0,i.Z)(u,a,l,!1,null,null,null),c=s.exports},5157:function(t,e,r){r.d(e,{Rp:function(){return o},Tv:function(){return u},X8:function(){return l},Y6:function(){return n},ni:function(){return s},sC:function(){return i}});var a=r(8430);function l(t){return(0,a.Z)({url:"/api/group",method:"get",params:t})}function o(t){return(0,a.Z)({url:"/api/group",method:"post",data:t})}function n(t){return(0,a.Z)({url:`/api/group/${t}`,method:"get"})}function u(t,e){return(0,a.Z)({url:`/api/group/${t}`,method:"patch",data:e})}function i(t){return(0,a.Z)({url:"/api/groupGoods",method:"get",params:t})}function s(t){return(0,a.Z)({url:"/api/groupGoods",method:"post",params:t})}}}]);
//# sourceMappingURL=192.612744da.js.map

File diff suppressed because one or more lines are too long

2
public/dist/js/192.71ec2e85.js vendored Normal file

File diff suppressed because one or more lines are too long

1
public/dist/js/192.71ec2e85.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
public/dist/js/200.fbda0d79.js vendored Normal file

File diff suppressed because one or more lines are too long

1
public/dist/js/200.fbda0d79.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
public/dist/js/223.a899489f.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
public/dist/js/283.b0b443fa.js.map vendored Normal file

File diff suppressed because one or more lines are too long

2
public/dist/js/301.1f602c86.js vendored Normal file

File diff suppressed because one or more lines are too long

1
public/dist/js/301.1f602c86.js.map vendored Normal file

File diff suppressed because one or more lines are too long

2
public/dist/js/330.72e3c62e.js vendored Normal file

File diff suppressed because one or more lines are too long

1
public/dist/js/330.72e3c62e.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
public/dist/js/401.f48626e9.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
public/dist/js/415.cbeaf578.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
public/dist/js/444.bdf6e547.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
public/dist/js/583.5bbe4636.js.map vendored Normal file

File diff suppressed because one or more lines are too long

2
public/dist/js/602.0701ae1e.js vendored Normal file

File diff suppressed because one or more lines are too long

1
public/dist/js/602.0701ae1e.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
public/dist/js/617.8e2f5bb2.js vendored Normal file

File diff suppressed because one or more lines are too long

1
public/dist/js/617.8e2f5bb2.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
public/dist/js/763.e09c890d.js vendored Normal file

File diff suppressed because one or more lines are too long

1
public/dist/js/763.e09c890d.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
public/dist/js/849.29aa17c8.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
public/dist/js/924.e619e841.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
public/dist/js/973.14434d3f.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
public/dist/js/app.3074cc07.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -78,3 +78,21 @@ export function getAfterSaleOrders(params) {
params params
}) })
} }
export function exportOrder(params) {
return http({
url: "/api/plat_orders",
method: "get",
params,
responseType: 'blob'
})
}
export function exportAfterOrder(params) {
return http({
url: "/api/plat_after_sale_orders",
method: "get",
params,
responseType: 'blob'
})
}

View File

@ -38,7 +38,7 @@
</div> </div>
<div class="row"> <div class="row">
<el-button type="primary" icon="el-icon-search" @click="handleSearch">筛选</el-button> <el-button type="primary" icon="el-icon-search" @click="handleSearch">筛选</el-button>
<el-button type="warning" @click="handleExport" icon="el-icon-download">数据导出</el-button> <el-button type="warning" :loading="exportLoading" @click="handleExport" icon="el-icon-download">数据导出</el-button>
</div> </div>
</div> </div>
</div> </div>
@ -62,7 +62,11 @@
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="apply_type" label="申请类型" /> <el-table-column prop="apply_type" label="申请类型">
<template slot-scope="scope">
<span>{{ APPLYTYPE[scope.row.apply_type] }}</span>
</template>
</el-table-column>
<el-table-column label="售后单状态"> <el-table-column label="售后单状态">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ STATUS[scope.row.after_sales_status] }}</span> <span>{{ STATUS[scope.row.after_sales_status] }}</span>
@ -87,7 +91,7 @@
</template> </template>
<script> <script>
import { getAfterSaleOrders } from "@/api/plat" import { getAfterSaleOrders, exportAfterOrder } from "@/api/plat"
import { storeList } from "@/api/shop" import { storeList } from "@/api/shop"
import dayjs from 'dayjs' import dayjs from 'dayjs'
@ -129,7 +133,12 @@ export default {
'7': '待(团长)确认退货', '7': '待(团长)确认退货',
'8': '(顾客)撤销', '8': '(顾客)撤销',
'9': '(系统)关闭' '9': '(系统)关闭'
} },
APPLYTYPE: {
0: '仅退款',
1: '退货退款'
},
exportLoading: false
} }
}, },
methods: { methods: {
@ -176,12 +185,42 @@ export default {
}) })
}, },
handleExport() { handleExport() {
this.exportLoading = true
let params = { let params = {
...this.filter, ...this.filter,
created_at_start: this.addTime ? this.addTime[0] : '', created_at_start: this.addTime ? this.addTime[0] : '',
created_at_end: this.addTime ? this.addTime[1] : '' created_at_end: this.addTime ? this.addTime[1] : '',
is_export: 1
}
// window.open("/api/plat_after_sale_orders?" + this.objectToQueryString(params))
exportAfterOrder(params).then((res) => {
console.log(res.data)
this.downLoadXls(res.data)
this.$message({ type: 'success', message: '导出成功!' })
this.exportLoading = false
}).catch(() => {
this.exportLoading = false
})
},
downLoadXls(response) {
const content = response
const blob = new Blob([content])
const today = new Date().toLocaleDateString()
const fileName = `售后单列表${today}.xlsx`
if ('download' in document.createElement('a')) {
// IE
const elink = document.createElement('a')
elink.download = fileName
elink.style.display = 'none'
elink.href = URL.createObjectURL(blob)
document.body.appendChild(elink)
elink.click()
URL.revokeObjectURL(elink.href) // URL
document.body.removeChild(elink)
} else {
// IE10+
navigator.msSaveBlob(blob, fileName)
} }
window.open("/api/plat_after_sale_orders?" + this.objectToQueryString(params))
}, },
objectToQueryString(obj) { objectToQueryString(obj) {
return Object.keys(obj) return Object.keys(obj)

View File

@ -84,15 +84,15 @@
<el-button plain @click="handleReChoose">重置筛选</el-button> <el-button plain @click="handleReChoose">重置筛选</el-button>
<el-button type="primary" @click="print">打印</el-button> <el-button type="primary" @click="print">打印</el-button>
<el-button v-if="form.goods_sku_num === 2" type="primary">配货单导出</el-button> <el-button v-if="form.goods_sku_num === 2" type="primary">配货单导出</el-button>
<el-button type="warning" @click="handleExport" icon="el-icon-download">数据导出</el-button> <el-button type="warning" :loading="exportLoading" @click="handleExport" icon="el-icon-download">数据导出</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<el-card style="margin-top: 10px"> <el-card style="margin-top: 10px">
<el-table v-loading="loading" ref="multipleTable" :data="tableData" style="width: 100%" <el-table v-loading="loading" ref="multipleTable" :data="tableData" style="width: 100%" border
@selection-change="handleSelectionChange"> @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55"> <el-table-column type="selection" width="55" align="center">
</el-table-column> </el-table-column>
<el-table-column label="店铺名称"> <el-table-column label="店铺名称">
<template slot-scope="scope"> <template slot-scope="scope">
@ -100,34 +100,33 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="跟团号"> <el-table-column label="跟团号" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.is_supplier ? '自卖团: ' : '帮卖团: ' }} {{ scope.row.is_supplier ? '自卖团: ' : '帮卖团: ' }}
{{ scope.row.is_supplier ? scope.row.participate_no : scope.row.supply_participate_no }} {{ scope.row.is_supplier ? scope.row.participate_no : scope.row.supply_participate_no }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="收件人信息" width="160"> <el-table-column label="收件人信息" width="240">
<template slot-scope="scope"> <template slot-scope="scope">
<p>{{ scope.row.receiver_name }}</p> <p>{{ scope.row.receiver_name }}&nbsp;&nbsp;{{ scope.row.receiver_mobile }}</p>
<p>{{ scope.row.receiver_address_province }} {{ scope.row.receiver_address_city }} {{ <p>{{ scope.row.receiver_address_province }}/{{ scope.row.receiver_address_city }}/{{
scope.row.receiver_address_district }}</p> scope.row.receiver_address_district }}</p>
<p>{{ scope.row.receiver_address_detail }}</p> <p>{{ scope.row.receiver_address_detail }}</p>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="shipping_status" label="发货状态"></el-table-column> <el-table-column prop="shipping_status" label="发货状态" align="center"></el-table-column>
<el-table-column prop="cancel_status" label="订单状态"></el-table-column> <el-table-column prop="cancel_status" label="订单状态" align="center"></el-table-column>
<el-table-column prop="after_sales_status" label="售后状态"></el-table-column> <el-table-column prop="after_sales_status" label="售后状态" align="center"></el-table-column>
<el-table-column label="商品信息" width="420"> <el-table-column label="商品信息" width="380">
<template slot-scope="scope"> <template slot-scope="scope">
<div v-for="item in scope.row.items" :key="item.id"> <div v-for="item in scope.row.items" :key="item.id">
{{ item.goods_name }} {{ item.goods_name }}
<br />
<span style="color: red;">+{{ item.goods_number }}</span> <span style="color: red;">+{{ item.goods_number }}</span>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="confirm_at" label="下单时间" width="100"></el-table-column> <el-table-column prop="confirm_at" label="下单时间" width="150" align="center"></el-table-column>
<!-- <el-table-column prop="print_status" label="打印次数"></el-table-column> --> <!-- <el-table-column prop="print_status" label="打印次数"></el-table-column> -->
</el-table> </el-table>
@ -143,9 +142,9 @@
</template> </template>
<script> <script>
import { platOrderList, printOrders, printSuccess } from "../../api/plat"; import { platOrderList, printOrders, printSuccess, exportOrder } from "@/api/plat";
import { storeList } from "../../api/shop"; import { storeList } from "@/api/shop"
import { goodsSkusList } from "../../api/goods"; import { goodsSkusList } from "@/api/goods"
export default { export default {
data() { data() {
return { return {
@ -203,6 +202,7 @@ export default {
defaultPrinter: null, defaultPrinter: null,
taskIDArray: [], taskIDArray: [],
requestIDGetGlobalConfig: '', requestIDGetGlobalConfig: '',
exportLoading: false
}; };
}, },
created() { created() {
@ -500,6 +500,7 @@ export default {
return uuid.join(''); return uuid.join('');
}, },
handleExport() { handleExport() {
this.exportLoading = true
let params = { let params = {
...this.form, ...this.form,
page: 1, page: 1,
@ -508,7 +509,35 @@ export default {
confirm_at_end: this.confirmAt[1] ? this.confirmAt[1] : '', confirm_at_end: this.confirmAt[1] ? this.confirmAt[1] : '',
is_export: 1 is_export: 1
} }
window.open("/api/plat_orders?" + this.objectToQueryString(params)) // window.open("/api/plat_orders?" + this.objectToQueryString(params))
exportOrder(params).then((res) => {
this.downLoadXls(res.data)
this.$message({ type: 'success', message: '导出成功!' })
this.exportLoading = false
}).catch(() => {
this.exportLoading = false
})
},
downLoadXls(response) {
const content = response
const blob = new Blob([content])
const today = new Date().toLocaleDateString()
const fileName = `订单列表${today}.xlsx`
if ('download' in document.createElement('a')) {
// IE
const elink = document.createElement('a')
elink.download = fileName
elink.style.display = 'none'
elink.href = URL.createObjectURL(blob)
document.body.appendChild(elink)
elink.click()
URL.revokeObjectURL(elink.href) // URL
document.body.removeChild(elink)
} else {
// IE10+
navigator.msSaveBlob(blob, fileName)
}
}, },
objectToQueryString(obj) { objectToQueryString(obj) {
return Object.keys(obj) return Object.keys(obj)