diff --git a/package.json b/package.json index 271d6e6..d37f0f7 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,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/assets/styles/diythem.scss b/src/assets/styles/diythem.scss new file mode 100644 index 0000000..edee0d6 --- /dev/null +++ b/src/assets/styles/diythem.scss @@ -0,0 +1,160 @@ +@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; + } + } +} + +.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; + +} diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss index 855bd16..f8edd96 100644 --- a/src/assets/styles/index.scss +++ b/src/assets/styles/index.scss @@ -4,6 +4,7 @@ @import './element-ui.scss'; @import './sidebar.scss'; @import './btn.scss'; +@import "./diythem.scss"; body { margin: 0; @@ -131,7 +132,7 @@ aside { } .pagination-container { - margin-top: 30px; + // margin-top: 30px; } .text-center { diff --git a/src/assets/styles/ruoyi.scss b/src/assets/styles/ruoyi.scss index db8c29b..3551013 100644 --- a/src/assets/styles/ruoyi.scss +++ b/src/assets/styles/ruoyi.scss @@ -104,10 +104,10 @@ /** 表格布局 **/ .pagination-container { position: relative; - height: 25px; - margin-bottom: 10px; - margin-top: 15px; - padding: 10px 20px !important; + // height: 25px; + // margin-bottom: 10px; + // margin-top: 15px; + // padding: 10px 20px !important; } /* tree border */ diff --git a/src/main.js b/src/main.js index 102ce2b..75f3fce 100644 --- a/src/main.js +++ b/src/main.js @@ -4,6 +4,19 @@ import Cookies from 'js-cookie' import Element from 'element-ui' import './assets/styles/element-variables.scss' +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 '@/assets/styles/index.scss' // global css import '@/assets/styles/ruoyi.scss' // ruoyi css diff --git a/src/settings.js b/src/settings.js index 6a0b09f..8852458 100644 --- a/src/settings.js +++ b/src/settings.js @@ -22,7 +22,7 @@ module.exports = { /** * 是否固定头部 */ - fixedHeader: false, + fixedHeader: true, /** * 是否显示logo 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/index.vue b/src/views/index.vue index 8d62a3e..2e02021 100644 --- a/src/views/index.vue +++ b/src/views/index.vue @@ -1,19 +1,530 @@ \ No newline at end of file + + diff --git a/vue.config.js b/vue.config.js index f67a8d0..711724a 100644 --- a/vue.config.js +++ b/vue.config.js @@ -4,6 +4,12 @@ const path = require('path') function resolve(dir) { return path.join(__dirname, dir) } +const px2rem = require("postcss-px2rem"); //将项目中的px转成rem,以达到屏幕适配 +// 配置基本大小 +const postcss = px2rem({ + // 基准大小 baseSize,需要和rem.js中相同 + remUnit: 16, +}); const CompressionPlugin = require('compression-webpack-plugin') @@ -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: "./", //到根目录下 + }; + }); + }, +};