From 1c28aec39b26067051a1efb082a67472d51f2572 Mon Sep 17 00:00:00 2001
From: toesbieya <1647775459@qq.com>
Date: Sat, 5 Sep 2020 20:12:03 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E5=AF=BC=E8=88=AA?=
=?UTF-8?q?=E6=A8=A1=E5=BC=8F=E5=88=87=E6=8D=A2=E7=9A=84=E5=8A=9F=E8=83=BD?=
=?UTF-8?q?=20=E9=A1=B5=E5=A4=B4=E6=A0=B7=E5=BC=8F=E4=BF=AE=E6=94=B9=20?=
=?UTF-8?q?=E7=A7=BB=E9=99=A4=E4=BA=86=E8=87=AA=E5=8A=A8=E9=9A=90=E8=97=8F?=
=?UTF-8?q?=E5=A4=B4=E9=83=A8=E7=9A=84=E5=8A=9F=E8=83=BD=20=E7=A7=BB?=
=?UTF-8?q?=E5=8A=A8=E7=AB=AF=E7=9A=84=E5=88=A4=E6=96=AD=E6=94=B9=E4=B8=BA?=
=?UTF-8?q?=E6=9C=80=E5=A4=A7=E5=AE=BD=E5=BA=A6=E4=BD=8E=E4=BA=8E500px=20?=
=?UTF-8?q?=E5=BC=82=E5=B8=B8=E9=A1=B5=E7=9A=84=E5=9B=BE=E7=89=87=E4=BD=BF?=
=?UTF-8?q?=E7=94=A8=E7=BD=91=E7=BB=9C=E8=B5=84=E6=BA=90=20=E9=83=A8?=
=?UTF-8?q?=E5=88=86=E6=A0=B7=E5=BC=8F=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../component/Menu/MenuItem.vue | 4 -
.../component/Menu/Submenu.vue | 60 +--
vue/public/static/img/403.svg | 508 ------------------
vue/public/static/img/404.svg | 314 -----------
vue/public/static/img/500.svg | 208 -------
vue/src/asset/style/element-ui.scss | 21 +-
vue/src/asset/style/index.scss | 2 +-
vue/src/asset/style/variables.scss | 31 +-
vue/src/component/AbstractForm/FormAnchor.vue | 2 +-
vue/src/component/ColorCheckBox/group.vue | 29 -
vue/src/component/ColorCheckBox/index.vue | 48 --
vue/src/component/checkbox/ColorCheckbox.vue | 29 +
vue/src/component/checkbox/Group.vue | 24 +
vue/src/component/checkbox/ImgCheckbox.vue | 38 ++
vue/src/component/checkbox/common.js | 22 +
.../index.vue => menu/Contextmenu.vue} | 2 +-
.../item.vue => menu/ContextmenuItem.vue} | 2 +-
vue/src/component/menu/MenuItem.vue | 119 ++++
vue/src/globalMethod/Guide/utils.js | 4 +-
.../component/Aside/component/SidebarItem.vue | 83 ---
.../Aside/component/SidebarItemContent.vue | 22 -
vue/src/layout/component/Aside/index.vue | 137 ++---
vue/src/layout/component/Aside/style.scss | 25 +-
.../component/Navbar/component/Hamburger.vue | 5 +-
.../component/Navbar/component/HeadMenu.vue | 205 +++++++
.../component/Navbar/component/RootMenu.vue | 273 ----------
.../Navbar/component/SettingDrawer.vue | 103 +++-
.../Header/component/Navbar/index.vue | 153 +++---
.../Header/component/Navbar/style.scss | 49 ++
.../Header/component/TagsView/index.vue | 23 +-
vue/src/layout/component/Header/index.vue | 62 +--
.../component/Main/component/BackToTop.vue | 8 +-
.../component/Main/component/Breadcrumb.vue | 44 --
.../component/Main/component/PageHeader.vue | 60 +++
vue/src/layout/component/Main/index.vue | 71 +--
vue/src/layout/component/Main/style.scss | 6 +-
vue/src/layout/index.vue | 15 +-
.../mixin/{actionOnSelectMenu.js => menu.js} | 20 +-
vue/src/layout/store/main.js | 8 +-
vue/src/layout/store/setting.js | 25 +-
vue/src/layout/util.js | 27 +
vue/src/router/index.js | 2 +-
.../router/module/defaultRoot/child/app.js | 4 +-
.../module/defaultRoot/child/purchase.js | 4 +-
.../router/module/defaultRoot/child/sell.js | 4 +-
vue/src/util/browser.js | 5 +-
vue/src/view/app/common/DetailPage/style.scss | 2 +-
.../view/app/common/ExceptionPage/index.vue | 7 +-
.../view/app/common/ExceptionPage/style.scss | 4 +-
vue/src/view/example/cool/fluidPage.vue | 2 +-
.../component/PanelGroup/PanelGroupItem.vue | 4 +-
.../view/system/category/component/List.vue | 16 +-
vue/src/view/system/department/indexPage.vue | 16 +-
53 files changed, 1009 insertions(+), 1952 deletions(-)
delete mode 100644 vue/public/static/img/403.svg
delete mode 100644 vue/public/static/img/404.svg
delete mode 100644 vue/public/static/img/500.svg
delete mode 100644 vue/src/component/ColorCheckBox/group.vue
delete mode 100644 vue/src/component/ColorCheckBox/index.vue
create mode 100644 vue/src/component/checkbox/ColorCheckbox.vue
create mode 100644 vue/src/component/checkbox/Group.vue
create mode 100644 vue/src/component/checkbox/ImgCheckbox.vue
create mode 100644 vue/src/component/checkbox/common.js
rename vue/src/component/{ContextMenu/index.vue => menu/Contextmenu.vue} (98%)
rename vue/src/component/{ContextMenu/item.vue => menu/ContextmenuItem.vue} (87%)
create mode 100644 vue/src/component/menu/MenuItem.vue
delete mode 100644 vue/src/layout/component/Aside/component/SidebarItem.vue
delete mode 100644 vue/src/layout/component/Aside/component/SidebarItemContent.vue
create mode 100644 vue/src/layout/component/Header/component/Navbar/component/HeadMenu.vue
delete mode 100644 vue/src/layout/component/Header/component/Navbar/component/RootMenu.vue
delete mode 100644 vue/src/layout/component/Main/component/Breadcrumb.vue
create mode 100644 vue/src/layout/component/Main/component/PageHeader.vue
rename vue/src/layout/mixin/{actionOnSelectMenu.js => menu.js} (63%)
create mode 100644 vue/src/layout/util.js
diff --git a/vue/element-ui-personal/component/Menu/MenuItem.vue b/vue/element-ui-personal/component/Menu/MenuItem.vue
index bb0890e..3670ba6 100644
--- a/vue/element-ui-personal/component/Menu/MenuItem.vue
+++ b/vue/element-ui-personal/component/Menu/MenuItem.vue
@@ -37,10 +37,6 @@ export default {
mixins: [MenuMixin, Emitter],
- data() {
- return {}
- },
-
props: {
index: String,
route: [String, Object],
diff --git a/vue/element-ui-personal/component/Menu/Submenu.vue b/vue/element-ui-personal/component/Menu/Submenu.vue
index fcef7d1..a02e950 100644
--- a/vue/element-ui-personal/component/Menu/Submenu.vue
+++ b/vue/element-ui-personal/component/Menu/Submenu.vue
@@ -55,16 +55,8 @@ export default {
return this.rootMenu.openedMenus.includes(this.index)
},
active() {
- const items = this.items
-
- const isActive = Object.keys(items).some(key => items[key].active)
-
- if (!isActive) {
- const submenus = this.submenus
- return Object.keys(submenus).some(key => submenus[key].active)
- }
-
- return isActive
+ const active = Object.values(this.items).some(v => v.active)
+ return active || Object.values(this.submenus).some(v => v.active)
},
mode() {
return this.rootMenu.mode
@@ -96,26 +88,18 @@ export default {
methods: {
handleCollapseToggle(value) {
- if (value) {
- this.initPopper()
- }
- else {
- this.doDestroy()
- }
+ value ? this.initPopper() : this.doDestroy()
},
addItem(item) {
this.$set(this.items, item.index, item)
},
-
removeItem(item) {
delete this.items[item.index]
},
-
addSubmenu(item) {
this.$set(this.submenus, item.index, item)
},
-
removeSubmenu(item) {
delete this.submenus[item.index]
},
@@ -133,42 +117,34 @@ export default {
},
handleMouseenter(event, showTimeout = this.showTimeout) {
-
if (!('ActiveXObject' in window) && event.type === 'focus' && !event.relatedTarget) {
return
}
+
const {rootMenu, disabled} = this
- if (
- (rootMenu.menuTrigger === 'click' && rootMenu.mode === 'horizontal') ||
- (!rootMenu.collapse && rootMenu.mode === 'vertical') ||
- disabled
- ) {
- return
- }
+
+ if (rootMenu.menuTrigger === 'click' && rootMenu.mode === 'horizontal'
+ || !rootMenu.collapse && rootMenu.mode === 'vertical'
+ || disabled) return
+
this.dispatch('ElSubmenu', 'mouse-enter-child')
+
clearTimeout(this.timeout)
- this.timeout = setTimeout(() => {
- this.rootMenu.openMenu(this.index, this.indexPath)
- }, showTimeout)
+ this.timeout = setTimeout(() => this.rootMenu.openMenu(this.index, this.indexPath), showTimeout)
- if (this.appendToBody) {
- this.$parent.$el.dispatchEvent(new MouseEvent('mouseenter'))
- }
+ this.appendToBody && this.$parent.$el.dispatchEvent(new MouseEvent('mouseenter'))
},
handleMouseleave(deepDispatch = false) {
const {rootMenu} = this
- if (
- (rootMenu.menuTrigger === 'click' && rootMenu.mode === 'horizontal') ||
- (!rootMenu.collapse && rootMenu.mode === 'vertical')
- ) {
- return
- }
+
+ if (rootMenu.menuTrigger === 'click' && rootMenu.mode === 'horizontal'
+ || !rootMenu.collapse && rootMenu.mode === 'vertical') return
+
this.dispatch('ElSubmenu', 'mouse-leave-child')
+
clearTimeout(this.timeout)
- this.timeout = setTimeout(() => {
- !this.mouseInChild && this.rootMenu.closeMenu(this.index)
- }, this.hideTimeout)
+ this.timeout = setTimeout(() => !this.mouseInChild && this.rootMenu.closeMenu(this.index), this.hideTimeout)
if (this.appendToBody && deepDispatch) {
if (this.$parent.$options.name === 'ElSubmenu') {
diff --git a/vue/public/static/img/403.svg b/vue/public/static/img/403.svg
deleted file mode 100644
index 610f136..0000000
--- a/vue/public/static/img/403.svg
+++ /dev/null
@@ -1,508 +0,0 @@
-
-
\ No newline at end of file
diff --git a/vue/public/static/img/404.svg b/vue/public/static/img/404.svg
deleted file mode 100644
index 5531d05..0000000
--- a/vue/public/static/img/404.svg
+++ /dev/null
@@ -1,314 +0,0 @@
-
-
\ No newline at end of file
diff --git a/vue/public/static/img/500.svg b/vue/public/static/img/500.svg
deleted file mode 100644
index de723b1..0000000
--- a/vue/public/static/img/500.svg
+++ /dev/null
@@ -1,208 +0,0 @@
-
-
\ No newline at end of file
diff --git a/vue/src/asset/style/element-ui.scss b/vue/src/asset/style/element-ui.scss
index 61eba47..0c1d826 100644
--- a/vue/src/asset/style/element-ui.scss
+++ b/vue/src/asset/style/element-ui.scss
@@ -102,8 +102,14 @@
width: 0;
}
- .icon {
- margin-right: 16px;
+ //文字超出截断
+ .el-menu-item > span,
+ .el-submenu__title > span {
+ display: inline-block;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ word-break: break-all;
}
//子级菜单激活时,父级同样高亮
@@ -120,14 +126,21 @@
//弹出菜单
&.el-menu--popup {
max-height: 88vh;
+ min-width: 160px;
+ padding: 0;
margin-bottom: 0.5vh;
overflow-y: overlay;
+
+ .el-menu-item,
+ .el-submenu__title {
+ padding: 0 20px;
+ }
}
}
.el-message {
@include deep-shadow;
- @include max-mobile-width;
+ @include max-width-on-mobile;
border-width: 0;
.el-message__icon, .el-message__content {
@@ -154,7 +167,7 @@
.el-message-box {
position: relative;
@include deep-shadow;
- @include max-mobile-width;
+ @include max-width-on-mobile;
}
.el-notification {
diff --git a/vue/src/asset/style/index.scss b/vue/src/asset/style/index.scss
index 947b032..0523620 100644
--- a/vue/src/asset/style/index.scss
+++ b/vue/src/asset/style/index.scss
@@ -44,7 +44,7 @@ a:hover {
}
//非移动端的滚动条样式修改
-@media (min-width: 768px) {
+@include pc {
.scroll-container {
&::-webkit-scrollbar {
width: 6px;
diff --git a/vue/src/asset/style/variables.scss b/vue/src/asset/style/variables.scss
index c83d939..e6df623 100644
--- a/vue/src/asset/style/variables.scss
+++ b/vue/src/asset/style/variables.scss
@@ -1,3 +1,6 @@
+//设定移动端的最大宽度
+$max-mobile-width: 500px;
+
//覆盖element颜色
$--color-primary: #1890ff;
$--color-success: #21BA45;
@@ -26,14 +29,29 @@ $--font-path: '~element-ui/lib/theme-chalk/fonts';
box-shadow: 0 3px 5px -1px rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12);
}
-@mixin max-mobile-width {
- @media (max-width: 768px) {
+@mixin mobile {
+ @media (max-width: $max-mobile-width) {
+ @content
+ }
+}
+
+@mixin pc {
+ @media (min-width: $max-mobile-width) {
+ @content
+ }
+}
+
+@mixin max-width-on-mobile {
+ @include mobile {
max-width: 384px;
}
}
+//菜单中icon和文字的距离
+$menu-icon-text-gap: 10px;
+
//侧边菜单icon的大小
-$aside-icon-size: 16px;
+$aside-icon-size: 14px;
//侧边栏菜单的背景色
$aside-menu-background: #304156;
//侧边栏子菜单的背景色
@@ -43,6 +61,11 @@ $aside-menu-item-color: hsla(0, 0%, 99.6%, .65);
//侧边栏菜单文字的hover颜色
$aside-menu-item-hover-color: #fefefe;
+//顶部菜单文字的颜色
+$head-menu-item-color: #303133;
+//顶部菜单文字的hover颜色
+$head-menu-item-hover-color: $--color-primary;
+
//侧边栏宽度
$aside-width: 208px;
//头部导航栏高度
@@ -51,7 +74,7 @@ $nav-height: 50px;
$tags-view-height: 40px;
//路由页面的margin
-$page-view-margin: 15px;
+$page-view-margin: 24px;
// the :export directive is the magic sauce for webpack
// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
diff --git a/vue/src/component/AbstractForm/FormAnchor.vue b/vue/src/component/AbstractForm/FormAnchor.vue
index 21ec1d6..b9c668f 100644
--- a/vue/src/component/AbstractForm/FormAnchor.vue
+++ b/vue/src/component/AbstractForm/FormAnchor.vue
@@ -26,7 +26,7 @@ export default {
bounds: {type: Number, default: 0},
getContainer: {
type: Function,
- default: () => document.querySelector('#app .app-main>.scroll-container')
+ default: () => document.querySelector('#app .router-main>.scroll-container')
},
},
diff --git a/vue/src/component/ColorCheckBox/group.vue b/vue/src/component/ColorCheckBox/group.vue
deleted file mode 100644
index 2e57daf..0000000
--- a/vue/src/component/ColorCheckBox/group.vue
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/vue/src/component/ColorCheckBox/index.vue b/vue/src/component/ColorCheckBox/index.vue
deleted file mode 100644
index faf8e10..0000000
--- a/vue/src/component/ColorCheckBox/index.vue
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/vue/src/component/checkbox/ColorCheckbox.vue b/vue/src/component/checkbox/ColorCheckbox.vue
new file mode 100644
index 0000000..da03afa
--- /dev/null
+++ b/vue/src/component/checkbox/ColorCheckbox.vue
@@ -0,0 +1,29 @@
+
+
+
diff --git a/vue/src/component/checkbox/Group.vue b/vue/src/component/checkbox/Group.vue
new file mode 100644
index 0000000..a74066c
--- /dev/null
+++ b/vue/src/component/checkbox/Group.vue
@@ -0,0 +1,24 @@
+
+
+
diff --git a/vue/src/component/checkbox/ImgCheckbox.vue b/vue/src/component/checkbox/ImgCheckbox.vue
new file mode 100644
index 0000000..2a2987f
--- /dev/null
+++ b/vue/src/component/checkbox/ImgCheckbox.vue
@@ -0,0 +1,38 @@
+
+
+
diff --git a/vue/src/component/checkbox/common.js b/vue/src/component/checkbox/common.js
new file mode 100644
index 0000000..8971c82
--- /dev/null
+++ b/vue/src/component/checkbox/common.js
@@ -0,0 +1,22 @@
+export default {
+ props: ['value'],
+
+ computed: {
+ checked() {
+ const group = this.$parent
+ return group && group.value === this.value
+ }
+ },
+
+ methods: {
+ click() {
+ if (this.checked) return
+ this.$parent.$emit('input', this.value)
+ }
+ },
+
+ created() {
+ const group = this.$parent
+ group && group.children.push(this.value)
+ }
+}
diff --git a/vue/src/component/ContextMenu/index.vue b/vue/src/component/menu/Contextmenu.vue
similarity index 98%
rename from vue/src/component/ContextMenu/index.vue
rename to vue/src/component/menu/Contextmenu.vue
index 888800f..ba9a534 100644
--- a/vue/src/component/ContextMenu/index.vue
+++ b/vue/src/component/menu/Contextmenu.vue
@@ -6,7 +6,7 @@
diff --git a/vue/src/globalMethod/Guide/utils.js b/vue/src/globalMethod/Guide/utils.js
index 044bc72..9efd81f 100644
--- a/vue/src/globalMethod/Guide/utils.js
+++ b/vue/src/globalMethod/Guide/utils.js
@@ -32,8 +32,8 @@ export function getStyleProperty(element, propertyName, prefixVendor = false) {
}
export function inAppView(element) {
- let appView = document.querySelector('.app-main')
- if (!appView) throw new Error('app-main未加载')
+ let appView = document.querySelector('.router-main')
+ if (!appView) throw new Error('router-main未加载')
return appView.contains(element)
}
diff --git a/vue/src/layout/component/Aside/component/SidebarItem.vue b/vue/src/layout/component/Aside/component/SidebarItem.vue
deleted file mode 100644
index ee61402..0000000
--- a/vue/src/layout/component/Aside/component/SidebarItem.vue
+++ /dev/null
@@ -1,83 +0,0 @@
-
diff --git a/vue/src/layout/component/Aside/component/SidebarItemContent.vue b/vue/src/layout/component/Aside/component/SidebarItemContent.vue
deleted file mode 100644
index c0c7e6b..0000000
--- a/vue/src/layout/component/Aside/component/SidebarItemContent.vue
+++ /dev/null
@@ -1,22 +0,0 @@
-
diff --git a/vue/src/layout/component/Aside/index.vue b/vue/src/layout/component/Aside/index.vue
index ba2081d..e61ba65 100644
--- a/vue/src/layout/component/Aside/index.vue
+++ b/vue/src/layout/component/Aside/index.vue
@@ -1,67 +1,48 @@
diff --git a/vue/src/layout/component/Header/component/Navbar/component/RootMenu.vue b/vue/src/layout/component/Header/component/Navbar/component/RootMenu.vue
deleted file mode 100644
index b3890f8..0000000
--- a/vue/src/layout/component/Header/component/Navbar/component/RootMenu.vue
+++ /dev/null
@@ -1,273 +0,0 @@
-
-
-
diff --git a/vue/src/layout/component/Header/component/Navbar/component/SettingDrawer.vue b/vue/src/layout/component/Header/component/Navbar/component/SettingDrawer.vue
index 201dbd9..11a5e0e 100644
--- a/vue/src/layout/component/Header/component/Navbar/component/SettingDrawer.vue
+++ b/vue/src/layout/component/Header/component/Navbar/component/SettingDrawer.vue
@@ -3,16 +3,31 @@
主题色
-
-
-
+
+
+
-
其他设置
-
-
{{ name }}
-
setValue(e,key)"/>
+ 导航模式
+
+
setValue(e, 'navMode')">
+
+
+
+
+ {{ title }}
+
+ {{ title }}
+ setValue(e, key)"/>
+
+
@@ -21,43 +36,77 @@
import client from 'webpack-theme-color-replacer/client'
import forElementUI from 'webpack-theme-color-replacer/forElementUI'
import {isDev} from '@/config'
-import ColorCheckBox from "@/component/ColorCheckBox"
-import ColorCheckboxGroup from "@/component/ColorCheckBox/group"
+import CheckboxGroup from "@/component/checkbox/Group"
+import ColorCheckbox from "@/component/checkbox/ColorCheckbox"
+import ImgCheckbox from "@/component/checkbox/ImgCheckbox"
import {getters, mutations} from "@/layout/store/setting"
-const settings = [
- {name: '显示logo', key: 'showLogo'},
- {name: '显示面包屑', key: 'showBreadcrumb'},
- {name: '使用多页签', key: 'useTagsView'},
- {name: '侧边栏手风琴效果', key: 'sidebarUniqueOpen'},
- {name: '侧边栏折叠', key: 'sidebarCollapse'},
- {name: '折叠菜单显示上级', key: 'sidebarShowParent'},
- {name: '侧边栏自动隐藏', key: 'sidebarAutoHidden'},
- {name: '头部自动隐藏', key: 'headerAutoHidden'},
- {name: '显示返回顶部按钮', key: 'showBackToTop'}
-]
-const colors = ['#f5222d', '#fa541c', '#fadb14', '#3eaf7c', '#13c2c2', '#1890ff', '#722ed1', '#eb2f96']
-
export default {
name: "SettingDrawer",
- components: {ColorCheckBox, ColorCheckboxGroup},
+ components: {CheckboxGroup, ColorCheckbox, ImgCheckbox},
props: {value: Boolean},
data() {
return {
- settings,
- colors,
- color: '#1890ff'
+ colors: ['#f5222d', '#fa541c', '#fadb14', '#3eaf7c', '#13c2c2', '#1890ff', '#722ed1', '#eb2f96'],
+ navModes: [
+ {
+ title: '侧边栏导航',
+ value: 'aside',
+ img: 'https://gw.alipayobjects.com/zos/antfincdn/XwFOFbLkSM/LCkqqYNmvBEbokSDscrm.svg'
+ },
+ {
+ title: '顶部导航',
+ value: 'head',
+ img: 'https://gw.alipayobjects.com/zos/antfincdn/URETY8%24STp/KDNDBbriJhLwuqMoxcAr.svg'
+ },
+ {
+ title: '混合导航',
+ value: 'mix',
+ img: 'https://gw.alipayobjects.com/zos/antfincdn/x8Ob%26B8cy8/LCkqqYNmvBEbokSDscrm.svg'
+ },
+ ],
+ settings: [
+ {
+ title: '页面设置',
+ children: [
+ {title: '显示logo', key: 'showLogo'},
+ {title: '显示页头', key: 'showPageHeader'},
+ {title: '使用多页签', key: 'useTagsView'}
+ ]
+ },
+ {
+ title: '侧边栏设置',
+ children: [
+ {title: '手风琴效果', key: 'sidebarUniqueOpen'},
+ {title: '折叠', key: 'sidebarCollapse'},
+ {title: '折叠状态下显示上级', key: 'sidebarShowParent'},
+ {title: '自动隐藏', key: 'sidebarAutoHidden'},
+ ]
+ },
+ {
+ title: '其他设置',
+ children: [
+ {title: '显示返回顶部按钮', key: 'showBackToTop'}
+ ]
+ }
+ ]
}
},
+ computed: {
+ color: () => getters.themeColor,
+ navMode: () => getters.navMode,
+ },
+
methods: {
changeColor(color) {
- this.color = color
+ this.setValue(color,'themeColor')
isDev && client.changer.changeColor({newColors: forElementUI.getElementUISeries(color)})
},
+
getValue(key) {
return getters[key]
},
diff --git a/vue/src/layout/component/Header/component/Navbar/index.vue b/vue/src/layout/component/Header/component/Navbar/index.vue
index 9eb8c26..1c9c3f9 100644
--- a/vue/src/layout/component/Header/component/Navbar/index.vue
+++ b/vue/src/layout/component/Header/component/Navbar/index.vue
@@ -1,59 +1,13 @@
-
-
-
-
-
diff --git a/vue/src/layout/component/Header/component/Navbar/style.scss b/vue/src/layout/component/Header/component/Navbar/style.scss
index 56b0a6f..42783f8 100644
--- a/vue/src/layout/component/Header/component/Navbar/style.scss
+++ b/vue/src/layout/component/Header/component/Navbar/style.scss
@@ -15,6 +15,7 @@
> div {
display: flex;
+ flex-wrap: nowrap;
height: 100%;
}
@@ -45,3 +46,51 @@
}
}
}
+
+//顶部水平菜单
+.el-menu--horizontal .el-menu,
+.el-menu--horizontal.el-menu {
+ font-size: 14px;
+
+ .icon {
+ font-size: 14px;
+ }
+
+ //图标和文字的间隔
+ .icon + .menu-item-content {
+ margin-left: $menu-icon-text-gap;
+ }
+
+ //菜单的文字以及hover颜色
+ .el-menu-item,
+ .el-submenu__title {
+ color: $head-menu-item-color;
+
+ &:hover {
+ color: $head-menu-item-hover-color;
+ }
+
+ > span {
+ max-width: 100px;
+ }
+ }
+}
+
+//顶部菜单的顶级节点
+.el-menu--horizontal.el-menu {
+ //不显示折叠展开按钮
+ > .el-submenu > .el-submenu__title > .el-submenu__icon-arrow {
+ display: none;
+ }
+
+ //顶级节点的高度以及hover颜色
+ > .el-menu-item,
+ > .el-submenu > .el-submenu__title {
+ height: $nav-height;
+ line-height: $nav-height;
+
+ &:hover {
+ border-bottom: 2px solid $head-menu-item-hover-color;
+ }
+ }
+}
diff --git a/vue/src/layout/component/Header/component/TagsView/index.vue b/vue/src/layout/component/Header/component/TagsView/index.vue
index d953937..8e45ca9 100644
--- a/vue/src/layout/component/Header/component/TagsView/index.vue
+++ b/vue/src/layout/component/Header/component/TagsView/index.vue
@@ -4,14 +4,14 @@ import decideRouterTransitionMixin from '@/layout/mixin/decideRouterTransition'
import {route as routeConfig} from '@/config'
import {getters as mainGetters} from "@/layout/store/main"
import {getters as tagsViewGetters, mutations as tagsViewMutations} from "@/layout/store/tagsView"
-import ContextMenu from "@/component/ContextMenu"
-import ContextMenuItem from "@/component/ContextMenu/item"
+import Contextmenu from "@/component/menu/Contextmenu"
+import ContextmenuItem from "@/component/menu/ContextmenuItem"
import ScrollPane from './ScrollPane'
export default {
mixins: [shortcutMixin, decideRouterTransitionMixin],
- components: {ContextMenu, ContextMenuItem, ScrollPane},
+ components: {Contextmenu, ContextmenuItem, ScrollPane},
data() {
return {
@@ -36,9 +36,6 @@ export default {
this.decideRouteTransition && this.decideRouteTransition(to, from)
this.addTags(to)
this.moveToCurrentTag()
- },
- 'contextmenu.show'(v) {
- this.$emit('menu-show', v)
}
},
@@ -172,15 +169,15 @@ export default {
renderContextmenu(h) {
const menu = this.contextmenu
return (
-
- 刷新
+
+ 刷新
{!this.isAffix(this.selectedTag) &&
- this.closeSelectedTag(this.selectedTag)}>
+ this.closeSelectedTag(this.selectedTag)}>
关闭
- }
- 关闭其他
- 关闭全部
-
+ }
+
关闭其他
+
关闭全部
+
)
}
},
diff --git a/vue/src/layout/component/Header/index.vue b/vue/src/layout/component/Header/index.vue
index 39c529e..e60c76a 100644
--- a/vue/src/layout/component/Header/index.vue
+++ b/vue/src/layout/component/Header/index.vue
@@ -1,5 +1,4 @@
-
-
diff --git a/vue/src/layout/component/Main/component/PageHeader.vue b/vue/src/layout/component/Main/component/PageHeader.vue
new file mode 100644
index 0000000..42affa9
--- /dev/null
+++ b/vue/src/layout/component/Main/component/PageHeader.vue
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
diff --git a/vue/src/layout/component/Main/index.vue b/vue/src/layout/component/Main/index.vue
index a2b6299..3bfc09d 100644
--- a/vue/src/layout/component/Main/index.vue
+++ b/vue/src/layout/component/Main/index.vue
@@ -1,45 +1,21 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/vue/src/layout/component/Main/style.scss b/vue/src/layout/component/Main/style.scss
index ffa658b..f7d4db5 100644
--- a/vue/src/layout/component/Main/style.scss
+++ b/vue/src/layout/component/Main/style.scss
@@ -1,19 +1,19 @@
@import "~@/asset/style/variables.scss";
-.app-main {
+.router-main {
position: relative;
flex: 1;
overflow: hidden;
background-color: #f0f2f5;
- .scroll-container {
+ > .scroll-container {
height: 100%;
display: flex;
flex-direction: column;
overflow-y: overlay;
overflow-x: inherit;
- .page-view {
+ > .page-view {
margin: $page-view-margin;
flex: 1;
}
diff --git a/vue/src/layout/index.vue b/vue/src/layout/index.vue
index 4ef27b6..142a2fd 100644
--- a/vue/src/layout/index.vue
+++ b/vue/src/layout/index.vue
@@ -16,14 +16,10 @@ export default {
components: {VAside, VHeader, VMain},
computed: {
- hasNav: () => mainGetters.hasNav,
- useTagsView: () => settingGetters.useTagsView,
containerClass() {
- return {
- 'main-container': true,
- 'has-nav': this.hasNav,
- 'has-tags-view': this.useTagsView
- }
+ const arr = ['main-container', 'has-nav', `nav-mode-${settingGetters.navMode}`]
+ settingGetters.useTagsView && arr.push('has-tags-view')
+ return arr
}
},
@@ -48,9 +44,10 @@ export default {
},
render() {
+ const renderAide = mainGetters.device === 'mobile' || settingGetters.navMode !== 'head'
return (
-
+ {renderAide && }
@@ -69,7 +66,7 @@ export default {
height: 100%;
width: 100%;
- .main-container {
+ > .main-container {
display: flex;
flex: 1;
overflow: hidden;
diff --git a/vue/src/layout/mixin/actionOnSelectMenu.js b/vue/src/layout/mixin/menu.js
similarity index 63%
rename from vue/src/layout/mixin/actionOnSelectMenu.js
rename to vue/src/layout/mixin/menu.js
index cfa4547..5332f21 100644
--- a/vue/src/layout/mixin/actionOnSelectMenu.js
+++ b/vue/src/layout/mixin/menu.js
@@ -1,13 +1,24 @@
+/**
+ * 顶部菜单和侧边栏菜单的公共混入
+ */
import {mutations as tagsViewMutations} from "@/layout/store/tagsView"
import {isExternal} from "@/util/validate"
export default {
+ data() {
+ return {
+ //当前激活的菜单的fullPath
+ activeMenu: ''
+ }
+ },
+
methods: {
+ //点击菜单后的动作
actionOnSelectMenu(fullPath, refreshWhenSame = true) {
//外部链接时打开新窗口
if (isExternal(fullPath)) {
window.open(fullPath)
- //当是从侧边栏打开时,重置高亮菜单
+ //重置高亮菜单
const menu = this.$refs.menu
if (menu && menu.updateActiveIndex) {
menu.updateActiveIndex(this.activeMenu)
@@ -22,6 +33,13 @@ export default {
this.$nextTick(() => this.$router.replace({path: '/redirect' + this.$route.fullPath}))
}
else this.$router.push(fullPath)
+ },
+
+ resetActiveMenu() {
+ //由于侧边栏菜单数组更新后,el-menu不一定会更新(当数组中不存在单级菜单时)
+ //所以手动更新el-menu的当前高亮菜单
+ const menu = this.$refs.menu
+ menu && menu.updateActiveIndex()
}
}
}
diff --git a/vue/src/layout/store/main.js b/vue/src/layout/store/main.js
index 60137f1..e2833e3 100644
--- a/vue/src/layout/store/main.js
+++ b/vue/src/layout/store/main.js
@@ -2,22 +2,16 @@ import Vue from 'vue'
import {isEmpty} from "@/util"
import {isMobile} from "@/util/browser"
import {createGetters, createMutations} from "@/util/observable"
-import {getLocalPersonalSettings} from "@/util/storage"
-
-const localSettings = getLocalPersonalSettings()
const state = {
//区分pc和移动端(mobile)
device: isMobile() ? 'mobile' : 'pc',
- //右侧块是否含有导航栏,这里初始值是为了转为boolean类型
- hasNav: !!!localSettings.headerAutoHidden,
-
//当前激活的顶部菜单的fullPath
activeRootMenu: '',
//所有的树形菜单,每个元素为顶部菜单,顶部菜单的子级(如果有)为侧边栏菜单
- menus: [],
+ menus: []
}
const store = Vue.observable(state)
diff --git a/vue/src/layout/store/setting.js b/vue/src/layout/store/setting.js
index 8b53297..1a60b24 100644
--- a/vue/src/layout/store/setting.js
+++ b/vue/src/layout/store/setting.js
@@ -4,30 +4,27 @@ import {createGetters} from "@/util/observable"
import {getLocalPersonalSettings, setLocalPersonalSettings} from "@/util/storage"
const state = {
+ //主题色
+ themeColor: '#1890ff',
+ //导航模式
+ navMode: 'mix',
+
//是否显示logo
showLogo: true,
-
- //是否显示面包屑
- showBreadcrumb: true,
-
+ //是否显示页头
+ showPageHeader: true,
//是否使用多页签
useTagsView: true,
- //左侧菜单手风琴效果
+ //侧边栏菜单手风琴效果
sidebarUniqueOpen: true,
-
- //左侧菜单是否折叠
+ //侧边栏菜单是否折叠
sidebarCollapse: false,
-
- //左侧菜单折叠时,弹出菜单是否显示上级
+ //侧边栏菜单折叠时,弹出菜单是否显示上级
sidebarShowParent: false,
-
- //是否自动隐藏左侧菜单
+ //是否自动隐藏侧边栏菜单
sidebarAutoHidden: false,
- //是否自动隐藏头部
- headerAutoHidden: false,
-
//是否显示返回顶部按钮
showBackToTop: true,
}
diff --git a/vue/src/layout/util.js b/vue/src/layout/util.js
new file mode 100644
index 0000000..c63a0eb
--- /dev/null
+++ b/vue/src/layout/util.js
@@ -0,0 +1,27 @@
+import {getters as mainGetters} from "@/layout/store/main"
+import {getters as settingGetters} from "@/layout/store/setting"
+
+//获取侧边栏的菜单
+export function getSidebarMenus() {
+ const menus = mainGetters.menus
+ if (!Array.isArray(menus)) {
+ return []
+ }
+ if (mainGetters.device === 'mobile') {
+ return menus
+ }
+ switch (settingGetters.navMode) {
+ case 'aside':
+ return menus
+ case 'head':
+ return []
+ case 'mix':
+ const root = menus.find(i => i.path === mainGetters.activeRootMenu)
+ return root ? root.children || [] : []
+ }
+}
+
+//根据路由获取当前激活的菜单
+export function getActiveMenuByRoute({path, meta}) {
+ return meta.activeMenu || path
+}
diff --git a/vue/src/router/index.js b/vue/src/router/index.js
index 769f991..ae58d31 100644
--- a/vue/src/router/index.js
+++ b/vue/src/router/index.js
@@ -5,7 +5,7 @@
* 左侧菜单显示:name && !meta.hidden && meta.title
* 左侧菜单排序:能在左侧菜单中显示 && meta.sort,升序排列
* 左侧菜单不折叠只有一个children的路由:meta.alwaysShow
-* 面包屑显示:meta.breadcrumb !== false && (meta.title || meta.dynamicTitle)
+* 页头显示:meta.pageHeader !== false && (meta.title || meta.dynamicTitle)
* tab栏显示:meta.title || meta.dynamicTitle
* tab栏固定显示:meta.title && meta.affix
* 页面不缓存:!name && !meta.usePathKey && !meta.useFullPathKey || meta.noCache
diff --git a/vue/src/router/module/defaultRoot/child/app.js b/vue/src/router/module/defaultRoot/child/app.js
index 7e2dbca..ff5820b 100644
--- a/vue/src/router/module/defaultRoot/child/app.js
+++ b/vue/src/router/module/defaultRoot/child/app.js
@@ -5,13 +5,13 @@ const router = [
path: 'index',
component: 'index/',
name: 'index',
- meta: {title: '首页', affix: true, icon: 'svg-home', noAuth: true, breadcrumb: false, sort: 0}
+ meta: {title: '首页', affix: true, icon: 'svg-home', noAuth: true, pageHeader: false, sort: 0}
},
{
path: 'user',
name: 'userCenter',
component: 'userCenter/',
- meta: {title: '个人中心', noCache: true, icon: 'svg-user', noAuth: true, breadcrumb: false, hidden: true},
+ meta: {title: '个人中心', noCache: true, icon: 'svg-user', noAuth: true, pageHeader: false, hidden: true},
}
]
diff --git a/vue/src/router/module/defaultRoot/child/purchase.js b/vue/src/router/module/defaultRoot/child/purchase.js
index 639f7ba..257e72c 100644
--- a/vue/src/router/module/defaultRoot/child/purchase.js
+++ b/vue/src/router/module/defaultRoot/child/purchase.js
@@ -16,7 +16,7 @@ const router = {
meta: {
title: '采购订单详情页',
hidden: true,
- breadcrumb: false,
+ pageHeader: false,
dynamicTitle(to) {
const {type, id} = to.params
switch (type) {
@@ -45,7 +45,7 @@ const router = {
meta: {
title: '采购入库详情页',
hidden: true,
- breadcrumb: false,
+ pageHeader: false,
dynamicTitle(to) {
const {type, id} = to.params
switch (type) {
diff --git a/vue/src/router/module/defaultRoot/child/sell.js b/vue/src/router/module/defaultRoot/child/sell.js
index e1d9419..6b9a28d 100644
--- a/vue/src/router/module/defaultRoot/child/sell.js
+++ b/vue/src/router/module/defaultRoot/child/sell.js
@@ -16,7 +16,7 @@ const router = {
meta: {
title: '销售订单详情页',
hidden: true,
- breadcrumb: false,
+ pageHeader: false,
dynamicTitle(to) {
const {type, id} = to.params
switch (type) {
@@ -45,7 +45,7 @@ const router = {
meta: {
title: '销售出库详情页',
hidden: true,
- breadcrumb: false,
+ pageHeader: false,
dynamicTitle(to) {
const {type, id} = to.params
switch (type) {
diff --git a/vue/src/util/browser.js b/vue/src/util/browser.js
index 3f0d410..7b3f335 100644
--- a/vue/src/util/browser.js
+++ b/vue/src/util/browser.js
@@ -1,9 +1,9 @@
const {body} = document
-const WIDTH = 768
+const MAX_MOBILE_WIDTH = 500
export function isMobile() {
const rect = body.getBoundingClientRect()
- return rect.width - 1 < WIDTH
+ return rect.width - 1 < MAX_MOBILE_WIDTH
}
//获取元素的内宽度
@@ -14,7 +14,6 @@ export function getElementInnerWidth(ele) {
return parseFloat(style.width) - (parseFloat(style.paddingLeft) + parseFloat(style.paddingRight))
}
-//获取元素的高度
export function getElementHeight(ele, style) {
if (!ele) return 0
diff --git a/vue/src/view/app/common/DetailPage/style.scss b/vue/src/view/app/common/DetailPage/style.scss
index 6207528..0371dde 100644
--- a/vue/src/view/app/common/DetailPage/style.scss
+++ b/vue/src/view/app/common/DetailPage/style.scss
@@ -24,7 +24,7 @@
width: 100%;
margin-bottom: 12px;
- @media (max-width: 768px) {
+ @include mobile {
display: block;
}
}
diff --git a/vue/src/view/app/common/ExceptionPage/index.vue b/vue/src/view/app/common/ExceptionPage/index.vue
index 7d66329..b102e6d 100644
--- a/vue/src/view/app/common/ExceptionPage/index.vue
+++ b/vue/src/view/app/common/ExceptionPage/index.vue
@@ -1,22 +1,21 @@