bonus-ui/src/layout/components/Navbar.vue

1099 lines
36 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div>
<div class="navbar">
<div class="app-title">
<img
src="@/assets/images/logo-home.png"
style="width: 135px; height: 27px; cursor: pointer"
alt=""
@click="goHome"
/>
</div>
<div class="menus" @mouseleave="handleMenuLeave">
<div
v-for="(item, index) in menuList"
:key="index"
class="menu-item"
@mouseenter="handleMenuEnter(item)"
@click="handleMenuClick(item)"
>
<div class="menu-btn">
<span v-if="item.redirect == 'index' || item.redirect == 'index1'">
{{ item.children[0].meta.title }}
</span>
<span v-else-if="item.meta && item.meta.title">{{ item.meta.title }}</span>
<div class="tab-item-btn"></div>
</div>
</div>
</div>
<div class="right-menu">
<template v-if="device !== 'mobile'">
<search id="header-search" class="right-menu-item" />
<!-- <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> -->
<div class="right-menu-item hover-effect bar-item">
<img
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAEKADAAQAAAABAAAAEAAAAAA0VXHyAAABPUlEQVQ4EYWTvUoDQRSFHbezCmIZAhLs7PQJxM4U8TmsBEvbVCkCeYC8QwQrU2sjEiSNjaKkFFTQIoG4+c44F5ZlZrxw9sw95+7d+Vu3QZRleQTtA6eceANXzrmVz3hQcwmdg3dwhjeBvdHDjMXYF/zVDGsFC/IT7zP4qJnVtEnSrwqVsZoca2q56ORMvKdNm2aCGwnd5B01WFoW4Xu0u4hu0kBLuE5M8xm9ANvgIVIz9F1CwQC+AZOAEdy2zzBWk1tg0TfPnzvqFsIusHsw55w/rQi/YLwHDsAXmOLPYX8PuhR8W+vAK/gi+G3GWk49xgiF9uC17oRcTRpAy0nFqU6hpS9FQl4TpHy90vrvHqgoG2pQZirkZX01mCUa/KC/ZHy9NtMmHoJH8FvZKW1sVxWw7oAum34eC/2APflrp+zfNar0B+8AAAAASUVORK5CYII="
alt="提醒"
/>
</div>
<div class="right-menu-item hover-effect bar-item">
<img
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAEKADAAQAAAABAAAADwAAAADW5XGhAAAA5klEQVQoFe3TvQ7BUBTA8atFI2kwSHyEGCwGmzcwGCS8g0RisHgJs3fgCRgkBovdxGAyMROLwVD/c28HqRrEYnCSX3PuPacnTdurFOF5Xgw7nLFCFxGpSUju70lNeqQ3bqqmochGMOZs2L5ZsMi6pAeQTGUR0iBbQ19YWe6ZWExpy0Poaa+XLFviXXRkwFfxH6DUb7wDh+94w/WD7ym9FzhRLnf0UEEdVTTRwnMsWCyxxwZ96EMyIBlDnuKEI9bYwvzvSh3Ia2iggDKSGEGftgT/dQZyKi2kkNdFU8+xTsP2+11yV/IH7VrRz1OSP24AAAAASUVORK5CYII="
alt="提醒"
/>
</div>
<div class="right-menu-item hover-effect bar-item">
<span class="bar-text">收藏</span>
</div>
<!-- 代办 -->
<div class="right-menu-item hover-effect bar-item" @click="goTodo">
<span class="bar-text">待办</span>
</div>
<!-- 预警 -->
<el-popover
ref="warningPopover"
placement="bottom"
width="360"
trigger="hover"
popper-class="warning-popover"
>
<!-- 弹框内容 -->
<div class="warning-box">
<div class="warning-title">预告警列表</div>
<div
v-for="(item, index) in warningList"
:key="index"
class="warning-item"
@click="goWarningDetail(item)"
>
<div class="warning-icon">
<img
src="data:image/png;base64,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"
alt="提醒"
/>
</div>
<div class="warning-content">
<div class="warning-main">{{ item.title }}</div>
<el-tooltip :content="item.desc" placement="top" effect="dark">
<div class="warning-sub">
{{ item.desc }}
</div>
</el-tooltip>
</div>
</div>
<div class="warning-footer" @click="goWarning"> 查看全部 </div>
</div>
<!-- 触发元素 -->
<div slot="reference" class="right-menu-item hover-effect bar-item" @click="goWarning">
<el-badge :value="warningCount" :max="99" class="badge" type="danger">
<span class="bar-text">预警</span>
</el-badge>
</div>
</el-popover>
<!-- 消息 -->
<el-popover
ref="messagePopover"
placement="bottom"
width="360"
trigger="hover"
popper-class="warning-popover"
>
<!-- 弹框内容(复用预警所有样式类) -->
<div class="warning-box">
<div class="warning-title">消息列表</div>
<div
v-for="(item, index) in messageList"
:key="index"
class="warning-item"
@click="goMessageDetail(item)"
>
<div class="warning-icon">
<img
src="data:image/png;base64,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"
alt="提醒"
/>
</div>
<div class="warning-content">
<div class="warning-main">{{ item.title }}</div>
<el-tooltip :content="item.desc" placement="top" effect="dark">
<div class="warning-sub">
{{ item.desc }}
</div>
</el-tooltip>
</div>
</div>
<div class="warning-footer" @click="goMessage"> 查看全部 </div>
</div>
<!-- 触发元素(结构与预警一致) -->
<div slot="reference" class="right-menu-item hover-effect bar-item" @click="goMessage">
<el-badge :value="messageCount" :max="99" class="badge" type="info">
<span class="bar-text">消息</span>
</el-badge>
</div>
</el-popover>
</template>
<!-- <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">-->
<!-- <div>-->
<!-- <img :src="avatar" class="user-avatar" />-->
<!-- <span class="nick-name">{{ user.nickName }}</span>-->
<!-- <i class="el-icon-arrow-down" style="color: #fff"></i>-->
<!-- </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>-->
<!-- 用户信息悬浮卡片 -->
<el-popover placement="bottom-end" width="260" trigger="hover" popper-class="user-popover">
<!-- 弹框内容 -->
<!-- 顶部蓝色区域 -->
<div class="user-bg">
<div class="user-header">
<div class="user-name">{{ user.nickName }}</div>
<div class="user-role">
<i aria-label="用户"></i>
{{ dept.deptName }}
</div>
<div class="user-role">{{ roles.length > 0 ? roles[0].roleName : '' }}</div>
</div>
</div>
<!-- 列表区域 -->
<div class="user-list">
<div class="user-item">
<i class="el-icon-mobile-phone" style="font-size: 19px; color: #000"></i>
<span>手机号</span>
<span class="right">138****8251</span>
</div>
<div class="user-item">
<i class="el-icon-lock" style="font-size: 19px; color: #000"></i>
<span>修改密码</span>
</div>
<div class="user-item">
<i class="el-icon-house" style="font-size: 19px; color: #000"></i>
<span>设置默认首页</span>
</div>
<div class="user-item" @click="downloadUserManual">
<i class="el-icon-download" style="font-size: 19px; color: #000"></i>
<span>操作手册下载</span>
</div>
<div class="user-item">
<i class="el-icon-t-shirt" style="font-size: 19px; color: #000"></i>
<span>一键换肤</span>
</div>
<div class="user-item" @click="clearCacheSimple">
<i class="el-icon-delete" style="font-size: 19px; color: #000"></i>
<span>清除缓存</span>
</div>
<div class="user-item">
<i class="el-icon-data-analysis" style="font-size: 19px; color: #000"></i>
<span>测试网络速度</span>
</div>
<div class="user-item" @click="gotoFeedback">
<i class="el-icon-edit-outline" style="font-size: 19px; color: #000"></i>
<span>意见反馈/闭环</span>
</div>
<div class="user-item" @click="showContactDialog">
<i class="el-icon-phone-outline" style="font-size: 19px; color: #000"></i>
<span>联系我们</span>
</div>
<div class="user-item logout" @click="logout">
<!-- <i class="el-icon-refresh-left" style="font-size: 19px; color: #000;"></i> -->
<img
src="../../assets/images/loginOutIcon.png"
style="width: 16px; height: 16px; margin-right: 10px"
alt=""
/>
<span>退出</span>
</div>
</div>
<!-- 底部 -->
<div class="user-footer">
软件名称:机械化施工装备管理(共享)平台<br />
版本号V1.0.4
</div>
<!-- 触发区域(右上角头像+名字) -->
<div slot="reference" class="avatar-container right-menu-item hover-effect">
<img :src="avatar" class="user-avatar" />
<span class="nick-name">{{ user.nickName }}</span>
<i class="el-icon-arrow-down" style="color: #fff"></i>
</div>
</el-popover>
</div>
</div>
<div style="height: 50px"></div>
<div class="menu-box" v-show="showMenuBox" @mouseenter="handleBoxEnter">
<div class="menu-warp" @mouseleave="handleBoxLeave">
<div class="menu-list">
<div class="list-box" v-for="(item, i) in currentMenu.children || []" :key="i" v-if="!item.hidden">
<div class="menu-title-top" v-if="currentMenu && currentMenu.meta">
<div class="title-tip"></div>
<span class="title-text">{{ item.meta.title }}</span>
</div>
<!-- <div v-for="(child, i) in currentMenu.children || []" :key="i" class="sub-menu-item" v-if="!child.hidden"> -->
<div class="sub-menu-item" v-for="(child, i) in item.children" :key="i" v-if="!child.hidden">
<div v-if="child.children && child.children.length">
<div class="menu-title" @click="toggleLevel1(child)">
<div class="children-title-tip"></div>
<span>
<span style="margin-right: 5px">{{ child.meta.title }}</span>
<img
v-if="openLevel1.includes(child.path)"
src="@/assets/images/up.png"
style="width: 14px; height: 14px"
/>
<img v-else src="@/assets/images/down.png" style="width: 14px; height: 14px" />
</span>
<span class="menu-star" v-if="!child.children.length">
<img src="@/assets/images/star.png" style="width: 10px; height: 9px" />
</span>
</div>
<div v-show="openLevel1.includes(child.path)">
<div v-for="(c2, j) in child.children" :key="j" class="sub-menu-item" v-if="!c2.hidden">
<div v-if="c2.children && c2.children.length">
<div class="menu-title" @click="toggleLevel2(c2)">
{{ c2.meta.title }}
<img
v-if="openLevel2.includes(c2.path)"
src="@/assets/images/up.png"
style="width: 12px; height: 12px; margin-left: 6px"
/>
<img
v-else
src="@/assets/images/down.png"
style="width: 12px; height: 12px; margin-left: 6px"
/>
</div>
<div v-show="openLevel2.includes(c2.path)">
<div
v-for="(c3, k) in c2.children"
:key="k"
class="sub-menu-item"
v-if="!c3.hidden"
@click="goRoute(c3)"
>
{{ c3.meta.title }}
</div>
</div>
</div>
<div v-else class="menu-title" @click="goRoute(c2)">
<span class="child-left">- {{ c2.meta.title }}</span>
<span class="menu-star">
<img src="@/assets/images/star.png" style="width: 10px; height: 9px" />
</span>
</div>
</div>
</div>
</div>
<div v-else class="menu-title" @click="goRoute(child)">
<div class="children-title-tip"></div>
<span>{{ child.meta.title }}</span>
<span class="menu-star">
<img src="@/assets/images/star.png" style="width: 10px; height: 9px" />
</span>
</div>
</div>
</div>
</div>
</div>
</div>
<el-dialog
:visible.sync="contactDialogVisible"
width="400px"
center
:append-to-body="true"
custom-class="contact-dialog"
:show-header="false"
>
<div class="contact-content">
<!-- 外层Flex容器实现图标+标题同行 -->
<div class="contact-title-wrap">
<div class="contact-icon">
<i class="el-icon-warning"></i>
</div>
<div class="contact-title">联系我们</div>
</div>
<!-- 联系电话单独一行 -->
<div class="contact-phone">联系电话:{{ contactPhone }}</div>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="contactDialogVisible = false">取消</el-button>
<el-button type="primary" @click="handleContactConfirm">确定</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
import Search from '@/components/HeaderSearch'
import { getUserProfile } from '@/api/system/user'
export default {
components: { Search },
data() {
return {
title: process.env.VUE_APP_TITLE,
user: {},
dept: {},
roles: [],
menuList: [],
showMenuBox: false,
currentMenu: {},
openLevel1: [],
openLevel2: [],
todoCount: 5,
warningCount: 2,
messageCount: 12,
warningList: [
{
id: 1,
title: '达标投产复检预警',
desc: '您所管理的今天明天后天工程已超期',
},
{
id: 2,
title: '达标投产复检预警',
desc: '红红火火恍恍惚惚好工程已超期',
},
{
id: 3,
title: '达标投产复检预警',
desc: '红红火火恍恍惚惚好新建工程',
},
],
// 消息列表数据
messageList: [
{
id: 1,
title: '系统通知',
desc: '您的账号于2026-01-25 10:00完成登录请注意账号安全',
},
{
id: 2,
title: '业务提醒',
desc: '手塘-北三110kV工程已完成验收可前往查看报告',
},
{
id: 3,
title: '待办提醒',
desc: '您有5条待办事项未处理预计截止时间2026-01-30',
},
],
contactDialogVisible: false, // 控制联系我们弹窗显示
contactPhone: '田经理15212781264刘经理19855530627', // 联系电话
}
},
computed: {
...mapGetters(['sidebarRouters', 'avatar', 'device']),
setting: {
get() {
return this.$store.state.settings.showSettings
},
set(val) {
this.$store.dispatch('settings/changeSetting', {
key: 'showSettings',
value: val,
})
},
},
},
created() {
this.getUser()
this.menuList = this.sidebarRouters.filter((route) => !route.hidden && route.path !== '/')
this.menuList = this.menuList.slice(1)
console.log('🚀 ~ this.menuList:', this.menuList)
},
methods: {
goHome() {
this.$router.push({ path: '/' })
},
goWarningDetail(item) {
this.$refs.warningPopover.doClose() // 关闭弹窗
// this.$router.push({ path: '/warning/detail', query: { id: item.id } });
},
// 预警触发元素/查看全部点击-跳转到预警列表页
goWarning() {
this.$refs.warningPopover.doClose()
// this.$router.push({ path: '/warning/list' });
},
// 待办点击-跳转到待办页面
goTodo() {
// this.$router.push({ path: '/todo' }) // 替换为实际的待办页路由
},
goMessageDetail(item) {
this.$refs.messagePopover.doClose() // 关闭消息弹窗
// this.$router.push({ path: '/message/detail', query: { id: item.id } }); // 跳消息详情
},
goMessage() {
this.$refs.messagePopover.doClose() // 关闭消息弹窗
// this.$router.push({ path: '/message' }); // 跳消息列表
},
gotoFeedback() {
this.$router.push({ path: '/feedback' })
},
getUser() {
getUserProfile().then((response) => {
console.log('用户信息', response.data)
this.user = response.data
this.dept = response.data.dept
this.roles = response.data.roles
})
},
downloadUserManual() {
this.download('material-mall/todo/downLoadUserManual', {}, `机械化施工装备管理共享平台操作手册V1.0.pdf`)
},
clearCacheSimple() {
// 清除本地存储
localStorage.clear()
sessionStorage.clear()
this.$message.success('缓存清除成功!')
setTimeout(() => location.reload(), 1000)
},
showContactDialog() {
this.contactDialogVisible = true
},
handleContactConfirm() {
this.contactDialogVisible = false
},
async logout() {
this.$store.dispatch('LogOut').then((res) => {
this.$store.dispatch('tagsView/delAllViews')
if (process.env.VUE_APP_BASE_API == '/iws/jxhzb-api') {
window.location.href = 'http://sgwpdm.ah.sgcc.com.cn/iws'
} else {
this.$router.push({ path: '/login' })
}
})
},
handleMenuClick(item) {
if (item.redirect == 'index' || item.redirect == 'index1') {
this.$router.push({ path: '/' + item.redirect })
}
},
handleMenuEnter(item) {
if (item.redirect == 'index' || item.redirect == 'index1') {
this.showMenuBox = false
return
}
this.showMenuBox = true
const buildPath = (nodes, parentPath = '') => {
return nodes.map((n) => {
let currentPath = n.path || ''
if (!currentPath.startsWith('/')) {
currentPath = parentPath.replace(/\/$/, '') + '/' + currentPath
}
const newNode = { ...n, fullPath: currentPath }
if (n.children && n.children.length) {
newNode.children = buildPath(n.children, currentPath)
}
return newNode
})
}
const children = buildPath(item.children || [], item.path)
this.currentMenu = {
...item,
fullPath: item.path,
children,
}
const level1 = []
const level2 = []
children.forEach((item) => {
if (item.children && item.children.length) {
// 👉 child 这一层(控制 openLevel1
item.children.forEach((child) => {
if (child.children && child.children.length) {
level1.push(child.path)
// 👉 c2 这一层(控制 openLevel2
child.children.forEach((c2) => {
if (c2.children && c2.children.length) {
level2.push(c2.path)
}
})
}
})
}
})
this.openLevel1 = level1
this.openLevel2 = level2
},
handleMenuLeave() {
this.showMenuBox = false
},
handleBoxEnter() {
this.showMenuBox = true
},
handleBoxLeave() {
this.showMenuBox = false
},
goRoute(route) {
if (route.fullPath) {
this.$router.push({ path: route.fullPath, query: route.query })
this.showMenuBox = false
}
},
toggleLevel1(item) {
const idx = this.openLevel1.indexOf(item.path)
if (idx > -1) this.openLevel1.splice(idx, 1)
else this.openLevel1.push(item.path)
},
toggleLevel2(item) {
const idx = this.openLevel2.indexOf(item.path)
if (idx > -1) this.openLevel2.splice(idx, 1)
else this.openLevel2.push(item.path)
},
},
}
</script>
<style lang="scss" scoped>
.navbar {
width: 100%;
height: 50px;
overflow: hidden;
position: fixed;
display: flex;
align-items: center;
justify-content: space-between;
// background: #fff;
// background-image: url('../../assets/images/titleGif.gif');
// background-size: cover;
// background-repeat: no-repeat;
// background-position: center;
box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
background: linear-gradient(90deg, #00d2be 0%, #4eacff 100%);
z-index: 10;
font-family: -apple-system, BlinkMacSystemFont, Segoe UI, PingFang SC, Hiragino Sans GB, Microsoft YaHei,
Helvetica Neue, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;
.app-title {
width: 314px;
height: 50px;
padding-left: 30px;
font-weight: bold;
font-size: 20px;
color: #fff;
text-align: center;
display: flex;
align-items: center;
}
.menus {
min-width: 698px;
height: 50px;
line-height: 50px;
flex: 1;
gap: 30px;
display: flex;
align-items: center;
justify-content: center;
// margin: 0 20px;
.menu-item {
height: 50px;
cursor: pointer;
// font-family: Microsoft YaHei, Microsoft YaHei;
font-weight: 600;
font-size: 18px;
color: #ffffff;
text-align: center;
font-style: normal;
text-transform: none;
.menu-btn {
width: 100%;
text-align: center;
}
// 移入下方横条
&:hover {
.tab-item-btn {
margin: 5px auto 0;
width: 15px;
height: 2px;
margin-top: -8px;
background: #fff;
}
}
}
}
.hamburger-container {
line-height: 46px;
height: 100%;
float: left;
cursor: pointer;
transition: background 0.3s;
-webkit-tap-highlight-color: transparent;
&:hover {
background: rgba(0, 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: #bfbfbf; /* 纯黑色,比#262626更黑 */
vertical-align: text-bottom;
&.hover-effect {
cursor: pointer;
transition: background 0.3s;
&:hover {
background: rgba(0, 0, 0, 0.025);
}
}
}
.avatar-container {
margin-right: 16px;
.user-avatar {
cursor: pointer;
width: 18px;
height: 18px;
vertical-align: text-bottom;
color: #262626;
/* 移除了opacity属性使用color属性实现颜色调整 */
}
.nick-name {
margin: 0 3px;
// font-family: Microsoft YaHei, Microsoft YaHei;
font-weight: 400;
font-size: 14px;
color: #ffffff;
text-align: center;
font-style: normal;
text-transform: none;
}
}
}
}
.menu-box {
position: absolute;
z-index: 99999999;
width: 100%;
height: calc(100% - 50px);
// background: linear-gradient(90deg, #00d2be 0%, #4eacff 100%);
// 蒙层
background: rgba(0, 0, 0, 0.5);
.menu-warp {
width: 100%;
background: linear-gradient(90deg, #00d2be 0%, #4eacff 100%);
border-radius: 0 0 16px 16px;
}
.menu-list {
padding: 16px 20px;
width: 100%;
min-height: 287px;
background: #f8fdfc;
border-radius: 16px;
display: grid;
/* 关键:一行 6 等分,自动沾满容器 */
grid-template-columns: repeat(6, 1fr);
/* 横向 & 纵向间距完全一致 */
column-gap: 16px;
row-gap: 16px;
.list-box {
/* Grid 下不需要再算宽度 */
width: 100%;
min-width: 0;
padding: 16px;
height: 100%;
background: linear-gradient(180deg, #e6ffff, rgba(233, 255, 255, 0) 90px);
border-radius: 12px;
}
}
.menu-title-top {
width: 100%;
display: flex;
align-items: center;
span {
color: #095a4d;
font-weight: 800;
}
}
.menu-title {
width: 100%;
display: flex;
align-items: center;
cursor: pointer;
// 移入效果
&:hover {
color: #2cbab2;
background: rgba(44, 186, 178, 0.1);
border-radius: 4px;
}
}
.menu-star {
padding-right: 5px;
flex: 1;
display: flex;
justify-content: flex-end;
align-items: center;
opacity: 0; // 默认不显示
transition: opacity 0.2s;
}
/* hover 当前行时,显示星标 */
.menu-title:hover .menu-star {
opacity: 1;
}
.title-tip {
margin-right: 4px;
width: 8px;
height: 16px;
line-height: 24px;
background: #2cbab2;
margin-bottom: 20px;
border-radius: 4px 4px 4px 4px;
}
.title-text {
font-size: 18px;
// color: #0f7969;
line-height: 24px;
font-weight: 700;
margin-bottom: 20px;
}
.children-title-tip {
margin-right: 4px;
width: 8px;
height: 8px;
background: #2cbab2;
border-radius: 50%;
}
.child-left {
// 与父节点左边距2个字符
margin-left: 1rem;
}
}
/* 只改“下一级里的”二级、三级颜色 */
.menu-box {
/* 二级child.children 里面的 menu-title */
.sub-menu-item {
.sub-menu-item {
> .menu-title {
color: #333;
}
/* 三级:最里面的 sub-menu-item */
.sub-menu-item {
color: #333;
}
}
}
}
.right-menu {
.bar-item {
display: inline-flex;
align-items: center;
color: #fff;
cursor: pointer;
i {
font-size: 18px;
color: #fff;
}
.bar-text {
margin-left: 3px;
font-size: 15px;
color: #fff;
font-weight: bold;
}
.badge {
line-height: 1;
margin-bottom: 4px;
}
}
}
.warning-popover {
padding: 0;
}
.warning-box {
width: 100%;
font-size: 14px;
}
.warning-title {
font-size: 18px;
font-weight: 700;
color: #333;
height: 38px;
}
.warning-item {
display: flex;
padding: 10px 12px;
cursor: pointer;
transition: all 0.2s;
border-bottom: 1.5px solid #e1e1e1;
&:hover {
background: #f5f7fa;
}
}
.warning-icon {
margin-right: 8px;
}
.warning-content {
flex: 1;
min-width: 0;
}
.warning-main {
font-size: 16px;
color: #333;
}
.warning-sub {
font-size: 12px;
color: #666666;
margin-top: 4px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.warning-footer {
text-align: center;
padding: 8px;
color: #50c7bd;
cursor: pointer;
&:hover {
background: #f5f7fa;
}
}
/* -------用户------- */
.user-popover {
color: #000;
font-size: 12px;
background-color: #fff;
width: 250px;
border-radius: 12px;
border: 1px solid #e1e1e1;
padding: 10px;
}
//.user-card {
// width: 260px;
// overflow: hidden;
// font-family: Microsoft YaHei;
//}
.user-bg {
border-radius: 15px;
//height: 140px;
background-color: #34c3ac;
background-image: linear-gradient(270deg, #4eacff, #00d2be);
}
/* 顶部渐变 */
.user-header {
background-image: url('../../assets/images/user-bg.png');
padding: 15px;
color: #fff;
background-size: 100% 100%;
}
.user-name {
font-size: 20px;
}
.user-role {
padding: 5px 0;
font-size: 12px;
margin-top: 4px;
opacity: 0.9;
}
/* 列表 */
.user-list {
background: #fff;
}
.user-item {
display: flex;
align-items: center;
padding: 15px 14px;
font-size: 12px;
color: #000;
cursor: pointer;
border-bottom: 1px solid #eee;
font-weight: 500;
i {
margin-right: 8px;
color: #666;
}
.right {
margin-left: auto;
color: #999;
}
&:hover {
background: #f5f7fa;
}
}
/* 底部 */
.user-footer {
font-size: 12px;
color: #999;
padding: 10px 14px;
background: #fafafa;
line-height: 18px;
}
/* 联系我们弹窗样式 - 修复同行显示+样式优化 */
.contact-dialog {
.el-dialog__body {
padding: 20px 10px 10px;
text-align: center;
margin: 0; /* 清除默认边距,避免居中偏移 */
}
.contact-content {
// 整体内容居中
display: flex;
flex-direction: column;
gap: 16px; /* 标题行与电话行的间距 */
// 图标+标题 同行容器
.contact-title-wrap {
display: flex;
gap: 8px; // 图标与文字的间距,可根据需要调整
}
.contact-icon {
font-size: 24px;
color: #f5a623; // 黄色感叹号,匹配截图
line-height: 1; // 清除行高,避免垂直偏移
}
.contact-title {
display: block;
overflow: hidden;
color: rgba(0, 0, 0, 0.85);
font-weight: 500;
font-size: 16px;
line-height: 1.4;
}
.contact-phone {
margin-left: 34px;
color: rgba(0, 0, 0, 0.65);
font-size: 14px;
}
}
.dialog-footer {
padding-top: 15px;
text-align: right;
border-top: 1px solid #e6e6e6;
margin: 0; // 清除默认边距
.el-button {
width: 80px; // 按钮统一宽度,美观
margin: 0 4px; // 按钮之间的小间距
}
}
// 可选:添加弹框圆角+轻微阴影,更贴近截图视觉效果
.el-dialog__wrapper .el-dialog {
border-radius: 12px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
}
</style>