From aede3e2b5420282ce32d07242d60372d3519d02f Mon Sep 17 00:00:00 2001 From: yehuangf Date: Fri, 26 Dec 2025 17:14:26 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E4=BB=A3=E7=90=86=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.vue | 78 ++++++++++++++++++++++++++++ src/plugins/index.js | 78 ++++++++++++++++++++++++++++ vue.config.js | 121 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 277 insertions(+) create mode 100644 src/App.vue create mode 100644 src/plugins/index.js create mode 100644 vue.config.js diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..8bd8530 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,78 @@ + + + + + + diff --git a/src/plugins/index.js b/src/plugins/index.js new file mode 100644 index 0000000..f1ac9b1 --- /dev/null +++ b/src/plugins/index.js @@ -0,0 +1,78 @@ +import Vue from 'vue' + +import XDateFormatPlugin from './dayjs/x-date-format' +import XLodashPlugin from './lodash/x-lodash' +import XBomeventPlugin from './bomevent/x-bomevent' +import XRequestPlugin from './request/x-request' + +import { SET_TOKEN } from '../store/auth.store' +import store from '../store' + +const plugins = [XDateFormatPlugin, XLodashPlugin, XBomeventPlugin] + +plugins.forEach((plugin) => { + Vue.use(plugin) +}) + +// 开发环境不设置 baseURL(使用相对路径),生产环境使用 .env 中的域名 +const baseURL = process.env.NODE_ENV === 'development' ? '' : process.env.VUE_APP_BASE_DOMAIN + +Vue.use(XRequestPlugin, { + baseURL, + headers: { + 'Accept-Language': 'zh-CN' + }, + needShowMessage: true, + businessErrorCatch: function(failRes, response, needShowMessage) { + // 通用业务错误处理 + // console.log(failRes, response, needShowMessage) + if (failRes.code === 'error' && needShowMessage) { + Vue.prototype.$message({ + message: failRes.message, + type: 'error' + }) + } + }, + errorCatch: function(err, needShowMessage) { + console.error(err) + } +}) + +// 添加request拦截器 +Vue.addInterceptorsRequest('REQUEST_PARAMS_INTERCEPTOR', (e) => { + e.headers['xdaptimestamp'] = new Date().getTime() + + const authStore = store.state.authModule + if (authStore.token) { + e.headers['xdaptoken'] = authStore.token + } + e.headers['xdaptenantid'] = process.env.VUE_APP_TENANT_ID + + return e +}) + +// 添加response拦截器 +Vue.addInterceptorsResponse('RESPONSE_SUCCESS_MSG_INTERCEPTOR', (e) => { + const token = e && e.headers && e.headers.xdaptoken + if (token) { + store.commit(`authModule/${SET_TOKEN}`, token) + } + if (e.data.code) { + if (e && e.status === 200 && e.data.code === 'ok' && !e.config.disableSuccessMsg) { + if (e.data.interval) { + Vue.prototype.$message({ + message: e.data.message, + type: 'success', + durationTime: e.data.interval + }) + } else { + Vue.prototype.$message({ + message: e.data.message, + type: 'success' + }) + } + } + } + + return e +}) diff --git a/vue.config.js b/vue.config.js new file mode 100644 index 0000000..8e1b21a --- /dev/null +++ b/vue.config.js @@ -0,0 +1,121 @@ +/* + * @Author: your name + * @Date: 2020-05-27 09:29:16 + * @LastEditTime: 2020-05-27 11:00:29 + * @LastEditors: your name + * @Description: In User Settings Edit + * @FilePath: /x-product-workspace/packages/x-project-app/vue.config.js + */ +'use strict' +'use strict' +const path = require('path') + +const resolve = (dir) => { + return path.join(__dirname, './', dir) +} + +const isProd = () => { + return process.env.NODE_ENV === 'production' +} +module.exports = { + publicPath: process.env.VUE_APP_PUBLIC_PATH, + assetsDir: 'public', + lintOnSave: isProd(), + productionSourceMap: false, + transpileDependencies: [ + '@x-ui/x-dcloud-ui', + '@x-apaas/x-lib-rule-engine', + '@x-apaas/x-dcloud-page-web', + 'x-extension' + ], + runtimeCompiler: true, + // webpack-dev-server 相关配置 + devServer: { + open: process.platform === 'darwin', + host: '0.0.0.0', + port: '8081', + disableHostCheck: false, + https: false, + hotOnly: false, + overlay: { + warnings: false, + errors: true + }, + proxy: { + '/custom': { + target: 'https://apaas-meim.app.yuchai.com/apaas/backend/a5e8e08/ycgf-yf-rddata', + changeOrigin: true, + pathRewrite: {} + } + } + }, + css: { + loaderOptions: { + sass: { + prependData: ` + @import "@/assets/scss/variable.scss"; + ` + } + } + }, + pwa: { + iconPaths: { + favicon32: './favicon.ico', + favicon16: './favicon.ico', + appleTouchIcon: './favicon.ico', + maskIcon: './favicon.ico', + msTileImage: './favicon.ico' + } + }, + configureWebpack: () => ({ + name: 'vue-cli3-template', + resolve: { + alias: { + // vue动态值 + vue$: 'vue/dist/vue.esm.js', + + // vue快速路径 + '@': resolve('src') + } + }, + plugins: [] + }), + chainWebpack: (config) => { + // webpack-html-plugin + // config.plugin('html').tap((options) => { + // options[0].title = '得帆云 MDM平台' + // options[0].minify = { + // removeComments: true, + // collapseWhitespace: true, + // removeAttributeQuotes: true, + // useShortDoctype: true, + // removeEmptyAttributes: true, + // removeStyleLinkTypeAttributes: true, + // keepClosingSlash: true, + // minifyJS: true, + // minifyCSS: true, + // minifyURLs: true + // } + // return options + // }) + + // + const svgRule = config.module.rule('svg') + svgRule.uses.clear() + + // svgRule.use("vue-svg-loader").loader("vue-svg-loader"); + // svgRule.exclude.add(/node_modules/); + svgRule + .test(/\.svg$/) + .include.add(resolve('./src/assets/icon')) + .add(resolve('./node_modules/@x-ui/x-dcloud-ui/lib/assets/icon')) + .add(resolve('./node_modules/@x-apaas/x-dcloud-page-web/lib/assets/icon')) + .end() + .use('svg-sprite-loader') + .loader('svg-sprite-loader') + .options({ + symbolId: 'svg-[name]' + }) + config.resolve.symlinks(true) + } +}