【Vue3+Element Plus】从0-1搭建后台管理系统(04)-Header-右侧

591 阅读1分钟

【Vue3+Element Plus】从0-1搭建后台管理系统(03)-Header-右侧

在这个项目中的Header右侧主要打算做以下功能:全局搜索、暗黑模式、多语言国际化、消息通知以及全屏功能和用户头像展示。而这一章主要的就是先对这些功能的进行静态渲染! 静态渲染! 静态渲染! 重要的事情说三遍,功能点后面逐个实现。

右侧的静态布局我选择使用HTML的ul>li列表进行渲染,可以轻松的控制它们之间相同的间距,通过弹性盒布局让ul里面的li在同一行内显示。

image.png

这里将右侧的每一个功能都拆分成了一个单独的组件,然后再在Nav.vue中引入进行渲染。

目录结构:

image.png

具体代码如下:

全局搜索Search.vue

layout/Header/components/Search.vue:

<template>
  <iconify-icon icon-name="fe:search"></iconify-icon>
</template>

<script setup lang="ts">
/** 引入iconify-icon */
import IconifyIcon from '@/components/Icon/IconifyIcon.vue'
defineOptions({
  name: 'Search'
})
</script>

<style lang="scss" scoped></style>

暗黑模式DarkMode.vue

layout/Header/components/DarkMode.vue:

<template>
  <el-switch
    v-model="darkMode"
    style="--el-switch-on-color: #0960bd; --el-switch-off-color: #f60"
    inline-prompt
    :active-icon="Moon"
    :inactive-icon="Sunny"
  />
</template>

<script setup lang="ts">
import { ref } from 'vue'
/** 引入Element-Plus图标 */
import { Sunny, Moon } from '@element-plus/icons-vue'
defineOptions({
  name: 'DarkMode'
})

/** 是否切换暗黑模式 */
const darkMode = ref(false)
</script>

<style lang="scss" scoped></style>

国际化Language.vue

layout/Header/components/Language.vue:

<template>
  <!-- 中英文切换 -->
  <el-dropdown trigger="click">
    <span class="el-dropdown-link">中文</span>
    <template #dropdown>
      <el-dropdown-menu>
        <el-dropdown-item>中文</el-dropdown-item>
        <el-dropdown-item>English</el-dropdown-item>
      </el-dropdown-menu>
    </template>
  </el-dropdown>
</template>

<script setup lang="ts">
defineOptions({
  name: 'Language'
})
</script>

<style lang="scss" scoped></style>

消息通知Message.vue

layout/Header/components/Message.vue:

<template>
  <iconify-icon icon-name="ant-design:bell-outlined"></iconify-icon>
</template>

<script setup lang="ts">
/** 引入iconify-icon */
import IconifyIcon from '@/components/Icon/IconifyIcon.vue'
defineOptions({
  name: 'Message'
})
</script>

<style lang="scss" scoped></style>

全屏FullScreen.vue

layout/Header/components/FullScreen.vue:

<template>
  <iconify-icon icon-name="icon-park:full-screen"></iconify-icon>
</template>

<script setup lang="ts">
/** 引入iconify-icon */
import IconifyIcon from '@/components/Icon/IconifyIcon.vue'
defineOptions({
  name: 'FullScreen'
})
</script>

<style lang="scss" scoped></style>

用户头像UserAvatar.vue

layout/Header/components/UserAvatar.vue:

<template>
  <!-- 用户头像 -->
  <el-avatar :size="35" :src="getImageUrl('logo.png')" />
  <!-- 用户信息 -->
  <el-dropdown trigger="click">
    <span class="el-dropdown-link">
      admin
      <el-icon class="el-icon--right">
        <iconify-icon icon-name="formkit:down"></iconify-icon>
      </el-icon>
    </span>
    <template #dropdown>
      <el-dropdown-menu>
        <el-dropdown-item>仓库地址</el-dropdown-item>
        <el-dropdown-item>个人中心</el-dropdown-item>
        <el-dropdown-item divided>退出登录</el-dropdown-item>
      </el-dropdown-menu>
    </template>
  </el-dropdown>
</template>

<script setup lang="ts">
/** 引入图片工具函数 */
import { getImageUrl } from '@/utils/index'
/** 引入iconify-icon */
import IconifyIcon from '@/components/Icon/IconifyIcon.vue'
defineOptions({
  name: 'UserAvatar'
})
</script>

<style lang="scss" scoped>
.nav-right__user {
  display: flex;
  align-items: center;

  i {
    font-size: 14px;
  }
}

.el-dropdown {
  color: $font-size-black;

  .el-dropdown-link {
    display: flex;
    align-items: center;
    margin-left: 5px;
  }
}
</style>