'admin-21.01.04:编写布局配置菜单/顶栏,添加事件总线mitt等'

This commit is contained in:
lyt 2021-01-04 18:56:38 +08:00
parent dd9544d7a5
commit e9f6aae01e
12 changed files with 129 additions and 26 deletions

View File

@ -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"

View File

@ -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()

View File

@ -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;

View File

@ -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 标签页
------------------------------- */ ------------------------------- */

View File

@ -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])

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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;

View File

@ -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);
} }
} }

View File

@ -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),
}; };
}, },

View File

@ -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;