From 88e29ed5854ed9e62b719e4804958206c5fd9db1 Mon Sep 17 00:00:00 2001 From: fuliqi <fuliqi@qq.com> Date: 星期五, 22 十一月 2024 19:30:38 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- src/assets/styles/mixin.scss | 14 src/views/index.vue | 1413 ++++------------- src/assets/styles/index.scss | 58 src/assets/styles/btn.scss | 20 src/layout/components/Navbar.vue | 409 ++- src/utils/ruoyi.js | 30 src/layout/components/Notice/index.vue | 155 + src/layout/index.vue | 149 + src/assets/styles/variables.module.scss | 2 src/assets/styles/ruoyi.scss | 114 src/views/components/noticeTable.vue | 183 ++ src/layout/components/Sidebar/index.vue | 71 src/layout/components/TopBar/search.vue | 157 + src/assets/styles/variables.scss | 2 src/assets/styles/sidebar.scss | 126 src/assets/styles/element-ui.scss | 117 + src/assets/styles/transition.scss | 6 src/settings.js | 2 src/layout/components/TagsView/index.vue | 629 ++++--- src/utils/validate.js | 4 src/views/login.vue | 651 +++--- src/main.js | 16 src/components/TopNav/index.vue | 2 src/views/components/tidingsTable.vue | 283 +++ src/api/message/index.js | 50 src/views/components/projectOverview.vue | 308 +++ 26 files changed, 2,861 insertions(+), 2,110 deletions(-) diff --git a/src/api/message/index.js b/src/api/message/index.js new file mode 100644 index 0000000..2f6c537 --- /dev/null +++ b/src/api/message/index.js @@ -0,0 +1,50 @@ +import request from '@/utils/request'; +import { + AxiosPromise +} from 'axios'; + +// 鑾峰彇娑堟伅璇︽儏 +export function getMessage(params) { + return request({ + url: '/audit-message', + method: 'get', + params: params + }); +} + +//娑堟伅鏁伴噺 +export function getMessageCount() { + return request({ + url: '/message-count', + method: 'get' + }); +} + +//鑾峰彇闃呰 +export function getRead(id) { + return request({ + url: '/read-message', + method: 'get', + params: { + id + } + }); +} + +//浠e姙 +export function getTodo(params) { + return request({ + url: '/getPageByAllTaskWait', + method: 'get', + params: params + }); +} + +// 寮傚父椤圭洰缁熻 +export function getCountExceptionProject(params) { + return request({ + url: '/countExceptionProject', + method: 'get', + params: params + }); +} diff --git a/src/assets/styles/btn.scss b/src/assets/styles/btn.scss index e6ba1a8..6ceb1e6 100644 --- a/src/assets/styles/btn.scss +++ b/src/assets/styles/btn.scss @@ -1,4 +1,4 @@ -@import './variables.scss'; +@import './variables.module.scss'; @mixin colorBtn($color) { background: $color; @@ -14,35 +14,35 @@ } .blue-btn { - @include colorBtn($blue) + @include colorBtn($blue); } .light-blue-btn { - @include colorBtn($light-blue) + @include colorBtn($light-blue); } .red-btn { - @include colorBtn($red) + @include colorBtn($red); } .pink-btn { - @include colorBtn($pink) + @include colorBtn($pink); } .green-btn { - @include colorBtn($green) + @include colorBtn($green); } .tiffany-btn { - @include colorBtn($tiffany) + @include colorBtn($tiffany); } .yellow-btn { - @include colorBtn($yellow) + @include colorBtn($yellow); } .pan-btn { - font-size: 14px; + font-size: 12px; color: #fff; padding: 14px 36px; border-radius: 8px; @@ -94,6 +94,6 @@ outline: 0; margin: 0; padding: 10px 15px; - font-size: 14px; + font-size: 12px; border-radius: 4px; } diff --git a/src/assets/styles/element-ui.scss b/src/assets/styles/element-ui.scss index c3102f4..3aa5514 100644 --- a/src/assets/styles/element-ui.scss +++ b/src/assets/styles/element-ui.scss @@ -1,4 +1,20 @@ -// cover some element-ui styles + +.el-collapse { + .collapse__title { + font-weight: 600; + padding: 0 8px; + font-size: 1.2em; + line-height: 1.1em; + } + .el-collapse-item__content { + padding: 0 8px; + } +} + +.el-divider--horizontal { + margin-bottom: 10px; + margin-top: 10px; +} .el-breadcrumb__inner, .el-breadcrumb__inner a { @@ -6,7 +22,7 @@ } .el-upload { - input[type="file"] { + input[type='file'] { display: none !important; } } @@ -46,12 +62,37 @@ } } -// to fixed https://github.com/ElemeFE/element/issues/2461 -.el-dialog { - transform: none; - left: 0; - position: relative; - margin: 0 auto; +/*-------------Dialog-------------**/ +.el-overlay { + overflow: hidden; + + .el-overlay-dialog { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + + .el-dialog { + margin: 0 auto !important; + + .el-dialog__body { + padding: 15px !important; + } + .el-dialog__header { + padding: 16px 16px 8px 16px; + box-sizing: border-box; + border-bottom: 1px solid var(--brder-color); + margin-right: 0; + } + } + } +} + +.el-dialog__body { + max-height: calc(90vh - 111px) !important; + overflow-y: auto; + overflow-x: hidden; } // refine element ui upload @@ -69,7 +110,7 @@ // dropdown .el-dropdown-menu { a { - display: block + display: block; } } @@ -83,19 +124,57 @@ box-sizing: content-box; } -.el-menu--collapse - > div - > .el-submenu - > .el-submenu__title - .el-submenu__icon-arrow { +.el-menu--collapse > div > .el-submenu > .el-submenu__title .el-submenu__icon-arrow { display: none; } - -.el-tabs--border-card > .el-tabs__content { - padding: 0; +.el-dropdown .el-dropdown-link { + color: var(--el-color-primary) !important; } -.search-bar .el-button { - height: 32px; + +/* 褰� el-form 鐨� inline 灞炴�т负 true 鏃� */ +/* 璁剧疆 label 鐨勫搴﹂粯璁や负 68px */ +.el-form--inline .el-form-item__label { + width: 68px; +} + +/* 璁剧疆 el-select 鐨勫搴﹂粯璁や负 240px */ +.el-form--inline .el-select { + width: 240px; +} + +/* 璁剧疆 el-input 鐨勫搴﹂粯璁や负 240px */ +.el-form--inline .el-input { + width: 240px; +} + +// 寮圭獥鍏ㄥ眬鏍峰紡 +.el-dialog__header { + height: 55px; + line-height: 55px; + margin-bottom: 0px !important; + border-bottom: 1px solid #e6f2fd; + padding-top: 0 !important; + justify-content: space-between; +} +.el-dialog__header > :first-child { + flex: none !important; + border-bottom: 2px solid #0068ff; + color: #333333; +} + +// 鍙充晶寮圭獥鍏ㄥ眬鏍峰紡 +.el-drawer__header { + height: 55px; + line-height: 55px; + margin-bottom: 0px !important; + border-bottom: 1px solid #e6f2fd; + padding-top: 0 !important; + justify-content: space-between; +} +.el-drawer__header > :first-child { + flex: none !important; + border-bottom: 2px solid #0068ff; + color: #333333; } diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss index 2f3b9ef..61bf7ef 100644 --- a/src/assets/styles/index.scss +++ b/src/assets/styles/index.scss @@ -1,25 +1,41 @@ -@import './variables.scss'; +@import './variables.module.scss'; @import './mixin.scss'; @import './transition.scss'; @import './element-ui.scss'; @import './sidebar.scss'; @import './btn.scss'; +@import './ruoyi.scss'; +// @import 'animate.css'; +// @import 'element-plus/dist/index.css'; +:root{--el-color-white:#ffffff;--el-color-black:#000000;--el-color-primary-rgb:64,158,255;--el-color-success-rgb:103,194,58;--el-color-warning-rgb:230,162,60;--el-color-danger-rgb:245,108,108;--el-color-error-rgb:245,108,108;--el-color-info-rgb:144,147,153;--el-font-size-extra-large:20px;--el-font-size-large:18px;--el-font-size-medium:16px;--el-font-size-base:14px;--el-font-size-small:13px;--el-font-size-extra-small:12px;--el-font-family:"Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","寰蒋闆呴粦",Arial,sans-serif;--el-font-weight-primary:500;--el-font-line-height-primary:24px;--el-index-normal:1;--el-index-top:1000;--el-index-popper:2000;--el-border-radius-base:4px;--el-border-radius-small:2px;--el-border-radius-round:20px;--el-border-radius-circle:100%;--el-transition-duration:0.3s;--el-transition-duration-fast:0.2s;--el-transition-function-ease-in-out-bezier:cubic-bezier(0.645,0.045,0.355,1);--el-transition-function-fast-bezier:cubic-bezier(0.23,1,0.32,1);--el-transition-all:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier);--el-transition-fade:opacity var(--el-transition-duration) var(--el-transition-function-fast-bezier);--el-transition-md-fade:transform var(--el-transition-duration) var(--el-transition-function-fast-bezier),opacity var(--el-transition-duration) var(--el-transition-function-fast-bezier);--el-transition-fade-linear:opacity var(--el-transition-duration-fast) linear;--el-transition-border:border-color var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-transition-box-shadow:box-shadow var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-transition-color:color var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-component-size-large:40px;--el-component-size:32px;--el-component-size-small:24px;color-scheme:light;--el-color-primary:#409eff;--el-color-primary-light-3:#79bbff;--el-color-primary-light-5:#a0cfff;--el-color-primary-light-7:#c6e2ff;--el-color-primary-light-8:#d9ecff;--el-color-primary-light-9:#ecf5ff;--el-color-primary-dark-2:#337ecc;--el-color-success:#67c23a;--el-color-success-light-3:#95d475;--el-color-success-light-5:#b3e19d;--el-color-success-light-7:#d1edc4;--el-color-success-light-8:#e1f3d8;--el-color-success-light-9:#f0f9eb;--el-color-success-dark-2:#529b2e;--el-color-warning:#e6a23c;--el-color-warning-light-3:#eebe77;--el-color-warning-light-5:#f3d19e;--el-color-warning-light-7:#f8e3c5;--el-color-warning-light-8:#faecd8;--el-color-warning-light-9:#fdf6ec;--el-color-warning-dark-2:#b88230;--el-color-danger:#f56c6c;--el-color-danger-light-3:#f89898;--el-color-danger-light-5:#fab6b6;--el-color-danger-light-7:#fcd3d3;--el-color-danger-light-8:#fde2e2;--el-color-danger-light-9:#fef0f0;--el-color-danger-dark-2:#c45656;--el-color-error:#f56c6c;--el-color-error-light-3:#f89898;--el-color-error-light-5:#fab6b6;--el-color-error-light-7:#fcd3d3;--el-color-error-light-8:#fde2e2;--el-color-error-light-9:#fef0f0;--el-color-error-dark-2:#c45656;--el-color-info:#909399;--el-color-info-light-3:#b1b3b8;--el-color-info-light-5:#c8c9cc;--el-color-info-light-7:#dedfe0;--el-color-info-light-8:#e9e9eb;--el-color-info-light-9:#f4f4f5;--el-color-info-dark-2:#73767a;--el-bg-color:#ffffff;--el-bg-color-page:#f2f3f5;--el-bg-color-overlay:#ffffff;--el-text-color-primary:#303133;--el-text-color-regular:#606266;--el-text-color-secondary:#909399;--el-text-color-placeholder:#a8abb2;--el-text-color-disabled:#c0c4cc;--el-border-color:#dcdfe6;--el-border-color-light:#e4e7ed;--el-border-color-lighter:#ebeef5;--el-border-color-extra-light:#f2f6fc;--el-border-color-dark:#d4d7de;--el-border-color-darker:#cdd0d6;--el-fill-color:#f0f2f5;--el-fill-color-light:#f5f7fa;--el-fill-color-lighter:#fafafa;--el-fill-color-extra-light:#fafcff;--el-fill-color-dark:#ebedf0;--el-fill-color-darker:#e6e8eb;--el-fill-color-blank:#ffffff;--el-box-shadow:0px 12px 32px 4px rgba(0,0,0,0.04),0px 8px 20px rgba(0,0,0,0.08);--el-box-shadow-light:0px 0px 12px rgba(0,0,0,0.12);--el-box-shadow-lighter:0px 0px 6px rgba(0,0,0,0.12);--el-box-shadow-dark:0px 16px 48px 16px rgba(0,0,0,0.08),0px 12px 32px rgba(0,0,0,0.12),0px 8px 16px -8px rgba(0,0,0,0.16);--el-disabled-bg-color:var(--el-fill-color-light);--el-disabled-text-color:var(--el-text-color-placeholder);--el-disabled-border-color:var(--el-border-color-light);--el-overlay-color:rgba(0,0,0,0.8);--el-overlay-color-light:rgba(0,0,0,0.7);--el-overlay-color-lighter:rgba(0,0,0,0.5);--el-mask-color:rgba(255,255,255,0.9);--el-mask-color-extra-light:rgba(255,255,255,0.3);--el-border-width:1px;--el-border-style:solid;--el-border-color-hover:var(--el-text-color-disabled);--el-border:var(--el-border-width) var(--el-border-style) var(--el-border-color);--el-svg-monochrome-grey:var(--el-border-color)}.fade-in-linear-enter-active,.fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.fade-in-linear-enter-from,.fade-in-linear-leave-to{opacity:0}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.el-fade-in-linear-enter-from,.el-fade-in-linear-leave-to{opacity:0}.el-fade-in-enter-active,.el-fade-in-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-fade-in-enter-from,.el-fade-in-leave-active{opacity:0}.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter-from,.el-zoom-in-center-leave-active{opacity:0;transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;transform:scaleY(1);transform-origin:center top;transition:var(--el-transition-md-fade)}.el-zoom-in-top-enter-active[data-popper-placement^=top],.el-zoom-in-top-leave-active[data-popper-placement^=top]{transform-origin:center bottom}.el-zoom-in-top-enter-from,.el-zoom-in-top-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;transform:scaleY(1);transform-origin:center bottom;transition:var(--el-transition-md-fade)}.el-zoom-in-bottom-enter-from,.el-zoom-in-bottom-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;transform:scale(1);transform-origin:top left;transition:var(--el-transition-md-fade)}.el-zoom-in-left-enter-from,.el-zoom-in-left-leave-active{opacity:0;transform:scale(.45)}.collapse-transition{transition:var(--el-transition-duration) height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.el-collapse-transition-enter-active,.el-collapse-transition-leave-active{transition:var(--el-transition-duration) max-height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.horizontal-collapse-transition{transition:var(--el-transition-duration) width ease-in-out,var(--el-transition-duration) padding-left ease-in-out,var(--el-transition-duration) padding-right ease-in-out}.el-list-enter-active,.el-list-leave-active{transition:all 1s}.el-list-enter-from,.el-list-leave-to{opacity:0;transform:translateY(-30px)}.el-list-leave-active{position:absolute!important}.el-opacity-transition{transition:opacity var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-icon-loading{animation:rotating 2s linear infinite}.el-icon--right{margin-left:5px}.el-icon--left{margin-right:5px}@keyframes rotating{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.el-icon{--color:inherit;align-items:center;display:inline-flex;height:1em;justify-content:center;line-height:1em;position:relative;width:1em;fill:currentColor;color:var(--color);font-size:inherit}.el-icon.is-loading{animation:rotating 2s linear infinite}.el-icon svg{height:1em;width:1em} body { height: 100%; + margin: 0; -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 { - font-weight: 700; + font-weight: 400; } html { height: 100%; box-sizing: border-box; +} + +html.dark .svg-icon, +html.dark svg { + fill: var(--el-text-color-regular); } #app { @@ -90,7 +106,7 @@ visibility: hidden; display: block; font-size: 0; - content: " "; + content: ' '; clear: both; height: 0; } @@ -104,7 +120,8 @@ 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; @@ -124,6 +141,22 @@ padding: 20px; } +// search闈㈡澘鏍峰紡 +.panel, +.search { + margin-bottom: 0.75rem; + border-radius: 0.25rem; + border: 1px solid var(--el-border-color-light); + background-color: var(--el-bg-color-overlay); + padding: 0.75rem; + transition: all ease 0.3s; + + &:hover { + box-shadow: 0 2px 12px #0000001a; + transition: all ease 0.3s; + } +} + .components-container { margin: 30px 50px; position: relative; @@ -134,7 +167,7 @@ } .text-center { - text-align: center + text-align: center; } .sub-navbar { @@ -180,3 +213,16 @@ margin-bottom: 10px; } } + +.el-drawer__header { + display: flex; + justify-content: space-between; + border-bottom: 1px solid #E9F4FD; + padding: 100px; +} + +.el-drawer__close-btn { + width: 88%; + display: flex; + justify-content: flex-end; +} diff --git a/src/assets/styles/mixin.scss b/src/assets/styles/mixin.scss index 06fa061..5250e71 100644 --- a/src/assets/styles/mixin.scss +++ b/src/assets/styles/mixin.scss @@ -1,6 +1,6 @@ @mixin clearfix { &:after { - content: ""; + content: ''; display: table; clear: both; } @@ -44,21 +44,15 @@ border-bottom: $color-border-style; border-left: $transparent-border-style; border-right: $transparent-border-style; - } - - @else if $direction==right { + } @else if $direction==right { border-left: $color-border-style; border-top: $transparent-border-style; border-bottom: $transparent-border-style; - } - - @else if $direction==down { + } @else if $direction==down { border-top: $color-border-style; border-left: $transparent-border-style; border-right: $transparent-border-style; - } - - @else if $direction==left { + } @else if $direction==left { border-right: $color-border-style; border-top: $transparent-border-style; border-bottom: $transparent-border-style; diff --git a/src/assets/styles/ruoyi.scss b/src/assets/styles/ruoyi.scss index 4e29874..3a16ea5 100644 --- a/src/assets/styles/ruoyi.scss +++ b/src/assets/styles/ruoyi.scss @@ -1,106 +1,108 @@ /** -* 閫氱敤css鏍峰紡甯冨眬澶勭悊 -* Copyright (c) 2019 ruoyi -*/ + * 閫氱敤css鏍峰紡甯冨眬澶勭悊 + * Copyright (c) 2019 ruoyi + */ /** 鍩虹閫氱敤 **/ .pt5 { padding-top: 5px; } - .pr5 { padding-right: 5px; } - .pb5 { padding-bottom: 5px; } - .mt5 { margin-top: 5px; } - .mr5 { margin-right: 5px; } - .mb5 { margin-bottom: 5px; } - .mb8 { margin-bottom: 8px; } - .ml5 { margin-left: 5px; } - .mt10 { margin-top: 10px; } - .mr10 { margin-right: 10px; } - .mb10 { margin-bottom: 10px; } .ml10 { - margin-left: 10px; + margin-left: 10px; } - .mt20 { margin-top: 20px; } - .mr20 { margin-right: 20px; } - .mb20 { margin-bottom: 20px; } .ml20 { - margin-left: 20px; + margin-left: 20px; } -.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { +.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-form .el-form-item__label { + font-size: 12px; + font-weight: 400; + color: #454B5E; } - .el-dialog:not(.is-fullscreen) { margin-top: 6vh !important; } -.el-dialog__wrapper.scrollbar .el-dialog .el-dialog__body { +.el-dialog.scrollbar .el-dialog__body { overflow: auto; overflow-x: hidden; max-height: 70vh; padding: 10px 20px 0; + .el-form .el-form-item__label{ + color: red; + } } .el-table { - .el-table__header-wrapper, .el-table__fixed-header-wrapper { + .el-table__header-wrapper, + .el-table__fixed-header-wrapper { th { word-break: break-word; - background-color: #f8f8f9; + background-color: #f8f8f9 !important; color: #515a6e; - height: 40px; + height: 40px !important; font-size: 13px; } } - .el-table__body-wrapper { - .el-button [class*="el-icon-"] + span { + .el-button [class*='el-icon-'] + span { margin-left: 1px; } } @@ -112,12 +114,12 @@ color: #6379bb; border-bottom: 1px solid #ddd; margin: 8px 10px 25px 10px; - padding-bottom: 5px + padding-bottom: 5px; } /** 琛ㄦ牸甯冨眬 **/ .pagination-container { - position: relative; + // position: relative; height: 25px; margin-bottom: 10px; margin-top: 15px; @@ -128,13 +130,14 @@ .tree-border { margin-top: 5px; border: 1px solid #e5e6e7; - background: #FFFFFF none; + background: #ffffff none; border-radius: 4px; + width: 100%; } .pagination-container .el-pagination { - right: 0; - position: absolute; + //right: 0; + //position: absolute; } @media (max-width: 768px) { @@ -146,19 +149,21 @@ } } -.el-table .fixed-width .el-button--mini { +.el-table .fixed-width .el-button--small { 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 { + cursor: pointer; + color: #409eff; + margin-left: 10px; } -.el-table .el-dropdown, .el-icon-arrow-down { +.el-table .el-dropdown, +.el-icon-arrow-down { font-size: 12px; } @@ -192,12 +197,12 @@ } .el-card__header { - padding: 14px 15px 7px; + padding: 14px 15px 7px !important; min-height: 40px; } .el-card__body { - padding: 15px 20px 20px 20px; + padding: 15px 20px 20px 20px !important; } .card-box { @@ -209,22 +214,22 @@ /* 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 */ @@ -267,10 +272,9 @@ } .avatar-upload-preview { - position: relative; + position: absolute; top: 50%; - left: 50%; - transform: translate(-50%, -50%); + transform: translate(50%, -50%); width: 200px; height: 200px; border-radius: 50%; @@ -280,12 +284,12 @@ /* 鎷栨嫿鍒楁牱寮� */ .sortable-ghost { - opacity: .8; + opacity: 0.8; color: #fff !important; background: #42b983 !important; } +/* 琛ㄦ牸鍙充晶宸ュ叿鏍忔牱寮� */ .top-right-btn { - position: relative; - float: right; + margin-left: auto; } diff --git a/src/assets/styles/sidebar.scss b/src/assets/styles/sidebar.scss index abe5b63..2db4a1e 100644 --- a/src/assets/styles/sidebar.scss +++ b/src/assets/styles/sidebar.scss @@ -1,32 +1,31 @@ #app { - .main-container { - height: 100%; - transition: margin-left .28s; - margin-left: $base-sidebar-width; + // height: 100%; + transition: padding-left 0.28s; + padding-left: $base-sidebar-width; position: relative; + background-color: #F3F7FC; } .sidebarHide { - margin-left: 0!important; + margin-left: 0 !important; } .sidebar-container { - -webkit-transition: width .28s; + -webkit-transition: width 0.28s; transition: width 0.28s; width: $base-sidebar-width !important; background-color: $base-menu-background; height: 100%; - position: fixed; - font-size: 0px; + position: absolute; + font-size: 0; top: 0; bottom: 0; left: 0; z-index: 1001; overflow: hidden; - -webkit-box-shadow: 2px 0 6px rgba(0,21,41,.35); - box-shadow: 2px 0 6px rgba(0,21,41,.35); - + -webkit-box-shadow: 5px 0 10px -5px #d3d7de; + box-shadow: 5px 0 10px -5px #d3d7de; // reset element-ui css .horizontal-collapse-transition { transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out; @@ -37,7 +36,7 @@ } .el-scrollbar__bar.is-vertical { - right: 0px; + right: 0; } .el-scrollbar { @@ -70,39 +69,64 @@ width: 100% !important; } - .el-menu-item, .el-submenu__title { + .el-menu-item, + .menu-title { overflow: hidden !important; text-overflow: ellipsis !important; white-space: nowrap !important; } + .el-menu-item .el-menu-tooltip__trigger { + display: inline-block !important; + } + // menu hover - .submenu-title-noDropdown, - .el-submenu__title { + .theme-dark .sub-menu-title-noDropdown, + .theme-dark .el-sub-menu__title { &:hover { - background-color: rgba(0, 0, 0, 0.06) !important; + background-color: $base-sub-menu-title-hover !important; + } + } + .sub-menu-title-noDropdown, + .el-sub-menu__title { + &:hover { + background-color: rgba(0, 0, 0, 0.05) !important; } } - & .theme-dark .is-active > .el-submenu__title { + & .theme-dark .is-active > .el-sub-menu__title { color: $base-menu-color-active !important; } - & .nest-menu .el-submenu>.el-submenu__title, - & .el-submenu .el-menu-item { + & .nest-menu .el-sub-menu > .el-sub-menu__title, + & .el-sub-menu .el-menu-item { min-width: $base-sidebar-width !important; - &:hover { - background-color: rgba(0, 0, 0, 0.06) !important; + background-color: rgba(0, 0, 0, 0.1) !important; } } - & .theme-dark .nest-menu .el-submenu>.el-submenu__title, - & .theme-dark .el-submenu .el-menu-item { + & .theme-dark .nest-menu .el-sub-menu > .el-sub-menu__title, + & .theme-dark .el-sub-menu .el-menu-item { background-color: $base-sub-menu-background !important; &:hover { background-color: $base-sub-menu-hover !important; + } + } + + & .theme-dark .nest-menu .el-sub-menu > .el-sub-menu__title, + & .theme-dark .el-menu-item { + &:hover { + // you can use $sub-menuHover + background-color: $base-menu-hover !important; + } + } + & .nest-menu .el-sub-menu > .el-sub-menu__title, + & .el-menu-item { + &:hover { + // you can use $sub-menuHover + background-color: rgba(0, 0, 0, 0.04) !important; } } } @@ -113,10 +137,10 @@ } .main-container { - margin-left: 54px; + padding-left: 54px; } - .submenu-title-noDropdown { + .sub-menu-title-noDropdown { padding: 0 !important; position: relative; @@ -129,23 +153,29 @@ } } - .el-submenu { + .el-sub-menu { overflow: hidden; - &>.el-submenu__title { + & > .el-sub-menu__title { padding: 0 !important; .svg-icon { margin-left: 20px; } - } } .el-menu--collapse { - .el-submenu { - &>.el-submenu__title { - &>span { + .el-sub-menu { + & > .el-sub-menu__title { + & > span { + height: 0; + width: 0; + overflow: hidden; + visibility: hidden; + display: inline-block; + } + & > i { height: 0; width: 0; overflow: hidden; @@ -157,7 +187,7 @@ } } - .el-menu--collapse .el-menu .el-submenu { + .el-menu--collapse .el-menu .el-sub-menu { min-width: $base-sidebar-width !important; } @@ -168,7 +198,7 @@ } .sidebar-container { - transition: transform .28s; + transition: transform 0.28s; width: $base-sidebar-width !important; } @@ -182,7 +212,6 @@ } .withoutAnimation { - .main-container, .sidebar-container { transition: none; @@ -192,36 +221,9 @@ // when menu collapsed .el-menu--vertical { - &>.el-menu { + & > .el-menu { .svg-icon { margin-right: 16px; - } - } - - .nest-menu .el-submenu>.el-submenu__title, - .el-menu-item { - &:hover { - // you can use $subMenuHover - background-color: rgba(0, 0, 0, 0.06) !important; - } - } - - // the scroll bar appears when the subMenu is too long - >.el-menu--popup { - max-height: 100vh; - overflow-y: auto; - - &::-webkit-scrollbar-track-piece { - background: #d3dce6; - } - - &::-webkit-scrollbar { - width: 6px; - } - - &::-webkit-scrollbar-thumb { - background: #99a9bf; - border-radius: 20px; } } } diff --git a/src/assets/styles/transition.scss b/src/assets/styles/transition.scss index 073f8c6..468ad3c 100644 --- a/src/assets/styles/transition.scss +++ b/src/assets/styles/transition.scss @@ -15,7 +15,7 @@ .fade-transform--move, .fade-transform-leave-active, .fade-transform-enter-active { - transition: all .5s; + transition: all 0.5s; } .fade-transform-enter { @@ -31,7 +31,7 @@ /* breadcrumb transition */ .breadcrumb-enter-active, .breadcrumb-leave-active { - transition: all .5s; + transition: all 0.5s; } .breadcrumb-enter, @@ -41,7 +41,7 @@ } .breadcrumb-move { - transition: all .5s; + transition: all 0.5s; } .breadcrumb-leave-active { diff --git a/src/assets/styles/variables.module.scss b/src/assets/styles/variables.module.scss index 0181402..37d8f5a 100644 --- a/src/assets/styles/variables.module.scss +++ b/src/assets/styles/variables.module.scss @@ -80,7 +80,7 @@ $base-menu-background: var(--menuBg); $base-logo-title-color: #283146; -$base-menu-light-color: rgba(0, 0, 0, 0.7); +$base-menu-light-color: rgba(0, 0, 0); $base-menu-light-background: #ffffff; $base-logo-light-title-color: #001529; diff --git a/src/assets/styles/variables.scss b/src/assets/styles/variables.scss index 34484d4..1bae12d 100644 --- a/src/assets/styles/variables.scss +++ b/src/assets/styles/variables.scss @@ -14,7 +14,7 @@ $base-menu-background:#304156; $base-logo-title-color: #ffffff; -$base-menu-light-color:rgba(0,0,0,.70); +$base-menu-light-color:rgba(0,0,0); $base-menu-light-background:#ffffff; $base-logo-light-title-color: #001529; diff --git a/src/components/TopNav/index.vue b/src/components/TopNav/index.vue index 3d5b7b9..37937d6 100644 --- a/src/components/TopNav/index.vue +++ b/src/components/TopNav/index.vue @@ -181,7 +181,7 @@ .topmenu-container.el-menu--horizontal > .el-menu-item.is-active, .el-menu--horizontal > .el-submenu.is-active .el-submenu__title { border-bottom: 2px solid #{'var(--theme)'} !important; - color: #303133; + color: #000000; } /* submenu item */ diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index 466cd98..9a5141b 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -1,49 +1,75 @@ <template> - <div class="navbar"> - <hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" /> - - <breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!topNav"/> - <top-nav id="topmenu-container" class="topmenu-container" v-if="topNav"/> - - <div class="right-menu"> - <template v-if="device!=='mobile'"> - <search id="header-search" class="right-menu-item" /> - - <el-tooltip content="婧愮爜鍦板潃" effect="dark" placement="bottom"> - <ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" /> - </el-tooltip> - - <el-tooltip content="鏂囨。鍦板潃" effect="dark" placement="bottom"> - <ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" /> - </el-tooltip> - - <screenfull id="screenfull" class="right-menu-item hover-effect" /> - - <el-tooltip content="甯冨眬澶у皬" effect="dark" placement="bottom"> - <size-select id="size-select" class="right-menu-item hover-effect" /> - </el-tooltip> - - </template> - - <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click"> - <div class="avatar-wrapper"> - <img :src="avatar" class="user-avatar"> - <i class="el-icon-caret-bottom" /> + <div class="navbar"> + <div class="ruoyi-logo"> + <img src="@/assets/logo/logo.png" alt="" /> + <span>灏勬椽椤圭洰绠$悊绯荤粺</span> </div> - <el-dropdown-menu slot="dropdown"> - <router-link to="/user/profile"> - <el-dropdown-item>涓汉涓績</el-dropdown-item> - </router-link> - <el-dropdown-item @click.native="setting = true"> - <span>甯冨眬璁剧疆</span> - </el-dropdown-item> - <el-dropdown-item divided @click.native="logout"> - <span>閫�鍑虹櫥褰�</span> - </el-dropdown-item> - </el-dropdown-menu> - </el-dropdown> + <div class="right-menu flex align-center"> + <template> + <search-menu ref="searchMenuRef" /> + <el-tooltip content="鎼滅储" effect="dark" placement="bottom"> + <div + class="right-menu-item hover-effect" + @click="openSearchMenu" + > + <svg-icon + class-name="search-icon" + icon-class="search" + /> + </div> + </el-tooltip> + <!-- 娑堟伅 --> + <el-tooltip content="娑堟伅" effect="dark" placement="bottom"> + <div class="right-menu-item hover-effect"> + <el-popover + placement="bottom" + trigger="click" + transition="el-zoom-in-top" + :width="300" + :persistent="false" + > + <template #reference> + <el-badge + :value="newNotice > 0 ? newNotice : ''" + :max="99" + > + <svg-icon icon-class="message" /> + </el-badge> + </template> + <template #default> + <notice></notice> + </template> + </el-popover> + </div> + </el-tooltip> + <el-tooltip content="鍏ㄥ睆" effect="dark" placement="bottom"> + <screenfull + id="screenfull" + class="right-menu-item hover-effect" + /> + </el-tooltip> + </template> + <div class="avatar-container"> + <el-dropdown + class="avatar-container right-menu-item hover-effect" + trigger="click" + > + <div class="avatar-wrapper"> + <img :src="avatar" class="user-avatar" /> + <i class="el-icon-caret-bottom" /> + </div> + <el-dropdown-menu slot="dropdown"> + <router-link to="/user/profile"> + <el-dropdown-item>涓汉涓績</el-dropdown-item> + </router-link> + <el-dropdown-item divided @click.native="logout"> + <span>閫�鍑虹櫥褰�</span> + </el-dropdown-item> + </el-dropdown-menu> + </el-dropdown> + </div> + </div> </div> - </div> </template> <script> @@ -56,145 +82,198 @@ import Search from '@/components/HeaderSearch' import RuoYiGit from '@/components/RuoYi/Git' import RuoYiDoc from '@/components/RuoYi/Doc' +import SearchMenu from './TopBar/search.vue'; +import Notice from './Notice/index.vue'; export default { - components: { - Breadcrumb, - TopNav, - Hamburger, - Screenfull, - SizeSelect, - Search, - RuoYiGit, - RuoYiDoc - }, - computed: { - ...mapGetters([ - 'sidebar', - 'avatar', - 'device' - ]), - setting: { - get() { - return this.$store.state.settings.showSettings - }, - set(val) { - this.$store.dispatch('settings/changeSetting', { - key: 'showSettings', - value: val - }) - } + data() { + return { + newNotice: 0 + } }, - topNav: { - get() { - return this.$store.state.settings.topNav - } - } - }, - methods: { - toggleSideBar() { - this.$store.dispatch('app/toggleSideBar') + components: { + Breadcrumb, + TopNav, + Hamburger, + Screenfull, + SizeSelect, + Search, + RuoYiGit, + RuoYiDoc, + SearchMenu, + Notice }, - async logout() { - this.$confirm('纭畾娉ㄩ攢骞堕��鍑虹郴缁熷悧锛�', '鎻愮ず', { - confirmButtonText: '纭畾', - cancelButtonText: '鍙栨秷', - type: 'warning' - }).then(() => { - this.$store.dispatch('LogOut').then(() => { - location.href = '/index'; - }) - }).catch(() => {}); + computed: { + ...mapGetters([ + 'sidebar', + 'avatar', + 'device' + ]), + setting: { + get() { + return this.$store.state.settings.showSettings + }, + set(val) { + this.$store.dispatch('settings/changeSetting', { + key: 'showSettings', + value: val + }) + } + }, + topNav: { + get() { + return this.$store.state.settings.topNav + } + } + }, + methods: { + toggleSideBar() { + this.$store.dispatch('app/toggleSideBar') + }, + async logout() { + this.$confirm('纭畾娉ㄩ攢骞堕��鍑虹郴缁熷悧锛�', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + this.$store.dispatch('LogOut').then(() => { + location.href = '/index'; + }) + }).catch(() => { }); + }, + openSearchMenu() { + this.searchMenuRef.value?.openSearch(); + }, } - } } </script> <style lang="scss" scoped> +::v-deep.el-select .el-input__wrapper { + height: 30px; +} + +::v-deep .el-badge__content.is-fixed { + top: 12px; +} + +.flex { + display: flex; +} + +.align-center { + align-items: center; +} + +.ruoyi-logo { + float: left; + line-height: 54px; + font-weight: 400; + font-size: 24px; + font-style: italic; + font-family: PangMenZhengDao; + // color: #ffffff; + // width: 220px; + display: flex; + align-items: center; + > img { + margin: 0 10px 0 21px; + } + > div { + margin: 0 0 0 21px; + } + .down { + margin-top: 22px; + color: #ffffff; + } +} .navbar { - height: 50px; - overflow: hidden; - position: relative; - background: #fff; - box-shadow: 0 1px 4px rgba(0,21,41,.08); + height: 50px; + overflow: hidden; + position: relative; + //background: #fff; + box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08); - .hamburger-container { - line-height: 46px; - height: 100%; - float: left; - cursor: pointer; - transition: background .3s; - -webkit-tap-highlight-color:transparent; - - &:hover { - background: rgba(0, 0, 0, .025) - } - } - - .breadcrumb-container { - float: left; - } - - .topmenu-container { - position: absolute; - left: 50px; - } - - .errLog-container { - display: inline-block; - vertical-align: top; - } - - .right-menu { - float: right; - height: 100%; - line-height: 50px; - - &:focus { - outline: none; - } - - .right-menu-item { - display: inline-block; - padding: 0 8px; - height: 100%; - font-size: 18px; - color: #5a5e66; - vertical-align: text-bottom; - - &.hover-effect { + .hamburger-container { + line-height: 46px; + height: 100%; + float: left; cursor: pointer; - transition: background .3s; + transition: background 0.3s; + -webkit-tap-highlight-color: transparent; &:hover { - background: rgba(0, 0, 0, .025) + background: rgba(0, 0, 0, 0.025); } - } } - .avatar-container { - margin-right: 30px; - - .avatar-wrapper { - margin-top: 5px; - position: relative; - - .user-avatar { - cursor: pointer; - width: 40px; - height: 40px; - border-radius: 10px; - } - - .el-icon-caret-bottom { - cursor: pointer; - position: absolute; - right: -20px; - top: 25px; - font-size: 12px; - } - } + .breadcrumb-container { + float: left; } - } + + .topmenu-container { + position: absolute; + left: 50px; + } + + .errLog-container { + display: inline-block; + vertical-align: top; + } + + .right-menu { + float: right; + height: 100%; + line-height: 50px; + display: flex; + + &:focus { + outline: none; + } + + .right-menu-item { + display: inline-block; + padding: 0 8px; + height: 100%; + font-size: 18px; + color: #5a5e66; + vertical-align: text-bottom; + + &.hover-effect { + cursor: pointer; + transition: background 0.3s; + + &:hover { + background: rgba(0, 0, 0, 0.025); + } + } + } + + .avatar-container { + margin-right: 40px; + margin-top: 10px; + + .avatar-wrapper { + margin-top: 5px; + position: relative; + + .user-avatar { + cursor: pointer; + width: 40px; + height: 40px; + border-radius: 10px; + margin-top: 10px; + } + + i { + cursor: pointer; + position: absolute; + right: -20px; + top: 25px; + font-size: 12px; + } + } + } + } } </style> diff --git a/src/layout/components/Notice/index.vue b/src/layout/components/Notice/index.vue new file mode 100644 index 0000000..40aea86 --- /dev/null +++ b/src/layout/components/Notice/index.vue @@ -0,0 +1,155 @@ +<template> + <div v-loading="state.loading" class="layout-navbars-breadcrumb-user-news"> + <div class="head-box"> + <div class="head-box-title">閫氱煡鍏憡</div> + <div class="head-box-btn" @click="readAll">鍏ㄩ儴宸茶</div> + </div> + <div v-loading="state.loading" class="content-box"> + <template v-if="newsList.length > 0"> + <div + v-for="(v, k) in newsList" + :key="k" + class="content-box-item" + @click="onNewsClick(k)" + > + <div class="item-conten"> + <div>{{ v.message }}</div> + <div class="content-box-msg"></div> + <div class="content-box-time">{{ v.time }}</div> + </div> + <!-- 宸茶/鏈 --> + <span + v-if="v.read" + class="el-tag el-tag--success el-tag--mini read" + >宸茶</span + > + <span v-else class="el-tag el-tag--danger el-tag--mini read" + >鏈</span + > + </div> + </template> + <el-empty v-else :description="'娑堟伅涓虹┖'"></el-empty> + </div> + </div> +</template> + +<script > +// import { storeToRefs } from 'pinia'; +// import useNoticeStore from '@/store/modules/notice'; + +export default { + data() { + return { + state: { + loading: false + }, + newsList: [] + } + }, + methods: { + /** + * 鍒濆鍖栨暟鎹� + * @returns + */ + getTableData() { + this.state.loading = true; + // this.newsList.value = noticeStore.state.value.notices; + this.state.loading = false; + }, + //鐐瑰嚮娑堟伅锛屽啓鍏ュ凡璇� + onNewsClick(item) { + this.newsList.value[item].read = true; + //骞朵笖鍐欏叆pinia + this.noticeStore.state.value.notices = newsList.value; + }, + readAll() { + + }, + // 鍓嶅線閫氱煡涓績鐐瑰嚮 + onGoToGiteeClick() { + window.open('https://gitee.com/dromara/RuoYi-Vue-Plus/tree/5.X/'); + } + }, + mounted: function () { + this.$nextTick(() => { + this.getTableData(); + }); + } +} +</script> + +<style scoped lang="scss"> +.layout-navbars-breadcrumb-user-news { + .head-box { + display: flex; + border-bottom: 1px solid var(--el-border-color-lighter); + box-sizing: border-box; + color: var(--el-text-color-primary); + justify-content: space-between; + height: 35px; + align-items: center; + + .head-box-btn { + color: var(--el-color-primary); + font-size: 13px; + cursor: pointer; + opacity: 0.8; + + &:hover { + opacity: 1; + } + } + } + + .content-box { + height: 300px; + overflow: auto; + font-size: 13px; + + .content-box-item { + padding-top: 12px; + display: flex; + + &:last-of-type { + padding-bottom: 12px; + } + + .content-box-msg { + color: var(--el-text-color-secondary); + margin-top: 5px; + margin-bottom: 5px; + } + + .content-box-time { + color: var(--el-text-color-secondary); + } + + .item-conten { + width: 100%; + display: flex; + flex-direction: column; + } + } + } + + .foot-box { + height: 35px; + color: var(--el-color-primary); + font-size: 13px; + cursor: pointer; + opacity: 0.8; + display: flex; + align-items: center; + justify-content: center; + border-top: 1px solid var(--el-border-color-lighter); + + &:hover { + opacity: 1; + } + } + + ::v-deep .el-empty__description p { + font-size: 13px; + } +} +</style> diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue index 51d0839..8ee9d82 100644 --- a/src/layout/components/Sidebar/index.vue +++ b/src/layout/components/Sidebar/index.vue @@ -1,12 +1,29 @@ <template> - <div :class="{'has-logo':showLogo}" :style="{ backgroundColor: settings.sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground }"> - <logo v-if="showLogo" :collapse="isCollapse" /> - <el-scrollbar :class="settings.sideTheme" wrap-class="scrollbar-wrapper"> + <div + :class="{ 'has-logo': showLogo }" + :style="{ backgroundColor: variables.menuLightBackground }" + > + <!-- <logo v-if="showLogo" :collapse="isCollapse" /> --> + <div class="hamburger-container"> + <div class="border"> + <div class="menu-tip" v-show="sidebar.opened">鑿滃崟绠$悊</div> + <hamburger + id="hamburger-container" + :is-active="sidebar.opened" + class="hamburger-icon" + @toggleClick="toggleSideBar" + /> + </div> + </div> + <el-scrollbar + :class="settings.sideTheme" + wrap-class="scrollbar-wrapper" + > <el-menu :default-active="activeMenu" :collapse="isCollapse" - :background-color="settings.sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground" - :text-color="settings.sideTheme === 'theme-dark' ? variables.menuColor : variables.menuLightColor" + :background-color="variables.menuLightBackground" + :text-color="variables.menuLightColor" :unique-opened="true" :active-text-color="settings.theme" :collapse-transition="false" @@ -14,7 +31,7 @@ > <sidebar-item v-for="(route, index) in sidebarRouters" - :key="route.path + index" + :key="route.path + index" :item="route" :base-path="route.path" /> @@ -28,9 +45,10 @@ import Logo from "./Logo"; import SidebarItem from "./SidebarItem"; import variables from "@/assets/styles/variables.scss"; +import Hamburger from '@/components/Hamburger' export default { - components: { SidebarItem, Logo }, + components: { SidebarItem, Logo, Hamburger }, computed: { ...mapState(["settings"]), ...mapGetters(["sidebarRouters", "sidebar"]), @@ -52,6 +70,45 @@ isCollapse() { return !this.sidebar.opened; } + }, + created() { + // console.log(this.settings.sideTheme); + }, + methods: { + toggleSideBar() { + this.$store.dispatch('app/toggleSideBar') + }, } }; </script> +<style scoped> +.hamburger-container { + display: flex; + color: #fff; + justify-content: space-between; + height: 59px; + line-height: 59px; + .border { + margin: 0 auto; + display: flex; + justify-content: space-between; + width: 180px; + border-bottom: 1px solid #e6eaf5; + } + .menu-tip { + height: 50px; + font-size: 14px; + font-weight: 400; + color: #000000; + padding-left: 20px; + } + .hamburger-icon { + width: 54px; + text-align: center; + cursor: pointer; + &:hover { + background: rgba(0, 0, 0, 0.025); + } + } +} +</style> \ No newline at end of file diff --git a/src/layout/components/TagsView/index.vue b/src/layout/components/TagsView/index.vue index 96585a5..87257c9 100644 --- a/src/layout/components/TagsView/index.vue +++ b/src/layout/components/TagsView/index.vue @@ -1,31 +1,64 @@ <template> - <div id="tags-view-container" class="tags-view-container"> - <scroll-pane ref="scrollPane" class="tags-view-wrapper" @scroll="handleScroll"> - <router-link - v-for="tag in visitedViews" - ref="tag" - :key="tag.path" - :class="isActive(tag)?'active':''" - :to="{ path: tag.path, query: tag.query, fullPath: tag.fullPath }" - tag="span" - class="tags-view-item" - :style="activeStyle(tag)" - @click.middle.native="!isAffix(tag)?closeSelectedTag(tag):''" - @contextmenu.prevent.native="openMenu(tag,$event)" - > - {{ tag.title }} - <span v-if="!isAffix(tag)" class="el-icon-close" @click.prevent.stop="closeSelectedTag(tag)" /> - </router-link> - </scroll-pane> - <ul v-show="visible" :style="{left:left+'px',top:top+'px'}" class="contextmenu"> - <li @click="refreshSelectedTag(selectedTag)"><i class="el-icon-refresh-right"></i> 鍒锋柊椤甸潰</li> - <li v-if="!isAffix(selectedTag)" @click="closeSelectedTag(selectedTag)"><i class="el-icon-close"></i> 鍏抽棴褰撳墠</li> - <li @click="closeOthersTags"><i class="el-icon-circle-close"></i> 鍏抽棴鍏朵粬</li> - <li v-if="!isFirstView()" @click="closeLeftTags"><i class="el-icon-back"></i> 鍏抽棴宸︿晶</li> - <li v-if="!isLastView()" @click="closeRightTags"><i class="el-icon-right"></i> 鍏抽棴鍙充晶</li> - <li @click="closeAllTags(selectedTag)"><i class="el-icon-circle-close"></i> 鍏ㄩ儴鍏抽棴</li> - </ul> - </div> + <div id="tags-view-container" class="tags-view-container"> + <scroll-pane + ref="scrollPane" + class="tags-view-wrapper" + @scroll="handleScroll" + > + <router-link + v-for="tag in visitedViews" + ref="tag" + :key="tag.path" + :class="isActive(tag) ? 'active' : ''" + :to="{ + path: tag.path, + query: tag.query, + fullPath: tag.fullPath + }" + tag="span" + class="tags-view-item" + :style="activeStyle(tag)" + @click.middle.native=" + !isAffix(tag) ? closeSelectedTag(tag) : '' + " + @contextmenu.prevent.native="openMenu(tag, $event)" + > + {{ tag.title }} + <span + v-if="!isAffix(tag)" + class="el-icon-close" + @click.prevent.stop="closeSelectedTag(tag)" + /> + </router-link> + </scroll-pane> + <ul + v-show="visible" + :style="{ left: left + 'px', top: top + 'px' }" + class="contextmenu" + > + <li @click="refreshSelectedTag(selectedTag)"> + <i class="el-icon-refresh-right"></i> 鍒锋柊椤甸潰 + </li> + <li + v-if="!isAffix(selectedTag)" + @click="closeSelectedTag(selectedTag)" + > + <i class="el-icon-close"></i> 鍏抽棴褰撳墠 + </li> + <li @click="closeOthersTags"> + <i class="el-icon-circle-close"></i> 鍏抽棴鍏朵粬 + </li> + <li v-if="!isFirstView()" @click="closeLeftTags"> + <i class="el-icon-back"></i> 鍏抽棴宸︿晶 + </li> + <li v-if="!isLastView()" @click="closeRightTags"> + <i class="el-icon-right"></i> 鍏抽棴鍙充晶 + </li> + <li @click="closeAllTags(selectedTag)"> + <i class="el-icon-circle-close"></i> 鍏ㄩ儴鍏抽棴 + </li> + </ul> + </div> </template> <script> @@ -33,300 +66,304 @@ import path from 'path' export default { - components: { ScrollPane }, - data() { - return { - visible: false, - top: 0, - left: 0, - selectedTag: {}, - affixTags: [] - } - }, - computed: { - visitedViews() { - return this.$store.state.tagsView.visitedViews - }, - routes() { - return this.$store.state.permission.routes - }, - theme() { - return this.$store.state.settings.theme; - } - }, - watch: { - $route() { - this.addTags() - this.moveToCurrentTag() - }, - visible(value) { - if (value) { - document.body.addEventListener('click', this.closeMenu) - } else { - document.body.removeEventListener('click', this.closeMenu) - } - } - }, - mounted() { - this.initTags() - this.addTags() - }, - methods: { - isActive(route) { - return route.path === this.$route.path - }, - activeStyle(tag) { - if (!this.isActive(tag)) return {}; - return { - "background-color": this.theme, - "border-color": this.theme - }; - }, - isAffix(tag) { - return tag.meta && tag.meta.affix - }, - isFirstView() { - try { - return this.selectedTag.fullPath === '/index' || this.selectedTag.fullPath === this.visitedViews[1].fullPath - } catch (err) { - return false - } - }, - isLastView() { - try { - return this.selectedTag.fullPath === this.visitedViews[this.visitedViews.length - 1].fullPath - } catch (err) { - return false - } - }, - filterAffixTags(routes, basePath = '/') { - let tags = [] - routes.forEach(route => { - if (route.meta && route.meta.affix) { - const tagPath = path.resolve(basePath, route.path) - tags.push({ - fullPath: tagPath, - path: tagPath, - name: route.name, - meta: { ...route.meta } - }) + components: { ScrollPane }, + data() { + return { + visible: false, + top: 0, + left: 0, + selectedTag: {}, + affixTags: [] } - if (route.children) { - const tempTags = this.filterAffixTags(route.children, route.path) - if (tempTags.length >= 1) { - tags = [...tags, ...tempTags] - } - } - }) - return tags }, - initTags() { - const affixTags = this.affixTags = this.filterAffixTags(this.routes) - for (const tag of affixTags) { - // Must have tag name - if (tag.name) { - this.$store.dispatch('tagsView/addVisitedView', tag) + computed: { + visitedViews() { + return this.$store.state.tagsView.visitedViews + }, + routes() { + return this.$store.state.permission.routes + }, + theme() { + return this.$store.state.settings.theme; } - } }, - addTags() { - const { name } = this.$route - if (name) { - this.$store.dispatch('tagsView/addView', this.$route) - if (this.$route.meta.link) { - this.$store.dispatch('tagsView/addIframeView', this.$route) - } - } - return false - }, - moveToCurrentTag() { - const tags = this.$refs.tag - this.$nextTick(() => { - for (const tag of tags) { - if (tag.to.path === this.$route.path) { - this.$refs.scrollPane.moveToTarget(tag) - // when query is different then update - if (tag.to.fullPath !== this.$route.fullPath) { - this.$store.dispatch('tagsView/updateVisitedView', this.$route) + watch: { + $route() { + this.addTags() + this.moveToCurrentTag() + }, + visible(value) { + if (value) { + document.body.addEventListener('click', this.closeMenu) + } else { + document.body.removeEventListener('click', this.closeMenu) } - break - } } - }) }, - refreshSelectedTag(view) { - this.$tab.refreshPage(view); - if (this.$route.meta.link) { - this.$store.dispatch('tagsView/delIframeView', this.$route) - } + mounted() { + this.initTags() + this.addTags() }, - closeSelectedTag(view) { - this.$tab.closePage(view).then(({ visitedViews }) => { - if (this.isActive(view)) { - this.toLastView(visitedViews, view) - } - }) - }, - closeRightTags() { - this.$tab.closeRightPage(this.selectedTag).then(visitedViews => { - if (!visitedViews.find(i => i.fullPath === this.$route.fullPath)) { - this.toLastView(visitedViews) - } - }) - }, - closeLeftTags() { - this.$tab.closeLeftPage(this.selectedTag).then(visitedViews => { - if (!visitedViews.find(i => i.fullPath === this.$route.fullPath)) { - this.toLastView(visitedViews) - } - }) - }, - closeOthersTags() { - this.$router.push(this.selectedTag.fullPath).catch(()=>{}); - this.$tab.closeOtherPage(this.selectedTag).then(() => { - this.moveToCurrentTag() - }) - }, - closeAllTags(view) { - this.$tab.closeAllPage().then(({ visitedViews }) => { - if (this.affixTags.some(tag => tag.path === this.$route.path)) { - return - } - this.toLastView(visitedViews, view) - }) - }, - toLastView(visitedViews, view) { - const latestView = visitedViews.slice(-1)[0] - if (latestView) { - this.$router.push(latestView.fullPath) - } else { - // now the default is to redirect to the home page if there is no tags-view, - // you can adjust it according to your needs. - if (view.name === 'Dashboard') { - // to reload home page - this.$router.replace({ path: '/redirect' + view.fullPath }) - } else { - this.$router.push('/') - } - } - }, - openMenu(tag, e) { - const menuMinWidth = 105 - const offsetLeft = this.$el.getBoundingClientRect().left // container margin left - const offsetWidth = this.$el.offsetWidth // container width - const maxLeft = offsetWidth - menuMinWidth // left boundary - const left = e.clientX - offsetLeft + 15 // 15: margin right + methods: { + isActive(route) { + return route.path === this.$route.path + }, + activeStyle(tag) { + if (!this.isActive(tag)) return {}; + return { + "background-color": this.theme, + "border-color": this.theme + }; + }, + isAffix(tag) { + return tag.meta && tag.meta.affix + }, + isFirstView() { + try { + return this.selectedTag.fullPath === '/index' || this.selectedTag.fullPath === this.visitedViews[1].fullPath + } catch (err) { + return false + } + }, + isLastView() { + try { + return this.selectedTag.fullPath === this.visitedViews[this.visitedViews.length - 1].fullPath + } catch (err) { + return false + } + }, + filterAffixTags(routes, basePath = '/') { + let tags = [] + routes.forEach(route => { + if (route.meta && route.meta.affix) { + const tagPath = path.resolve(basePath, route.path) + tags.push({ + fullPath: tagPath, + path: tagPath, + name: route.name, + meta: { ...route.meta } + }) + } + if (route.children) { + const tempTags = this.filterAffixTags(route.children, route.path) + if (tempTags.length >= 1) { + tags = [...tags, ...tempTags] + } + } + }) + return tags + }, + initTags() { + const affixTags = this.affixTags = this.filterAffixTags(this.routes) + for (const tag of affixTags) { + // Must have tag name + if (tag.name) { + this.$store.dispatch('tagsView/addVisitedView', tag) + } + } + }, + addTags() { + const { name } = this.$route + if (name) { + this.$store.dispatch('tagsView/addView', this.$route) + if (this.$route.meta.link) { + this.$store.dispatch('tagsView/addIframeView', this.$route) + } + } + return false + }, + moveToCurrentTag() { + const tags = this.$refs.tag + this.$nextTick(() => { + for (const tag of tags) { + if (tag.to.path === this.$route.path) { + this.$refs.scrollPane.moveToTarget(tag) + // when query is different then update + if (tag.to.fullPath !== this.$route.fullPath) { + this.$store.dispatch('tagsView/updateVisitedView', this.$route) + } + break + } + } + }) + }, + refreshSelectedTag(view) { + this.$tab.refreshPage(view); + if (this.$route.meta.link) { + this.$store.dispatch('tagsView/delIframeView', this.$route) + } + }, + closeSelectedTag(view) { + this.$tab.closePage(view).then(({ visitedViews }) => { + if (this.isActive(view)) { + this.toLastView(visitedViews, view) + } + }) + }, + closeRightTags() { + this.$tab.closeRightPage(this.selectedTag).then(visitedViews => { + if (!visitedViews.find(i => i.fullPath === this.$route.fullPath)) { + this.toLastView(visitedViews) + } + }) + }, + closeLeftTags() { + this.$tab.closeLeftPage(this.selectedTag).then(visitedViews => { + if (!visitedViews.find(i => i.fullPath === this.$route.fullPath)) { + this.toLastView(visitedViews) + } + }) + }, + closeOthersTags() { + this.$router.push(this.selectedTag.fullPath).catch(() => { }); + this.$tab.closeOtherPage(this.selectedTag).then(() => { + this.moveToCurrentTag() + }) + }, + closeAllTags(view) { + this.$tab.closeAllPage().then(({ visitedViews }) => { + if (this.affixTags.some(tag => tag.path === this.$route.path)) { + return + } + this.toLastView(visitedViews, view) + }) + }, + toLastView(visitedViews, view) { + const latestView = visitedViews.slice(-1)[0] + if (latestView) { + this.$router.push(latestView.fullPath) + } else { + // now the default is to redirect to the home page if there is no tags-view, + // you can adjust it according to your needs. + if (view.name === 'Dashboard') { + // to reload home page + this.$router.replace({ path: '/redirect' + view.fullPath }) + } else { + this.$router.push('/') + } + } + }, + openMenu(tag, e) { + const menuMinWidth = 105 + const offsetLeft = this.$el.getBoundingClientRect().left // container margin left + const offsetWidth = this.$el.offsetWidth // container width + const maxLeft = offsetWidth - menuMinWidth // left boundary + const left = e.clientX - offsetLeft + 15 // 15: margin right - if (left > maxLeft) { - this.left = maxLeft - } else { - this.left = left - } + if (left > maxLeft) { + this.left = maxLeft + } else { + this.left = left + } - this.top = e.clientY - this.visible = true - this.selectedTag = tag - }, - closeMenu() { - this.visible = false - }, - handleScroll() { - this.closeMenu() + this.top = e.clientY + this.visible = true + this.selectedTag = tag + }, + closeMenu() { + this.visible = false + }, + handleScroll() { + this.closeMenu() + } } - } } </script> <style lang="scss" scoped> .tags-view-container { - height: 34px; - width: 100%; - background: #fff; - border-bottom: 1px solid #d8dce5; - box-shadow: 0 1px 3px 0 rgba(0, 0, 0, .12), 0 0 3px 0 rgba(0, 0, 0, .04); - .tags-view-wrapper { - .tags-view-item { - display: inline-block; - position: relative; - cursor: pointer; - height: 26px; - line-height: 26px; - border: 1px solid #d8dce5; - color: #495060; - background: #fff; - padding: 0 8px; - font-size: 12px; - margin-left: 5px; - margin-top: 4px; - &:first-of-type { - margin-left: 15px; - } - &:last-of-type { - margin-right: 15px; - } - &.active { - background-color: #42b983; - color: #fff; - border-color: #42b983; - &::before { - content: ''; - background: #fff; - display: inline-block; - width: 8px; - height: 8px; - border-radius: 50%; - position: relative; - margin-right: 2px; + height: 44px; + width: 100%; + background-color: var(--el-bg-color); + border: 1px solid var(--el-border-color-light); + line-height: 44px; + + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12), 0 0 3px 0 rgba(0, 0, 0, 0.04); + .tags-view-wrapper { + .tags-view-item { + display: inline-block; + position: relative; + cursor: pointer; + height: 26px; + line-height: 23px; + background-color: var(--el-bg-color); + border: 1px solid var(--el-border-color-light); + color: #495060; + padding: 0 8px; + font-size: 12px; + margin-left: 5px; + margin-top: 4px; + &:hover { + color: var(--el-color-primary); + } + &:first-of-type { + margin-left: 15px; + } + &:last-of-type { + margin-right: 15px; + } + &.active { + background-color: #42b983; + color: #fff; + border-color: #42b983; + &::before { + content: ''; + background: #fff; + display: inline-block; + width: 8px; + height: 8px; + border-radius: 50%; + position: relative; + margin-right: 5px; + } + } } - } } - } - .contextmenu { - margin: 0; - background: #fff; - z-index: 3000; - position: absolute; - list-style-type: none; - padding: 5px 0; - border-radius: 4px; - font-size: 12px; - font-weight: 400; - color: #333; - box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, .3); - li { - margin: 0; - padding: 7px 16px; - cursor: pointer; - &:hover { - background: #eee; - } + .contextmenu { + margin: 0; + background: var(--el-bg-color); + z-index: 3000; + position: absolute; + list-style-type: none; + padding: 5px 0; + border-radius: 4px; + font-size: 12px; + font-weight: 400; + box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, 0.3); + li { + margin: 0; + padding: 7px 16px; + cursor: pointer; + &:hover { + background: #eee; + } + } } - } } </style> <style lang="scss"> //reset element css of el-icon-close .tags-view-wrapper { - .tags-view-item { - .el-icon-close { - width: 16px; - height: 16px; - vertical-align: 2px; - border-radius: 50%; - text-align: center; - transition: all .3s cubic-bezier(.645, .045, .355, 1); - transform-origin: 100% 50%; - &:before { - transform: scale(.6); - display: inline-block; - vertical-align: -3px; - } - &:hover { - background-color: #b4bccc; - color: #fff; - } + .tags-view-item { + .el-icon-close { + width: 16px; + height: 16px; + vertical-align: 2px; + border-radius: 50%; + text-align: center; + transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transform-origin: 100% 50%; + &:before { + transform: scale(0.6); + display: inline-block; + vertical-align: -3px; + } + &:hover { + background-color: #b4bccc; + color: #fff; + } + } } - } } </style> diff --git a/src/layout/components/TopBar/search.vue b/src/layout/components/TopBar/search.vue new file mode 100644 index 0000000..001f91e --- /dev/null +++ b/src/layout/components/TopBar/search.vue @@ -0,0 +1,157 @@ +<template> + <div class="layout-search-dialog"> + <el-dialog + v-model="state.isShowSearch" + destroy-on-close + :show-close="false" + > + <template #footer> + <el-autocomplete + ref="layoutMenuAutocompleteRef" + v-model="state.menuQuery" + :fetch-suggestions="menuSearch" + placeholder="鎼滅储" + :fit-input-width="true" + @select="onHandleSelect" + > + <template #prefix> + <svg-icon + class-name="search-icon" + icon-class="search" + /> + </template> + <template #default="{ item }"> + <div> + <svg-icon :icon-class="item.icon" class="mr5" /> + {{ item.title }} + </div> + </template> + </el-autocomplete> + </template> + </el-dialog> + </div> +</template> + +<script> +import { getNormalPath } from '@/utils/ruoyi'; +import { isHttp } from '@/utils/validate'; +import usePermissionStore from '@/store/modules/permission'; +import { RouteRecordRaw } from 'vue-router'; + +export default { + data() { + return { + state: { + isShowSearch: false, + menuQuery: '', + menuList: [] + } + } + }, + created() { + // this.openSearch() + }, + methods: { + // 鎼滅储寮圭獥鎵撳紑 + openSearch() { + this.state.menuQuery = ''; + this.state.isShowSearch = true; + + this.state.menuList = this.generateRoutes(usePermissionStore.state.routes); + this.$nextTick(() => { + setTimeout(() => { + this.layoutMenuAutocompleteRef.value.focus(); + }); + }); + }, + // 鎼滅储寮圭獥鍏抽棴 + closeSearch() { + this.state.isShowSearch = false; + }, + // 鑿滃崟鎼滅储鏁版嵁杩囨护 + menuSearch(queryString, cb) { + let options = state.menuList.filter((item) => { + return item.title.indexOf(queryString) > -1; + }); + this.cb(options); + }, + // Filter out the routes that can be displayed in the sidebar + // And generate the internationalized title + generateRoutes(routes, basePath, prefixTitle) { + let res = []; + routes.forEach((r) => { + // skip hidden router + if (!r.hidden) { + const p = r.path.length > 0 && r.path[0] === '/' ? r.path : '/' + r.path; + const data = { + path: !isHttp(r.path) ? getNormalPath(basePath + p) : r.path, + icon: r.meta?.icon, + title: [...prefixTitle] + }; + if (r.meta && r.meta.title) { + data.title = [...data.title, r.meta.title]; + if (r.redirect !== 'noRedirect') { + // only push the routes with title + // special case: need to exclude parent router without redirect + res.push(data); + } + } + // recursive child routes + if (r.children) { + const tempRoutes = generateRoutes(r.children, data.path, data.title); + if (tempRoutes.length >= 1) { + res = [...res, ...tempRoutes]; + } + } + } + }); + res.forEach((item) => { + if (item.title instanceof Array) { + item.title = item.title.join('/'); + } + }); + return res; + }, + // 褰撳墠鑿滃崟閫変腑鏃� + onHandleSelect(val) { + const paths = val.path; + if (isHttp(paths)) { + // http(s):// 璺緞鏂扮獥鍙f墦寮� + const pindex = paths.indexOf('http'); + window.open(paths.substring(pindex, paths.length), '_blank'); + } else { + router.push(paths); + } + state.menuQuery = ''; + closeSearch(); + } + } +} +</script> + +<style scoped lang="scss"> +.layout-search-dialog { + position: relative; + ::v-deep .el-dialog { + padding: 0; + .el-dialog__header, + .el-dialog__body { + display: none; + } + .el-dialog__footer { + width: 100%; + position: absolute; + left: 50%; + transform: translateX(-50%); + top: -53vh; + } + } + ::v-deep.el-autocomplete { + width: 560px; + position: absolute; + top: 150px; + left: 50%; + transform: translateX(-50%); + } +} +</style> diff --git a/src/layout/index.vue b/src/layout/index.vue index dba4393..3d5c4ef 100644 --- a/src/layout/index.vue +++ b/src/layout/index.vue @@ -1,18 +1,36 @@ <template> - <div :class="classObj" class="app-wrapper" :style="{'--current-color': theme}"> - <div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside"/> - <sidebar v-if="!sidebar.hide" class="sidebar-container"/> - <div :class="{hasTagsView:needTagsView,sidebarHide:sidebar.hide}" class="main-container"> - <div :class="{'fixed-header':fixedHeader}"> - <navbar/> - <tags-view v-if="needTagsView"/> - </div> - <app-main/> - <right-panel> - <settings/> - </right-panel> + <div + :class="classObj" + class="app-wrapper" + :style="{ '--current-color': theme }" + > + <div + v-if="device === 'mobile' && sidebar.opened" + class="drawer-bg" + @click="handleClickOutside" + /> + <navbar ref="navbarRef" @set-layout="setLayout" /> + + <div + :class="{ hasTagsView: needTagsView, sidebarHide: sidebar.hide }" + class="main-container" + > + <!-- <el-scrollbar> + <div :class="{ 'fixed-header': fixedHeader }"> + <navbar ref="navbarRef" @setLayout="setLayout" /> + <tags-view v-if="needTagsView" /> + </div> + <app-main /> + <settings ref="settingRef" /> + </el-scrollbar> --> + <side-bar v-if="!sidebar.hide" class="sidebar-container" /> + <div :class="{ 'fixed-header': fixedHeader }"> + <tags-view v-if="needTagsView" /> + </div> + <app-main /> + <settings ref="settingRef" /> + </div> </div> - </div> </template> <script> @@ -21,64 +39,69 @@ import ResizeMixin from './mixin/ResizeHandler' import { mapState } from 'vuex' import variables from '@/assets/styles/variables.scss' +import SideBar from './components/Sidebar/index.vue'; export default { - name: 'Layout', - components: { - AppMain, - Navbar, - RightPanel, - Settings, - Sidebar, - TagsView - }, - mixins: [ResizeMixin], - computed: { - ...mapState({ - theme: state => state.settings.theme, - sideTheme: state => state.settings.sideTheme, - sidebar: state => state.app.sidebar, - device: state => state.app.device, - needTagsView: state => state.settings.tagsView, - fixedHeader: state => state.settings.fixedHeader - }), - classObj() { - return { - hideSidebar: !this.sidebar.opened, - openSidebar: this.sidebar.opened, - withoutAnimation: this.sidebar.withoutAnimation, - mobile: this.device === 'mobile' - } + name: 'Layout', + components: { + AppMain, + Navbar, + RightPanel, + Settings, + Sidebar, + TagsView, + SideBar }, - variables() { - return variables; + mixins: [ResizeMixin], + computed: { + ...mapState({ + theme: state => state.settings.theme, + sideTheme: state => state.settings.sideTheme, + sidebar: state => state.app.sidebar, + device: state => state.app.device, + needTagsView: state => state.settings.tagsView, + fixedHeader: state => state.settings.fixedHeader + }), + classObj() { + return { + hideSidebar: !this.sidebar.opened, + openSidebar: this.sidebar.opened, + withoutAnimation: this.sidebar.withoutAnimation, + mobile: this.device === 'mobile' + } + }, + variables() { + return variables; + } + }, + methods: { + setLayout() { + this.settingRef.value?.openSetting(); + }, + handleClickOutside() { + this.$store.dispatch('app/closeSideBar', { withoutAnimation: false }) + } } - }, - methods: { - handleClickOutside() { - this.$store.dispatch('app/closeSideBar', { withoutAnimation: false }) - } - } } </script> <style lang="scss" scoped> - @import "~@/assets/styles/mixin.scss"; - @import "~@/assets/styles/variables.scss"; +@import '~@/assets/styles/mixin.scss'; +@import '~@/assets/styles/variables.scss'; - .app-wrapper { +.app-wrapper { @include clearfix; position: relative; height: 100%; width: 100%; &.mobile.openSidebar { - position: fixed; - top: 0; + position: fixed; + top: 0; } - } +} - .drawer-bg { +.drawer-bg { background: #000; opacity: 0.3; width: 100%; @@ -86,26 +109,26 @@ height: 100%; position: absolute; z-index: 999; - } +} - .fixed-header { +.fixed-header { position: fixed; top: 0; right: 0; z-index: 9; width: calc(100% - #{$base-sidebar-width}); transition: width 0.28s; - } +} - .hideSidebar .fixed-header { +.hideSidebar .fixed-header { width: calc(100% - 54px); - } +} - .sidebarHide .fixed-header { +.sidebarHide .fixed-header { width: 100%; - } +} - .mobile .fixed-header { +.mobile .fixed-header { width: 100%; - } +} </style> diff --git a/src/main.js b/src/main.js index 36f1893..ac9ce83 100644 --- a/src/main.js +++ b/src/main.js @@ -1,9 +1,21 @@ import Vue from 'vue' import Cookies from 'js-cookie' - +// global css +// import 'virtual:uno.css'; +import '@/assets/styles/index.scss'; import Element from 'element-ui' import './assets/styles/element-variables.scss' + +// 楂樹寒缁勪欢 +// import 'highlight.js/styles/a11y-light.css'; +// import 'highlight.js/styles/atom-one-dark.css'; +// import 'highlight.js/lib/common'; +// import HighLight from '@highlightjs/vue-plugin'; + +// // svg鍥炬爣 +// import 'virtual:svg-icons-register'; +// import ElementIcons from '@/plugins/svgicon'; import '@/assets/styles/index.scss' // global css import '@/assets/styles/ruoyi.scss' // ruoyi css @@ -64,6 +76,8 @@ Vue.use(directive) Vue.use(plugins) Vue.use(VueMeta) +// Vue.use(HighLight); +// Vue.use(ElementIcons); DictData.install() /** diff --git a/src/settings.js b/src/settings.js index 6a0b09f..78a8bc1 100644 --- a/src/settings.js +++ b/src/settings.js @@ -2,7 +2,7 @@ /** * 渚ц竟鏍忎富棰� 娣辫壊涓婚theme-dark锛屾祬鑹蹭富棰榯heme-light */ - sideTheme: 'theme-dark', + sideTheme: 'theme-light', /** * 鏄惁绯荤粺甯冨眬閰嶇疆 diff --git a/src/utils/ruoyi.js b/src/utils/ruoyi.js index 44bf9c4..40fbf45 100644 --- a/src/utils/ruoyi.js +++ b/src/utils/ruoyi.js @@ -1,5 +1,3 @@ - - /** * 閫氱敤js鏂规硶灏佽澶勭悊 * Copyright (c) 2019 ruoyi @@ -37,7 +35,9 @@ const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { let value = formatObj[key] // Note: getDay() returns 0 on Sunday - if (key === 'a') { return ['鏃�', '涓�', '浜�', '涓�', '鍥�', '浜�', '鍏�'][value] } + if (key === 'a') { + return ['鏃�', '涓�', '浜�', '涓�', '鍥�', '浜�', '鍏�'][value] + } if (result.length > 0 && value < 10) { value = '0' + value } @@ -88,7 +88,7 @@ // 鍥炴樉鏁版嵁瀛楀吀锛堝瓧绗︿覆銆佹暟缁勶級 export function selectDictLabels(datas, value, separator) { - if (value === undefined || value.length ===0) { + if (value === undefined || value.length === 0) { return ""; } if (Array.isArray(value)) { @@ -114,7 +114,9 @@ // 瀛楃涓叉牸寮忓寲(%s ) export function sprintf(str) { - var args = arguments, flag = true, i = 1; + var args = arguments, + flag = true, + i = 1; str = str.replace(/%s/g, function () { var arg = args[i++]; if (typeof arg === 'undefined') { @@ -202,9 +204,9 @@ } /** -* 鍙傛暟澶勭悊 -* @param {*} params 鍙傛暟 -*/ + * 鍙傛暟澶勭悊 + * @param {*} params 鍙傛暟 + */ export function tansParams(params) { let result = '' for (const propName of Object.keys(params)) { @@ -231,3 +233,15 @@ export function blobValidate(data) { return data.type !== 'application/json' } + + +export function getNormalPath(p) { + if (p.length === 0 || !p || p === 'undefined') { + return p; + } + const res = p.replace('//', '/'); + if (res[res.length - 1] === '/') { + return res.slice(0, res.length - 1); + } + return res; +} diff --git a/src/utils/validate.js b/src/utils/validate.js index 57a568e..2f80643 100644 --- a/src/utils/validate.js +++ b/src/utils/validate.js @@ -78,3 +78,7 @@ } return Array.isArray(arg) } + +export function isHttp(url) { + return url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1; +} diff --git a/src/views/components/noticeTable.vue b/src/views/components/noticeTable.vue new file mode 100644 index 0000000..ca39d0e --- /dev/null +++ b/src/views/components/noticeTable.vue @@ -0,0 +1,183 @@ +<template> + <div> + <div class="flex justify-between mb-[15px]"> + <div class="block mb-3 font-semibold fonts">寰呭姙浜嬮」</div> + <div class="flex text-[12px]"> + <div + :class="{ active: currentTab === 'process' }" + class="tab" + @click="switchTab('process')" + > + 娴佺▼寰呭姙 + </div> + <!-- <div + :class="{ active: currentTab === 'progress' }" + class="tab" + @click="switchTab('progress')" + > + 杩涘害寰呭姙 + </div> --> + </div> + </div> + <el-table + :data="tableData" + :header-cell-style="{ + background: '#F5F7FC', + color: '#454B5E', + fontSize: '12px' + }" + height="280" + max-height="280" + > + <el-table-column + v-for="column in currentTableHeaders" + :key="column.prop" + :align="column.align" + :label="column.label" + :min-width="column.minWidth" + :prop="column.prop" + :show-overflow-tooltip="true" + > + </el-table-column> + + <el-table-column + align="center" + fixed="right" + label="鎿嶄綔" + min-width="150" + > + <template #default="scope"> + <el-button + plain + size="small" + type="primary" + @click="handleDetail(scope.row)" + > + 鏌ョ湅</el-button + > + <el-button + plain + size="small" + type="primary" + @click="handleUpdate(scope.row)" + > + 澶勭疆</el-button + > + </template> + </el-table-column> + </el-table> + <pagination + v-show="total >= 0" + :limit="queryParams.pageSize" + :page="queryParams.pageNum" + :total="total" + @pagination="getList" + /> + </div> +</template> +<script> + +import { getTodo } from '@/api/message'; +export default { + data() { + return { + currentTab: "process", + total: 0, + queryParams: { + pageNum: 1, + pageSize: 10 + }, + tableData: [], + currentTableHeaders: [ + { label: '娴佺▼鐜妭', prop: 'name', minWidth: 150, align: 'left' }, + { label: '鐢宠椤圭洰', prop: 'businessName', minWidth: 150, align: 'left' }, + { label: '瀹℃壒浜�', prop: 'assigneeName', minWidth: 100, align: 'left' }, + { label: '鍓╀綑鏃堕棿', prop: 'remainingTime', minWidth: 143, align: 'left' } + ] + } + }, + props: { + calculation: [], + countExceptionProjectData: {}, + }, + created() { + this.getList(); + }, + methods: { + async getList() { + const resp = await getTodo(this.queryParams); + if (resp.code === 200) { + this.total.value = resp.total; + this.tableData.value = resp.rows; + } + }, + handleDetail(row) { + console.log(111); + this.$router.push({ + path: '/projectManage/nodeDetails', + query: { + taskId: row.id, + id: row.businessKey, + disabled: 'true' + } + }); + }, + handleUpdate(row) { + this.$router.push({ + path: '/projectManage/nodeDetails', + query: { + taskId: row.id, + id: row.businessKey + } + }); + console.log(111); + }, + switchTab(tab) { + this.currentTab = tab; + } + } +} + +</script> + +<style lang="scss" scoped> +.tab { + padding: 8px; + border: 1px solid #dbdeea; + cursor: pointer; + width: 72px; +} + +.active { + border: 1px solid #3369ff; + color: #3369ff; +} + +.fonts { + font-size: 16px; + color: #212a40; + display: flex; + align-items: center; +} + +::v-deep .el-table__row { + font-size: 12px; +} + +::v-deep .el-pagination { + margin: -15px; + text-align: end; +} + +::v-deep .el-pagination .btn-prev .el-icon, + ::v-deep .el-pagination .btn-next .el-icon +{ + display: inline; +} +.flex { + display: flex; + justify-content: space-between; + font-size: 12px; +} + +</style> diff --git a/src/views/components/projectOverview.vue b/src/views/components/projectOverview.vue new file mode 100644 index 0000000..9bac571 --- /dev/null +++ b/src/views/components/projectOverview.vue @@ -0,0 +1,308 @@ +<template> + <div class="overview-bottom"> + <div class="abnormal" @click="showAbnormal"> + <div style="margin-bottom: 30px">寮傚父椤圭洰鎯呭喌缁熻</div> + <div> + <div class="abnormal-center"> + 娴佺▼寮傚父椤圭洰锛�<span + style="font-size: 16px; font-weight: 700" + >{{ + countExceptionProjectData.processExceptionProject + }}</span + > + </div> + <div class="abnormal-center"> + 璧勯噾寮傚父椤圭洰锛�<span + style="font-size: 16px; font-weight: 700" + >0</span + > + </div> + <div class="abnormal-center"> + 杩涘害寮傚父椤圭洰锛�<span + style="font-size: 16px; font-weight: 700" + >0</span + > + </div> + </div> + <div class="abnormal-img"></div> + </div> + <div class="flex gap-[10px] ml-[10px] flex-wrap custom-min-width"> + <div + v-for="i in calculation" + :key="i.text" + :class="setbcStyle(i.text)" + class="listings" + @click="showDetail(i.text)" + > + <div :class="setTextStyle(i.text)" class="title"> + {{ i.text }} + </div> + <div class="conter"> + <div :class="setTextColor(i.text)" class="mun"> + {{ i.mun }} + </div> + <div class="statistics"> + <div>{{ i.statistics }}</div> + <div :class="setTextColor(i.text)"> + {{ i.statisticsMun + }}<span style="font-size: 18px">浜�</span> + </div> + </div> + </div> + </div> + <!-- <div class="listings"> + <div class="title"> + 鍌� + </div> + <div class="conter"> + <div class="mun">44</div> + <div class="statistics"> + <div>鍌ㄥ椤圭洰鏁伴噺缁熻</div> + <div class="statistics-mun">1233<span style="font-size: 18px;">浜�</span></div> + </div> + </div> + </div> + <div class="listings"> + <div class="title"> + 鍌� + </div> + <div class="conter"> + <div class="mun">44</div> + <div class="statistics"> + <div>鍌ㄥ椤圭洰鏁伴噺缁熻</div> + <div class="statistics-mun">1233<span style="font-size: 18px;">浜�</span></div> + </div> + </div> + </div> + <div class="listings"> + <div class="title"> + 鍌� + </div> + <div class="conter"> + <div class="mun">44</div> + <div class="statistics"> + <div>鍌ㄥ椤圭洰鏁伴噺缁熻</div> + <div class="statistics-mun">1233<span style="font-size: 18px;">浜�</span></div> + </div> + </div> + </div> + <div class="listings"> + <div class="title"> + 鍌� + </div> + <div class="conter"> + <div class="mun">44</div> + <div class="statistics"> + <div>鍌ㄥ椤圭洰鏁伴噺缁熻</div> + <div class="statistics-mun">1233<span style="font-size: 18px;">浜�</span></div> + </div> + </div> + </div> + <div class="listings"> + <div class="title"> + 鍌� + </div> + <div class="conter"> + <div class="mun">44</div> + <div class="statistics"> + <div>鍌ㄥ椤圭洰鏁伴噺缁熻</div> + <div class="statistics-mun">1233<span style="font-size: 18px;">浜�</span></div> + </div> + </div> + </div> + <div class="listings"> + <div class="title"> + 鍌� + </div> + <div class="conter"> + <div class="mun">44</div> + <div class="statistics"> + <div>鍌ㄥ椤圭洰鏁伴噺缁熻</div> + <div class="statistics-mun">1233<span style="font-size: 18px;">浜�</span></div> + </div> + </div> + </div> + <div class="listings"> + <div class="title active"> + 鍌� + </div> + <div class="conter"> + <div class="mun">44</div> + <div class="statistics"> + <div>鍌ㄥ椤圭洰鏁伴噺缁熻</div> + <div class="statistics-mun">1233<span style="font-size: 18px;">浜�</span></div> + </div> + </div> + </div> --> + </div> + </div> +</template> + +<script > +export default { + name: "Index", + data() { + return {} + }, + props: { + calculation: [], + countExceptionProjectData: {}, + }, + methods: { + setTextStyle(text) { + if (text === '鍌�') return 'bg-[#3369FF]'; + if (text === '寤�') return 'bg-[#64ADFD]'; + if (text === '鐪�') return 'bg-[#FF5E57]'; + if (text === '甯�') return 'bg-[#FFA83F]'; + if (text === '鏂�') return 'bg-[#5DD1E5]'; + if (text === '绔�') return 'bg-[#576BF5]'; + if (text === '鍘�') return 'bg-[#3369FF]'; + if (text === '鏅�') return 'bg-[#64ADFD]'; + return ''; + }, + + + setTextColor(text) { + if (text === '鍌�') return 'text-[#3369FF]'; + if (text === '寤�') return 'text-[#64ADFD]'; + if (text === '鐪�') return 'text-[#FF5E57]'; + if (text === '甯�') return 'text-[#FFA83F]'; + if (text === '鏂�') return 'text-[#5DD1E5]'; + if (text === '绔�') return 'text-[#576BF5]'; + if (text === '鍘�') return 'text-[#3369FF]'; + if (text === '鏅�') return 'text-[#64ADFD]'; + return ''; + }, + + // 璺宠浆鍒板紓甯搁」鐩� + showAbnormal() { + console.log('璺宠浆寮傚父椤圭洰'); + this.$router.push({ + path: 'projectEngineering/project/abnormalProject' + }); + }, + + // 璺宠浆鍒板搴旂殑椤圭洰搴� + showDetail(text) { + console.log('璺宠浆鍒板搴旂殑椤圭洰搴�', text); + switch (text) { + case '鍌�': + this.$router.push({ + path: '/projectEngineering/project/reserveProjects', + query: { + projectCategory: '1' + } + }); + break; + case '鏂�': + this.$router.push({ + path: '/projectEngineering/project/previousProjects', + query: { + projectCategory: '2' + } + }); + break; + case '寤�': + this.$router.push({ + path: '/projectEngineering/project/implementationProject', + query: { + projectCategory: '3' + } + }); + break; + case '绔�': + this.$router.push({ + path: '/projectEngineering/project/completedProjects', + query: { + projectCategory: '4' + } + }); + break; + default: + break; + } + } + } +} +</script> +<style lang="scss" scoped> +.overview-bottom { + display: flex; + justify-content: space-between; + + .abnormal { + position: relative; + width: 25%; + min-width: 342px; + height: 200px; + background-image: url(../../assets/images/b.png); + background-size: 100% auto; + border-radius: 6px; + font-size: 16px; + color: #ffffff; + padding: 20px 0 0 20px; + + .abnormal-center { + margin-bottom: 15px; + } + + .abnormal-img { + position: absolute; + right: 50px; + bottom: 20px; + width: 100px; + height: 100px; + background-image: url(../../assets/images/c.png); + } + } + + .custom-min-width { + min-width: 1250px; + width: 1250px; + } + + .listings { + width: 300px; + height: 90px; + border-radius: 6px; + display: flex; + align-items: center; + + .title { + width: 45px; + height: 45px; + font-size: 24px; + border-radius: 8px; + line-height: 45px; + text-align: center; + margin-left: 15px; + color: #ffffff; + } + + .active { + background-color: #3369ff; + } + + .conter { + margin-left: 10px; + + .mun { + font-size: 30px; + line-height: 32px; + } + + .statistics { + width: 200px; + display: flex; + justify-content: space-between; + align-items: center; + + // .statistics-mun { + // // color: #3369FF; + // } + } + } + } +} + +</style> diff --git a/src/views/components/tidingsTable.vue b/src/views/components/tidingsTable.vue new file mode 100644 index 0000000..358cd14 --- /dev/null +++ b/src/views/components/tidingsTable.vue @@ -0,0 +1,283 @@ +<template> + <div> + <div class="flex justify-between mb-[15px]"> + <div class="block mb-3 font-semibold fonts">娑堟伅涓績</div> + <div class="flex text-[12px]"> + <div + v-for="tab in tabs" + :key="tab.id" + :class="{ active: currentTabId === tab.id }" + class="tab relative" + @click="switchTab(tab.id)" + > + {{ tab.label }} + <div v-if="tab.num" class="w-[15px] h-[15px] num"> + {{ tab.num }} + </div> + </div> + </div> + </div> + <el-table + :data="tableData" + :header-cell-style="{ + background: '#F5F7FC', + color: '#454B5E', + fontSize: '12px' + }" + height="280" + max-height="280" + > + <el-table-column + v-for="column in currentTableHeaders" + :key="column.prop" + :align="column.align" + :label="column.label" + :min-width="column.minWidth" + :prop="column.prop" + > + <template v-if="column.slot === 'sort'" #default="scope"> + <div + :class=" + getSortClass( + (queryParams.pageNum - 1) * + queryParams.pageSize + + scope.$index + + 1 + ) + " + class="sort" + > + <span>{{ + (queryParams.pageNum - 1) * queryParams.pageSize + + scope.$index + + 1 + }}</span> + </div> + </template> + </el-table-column> + + <el-table-column + align="center" + class="relative" + fixed="right" + label="鎿嶄綔" + min-width="72" + > + <template #default="scope"> + <el-button + plain + size="small" + type="primary" + @click="handleDetail(scope.row)" + > + 鏌ョ湅</el-button + > + <div v-if="scope.row.isRead === '0'" class="viewRead"></div> + </template> + </el-table-column> + </el-table> + <pagination + v-show="total >= 0" + :limit="queryParams.pageSize" + :page="queryParams.pageNum" + :total="total" + @pagination="getList" + /> + </div> +</template> +<script> +import { getMessage, getMessageCount, getRead } from '@/api/message'; + +export default { + name: "Index", + data() { + return { + total: 0, + queryParams: { + pageNum: 1, + pageSize: 10 + }, + tableData: [], + tabs: [ + // { id: 'process', label: '閫氱煡鍏憡', num: '2' }, + { id: 'review', label: '瀹℃牳娑堟伅', num: '6' } + // { id: 'supervision', label: '鐫e姙娑堟伅', num: '9' }, + // { id: 'progress', label: '杩涘害娑堟伅', num: '7' } + ], + currentTabId: 0, + //閰嶇疆琛ㄦ牸琛ㄥご鏁版嵁 + currentTableHeaders: [ + { label: '鎺掑簭', prop: 'index', minWidth: 50, align: 'center', slot: 'sort' }, + { label: '鍙戝竷鍗曚綅', prop: 'commitDept', minWidth: 150, align: 'left' }, + { label: '鍐呭', prop: 'content', minWidth: 300, align: 'left' }, + { label: '鏃堕棿', prop: 'createTime', minWidth: 143, align: 'left' } + ] + } + }, + props: { + calculation: [], + countExceptionProjectData: {}, + }, + created() { + this.currentTabId = this.tabs[0].id; // 榛樿閫変腑鐨則ab鐨刬d + this.getList(); + this.getMessageCountFun(); + }, + methods: { + + + async getList() { + const resp = await getMessage(this.queryParams); + if (resp.code === 200) { + this.total = resp.total; + this.tableData = resp.rows; + } + }, + + async getMessageCountFun() { + const resp = await getMessageCount(); + if (resp.code === 200) { + this.tabs = tabs.map((tab) => { + if (tab.label === '瀹℃牳娑堟伅') { + tab.num = resp.data.auditCount; + } + return tab; + }); + } + }, + + + switchTab(tabId) { + currentTabId = tabId; + }, + + getSortClass(index) { + if (index === 1) { + return 'actives'; + } else if (index === 2) { + return 'two'; + } else if (index === 3) { + return 'three'; + } else { + return ''; + } + }, + + async getReadFun(id) { + const resp = await this.getRead(id); + if (resp.code === 200) { + await this.getMessageCountFun(); + } + }, + handleDetail(row) { + this.getReadFun(row.id); + if (row.auditType === '2') { + this.$router.push({ + path: '/projectManage/nodeDetails', + query: { taskId: row.taskId, id: row.businessKey, auditType: row.auditType, disabled: 'true' } + }); + } else { + this.$router.push({ + path: '/projectManage/nodeDetails', + query: { taskId: row.taskId, id: row.businessKey, disabled: 'true' } + }); + } + } + + } +} +</script> + +<style lang="scss" scoped> +.tab { + padding: 8px; + border: 1px solid #dbdeea; + cursor: pointer; + width: 72px; +} + +.active { + border: 1px solid #3369ff; + color: #3369ff; +} + +.fonts { + font-size: 16px; + color: #212a40; + display: flex; + align-items: center; +} + +.num { + position: absolute; + z-index: 999; + top: -5px; + right: -5px; + border-radius: 50%; + background: #f63f41; + color: #fff; + display: flex; + align-items: center; + justify-content: center; + font-size: 12px; +} + +::v-deep .el-table__row { + font-size: 12px; +} + +.sort { + width: 20px; + height: 20px; + border-radius: 50%; + background-color: #eaf0ff; + text-align: center; + color: #3369ff; +} + +.actives { + background-color: #3369ff; + color: #fff; +} + +.two { + background-color: #5c87ff; + color: #fff; +} + +.three { + background-color: #85a5ff; + color: #fff; +} + +::v-deep .el-pagination { + margin: -15px; + text-align: end; +} +::v-deep .el-pagination .btn-prev .el-icon, + ::v-deep .el-pagination .btn-next .el-icon +{ + display: inline; +} +.viewRead { + width: 4px; + height: 4px; + position: absolute; + z-index: 999; + top: 10px; + right: 20px; + border-radius: 50%; + background: #f63f41; + color: #fff; + display: flex; + align-items: center; + justify-content: center; + font-size: 12px; +} + +.flex { + display: flex; + justify-content: space-between; + font-size: 12px; +} +</style> diff --git a/src/views/index.vue b/src/views/index.vue index a7d3732..82171b7 100644 --- a/src/views/index.vue +++ b/src/views/index.vue @@ -1,1097 +1,348 @@ <template> - <div class="app-container home"> - <el-row :gutter="20"> - <el-col :sm="24" :lg="24"> - <blockquote class="text-warning" style="font-size: 14px"> - 棰嗗彇闃块噷浜戦�氱敤浜戜骇鍝�1888浼樻儬鍒� - <br /> - <el-link - href="https://www.aliyun.com/minisite/goods?userCode=brki8iof" - type="primary" - target="_blank" - >https://www.aliyun.com/minisite/goods?userCode=brki8iof</el-link - > - <br /> - 棰嗗彇鑵捐浜戦�氱敤浜戜骇鍝�2860浼樻儬鍒� - <br /> - <el-link - href="https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console" - type="primary" - target="_blank" - >https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console</el-link - > - <br /> - 闃块噷浜戞湇鍔″櫒鎶樻墸鍖� - <el-link href="http://aly.ruoyi.vip" type="primary" target="_blank" - >>鈽涒槢鐐规垜杩涘叆鈽氣槡</el-link - > - 鑵捐浜戞湇鍔″櫒绉掓潃鍖� - <el-link href="http://txy.ruoyi.vip" type="primary" target="_blank" - >>鈽涒槢鐐规垜杩涘叆鈽氣槡</el-link - ><br /> - <h4 class="text-danger"> - 浜戜骇鍝侀�氱敤绾㈠寘锛屽彲鍙犲姞瀹樼綉甯歌浼樻儬浣跨敤銆�(浠呴檺鏂扮敤鎴�) - </h4> - </blockquote> - - <hr /> - </el-col> - </el-row> - <el-row :gutter="20"> - <el-col :sm="24" :lg="12" style="padding-left: 20px"> - <h2>灏勬椽椤圭洰鍚庡彴绠$悊妗嗘灦</h2> - <p> - 涓�鐩存兂鍋氫竴娆惧悗鍙扮鐞嗙郴缁燂紝鐪嬩簡寰堝浼樼鐨勫紑婧愰」鐩絾鏄彂鐜版病鏈夊悎閫傝嚜宸辩殑銆備簬鏄埄鐢ㄧ┖闂蹭紤鎭椂闂村紑濮嬭嚜宸卞啓涓�濂楀悗鍙扮郴缁熴�傚姝ゆ湁浜嗗皠娲」鐩鐞嗙郴缁燂紝濂瑰彲浠ョ敤浜庢墍鏈夌殑Web搴旂敤绋嬪簭锛屽缃戠珯绠$悊鍚庡彴锛岀綉绔欎細鍛樹腑蹇冿紝CMS锛孋RM锛孫A绛夌瓑锛屽綋鐒讹紝鎮ㄤ篃鍙互瀵瑰ス杩涜娣卞害瀹氬埗锛屼互鍋氬嚭鏇村己绯荤粺銆傛墍鏈夊墠绔悗鍙颁唬鐮佸皝瑁呰繃鍚庡崄鍒嗙簿绠�鏄撲笂鎵嬶紝鍑洪敊姒傜巼浣庛�傚悓鏃舵敮鎸佺Щ鍔ㄥ鎴风璁块棶銆傜郴缁熶細闄嗙画鏇存柊涓�浜涘疄鐢ㄥ姛鑳姐�� - </p> - <p> - <b>褰撳墠鐗堟湰:</b> <span>v{{ version }}</span> - </p> - <p> - <el-tag type="danger">¥鍏嶈垂寮�婧�</el-tag> - </p> - <p> - <el-button - type="primary" - size="mini" - icon="el-icon-cloudy" - plain - @click="goTarget('https://gitee.com/y_project/RuoYi-Vue')" - >璁块棶鐮佷簯</el-button - > - <el-button - size="mini" - icon="el-icon-s-home" - plain - @click="goTarget('http://ruoyi.vip')" - >璁块棶涓婚〉</el-button - > - </p> - </el-col> - - <el-col :sm="24" :lg="12" style="padding-left: 50px"> - <el-row> - <el-col :span="12"> - <h2>鎶�鏈�夊瀷</h2> - </el-col> - </el-row> - <el-row> - <el-col :span="6"> - <h4>鍚庣鎶�鏈�</h4> - <ul> - <li>SpringBoot</li> - <li>Spring Security</li> - <li>JWT</li> - <li>MyBatis</li> - <li>Druid</li> - <li>Fastjson</li> - <li>...</li> - </ul> - </el-col> - <el-col :span="6"> - <h4>鍓嶇鎶�鏈�</h4> - <ul> - <li>Vue</li> - <li>Vuex</li> - <li>Element-ui</li> - <li>Axios</li> - <li>Sass</li> - <li>Quill</li> - <li>...</li> - </ul> - </el-col> - </el-row> - </el-col> - </el-row> - <el-divider /> - <el-row :gutter="20"> - <el-col :xs="24" :sm="24" :md="12" :lg="8"> - <el-card class="update-log"> - <div slot="header" class="clearfix"> - <span>鑱旂郴淇℃伅</span> - </div> - <div class="body"> - <p> - <i class="el-icon-s-promotion"></i> 瀹樼綉锛�<el-link - href="http://www.ruoyi.vip" - target="_blank" - >http://www.ruoyi.vip</el-link - > - </p> - <p> - <i class="el-icon-user-solid"></i> QQ缇わ細<s> 婊�937441 </s> <s> 婊�887144332 </s> - <s> 婊�180251782 </s> <s> 婊�104180207 </s> <s> 婊�186866453 </s> <s> 婊�201396349 </s> - <s> 婊�101456076 </s> <s> 婊�101539465 </s> <s> 婊�264312783 </s> <s> 婊�167385320 </s> - <s> 婊�104748341 </s> <s> 婊�160110482 </s> <s> 婊�170801498 </s> <s> 婊�108482800 </s> - <s> 婊�101046199 </s> <s> 婊�136919097 </s> <s> 婊�143961921 </s> <s> 婊�174951577 </s> - <s> 婊�161281055 </s> <s> 婊�138988063 </s> <a href="http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=SUc-msaypcqB2UTFif4eqGlBHkKcvMNP&authKey=JdQBouY2PG%2BS%2BCzAfIgbCGNgxyahpfh24IW%2F03rPxGilhqVbisLma%2FFFnt79DHNh&noverify=0&group_code=151450850" target="_blank">151450850</a> - </p> - <p> - <i class="el-icon-chat-dot-round"></i> 寰俊锛�<a - href="javascript:;" - >/ *灏勬椽椤圭洰</a - > - </p> - <p> - <i class="el-icon-money"></i> 鏀粯瀹濓細<a - href="javascript:;" - class="鏀粯瀹濅俊鎭�" - >/ *灏勬椽椤圭洰</a - > - </p> - </div> - </el-card> - </el-col> - <el-col :xs="24" :sm="24" :md="12" :lg="8"> - <el-card class="update-log"> - <div slot="header" class="clearfix"> - <span>鏇存柊鏃ュ織</span> - </div> - <el-collapse accordion> - <el-collapse-item title="v3.8.8 - 2024-06-30"> - <ol> - <li>鑿滃崟绠$悊鏂板璺敱鍚嶇О</li> - <li>鏂板鏁版嵁鑴辨晱杩囨护娉ㄨВ</li> - <li>鐢ㄦ埛瀵嗙爜鏂板闈炴硶瀛楃楠岃瘉</li> - <li>闄愬埗鐢ㄦ埛鎿嶄綔鏁版嵁鏉冮檺鑼冨洿</li> - <li>浠g爜鐢熸垚鏂板鍒涘缓琛ㄧ粨鏋勫姛鑳�</li> - <li>瀹氭椂浠诲姟鐧藉悕鍗曢厤缃寖鍥寸缉灏�</li> - <li>浼樺寲浠g爜鐢熸垚涓诲瓙琛ㄥ叧鑱旀煡璇㈡柟寮�</li> - <li>Excel娉ㄨВ鏂板灞炴�omboReadDict</li> - <li>Excel娉ㄨВColumnType绫诲瀷鏂板鏂囨湰</li> - <li>鏂板鍥介檯鍖栬祫婧愭枃浠堕厤缃�</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.6.1</li> - <li>鍗囩骇druid鍒版渶鏂扮増鏈�1.2.23</li> - <li>鍗囩骇core-js鍒版渶鏂扮増鏈�3.37.1</li> - <li>鏇存柊HttpUtils涓殑User-Agent</li> - <li>鏇存柊compressionPlugin鍒�6.1.2浠ュ吋瀹筺ode18+</li> - <li>鍗囩骇spring-security鍒板畨鍏ㄧ増鏈紝闃叉婕忔礊椋庨櫓</li> - <li>鍗囩骇spring-framework鍒板畨鍏ㄧ増鏈紝闃叉婕忔礊椋庨櫓</li> - <li>浼樺寲鑷畾涔塜SS娉ㄨВ鍖归厤鏂瑰紡</li> - <li>浼樺寲缂撳瓨鐩戞帶閿悕鍒楄〃鎺掑簭鏄剧ず</li> - <li>浼樺寲瀹氭椂浠诲姟鏃ュ織榛樿鎸夋椂闂存帓搴�</li> - <li>浼樺寲榛樿鏂囦欢澶у皬瓒呰繃2G鏃犳晥鐨勯棶棰�</li> - <li>浼樺寲鏌ヨ〃鐗规畩瀛楃浣跨敤鍙嶆枩鏉犺繘琛岃浆涔�</li> - <li>浼樺寲瀹氭椂浠诲姟cron琛ㄨ揪寮忓皬鏃堕厤缃樉绀洪敊璇棶棰�</li> - <li>浼樺寲澶氫釜鑷畾鏁版嵁鏉冮檺浣跨敤in鏌ヨ,閬垮厤澶氭鎷兼帴</li> - <li>浼樺寲瀵煎叆Excel鏃惰缃甦ictType灞炴�ч噸澶嶆煡缂撳瓨闂</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.8.7 - 2023-12-08"> - <ol> - <li>鎿嶄綔鏃ュ織璁板綍閮ㄩ棬鍚嶇О</li> - <li>鍏ㄥ眬鏁版嵁瀛樺偍鐢ㄦ埛缂栧彿</li> - <li>鏂板缂栫▼寮忓垽鏂祫婧愯闂潈闄�</li> - <li>鎿嶄綔鏃ュ織鍒楄〃鏂板IP鍦板潃鏌ヨ</li> - <li>瀹氭椂浠诲姟鏂板椤靛幓闄ょ姸鎬侀�夐」</li> - <li>浠g爜鐢熸垚鏀寔閫夋嫨鍓嶇妯℃澘绫诲瀷</li> - <li>鏄鹃殣鍒楃粍浠舵敮鎸佸閫夋寮瑰嚭绫诲瀷</li> - <li>閫氱敤鎺掑簭灞炴�rderBy鍙傛暟闄愬埗闀垮害</li> - <li>Excel鑷畾涔夋暟鎹鐞嗗櫒澧炲姞鍗曞厓鏍�/宸ヤ綔绨垮璞�</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.4.8</li> - <li>鍗囩骇druid鍒版渶鏂扮増鏈�1.2.20</li> - <li>鍗囩骇fastjson鍒版渶鏂扮増2.0.43</li> - <li>鍗囩骇pagehelper鍒版渶鏂扮増1.4.7</li> - <li>鍗囩骇commons.io鍒版渶鏂扮増鏈�2.13.0</li> - <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.14</li> - <li>淇浜旂骇璺敱缂撳瓨鏃犳晥闂</li> - <li>淇澶栭摼甯︾鍙e嚭鐜扮殑寮傚父</li> - <li>淇鏍戞ā鏉跨埗绾х紪鐮佸彉閲忛敊璇�</li> - <li>淇瀛楀吀琛ㄨ鎯呴〉闈㈡悳绱㈤棶棰�</li> - <li>淇鍐呴摼iframe娌℃湁浼犻�掑弬鏁伴棶棰�</li> - <li>淇鑷畾涔夊瓧鍏告牱寮忎笉鐢熸晥鐨勯棶棰�</li> - <li>淇瀛楀吀缂撳瓨鍒犻櫎鏂规硶鍙傛暟閿欒闂</li> - <li>淇Excel瀵煎叆鏁版嵁涓存椂鏂囦欢鏃犳硶鍒犻櫎闂</li> - <li>淇鏈櫥褰曞甫鍙傛暟璁块棶鎴愬姛鍚庡弬鏁颁涪澶遍棶棰�</li> - <li>淇HeaderSearch缁勪欢璺宠浆query鍙傛暟涓㈠け闂</li> - <li>淇浠g爜鐢熸垚瀵煎叆鍚庡繀濉」涓庢暟鎹簱涓嶅尮閰嶉棶棰�</li> - <li>淇Excels瀵煎叆鏃舵棤娉曡幏鍙栧埌dictType瀛楀吀鍊奸棶棰�</li> - <li>浼樺寲涓嬭浇zip鏂规硶鏂板閬僵灞�</li> - <li>浼樺寲澶村儚涓婁紶鍙傛暟鏂板鏂囦欢鍚嶇О</li> - <li>浼樺寲瀛楀吀鏍囩鏀寔鑷畾涔夊垎闅旂</li> - <li>浼樺寲鑿滃崟绠$悊绫诲瀷涓烘寜閽姸鎬佸彲閫�</li> - <li>浼樺寲鍓嶇闃查噸澶嶆彁浜ゆ暟鎹ぇ灏忛檺鍒�</li> - <li>浼樺寲TopNav鑿滃崟娌℃湁鍥炬爣svg涓嶆樉绀�</li> - <li>浼樺寲鏁板瓧閲戦澶у啓杞崲绮惧害涓㈠け闂</li> - <li>浼樺寲瀵屾枃鏈珽ditor缁勪欢妫�楠屽浘鐗囨牸寮�</li> - <li>浼樺寲椤电鍦‵irefox娴忚鍣ㄨ閬尅鐨勯棶棰�</li> - <li>浼樺寲涓汉涓績/鍩烘湰璧勬枡淇敼鏃舵暟鎹樉绀洪棶棰�</li> - <li>浼樺寲缂撳瓨鐩戞帶鍥捐〃鏀寔璺熼殢灞忓箷澶у皬鑷�傚簲璋冩暣</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.8.6 - 2023-06-30"> - <ol> - <li>鏀寔鐧诲綍IP榛戝悕鍗曢檺鍒�</li> - <li>鏂板鐩戞帶椤甸潰鍥炬爣鏄剧ず</li> - <li>鎿嶄綔鏃ュ織鏂板娑堣�楁椂闂村睘鎬�</li> - <li>灞忚斀瀹氭椂浠诲姟bean杩濊鐨勫瓧绗�</li> - <li>鏃ュ織绠$悊浣跨敤绱㈠紩鎻愬崌鏌ヨ鎬ц兘</li> - <li>鏃ュ織娉ㄨВ鏀寔鎺掗櫎鎸囧畾鐨勮姹傚弬鏁�</li> - <li>鏀寔鑷畾涔夐殣钘忓睘鎬у垪杩囨护瀛愬璞�</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.4.3</li> - <li>鍗囩骇druid鍒版渶鏂扮増鏈�1.2.16</li> - <li>鍗囩骇fastjson鍒版渶鏂扮増2.0.34</li> - <li>鍗囩骇spring-boot鍒版渶鏂扮増鏈�2.5.15</li> - <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.13</li> - <li>绉婚櫎apache/commons-fileupload渚濊禆</li> - <li>淇椤甸潰鍒囨崲鏃跺竷灞�閿欎贡鐨勯棶棰�</li> - <li>淇鍖垮悕娉ㄨВAnonymous绌烘寚閽堥棶棰�</li> - <li>淇璺敱璺宠浆琚樆姝㈡椂鍐呴儴浜х敓鎶ラ敊淇℃伅闂</li> - <li>淇isMatchedIp鐨勫弬鏁板垽鏂骇鐢熺┖鎸囬拡鐨勯棶棰�</li> - <li>淇鐢ㄦ埛澶氳鑹叉暟鎹潈闄愬彲鑳藉嚭鐜版潈闄愭姮鍗囩殑鎯呭喌</li> - <li>淇寮�鍚疶opNav鍚庝竴绾ц彍鍗曡矾鐢卞弬鏁拌缃棤鏁堥棶棰�</li> - <li>淇DictTag缁勪欢value娌℃湁鍖归厤鐨勫�兼椂鍒欏睍绀簐alue</li> - <li>浼樺寲鏂囦欢涓嬭浇鍑虹幇鐨勫紓甯�</li> - <li>浼樺寲閫夋嫨鍥炬爣缁勪欢楂樹寒鍥炴樉</li> - <li>浼樺寲寮圭獥鍚庡鑸爮鍋忕Щ鐨勯棶棰�</li> - <li>浼樺寲淇敼瀵嗙爜鏃ュ織瀛樺偍鏄庢枃闂</li> - <li>浼樺寲椤电鏍忓叧闂叾浠栧嚭鐜扮殑寮傚父闂</li> - <li>浼樺寲椤电鍏抽棴宸︿晶閫夐」鎺掗櫎棣栭〉閫夐」</li> - <li>浼樺寲鍏抽棴褰撳墠tab椤佃烦杞渶鍙充晶tab椤�</li> - <li>浼樺寲缂撳瓨鍒楄〃娓呴櫎鎿嶄綔鎻愮ず涓嶅彉鐨勯棶棰�</li> - <li>浼樺寲瀛楃鏈娇鐢ㄤ笅鍒掔嚎涓嶈繘琛岄┘宄板紡澶勭悊</li> - <li>浼樺寲鐢ㄦ埛瀵煎叆鏇存柊鏃堕渶鑾峰彇鐢ㄦ埛缂栧彿闂</li> - <li>浼樺寲渚ц竟鏍忕殑骞冲彴鏍囬涓嶸UE_APP_TITLE淇濇寔鍚屾</li> - <li>浼樺寲瀵煎嚭Excel鏃惰缃甦ictType灞炴�ч噸澶嶆煡缂撳瓨闂</li> - <li>杩炴帴姹燚ruid鏀寔鏂扮殑閰嶇疆connectTimeout鍜宻ocketTimeout</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.8.5 - 2023-01-01"> - <ol> - <li>瀹氭椂浠诲姟杩濊鐨勫瓧绗�</li> - <li>閲嶇疆鏃跺彇娑堥儴闂ㄩ�変腑</li> - <li>鏂板杩斿洖璀﹀憡娑堟伅鎻愮ず</li> - <li>蹇界暐涓嶅繀瑕佺殑灞炴�ф暟鎹繑鍥�</li> - <li>淇敼鍙傛暟閿悕鏃剁Щ闄ゅ墠缂撳瓨閰嶇疆</li> - <li>瀵煎叆鏇存柊鐢ㄦ埛鏁版嵁鍓嶆牎楠屾暟鎹潈闄�</li> - <li>鍏煎Excel涓嬫媺妗嗗唴瀹硅繃澶氭棤娉曟樉绀虹殑闂</li> - <li>鍗囩骇echarts鍒版渶鏂扮増鏈�5.4.0</li> - <li>鍗囩骇core-js鍒版渶鏂扮増鏈�3.25.3</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.4.0</li> - <li>鍗囩骇kaptcha鍒版渶鏂扮増2.3.3</li> - <li>鍗囩骇druid鍒版渶鏂扮増鏈�1.2.15</li> - <li>鍗囩骇fastjson鍒版渶鏂扮増2.0.20</li> - <li>鍗囩骇pagehelper鍒版渶鏂扮増1.4.6</li> - <li>浼樺寲寮圭獥鍐呭杩囧灞曠ず涓嶅叏闂</li> - <li>浼樺寲swagger-ui闈欐�佽祫婧愪娇鐢ㄧ紦瀛�</li> - <li>寮�鍚疶opNav娌℃湁瀛愯彍鍗曢殣钘忎晶杈规爮</li> - <li>鍒犻櫎fuse鏃犳晥閫夐」maxPatternLength</li> - <li>浼樺寲瀵煎嚭瀵硅薄鐨勫瓙鍒楄〃涓虹┖浼氬嚭鐜癧]闂</li> - <li>浼樺寲缂栬緫澶村儚鏃堕�忔槑閮ㄥ垎浼氬彉鎴愰粦鑹查棶棰�</li> - <li>浼樺寲灏忓睆骞曚笂淇敼澶村儚鐣岄潰甯冨眬閿欎綅鐨勯棶棰�</li> - <li>淇浠g爜鐢熸垚鍕鹃�夊睘鎬ф棤鏁堥棶棰�</li> - <li>淇鏂囦欢涓婁紶缁勪欢鏍煎紡楠岃瘉闂</li> - <li>淇鍥炴樉鏁版嵁瀛楀吀鏁扮粍寮傚父闂</li> - <li>淇sheet瓒呭嚭鏈�澶ц鏁板紓甯搁棶棰�</li> - <li>淇Log娉ㄨВGET璇锋眰璁板綍涓嶅埌鍙傛暟闂</li> - <li>淇璋冨害鏃ュ織鐐瑰嚮澶氭鏁版嵁涓嶅彉鍖栫殑闂</li> - <li>淇涓婚棰滆壊鍦―rawer缁勪欢涓嶄細鍔犺浇闂</li> - <li>淇鏂囦欢鍚嶅寘鍚壒娈婂瓧绗︾殑鏂囦欢鏃犳硶涓嬭浇闂</li> - <li>淇table涓洿澶氭寜閽垏鎹富棰樿壊鏈敓鏁堜慨澶嶉棶棰�</li> - <li>淇鏌愪簺鐗规�х殑鐜鐢熸垚浠g爜鍙樹贡鐮乀XT鏂囦欢闂</li> - <li>淇浠g爜鐢熸垚鍥剧墖/鏂囦欢/鍗曢�夋椂閫夋嫨蹇呭~鏃犳硶鏍¢獙闂</li> - <li>淇鏌愪簺鐗规�х殑鎯呭喌鐢ㄦ埛缂栬緫瀵硅瘽妗嗕腑瑙掕壊鍜岄儴闂ㄦ棤娉曚慨鏀归棶棰�</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.8.4 - 2022-09-26"> - <ol> - <li>鏁版嵁閫昏緫鍒犻櫎涓嶈繘琛屽敮涓�楠岃瘉</li> - <li>Excel娉ㄨВ鏀寔瀵煎嚭瀵硅薄鐨勫瓙鍒楄〃鏂规硶</li> - <li>Excel娉ㄨВ鏀寔鑷畾涔夐殣钘忓睘鎬у垪</li> - <li>Excel娉ㄨВ鏀寔backgroundColor灞炴�ц缃儗鏅壊</li> - <li>鏀寔閰嶇疆瀵嗙爜鏈�澶ч敊璇鏁�/閿佸畾鏃堕棿</li> - <li>鐧诲綍鏃ュ織鏂板瑙i攣璐︽埛鍔熻兘</li> - <li>閫氱敤涓嬭浇鏂规硶鏂板config閰嶇疆閫夐」</li> - <li>鏀寔澶氭潈闄愬瓧绗﹀尮閰嶈鑹叉暟鎹潈闄�</li> - <li>椤甸潰鍐呭祵iframe鍒囨崲tab涓嶅埛鏂版暟鎹�</li> - <li>鎿嶄綔鏃ュ織璁板綍鏀寔鎺掗櫎鏁忔劅灞炴�у瓧娈�</li> - <li>淇澶氭枃浠朵笂浼犳姤閿欏嚭鐜扮殑寮傚父闂</li> - <li>淇鍥剧墖棰勮缁勪欢src灞炴�т负null鍊兼帶鍒跺彴鎶ラ敊闂</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.2.2</li> - <li>鍗囩骇fastjson鍒版渶鏂扮増2.0.14</li> - <li>鍗囩骇pagehelper鍒版渶鏂扮増1.4.3</li> - <li>鍗囩骇core-js鍒版渶鏂扮増鏈�3.25.2</li> - <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.10</li> - <li>浼樺寲浠诲姟杩囨湡涓嶆墽琛岃皟搴�</li> - <li>浼樺寲瀛楀吀鏁版嵁浣跨敤store瀛樺彇</li> - <li>浼樺寲淇敼璧勬枡澶村儚琚鐩栫殑闂</li> - <li>浼樺寲淇敼鐢ㄦ埛鐧诲綍璐﹀彿閲嶅楠岃瘉</li> - <li>浼樺寲浠g爜鐢熸垚鍚屾鍚庡�糔ULL闂</li> - <li>浼樺寲瀹氭椂浠诲姟鏀寔鎵ц鐖剁被鏂规硶</li> - <li>浼樺寲鐢ㄦ埛涓汉淇℃伅鎺ュ彛闃叉淇敼閮ㄩ棬</li> - <li>浼樺寲甯冨眬璁剧疆浣跨敤el-drawer鎶藉眽鏄剧ず</li> - <li>浼樺寲娌℃湁鏉冮檺鐨勭敤鎴风紪杈戦儴闂ㄧ己灏戞暟鎹�</li> - <li>浼樺寲鏃ュ織娉ㄨВ璁板綍闄愬埗璇锋眰鍦板潃鐨勯暱搴�</li> - <li>浼樺寲excel/scale灞炴�у鍑哄崟鍏冩牸鏁板�肩被鍨�</li> - <li>浼樺寲鏃ュ織鎿嶄綔涓噸缃寜閽椂閲嶅鏌ヨ鐨勯棶棰�</li> - <li>浼樺寲澶氫釜鐩稿悓瑙掕壊鏁版嵁瀵艰嚧鏉冮檺SQL閲嶅闂</li> - <li>浼樺寲琛ㄦ牸涓婂彸渚у伐鍏锋潯锛堟悳绱㈡寜閽樉闅�&鍙充晶鏍峰紡鍑稿嚭锛�</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.8.3 - 2022-06-27"> - <ol> - <li>鏂板缂撳瓨鍒楄〃鑿滃崟鍔熻兘</li> - <li>浠g爜鐢熸垚鏍戣〃鏂板(灞曞紑/鎶樺彔)</li> - <li>Excel娉ㄨВ鏀寔color瀛椾綋棰滆壊</li> - <li>鏂板Anonymous鍖垮悕璁块棶涓嶉壌鏉冩敞瑙�</li> - <li>鐢ㄦ埛澶村儚涓婁紶闄愬埗鍙兘涓哄浘鐗囨牸寮�</li> - <li>鎺ュ彛浣跨敤娉涘瀷浣垮叾鐪嬪埌鍝嶅簲灞炴�у瓧娈�</li> - <li>妫�鏌ュ畾鏃朵换鍔ean鎵�鍦ㄥ寘鍚嶆槸鍚︿负鐧藉悕鍗曢厤缃�</li> - <li>娣诲姞椤电openPage鏀寔浼犻�掑弬鏁�</li> - <li>鐢ㄦ埛缂撳瓨淇℃伅娣诲姞閮ㄩ棬ancestors绁栫骇鍒楄〃</li> - <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.8</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.1.6</li> - <li>鍗囩骇druid鍒版渶鏂扮増鏈�1.2.11</li> - <li>鍗囩骇fastjson鍒版渶鏂扮増2.0.8</li> - <li>鍗囩骇spring-boot鍒版渶鏂扮増鏈�2.5.14</li> - <li>闄嶇骇jsencrypt鐗堟湰鍏煎IE娴忚鍣�</li> - <li>鍒犻櫎澶氫綑鐨剆alt瀛楁</li> - <li>鏂板鑾峰彇涓嶅甫鍚庣紑鏂囦欢鍚嶇О鏂规硶</li> - <li>鏂板鑾峰彇閰嶇疆鏂囦欢涓殑灞炴�у�兼柟娉�</li> - <li>鏂板鍐呭缂栫爜/瑙g爜鏂逛究鎻掍欢闆嗘垚浣跨敤</li> - <li>瀛楀吀绫诲瀷蹇呴』浠ュ瓧姣嶅紑澶达紝涓斿彧鑳戒负锛堝皬鍐欏瓧姣嶏紝鏁板瓧锛屼笅婊戠嚎锛�</li> - <li>浼樺寲璁剧疆鍒嗛〉鍙傛暟榛樿鍊�</li> - <li>浼樺寲瀵圭┖瀛楃涓插弬鏁板鐞嗙殑杩囨护</li> - <li>浼樺寲鏄剧ず椤哄簭orderNum绫诲瀷涓烘暣鍨�</li> - <li>浼樺寲琛ㄥ崟鏋勫缓鎸夐挳涓嶆樉绀烘鍒欐牎楠�</li> - <li>浼樺寲瀛楀吀鏁版嵁鍥炴樉鏍峰紡涓嬫媺妗嗘樉绀哄��</li> - <li>浼樺寲R鍝嶅簲鎴愬姛鐘舵�佺爜涓庡叏灞�淇濇寔涓�鑷�</li> - <li>浼樺寲druid寮�鍚痺all杩囨护鍣ㄥ嚭鐜扮殑寮傚父闂</li> - <li>浼樺寲鐢ㄦ埛绠$悊宸︿晶鏍戝瀷缁勪欢澧炲姞閫変腑楂樹寒淇濇寔</li> - <li>浼樺寲鏂板鐢ㄦ埛涓庤鑹蹭俊鎭�&鐢ㄦ埛涓庡矖浣嶄俊鎭�昏緫</li> - <li>浼樺寲榛樿涓嶅惎鐢ㄥ帇缂╂枃浠剁紦瀛橀槻姝ode_modules杩囧ぇ</li> - <li>淇瀛楀吀鏁版嵁鏄剧ず涓嶅叏闂</li> - <li>淇鎿嶄綔鏃ュ織鏌ヨ绫诲瀷鏉′欢涓�0鏃朵細鏌ュ埌鎵�鏈夋暟鎹�</li> - <li>淇Excel娉ㄨВprompt/combo鍚屾椂浣跨敤涓嶇敓鏁堥棶棰�</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.8.2 - 2022-04-01"> - <ol> - <li>鍓嶇鏀寔璁剧疆鏄惁闇�瑕侀槻姝㈡暟鎹噸澶嶆彁浜�</li> - <li>寮�鍚疶opNav娌℃湁瀛愯彍鍗曟儏鍐甸殣钘忎晶杈规爮</li> - <li>渚ц竟鏍忚彍鍗曞悕绉拌繃闀挎偓鍋滄樉绀烘爣棰�</li> - <li>鐢ㄦ埛璁块棶鎺у埗鏃舵牎楠屾暟鎹潈闄愶紝闃叉瓒婃潈</li> - <li>瀵煎嚭Excel鏃跺睆钄藉叕寮忥紝闃叉CSV娉ㄥ叆椋庨櫓</li> - <li>缁勪欢ImagePreview鏀寔澶氬浘棰勮鏄剧ず</li> - <li>缁勪欢ImageUpload鏀寔澶氬浘鍚屾椂閫夋嫨涓婁紶</li> - <li>缁勪欢FileUpload鏀寔澶氭枃浠跺悓鏃堕�夋嫨涓婁紶</li> - <li>鏈嶅姟鐩戞帶鏂板杩愯鍙傛暟淇℃伅鏄剧ず</li> - <li>瀹氭椂浠诲姟鐩爣瀛楃涓茶繃婊ょ壒娈婂瓧绗�</li> - <li>瀹氭椂浠诲姟鐩爣瀛楃涓查獙璇佸寘鍚嶇櫧鍚嶅崟</li> - <li>浠g爜鐢熸垚鍒楄〃鍥剧墖鏀寔棰勮</li> - <li>浠g爜鐢熸垚缂栬緫淇敼鎵撳紑鏂伴〉绛�</li> - <li>浠g爜鐢熸垚鏂板Java绫诲瀷Boolean</li> - <li>浠g爜鐢熸垚瀛愯〃鏀寔鏃ユ湡/瀛楀吀閰嶇疆</li> - <li>浠g爜鐢熸垚鍚屾淇濈暀蹇呭~/绫诲瀷閫夐」</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.1.2</li> - <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.80</li> - <li>鍗囩骇pagehelper鍒版渶鏂扮増1.4.1</li> - <li>鍗囩骇spring-boot鍒版渶鏂扮増鏈�2.5.11</li> - <li>鍗囩骇spring-boot-mybatis鍒版渶鏂扮増2.2.2</li> - <li>娣诲姞閬楁紡鐨勫垎椤靛弬鏁板悎鐞嗗寲灞炴��</li> - <li>淇敼npm鍗冲皢杩囨湡鐨勬敞鍐屾簮鍦板潃</li> - <li>淇鍒嗛〉缁勪欢璇锋眰涓ゆ闂</li> - <li>淇閫氱敤鏂囦欢涓嬭浇鎺ュ彛璺ㄥ煙闂</li> - <li>淇Xss娉ㄨВ瀛楁鍊间负绌烘椂鐨勫紓甯搁棶棰�</li> - <li>淇閫夐」鍗$偣鍑诲彸閿埛鏂颁涪澶卞弬鏁伴棶棰�</li> - <li>淇琛ㄥ崟娓呴櫎鍏冪礌浣嶇疆鏈瀭鐩村眳涓棶棰�</li> - <li>淇鏈嶅姟鐩戞帶涓繍琛屽弬鏁版樉绀烘潯浠堕敊璇�</li> - <li>淇瀵煎叆Excel鏃跺瓧鍏稿瓧娈电被鍨嬩负Long杞箟涓虹┖闂</li> - <li>淇鐧诲綍瓒呮椂鍒锋柊椤甸潰璺宠浆鐧诲綍椤甸潰杩樻彁绀洪噸鏂扮櫥褰曢棶棰�</li> - <li>浼樺寲鍔犺浇瀛楀吀缂撳瓨鏁版嵁</li> - <li>浼樺寲IP鍦板潃鑾峰彇鍒板涓殑闂</li> - <li>浼樺寲浠诲姟闃熷垪婊℃椂浠诲姟鎷掔粷绛栫暐</li> - <li>浼樺寲鏂囦欢涓婁紶鍏煎Weblogic鐜</li> - <li>浼樺寲瀹氭椂浠诲姟榛樿淇濆瓨鍒板唴瀛樹腑鎵ц</li> - <li>浼樺寲閮ㄩ棬淇敼缂╂斁鍚庡嚭鐜扮殑閿欎綅闂</li> - <li>浼樺寲Excel鏍煎紡鍖栦笉鍚岀被鍨嬬殑鏃ユ湡瀵硅薄</li> - <li>浼樺寲鑿滃崟琛ㄥ叧閿瓧瀵艰嚧鐨勬彃浠舵姤閿欓棶棰�</li> - <li>浼樺寲Oracle鐢ㄦ埛澶村儚鍒椾负绌烘椂涓嶆樉绀洪棶棰�</li> - <li>浼樺寲椤甸潰鑻ユ湭鍖归厤鍒板瓧鍏告爣绛惧垯杩斿洖鍘熷瓧鍏稿��</li> - <li>浼樺寲淇鐧诲綍澶辨晥鍚庡娆¤姹傛彁绀哄娆″脊绐楅棶棰�</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.8.1 - 2022-01-01"> - <ol> - <li>鏂板Vue3鍓嶇浠g爜鐢熸垚妯℃澘</li> - <li>鏂板鍥剧墖棰勮缁勪欢</li> - <li>鏂板鍘嬬缉鎻掍欢瀹炵幇鎵撳寘Gzip</li> - <li>鑷畾涔墄ss鏍¢獙娉ㄨВ瀹炵幇</li> - <li>鑷畾涔夋枃瀛楀鍒跺壀璐存寚浠�</li> - <li>浠g爜鐢熸垚棰勮鏀寔澶嶅埗鍐呭</li> - <li>璺敱鏀寔鍗曠嫭閰嶇疆鑿滃崟鎴栬鑹叉潈闄�</li> - <li>鐢ㄦ埛绠$悊閮ㄩ棬鏌ヨ閫夋嫨鑺傜偣鍚庡垎椤靛弬鏁板垵濮�</li> - <li>淇鐢ㄦ埛鍒嗛厤瑙掕壊灞炴�ч敊璇�</li> - <li>淇鎵撳寘鍚庡瓧浣撳浘鏍囧伓鐜扮殑涔辩爜闂</li> - <li>淇鑿滃崟绠$悊閲嶇疆琛ㄥ崟鍑虹幇鐨勯敊璇�</li> - <li>淇鐗堟湰宸紓瀵艰嚧鐨勬噿鍔犺浇鎶ラ敊闂</li> - <li>淇Cron缁勪欢涓懆鍥炴樉闂</li> - <li>淇瀹氭椂浠诲姟澶氬弬鏁伴�楀彿鍒嗛殧鐨勯棶棰�</li> - <li>淇鏍规嵁ID鏌ヨ鍒楄〃鍙兘鍑虹幇鐨勪富閿孩鍑洪棶棰�</li> - <li>淇tomcat閰嶇疆鍙傛暟宸茶繃鏈熼棶棰�</li> - <li>鍗囩骇clipboard鍒版渶鏂扮増鏈�2.0.8</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.8.6</li> - <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.79</li> - <li>鍗囩骇spring-boot鍒版渶鏂扮増鏈�2.5.8</li> - <li>鍗囩骇log4j2鍒�2.17.1锛岄槻姝㈡紡娲為闄�</li> - <li>浼樺寲涓嬭浇瑙f瀽blob寮傚父鎻愮ず</li> - <li>浼樺寲浠g爜鐢熸垚瀛楀吀缁勯噸澶嶉棶棰�</li> - <li>浼樺寲鏌ヨ鐢ㄦ埛鐨勮鑹茬粍&宀椾綅缁勪唬鐮�</li> - <li>浼樺寲瀹氭椂浠诲姟cron琛ㄨ揪寮忓皬鏃惰缃�24</li> - <li>浼樺寲鐢ㄦ埛瀵煎叆鎻愮ず婧㈠嚭鍒欐樉绀烘粴鍔ㄦ潯</li> - <li>浼樺寲闃查噸澶嶆彁浜ゆ爣璇嗙粍鍚堜负(key+url+header)</li> - <li>浼樺寲鍒嗛〉鏂规硶璁剧疆鎴愰�氱敤鏂逛究鐏垫椿璋冪敤</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.8.0 - 2021-12-01"> - <ol> - <li>鏂板閰嶅骞跺悓姝ョ殑Vue3鍓嶇鐗堟湰</li> - <li>鏂板閫氱敤鏂规硶绠�鍖栨ā鎬�/缂撳瓨/涓嬭浇/鏉冮檺/椤电浣跨敤</li> - <li>浼樺寲瀵煎嚭鏁版嵁/浣跨敤閫氱敤涓嬭浇鏂规硶</li> - <li>Excel娉ㄨВ鏀寔鑷畾涔夋暟鎹鐞嗗櫒</li> - <li>Excel娉ㄨВ鏀寔瀵煎叆瀵煎嚭鏍囬淇℃伅</li> - <li>Excel瀵煎叆鏀寔@Excels娉ㄨВ</li> - <li>鏂板缁勪欢data-dict锛岀畝鍖栨暟鎹瓧鍏镐娇鐢�</li> - <li>鏂板Jaxb渚濊禆锛岄槻姝dk8浠ヤ笂鍑虹幇鐨勫吋瀹归敊璇�</li> - <li>鐢熶骇鐜浣跨敤璺敱鎳掑姞杞芥彁鍗囬〉闈㈠搷搴旈�熷害</li> - <li>淇浜旂骇浠ヤ笂鑿滃崟鍑虹幇鐨�404闂</li> - <li>闃查噸鎻愪氦娉ㄨВ鏀寔閰嶇疆闂撮殧鏃堕棿/鎻愮ず娑堟伅</li> - <li>鏃ュ織娉ㄨВ鏂板鏄惁淇濆瓨鍝嶅簲鍙傛暟</li> - <li>浠诲姟灞忚斀杩濊瀛楃&鍙傛暟蹇界暐鍙屽紩鍙蜂腑鐨勯�楀彿</li> - <li>鍗囩骇SpringBoot鍒版渶鏂扮増鏈�2.5.6</li> - <li>鍗囩骇pagehelper鍒版渶鏂扮増1.4.0</li> - <li>鍗囩骇spring-boot-mybatis鍒版渶鏂扮増2.2.0</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.8.2</li> - <li>鍗囩骇druid鍒版渶鏂扮増1.2.8</li> - <li>鍗囩骇velocity鍒版渶鏂扮増鏈�2.3</li> - <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.78</li> - <li>鍗囩骇axios鍒版渶鏂扮増鏈�0.24.0</li> - <li>鍗囩骇dart-sass鍒扮増鏈�1.32.13</li> - <li>鍗囩骇core-js鍒版渶鏂扮増鏈�3.19.1</li> - <li>鍗囩骇jsencrypt鍒版渶鏂扮増鏈�3.2.1</li> - <li>鍗囩骇js-cookie鍒版渶鏂扮増鏈�3.0.1</li> - <li>鍗囩骇file-saver鍒版渶鏂扮増鏈�2.0.5</li> - <li>鍗囩骇sass-loader鍒版渶鏂扮増鏈�10.1.1</li> - <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.6</li> - <li>鏂板sendGet鏃犲弬璇锋眰鏂规硶</li> - <li>绂佺敤el-tag缁勪欢鐨勬笎鍙樺姩鐢�</li> - <li>浠g爜鐢熸垚鐐瑰嚮棰勮閲嶇疆婵�娲籺ab</li> - <li>AjaxResult閲嶅啓put鏂规硶锛屼互鏂逛究閾惧紡璋冪敤</li> - <li>浼樺寲鐧诲綍/楠岃瘉鐮佽姹俬eaders涓嶈缃畉oken</li> - <li>浼樺寲鐢ㄦ埛涓汉淇℃伅鎺ュ彛闃叉淇敼鐢ㄦ埛鍚�</li> - <li>浼樺寲Cron琛ㄨ揪寮忕敓鎴愬櫒鍏抽棴鏃堕攢姣侀伩鍏嶇紦瀛�</li> - <li>浼樺寲娉ㄥ唽鎴愬姛鎻愮ず娑堟伅绫诲瀷success</li> - <li>浼樺寲aop璇硶锛屼娇鐢╯pring鑷姩娉ㄥ叆娉ㄨВ</li> - <li>浼樺寲璁板綍鐧诲綍淇℃伅锛岀Щ闄や笉蹇呰鐨勪慨鏀�</li> - <li>浼樺寲mybatis鍏ㄥ眬榛樿鐨勬墽琛屽櫒</li> - <li>浼樺寲Excel瀵煎叆鍥剧墖鍙兘鍑虹幇鐨勫紓甯�</li> - <li>淇浠g爜鐢熸垚妯℃澘涓诲瓙琛ㄥ垹闄ょ己灏戜簨鍔�</li> - <li>淇鏃ュ織璁板綍鍙兘鍑虹幇鐨勮浆鎹㈠紓甯�</li> - <li>淇浠g爜鐢熸垚澶嶉�夋瀛楀吀閬楁紡闂</li> - <li>淇鍏抽棴xss鍔熻兘瀵艰嚧鍙噸澶嶈RepeatableFilter澶辨晥</li> - <li>淇瀛楃涓叉棤娉曡鍙嶈浆涔夐棶棰�</li> - <li>淇鍚庣涓诲瓙琛ㄤ唬鐮佹ā鏉挎柟娉曞悕鐢熸垚閿欒闂</li> - <li>淇xss杩囨护鍚庢牸寮忓嚭鐜扮殑寮傚父</li> - <li>淇swagger娌℃湁鎸囧畾dataTypeClass瀵艰嚧鍚姩鍑虹幇warn鏃ュ織</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.7.0 - 2021-09-13"> - <ol> - <li>鍙傛暟绠$悊鏀寔閰嶇疆楠岃瘉鐮佸紑鍏�</li> - <li>鏂板鏄惁寮�鍚敤鎴锋敞鍐屽姛鑳�</li> - <li>瀹氭椂浠诲姟鏀寔鍦ㄧ嚎鐢熸垚cron琛ㄨ揪寮�</li> - <li>鑿滃崟绠$悊鏀寔閰嶇疆璺敱鍙傛暟</li> - <li>鏀寔鑷畾涔夋敞瑙e疄鐜版帴鍙i檺娴�</li> - <li>Excel娉ㄨВ鏀寔Image鍥剧墖瀵煎叆</li> - <li>鑷畾涔夊脊灞傛孩鍑烘粴鍔ㄦ牱寮�</li> - <li>鑷畾涔夊彲鎷栧姩寮圭獥瀹藉害鎸囦护</li> - <li>鑷畾涔夊彲鎷栧姩寮圭獥楂樺害鎸囦护</li> - <li>淇浠绘剰璐︽埛瓒婃潈闂</li> - <li>淇敼鏃舵鏌ョ敤鎴锋暟鎹潈闄愯寖鍥�</li> - <li>淇淇濆瓨閰嶇疆涓婚棰滆壊澶辨晥闂</li> - <li>鏂板鏆楄壊鑿滃崟椋庢牸涓婚</li> - <li>鑿滃崟&閮ㄩ棬鏂板灞曞紑/鎶樺彔鍔熻兘</li> - <li>椤电鏂板鍏抽棴宸︿晶&娣诲姞鍥炬爣</li> - <li>椤堕儴鑿滃崟鎺掗櫎闅愯棌鐨勯粯璁よ矾鐢�</li> - <li>椤堕儴鑿滃崟鍚屾绯荤粺涓婚鏍峰紡</li> - <li>璺宠浆璺敱楂樹寒鐩稿搴旂殑鑿滃崟鏍�</li> - <li>浠g爜鐢熸垚涓诲瓙琛ㄥ閫夎鏁版嵁</li> - <li>鏃ユ湡鑼冨洿鏀寔娣诲姞澶氱粍</li> - <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.5</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.8.0</li> - <li>鍗囩骇commons.io鍒版渶鏂扮増鏈瑅2.11.0</li> - <li>瀹氭椂浠诲姟灞忚斀ldap杩滅▼璋冪敤</li> - <li>瀹氭椂浠诲姟灞忚斀http(s)杩滅▼璋冪敤</li> - <li>琛ュ厖瀹氭椂浠诲姟琛ㄥ瓧娈垫敞閲�</li> - <li>瀹氭椂浠诲姟瀵规鏌ュ紓甯歌繘琛屼簨鍔″洖婊�</li> - <li>鍚敤鐖堕儴闂ㄧ姸鎬佹帓闄ら《绾ц妭鐐�</li> - <li>瀵屾枃鏈柊澧炰笂浼犳枃浠跺ぇ灏忛檺鍒�</li> - <li>榛樿棣栭〉浣跨敤keep-alive缂撳瓨</li> - <li>淇敼浠g爜鐢熸垚瀛楀吀鍥炴樉鏍峰紡</li> - <li>鑷畾涔夊垎椤靛悎鐞嗗寲浼犲叆鍙傛暟</li> - <li>淇瀛楀吀缁勪欢鍊间负鏁村舰涓嶆樉绀洪棶棰�</li> - <li>淇瀹氭椂浠诲姟鏃ュ織鎵ц鐘舵�佹樉绀�</li> - <li>瑙掕壊&鑿滃崟鏂板瀛楁灞炴�ф彁绀轰俊鎭�</li> - <li>淇瑙掕壊鍒嗛厤鐢ㄦ埛椤甸潰鍙傛暟绫诲瀷閿欒鎻愰啋</li> - <li>浼樺寲甯冨眬璁剧疆鍔ㄧ敾鐗规晥</li> - <li>浼樺寲寮傚父澶勭悊淇℃伅</li> - <li>浼樺寲閿欒token瀵艰嚧鐨勮В鏋愬紓甯�</li> - <li>瀵嗙爜妗嗘柊澧炴樉绀哄垏鎹㈠瘑鐮佸浘鏍�</li> - <li>瀹氭椂浠诲姟鏂板鏇村鎿嶄綔</li> - <li>鏇村鎿嶄綔鎸夐挳娣诲姞鏉冮檺鎺у埗</li> - <li>瀵煎叆鐢ㄦ埛鏍峰紡浼樺寲</li> - <li>鎻愬彇閫氱敤鏂规硶鍒板熀绫绘帶鍒跺櫒</li> - <li>浼樺寲浣跨敤鏉冮檺宸ュ叿鑾峰彇鐢ㄦ埛淇℃伅</li> - <li>浼樺寲鐢ㄦ埛涓嶈兘鍒犻櫎鑷繁</li> - <li>浼樺寲XSS璺ㄧ珯鑴氭湰杩囨护</li> - <li>浼樺寲浠g爜鐢熸垚妯℃澘</li> - <li>楠岃瘉鐮侀粯璁�20s瓒呮椂</li> - <li>BLOB涓嬭浇鏃舵竻闄RL瀵硅薄寮曠敤</li> - <li>浠g爜鐢熸垚瀵煎叆琛ㄦ寜鍒涘缓鏃堕棿鎺掑簭</li> - <li>淇浠g爜鐢熸垚椤甸潰鏁版嵁缂栬緫淇濆瓨涔嬪悗鎬绘槸璺宠浆绗竴椤电殑闂</li> - <li>淇甯afari娴忚鍣ㄦ棤娉曟牸寮忓寲utc鏃ユ湡鏍煎紡yyyy-MM-dd'T'HH:mm:ss.SSS闂</li> - <li>澶氬浘涓婁紶缁勪欢绉婚櫎澶氫綑鐨刟pi鍦板潃&楠岃瘉澶辫触瀵艰嚧鍥剧墖鍒犻櫎闂&鏃犳硶鍒犻櫎鐩稿簲鍥剧墖淇</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.6.0 - 2021-07-12"> - <ol> - <li>瑙掕壊绠$悊鏂板鍒嗛厤鐢ㄦ埛鍔熻兘</li> - <li>鐢ㄦ埛绠$悊鏂板鍒嗛厤瑙掕壊鍔熻兘</li> - <li>鏃ュ織鍒楄〃鏀寔鎺掑簭鎿嶄綔</li> - <li>浼樺寲鍙傛暟&瀛楀吀缂撳瓨鎿嶄綔</li> - <li>绯荤粺甯冨眬閰嶇疆鏀寔鍔ㄦ�佹爣棰樺紑鍏�</li> - <li>鑿滃崟璺敱閰嶇疆鏀寔鍐呴摼璁块棶</li> - <li>榛樿璁块棶鍚庣棣栭〉鏂板鎻愮ず璇�</li> - <li>瀵屾枃鏈粯璁や笂浼犺繑鍥瀠rl绫诲瀷</li> - <li>鏂板鑷畾涔夊脊绐楁嫋鎷芥寚浠�</li> - <li>鍏ㄥ眬娉ㄥ唽甯哥敤閫氱敤缁勪欢</li> - <li>鍏ㄥ眬鎸傝浇瀛楀吀鏍囩缁勪欢</li> - <li>ImageUpload缁勪欢鏀寔澶氬浘鐗囦笂浼�</li> - <li>FileUpload缁勪欢鏀寔澶氭枃浠朵笂浼�</li> - <li>鏂囦欢涓婁紶缁勪欢娣诲姞鏁伴噺闄愬埗灞炴��</li> - <li>瀵屾枃鏈紪杈戠粍浠舵坊鍔犵被鍨嬪睘鎬�</li> - <li>瀵屾枃鏈粍浠跺伐鍏锋爮閰嶇疆瑙嗛</li> - <li>灏佽閫氱敤iframe缁勪欢</li> - <li>闄愬埗瓒呯骇绠$悊鍛樹笉鍏佽鎿嶄綔</li> - <li>鐢ㄦ埛淇℃伅闀垮害鏍¢獙闄愬埗</li> - <li>鍒嗛〉缁勪欢鏂板pagerCount灞炴��</li> - <li>娣诲姞bat鑴氭湰鎵ц搴旂敤</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.7.4</li> - <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.2</li> - <li>鍗囩骇pagehelper鍒版渶鏂扮増1.3.1</li> - <li>鍗囩骇commons.io鍒版渶鏂扮増鏈瑅2.10.0</li> - <li>鍗囩骇commons.fileupload鍒版渶鏂扮増鏈瑅1.4</li> - <li>鍗囩骇swagger鍒版渶鏂扮増鏈瑅3.0.0</li> - <li>淇鍏抽棴confirm鎻愮ず妗嗘帶鍒跺彴鎶ラ敊闂</li> - <li>淇瀛樺湪鐨凷QL娉ㄥ叆婕忔礊闂</li> - <li>瀹氭椂浠诲姟灞忚斀rmi杩滅▼璋冪敤</li> - <li>淇鐢ㄦ埛鎼滅储鍒嗛〉鍙橀噺閿欒</li> - <li>淇瀵煎嚭瑙掕壊鏁版嵁鑼冨洿缈昏瘧缂哄皯浠呮湰浜�</li> - <li>淇琛ㄥ崟鏋勫缓閫夋嫨涓嬫媺閫夋嫨鎺у埗鍙版姤閿欓棶棰�</li> - <li>浼樺寲鍥剧墖宸ュ叿绫昏鍙栨枃浠�</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.5.0 - 2021-05-25"> - <ol> - <li>鏂板鑿滃崟瀵艰埅鏄剧ず椋庢牸TopNav锛坒alse涓哄乏渚у鑸彍鍗曪紝true涓洪《閮ㄥ鑸彍鍗曪級</li> - <li>甯冨眬璁剧疆鏀寔淇濆瓨&閲嶇疆閰嶇疆</li> - <li>淇鏍戣〃鏁版嵁鏄剧ず涓嶅叏&鍔犺浇鎱㈤棶棰�</li> - <li>鏂板IE娴忚鍣ㄧ増鏈繃浣庢彁绀洪〉闈�</li> - <li>鐢ㄦ埛鐧诲綍鍚庤褰曟渶鍚庣櫥褰旾P&鏃堕棿</li> - <li>椤甸潰瀵煎嚭鎸夐挳鐐瑰嚮涔嬪悗娣诲姞閬僵</li> - <li>瀵屾枃鏈紪杈戝櫒鏀寔鑷畾涔変笂浼犲湴鍧�</li> - <li>瀵屾枃鏈紪杈戠粍浠舵柊澧瀝eadOnly灞炴��</li> - <li>椤电TagsView鏂板鍏抽棴鍙充晶鍔熻兘</li> - <li>鏄鹃殣鍒楃粍浠跺姞杞藉垵濮嬮粯璁ら殣钘忓垪</li> - <li>鍏抽棴澶村儚涓婁紶绐楀彛杩樺師榛樿鍥剧墖</li> - <li>涓汉淇℃伅娣诲姞鎵嬫満&閭閲嶅楠岃瘉</li> - <li>浠g爜鐢熸垚妯℃澘瀵煎嚭鎸夐挳鐐瑰嚮鍚庢坊鍔犻伄缃�</li> - <li>浠g爜鐢熸垚妯℃澘鏍戣〃鎿嶄綔鍒楁坊鍔犳柊澧炴寜閽�</li> - <li>浠g爜鐢熸垚妯℃澘淇涓诲瓙琛ㄥ瓧娈甸噸鍚嶉棶棰�</li> - <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.76</li> - <li>鍗囩骇druid鍒版渶鏂扮増鏈瑅1.2.6</li> - <li>鍗囩骇mybatis鍒版渶鏂扮増3.5.6 闃绘杩滅▼浠g爜鎵ц婕忔礊</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.6.0</li> - <li>velocity鍓旈櫎commons-collections鐗堟湰锛岄槻姝�3.2.1鐗堟湰鐨勫弽搴忓垪鍖栨紡娲�</li> - <li>鏁版嵁鐩戞帶椤甸粯璁よ处鎴峰瘑鐮侀槻姝㈣秺鏉冭闂�</li> - <li>淇firefox涓嬭〃鍗曟瀯寤烘嫋鎷戒細鏂版墦鍗′竴涓�夐」鍗�</li> - <li>淇鍚庣瀵煎叆琛ㄦ潈闄愭爣璇�</li> - <li>淇鍓嶇鎿嶄綔鏃ュ織&鐧诲綍鏃ュ織鏉冮檺鏍囪瘑</li> - <li>璁剧疆Redis閰嶇疆HashKey搴忓垪鍖�</li> - <li>鍒犻櫎鎿嶄綔鏃ュ織璁板綍淇℃伅</li> - <li>涓婁紶濯掍綋绫诲瀷娣诲姞瑙嗛鏍煎紡</li> - <li>淇璇锋眰褰㈠弬鏈紶鍊艰褰曟棩蹇楀紓甯搁棶棰�</li> - <li>浼樺寲xss鏍¢獙json璇锋眰鏉′欢</li> - <li>鏍戠骇缁撴瀯鏇存柊瀛愯妭鐐逛娇鐢╮eplaceFirst</li> - <li>浼樺寲ExcelUtil绌哄�煎鐞�</li> - <li>鏃ュ織璁板綍杩囨护BindingResult瀵硅薄锛岄槻姝㈠紓甯�</li> - <li>淇敼涓婚鍚巑ini绫诲瀷鎸夐挳鏃犳晥闂</li> - <li>浼樺寲閫氱敤涓嬭浇瀹屾垚鍚庡垹闄よ妭鐐�</li> - <li>閫氱敤Controller娣诲姞鍝嶅簲杩斿洖娑堟伅</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.4.0 - 2021-02-22"> - <ol> - <li>浠g爜鐢熸垚妯℃澘鏀寔涓诲瓙琛�</li> - <li>琛ㄦ牸鍙充晶宸ュ叿鏍忕粍浠舵敮鎸佹樉闅愬垪</li> - <li>鍥剧墖缁勪欢娣诲姞棰勮&绉婚櫎鍔熻兘</li> - <li>Excel娉ㄨВ鏀寔Image鍥剧墖瀵煎嚭</li> - <li>鎿嶄綔鎸夐挳缁勮皟鏁翠负鏈寸礌鎸夐挳鏍峰紡</li> - <li>浠g爜鐢熸垚鏀寔鏂囦欢涓婁紶缁勪欢</li> - <li>浠g爜鐢熸垚鏃ユ湡鎺т欢鍖哄垎鑼冨洿</li> - <li>浠g爜鐢熸垚鏁版嵁搴撴枃鏈被鍨嬬敓鎴愯〃鍗曟枃鏈煙</li> - <li>鐢ㄦ埛鎵嬫満閭&鑿滃崟缁勪欢淇敼鍏佽绌哄瓧绗︿覆</li> - <li>鍗囩骇SpringBoot鍒版渶鏂扮増鏈�2.2.13 鎻愬崌鍚姩閫熷害</li> - <li>鍗囩骇druid鍒版渶鏂扮増鏈瑅1.2.4</li> - <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.75</li> - <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.0</li> - <li>淇IE11娴忚鍣ㄦ姤閿欓棶棰�</li> - <li>浼樺寲澶氱骇鑿滃崟涔嬮棿鍒囨崲鏃犳硶缂撳瓨鐨勯棶棰�</li> - <li>淇鍥涚骇鑿滃崟鏃犳硶鏄剧ず闂</li> - <li>淇渚ц竟鏍忛潤鎬佽矾鐢变涪澶遍棶棰�</li> - <li>淇瑙掕壊绠$悊-缂栬緫瑙掕壊-鍔熻兘鏉冮檺鏄剧ず寮傚父</li> - <li>閰嶇疆鏂囦欢鏂板redis鏁版嵁搴撶储寮曞睘鎬�</li> - <li>鏉冮檺宸ュ叿绫诲鍔燼dmin鍒ゆ柇</li> - <li>瑙掕壊闈炶嚜瀹氫箟鏉冮檺鑼冨洿娓呯┖閫夋嫨鍊�</li> - <li>淇瀵煎叆鏁版嵁涓鸿礋娴偣鏁版椂涓㈠け绮惧害闂</li> - <li>绉婚櫎path-to-regexp姝e垯鍖归厤鎻掍欢</li> - <li>淇鐢熸垚鏍戣〃浠g爜寮傚父</li> - <li>淇敼ip瀛楁闀垮害闃叉ipv6鍦板潃闀垮害涓嶅</li> - <li>闃叉get璇锋眰鍙傛暟鍊间负false鎴�0绛夌壒娈婂�间細瀵艰嚧鏃犳硶姝g‘鐨勪紶鍙�</li> - <li>鐧诲綍鍚巔ush娣诲姞catch闃叉鍑虹幇妫�鏌ラ敊璇�</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.3.0 - 2020-12-14"> - <ol> - <li>鏂板缂撳瓨鐩戞帶鍔熻兘</li> - <li>鏀寔涓婚椋庢牸閰嶇疆</li> - <li>淇澶氱骇鑿滃崟涔嬮棿鍒囨崲鏃犳硶缂撳瓨鐨勯棶棰�</li> - <li>澶氱骇鑿滃崟鑷姩閰嶇疆缁勪欢</li> - <li>浠g爜鐢熸垚棰勮鏀寔楂樹寒鏄剧ず</li> - <li>鏀寔Get璇锋眰鏄犲皠Params鍙傛暟</li> - <li>鍒犻櫎鐢ㄦ埛鍜岃鑹茶В缁戝叧鑱�</li> - <li>鍘婚櫎鐢ㄦ埛鎵嬫満閭閮ㄩ棬蹇呭~楠岃瘉</li> - <li>Excel鏀寔娉ㄨВalign瀵归綈鏂瑰紡</li> - <li>Excel鏀寔瀵煎叆Boolean鍨嬫暟鎹�</li> - <li>浼樺寲澶村儚鏍峰紡锛岄紶鏍囩Щ鍏ユ偓鍋滈伄缃�</li> - <li>浠g爜鐢熸垚棰勮鎻愪緵婊氬姩鏈哄埗</li> - <li>浠g爜鐢熸垚鍒犻櫎澶氫綑鐨勬暟瀛梖loat绫诲瀷</li> - <li>淇杞崲瀛楃涓茬殑鐩爣瀛楃闆嗗睘鎬�</li> - <li>鍥炴樉鏁版嵁瀛楀吀闃叉绌哄�兼姤閿�</li> - <li>鏃ュ織璁板綍澧炲姞杩囨护澶氭枃浠跺満鏅�</li> - <li>淇敼缂撳瓨Set鏂规硶鍙兘瀵艰嚧宓屽鐨勯棶棰�</li> - <li>绉婚櫎鍓嶇涓�浜涘浣欑殑渚濊禆</li> - <li>闃叉瀹夊叏鎵弿YUI鍑虹幇鐨勯闄╂彁绀�</li> - <li>淇敼node-sass涓篸art-sass</li> - <li>鍗囩骇SpringBoot鍒版渶鏂扮増鏈�2.1.18</li> - <li>鍗囩骇poi鍒版渶鏂扮増鏈�4.1.2</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.3.6</li> - <li>鍗囩骇bitwalker鍒版渶鏂扮増鏈�1.21</li> - <li>鍗囩骇axios鍒版渶鏂扮増鏈�0.21.0</li> - <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.14.1</li> - <li>鍗囩骇vue鍒版渶鏂扮増鏈�2.6.12</li> - <li>鍗囩骇vuex鍒版渶鏂扮増鏈�3.6.0</li> - <li>鍗囩骇vue-cli鍒扮増鏈�4.5.9</li> - <li>鍗囩骇vue-router鍒版渶鏂扮増鏈�3.4.9</li> - <li>鍗囩骇vue-cli鍒版渶鏂扮増鏈�4.4.6</li> - <li>鍗囩骇vue-cropper鍒版渶鏂扮増鏈�0.5.5</li> - <li>鍗囩骇clipboard鍒版渶鏂扮増鏈�2.0.6</li> - <li>鍗囩骇core-js鍒版渶鏂扮増鏈�3.8.1</li> - <li>鍗囩骇echarts鍒版渶鏂扮増鏈�4.9.0</li> - <li>鍗囩骇file-saver鍒版渶鏂扮増鏈�2.0.4</li> - <li>鍗囩骇fuse.js鍒版渶鏂扮増鏈�6.4.3</li> - <li>鍗囩骇js-beautify鍒版渶鏂扮増鏈�1.13.0</li> - <li>鍗囩骇js-cookie鍒版渶鏂扮増鏈�2.2.1</li> - <li>鍗囩骇path-to-regexp鍒版渶鏂扮増鏈�6.2.0</li> - <li>鍗囩骇quill鍒版渶鏂扮増鏈�1.3.7</li> - <li>鍗囩骇screenfull鍒版渶鏂扮増鏈�5.0.2</li> - <li>鍗囩骇sortablejs鍒版渶鏂扮増鏈�1.10.2</li> - <li>鍗囩骇vuedraggable鍒版渶鏂扮増鏈�2.24.3</li> - <li>鍗囩骇chalk鍒版渶鏂扮増鏈�4.1.0</li> - <li>鍗囩骇eslint鍒版渶鏂扮増鏈�7.15.0</li> - <li>鍗囩骇eslint-plugin-vue鍒版渶鏂扮増鏈�7.2.0</li> - <li>鍗囩骇lint-staged鍒版渶鏂扮増鏈�10.5.3</li> - <li>鍗囩骇runjs鍒版渶鏂扮増鏈�4.4.2</li> - <li>鍗囩骇sass-loader鍒版渶鏂扮増鏈�10.1.0</li> - <li>鍗囩骇script-ext-html-webpack-plugin鍒版渶鏂扮増鏈�2.1.5</li> - <li>鍗囩骇svg-sprite-loader鍒版渶鏂扮増鏈�5.1.1</li> - <li>鍗囩骇vue-template-compiler鍒版渶鏂扮増鏈�2.6.12</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.2.1 - 2020-11-18"> - <ol> - <li>闃绘浠绘剰鏂囦欢涓嬭浇婕忔礊</li> - <li>浠g爜鐢熸垚鏀寔涓婁紶鎺т欢</li> - <li>鏂板鍥剧墖涓婁紶缁勪欢</li> - <li>璋冩暣榛樿棣栭〉</li> - <li>鍗囩骇druid鍒版渶鏂扮増鏈瑅1.2.2</li> - <li>mapperLocations閰嶇疆鏀寔鍒嗛殧绗�</li> - <li>鏉冮檺淇℃伅璋冩暣</li> - <li>璋冩暣sql榛樿鏃堕棿</li> - <li>瑙e喅浠g爜鐢熸垚娌℃湁bit绫诲瀷鐨勯棶棰�</li> - <li>鍗囩骇pagehelper鍒版渶鏂扮増1.3.0</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v3.2.0 - 2020-10-10"> - <ol> - <li>鍗囩骇springboot鐗堟湰鍒�2.1.17 鎻愬崌瀹夊叏鎬�</li> - <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.2.5</li> - <li>鍗囩骇druid鍒版渶鏂扮増鏈瑅1.2.1</li> - <li>鍗囩骇jjwt鍒扮増鏈�0.9.1</li> - <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.74</li> - <li>淇敼sass涓簄ode-sass锛岄伩鍏峞l-icon鍥炬爣涔辩爜</li> - <li>浠g爜鐢熸垚鏀寔鍚屾鏁版嵁搴�</li> - <li>浠g爜鐢熸垚鏀寔瀵屾枃鏈帶浠�</li> - <li>浠g爜鐢熸垚椤甸潰鏃朵笉蹇界暐remark灞炴��</li> - <li>浠g爜鐢熸垚娣诲姞select蹇呭~閫夐」</li> - <li>Excel瀵煎嚭绫诲瀷NUMERIC鏀寔绮惧害娴偣绫诲瀷</li> - <li>Excel瀵煎嚭targetAttr浼樺寲鑾峰彇鍊硷紝闃叉get鏂规硶涓嶈鑼�</li> - <li>Excel娉ㄨВ鏀寔鑷姩缁熻鏁版嵁鎬诲拰</li> - <li>Excel娉ㄨВ鏀寔璁剧疆BigDecimal绮惧害&鑸嶅叆瑙勫垯</li> - <li>鑿滃崟&鏁版嵁鏉冮檺鏂板锛堝睍寮�/鎶樺彔 鍏ㄩ��/鍏ㄤ笉閫� 鐖跺瓙鑱斿姩锛�</li> - <li>鍏佽鐢ㄦ埛鍒嗛厤鍒伴儴闂ㄧ埗鑺傜偣</li> - <li>鑿滃崟鏂板鏄惁缂撳瓨keep-alive</li> - <li>琛ㄦ牸鎿嶄綔鍒楅棿璺濊皟鏁�</li> - <li>闄愬埗绯荤粺鍐呯疆鍙傛暟涓嶅厑璁稿垹闄�</li> - <li>瀵屾枃鏈粍浠朵紭鍖栵紝鏀寔鑷畾涔夐珮搴�&鍥剧墖鍐茬獊闂</li> - <li>瀵屾枃鏈伐鍏锋爮鏍峰紡瀵归綈</li> - <li>瀵煎叆excel鏁村舰鍊兼牎楠屼紭鍖�</li> - <li>淇椤电鍏抽棴鎵�鏈夋椂鍥哄畾鏍囩璺敱涓嶅埛鏂伴棶棰�</li> - <li>琛ㄥ崟鏋勫缓甯冨眬鍨嬬粍浠舵柊澧炴寜閽�</li> - <li>宸︿晶鑿滃崟鏂囧瓧杩囬暱鏄剧ず鐪佺暐鍙�</li> - <li>淇鏍硅妭鐐逛负瀛愰儴闂ㄦ椂锛屾爲鐘剁粨鏋勬樉绀洪棶棰�</li> - <li>淇璋冪敤鐩爣瀛楃涓叉渶澶ч暱搴�</li> - <li>淇鑿滃崟鎻愮ず淇℃伅閿欒</li> - <li>淇瀹氭椂浠诲姟鎵ц涓�娆℃潈闄愭爣璇�</li> - <li>淇鏁版嵁搴撳瓧绗︿覆绫诲瀷nvarchar</li> - <li>浼樺寲閫掑綊瀛愯妭鐐�</li> - <li>浼樺寲鏁版嵁鏉冮檺鍒ゆ柇</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - - <el-collapse-item title="v3.1.0 - 2020-08-13"> - <ol> - <li>琛ㄦ牸宸ュ叿鏍忓彸渚ф坊鍔犲埛鏂�&鏄鹃殣鏌ヨ缁勪欢</li> - <li>鍚庣鏀寔CORS璺ㄥ煙璇锋眰</li> - <li>浠g爜鐢熸垚鏀寔閫夋嫨涓婄骇鑿滃崟</li> - <li>浠g爜鐢熸垚鏀寔鑷畾涔夎矾寰�</li> - <li>浠g爜鐢熸垚鏀寔澶嶉�夋</li> - <li>Excel瀵煎嚭瀵煎叆鏀寔dictType瀛楀吀绫诲瀷</li> - <li>Excel鏀寔鍒嗗壊瀛楃涓茬粍鍐呭</li> - <li>楠岃瘉鐮佺被鍨嬫敮鎸侊紙鏁扮粍璁$畻銆佸瓧绗﹂獙璇侊級</li> - <li>鍗囩骇vue-cli鐗堟湰鍒�4.4.4</li> - <li>淇敼 node-sass 涓� dart-sass</li> - <li>琛ㄥ崟绫诲瀷涓篒nteger/Long璁剧疆鏁村舰榛樿鍊�</li> - <li>浠g爜鐢熸垚鍣ㄩ粯璁apper璺緞涓庨粯璁apperScan璺緞涓嶄竴鑷�</li> - <li>浼樺寲闃查噸澶嶆彁浜ゆ嫤鎴櫒</li> - <li>浼樺寲涓婄骇鑿滃崟涓嶈兘閫夋嫨鑷繁</li> - <li>淇瑙掕壊鐨勬潈闄愬垎閰嶅悗锛屾湭瀹炴椂鐢熸晥闂</li> - <li>淇鍦ㄧ嚎鐢ㄦ埛鏃ュ織璁板綍绫诲瀷</li> - <li>淇瀵屾枃鏈┖鏍煎拰缂╄繘淇濆瓨鍚庝笉鐢熸晥闂</li> - <li>淇鍦ㄧ嚎鐢ㄦ埛鍒ゆ柇閫昏緫</li> - <li>鍞竴闄愬埗鏉′欢鍙繑鍥炲崟鏉℃暟鎹�</li> - <li>娣诲姞鑾峰彇褰撳墠鐨勭幆澧冮厤缃柟娉�</li> - <li>瓒呮椂鐧诲綍鍚庨〉闈㈣烦杞埌棣栭〉</li> - <li>鍏ㄥ眬寮傚父鐘舵�佹眽鍖栨嫤鎴鐞�</li> - <li>HTML杩囨护鍣ㄦ敼涓哄皢html杞箟</li> - <li>妫�鏌ュ瓧绗︽敮鎸佸皬鏁扮偣&闄嶇骇鏀规垚寮傚父鎻愰啋</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - - <el-collapse-item title="v3.0.0 - 2020-07-20"> - <ol> - <li>鍗曞簲鐢ㄨ皟鏁翠负澶氭ā鍧楅」鐩�</li> - <li>鍗囩骇element-ui鐗堟湰鍒�2.13.2</li> - <li>鍒犻櫎babel锛屾彁楂樼紪璇戦�熷害銆�</li> - <li>鏂板鑿滃崟榛樿涓荤被鐩�</li> - <li>缂栫爜鏂囦欢鍚嶄慨鏀逛负uuid鏂瑰紡</li> - <li>瀹氭椂浠诲姟cron琛ㄨ揪寮忛獙璇�</li> - <li>瑙掕壊鏉冮檺淇敼鏃跺凡鏈夋潈闄愭湭鑷姩鍕鹃�夊紓甯镐慨澶�</li> - <li>闃叉鍒囨崲鏉冮檺鐢ㄦ埛鍚庣櫥褰曞嚭鐜�404</li> - <li>Excel鏀寔sort瀵煎嚭鎺掑簭</li> - <li>鍒涘缓鐢ㄦ埛涓嶅厑璁搁�夋嫨瓒呯骇绠$悊鍛樿鑹�</li> - <li>淇浠g爜鐢熸垚瀵煎叆琛ㄧ粨鏋勫嚭鐜板紓甯搁〉闈笉鎻愰啋闂</li> - <li>淇浠g爜鐢熸垚鐐瑰嚮澶氭琛ㄤ慨鏀规暟鎹笉鍙樺寲鐨勯棶棰�</li> - <li>淇澶村儚涓婁紶鎴愬姛浜屾鎵撳紑鏃犳硶鏀瑰彉瑁佸壀妗嗗ぇ灏忓拰浣嶇疆闂</li> - <li>淇甯冨眬涓簊mall鑰卪ini鐢ㄦ埛琛ㄥ崟鏄剧ず閿欎綅闂</li> - <li>淇鐑儴缃插鑷寸殑寮烘崲寮傚父闂</li> - <li>淇敼鐢ㄦ埛绠$悊澶嶉�夋瀹藉害锛岄槻姝㈤儴鍒嗘祻瑙堝櫒鍑虹幇鐪佺暐鍙�</li> - <li>IpUtils宸ュ叿锛屾竻闄ss鐗规畩瀛楃锛岄槻姝ff娉ㄥ叆鏀诲嚮</li> - <li>鐢熸垚domain 濡傛灉鏄诞鐐瑰瀷 缁熶竴鐢˙igDecimal</li> - <li>瀹氭椂浠诲姟璋冩暣label-width锛岄槻姝㈤儴缃插嚭鐜伴敊浣�</li> - <li>璋冩暣琛ㄥご鍥哄畾鍒楅粯璁ゆ牱寮�</li> - <li>浠g爜鐢熸垚妯℃澘璋冩暣锛屽瓧娈典负String骞朵笖蹇呭~鍒欏姞绌轰覆鏉′欢</li> - <li>浠g爜鐢熸垚瀛楀吀Integer/Long浣跨敤parseInt</li> - <li> - 淇dict_sort涓嶅彲update涓�0鐨勯棶棰�&鏌ヨ杩斿洖澧炲姞dict_sort鍗囧簭鎺掑簭 - </li> - <li>淇宀椾綅瀵煎嚭鏉冮檺娉ㄨВ</li> - <li>绂佹鍔犲瘑瀵嗘枃杩斿洖鍓嶇</li> - <li>淇浠g爜鐢熸垚椤甸潰涓殑鏌ヨ鏉′欢鍒涘缓鏃堕棿鏈敓鏁堢殑闂</li> - <li>淇棣栭〉鎼滅储鑿滃崟澶栭摼鏃犳硶鐐瑰嚮璺宠浆闂</li> - <li>淇鑿滃崟绠$悊閫夋嫨鍥炬爣锛宐ackspace鍒犻櫎鏃朵笉杩囨护鏁版嵁</li> - <li>鐢ㄦ埛绠$悊閮ㄩ棬鍒嗘敮鑺傜偣涓嶅彲妫�鏌�&鏄剧ず璁℃暟</li> - <li>鏁版嵁鑼冨洿杩囨护灞炴�ц皟鏁�</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - - <el-collapse-item title="v2.3.0 - 2020-06-01"> - <ol> - <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.70 淇楂樺嵄瀹夊叏婕忔礊</li> - <li>dev鍚姩榛樿鎵撳紑娴忚鍣�</li> - <li>vue-cli浣跨敤榛樿source-map</li> - <li>slidebar eslint鎶ラ敊浼樺寲</li> - <li>褰搕ags-view婊氬姩鍏抽棴鍙抽敭鑿滃崟</li> - <li>瀛楀吀绠$悊娣诲姞缂撳瓨璇诲彇</li> - <li>鍙傛暟绠$悊鏀寔缂撳瓨鎿嶄綔</li> - <li>鏀寔涓�绾ц彍鍗曪紙鍜屼富椤靛悓绾э級鍦╩ain鍖哄煙鏄剧ず</li> - <li>闄愬埗澶栭摼鍦板潃蹇呴』浠ttp(s)寮�澶�</li> - <li>tagview & sidebar 涓婚棰滆壊涓巈lement ui(鍏ㄥ眬)鍚屾</li> - <li>淇敼鏁版嵁婧愮被鍨嬩紭鍏堢骇锛屽厛鏍规嵁鏂规硶锛屽啀鏍规嵁绫�</li> - <li>鏀寔鏄惁闇�瑕佽缃畉oken灞炴�э紝鑷畾涔夎繑鍥炵爜娑堟伅銆�</li> - <li>swagger璇锋眰鍓嶇紑鍔犲叆閰嶇疆銆�</li> - <li>鐧诲綍鍦扮偣璁剧疆鍐呭杩囬暱鍒欓殣钘忔樉绀�</li> - <li>淇瀹氭椂浠诲姟鎵ц涓�娆℃寜閽悗涓嶆彁绀烘秷鎭棶棰�</li> - <li>淇敼涓婄骇閮ㄩ棬锛堥�夋嫨椤规帓闄ゆ湰韬拰涓嬬骇锛�</li> - <li>閫氱敤http鍙戦�佹柟娉曞鍔犲弬鏁� contentType 缂栫爜绫诲瀷</li> - <li>鏇存崲IP鍦板潃鏌ヨ鎺ュ彛</li> - <li>淇椤电鍙橀噺undefined</li> - <li>娣诲姞鏍¢獙閮ㄩ棬鍖呭惈鏈仠鐢ㄧ殑瀛愰儴闂�</li> - <li>淇敼瀹氭椂浠诲姟璇︽儏涓嬫鎵ц鏃堕棿鏃ユ湡鏄剧ず閿欒</li> - <li>瑙掕壊绠$悊鏌ヨ璁剧疆榛樿鎺掑簭瀛楁</li> - <li>swagger娣诲姞enable鍙傛暟鎺у埗鏄惁鍚敤</li> - <li>鍙json绫诲瀷璇锋眰鏋勫缓鍙噸澶嶈鍙杋nputStream鐨剅equest</li> - <li>淇敼浠g爜鐢熸垚瀛楀吀瀛楁int绫诲瀷娌℃湁鑷姩閫変腑闂</li> - <li>vuex鐢ㄦ埛鍚嶅彇鍊间慨姝�</li> - <li>琛ㄦ牸鏍戞ā鏉垮幓鎺夊浣欑殑)</li> - <li>浠g爜鐢熸垚搴忓彿淇</li> - <li>鍏ㄥ睆鎯呭喌涓嬩笉璋冩暣涓婂杈硅窛</li> - <li>浠g爜鐢熸垚Date瀛楁娣诲姞榛樿鏍煎紡</li> - <li>鐢ㄦ埛绠$悊瑙掕壊閫夋嫨鏉冮檺鎺у埗</li> - <li>淇璺敱鎳掑姞杞芥姤閿欓棶棰�</li> - <li>妯℃澘sql.vm娣诲姞鑿滃崟鐘舵��</li> - <li>璁剧疆鐢ㄦ埛鍚嶇О涓嶈兘淇敼</li> - <li>dialog娣诲姞append-to-body灞炴�э紝闃叉ie閬僵</li> - <li>鑿滃崟鍖哄垎鐘舵�佸拰鏄剧ず闅愯棌鍔熻兘</li> - <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.68 淇瀹夊叏鍔犲浐</li> - <li>淇浠g爜鐢熸垚濡傛灉閫夋嫨瀛楀吀绫诲瀷缂哄け閫楀彿闂</li> - <li>鐧诲綍璇锋眰params鏇存崲涓篸ata锛岄槻姝㈡毚闇瞮rl</li> - <li>鏃ュ織杩斿洖鏃堕棿鏍煎紡澶勭悊</li> - <li>娣诲姞handle鎺у埗鍏佽鎷栧姩鐨勫厓绱�</li> - <li>甯冨眬璁剧疆鐐瑰嚮鎵╁ぇ鑼冨洿</li> - <li>浠g爜鐢熸垚鍒楀睘鎬ф帓搴忔煡璇�</li> - <li>浠g爜鐢熸垚鍒楁敮鎸佹嫋鍔ㄦ帓搴�</li> - <li>淇鏃堕棿鏍煎紡涓嶆敮鎸乮os闂</li> - <li>琛ㄥ崟鏋勫缓娣诲姞鐖剁骇class锛岄槻姝㈠啿绐�</li> - <li>瀹氭椂浠诲姟骞跺彂灞炴�т慨姝�</li> - <li>瑙掕壊绂佺敤&鑿滃崟闅愯棌涓嶆煡璇㈡潈闄�</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - - <el-collapse-item title="v2.2.0 - 2020-03-18"> - <ol> - <li>绯荤粺鐩戞帶鏂板瀹氭椂浠诲姟鍔熻兘</li> - <li>娣诲姞涓�涓墦鍖匴eb宸ョ▼bat</li> - <li>淇椤电榧犳爣婊氳疆鎸変笅鐨勬椂鍊欙紝鍙互鍏抽棴涓嶅彲鍏抽棴鐨則ag</li> - <li>淇鐐瑰嚮閫�鍑虹櫥褰曟湁鏃朵細鏃犳彁绀洪棶棰�</li> - <li>淇闃查噸澶嶆彁浜ゆ敞瑙f棤鏁堥棶棰�</li> - <li>淇閫氱煡鍏憡鎵归噺鍒犻櫎寮傚父闂</li> - <li>娣诲姞鑿滃崟鏃惰矾鐢卞湴鍧�蹇呭~闄愬埗</li> - <li>浠g爜鐢熸垚瀛楁鎻忚堪鍙紪杈�</li> - <li>淇鐢ㄦ埛淇敼涓汉淇℃伅瀵艰嚧缂撳瓨涓嶈繃鏈熼棶棰�</li> - <li>涓汉淇℃伅鍒涘缓鏃堕棿鑾峰彇姝g‘灞炴�у��</li> - <li>鎿嶄綔鏃ュ織璇︾粏鏄剧ず姝g‘绫诲瀷</li> - <li>瀵煎叆琛ㄥ崟鍑昏鏁版嵁鏃堕�変腑瀵瑰簲鐨勫閫夋</li> - <li>鎵归噺鏇挎崲琛ㄥ墠缂�閫昏緫璋冩暣</li> - <li>鍥哄畾閲嶅畾鍚戣矾寰勮〃杈惧紡</li> - <li>鍗囩骇element-ui鐗堟湰鍒�2.13.0</li> - <li>鎿嶄綔鏃ュ織鎺掑簭璋冩暣</li> - <li>淇charts鍒囨崲渚ц竟鏍忔垨鑰呯缉鏀剧獥鍙f樉绀篵ug</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - - <el-collapse-item title="v2.1.0 - 2020-02-24"> - <ol> - <li>鏂板琛ㄥ崟鏋勫缓</li> - <li>浠g爜鐢熸垚鏀寔鏍戣〃缁撴瀯</li> - <li>鏂板鐢ㄦ埛瀵煎叆</li> - <li>淇鍔ㄦ�佸姞杞借矾鐢遍〉闈㈠埛鏂伴棶棰�</li> - <li>淇鍦板潃寮�鍏虫棤鏁堥棶棰�</li> - <li>姹夊寲閿欒鎻愮ず椤甸潰</li> - <li>浠g爜鐢熸垚宸茬煡闂淇敼</li> - <li>淇澶氭暟鎹簮涓嬮厤缃叧闂嚭鐜板紓甯稿鐞�</li> - <li>娣诲姞HTML杩囨护鍣紝鐢ㄤ簬鍘婚櫎XSS婕忔礊闅愭偅</li> - <li>淇涓婁紶澶村儚鎺у埗鍙板嚭鐜板紓甯�</li> - <li>淇敼鐢ㄦ埛绠$悊鍒嗛〉涓嶆纭殑闂</li> - <li>淇楠岃瘉鐮佽褰曟彁绀洪敊璇�</li> - <li>淇request.js缂哄皯Message寮曠敤</li> - <li>淇琛ㄦ牸鏃堕棿涓虹┖鍑虹幇鐨勫紓甯�</li> - <li>娣诲姞Jackson鏃ユ湡鍙嶅簭鍒楀寲鏃跺尯閰嶇疆</li> - <li>璋冩暣鏍规嵁鐢ㄦ埛鏉冮檺鍔犺浇鑿滃崟鏁版嵁鏍戝舰缁撴瀯</li> - <li>璋冩暣鎴愬姛鐧诲綍涓嶆仮澶嶆寜閽紝闃叉澶氭鐐瑰嚮</li> - <li>淇敼鐢ㄦ埛涓汉璧勬枡鍚屾缂撳瓨淇℃伅</li> - <li>淇椤甸潰鍚屾椂鍑虹幇el-upload鍜孍ditor涓嶆樉绀哄鐞�</li> - <li>淇鍦ㄨ鑹茬鐞嗛〉淇敼鑿滃崟鏉冮檺鍋跺皵鏈�変腑闂</li> - <li>閰嶇疆鏂囦欢鏂板redis瀵嗙爜灞炴��</li> - <li>璁剧疆mybatis鍏ㄥ眬鐨勯厤缃枃浠�</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - - <el-collapse-item title="v2.0.0 - 2019-12-02"> - <ol> - <li>鏂板浠g爜鐢熸垚</li> - <li>鏂板@RepeatSubmit娉ㄨВ锛岄槻姝㈤噸澶嶆彁浜�</li> - <li>鏂板鑿滃崟涓荤洰褰曟坊鍔�/鍒犻櫎鎿嶄綔</li> - <li>鏃ュ織璁板綍杩囨护鐗规畩瀵硅薄锛岄槻姝㈣浆鎹㈠紓甯�</li> - <li>淇敼浠g爜鐢熸垚璺敱鑴氭湰閿欒</li> - <li>鐢ㄦ埛涓婁紶澶村儚瀹炴椂鍚屾缂撳瓨锛屾棤闇�閲嶆柊鐧诲綍</li> - <li>璋冩暣鍒囨崲椤电鍚庝笉閲嶆柊鍔犺浇鏁版嵁</li> - <li>娣诲姞jsencrypt瀹炵幇鍙傛暟鐨勫墠绔姞瀵�</li> - <li>绯荤粺閫�鍑哄垹闄ょ敤鎴风紦瀛樿褰�</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v1.1.0 - 2019-11-11"> - <ol> - <li>鏂板鍦ㄧ嚎鐢ㄦ埛绠$悊</li> - <li>鏂板鎸夐挳缁勫姛鑳藉疄鐜帮紙鎵归噺鍒犻櫎銆佸鍑恒�佹竻绌猴級</li> - <li>鏂板鏌ヨ鏉′欢閲嶇疆鎸夐挳</li> - <li>鏂板Swagger鍏ㄥ眬Token閰嶇疆</li> - <li>鏂板鍚庣鍙傛暟鏍¢獙</li> - <li>淇瀛楀吀绠$悊椤甸潰鐨勬棩鏈熸煡璇㈠紓甯�</li> - <li>淇敼鏃堕棿鍑芥暟鍛藉悕闃叉鍐茬獊</li> - <li>鍘婚櫎鑿滃崟涓婄骇鏍¢獙锛岄粯璁や负椤剁骇</li> - <li>淇鐢ㄦ埛瀵嗙爜鏃犳硶淇敼闂</li> - <li>淇鑿滃崟绫诲瀷涓烘寜閽椂涓嶆樉绀烘潈闄愭爣璇�</li> - <li>鍏朵粬缁嗚妭浼樺寲</li> - </ol> - </el-collapse-item> - <el-collapse-item title="v1.0.0 - 2019-10-08"> - <ol> - <li>灏勬椽椤圭洰鍓嶅悗绔垎绂荤郴缁熸寮忓彂甯�</li> - </ol> - </el-collapse-item> - </el-collapse> - </el-card> - </el-col> - <el-col :xs="24" :sm="24" :md="12" :lg="8"> - <el-card class="update-log"> - <div slot="header" class="clearfix"> - <span>鎹愯禒鏀寔</span> - </div> - <div class="body"> - <img - src="@/assets/images/pay.png" - alt="donate" - width="100%" + <div class="home"> + <div class="overview"> + <div class="overview-top"> + <div class="title">椤圭洰鎬昏</div> + <div class="qurey"> + <el-form ref="queryFormRef" :model="queryParams"> + <div class="search_from"> + <el-form-item label="鏃ユ湡"> + <el-date-picker + style="width: 300px" + v-model="timeMerge" + clearable + end-placeholder="缁撴潫鏃堕棿" + format="YYYY-MM-DD" + placeholder="璇烽�夋嫨鏃ユ湡" + size="default" + start-placeholder="寮�濮嬫椂闂�" + type="daterange" + value-format="YYYY-MM-DD" + @change="dataPickerChange" + /> + </el-form-item> + <el-form-item label="琛屾斂鍖哄垝"> + <el-select + v-model="queryParams.area" + clearable + placeholder="璇烽�夋嫨鍖哄垝" + style="width: 180px" + > + <el-option + v-for="item in sys_administrative_divisions" + :key="item.value" + :label="item.label" + :value="item.value" + /> + </el-select> + </el-form-item> + <el-form-item + label="鎶曡祫閲戦" + style="margin-right: 50px" + > + <div class="from_input"> + <el-input + v-model="queryParams.start" + clearable + placeholder="璇疯緭鍏�" + style="width: 100px" + type="number" + /> + 鑷� + <el-input + v-model="queryParams.end" + clearable + placeholder="璇疯緭鍏�" + style="width: 100px" + type="number" + /> + </div> + </el-form-item> + <el-form-item style="margin-right: 20px"> + <el-button + icon="Search" + type="primary" + @click="handleQuery" + >鎼滅储</el-button + > + <el-button icon="Refresh" @click="resetQuery" + >閲嶇疆</el-button + > + </el-form-item> + </div> + </el-form> + </div> + </div> + <!-- 缁熻鎯呭喌 --> + <ProjectOverview + :calculation="calculation" + :countExceptionProjectData="countExceptionProjectData" /> - <span style="display: inline-block; height: 30px; line-height: 30px" - >浣犲彲浠ヨ浣滆�呭枬鏉挅鍟¤〃绀洪紦鍔�</span - > - </div> - </el-card> - </el-col> - </el-row> - </div> + </div> + <!-- 浠e姙浜嬮」 --> + <div class="flex"> + <div class="flex_card"> + <el-card> + <NoticeTable style="height: 360px" /> + </el-card> + </div> + <!-- 娑堟伅閫氱煡 --> + <div class="flex_card"> + <el-card> + <TidingsTable style="height: 360px" /> + </el-card> + </div> + <!-- 鍦板浘 --> + </div> + <div class="mt-[10px] min-w-[1600px]"> + <el-card> + <div> + <div class="search-form"> + <el-form :model="searchForm" inline> + <el-form-item label=" "> + <el-input + v-model="searchForm.name" + clearable + placeholder="璇疯緭鍏ラ」鐩悕绉版垨椤圭洰浠g爜" + style="width: 180px" + /> + </el-form-item> + <el-form-item style="margin-right: 0px"> + <el-button + icon="Search" + type="primary" + @click="searchList" + >鎼滅储</el-button + > + <el-button icon="Refresh" @click="mapQuery" + >閲嶇疆</el-button + > + </el-form-item> + </el-form> + </div> + <div class="flex w-full h-[500px] border border-[#DBDEEA]"> + <!-- <Map + id="DangerSourceId" + ref="mapRef" + :is-show-control="true" + :list-type="true" + :map-list="tableDatas" + :map-type="true" + class="w-full h-full border-r border-[#DBDEEA]" + @label-click="showDetails" + @mark-click="showDetails" + @current-label-style-change="labelStyleChange" + /> --> + </div> + </div> + </el-card> + </div> + </div> </template> <script> +import SvgIcon from '@/components/SvgIcon/index.vue'; +import ProjectOverview from './components/projectOverview.vue'; +import NoticeTable from './components/noticeTable.vue'; +import TidingsTable from './components/tidingsTable.vue'; +// import Map from './components/Map/index.vue'; export default { - name: "Index", - data() { - return { - // 鐗堟湰鍙� - version: "3.8.8" - }; - }, - methods: { - goTarget(href) { - window.open(href, "_blank"); + name: "Index", + data() { + return { + queryParams: {}, + timeMerge: [], + sys_administrative_divisions: [], + calculation: [], + countExceptionProjectData: {}, + searchForm: {}, + tableDatas: [] + }; + }, + components: { + SvgIcon, + ProjectOverview, + NoticeTable, + TidingsTable + }, + methods: { + + dataPickerChange(val) { + if (!val) { + this.queryParams.startTime = ''; + this.queryParams.endTime = ''; + return; + } + + this.queryParams.startTime = timeMerge[0]; + this.queryParams.endTime = timeMerge[1]; + }, + handleQuery() { + console.log(queryParams); + const obj = { + startDate: queryParams.startTime, + endDate: queryParams.endTime, + areaCode: queryParams.area, + minInvestment: queryParams.start, + maxInvestment: queryParams.end + }; + + this.getCalculatioln(obj).then((res) => { + const arr = res.data.proPhaseCountVO?.concat(res.data.impTypeCountVO); + const newArr = arr.map((item) => ({ + text: item.text, + mun: item.count, + statistics: item.type, + statisticsMun: item.amount + })); + + // 鍒涘缓涓�涓璞★紝浠ヤ究鏍规嵁 text 灞炴�у揩閫熸煡鎵� newArr 涓殑瀵硅薄 + const newArrLookup = newArr.reduce((lookup, item) => { + lookup[item.text] = item; + return lookup; + }, {}); + + // 鏇存柊 calculation 鏁扮粍锛屼繚鎸佸叾鍘熷椤哄簭 + calculation.value = calculation.value.map((item) => { + const newItem = newArrLookup[item.text]; + return newItem ? newItem : item; // 濡傛灉 newItem 瀛樺湪锛屽垯杩斿洖 newItem锛屽惁鍒欒繑鍥炲師濮� item + }); + }); + + abnormalData(obj); + }, + + // 鑾峰彇寮傚父鏁版嵁 + async abnormalData(obj) { + const res = await getAbnormalData(obj); + this.countExceptionProjectData = res.data; + }, + + //鍦板浘璇︽儏 + showDetails(row) { + console.log(row); + }, + + labelStyleChange(currentLabel) { + if (lastLabel) { + lastLabel.setBackgroundColor('#fff'); + lastLabel.setFontColor('var(--el-color-primary)'); + } + currentLabel.setBackgroundColor('var(--el-color-primary)'); + currentLabel.setFontColor('#fff'); + lastLabel = currentLabel; + }, + resetQuery() { + this.queryParams = { + area: '', + start: '', + end: '', + startTime: '', + endTime: '' + }; + this.timeMerge = []; + this.handleQuery(); + }, + + // 鍦板浘鎼滅储 + async searchList() { + // await search() + this.mapRef.moveTo(105.37281, 30.87145); + }, + mapQuery() { + + } } - } -}; +} </script> <style scoped lang="scss"> .home { - blockquote { - padding: 10px 20px; - margin: 0 0 20px; - font-size: 17.5px; - border-left: 5px solid #eee; - } - hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eee; - } - .col-item { - margin-bottom: 20px; - } + padding: 10px; + background-color: #f3f7fc; + min-height: calc(100vh - 85px); + overflow-x: auto; - ul { - padding: 0; + .overview { + padding: 10px 0 0 10px; + height: 280px; + min-width: 1600px; + background-color: #fff; + border-radius: 6px; + + .overview-top { + display: flex; + justify-content: space-between; + + .title { + font-size: 16px; + } + + .qurey { + font-size: 12px; + font-weight: 100; + } + } + } + + .search-form { + display: flex; + justify-content: flex-end; + } +} +// ::v-deep .el-form-item { +// display: inline-block !important; +// margin-right: 10px; +// } +::v-deep .el-form-item--medium .el-form-item__content { + display: inline-block !important; +} +::v-deep .el-form-item__label { + font-size: 12px; + font-weight: 400; +} + +::v-deep .el-button { + font-size: 12px; +} + +::v-deep.el-input__inner { + font-size: 12px; + height: 32px; +} + +::v-deep.el-range-input { + font-size: 12px; +} + +::v-deep.el-select__placeholder { + font-size: 12px; +} +::v-deep input[type='number']::-webkit-inner-spin-button, +input[type='number']::-webkit-outer-spin-button { + -webkit-appearance: none; margin: 0; - } - - font-family: "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - color: #676a6c; - overflow-x: hidden; - - ul { - list-style-type: none; - } - - h4 { - margin-top: 0px; - } - - h2 { - margin-top: 10px; - font-size: 26px; - font-weight: 100; - } - - p { - margin-top: 10px; - - b { - font-weight: 700; - } - } - - .update-log { - ol { - display: block; - list-style-type: decimal; - margin-block-start: 1em; - margin-block-end: 1em; - margin-inline-start: 0; - margin-inline-end: 0; - padding-inline-start: 40px; - } - } +} +input[type='number'] { + -moz-appearance: textfield; +} +.search_from { + display: flex; + justify-self: justify-end; + gap: 10px; +} +.flex { + display: flex; + gap: 2%; +} +.flex_card { + width: 49%; + margin: 10px 0px; +} +.from_input { + display: flex; + gap: 10px; + font-size: 12px; } </style> diff --git a/src/views/login.vue b/src/views/login.vue index 4dca713..e1f97cb 100644 --- a/src/views/login.vue +++ b/src/views/login.vue @@ -1,385 +1,396 @@ <template> - <div class="login"> - <div class="nav"> - <img alt="" src="../assets/images/bj.png" /> - <div class="ml-[10px]">灏勬椽甯傞」鐩鐞嗙郴缁�</div> - </div> - <div class="conter"> - <div class="left"> - <div class="title">灏勬椽甯傞」鐩鐞嗙郴缁�</div> - <div> - 杩愮敤绯荤粺鐨勮鐐广�佹柟娉曞拰鐞嗚锛屽椤圭洰娑夊強鐨勫叏閮ㄥ伐浣滆繘琛屾湁鏁堝湴绠$悊 + <div class="login"> + <div class="nav"> + <img alt="" src="../assets/images/bj.png" /> + <div class="ml-[10px]">灏勬椽甯傞」鐩鐞嗙郴缁�</div> </div> - <div class="img"></div> - </div> - <div class="right"> - <div class="tab"> - <div - :class="{ active: currentTab === 'corporation' }" - class="login-corporation" - @click="currentClick('corporation')" - > - 娉曚汉鐧诲綍 - </div> - <div - :class="{ active: currentTab === 'supervise' }" - class="login-supervise" - @click="superviseClick('supervise')" - > - 鐩戠閮ㄩ棬鐧诲綍 - </div> - </div> - <el-form - ref="loginRef" - :model="loginForm" - :rules="loginRules" - class="login-form" - > - <!-- <el-form-item v-if="tenantEnabled" prop="tenantId"> + <div class="conter"> + <div class="left"> + <div class="title">灏勬椽甯傞」鐩鐞嗙郴缁�</div> + <div> + 杩愮敤绯荤粺鐨勮鐐广�佹柟娉曞拰鐞嗚锛屽椤圭洰娑夊強鐨勫叏閮ㄥ伐浣滆繘琛屾湁鏁堝湴绠$悊 + </div> + <div class="img"></div> + </div> + <div class="right"> + <div class="tab"> + <div + :class="{ active: currentTab === 'corporation' }" + class="login-corporation" + @click="currentClick('corporation')" + > + 娉曚汉鐧诲綍 + </div> + <div + :class="{ active: currentTab === 'supervise' }" + class="login-supervise" + @click="superviseClick('supervise')" + > + 鐩戠閮ㄩ棬鐧诲綍 + </div> + </div> + <el-form + ref="loginRef" + :model="loginForm" + :rules="loginRules" + class="login-form" + > + <!-- <el-form-item v-if="tenantEnabled" prop="tenantId"> <el-select v-model="loginForm.tenantId" filterable placeholder="璇烽�夋嫨/杈撳叆鍏徃鍚嶇О" style="width: 100%"> <el-option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName" :value="item.tenantId"></el-option> <template #prefix><svg-icon icon-class="company" class="el-input__icon input-icon" /></template> </el-select> </el-form-item> --> - <el-form-item prop="username"> - <el-input - v-model="loginForm.username" - auto-complete="off" - maxlength="20" - placeholder="璇疯緭鍏ヨ处鍙�" - size="large" - type="text" - > - <template #prefix> - <svg-icon class="el-input__icon input-icon" icon-class="user" /> - </template> - </el-input> - </el-form-item> - <el-form-item prop="password"> - <el-input - v-model="loginForm.password" - auto-complete="off" - maxlength="20" - placeholder="璇疯緭鍏ュ瘑鐮�" - size="large" - type="password" - @keyup.enter="handleLogin" - > - <template #prefix> - <svg-icon - class="el-input__icon input-icon" - icon-class="password" - /> - </template> - </el-input> - </el-form-item> - <el-form-item v-if="captchaEnabled" prop="code"> - <el-input - v-model="loginForm.code" - auto-complete="off" - maxlength="20" - placeholder="楠岃瘉鐮�" - size="large" - style="width: 167px" - @keyup.enter="handleLogin" - > - <template #prefix> - <svg-icon - class="el-input__icon input-icon" - icon-class="validCode" - /> - </template> - </el-input> - <div class="login-code"> - <img :src="codeUrl" class="login-code-img" @click="getCode" /> + <el-form-item prop="username"> + <el-input + v-model="loginForm.username" + auto-complete="off" + maxlength="20" + placeholder="璇疯緭鍏ヨ处鍙�" + size="large" + type="text" + > + <template #prefix> + <svg-icon + class="el-input__icon input-icon" + icon-class="user" + /> + </template> + </el-input> + </el-form-item> + <el-form-item prop="password"> + <el-input + v-model="loginForm.password" + auto-complete="off" + maxlength="20" + placeholder="璇疯緭鍏ュ瘑鐮�" + size="large" + type="password" + @keyup.enter="handleLogin" + > + <template #prefix> + <svg-icon + class="el-input__icon input-icon" + icon-class="password" + /> + </template> + </el-input> + </el-form-item> + <el-form-item v-if="captchaEnabled" prop="code"> + <el-input + v-model="loginForm.code" + auto-complete="off" + maxlength="20" + placeholder="楠岃瘉鐮�" + size="large" + style="width: 167px" + @keyup.enter="handleLogin" + > + <template #prefix> + <svg-icon + class="el-input__icon input-icon" + icon-class="validCode" + /> + </template> + </el-input> + <div class="login-code"> + <img + :src="codeUrl" + class="login-code-img" + @click="getCode" + /> + </div> + </el-form-item> + <el-checkbox + v-model="loginForm.rememberMe" + style="margin: 0 0 25px 0; color: #2d5eff" + >璁颁綇瀵嗙爜</el-checkbox + > + <div></div> + <el-form-item style="width: 100%"> + <el-button + :loading="loading" + size="large" + style="width: 100%" + type="primary" + @click.prevent="handleLogin" + > + <span v-if="!loading">鐧� 褰�</span> + <span v-else>鐧� 褰� 涓�...</span> + </el-button> + <div v-if="register" style="float: right"> + <router-link :to="'/register'" class="link-type" + >绔嬪嵆娉ㄥ唽</router-link + > + </div> + </el-form-item> + </el-form> + <div class="other"> + <div class="other-title"> + <span style="color: #b3b8c1">鍏朵粬鐧诲綍鏂瑰紡:</span + ><span style="color: #2d5eff; cursor: pointer"> + <svg-icon icon-class="phone" />鎵嬫満楠岃瘉鐮佺櫥褰� + </span> + </div> + <div class="forget">蹇樿瀵嗙爜锛�</div> + </div> </div> - </el-form-item> - <el-checkbox - v-model="loginForm.rememberMe" - style="margin: 0 0 25px 0; color: #2d5eff" - >璁颁綇瀵嗙爜</el-checkbox - > - <div></div> - <el-form-item style="width: 100%"> - <el-button - :loading="loading" - size="large" - style="width: 100%" - type="primary" - @click.prevent="handleLogin" - > - <span v-if="!loading">鐧� 褰�</span> - <span v-else>鐧� 褰� 涓�...</span> - </el-button> - <div v-if="register" style="float: right"> - <router-link :to="'/register'" class="link-type" - >绔嬪嵆娉ㄥ唽</router-link - > - </div> - </el-form-item> - </el-form> - <div class="other"> - <div class="other-title"> - <span style="color: #b3b8c1">鍏朵粬鐧诲綍鏂瑰紡:</span - ><span style="color: #2d5eff; cursor: pointer"> - <svg-icon icon-class="phone" />鎵嬫満楠岃瘉鐮佺櫥褰� - </span> - </div> - <div class="forget">蹇樿瀵嗙爜锛�</div> </div> - </div> </div> - </div> </template> <script> import { getCodeImg } from "@/api/login"; import Cookies from "js-cookie"; import { encrypt, decrypt } from "@/utils/jsencrypt"; +import SvgIcon from '@/components/SvgIcon/index.vue'; export default { - name: "Login", - data() { - return { - currentTab: "corporation", - codeUrl: "", - loginForm: { - username: "admin", - password: "admin123", - rememberMe: false, - code: "", - uuid: "", - }, - loginRules: { - username: [ - { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勮处鍙�" }, - ], - password: [ - { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勫瘑鐮�" }, - ], - code: [{ required: true, trigger: "change", message: "璇疯緭鍏ラ獙璇佺爜" }], - }, - loading: false, - // 楠岃瘉鐮佸紑鍏� - captchaEnabled: true, - // 娉ㄥ唽寮�鍏� - register: false, - redirect: undefined, - }; - }, - watch: { - $route: { - handler: function (route) { - this.redirect = route.query && route.query.redirect; - }, - immediate: true, + name: "Login", + data() { + return { + currentTab: "corporation", + codeUrl: "", + loginForm: { + username: "admin", + password: "admin123", + rememberMe: false, + code: "", + uuid: "", + }, + loginRules: { + username: [ + { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勮处鍙�" }, + ], + password: [ + { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勫瘑鐮�" }, + ], + code: [{ required: true, trigger: "change", message: "璇疯緭鍏ラ獙璇佺爜" }], + }, + loading: false, + // 楠岃瘉鐮佸紑鍏� + captchaEnabled: true, + // 娉ㄥ唽寮�鍏� + register: false, + redirect: undefined, + }; }, - }, - created() { - this.getCode(); - this.getCookie(); - }, - methods: { - getCode() { - getCodeImg().then((res) => { - this.captchaEnabled = - res.captchaEnabled === undefined ? true : res.captchaEnabled; - if (this.captchaEnabled) { - this.codeUrl = "data:image/gif;base64," + res.img; - this.loginForm.uuid = res.uuid; - } - }); + comments: { + SvgIcon }, - getCookie() { - const username = Cookies.get("username"); - const password = Cookies.get("password"); - const rememberMe = Cookies.get("rememberMe"); - this.loginForm = { - username: username === undefined ? this.loginForm.username : username, - password: - password === undefined ? this.loginForm.password : decrypt(password), - rememberMe: rememberMe === undefined ? false : Boolean(rememberMe), - }; + watch: { + $route: { + handler: function (route) { + this.redirect = route.query && route.query.redirect; + }, + immediate: true, + }, }, - // 娉曚汉鐧诲綍 - currentClick(tab) { - this.currentTab = tab; - this.loginForm.role = "2"; - console.log(this.loginForm); + created() { + this.getCode(); + this.getCookie(); }, - // 鐩戠閮ㄩ棬鐧诲綍 - superviseClick(tab) { - this.currentTab = tab; - this.loginForm.role = "1"; - console.log(this.loginForm); - }, - handleLogin() { - this.$refs.loginRef.validate((valid) => { - if (valid) { - this.loading = true; - if (this.loginForm.rememberMe) { - Cookies.set("username", this.loginForm.username, { expires: 30 }); - Cookies.set("password", encrypt(this.loginForm.password), { - expires: 30, + methods: { + getCode() { + getCodeImg().then((res) => { + this.captchaEnabled = + res.captchaEnabled === undefined ? true : res.captchaEnabled; + if (this.captchaEnabled) { + this.codeUrl = "data:image/gif;base64," + res.img; + this.loginForm.uuid = res.uuid; + } }); - Cookies.set("rememberMe", this.loginForm.rememberMe, { - expires: 30, + }, + getCookie() { + const username = Cookies.get("username"); + const password = Cookies.get("password"); + const rememberMe = Cookies.get("rememberMe"); + this.loginForm = { + username: username === undefined ? this.loginForm.username : username, + password: + password === undefined ? this.loginForm.password : decrypt(password), + rememberMe: rememberMe === undefined ? false : Boolean(rememberMe), + }; + }, + // 娉曚汉鐧诲綍 + currentClick(tab) { + this.currentTab = tab; + this.loginForm.role = "2"; + console.log(this.loginForm); + }, + // 鐩戠閮ㄩ棬鐧诲綍 + superviseClick(tab) { + this.currentTab = tab; + this.loginForm.role = "1"; + console.log(this.loginForm); + }, + handleLogin() { + this.$refs.loginRef.validate((valid) => { + if (valid) { + this.loading = true; + if (this.loginForm.rememberMe) { + Cookies.set("username", this.loginForm.username, { expires: 30 }); + Cookies.set("password", encrypt(this.loginForm.password), { + expires: 30, + }); + Cookies.set("rememberMe", this.loginForm.rememberMe, { + expires: 30, + }); + } else { + Cookies.remove("username"); + Cookies.remove("password"); + Cookies.remove("rememberMe"); + } + this.$store + .dispatch("Login", this.loginForm) + .then(() => { + this.$router.push({ path: this.redirect || "/" }).catch(() => { }); + }) + .catch(() => { + this.loading = false; + if (this.captchaEnabled) { + this.getCode(); + } + }); + } }); - } else { - Cookies.remove("username"); - Cookies.remove("password"); - Cookies.remove("rememberMe"); - } - this.$store - .dispatch("Login", this.loginForm) - .then(() => { - this.$router.push({ path: this.redirect || "/" }).catch(() => {}); - }) - .catch(() => { - this.loading = false; - if (this.captchaEnabled) { - this.getCode(); - } - }); - } - }); + }, }, - }, }; </script> <style lang="scss" scoped> .login { - .nav { - display: flex; - align-items: center; - height: 40px; - margin-left: 24px; - background-color: #fff; - font-family: PangMenZhengDao; - font-size: 20px; - font-style: italic; - color: #1e2538; - line-height: 40px; - } - - .conter { - display: flex; - justify-content: center; - align-items: center; - gap: 100px; - height: calc(100vh - 50px); - background-image: url("../assets/images/login-background.png"); - background-size: cover; - - .left { - width: 500px; - height: auto; - - .title { - font-size: 34px; - color: #1f2639; - line-height: 16px; - } - - .img { - background-image: url("../assets/images/login.png"); - background-size: cover; - height: 295px; - width: 366px; - margin: auto; - margin-top: 20px; - } + .nav { + display: flex; + align-items: center; + height: 40px; + margin-left: 24px; + background-color: #fff; + font-family: PangMenZhengDao; + font-size: 20px; + font-style: italic; + color: #1e2538; + line-height: 40px; } - .right { - border-radius: 6px; - background: #ffffff; - width: 500px; - padding: 0px 25px 5px 25px; - - .tab { - margin: 20px 0; + .conter { display: flex; - font-size: 24px; - line-height: 24px; + justify-content: center; + align-items: center; gap: 100px; + height: calc(100vh - 50px); + background-image: url('../assets/images/login-background.png'); + background-size: cover; - .login-corporation { - cursor: pointer; + .left { + width: 500px; + height: auto; + + .title { + font-size: 34px; + color: #1f2639; + line-height: 16px; + } + + .img { + background-image: url('../assets/images/login.png'); + background-size: cover; + height: 295px; + width: 366px; + margin: auto; + margin-top: 20px; + } } - .login-supervise { - cursor: pointer; - } + .right { + border-radius: 6px; + background: #ffffff; + width: 500px; + padding: 0px 25px 5px 25px; - .active { - color: #2d5eff; - } - } + .tab { + margin: 20px 0; + display: flex; + font-size: 24px; + line-height: 24px; + gap: 100px; - .other { - display: flex; - justify-content: space-between; - font-size: 14px; - margin-bottom: 10px; + .login-corporation { + cursor: pointer; + } - .other-title { - display: flex; - gap: 10px; - } + .login-supervise { + cursor: pointer; + } - .forget { - color: #2d5eff; - cursor: pointer; + .active { + color: #2d5eff; + } + } + + .other { + display: flex; + justify-content: space-between; + font-size: 14px; + margin-bottom: 10px; + + .other-title { + display: flex; + gap: 10px; + } + + .forget { + color: #2d5eff; + cursor: pointer; + } + } } - } } - } } .title { - margin: 0px auto 30px auto; - text-align: center; - color: #707070; + margin: 0px auto 30px auto; + text-align: center; + color: #707070; } .login-form { - .el-input { - height: 40px; + .el-input { + height: 40px; - input { - height: 40px; + input { + height: 40px; + } } - } - .input-icon { - height: 39px; - width: 14px; - margin-left: 0px; - } + .input-icon { + height: 39px; + width: 14px; + margin-left: 0px; + } } .login-tip { - font-size: 13px; - text-align: center; - color: #bfbfbf; + font-size: 13px; + text-align: center; + color: #bfbfbf; } .login-code { - width: 33%; - height: 40px; - float: right; + width: 33%; + height: 40px; + float: right; - img { - cursor: pointer; - vertical-align: middle; - } + img { + cursor: pointer; + vertical-align: middle; + } } .login-code-img { - height: 40px; - padding-left: 12px; + height: 40px; + padding-left: 12px; } </style> -- Gitblit v1.8.0