1.app.vue
<template>
<div id="app"
:class="{'openSidebar':isOpenSidebar,'hideSidebar':!isOpenSidebar}">
<side-nav v-if="showNav"></side-nav>
<div v-if="showNav"
class="app-header">
<my-header></my-header>
</div>
<div class="top-bar"
v-if="showNav">
<my-tabs></my-tabs>
<nav-menu></nav-menu>
</div>
<div id="content"
class="content">
<keep-alive :include="routePathArr"
:max="15">
<router-view />
</keep-alive>
</div>
<BottomBar v-if="showNav"></BottomBar>
</div>
</template>
<script>
import fileList from '@/router/fileList';
import MyHeader from "@/components/mainUI/header/Header";
import NavMenu from "@/components/mainUI/NavMenu";
import SideNav from "@/components/mainUI/sideNav/SideNav";
import MyTabs from "@/components/mainUI/Tabs";
import BottomBar from "@/components/mainUI/BottomBar";
import { mapMutations, mapGetters } from "vuex";
export default {
name: "App",
data() {
return {
showNav: true,
timer: null
};
},
methods: {
...mapMutations(["SET_WINDOW_W", "SET_WINDOW_H"]),
setContentHight() {
if (this.timer) clearTimeout(this.timer);
this.timer = setTimeout(() => {
this.timer = null;
if (this.showNav) {
const windowH = document.documentElement.clientHeight || document.body.clientHeight;
const windowW = document.documentElement.clientWidth || document.body.clientWidth;
this.SET_WINDOW_W(windowW);
this.SET_WINDOW_H(windowH);
const headerH = $(".app-header").height();
const topbarH = $(".top-bar").height();
const bottomH = $(".bottom-bar").height();
$("#content").height(windowH - headerH - topbarH - bottomH);
} else {
$("#content").height("100%");
}
}, 300);
}
},
created() {
if (this.userInfo.allMenuList.length !== 0) {
this.userInfo.allMenuList.map((item) => {
item.component = fileList[item.name];
return item
})
this.$router.addRoutes(this.userInfo.allMenuList);
this.$router.onReady(() => {
this.$router.push(this.activeIndex);
})
}
},
mounted() {
this.setContentHight();
window.onresize = () => {
this.setContentHight();
}
},
computed: {
...mapGetters(["userInfo", "isOpenSidebar", "routePathArr", "activeIndex"])
},
watch: {
$route: {
handler: function (val, oldVal) {
if (val.meta.showNav === false) {
this.showNav = false;
} else {
this.showNav = true;
};
this.setContentHight();
}
}
},
components: { MyHeader, NavMenu, SideNav, MyTabs, BottomBar }
};
</script>
<style scoped lang="stylus">
$maxWidth = 1440px
$padding = 30px
.app-header
position relative
z-index 2
.top-bar, .content
box-sizing border-box
transition padding-left 0.28s
.content
padding-right $padding
overflow hidden
@media (max-width: $maxWidth)
padding-right ($padding / 3)
.openSidebar
.side-nav
left 0
.top-bar
padding-left 200px
.content
padding-left 230px
.hideSidebar
.side-nav
left -200px
.top-bar
padding-left 0
.content
padding-left $padding
@media (max-width: $maxWidth)
padding-left ($padding / 3)
</style>
2.main.js
import 'element-ui/lib/theme-chalk/index.css';
import 'styles/index.styl'
import 'v-contextmenu/dist/index.css'
import 'highlight.js/styles/a11y-dark.css'
import Vue from 'vue'
import App from './App'
import router from './router'
import 'babel-polyfill'
import store from './store'
import ElementUI from 'element-ui';
import axios_ from './api/http'
import Common from 'js/common'
import contentmenu from 'v-contextmenu'
import 'js/directives.js'
import rules from 'js/rules.js'
import myConst from 'js/const.js'
import './vendor/core/scripts/core.js'
import setLayoutHeight from "@/assets/js/mixins/setLayoutHeight";
import components from './components/components.js';
Vue.prototype.axios = axios_;
Vue.config.productionTip = false;
window.setLayoutHeight = setLayoutHeight
window.setLayoutHeight = setLayoutHeight
Vue.use(Common).use(ElementUI).use(contentmenu).use(rules).use(myConst).use(components);
new Vue({
el: '#app',
router,
store,
components: {
App
},
template: '<App/>'
})
3. vue-router
index.js
import Vue from 'vue'
import Router from 'vue-router'
import { getStore } from 'js/store'
const Index = resolve => require(['@/pages/index/Index'], resolve)
const Login = resolve => require(['@/pages/login/Login'], resolve)
const UserInfo = resolve => require(['@/pages/user/UserInfo'], resolve)
const CompanyInfo = resolve => require(['@/pages/user/CompanyInfo'], resolve)
const News = resolve => require(['@/pages/system/news/News'], resolve)
const Notice = resolve => require(['@/pages/system/news/Notice'], resolve)
const ToDoList = resolve => require(['@/pages/workflow/ToDoList'], resolve)
const Sign = resolve => require(['@/pages/trade/sign/Sign'], resolve)
Vue.use(Router)
var router = new Router({
routes: [
{
path: '*',
redirect: '/index'
},
{
path: '/',
redirect: '/login'
},
{
path: '/index',
name: 'index',
component: Index,
meta: {
title: '首页',
requireAuth: true
}
},
{
path: '/userInfo',
name: 'userInfo',
component: UserInfo,
meta: {
title: '个人信息',
requireAuth: true
}
},
{
path: '/companyInfo',
name: 'companyInfo',
component: CompanyInfo,
meta: {
title: '企业信息',
requireAuth: true
}
},
{
path: '/news',
name: 'news',
component: News,
meta: {
title: '新闻',
requireAuth: true
}
},
{
path: '/notice',
name: 'notice',
component: Notice,
meta: {
title: '公告',
requireAuth: true
}
},
{
path: '/login',
name: 'login',
component: Login,
meta: {
showNav: false
}
},
{
path: '/sign',
name: 'sign',
component: Sign,
meta: {
showNav: false
}
},
{
path: '/toDoList',
name: 'toDoList',
component: ToDoList,
meta: {
title: '我的待办',
requireAuth: true
}
}
]
})
let indexScrollTop = 0
router.beforeEach((to, from, next) => {
if (to.matched.some(res => res.meta.requireAuth)) {
const token = getStore({ name: 'access_token', type: "string" });
if (!token) {
next({
path: '/login',
query: {
redirect: to.path
}
})
} else {
next()
}
} else {
next()
}
if (to.path !== '/index') {
indexScrollTop = document.body.scrollTop
}
})
router.afterEach(route => {
if (route.path !== '/index') {
document.body.scrollTop = 0
} else {
Vue.nextTick(() => {
document.body.scrollTop = indexScrollTop
})
}
})
export default router
fileList
export default {
class: resolve => require(['@/pages/system/manage/Class'], resolve),
menu: resolve => require(['@/pages/system/manage/Menu'], resolve),
organize: resolve => require(['@/pages/system/manage/Organize'], resolve),
user: resolve => require(['@/pages/system/manage/User'], resolve),
role: resolve => require(['@/pages/system/manage/Role'], resolve),
data: resolve => require(['@/pages/system/config/Data'], resolve),
log: resolve => require(['@/pages/system/config/Log'], resolve),
config: resolve => require(['@/pages/system/config/Config'], resolve),
exchangeRate: resolve => require(['@/pages/system/config/ExchangeRate'], resolve),
hgTaxRate: resolve => require(['@/pages/system/config/HgTaxRate'], resolve),
billRule: resolve => require(['@/pages/system/rule/BillRule'], resolve),
entityRules: resolve => require(['@/pages/system/rule/EntityRules'], resolve),
printTemplate: resolve => require(['@/pages/system/template/PrintTemplate'], resolve),
rule: resolve => require(['@/pages/system/template/Rule'], resolve),
message: resolve => require(['@/pages/system/template/Message'], resolve),
voucherTemplate: resolve => require(['@/pages/system/template/VoucherTemplate'], resolve),
signDataRule: resolve => require(['@/pages/system/template/SignDataRule'], resolve),
selectConfig: resolve => require(['@/pages/system/controlConfig/SelectConfig'], resolve),
btnConfig: resolve => require(['@/pages/system/controlConfig/BtnConfig'], resolve),
tableConfig: resolve => require(['@/pages/system/controlConfig/TableConfig'], resolve),
toolbarConfig: resolve => require(['@/pages/system/controlConfig/ToolbarConfig'], resolve),
pageConfig: resolve => require(['@/pages/system/controlConfig/PageConfig'], resolve),
nodeConfig: resolve => require(['@/pages/system/modeling/NodeConfig'], resolve),
processConfig: resolve => require(['@/pages/system/modeling/ProcessConfig'], resolve),
AOP: resolve => require(['@/pages/system/AOP/AOP'], resolve),
holiday: resolve => require(['@/pages/system/holiday/Holiday'], resolve),
newsManager: resolve => require(['@/pages/system/news/NewsManager'], resolve),
noticeManager: resolve => require(['@/pages/system/news/NoticeManager'], resolve),
purchase: resolve => require(['@/pages/tenant/Purchase'], resolve),
purchaseRecord: resolve => require(['@/pages/tenant/PurchaseRecord'], resolve),
trial: resolve => require(['@/pages/tenant/Trial'], resolve),
appCenter: resolve => require(['@/pages/tenant/AppCenter'], resolve),
bankInfo: resolve => require(['@/pages/tenant/BankInfo'], resolve),
chargeStandard: resolve => require(['@/pages/tenant/ChargeStandard'], resolve),
tenant: resolve => require(['@/pages/tenant/Tenant'], resolve),
customer: resolve => require(['@/pages/customer/Customer'], resolve),
suppliers: resolve => require(['@/pages/customer/Suppliers'], resolve),
providers: resolve => require(['@/pages/customer/Providers'], resolve),
hkCompany: resolve => require(['@/pages/customer/HkCompany'], resolve),
distributors: resolve => require(['@/pages/customer/Distributors'], resolve),
agreement: resolve => require(['@/pages/customer/Agreement'], resolve),
settlement: resolve => require(['@/pages/customer/Settlement'], resolve),
formula: resolve => require(['@/pages/customer/Formula'], resolve),
commodity: resolve => require(['@/pages/commodity/Commodity'], resolve),
hsCode: resolve => require(['@/pages/commodity/HSCode'], resolve),
classify: resolve => require(['@/pages/classify/Classify'], resolve),
orderListInland: resolve => require(['@/pages/trade/orderList/OrderListInland'], resolve),
orderListHk: resolve => require(['@/pages/trade/orderList/OrderListHk'], resolve),
orderListImport: resolve => require(['@/pages/trade/orderList/OrderListImport'], resolve),
orderListExport: resolve => require(['@/pages/trade/orderList/OrderListExport'], resolve),
ordListBuy: resolve => require(['@/pages/trade/OrdListBuy'], resolve),
ordListSale: resolve => require(['@/pages/trade/OrdListSale'], resolve),
acctReceipt: resolve => require(['@/pages/finance/AcctReceipt'], resolve),
acctPay: resolve => require(['@/pages/finance/AcctPay'], resolve),
acctPayEntry: resolve => require(['@/pages/finance/AcctPayEntry'], resolve),
invoice: resolve => require(['@/pages/finance/Invoice'], resolve),
pendingVerification: resolve => require(['@/pages/finance/PendingVerification'], resolve),
verificationRecord: resolve => require(['@/pages/finance/VerificationRecord'], resolve),
taxinvoice: resolve => require(['@/pages/finance/Taxinvoice'], resolve),
exportTaxinvoice: resolve => require(['@/pages/finance/ExportTaxinvoice'], resolve),
accountBank: resolve => require(['@/pages/finance/AccountBank'], resolve),
voucher: resolve => require(['@/pages/finance/Voucher'], resolve),
declare: resolve => require(['@/pages/declare/Declare'], resolve),
intoWarehouse: resolve => require(['@/pages/storage/IntoWarehouse'], resolve),
warehouse: resolve => require(['@/pages/storage/Warehouse'], resolve),
outWarehouse: resolve => require(['@/pages/storage/OutWarehouse'], resolve),
transportCompany: resolve => require(['@/pages/storage/TransportCompany'], resolve),
logisticsCompany: resolve => require(['@/pages/storage/LogisticsCompany'], resolve),
storeHouse: resolve => require(['@/pages/storage/StoreHouse'], resolve),
deliver: resolve => require(['@/pages/transport/Deliver'], resolve),
sendGoods: resolve => require(['@/pages/transport/SendGoods'], resolve),
takeGoods: resolve => require(['@/pages/transport/TakeGoods'], resolve),
signMangeList: resolve => require(['@/pages/sign/SignMangeList'], resolve),
signSearch: resolve => require(['@/pages/sign/SignSearch'], resolve),
finManageList: resolve => require(['@/pages/finManagement/FinManageList'], resolve)
}
3.vuex
index
import Vue from 'vue'
import Vuex from 'vuex'
import actions from './actions'
import * as getters from './getters'
import state from './state'
import mutations from './mutations'
import createLogger from 'vuex/dist/logger'
Vue.use(Vuex)
const debug = process.env.NODE_ENV === 'development'
export default new Vuex.Store({
actions,
getters,
state,
mutations,
strict: debug,
plugins: debug ? [createLogger()] : []
})
state.js
import {
getStore
} from 'js/store'
const state = {
news: localStorage.getItem('news'),
theme: getStore({
name: 'theme'
}) || '#1E56A0',
options: getStore({
name: 'options'
}) || [{
name: '首页',
route: "/index"
}],
activeIndex: getStore({
name: 'activeIndex'
}) || '/index',
userInfo: getStore({
name: 'userInfo'
}) || {
allMenuList: [],
leftMenu: [],
mainMenu: {
left: [],
right: {}
},
permissions: []
},
windowH: null,
windowW: null,
isOpenSidebar: false,
domain: {
prefix: "www.",
suffix: ".ec-chain.com"
},
fileListTheaderData: [
{
type: 5,
width: '',
hasSort: false,
isShow: true,
prop: 'fileUrl',
label: '文件名'
},
{
type: 0,
width: '',
hasSort: false,
isShow: true,
prop: 'remark',
label: '备注'
},
{
type: 0,
width: '',
hasSort: false,
isShow: true,
prop: 'createUserName',
label: '创建人'
},
{
type: 8,
width: '',
hasSort: false,
isShow: true,
prop: 'createTime',
label: '创建时间'
}
],
orgTree: [],
classObj: {
1: [],
2: [],
3: [],
4: [],
5: [],
6: [],
7: []
}
}
export default state
getters
export const news = state => state.news
export const theme = state => state.theme
export const options = state => state.options
export const activeIndex = state => state.activeIndex
export const userInfo = state => state.userInfo
export const windowH = state => state.windowH
export const windowW = state => state.windowW
export const isOpenSidebar = state => state.isOpenSidebar
export const domain = state => state.domain
export const orgTree = state => state.orgTree
export const classObj = state => state.classObj
export const routePathArr = state => {
return state.options.map((item) => {
let text = item.route.replace('/', '');
if (text.length !== 0) {
text = text.substring(0, 1).toUpperCase() + text.substring(1);
}
return text
})
}
mutations
import {
setStore
} from 'js/store'
const mutations = {
SET_NEWS(state, val) {
state.news = val
},
SET_THEME: (state, color) => {
state.theme = color
setStore({
name: 'theme',
content: state.theme
})
},
ADD_TABS(state, data) {
state.options.push(data);
setStore({
name: 'options',
content: state.options,
type: 'Session'
})
},
DELETE_TABS(state, route) {
let index = 0;
for (let option of state.options) {
if (option.route === route) {
break;
}
index++;
}
state.options.splice(index, 1);
setStore({
name: 'options',
content: state.options,
type: 'Session'
})
},
RESET_TABS(state) {
state.options = [{
name: '首页',
route: "/index"
}];
setStore({
name: 'options',
content: state.options,
type: 'Session'
})
},
SET_ACTIVE_INDEX(state, index) {
state.activeIndex = index;
setStore({
name: 'activeIndex',
content: state.activeIndex,
type: 'Session'
})
},
SET_USER_INFO(state, info) {
state.userInfo = info;
setStore({
name: 'userInfo',
content: info,
type: "Session"
})
},
SET_WINDOW_H(state, H) {
state.windowH = H;
},
SET_WINDOW_W(state, W) {
state.windowW = W;
},
OPEN_SIDEBAR(state) {
state.isOpenSidebar = !state.isOpenSidebar;
},
SET_ORGTREE(state, tree) {
state.orgTree = tree;
},
SET_CLASS(state, [type, tree]) {
state.classObj[type] = tree
}
}
export default mutations
## actions
import Vue from 'vue'
const vm = new Vue({});
const actions = {
GET_ORGTREE({ commit }) {
vm.axios.get(`/api/common-service/orgs`, {
pageNum: 1,
pageSize: 999999999
}).then((res) => {
let data = res.data.records;
data.sort((a, b) => {
return a.orderNum - b.orderNum
})
const tree = vm.$treeFn.toTree(data, 0, {
name: "orgName",
pId: "parentId",
pName: "pName",
children: "children",
originNode: "根节点"
});
commit('SET_ORGTREE', tree);
});
},
GET_CLASS({ commit }, type) {
return new Promise((resolve, reject) => {
vm.axios.get(`/api/common-service/category/load-category/${type}`)
.then((res) => {
commit('SET_CLASS', [type, res.data.subCategory]);
resolve(res);
}).catch(() => {})
})
}
}
export default actions
4.config
index
'use strict'
const path = require('path')
module.exports = {
dev: {
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {
'/api': {
target: 'http://192.168.212.11:8080',
changeOrigin: true,
pathRewrite: {
'^/api': '/'
}
}
},
host: "0.0.0.0",
port: 8080,
autoOpenBrowser: false,
errorOverlay: true,
notifyOnErrors: true,
poll: false,
devtool: 'cheap-module-eval-source-map',
cacheBusting: true,
cssSourceMap: true
},
build: {
index: path.resolve(__dirname, '../dist/index.html'),
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: './',
productionSourceMap: false,
devtool: '#source-map',
productionGzip: false,
productionGzipExtensions: ['js', 'css'],
bundleAnalyzerReport: process.env.npm_config_report
}
}
dev.env.js
'use strict'
const merge = require('webpack-merge')
const prodEnv = require('./prod.env')
module.exports = merge(prodEnv, {
NODE_ENV: '"development"'
})
prod.env.js
'use strict'
module.exports = {
NODE_ENV: `'${process.env.NODE_ENV}'`
}
5.axios
import Vue from 'vue'
import axios from 'axios';
import QS from 'qs';
import router from '../router'
import dev from './dev'
import { setStore, getStore, removeStore } from 'js/store'
import {
showLoading,
hideLoading
} from '../assets/js/loading';
const pending = {}
const CancelToken = axios.CancelToken
const removePending = (key, isRequest = false) => {
if (pending[key] && isRequest) {
pending[key]('取消重复请求')
}
delete pending[key]
}
const getRequestIdentify = (config, isReuest = false) => {
let url = config.url
if (isReuest) {
url = config.baseURL + config.url.substring(1, config.url.length)
}
return config.method === 'get' ? encodeURIComponent(url + JSON.stringify(config.params)) : encodeURIComponent(config.url + JSON.stringify(config.data))
}
let [oldServer, newServer] = [null, null];
if (process.env.NODE_ENV === 'development') {
oldServer = dev.oldServer;
newServer = dev.newServer;
setStore(dev.fileIpService);
} else {
oldServer = "/api";
newServer = "";
let url = "";
switch (process.env.NODE_ENV) {
case "debug":
url = 'http://192.168.212.11:8080';
break;
case "test":
if (location.host === "192.168.212.60:8066") {
url = 'http://192.168.212.61:8080';
} else {
url = "http://219.134.185.254:8088";
}
break;
case "production":
url = 'http://api.ispek.cn:9091';
break;
default:
break;
}
axios.defaults.baseURL = url;
setStore({
name: "fileIpService",
content: {
ip: url,
file: "/file-service/file/resources/",
loginValidator: "/oauth-service/kaptcha/render"
}
})
}
let windowLoadingcontrol = null;
let windowAjaxTime = {
start: null,
end: null
};
axios.interceptors.request.use(config => {
let requestData = getRequestIdentify(config, true);
removePending(requestData, true);
config.cancelToken = new CancelToken((c) => {
pending[requestData] = c
});
if (oldServer !== null && newServer !== null) {
if (Array.isArray(oldServer)) {
oldServer.forEach((item, index) => {
config.url = config.url.replace(item, newServer[index]);
})
} else {
config.url = config.url.replace(oldServer, newServer);
}
};
showLoading();
windowAjaxTime.start = new Date().getTime();
const token = getStore({ name: 'access_token', type: "string" });
if (token) {
config.headers.Authorization = 'Bearer ' + token;
}
return config;
}, error => {
hideLoading();
return Promise.error(error);
})
axios.interceptors.response.use(response => {
clearTimeout(windowLoadingcontrol);
windowLoadingcontrol = setTimeout(() => {
hideLoading();
}, 300);
if (response.headers['content-type'].indexOf('application/octet-stream') !== -1) {
return Promise.resolve(response);
} else if (Number(response.status) === 200 && Number(response.data.statusCode) === 200) {
windowAjaxTime.end = new Date().getTime();
response.data.resTime = windowAjaxTime.end - windowAjaxTime.start;
return Promise.resolve(response);
} else {
Vue.prototype.$message.error(response.data.message)
return Promise.reject(response);
}
}, (error) => {
hideLoading();
if (error.response.status) {
switch (error.response.status) {
case 401:
removeStore({ name: 'access_token' });
removeStore({ name: 'userInfo' });
router.replace({
path: '/login',
query: {
redirect: router.currentRoute.fullPath
}
});
location.reload();
break;
default:
break;
}
}
Vue.prototype.$message.error(error.response.data.message || "服务出错了,请稍后再试")
return Promise.reject(error)
})
function get(url, params) {
const dealObjectValue = (obj) => {
let param = {};
if (obj === null || obj === undefined || obj === "") return param;
for (let key in obj) {
if (Array.isArray(obj[key])) {
const arr = obj[key].find((item) => {
if (item !== null && item !== undefined && item !== "") return item
})
if (arr) {
param[key] = obj[key];
}
} else if (obj[key] instanceof Object) {
param[key] = dealObjectValue(obj[key]);
} else if (obj[key] !== null && obj[key] !== undefined && obj[key] !== "") {
param[key] = obj[key];
}
}
return param;
};
const newParams = dealObjectValue(params);
return new Promise((resolve, reject) => {
axios.get(url, {
params: newParams,
paramsSerializer: function (params) {
return QS.stringify(params, { arrayFormat: 'indices' })
}
})
.then(res => {
resolve(res.data);
})
.catch(err => {
reject(err.data)
})
});
}
function post(url, params, config) {
return new Promise((resolve, reject) => {
let parameters = params;
if (!config) {
parameters = url.indexOf('/core/') >= 0 ? params : QS.stringify(params);
} else if (config === "json") {
config = {
headers: { 'Content-Type': 'application/json;charset=utf-8' }
}
}
axios.post(url, parameters, config)
.then(res => {
resolve(res.data);
})
.catch(err => {
reject(err.data)
})
});
}
function put(url, params, config) {
return new Promise((resolve, reject) => {
let parameters = params;
if (!config) {
parameters = QS.stringify(params);
}
axios.put(url, parameters)
.then(res => {
resolve(res.data);
})
.catch(err => {
reject(err.data)
})
});
}
function del(url, params) {
return new Promise((resolve, reject) => {
axios.delete(url, { params: params })
.then(res => {
resolve(res.data);
})
.catch(err => {
reject(err.data)
})
});
}
function upload(files, url, paramName, otherParam) {
url = url || '/api/file-service/file/upload';
paramName = paramName || 'files';
let param = new FormData();
if (Object.prototype.isPrototypeOf(otherParam) && Object.keys(otherParam).length !== 0) {
for (const key in otherParam) {
if (otherParam.hasOwnProperty(key)) {
const element = otherParam[key];
param.append(key, element);
}
}
}
files.map((item) => {
param.append(paramName, item);
})
let config = {
headers: { 'Content-Type': 'multipart/form-data' }
};
return new Promise((resolve, reject) => {
axios.post(url, param, config)
.then(res => {
resolve(res.data);
})
.catch(err => {
reject(err.data)
})
});
}
function download(url, params, fileType, fileName, isDownLoad = true) {
fileType = fileType || 'xls';
fileName = fileName || '导出文件';
let config = {
params: params,
headers: {
'content-disposition': "attachment;filename=total." + fileType,
'Content-Type': 'application/x-download;charset=utf-8'
},
responseType: 'blob'
};
return new Promise((resolve, reject) => {
axios.get(url, config)
.then(err => {
if (!err) return;
let url = window.URL.createObjectURL(err.data);
resolve(url);
if (!isDownLoad) return;
let link = document.createElement('a');
link.style.display = 'none';
link.href = url;
link.setAttribute('download', `${fileName}.${fileType}`);
document.body.appendChild(link);
link.click();
})
.catch(err => {
reject(err.data)
})
});
}
export default {
get,
post,
put,
del,
upload,
download,
all: axios.all,
spread: axios.spread
}
6.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link href="https://cdn.bootcss.com/animate.css/3.7.0/animate.min.css" rel="stylesheet">
<title>供应链金融SaaS平台</title>
<link rel="icon" href="/static/image/web_icon.ico" type="image/x-icon" />
<script src="/static/js/pdfjs/pdf.js" charset="utf-8"></script>
</head>
<body>
<div id="app"></div>
</body>
</html>