'admin-21.01.04:编写布局配置菜单/顶栏,添加事件总线mitt等'
This commit is contained in:
parent
dd9544d7a5
commit
e9f6aae01e
@ -7,6 +7,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"element-plus": "^v1.0.1-beta.19",
|
"element-plus": "^v1.0.1-beta.19",
|
||||||
|
"mitt": "^2.1.0",
|
||||||
"sortablejs": "^1.10.2",
|
"sortablejs": "^1.10.2",
|
||||||
"vue": "^3.0.5",
|
"vue": "^3.0.5",
|
||||||
"vue-router": "^4.0.2"
|
"vue-router": "^4.0.2"
|
||||||
@ -19,4 +20,4 @@
|
|||||||
"typescript": "^4.1.2",
|
"typescript": "^4.1.2",
|
||||||
"vite": "^1.0.0-rc.13"
|
"vite": "^1.0.0-rc.13"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,5 +6,8 @@ import ElementPlus from 'element-plus'
|
|||||||
import 'element-plus/lib/theme-chalk/index.css'
|
import 'element-plus/lib/theme-chalk/index.css'
|
||||||
import '/@/theme/index.scss'
|
import '/@/theme/index.scss'
|
||||||
import lang from 'element-plus/lib/locale/lang/zh-cn'
|
import lang from 'element-plus/lib/locale/lang/zh-cn'
|
||||||
|
import mitt from "mitt"
|
||||||
|
|
||||||
createApp(App).use(router).use(ElementPlus, { locale: lang }).mount('#app')
|
const app = createApp(App)
|
||||||
|
app.use(router).use(ElementPlus, { locale: lang }).mount('#app')
|
||||||
|
app.config.globalProperties.mittBus = mitt()
|
||||||
|
@ -46,6 +46,9 @@ body,
|
|||||||
.el-scrollbar {
|
.el-scrollbar {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
.layout-aside-width {
|
||||||
|
width: 240px !important;
|
||||||
|
}
|
||||||
.layout-scrollbar {
|
.layout-scrollbar {
|
||||||
@extend .el-scrollbar;
|
@extend .el-scrollbar;
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
|
@ -675,6 +675,7 @@
|
|||||||
height: 50px !important;
|
height: 50px !important;
|
||||||
line-height: 50px !important;
|
line-height: 50px !important;
|
||||||
color: var(--bg-menuBarColor);
|
color: var(--bg-menuBarColor);
|
||||||
|
transition: none !important;
|
||||||
}
|
}
|
||||||
// horizontal 水平方向时
|
// horizontal 水平方向时
|
||||||
.el-menu--horizontal > .el-menu-item.is-active,
|
.el-menu--horizontal > .el-menu-item.is-active,
|
||||||
@ -698,7 +699,6 @@
|
|||||||
color: inherit;
|
color: inherit;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 默认 hover 时
|
// 默认 hover 时
|
||||||
.el-menu-item:hover,
|
.el-menu-item:hover,
|
||||||
.el-submenu__title:hover {
|
.el-submenu__title:hover {
|
||||||
@ -710,12 +710,21 @@
|
|||||||
}
|
}
|
||||||
// 高亮时
|
// 高亮时
|
||||||
.el-menu-item.is-active {
|
.el-menu-item.is-active {
|
||||||
|
color: set-color(primary);
|
||||||
|
}
|
||||||
|
.el-active-extend {
|
||||||
color: #ffffff !important;
|
color: #ffffff !important;
|
||||||
background-color: set-color(primary) !important;
|
background-color: set-color(primary) !important;
|
||||||
i {
|
i {
|
||||||
color: #ffffff !important;
|
color: #ffffff !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.add-is-active {
|
||||||
|
@extend .el-active-extend;
|
||||||
|
&:hover {
|
||||||
|
@extend .el-active-extend;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Tabs 标签页
|
/* Tabs 标签页
|
||||||
------------------------------- */
|
------------------------------- */
|
||||||
|
@ -3,7 +3,7 @@ import { ElMessage } from 'element-plus'
|
|||||||
// hex颜色转rgb颜色
|
// hex颜色转rgb颜色
|
||||||
export function hexToRgb(str: any) {
|
export function hexToRgb(str: any) {
|
||||||
let hexs: any = ''
|
let hexs: any = ''
|
||||||
let reg = /^\#?[0-9A-F]{6}$/
|
let reg = /^\#?[0-9A-Fa-f]{6}$/
|
||||||
if (!reg.test(str)) return ElMessage({ type: 'warning', message: "输入错误的hex" })
|
if (!reg.test(str)) return ElMessage({ type: 'warning', message: "输入错误的hex" })
|
||||||
str = str.replace("#", "")
|
str = str.replace("#", "")
|
||||||
hexs = str.match(/../g)
|
hexs = str.match(/../g)
|
||||||
@ -22,7 +22,7 @@ export function rgbToHex(r: any, g: any, b: any) {
|
|||||||
|
|
||||||
// 加深颜色值,level为加深的程度,限0-1之间
|
// 加深颜色值,level为加深的程度,限0-1之间
|
||||||
export function getDarkColor(color: any, level: number) {
|
export function getDarkColor(color: any, level: number) {
|
||||||
let reg = /^\#?[0-9A-F]{6}$/
|
let reg = /^\#?[0-9A-Fa-f]{6}$/
|
||||||
if (!reg.test(color)) return ElMessage({ type: 'warning', message: "输入错误的hex颜色值" })
|
if (!reg.test(color)) return ElMessage({ type: 'warning', message: "输入错误的hex颜色值" })
|
||||||
let rgb = hexToRgb(color)
|
let rgb = hexToRgb(color)
|
||||||
for (let i = 0; i < 3; i++) rgb[i] = Math.floor(rgb[i] * (1 - level))
|
for (let i = 0; i < 3; i++) rgb[i] = Math.floor(rgb[i] * (1 - level))
|
||||||
@ -31,7 +31,7 @@ export function getDarkColor(color: any, level: number) {
|
|||||||
|
|
||||||
// 变浅颜色值,level为加深的程度,限0-1之间
|
// 变浅颜色值,level为加深的程度,限0-1之间
|
||||||
export function getLightColor(color: any, level: number) {
|
export function getLightColor(color: any, level: number) {
|
||||||
let reg = /^\#?[0-9A-F]{6}$/
|
let reg = /^\#?[0-9A-Fa-f]{6}$/
|
||||||
if (!reg.test(color)) return ElMessage({ type: 'warning', message: "输入错误的hex颜色值" })
|
if (!reg.test(color)) return ElMessage({ type: 'warning', message: "输入错误的hex颜色值" })
|
||||||
let rgb = hexToRgb(color)
|
let rgb = hexToRgb(color)
|
||||||
for (let i = 0; i < 3; i++) rgb[i] = Math.floor((255 - rgb[i]) * level + rgb[i])
|
for (let i = 0; i < 3; i++) rgb[i] = Math.floor((255 - rgb[i]) * level + rgb[i])
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-aside width="240px">
|
<el-aside class="layout-aside-width">
|
||||||
<el-scrollbar>
|
<el-scrollbar>
|
||||||
<Vertical :menuList="menuList" />
|
<Vertical :menuList="menuList" />
|
||||||
</el-scrollbar>
|
</el-scrollbar>
|
||||||
|
@ -61,8 +61,9 @@ export default {
|
|||||||
opacity: 0.7;
|
opacity: 0.7;
|
||||||
color: var(--bg-topBarColor);
|
color: var(--bg-topBarColor);
|
||||||
}
|
}
|
||||||
:deep .el-breadcrumb__separator {
|
::v-deep(.el-breadcrumb__separator) {
|
||||||
@extend .layout-navbars-breadcrumb-span;
|
opacity: 0.7;
|
||||||
|
color: var(--bg-topBarColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
@ -21,6 +21,6 @@ export default {
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
border-bottom: 1px solid rgb(230, 230, 230);
|
border-bottom: 1px solid rgb(230, 230, 230);
|
||||||
padding: 0 15px;
|
padding: 0 15px;
|
||||||
background-color: var(--bg-topBar);
|
background: var(--bg-topBar);
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
@ -71,13 +71,19 @@
|
|||||||
<div class="layout-breadcrumb-seting-bar-flex mt10">
|
<div class="layout-breadcrumb-seting-bar-flex mt10">
|
||||||
<div class="layout-breadcrumb-seting-bar-flex-label">顶栏背景渐变</div>
|
<div class="layout-breadcrumb-seting-bar-flex-label">顶栏背景渐变</div>
|
||||||
<div class="layout-breadcrumb-seting-bar-flex-value">
|
<div class="layout-breadcrumb-seting-bar-flex-value">
|
||||||
<el-switch v-model="isCollapse"></el-switch>
|
<el-switch v-model="isTopBarColorGradual" @change="onTopBarGradualChange"></el-switch>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="layout-breadcrumb-seting-bar-flex mt14">
|
<div class="layout-breadcrumb-seting-bar-flex mt14">
|
||||||
<div class="layout-breadcrumb-seting-bar-flex-label">菜单背景渐变</div>
|
<div class="layout-breadcrumb-seting-bar-flex-label">菜单背景渐变</div>
|
||||||
<div class="layout-breadcrumb-seting-bar-flex-value">
|
<div class="layout-breadcrumb-seting-bar-flex-value">
|
||||||
<el-switch v-model="isCollapse"></el-switch>
|
<el-switch v-model="isMenuBarColorGradual" @change="onMenuBarGradualChange"></el-switch>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layout-breadcrumb-seting-bar-flex mt14">
|
||||||
|
<div class="layout-breadcrumb-seting-bar-flex-label">菜单字体背景高亮</div>
|
||||||
|
<div class="layout-breadcrumb-seting-bar-flex-value">
|
||||||
|
<el-switch v-model="isMenuBarColorHighlight" @change="onMenuBarHighlightChange"></el-switch>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -150,6 +156,12 @@
|
|||||||
<el-switch v-model="isCollapse"></el-switch>
|
<el-switch v-model="isCollapse"></el-switch>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="layout-breadcrumb-seting-bar-flex mt15">
|
||||||
|
<div class="layout-breadcrumb-seting-bar-flex-label">开启 Footer</div>
|
||||||
|
<div class="layout-breadcrumb-seting-bar-flex-value">
|
||||||
|
<el-switch v-model="isCollapse"></el-switch>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="layout-breadcrumb-seting-bar-flex mt15">
|
<div class="layout-breadcrumb-seting-bar-flex mt15">
|
||||||
<div class="layout-breadcrumb-seting-bar-flex-label">灰色模式</div>
|
<div class="layout-breadcrumb-seting-bar-flex-label">灰色模式</div>
|
||||||
<div class="layout-breadcrumb-seting-bar-flex-value">
|
<div class="layout-breadcrumb-seting-bar-flex-value">
|
||||||
@ -257,11 +269,19 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { toRefs, reactive } from "vue";
|
import {
|
||||||
|
toRefs,
|
||||||
|
reactive,
|
||||||
|
nextTick,
|
||||||
|
onBeforeMount,
|
||||||
|
onUnmounted,
|
||||||
|
getCurrentInstance,
|
||||||
|
} from "vue";
|
||||||
import { getLightColor } from "/@/utils/theme.ts";
|
import { getLightColor } from "/@/utils/theme.ts";
|
||||||
export default {
|
export default {
|
||||||
name: "layoutBreadcrumbSeting",
|
name: "layoutBreadcrumbSeting",
|
||||||
setup() {
|
setup() {
|
||||||
|
const { proxy } = getCurrentInstance();
|
||||||
const state = reactive({
|
const state = reactive({
|
||||||
isDrawer: false,
|
isDrawer: false,
|
||||||
primary: "#409eff",
|
primary: "#409eff",
|
||||||
@ -273,6 +293,9 @@ export default {
|
|||||||
menuBar: "#29384d",
|
menuBar: "#29384d",
|
||||||
topBarColor: "#606266",
|
topBarColor: "#606266",
|
||||||
menuBarColor: "#e6e6e6",
|
menuBarColor: "#e6e6e6",
|
||||||
|
isTopBarColorGradual: false,
|
||||||
|
isMenuBarColorGradual: false,
|
||||||
|
isMenuBarColorHighlight: false,
|
||||||
isCollapse: false,
|
isCollapse: false,
|
||||||
menuWidth: 240,
|
menuWidth: 240,
|
||||||
});
|
});
|
||||||
@ -296,12 +319,62 @@ export default {
|
|||||||
};
|
};
|
||||||
const onBgColorPickerChange = (bg: string) => {
|
const onBgColorPickerChange = (bg: string) => {
|
||||||
document.documentElement.style.setProperty(`--bg-${bg}`, state[bg]);
|
document.documentElement.style.setProperty(`--bg-${bg}`, state[bg]);
|
||||||
|
onTopBarGradualChange();
|
||||||
|
onMenuBarGradualChange();
|
||||||
};
|
};
|
||||||
|
const onTopBarGradualChange = () => {
|
||||||
|
setGraduaFun(
|
||||||
|
".layout-navbars-breadcrumb-index",
|
||||||
|
state.isTopBarColorGradual,
|
||||||
|
state.topBar
|
||||||
|
);
|
||||||
|
};
|
||||||
|
const onMenuBarGradualChange = () => {
|
||||||
|
setGraduaFun(
|
||||||
|
".layout-container .el-aside",
|
||||||
|
state.isMenuBarColorGradual,
|
||||||
|
state.menuBar
|
||||||
|
);
|
||||||
|
};
|
||||||
|
const setGraduaFun = (el: string, bool: boolean, color: string) => {
|
||||||
|
nextTick(() => {
|
||||||
|
let els = document.querySelector(el);
|
||||||
|
if (bool)
|
||||||
|
els.setAttribute(
|
||||||
|
"style",
|
||||||
|
`background-image:linear-gradient(to bottom left , ${color}, ${getLightColor(
|
||||||
|
color,
|
||||||
|
0.6
|
||||||
|
)})`
|
||||||
|
);
|
||||||
|
else els.setAttribute("style", `background-image:${color}`);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
const onMenuBarHighlightChange = () => {
|
||||||
|
nextTick(() => {
|
||||||
|
let els = document.querySelector(".el-menu-item.is-active");
|
||||||
|
let attr = "el-menu-item is-active";
|
||||||
|
if (state.isMenuBarColorHighlight)
|
||||||
|
els.setAttribute("class", `${attr} add-is-active`);
|
||||||
|
else els.setAttribute("class", `${attr}`);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
onBeforeMount(() => {
|
||||||
|
proxy.mittBus.on("onMenuClick", () => {
|
||||||
|
onMenuBarHighlightChange();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
onUnmounted(() => {
|
||||||
|
proxy.mittBus.off("onMenuClick", () => {});
|
||||||
|
});
|
||||||
return {
|
return {
|
||||||
openDrawer,
|
openDrawer,
|
||||||
closeDrawer,
|
closeDrawer,
|
||||||
onColorPickerChange,
|
onColorPickerChange,
|
||||||
onBgColorPickerChange,
|
onBgColorPickerChange,
|
||||||
|
onTopBarGradualChange,
|
||||||
|
onMenuBarGradualChange,
|
||||||
|
onMenuBarHighlightChange,
|
||||||
...toRefs(state),
|
...toRefs(state),
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
@ -312,7 +385,7 @@ export default {
|
|||||||
.layout-breadcrumb-seting-bar {
|
.layout-breadcrumb-seting-bar {
|
||||||
height: calc(100vh - 50px);
|
height: calc(100vh - 50px);
|
||||||
padding: 0 15px;
|
padding: 0 15px;
|
||||||
:deep .el-scrollbar__view {
|
::v-deep(.el-scrollbar__view) {
|
||||||
overflow-x: hidden !important;
|
overflow-x: hidden !important;
|
||||||
}
|
}
|
||||||
.layout-breadcrumb-seting-bar-flex {
|
.layout-breadcrumb-seting-bar-flex {
|
||||||
@ -351,15 +424,13 @@ export default {
|
|||||||
background-color: #e9eef3;
|
background-color: #e9eef3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.border-color-09f {
|
|
||||||
border: 1px solid var(--color-primary) !important;
|
|
||||||
}
|
|
||||||
.el-circular {
|
.el-circular {
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
.drawer-layout-active {
|
.drawer-layout-active {
|
||||||
@extend .border-color-09f;
|
border: 1px solid;
|
||||||
|
border-color: var(--color-primary);
|
||||||
}
|
}
|
||||||
.layout-tips-warp,
|
.layout-tips-warp,
|
||||||
.layout-tips-warp-active {
|
.layout-tips-warp-active {
|
||||||
@ -367,14 +438,16 @@ export default {
|
|||||||
left: 50%;
|
left: 50%;
|
||||||
top: 50%;
|
top: 50%;
|
||||||
transform: translate(-50%, -50%);
|
transform: translate(-50%, -50%);
|
||||||
border: 1px solid var(--color-primary-light-4);
|
border: 1px solid;
|
||||||
|
border-color: var(--color-primary-light-4);
|
||||||
border-radius: 100%;
|
border-radius: 100%;
|
||||||
padding: 4px;
|
padding: 4px;
|
||||||
.layout-tips-box {
|
.layout-tips-box {
|
||||||
width: 30px;
|
width: 30px;
|
||||||
height: 30px;
|
height: 30px;
|
||||||
z-index: 9;
|
z-index: 9;
|
||||||
border: 1px solid var(--color-primary-light-4);
|
border: 1px solid;
|
||||||
|
border-color: var(--color-primary-light-4);
|
||||||
border-radius: 100%;
|
border-radius: 100%;
|
||||||
.layout-tips-txt {
|
.layout-tips-txt {
|
||||||
position: relative;
|
position: relative;
|
||||||
@ -395,9 +468,11 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.layout-tips-warp-active {
|
.layout-tips-warp-active {
|
||||||
@extend .border-color-09f;
|
border: 1px solid;
|
||||||
|
border-color: var(--color-primary);
|
||||||
.layout-tips-box {
|
.layout-tips-box {
|
||||||
@extend .border-color-09f;
|
border: 1px solid;
|
||||||
|
border-color: var(--color-primary);
|
||||||
.layout-tips-txt {
|
.layout-tips-txt {
|
||||||
color: var(--color-primary) !important;
|
color: var(--color-primary) !important;
|
||||||
background-color: #e9eef3 !important;
|
background-color: #e9eef3 !important;
|
||||||
|
@ -70,7 +70,7 @@ export default {
|
|||||||
background: rgba(0, 0, 0, 0.04);
|
background: rgba(0, 0, 0, 0.04);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
:deep .el-dropdown {
|
::v-deep(.el-dropdown) {
|
||||||
color: var(--bg-topBarColor);
|
color: var(--bg-topBarColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-menu router :default-active="defaultActive" background-color="transparent">
|
<el-menu router :default-active="defaultActive" background-color="transparent" @select="onMenuClick">
|
||||||
<template v-for="val in menuList">
|
<template v-for="val in menuList">
|
||||||
<el-submenu :index="val.path" v-if="val.children && val.children.length > 0" :key="val.path">
|
<el-submenu :index="val.path" v-if="val.children && val.children.length > 0" :key="val.path">
|
||||||
<template #title>
|
<template #title>
|
||||||
@ -18,7 +18,13 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { toRefs, reactive, computed, defineComponent } from "vue";
|
import {
|
||||||
|
toRefs,
|
||||||
|
reactive,
|
||||||
|
computed,
|
||||||
|
defineComponent,
|
||||||
|
getCurrentInstance,
|
||||||
|
} from "vue";
|
||||||
import { useRoute, onBeforeRouteUpdate } from "vue-router";
|
import { useRoute, onBeforeRouteUpdate } from "vue-router";
|
||||||
import SubItem from "/@/views/layout/navMenu/subItem.vue";
|
import SubItem from "/@/views/layout/navMenu/subItem.vue";
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
@ -33,6 +39,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
setup(props) {
|
setup(props) {
|
||||||
|
const { proxy } = getCurrentInstance();
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const state = reactive({
|
const state = reactive({
|
||||||
defaultActive: route.path,
|
defaultActive: route.path,
|
||||||
@ -43,8 +50,12 @@ export default defineComponent({
|
|||||||
onBeforeRouteUpdate((to) => {
|
onBeforeRouteUpdate((to) => {
|
||||||
state.defaultActive = to.path;
|
state.defaultActive = to.path;
|
||||||
});
|
});
|
||||||
|
const onMenuClick = (index, path) => {
|
||||||
|
proxy.mittBus.emit("onMenuClick");
|
||||||
|
};
|
||||||
return {
|
return {
|
||||||
menuList,
|
menuList,
|
||||||
|
onMenuClick,
|
||||||
...toRefs(state),
|
...toRefs(state),
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
@ -74,7 +74,7 @@ export default {
|
|||||||
left: 50%;
|
left: 50%;
|
||||||
transform: translate(-50%, -50%) translate3d(0, 0, 0);
|
transform: translate(-50%, -50%) translate3d(0, 0, 0);
|
||||||
background-color: rgba(255, 255, 255, 0.95);
|
background-color: rgba(255, 255, 255, 0.95);
|
||||||
box-shadow: 0 2px 12px 0 var(--color-primary-light-1);
|
box-shadow: 0 2px 12px 0 var(--color-primary-light-7);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
transition: height 0.2s linear;
|
transition: height 0.2s linear;
|
||||||
height: 480px;
|
height: 480px;
|
||||||
|
Loading…
Reference in New Issue
Block a user