5 changed files with 282 additions and 21 deletions
@ -0,0 +1,10 @@ |
|||||
|
import request from '@/utils/request' |
||||
|
|
||||
|
// 查询【请填写功能名称】列表
|
||||
|
export function listBaseinf(query) { |
||||
|
return request({ |
||||
|
url: '/system/baseinf/list', |
||||
|
method: 'get', |
||||
|
params: query |
||||
|
}) |
||||
|
} |
@ -0,0 +1,118 @@ |
|||||
|
import axios from 'axios' |
||||
|
import { Notification, MessageBox, Message, Loading } from 'element-ui' |
||||
|
|
||||
|
let downloadLoadingInstance; |
||||
|
|
||||
|
axios.defaults.headers['Conntent-Type'] = 'application/json;charset=utf-8' |
||||
|
// 创建axios实例
|
||||
|
const service = axios.create({ |
||||
|
// axios中请求配置有baseURL选项,表示请求URL公共部分
|
||||
|
baseURL: '/', |
||||
|
// 超时
|
||||
|
timeout: 300000 |
||||
|
// timeout: 10000
|
||||
|
}) |
||||
|
|
||||
|
// request拦截器
|
||||
|
service.interceptors.request.use(config => { |
||||
|
// // 是否需要设置 token
|
||||
|
// const isToken = (config.headers || {}).isToken === false
|
||||
|
// if (getToken() && !isToken) {
|
||||
|
// config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
|
||||
|
// }
|
||||
|
// // get请求映射params参数
|
||||
|
// if (config.method === 'get' && config.params) {
|
||||
|
// let url = config.url + '?' + tansParams(config.params);
|
||||
|
// url = url.slice(0, -1);
|
||||
|
// config.params = {};
|
||||
|
// config.url = url;
|
||||
|
// }
|
||||
|
return config |
||||
|
}, error => { |
||||
|
console.log(error) |
||||
|
Promise.reject(error) |
||||
|
}) |
||||
|
|
||||
|
// 响应拦截器
|
||||
|
service.interceptors.response.use(res => { |
||||
|
|
||||
|
// 未设置状态码则默认成功状态
|
||||
|
const code = res.data.code || 200; |
||||
|
// 获取错误信息
|
||||
|
const msg = errorCode[code] || res.data.msg || errorCode['default'] |
||||
|
// 二进制数据则直接返回
|
||||
|
if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') { |
||||
|
return res.data |
||||
|
} |
||||
|
if (code === 401) { |
||||
|
MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { |
||||
|
confirmButtonText: '重新登录', |
||||
|
cancelButtonText: '取消', |
||||
|
type: 'warning' |
||||
|
} |
||||
|
).then(() => { |
||||
|
store.dispatch('LogOut').then(() => { |
||||
|
location.href = '/index'; |
||||
|
}) |
||||
|
}).catch(() => { }); |
||||
|
return Promise.reject('无效的会话,或者会话已过期,请重新登录。') |
||||
|
} else if (code === 500) { |
||||
|
Message({ |
||||
|
message: msg, |
||||
|
type: 'error' |
||||
|
}) |
||||
|
return Promise.reject(new Error(msg)) |
||||
|
} else if (code !== 200) { |
||||
|
Notification.error({ |
||||
|
title: msg |
||||
|
}) |
||||
|
return Promise.reject('error') |
||||
|
} else { |
||||
|
return res.data |
||||
|
} |
||||
|
}, |
||||
|
error => { |
||||
|
console.log('err' + error) |
||||
|
let { message } = error; |
||||
|
if (message == "Network Error") { |
||||
|
message = "后端接口连接异常"; |
||||
|
} |
||||
|
else if (message.includes("timeout")) { |
||||
|
message = "系统接口请求超时"; |
||||
|
} |
||||
|
else if (message.includes("Request failed with status code")) { |
||||
|
message = "系统接口" + message.substr(message.length - 3) + "异常"; |
||||
|
} |
||||
|
Message({ |
||||
|
message: message, |
||||
|
type: 'error', |
||||
|
duration: 5 * 1000 |
||||
|
}) |
||||
|
return Promise.reject(error) |
||||
|
} |
||||
|
) |
||||
|
|
||||
|
// 通用下载方法
|
||||
|
export function download(url, params, filename) { |
||||
|
downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", }) |
||||
|
return service.post(url, params, { |
||||
|
transformRequest: [(params) => { return tansParams(params) }], |
||||
|
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, |
||||
|
responseType: 'blob' |
||||
|
}).then(async (data) => { |
||||
|
const isLogin = await blobValidate(data); |
||||
|
if (isLogin) { |
||||
|
const blob = new Blob([data]) |
||||
|
saveAs(blob, filename) |
||||
|
} else { |
||||
|
Message.error('无效的会话,或者会话已过期,请重新登录。'); |
||||
|
} |
||||
|
downloadLoadingInstance.close(); |
||||
|
}).catch((r) => { |
||||
|
console.error(r) |
||||
|
Message.error('下载文件出现错误,请联系管理员!') |
||||
|
downloadLoadingInstance.close(); |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
export default service |
@ -1,20 +1,153 @@ |
|||||
|
'use strict' |
||||
|
const path = require('path') |
||||
|
|
||||
|
function resolve(dir) { |
||||
|
return path.join(__dirname, dir) |
||||
|
} |
||||
|
|
||||
|
const name = process.env.VUE_APP_TITLE || '' // 网页标题
|
||||
|
|
||||
|
const port = process.env.port || process.env.npm_config_port || 80 // 端口
|
||||
|
|
||||
|
const webpack = require('webpack') |
||||
|
const CopyWebpackPlugin = require('copy-webpack-plugin') |
||||
|
const cesiumSource = 'node_modules/mars3d-cesium/Build/Cesium/' |
||||
|
const otherSource = 'src/' |
||||
module.exports = { |
module.exports = { |
||||
configureWebpack: { |
chainWebpack: config => { |
||||
resolve: { |
config.plugin('provide').use(webpack.ProvidePlugin, [{ |
||||
alias: { |
$: 'jquery', |
||||
'@src': require('path').resolve(__dirname, 'src'), // 配置别名 '@src' 指向 'src' 目录
|
jquery: 'jquery', |
||||
}, |
jQuery: 'jquery', |
||||
}, |
'window.jQuery': 'jquery' |
||||
}, |
}]) |
||||
|
} |
||||
|
} |
||||
|
// vue.config.js 配置说明
|
||||
|
//官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions
|
||||
|
// 这里只列一部分,具体配置参考文档
|
||||
|
module.exports = { |
||||
|
// 部署生产环境和开发环境下的URL。
|
||||
|
// 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上
|
||||
|
// 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
|
||||
|
publicPath: process.env.NODE_ENV === "production" ? "/" : "/", |
||||
|
// 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist)
|
||||
|
outputDir: 'dist', |
||||
|
// 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下)
|
||||
|
assetsDir: 'static', |
||||
|
// 是否开启eslint保存检测,有效值:ture | false | 'error'
|
||||
|
lintOnSave: process.env.NODE_ENV === 'development', |
||||
|
// 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。
|
||||
|
productionSourceMap: process.env.NODE_ENV !== "production", |
||||
|
// webpack-dev-server 相关配置
|
||||
devServer: { |
devServer: { |
||||
|
host: '0.0.0.0', |
||||
|
port: port, |
||||
|
open: true, |
||||
proxy: { |
proxy: { |
||||
'/api': { |
// detail: https://cli.vuejs.org/config/#devserver-proxy
|
||||
target: 'http://localhost:3000', // 后端 API 地址
|
[process.env.VUE_APP_BASE_API]: { |
||||
changeOrigin: true, // 是否允许跨域
|
target: process.env.VUE_APP_TARGET || '101.201.110.29:8080', |
||||
|
changeOrigin: true, |
||||
pathRewrite: { |
pathRewrite: { |
||||
'^/api': '', // 重写路径,将 '/api' 移除
|
['^' + process.env.VUE_APP_BASE_API]: '' |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
disableHostCheck: true |
||||
|
}, |
||||
|
configureWebpack: { |
||||
|
name: name, |
||||
|
devtool: process.env.NODE_ENV === "production" ? false : 'eval-source-map', |
||||
|
//devtool:'source-map',
|
||||
|
resolve: { |
||||
|
alias: { |
||||
|
'@': resolve('src') |
||||
|
} |
||||
}, |
}, |
||||
|
plugins: [ |
||||
|
new webpack.DefinePlugin({ |
||||
|
CESIUM_BASE_URL: JSON.stringify('static') |
||||
|
}), |
||||
|
new CopyWebpackPlugin({ |
||||
|
patterns: [{ from: path.join(cesiumSource, 'Workers'), to: 'static/Workers' }] |
||||
|
}), |
||||
|
new CopyWebpackPlugin({ |
||||
|
patterns: [{ from: path.join(cesiumSource, 'Assets'), to: 'static/Assets' }] |
||||
|
}), |
||||
|
new CopyWebpackPlugin({ |
||||
|
patterns: [{ from: path.join(cesiumSource, 'ThirdParty'), to: 'static/ThirdParty' }] |
||||
|
}), |
||||
|
new CopyWebpackPlugin({ |
||||
|
patterns: [{ from: path.join(cesiumSource, 'Widgets'), to: 'static/Widgets' }] |
||||
|
}), |
||||
|
// new CopyWebpackPlugin({
|
||||
|
// patterns: [{from: path.join(otherSource, 'data/3dtiles'), to: 'static/data/3dtiles'}]
|
||||
|
// }),
|
||||
|
] |
||||
}, |
}, |
||||
|
chainWebpack(config) { |
||||
|
config.plugins.delete('preload') // TODO: need test
|
||||
|
config.plugins.delete('prefetch') // TODO: need test
|
||||
|
|
||||
|
// set svg-sprite-loader
|
||||
|
config.module |
||||
|
.rule('svg') |
||||
|
.exclude.add(resolve('src/assets/icons')) |
||||
|
.end() |
||||
|
config.module |
||||
|
.rule('icons') |
||||
|
.test(/\.svg$/) |
||||
|
.include.add(resolve('src/assets/icons')) |
||||
|
.end() |
||||
|
.use('svg-sprite-loader') |
||||
|
.loader('svg-sprite-loader') |
||||
|
.options({ |
||||
|
symbolId: 'icon-[name]' |
||||
|
}) |
||||
|
.end() |
||||
|
|
||||
|
config |
||||
|
.when(process.env.NODE_ENV !== 'development', |
||||
|
config => { |
||||
|
config |
||||
|
.plugin('ScriptExtHtmlWebpackPlugin') |
||||
|
.after('html') |
||||
|
.use('script-ext-html-webpack-plugin', [{ |
||||
|
// `runtime` must same as runtimeChunk name. default is `runtime`
|
||||
|
inline: /runtime\..*\.js$/ |
||||
|
}]) |
||||
|
.end() |
||||
|
config |
||||
|
.optimization.splitChunks({ |
||||
|
chunks: 'all', |
||||
|
cacheGroups: { |
||||
|
libs: { |
||||
|
name: 'chunk-libs', |
||||
|
test: /[\\/]node_modules[\\/]/, |
||||
|
priority: 10, |
||||
|
chunks: 'initial' // only package third parties that are initially dependent
|
||||
}, |
}, |
||||
|
elementUI: { |
||||
|
name: 'chunk-elementUI', // split elementUI into a single package
|
||||
|
priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
|
||||
|
test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
|
||||
}, |
}, |
||||
}; |
commons: { |
||||
|
name: 'chunk-commons', |
||||
|
test: resolve('src/components'), // can customize your rules
|
||||
|
minChunks: 3, // minimum common number
|
||||
|
priority: 5, |
||||
|
reuseExistingChunk: true |
||||
|
} |
||||
|
} |
||||
|
}) |
||||
|
config.optimization.runtimeChunk('single'), |
||||
|
{ |
||||
|
from: path.resolve(__dirname, './public/robots.txt'), //防爬虫文件
|
||||
|
to: './', //到根目录下
|
||||
|
} |
||||
|
} |
||||
|
) |
||||
|
} |
||||
|
} |
||||
|
Loading…
Reference in new issue