<template> <div id="main" class="header-bar"> <header> <ul class="nav"> <!-- <div class="logo">ByteSailing</div> --> <div class="logo" style="display: flex; align-items: center; justify-content: center"> <img v-if="!logoUrl" :src="'/img/logo2.png'"/> <el-image v-else style="width: 120px; height: 30px" :src="logoUrl" fit="scale-down"/> </div> <li class="header-bar-hover-warp nav-li" :class="isChildMenu ? 'active' : ''"> <div @click="isChildMenu = !isChildMenu" class="menu-modal"> <i class="iconfont icon-icomx_gongndh" style="margin: 0 5px 0 0;"></i> 功能导览 <i class="iconfont icon-iconm_xialan1" style="margin: 0 0 0 3px;"></i> </div> </li> <div class="auto-list"> <li class="nav-li" @click="commonsBannerToRouter(i)" v-for="(i, index) in commonsRouterList" v-show="index < autoListChidrenNum - 1" :key="i.id"> <span>{{ i.menuName }}</span> </li> <li class="nav-li more-box" v-show="commonsRouterList.length > autoListChidrenNum - 1"> 更多 <i class="iconfont icon-iconm_xialan1"></i> <ul class="more-list"> <li v-for="(i, index) in commonsRouterList" v-show="index >= autoListChidrenNum - 1" :key="i.id"> <span @click="commonsBannerToRouter(i)">{{ i.menuName }}</span> </li> </ul> </li> </div> <div class="header-bar-warp" v-if="isChildMenu" @click.stop="isChildMenu = false"> <div class="header-bar-hover" @click.stop> <div class="header-bar-hover-content"> <div class="left-banner"> <div class="first-order" @click="leftBanerType = 2"> <el-icon size="16" color="#0084FF"> <edit /> </el-icon> 常用功能 </div> <div class="first-order"> <el-icon size="16" color="#0084FF"> <edit /> </el-icon> 功能菜单 </div> <ul> <li @click="openLeftBaner(i,index)" v-for="(i,index) in sidebarRoutersCopy" :key="i.name" v-show="i.type == 1 && i.status == '0'">{{ i.menuName }}</li> </ul> <!-- <div class="first-order"> <el-icon size="16" color="#0084FF"> <edit /> </el-icon> 推荐服务 </div> --> </div> <div class="menu-warp" v-show="leftBanerType == 1"> <div class="first-order-title">{{ activeLeftData.menuName }}</div> <!-- <ul class="second-level" v-for="i in activeLeftData.children" :key="i.menuId"> <li class="menu-title"> {{ i.menuName }} </li> <div v-for="(j, index) in i.children" :key="index"> <li v-if="i.isNone" class="menu-ul" style="cursor: auto"></li> <li class="menu-ul" @click="routerPush(i,j)" style="cursor: pointer"> {{ j.menuName }} </li> </div> </ul> --> <ul class="second-level"> <div v-for="(i, index) in activeLeftData" :key="index"> <li v-if="i.isNone" class="menu-ul" style="cursor: auto"></li> <li class="menu-title" v-else-if="i.isTitle"> {{ i.menuName }} </li> <li v-else class="menu-ul" @click="commonsBannerToRouter(i)" style="cursor: pointer"> {{ i.menuName }} </li> </div> </ul> </div> <div class="menu-warp" v-show="leftBanerType == 2"> <div class="first-order-title">常用功能</div> <div class="commons-warp"> <div> <div class="header-button-box cp" v-for="(i,index) in commonsRouterList" :key="i.name" @click="commonsBannerToRouter(i)"> <span>{{ i.menuName }}</span> <div class="right-icon" @click.stop="deleteCommonsRouter(i,index)"> <!-- <el-icon color="#46A6FF"><CirclePlus /></el-icon> --> <el-icon color="#BBBBBB" v-show="isEidtType"> <Close /> </el-icon> </div> </div> <div class="header-add-button-box" v-if="!isEidtType" @click="isEidtType = true"> <el-icon color="#46A6FF"> <CirclePlus /> </el-icon> 编辑功能 </div> </div> </div> <div class="first-order-title" v-if="isEidtType">待添加功能</div> <div class="all-menu-warp" v-if="isEidtType"> <div v-for="(i, index) in sidebarRoutersCopy" :key="i.name" v-show="i.type === 1"> <div class="all-menu-title" v-for="(j, jindex) in i.children" :key="j.name"> <div class="title"> {{ j.menuName }} </div> <div class="all-menu-lists"> <div class="header-button-box" v-for="(n, nindex) in j.children" v-show="n.visible == '0'" :key="n.name"> <span>{{ n.menuName }}</span> <div class="right-icon" @click="addCommonsRouter(index, jindex, nindex, n)"> <el-icon color="#46A6FF"> <CirclePlus /> </el-icon> </div> </div> </div> </div> </div> </div> <div class="btn-warp" v-if="isEidtType"> <el-button type="" @click="isEidtType = false">取消</el-button> <el-button type="primary" @click="userMenuEdit">保存</el-button> </div> </div> </div> </div> </div> </ul> <div class="fr"> <!-- <el-input class="input-search" placeholder="请输入关键词" suffix-icon="el-icon-search" size="mini" v-model="input1"> </el-input> <el-dropdown class="dropdown-box"> <span class="el-dropdown-link"> 中文<i class="el-icon-arrow-down el-icon--right"></i> </span> <el-dropdown-menu slot="dropdown"> <el-dropdown-item>English</el-dropdown-item> <el-dropdown-item>中文</el-dropdown-item> </el-dropdown-menu> </el-dropdown> --> <el-badge :value="12" class="badge"> <el-icon :size="20"> <BellFilled /> </el-icon> </el-badge> <el-dropdown @command="handleCommand" class="right-menu-item hover-effect" trigger="click"> <div class="dropdown-box"> {{ userData }} </div> <template #dropdown> <el-dropdown-menu> <router-link to="/user/profile"> <el-dropdown-item>个人中心</el-dropdown-item> </router-link> <el-dropdown-item command="setLayout"> <span>布局设置</span> </el-dropdown-item> <el-dropdown-item divided command="logout"> <span>退出登录</span> </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </header> </div> </template> <script setup> import Cookies from 'js-cookie' import { ElMessageBox, ElNotification, ElMessage } from 'element-plus' import useUserStore from '@/store/modules/user' import '@/components/headerBar/header.scss' const router = useRouter() const userStore = useUserStore() const { proxy } = getCurrentInstance() const sidebarRouters = ref([]) const sidebarRoutersCopy = ref([]) const isChildMenu = ref(false) const autoListChidrenNum = ref(0) const isEidtType = ref(false) const leftBanerType = ref(2) const userData = ref(Cookies.get('nickName') || '') const commonsRouterList = ref([]) const activeLeftData = ref({}) const openLeftBaner = (i,index) => { leftBanerType.value = 1 activeLeftData.value = i routerInit(i) } const logoUrl = ref() const getLogo = () => { proxy.post('/tenantInfo/getLogo',{}).then( res => { if (res && res.length > 0 && res[0].fileUrl) { logoUrl.value = res[0].fileUrl } } ) } getLogo() const userMenuEdit = () => { proxy.post('/sysUserMenu/edit',{ type:1, menuIdList:commonsRouterList.value.map(item=>item.menuId) }).then(res=>{ ElMessage({ message: '保存成功', type: 'success', }) isEidtType.value = false }) } const deleteCommonsRouter = (i,index) => { commonsRouterList.value.splice(index, 1) } const addCommonsRouter = (index, jindex, nindex, n) => { for (let i = 0; i < commonsRouterList.value.length; i++) { const element = commonsRouterList.value[i]; if(element.menuId === n.menuId){ ElMessage({ message: '此目录已添加', type: 'error', }) return } } if (n.hidden) { ElMessage({ message: '此目录需要额外参数,暂不支持添加', type: 'error', }) return } commonsRouterList.value.push(n) sidebarRoutersCopy.value[index].children[jindex].children[nindex].isCommonsBanner = true } const routerInit = (item) => { //二维转一维 const arr = [] for (let i = 0; i < item.children.length; i++) { const element = item.children[i] if (element.type === 1) { element.isTitle = true arr.push(element) } if (element.children && element.children.length > 0) { for (let j = 0; j < element.children.length; j++) { const jelement = element.children[j] jelement.isTitle = false if (jelement.type === 1) { arr.push({ ...jelement, fatherPath: element.path }) } } } } //添加剩余子元素,补齐一列 for (let i = 0; i < arr.length; i++) { const element = arr[i] if (element.isTitle) { //判断余数加上子项列会不会爆掉 if ( element.children && element.children.length > 0 && ((i) % 11) + element.children.length + 1 > 11 && element.children.length < 11 ) { let num = 11 - ((i) % 11) for (let j = 0; j < num; j++) { arr.splice(i, 0, { ...element, isNone: true }) i++ } } } } activeLeftData.value = arr } function handleCommand(command) { switch (command) { case 'setLayout': setLayout() break case 'logout': logout() break default: break } } function logout() { ElMessageBox.confirm('确定注销并退出系统吗?', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning', }) .then(() => { userStore.logOut().then(() => { location.href = '/index' }) }) .catch(() => { }) } //使用id计算拼接url const commonsBannerToRouter = (i) => { sidebarRoutersCopy.value.map(item => { if(item.children) { item.children.map(j => { if(j.children){ j.children.map(n => { if(n.menuId === i.menuId){ router.push('/' + item.path + '/' + j.path + '/' + n.path) isChildMenu.value = false } }) } }) } }) } //获取浏览器宽度 function getBrowserWidth() { return document.documentElement.clientWidth } //计算auto-list 能放下几个 function calcAutoListChidren() { autoListChidrenNum.value = Math.floor((getBrowserWidth() - 390) / 120) } //一维数组转tree onMounted(() => { calcAutoListChidren() window.addEventListener('resize', calcAutoListChidren); proxy.get('/getInfo').then(res => { userData.value = res.user.nickName }) proxy.get('/system/menu/list').then(res => { res.data = res.data.map(item => { return { ...item, isCommonsBanner: false, } }) sidebarRoutersCopy.value = proxy.handleTree(res.data, "menuId") //循环删除 i.status != 0 || i.visible != 0 的元素 sidebarRoutersCopy.value.map(item => { if(item.children) { item.children.map(j => { if(j.children){ j.children.map(n => { if(n.status != 0 || n.visible != 0 || n.type != 1){ j.children.splice(j.children.indexOf(n),1) } }) } }) } }) }) proxy.post('/sysUserMenu/list',{type:1}).then(res => { commonsRouterList.value = res }) }) </script> <style lang="scss"></style>