| | |
| | | <div class="navbar"> |
| | | <hamburger id="hamburger-container" :is-active="appStore.sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" /> |
| | | <breadcrumb v-if="!settingsStore.topNav" id="breadcrumb-container" class="breadcrumb-container" /> |
| | | <top-nav v-if="settingsStore.topNav" id="topmenu-container" class="topmenu-container" /> |
| | | |
| | | <!-- <div v-if="sidebar.hide">--> |
| | | <!-- <top-nav id="topmenu-container" class="topmenu-container" />--> |
| | | <!-- </div>--> |
| | | <!-- <div class="logo" v-if="!sidebar.hide">--> |
| | | <!-- <img src="@/assets/logo/logo.png" alt=""/>--> |
| | | <!-- </div>--> |
| | | <div class="right-menu"> |
| | | <template v-if="appStore.device !== 'mobile'"> |
| | | <header-search id="header-search" class="right-menu-item" /> |
| | | |
| | | <el-tooltip content="源码地址" effect="dark" placement="bottom"> |
| | | <ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" /> |
| | | </el-tooltip> |
| | | |
| | | <el-tooltip content="文档地址" effect="dark" placement="bottom"> |
| | | <ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" /> |
| | | </el-tooltip> |
| | | |
| | | <screenfull id="screenfull" class="right-menu-item hover-effect" /> |
| | | |
| | | <el-tooltip content="主题模式" effect="dark" placement="bottom"> |
| | | <div class="right-menu-item hover-effect theme-switch-wrapper" @click="toggleTheme"> |
| | | <svg-icon v-if="settingsStore.isDark" icon-class="sunny" /> |
| | | <svg-icon v-if="!settingsStore.isDark" icon-class="moon" /> |
| | | </div> |
| | | </el-tooltip> |
| | | |
| | | <el-tooltip content="布局大小" effect="dark" placement="bottom"> |
| | | <size-select id="size-select" class="right-menu-item hover-effect" /> |
| | | </el-tooltip> |
| | | </template> |
| | | |
| | | <el-dropdown @command="handleCommand" class="avatar-container right-menu-item hover-effect" trigger="hover"> |
| | | <div class="avatar-wrapper"> |
| | | <img :src="userStore.avatar" class="user-avatar" /> |
| | |
| | | <router-link to="/user/profile"> |
| | | <el-dropdown-item>个人中心</el-dropdown-item> |
| | | </router-link> |
| | | <el-dropdown-item command="setLayout" v-if="settingsStore.showSettings"> |
| | | <span>布局设置</span> |
| | | </el-dropdown-item> |
| | | <el-dropdown-item divided command="logout"> |
| | | <span>退出登录</span> |
| | | </el-dropdown-item> |
| | | </el-dropdown-menu> |
| | | </template> |
| | | </el-dropdown> |
| | | <div class="right-menu-item hover-effect setting" @click="setLayout" v-if="settingsStore.showSettings"> |
| | | <svg-icon icon-class="more-up" /> |
| | | </div> |
| | | <!-- <div class="right-menu-item hover-effect setting" @click="setLayout" v-if="settingsStore.showSettings">--> |
| | | <!-- <svg-icon icon-class="more-up" />--> |
| | | <!-- </div>--> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import {useWindowSize} from '@vueuse/core' |
| | | import { ElMessageBox } from 'element-plus' |
| | | import Breadcrumb from '@/components/Breadcrumb' |
| | | import TopNav from '@/components/TopNav' |
| | |
| | | import useAppStore from '@/store/modules/app' |
| | | import useUserStore from '@/store/modules/user' |
| | | import useSettingsStore from '@/store/modules/settings' |
| | | const sidebar = computed(() => useAppStore().sidebar) |
| | | const device = computed(() => useAppStore().device) |
| | | import Sidebar from "@/layout/components/Sidebar/index.vue"; |
| | | |
| | | const appStore = useAppStore() |
| | | const userStore = useUserStore() |
| | | const settingsStore = useSettingsStore() |
| | | const isShowTop = ref(false) |
| | | |
| | | const { width, height } = useWindowSize() |
| | | const WIDTH = 992 // refer to Bootstrap's responsive design |
| | | |
| | | watch(() => device.value, () => { |
| | | if (device.value === 'mobile' && sidebar.value.opened) { |
| | | useAppStore().closeSideBar({ withoutAnimation: false }) |
| | | } |
| | | }) |
| | | |
| | | watchEffect(() => { |
| | | if (width.value - 1 < WIDTH) { |
| | | useAppStore().toggleDevice('mobile') |
| | | appStore.toggleSideBarHide(true) |
| | | useAppStore().closeSideBar({ withoutAnimation: true }) |
| | | } else { |
| | | useAppStore().toggleDevice('desktop') |
| | | appStore.toggleSideBarHide(false) |
| | | } |
| | | }) |
| | | // 根据窗口宽度设置 isShowTop |
| | | // const handleResize = () => { |
| | | // settingsStore.topNav = !(window.innerWidth < 992) |
| | | // } |
| | | // |
| | | // onMounted(() => { |
| | | // handleResize() // 初始判断一次 |
| | | // window.addEventListener('resize', handleResize) |
| | | // }) |
| | | // |
| | | // onUnmounted(() => { |
| | | // window.removeEventListener('resize', handleResize) |
| | | // }) |
| | | function toggleSideBar() { |
| | | appStore.toggleSideBar() |
| | | } |
| | |
| | | |
| | | <style lang='scss' scoped> |
| | | .navbar { |
| | | height: 50px; |
| | | overflow: hidden; |
| | | position: relative; |
| | | background: var(--navbar-bg); |
| | | box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08); |
| | | |
| | | .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; |
| | | display: flex; |
| | | |
| | | &:focus { |
| | | outline: none; |
| | | } |
| | | |
| | | .right-menu-item { |
| | | display: inline-block; |
| | | padding: 0 8px; |
| | | height: 100%; |
| | | font-size: 18px; |
| | | color: #5a5e66; |
| | | vertical-align: text-bottom; |
| | | |
| | | &.hover-effect { |
| | | cursor: pointer; |
| | | transition: background 0.3s; |
| | | |
| | | &:hover { |
| | | background: rgba(0, 0, 0, 0.025); |
| | | } |
| | | } |
| | | |
| | | &.theme-switch-wrapper { |
| | | display: flex; |
| | | align-items: center; |
| | | |
| | | svg { |
| | | transition: transform 0.3s; |
| | | |
| | | &:hover { |
| | | transform: scale(1.15); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .avatar-container { |
| | | margin-right: 0px; |
| | | padding-right: 0px; |
| | | |
| | | .avatar-wrapper { |
| | | margin-top: 10px; |
| | | right: 5px; |
| | | position: relative; |
| | | |
| | | .user-avatar { |
| | | cursor: pointer; |
| | | width: 30px; |
| | | height: 30px; |
| | | border-radius: 50%; |
| | | } |
| | | |
| | | .user-nickname{ |
| | | position: relative; |
| | | left: 5px; |
| | | bottom: 10px; |
| | | font-size: 14px; |
| | | font-weight: bold; |
| | | } |
| | | |
| | | i { |
| | | cursor: pointer; |
| | | position: absolute; |
| | | right: -20px; |
| | | top: 25px; |
| | | font-size: 12px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | height: 50px; |
| | | overflow: hidden; |
| | | position: relative; |
| | | background: var(--navbar-bg); |
| | | box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08); |
| | | |
| | | .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; |
| | | display: flex; |
| | | margin-right: 30px; |
| | | |
| | | &:focus { |
| | | outline: none; |
| | | } |
| | | |
| | | .right-menu-item { |
| | | display: inline-block; |
| | | padding: 0 8px; |
| | | height: 100%; |
| | | font-size: 18px; |
| | | color: #5a5e66; |
| | | vertical-align: text-bottom; |
| | | |
| | | &.hover-effect { |
| | | cursor: pointer; |
| | | transition: background 0.3s; |
| | | |
| | | &:hover { |
| | | background: rgba(0, 0, 0, 0.025); |
| | | } |
| | | } |
| | | |
| | | &.theme-switch-wrapper { |
| | | display: flex; |
| | | align-items: center; |
| | | |
| | | svg { |
| | | transition: transform 0.3s; |
| | | |
| | | &:hover { |
| | | transform: scale(1.15); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .avatar-container { |
| | | margin-right: 0px; |
| | | padding-right: 0px; |
| | | |
| | | .avatar-wrapper { |
| | | margin-top: 10px; |
| | | right: 5px; |
| | | position: relative; |
| | | |
| | | .user-avatar { |
| | | cursor: pointer; |
| | | width: 30px; |
| | | height: 30px; |
| | | border-radius: 50%; |
| | | } |
| | | |
| | | .user-nickname{ |
| | | position: relative; |
| | | left: 5px; |
| | | bottom: 10px; |
| | | font-size: 14px; |
| | | font-weight: bold; |
| | | } |
| | | |
| | | i { |
| | | cursor: pointer; |
| | | position: absolute; |
| | | right: -20px; |
| | | top: 25px; |
| | | font-size: 12px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </style> |