From 42bd4f08f7b4da08a979d803c3b4d1a881f213a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E5=AE=8F=E6=9D=B0?= <1943105267@qq.com> Date: Thu, 12 Oct 2023 10:56:52 +0800 Subject: [PATCH] =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 3 +- package.json | 1 + src/api/tcZz/networkSecurity/DataSourceTj.js | 44 ++ src/assets/styles/diythem.scss | 183 ++++++++ src/assets/styles/index.scss | 31 +- src/assets/styles/ruoyi.scss | 260 +++++------ src/main.js | 119 ++--- src/utils/rem.js | 17 + .../networkSecurity/DataSourceTj/index.vue | 411 ++++++++++++++++++ vue.config.js | 161 +++---- 10 files changed, 970 insertions(+), 260 deletions(-) create mode 100644 src/api/tcZz/networkSecurity/DataSourceTj.js create mode 100644 src/assets/styles/diythem.scss create mode 100644 src/utils/rem.js create mode 100644 src/views/tcZz/networkSecurity/DataSourceTj/index.vue diff --git a/.env.development b/.env.development index 302ecd1..daa763f 100644 --- a/.env.development +++ b/.env.development @@ -5,7 +5,8 @@ VUE_APP_TITLE = 若依管理系统 ENV = 'development' # 若依管理系统/开发环境 -VUE_APP_BASE_API = '/dev-api' +VUE_APP_BASE_API = 'http://localhost:9027' +# VUE_APP_BASE_API = 'https://vue.ruoyi.vip/prod-api' # 路由懒加载 VUE_CLI_BABEL_TRANSPILE_MODULES = true diff --git a/package.json b/package.json index 206c59e..f3852ea 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "js-cookie": "3.0.1", "jsencrypt": "3.0.0-rc.1", "nprogress": "0.2.0", + "postcss-px2rem": "^0.3.0", "quill": "1.3.7", "screenfull": "5.0.2", "sortablejs": "1.10.2", diff --git a/src/api/tcZz/networkSecurity/DataSourceTj.js b/src/api/tcZz/networkSecurity/DataSourceTj.js new file mode 100644 index 0000000..55ae69f --- /dev/null +++ b/src/api/tcZz/networkSecurity/DataSourceTj.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询数据来源统计tc_sjlytj 列表 +export function listDataSourceTj(query) { + return request({ + url: '/tcZz/networkSecurity/DataSourceTj/list', + method: 'get', + params: query + }) +} + +// 查询数据来源统计tc_sjlytj 详细 +export function getDataSourceTj(id) { + return request({ + url: '/tcZz/networkSecurity/DataSourceTj/' + id, + method: 'get' + }) +} + +// 新增数据来源统计tc_sjlytj +export function addDataSourceTj(data) { + return request({ + url: '/tcZz/networkSecurity/DataSourceTj', + method: 'post', + data: data + }) +} + +// 修改数据来源统计tc_sjlytj +export function updateDataSourceTj(data) { + return request({ + url: '/tcZz/networkSecurity/DataSourceTj', + method: 'put', + data: data + }) +} + +// 删除数据来源统计tc_sjlytj +export function delDataSourceTj(id) { + return request({ + url: '/tcZz/networkSecurity/DataSourceTj/' + id, + method: 'delete' + }) +} diff --git a/src/assets/styles/diythem.scss b/src/assets/styles/diythem.scss new file mode 100644 index 0000000..42ba5de --- /dev/null +++ b/src/assets/styles/diythem.scss @@ -0,0 +1,183 @@ +@import "./element-variables.scss"; +.container-main { + height: calc(100vh - 84px); + overflow: hidden; + padding: 0 10px; + // 搜索部分 + .search-hearder { + padding: 12px 2px 8px 2px; + height: auto; + .el-form-item { + margin-bottom: 6px; + margin-right: 10px; + // lable + .el-form-item__label { + padding: 6px 12px 6px 10px; + font-weight: 400; + color: #333; + line-height: 20px; + } + // content + .el-form-item__content { + width: 180px; + // 输入框 + .el-input { + .el-input__inner { + border-radius: 0px; + } + } + } + } + } + // 表头操作按钮部分 + .layui-table-tool { + width: 100%; + min-height: 40px; + line-height: 30px; + padding: 6px 15px; + border-width: 0 0 1px; + border: 1px solid #e6e6e6; + border-bottom: 0; + background-color: #f2f2f2; + } + + // 表格 + .el-table .el-table__header-wrapper th { + font-size: 12px; + font-weight: 400; + // height: 35px; + color: #666; + background-color: #f2f2f2; + } + .el-table--medium .el-table__cell { + padding: 3px 0; + // height: 35px; + font-size: 12px; + color: #666; + } + + .el-table .fixed-width .el-button--mini { + font-size: 12px; + padding: 6px 6px; + width: inherit; + } + //分页 +} +// 弹窗 +.dialog-box { + .el-dialog__header { + padding: 0; + .dialog-title { + height: 50px; + line-height: 50px; + font-size: 14px; + color: white; + background-color: $--color-primary; + padding-left: 20px; + letter-spacing: 1px; + } + .el-dialog__headerbtn .el-dialog__close { + color: white; + } + } + .el-select,.el-date-editor{ + width: 100%; + } +} + +.dialog-from { + .el-form-item { + margin-bottom: 20px; + margin-right: 10px; + // lable + .el-form-item__label { + padding: 6px 12px 6px 10px; + font-weight: 400; + color: #333; + line-height: 20px; + } + // content + .el-form-item__content { + // 输入框 + .el-input { + .el-input__inner { + border-radius: 0px; + } + } + } + } +} +//确认框 +.el-message-box { + width: 300px; + .el-message-box__header { + border-bottom: 1px solid #f0f0f0; + } +} +//详情 +.Descriptions-box { + border: 1px solid #ddd; + border-right: 0; + border-bottom: 0; + .row-item { + width: 100%; + display: flex; + & > div { + padding: 10px 8px; + overflow: hidden; + font-size: 12px; + color: #333; + } + .row-lable { + width: 200px; + background-color: #f5f5f5; + border-bottom: 1px solid #ddd; + border-right: 1px solid #ddd; + font-weight: bold; + } + .row-value { + flex: 1; + border-bottom: 1px solid #ddd; + border-right: 1px solid #ddd; + } + } +} +// 按钮 +.el-button--mini { + padding: 7px 16px; + border-radius: 0; +} +.el-button { + border-radius: 0; +} +.dialog-footer { + display: flex; + justify-content: center; +} +.pagination-container { + // position: relative; + margin-bottom: 0px !important; + margin-top: 7px !important; + padding: 0 !important; +} + +// 详情 +.desLable { + width: 180px !important; +} + +.image-title { + margin: 10px 0; + font-size: 13px; + font-weight: bold; + color: #333; +} +.image-view { + border: 1px solid #e6ebf5; +} + +.dialog-box { + .pagination-container { + height: 10px; + } +} diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss index 2f3b9ef..74dc0cb 100644 --- a/src/assets/styles/index.scss +++ b/src/assets/styles/index.scss @@ -1,16 +1,18 @@ -@import './variables.scss'; -@import './mixin.scss'; -@import './transition.scss'; -@import './element-ui.scss'; -@import './sidebar.scss'; -@import './btn.scss'; +@import "./variables.scss"; +@import "./mixin.scss"; +@import "./transition.scss"; +@import "./element-ui.scss"; +@import "./sidebar.scss"; +@import "./btn.scss"; +@import "./diythem.scss"; body { height: 100%; -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; - font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif; + font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, + Microsoft YaHei, Arial, sans-serif; } label { @@ -104,7 +106,8 @@ aside { display: block; line-height: 32px; font-size: 16px; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, + Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; color: #2c3e50; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; @@ -130,11 +133,11 @@ aside { } .pagination-container { - margin-top: 30px; + // margin-top: 30px; } .text-center { - text-align: center + text-align: center; } .sub-navbar { @@ -145,7 +148,13 @@ aside { text-align: right; padding-right: 20px; transition: 600ms ease position; - background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%); + background: linear-gradient( + 90deg, + rgba(32, 182, 249, 1) 0%, + rgba(32, 182, 249, 1) 0%, + rgba(33, 120, 241, 1) 100%, + rgba(33, 120, 241, 1) 100% + ); .subtitle { font-size: 20px; diff --git a/src/assets/styles/ruoyi.scss b/src/assets/styles/ruoyi.scss index db8c29b..5af9aca 100644 --- a/src/assets/styles/ruoyi.scss +++ b/src/assets/styles/ruoyi.scss @@ -1,129 +1,141 @@ - /** +/** * 通用css样式布局处理 * Copyright (c) 2019 ruoyi */ - /** 基础通用 **/ +/** 基础通用 **/ .pt5 { - padding-top: 5px; + padding-top: 5px; } .pr5 { - padding-right: 5px; + padding-right: 5px; } .pb5 { - padding-bottom: 5px; + padding-bottom: 5px; } .mt5 { - margin-top: 5px; + margin-top: 5px; } .mr5 { - margin-right: 5px; + margin-right: 5px; } .mb5 { - margin-bottom: 5px; + margin-bottom: 5px; } .mb8 { - margin-bottom: 8px; + margin-bottom: 8px; } .ml5 { - margin-left: 5px; + margin-left: 5px; } .mt10 { - margin-top: 10px; + margin-top: 10px; } .mr10 { - margin-right: 10px; + margin-right: 10px; } .mb10 { - margin-bottom: 10px; + margin-bottom: 10px; } .ml10 { - margin-left: 10px; + margin-left: 10px; } .mt20 { - margin-top: 20px; + margin-top: 20px; } .mr20 { - margin-right: 20px; + margin-right: 20px; } .mb20 { - margin-bottom: 20px; + margin-bottom: 20px; } .ml20 { - margin-left: 20px; + margin-left: 20px; } -.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { - font-family: inherit; - font-weight: 500; - line-height: 1.1; - color: inherit; +.h1, +.h2, +.h3, +.h4, +.h5, +.h6, +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; } -.el-message-box__status + .el-message-box__message{ - word-break: break-word; +.el-message-box__status + .el-message-box__message { + word-break: break-word; } .el-dialog:not(.is-fullscreen) { - margin-top: 6vh !important; + margin-top: 6vh !important; } .el-dialog__wrapper.scrollbar .el-dialog .el-dialog__body { - overflow: auto; - overflow-x: hidden; - max-height: 70vh; - padding: 10px 20px 0; + overflow: auto; + overflow-x: hidden; + max-height: 70vh; + padding: 10px 20px 0; } .el-table { - .el-table__header-wrapper, .el-table__fixed-header-wrapper { - th { - word-break: break-word; - background-color: #f8f8f9; - color: #515a6e; - height: 40px; - font-size: 13px; - } - } - .el-table__body-wrapper { - .el-button [class*="el-icon-"] + span { - margin-left: 1px; - } - } + .el-table__header-wrapper, + .el-table__fixed-header-wrapper { + th { + word-break: break-word; + background-color: #f8f8f9; + color: #515a6e; + height: 40px; + font-size: 13px; + } + } + .el-table__body-wrapper { + .el-button [class*="el-icon-"] + span { + margin-left: 1px; + } + } } /** 表单布局 **/ .form-header { - font-size:15px; - color:#6379bb; - border-bottom:1px solid #ddd; - margin:8px 10px 25px 10px; - padding-bottom:5px + font-size: 15px; + color: #6379bb; + border-bottom: 1px solid #ddd; + margin: 8px 10px 25px 10px; + padding-bottom: 5px; } /** 表格布局 **/ .pagination-container { - position: relative; - height: 25px; - margin-bottom: 10px; - margin-top: 15px; - padding: 10px 20px !important; + position: relative; + // height: 25px; + // margin-bottom: 10px; + // margin-top: 15px; + // padding: 10px 20px !important; } /* tree border */ .tree-border { - margin-top: 5px; - border: 1px solid #e5e6e7; - background: #FFFFFF none; - border-radius:4px; + margin-top: 5px; + border: 1px solid #e5e6e7; + background: #ffffff none; + border-radius: 4px; } .pagination-container .el-pagination { - right: 0; - position: absolute; + right: 0; + position: absolute; } -@media ( max-width : 768px) { +@media (max-width: 768px) { .pagination-container .el-pagination > .el-pagination__jump { display: none !important; } @@ -133,145 +145,147 @@ } .el-table .fixed-width .el-button--mini { - padding-left: 0; - padding-right: 0; - width: inherit; + padding-left: 0; + padding-right: 0; + width: inherit; } /** 表格更多操作下拉样式 */ -.el-table .el-dropdown-link,.el-table .el-dropdown-selfdefine { - cursor: pointer; - margin-left: 5px; +.el-table .el-dropdown-link, +.el-table .el-dropdown-selfdefine { + cursor: pointer; + margin-left: 5px; } -.el-table .el-dropdown, .el-icon-arrow-down { - font-size: 12px; +.el-table .el-dropdown, +.el-icon-arrow-down { + font-size: 12px; } .el-tree-node__content > .el-checkbox { - margin-right: 8px; + margin-right: 8px; } .list-group-striped > .list-group-item { - border-left: 0; - border-right: 0; - border-radius: 0; - padding-left: 0; - padding-right: 0; + border-left: 0; + border-right: 0; + border-radius: 0; + padding-left: 0; + padding-right: 0; } .list-group { - padding-left: 0px; - list-style: none; + padding-left: 0px; + list-style: none; } .list-group-item { - border-bottom: 1px solid #e7eaec; - border-top: 1px solid #e7eaec; - margin-bottom: -1px; - padding: 11px 0px; - font-size: 13px; + border-bottom: 1px solid #e7eaec; + border-top: 1px solid #e7eaec; + margin-bottom: -1px; + padding: 11px 0px; + font-size: 13px; } .pull-right { - float: right !important; + float: right !important; } .el-card__header { - padding: 14px 15px 7px; - min-height: 40px; + padding: 14px 15px 7px; + min-height: 40px; } .el-card__body { - padding: 15px 20px 20px 20px; + padding: 15px 20px 20px 20px; } .card-box { - padding-right: 15px; - padding-left: 15px; - margin-bottom: 10px; + padding-right: 15px; + padding-left: 15px; + margin-bottom: 10px; } /* button color */ .el-button--cyan.is-active, .el-button--cyan:active { - background: #20B2AA; - border-color: #20B2AA; - color: #FFFFFF; + background: #20b2aa; + border-color: #20b2aa; + color: #ffffff; } .el-button--cyan:focus, .el-button--cyan:hover { - background: #48D1CC; - border-color: #48D1CC; - color: #FFFFFF; + background: #48d1cc; + border-color: #48d1cc; + color: #ffffff; } .el-button--cyan { - background-color: #20B2AA; - border-color: #20B2AA; - color: #FFFFFF; + background-color: #20b2aa; + border-color: #20b2aa; + color: #ffffff; } /* text color */ .text-navy { - color: #1ab394; + color: #1ab394; } .text-primary { - color: inherit; + color: inherit; } .text-success { - color: #1c84c6; + color: #1c84c6; } .text-info { - color: #23c6c8; + color: #23c6c8; } .text-warning { - color: #f8ac59; + color: #f8ac59; } .text-danger { - color: #ed5565; + color: #ed5565; } .text-muted { - color: #888888; + color: #888888; } /* image */ .img-circle { - border-radius: 50%; + border-radius: 50%; } .img-lg { - width: 120px; - height: 120px; + width: 120px; + height: 120px; } .avatar-upload-preview { - position: relative; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 200px; - height: 200px; - border-radius: 50%; - box-shadow: 0 0 4px #ccc; - overflow: hidden; + position: relative; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 200px; + height: 200px; + border-radius: 50%; + box-shadow: 0 0 4px #ccc; + overflow: hidden; } /* 拖拽列样式 */ -.sortable-ghost{ - opacity: .8; - color: #fff!important; - background: #42b983!important; +.sortable-ghost { + opacity: 0.8; + color: #fff !important; + background: #42b983 !important; } .top-right-btn { - position: relative; - float: right; + position: relative; + float: right; } diff --git a/src/main.js b/src/main.js index 13c6cf2..3ec7012 100644 --- a/src/main.js +++ b/src/main.js @@ -1,67 +1,88 @@ -import Vue from 'vue' +import Vue from "vue"; -import Cookies from 'js-cookie' +import Cookies from "js-cookie"; -import Element from 'element-ui' -import './assets/styles/element-variables.scss' +import Element from "element-ui"; +import "./assets/styles/element-variables.scss"; -import '@/assets/styles/index.scss' // global css -import '@/assets/styles/ruoyi.scss' // ruoyi css -import App from './App' -import store from './store' -import router from './router' -import directive from './directive' // directive -import plugins from './plugins' // plugins -import { download } from '@/utils/request' +import "@/assets/styles/index.scss"; // global css +import "@/assets/styles/ruoyi.scss"; // ruoyi css -import './assets/icons' // icon -import './permission' // permission control +Element.Dialog.props.closeOnClickModal.default = false; //模态框单击空白处不允许关闭 +// 带有斑马纹 +// Element.Table.props.stripe = { +// default: true, +// type: Boolean, +// }; + +// 带有边框 +Element.Table.props.border = { + default: true, + type: Boolean, +}; +import "@/utils/rem.js"; //计算rem基准 +import App from "./App"; +import store from "./store"; +import router from "./router"; +import directive from "./directive"; // directive +import plugins from "./plugins"; // plugins +import { download } from "@/utils/request"; + +import "./assets/icons"; // icon +import "./permission"; // permission control import { getDicts } from "@/api/system/dict/data"; import { getConfigKey } from "@/api/system/config"; -import { parseTime, resetForm, addDateRange, selectDictLabel, selectDictLabels, handleTree } from "@/utils/ruoyi"; +import { + parseTime, + resetForm, + addDateRange, + selectDictLabel, + selectDictLabels, + handleTree, +} from "@/utils/ruoyi"; // 分页组件 import Pagination from "@/components/Pagination"; // 自定义表格工具组件 -import RightToolbar from "@/components/RightToolbar" +import RightToolbar from "@/components/RightToolbar"; // 富文本组件 -import Editor from "@/components/Editor" +import Editor from "@/components/Editor"; // 文件上传组件 -import FileUpload from "@/components/FileUpload" +import FileUpload from "@/components/FileUpload"; // 图片上传组件 -import ImageUpload from "@/components/ImageUpload" +import ImageUpload from "@/components/ImageUpload"; // 图片预览组件 -import ImagePreview from "@/components/ImagePreview" +import ImagePreview from "@/components/ImagePreview"; // 字典标签组件 -import DictTag from '@/components/DictTag' +import DictTag from "@/components/DictTag"; // 头部标签组件 -import VueMeta from 'vue-meta' +import VueMeta from "vue-meta"; // 字典数据组件 -import DictData from '@/components/DictData' +import DictData from "@/components/DictData"; // 全局方法挂载 -Vue.prototype.getDicts = getDicts -Vue.prototype.getConfigKey = getConfigKey -Vue.prototype.parseTime = parseTime -Vue.prototype.resetForm = resetForm -Vue.prototype.addDateRange = addDateRange -Vue.prototype.selectDictLabel = selectDictLabel -Vue.prototype.selectDictLabels = selectDictLabels -Vue.prototype.download = download -Vue.prototype.handleTree = handleTree +Vue.prototype.getDicts = getDicts; +Vue.prototype.getConfigKey = getConfigKey; +Vue.prototype.parseTime = parseTime; +Vue.prototype.resetForm = resetForm; +Vue.prototype.addDateRange = addDateRange; +Vue.prototype.selectDictLabel = selectDictLabel; +Vue.prototype.selectDictLabels = selectDictLabels; +Vue.prototype.download = download; +Vue.prototype.handleTree = handleTree; // 全局组件挂载 -Vue.component('DictTag', DictTag) -Vue.component('Pagination', Pagination) -Vue.component('RightToolbar', RightToolbar) -Vue.component('Editor', Editor) -Vue.component('FileUpload', FileUpload) -Vue.component('ImageUpload', ImageUpload) -Vue.component('ImagePreview', ImagePreview) +Vue.component("DictTag", DictTag); +Vue.component("Pagination", Pagination); +Vue.component("RightToolbar", RightToolbar); +Vue.component("Editor", Editor); +Vue.component("FileUpload", FileUpload); +Vue.component("ImageUpload", ImageUpload); +Vue.component("ImagePreview", ImagePreview); -Vue.use(directive) -Vue.use(plugins) -Vue.use(VueMeta) -DictData.install() +Vue.use(directive); +Vue.use(plugins); +Vue.use(VueMeta); +DictData.install(); /** * If you don't want to use mock-server @@ -73,14 +94,14 @@ DictData.install() */ Vue.use(Element, { - size: Cookies.get('size') || 'medium' // set element-ui default size -}) + size: Cookies.get("size") || "medium", // set element-ui default size +}); -Vue.config.productionTip = false +Vue.config.productionTip = false; new Vue({ - el: '#app', + el: "#app", router, store, - render: h => h(App) -}) + render: (h) => h(App), +}); diff --git a/src/utils/rem.js b/src/utils/rem.js new file mode 100644 index 0000000..746d934 --- /dev/null +++ b/src/utils/rem.js @@ -0,0 +1,17 @@ +// rem等比适配配置文件 +// 基准大小 +const baseSize = 16; +// 设置 rem 函数 +function setRem() { + // 当前页面宽度相对于 1920宽的缩放比例,可根据自己需要修改。 + const scale = document.documentElement.clientWidth / 1920; + // 设置页面根节点字体大小(“Math.min(scale, 2)” 指最高放大比例为2,可根据实际业务需求调整) + document.documentElement.style.fontSize = + baseSize * Math.min(scale, 2) + "px"; +} +// 初始化 +setRem(); +// 改变浏览器窗口大小时重新设置 rem +window.onresize = function () { + setRem(); +}; diff --git a/src/views/tcZz/networkSecurity/DataSourceTj/index.vue b/src/views/tcZz/networkSecurity/DataSourceTj/index.vue new file mode 100644 index 0000000..f65972b --- /dev/null +++ b/src/views/tcZz/networkSecurity/DataSourceTj/index.vue @@ -0,0 +1,411 @@ + + + diff --git a/vue.config.js b/vue.config.js index f0cff54..87772cb 100644 --- a/vue.config.js +++ b/vue.config.js @@ -1,15 +1,21 @@ -'use strict' -const path = require('path') +"use strict"; +const path = require("path"); function resolve(dir) { - return path.join(__dirname, dir) + return path.join(__dirname, dir); } -const CompressionPlugin = require('compression-webpack-plugin') +const px2rem = require("postcss-px2rem"); //将项目中的px转成rem,以达到屏幕适配 +// 配置基本大小 +const postcss = px2rem({ + // 基准大小 baseSize,需要和rem.js中相同 + remUnit: 16, +}); +const CompressionPlugin = require("compression-webpack-plugin"); -const name = process.env.VUE_APP_TITLE || '若依管理系统' // 网页标题 +const name = process.env.VUE_APP_TITLE || "若依管理系统"; // 网页标题 -const port = process.env.port || process.env.npm_config_port || 80 // 端口 +const port = process.env.port || process.env.npm_config_port || 80; // 端口 // vue.config.js 配置说明 //官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions @@ -20,16 +26,16 @@ module.exports = { // 例如 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', + outputDir: "dist", // 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下) - assetsDir: 'static', + assetsDir: "static", // 是否开启eslint保存检测,有效值:ture | false | 'error' - lintOnSave: process.env.NODE_ENV === 'development', + lintOnSave: process.env.NODE_ENV === "development", // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。 productionSourceMap: false, // webpack-dev-server 相关配置 devServer: { - host: '0.0.0.0', + host: "0.0.0.0", port: port, open: true, proxy: { @@ -38,97 +44,100 @@ module.exports = { target: `http://localhost:8080`, changeOrigin: true, pathRewrite: { - ['^' + process.env.VUE_APP_BASE_API]: '' - } - } + ["^" + process.env.VUE_APP_BASE_API]: "", + }, + }, }, - disableHostCheck: true + disableHostCheck: true, }, css: { loaderOptions: { sass: { - sassOptions: { outputStyle: "expanded" } - } - } + sassOptions: { outputStyle: "expanded" }, + }, + // px to rem + postcss: { + plugins: [postcss], + }, + }, }, configureWebpack: { name: name, resolve: { alias: { - '@': resolve('src') - } + "@": resolve("src"), + }, }, plugins: [ // http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使用gzip解压缩静态文件 new CompressionPlugin({ - cache: false, // 不启用文件缓存 - test: /\.(js|css|html)?$/i, // 压缩文件格式 - filename: '[path].gz[query]', // 压缩后的文件名 - algorithm: 'gzip', // 使用gzip压缩 - minRatio: 0.8 // 压缩率小于1才会压缩 - }) + cache: false, // 不启用文件缓存 + test: /\.(js|css|html)?$/i, // 压缩文件格式 + filename: "[path].gz[query]", // 压缩后的文件名 + algorithm: "gzip", // 使用gzip压缩 + minRatio: 0.8, // 压缩率小于1才会压缩 + }), ], }, chainWebpack(config) { - config.plugins.delete('preload') // TODO: need test - config.plugins.delete('prefetch') // TODO: need test + 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('svg') - .exclude.add(resolve('src/assets/icons')) - .end() - config.module - .rule('icons') + .rule("icons") .test(/\.svg$/) - .include.add(resolve('src/assets/icons')) + .include.add(resolve("src/assets/icons")) .end() - .use('svg-sprite-loader') - .loader('svg-sprite-loader') + .use("svg-sprite-loader") + .loader("svg-sprite-loader") .options({ - symbolId: 'icon-[name]' + symbolId: "icon-[name]", }) - .end() + .end(); - config.when(process.env.NODE_ENV !== 'development', config => { - config - .plugin('ScriptExtHtmlWebpackPlugin') - .after('html') - .use('script-ext-html-webpack-plugin', [{ + 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() + 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 - test: /[\\/]node_modules[\\/]_?element-ui(.*)/, // in order to adapt to cnpm - priority: 20 // the weight needs to be larger than libs and app or it will be packaged into libs or app - }, - commons: { - name: 'chunk-commons', - test: resolve('src/components'), // can customize your rules - minChunks: 3, // minimum common number - priority: 5, - reuseExistingChunk: true - } - } - }) + 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 + test: /[\\/]node_modules[\\/]_?element-ui(.*)/, // in order to adapt to cnpm + priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app + }, + 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: './' //到根目录下 - } - }) - } -} + config.optimization.runtimeChunk("single"), + { + from: path.resolve(__dirname, "./public/robots.txt"), //防爬虫文件 + to: "./", //到根目录下 + }; + }); + }, +};