diff --git a/.editorconfig b/.editorconfig index 8cfd37094..672defc11 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,9 +10,6 @@ end_of_line = lf trim_trailing_whitespace = true insert_final_newline = true -[*.java] -indent_style = tab - [*.{json,yml}] indent_size = 2 diff --git a/README.md b/README.md index 778b901f4..a46023682 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/blob/master/LICENSE) [![使用IntelliJ IDEA开发维护](https://img.shields.io/badge/IntelliJ%20IDEA-提供支持-blue.svg)](https://www.jetbrains.com/?from=RuoYi-Vue-Plus)
-[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-3.0.0-success.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus) +[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-3.1.0-success.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus) [![Spring Boot](https://img.shields.io/badge/Spring%20Boot-2.5-blue.svg)]() [![JDK-8+](https://img.shields.io/badge/JDK-8+-green.svg)]() [![JDK-11](https://img.shields.io/badge/JDK-11-green.svg)]() diff --git a/docker/deploy.sh b/docker/deploy.sh index 79fb9ae5b..28822ecfd 100644 --- a/docker/deploy.sh +++ b/docker/deploy.sh @@ -22,11 +22,16 @@ port(){ ##放置挂载文件 mount(){ - #挂载配置文件 + #挂载 nginx 配置文件 if test ! -f "/docker/nginx/conf/nginx.conf" ;then mkdir -p /docker/nginx/conf cp nginx/nginx.conf /docker/nginx/conf/nginx.conf fi + #挂载 redis 配置文件 + if test ! -f "/docker/redis/conf/redis.conf" ;then + mkdir -p /docker/redis/conf + cp redis/redis.conf /docker/redis/conf/redis.conf + fi } #启动基础模块 diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 228ddbf29..1535f3d6f 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -65,10 +65,10 @@ services: TZ: Asia/Shanghai volumes: # 配置文件 - - /docker/redis/conf/redis.conf:/redis.conf:rw + - /docker/redis/conf:/redis/config:rw # 数据文件 - - /docker/redis/data:/data:rw - command: "redis-server --appendonly yes" + - /docker/redis/data:/redis/data:rw + command: "redis-server /redis/config/redis.conf --appendonly yes" privileged: true restart: always networks: @@ -77,7 +77,7 @@ services: minio: image: minio/minio:RELEASE.2021-07-08T01-15-01Z - hostname: "minio" + container_name: minio ports: # api 端口 - 9000:9000 @@ -103,14 +103,14 @@ services: ipv4_address: 172.30.0.54 ruoyi-server1: - image: "ruoyi/ruoyi-server:3.0.0" + image: "ruoyi/ruoyi-server:3.1.0" + container_name: ruoyi-server1 environment: # 时区上海 TZ: Asia/Shanghai volumes: # 配置文件 - /docker/server1/logs/:/ruoyi/server/logs/ - - /docker/ruoyi/uploadPath/:/ruoyi/server/ruoyi/uploadPath/ privileged: true restart: always networks: @@ -118,14 +118,14 @@ services: ipv4_address: 172.30.0.60 ruoyi-server2: - image: "ruoyi/ruoyi-server:3.0.0" + image: "ruoyi/ruoyi-server:3.1.0" + container_name: ruoyi-server2 environment: # 时区上海 TZ: Asia/Shanghai volumes: # 配置文件 - /docker/server2/logs/:/ruoyi/server/logs/ - - /docker/ruoyi/uploadPath/:/ruoyi/server/ruoyi/uploadPath/ privileged: true restart: always networks: @@ -133,7 +133,8 @@ services: ipv4_address: 172.30.0.61 ruoyi-monitor-admin: - image: "ruoyi/ruoyi-monitor-admin:3.0.0" + image: "ruoyi/ruoyi-monitor-admin:3.1.0" + container_name: ruoyi-monitor-admin environment: # 时区上海 TZ: Asia/Shanghai diff --git a/docker/nginx/nginx.conf b/docker/nginx/nginx.conf index 66ac29e3e..a511f351b 100644 --- a/docker/nginx/nginx.conf +++ b/docker/nginx/nginx.conf @@ -22,6 +22,7 @@ http { access_log /var/log/nginx/access.log main; upstream server { + ip_hash; server 172.30.0.60:8080; server 172.30.0.61:8080; } diff --git a/docker/redis/redis.conf b/docker/redis/redis.conf new file mode 100644 index 000000000..213e9ba9e --- /dev/null +++ b/docker/redis/redis.conf @@ -0,0 +1,2 @@ +# redis 密码 +# requirepass 123456 \ No newline at end of file diff --git a/pom.xml b/pom.xml index e0866bdad..75f36375c 100644 --- a/pom.xml +++ b/pom.xml @@ -6,40 +6,40 @@ com.ruoyi ruoyi-vue-plus - 3.0.0 + 3.1.0 RuoYi-Vue-Plus https://gitee.com/JavaLionLi/RuoYi-Vue-Plus RuoYi-Vue-Plus后台管理系统 - 3.0.0 - 2.5.3 + 3.1.0 + 2.5.4 UTF-8 UTF-8 1.8 - 3.1.1 + 3.2.0 1.2.6 3.0.3 4.1.2 2.2.10 1.7 0.9.1 - 3.4.3 + 3.4.3.3 3.9.1 - 5.7.7 + 5.7.11 3.0.3 - 11.2 + 11.6 4.9.1 - 2.5.0 - 3.16.1 + 2.5.1 + 3.16.2 2.2.1 3.4.1 7.8.0 - 3.13.0 - 5.6.47 + 3.13.1 + 5.6.51 8.3.0 diff --git a/ruoyi-extend/pom.xml b/ruoyi-extend/pom.xml index 3bfe77021..2a348af4a 100644 --- a/ruoyi-extend/pom.xml +++ b/ruoyi-extend/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 3.0.0 + 3.1.0 4.0.0 ruoyi-extend diff --git a/ruoyi-extend/ruoyi-monitor-admin/pom.xml b/ruoyi-extend/ruoyi-monitor-admin/pom.xml index bada747b4..dc0830373 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/pom.xml +++ b/ruoyi-extend/ruoyi-monitor-admin/pom.xml @@ -5,7 +5,7 @@ ruoyi-extend com.ruoyi - 3.0.0 + 3.1.0 4.0.0 jar diff --git a/ruoyi-ui/package.json b/ruoyi-ui/package.json index 604d964c3..58a8c790e 100644 --- a/ruoyi-ui/package.json +++ b/ruoyi-ui/package.json @@ -1,6 +1,6 @@ { "name": "ruoyi-vue-plus", - "version": "3.0.0", + "version": "3.1.0", "description": "RuoYi-Vue-Plus后台管理系统", "author": "LionLi", "license": "MIT", diff --git a/ruoyi-ui/src/api/login.js b/ruoyi-ui/src/api/login.js index 8b5b6cf22..abd49c7de 100644 --- a/ruoyi-ui/src/api/login.js +++ b/ruoyi-ui/src/api/login.js @@ -47,6 +47,7 @@ export function logout() { export function getCodeImg() { return request({ url: '/captchaImage', - method: 'get' + method: 'get', + timeout: 20000 }) -} +} \ No newline at end of file diff --git a/ruoyi-ui/src/assets/styles/ruoyi.scss b/ruoyi-ui/src/assets/styles/ruoyi.scss index c4b43658f..8fe1961b2 100644 --- a/ruoyi-ui/src/assets/styles/ruoyi.scss +++ b/ruoyi-ui/src/assets/styles/ruoyi.scss @@ -60,10 +60,17 @@ color: inherit; } -.el-dialog:not(.is-fullscreen){ +.el-dialog:not(.is-fullscreen) { 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; +} + .el-table { .el-table__header-wrapper, .el-table__fixed-header-wrapper { th { @@ -130,7 +137,7 @@ /** 表格更多操作下拉样式 */ .el-table .el-dropdown-link { cursor: pointer; - color: #1890ff; + color: #409EFF; margin-left: 5px; } diff --git a/ruoyi-ui/src/assets/styles/sidebar.scss b/ruoyi-ui/src/assets/styles/sidebar.scss index 2f368c3dd..d2a7453f3 100644 --- a/ruoyi-ui/src/assets/styles/sidebar.scss +++ b/ruoyi-ui/src/assets/styles/sidebar.scss @@ -3,15 +3,15 @@ .main-container { min-height: 100%; transition: margin-left .28s; - margin-left: $sideBarWidth; + margin-left: $base-sidebar-width; position: relative; } .sidebar-container { -webkit-transition: width .28s; transition: width 0.28s; - width: $sideBarWidth !important; - background-color: $menuBg; + width: $base-sidebar-width !important; + background-color: $base-menu-background; height: 100%; position: fixed; font-size: 0px; @@ -81,12 +81,12 @@ } & .theme-dark .is-active > .el-submenu__title { - color: $subMenuActiveText !important; + color: $base-menu-color-active !important; } & .nest-menu .el-submenu>.el-submenu__title, & .el-submenu .el-menu-item { - min-width: $sideBarWidth !important; + min-width: $base-sidebar-width !important; &:hover { background-color: rgba(0, 0, 0, 0.06) !important; @@ -95,10 +95,10 @@ & .theme-dark .nest-menu .el-submenu>.el-submenu__title, & .theme-dark .el-submenu .el-menu-item { - background-color: $subMenuBg !important; + background-color: $base-sub-menu-background !important; &:hover { - background-color: $subMenuHover !important; + background-color: $base-sub-menu-hover !important; } } } @@ -154,7 +154,7 @@ } .el-menu--collapse .el-menu .el-submenu { - min-width: $sideBarWidth !important; + min-width: $base-sidebar-width !important; } // mobile responsive @@ -165,14 +165,14 @@ .sidebar-container { transition: transform .28s; - width: $sideBarWidth !important; + width: $base-sidebar-width !important; } &.hideSidebar { .sidebar-container { pointer-events: none; transition-duration: 0.3s; - transform: translate3d(-$sideBarWidth, 0, 0); + transform: translate3d(-$base-sidebar-width, 0, 0); } } } diff --git a/ruoyi-ui/src/assets/styles/variables.scss b/ruoyi-ui/src/assets/styles/variables.scss index 452a1ece0..34484d47e 100644 --- a/ruoyi-ui/src/assets/styles/variables.scss +++ b/ruoyi-ui/src/assets/styles/variables.scss @@ -8,37 +8,47 @@ $tiffany: #4AB7BD; $yellow:#FEC171; $panGreen: #30B08F; -// sidebar -$menuText:#bfcbd9; -$menuActiveText:#409EFF; -$subMenuActiveText:#f4f4f5; // https://github.com/ElemeFE/element/issues/12951 +// 默认菜单主题风格 +$base-menu-color:#bfcbd9; +$base-menu-color-active:#f4f4f5; +$base-menu-background:#304156; +$base-logo-title-color: #ffffff; -$menuBg:#304156; -$menuHover:#263445; -$sidebarTitle: #ffffff; +$base-menu-light-color:rgba(0,0,0,.70); +$base-menu-light-background:#ffffff; +$base-logo-light-title-color: #001529; -$menuLightBg:#ffffff; -$menuLightHover:#f0f1f5; -$sidebarLightTitle: #001529; +$base-sub-menu-background:#1f2d3d; +$base-sub-menu-hover:#001528; -$subMenuBg:#1f2d3d; -$subMenuHover:#001528; +// 自定义暗色菜单风格 +/** +$base-menu-color:hsla(0,0%,100%,.65); +$base-menu-color-active:#fff; +$base-menu-background:#001529; +$base-logo-title-color: #ffffff; -$sideBarWidth: 200px; +$base-menu-light-color:rgba(0,0,0,.70); +$base-menu-light-background:#ffffff; +$base-logo-light-title-color: #001529; + +$base-sub-menu-background:#000c17; +$base-sub-menu-hover:#001528; +*/ + +$base-sidebar-width: 200px; // the :export directive is the magic sauce for webpack // https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass :export { - menuText: $menuText; - menuActiveText: $menuActiveText; - subMenuActiveText: $subMenuActiveText; - menuBg: $menuBg; - menuHover: $menuHover; - menuLightBg: $menuLightBg; - menuLightHover: $menuLightHover; - subMenuBg: $subMenuBg; - subMenuHover: $subMenuHover; - sideBarWidth: $sideBarWidth; - sidebarTitle: $sidebarTitle; - sidebarLightTitle: $sidebarLightTitle + menuColor: $base-menu-color; + menuLightColor: $base-menu-light-color; + menuColorActive: $base-menu-color-active; + menuBackground: $base-menu-background; + menuLightBackground: $base-menu-light-background; + subMenuBackground: $base-sub-menu-background; + subMenuHover: $base-sub-menu-hover; + sideBarWidth: $base-sidebar-width; + logoTitleColor: $base-logo-title-color; + logoLightTitleColor: $base-logo-light-title-color } diff --git a/ruoyi-ui/src/components/Crontab/day.vue b/ruoyi-ui/src/components/Crontab/day.vue new file mode 100644 index 000000000..9a38a1ca9 --- /dev/null +++ b/ruoyi-ui/src/components/Crontab/day.vue @@ -0,0 +1,179 @@ + + + \ No newline at end of file diff --git a/ruoyi-ui/src/components/Crontab/hour.vue b/ruoyi-ui/src/components/Crontab/hour.vue new file mode 100644 index 000000000..50833fc19 --- /dev/null +++ b/ruoyi-ui/src/components/Crontab/hour.vue @@ -0,0 +1,122 @@ + + + \ No newline at end of file diff --git a/ruoyi-ui/src/components/Crontab/index.vue b/ruoyi-ui/src/components/Crontab/index.vue new file mode 100644 index 000000000..629bad7a7 --- /dev/null +++ b/ruoyi-ui/src/components/Crontab/index.vue @@ -0,0 +1,425 @@ + + + + diff --git a/ruoyi-ui/src/components/Crontab/min.vue b/ruoyi-ui/src/components/Crontab/min.vue new file mode 100644 index 000000000..bd12ab597 --- /dev/null +++ b/ruoyi-ui/src/components/Crontab/min.vue @@ -0,0 +1,120 @@ + + + \ No newline at end of file diff --git a/ruoyi-ui/src/components/Crontab/mouth.vue b/ruoyi-ui/src/components/Crontab/mouth.vue new file mode 100644 index 000000000..7d0e0c84a --- /dev/null +++ b/ruoyi-ui/src/components/Crontab/mouth.vue @@ -0,0 +1,128 @@ + + + \ No newline at end of file diff --git a/ruoyi-ui/src/components/Crontab/result.vue b/ruoyi-ui/src/components/Crontab/result.vue new file mode 100644 index 000000000..0e75b9ee2 --- /dev/null +++ b/ruoyi-ui/src/components/Crontab/result.vue @@ -0,0 +1,566 @@ + + + \ No newline at end of file diff --git a/ruoyi-ui/src/components/Crontab/second.vue b/ruoyi-ui/src/components/Crontab/second.vue new file mode 100644 index 000000000..0776e7597 --- /dev/null +++ b/ruoyi-ui/src/components/Crontab/second.vue @@ -0,0 +1,133 @@ + + + \ No newline at end of file diff --git a/ruoyi-ui/src/components/Crontab/week.vue b/ruoyi-ui/src/components/Crontab/week.vue new file mode 100644 index 000000000..cb4c542ba --- /dev/null +++ b/ruoyi-ui/src/components/Crontab/week.vue @@ -0,0 +1,167 @@ + + + \ No newline at end of file diff --git a/ruoyi-ui/src/components/Crontab/year.vue b/ruoyi-ui/src/components/Crontab/year.vue new file mode 100644 index 000000000..8cb886f76 --- /dev/null +++ b/ruoyi-ui/src/components/Crontab/year.vue @@ -0,0 +1,144 @@ + + + \ No newline at end of file diff --git a/ruoyi-ui/src/components/DictTag/index.vue b/ruoyi-ui/src/components/DictTag/index.vue index 7431bbb34..742f38c0c 100644 --- a/ruoyi-ui/src/components/DictTag/index.vue +++ b/ruoyi-ui/src/components/DictTag/index.vue @@ -31,12 +31,12 @@ export default { type: Array, default: null, }, - value: [String, Array], + value: [Number, String, Array], }, computed: { values() { - if (this.value) { - return Array.isArray(this.value) ? this.value : [this.value]; + if (this.value !== null && typeof this.value !== 'undefined') { + return Array.isArray(this.value) ? this.value : [String(this.value)]; } else { return []; } diff --git a/ruoyi-ui/src/components/ThemePicker/index.vue b/ruoyi-ui/src/components/ThemePicker/index.vue index b0df471ca..5589f5fff 100644 --- a/ruoyi-ui/src/components/ThemePicker/index.vue +++ b/ruoyi-ui/src/components/ThemePicker/index.vue @@ -31,13 +31,24 @@ export default { immediate: true }, async theme(val) { + await this.setTheme(val) + } + }, + created() { + if(this.defaultTheme !== ORIGINAL_THEME) { + this.setTheme(this.defaultTheme) + } + }, + + methods: { + async setTheme(val) { const oldVal = this.chalk ? this.theme : ORIGINAL_THEME if (typeof val !== 'string') return const themeCluster = this.getThemeCluster(val.replace('#', '')) const originalCluster = this.getThemeCluster(oldVal.replace('#', '')) const $message = this.$message({ - message: ' Compiling the theme', + message: ' 正在切换主题,请稍后...', customClass: 'theme-message', type: 'success', duration: 0, @@ -82,10 +93,9 @@ export default { this.$emit('change', val) $message.close() - } - }, - methods: { + }, + updateStyle(style, oldCluster, newCluster) { let newStyle = style oldCluster.forEach((color, index) => { diff --git a/ruoyi-ui/src/directive/dialog/dragHeight.js b/ruoyi-ui/src/directive/dialog/dragHeight.js new file mode 100644 index 000000000..d1590f8df --- /dev/null +++ b/ruoyi-ui/src/directive/dialog/dragHeight.js @@ -0,0 +1,34 @@ +/** +* v-dialogDragWidth 可拖动弹窗高度(右下角) +* Copyright (c) 2019 ruoyi +*/ + +export default { + bind(el) { + const dragDom = el.querySelector('.el-dialog'); + const lineEl = document.createElement('div'); + lineEl.style = 'width: 6px; background: inherit; height: 10px; position: absolute; right: 0; bottom: 0; margin: auto; z-index: 1; cursor: nwse-resize;'; + lineEl.addEventListener('mousedown', + function(e) { + // 鼠标按下,计算当前元素距离可视区的距离 + const disX = e.clientX - el.offsetLeft; + const disY = e.clientY - el.offsetTop; + // 当前宽度 高度 + const curWidth = dragDom.offsetWidth; + const curHeight = dragDom.offsetHeight; + document.onmousemove = function(e) { + e.preventDefault(); // 移动时禁用默认事件 + // 通过事件委托,计算移动的距离 + const xl = e.clientX - disX; + const yl = e.clientY - disY + dragDom.style.width = `${curWidth + xl}px`; + dragDom.style.height = `${curHeight + yl}px`; + }; + document.onmouseup = function(e) { + document.onmousemove = null; + document.onmouseup = null; + }; + }, false); + dragDom.appendChild(lineEl); + } +} \ No newline at end of file diff --git a/ruoyi-ui/src/directive/dialog/dragWidth.js b/ruoyi-ui/src/directive/dialog/dragWidth.js new file mode 100644 index 000000000..d5cda3adb --- /dev/null +++ b/ruoyi-ui/src/directive/dialog/dragWidth.js @@ -0,0 +1,30 @@ +/** +* v-dialogDragWidth 可拖动弹窗宽度(右侧边) +* Copyright (c) 2019 ruoyi +*/ + +export default { + bind(el) { + const dragDom = el.querySelector('.el-dialog'); + const lineEl = document.createElement('div'); + lineEl.style = 'width: 5px; background: inherit; height: 80%; position: absolute; right: 0; top: 0; bottom: 0; margin: auto; z-index: 1; cursor: w-resize;'; + lineEl.addEventListener('mousedown', + function (e) { + // 鼠标按下,计算当前元素距离可视区的距离 + const disX = e.clientX - el.offsetLeft; + // 当前宽度 + const curWidth = dragDom.offsetWidth; + document.onmousemove = function (e) { + e.preventDefault(); // 移动时禁用默认事件 + // 通过事件委托,计算移动的距离 + const l = e.clientX - disX; + dragDom.style.width = `${curWidth + l}px`; + }; + document.onmouseup = function (e) { + document.onmousemove = null; + document.onmouseup = null; + }; + }, false); + dragDom.appendChild(lineEl); + } +} \ No newline at end of file diff --git a/ruoyi-ui/src/directive/index.js b/ruoyi-ui/src/directive/index.js index 550109b4d..5801640a1 100644 --- a/ruoyi-ui/src/directive/index.js +++ b/ruoyi-ui/src/directive/index.js @@ -1,17 +1,20 @@ import hasRole from './permission/hasRole' import hasPermi from './permission/hasPermi' import dialogDrag from './dialog/drag' +import dialogDragWidth from './dialog/dragWidth' +import dialogDragHeight from './dialog/dragHeight' const install = function(Vue) { Vue.directive('hasRole', hasRole) Vue.directive('hasPermi', hasPermi) Vue.directive('dialogDrag', dialogDrag) + Vue.directive('dialogDragWidth', dialogDragWidth) + Vue.directive('dialogDragHeight', dialogDragHeight) } if (window.Vue) { window['hasRole'] = hasRole window['hasPermi'] = hasPermi - window['dialogDrag'] = dialogDrag Vue.use(install); // eslint-disable-line } diff --git a/ruoyi-ui/src/layout/components/Navbar.vue b/ruoyi-ui/src/layout/components/Navbar.vue index 466cd981e..69656f019 100644 --- a/ruoyi-ui/src/layout/components/Navbar.vue +++ b/ruoyi-ui/src/layout/components/Navbar.vue @@ -56,6 +56,7 @@ import SizeSelect from '@/components/SizeSelect' import Search from '@/components/HeaderSearch' import RuoYiGit from '@/components/RuoYi/Git' import RuoYiDoc from '@/components/RuoYi/Doc' +import config from '@/../vue.config' export default { components: { @@ -102,7 +103,7 @@ export default { type: 'warning' }).then(() => { this.$store.dispatch('LogOut').then(() => { - location.href = '/index'; + location.href = config.publicPath + 'index'; }) }).catch(() => {}); } diff --git a/ruoyi-ui/src/layout/components/Sidebar/Logo.vue b/ruoyi-ui/src/layout/components/Sidebar/Logo.vue index 0de00ce14..416968737 100644 --- a/ruoyi-ui/src/layout/components/Sidebar/Logo.vue +++ b/ruoyi-ui/src/layout/components/Sidebar/Logo.vue @@ -1,13 +1,13 @@