Vue3+ElementPlus 开箱即用后台管理系统,支持白天黑夜主题切换,通用管理组件,

发布于:2025-05-15 ⋅ 阅读:(6) ⋅ 点赞:(0)

        Vue3+ElementPlus后台管理系统,支持白天黑夜主题切换,专为教育管理场景设计。主要功能包括用户管理(管理员、教师、学生)、课件资源管理(课件列表、下载中心)和数据统计(使用情况、教学效率等)。系统采用响应式布局,内置智能主题切换功能,可自动保存用户偏好。基于Vue3组合式API开发,TypeScript支持,组件化架构易于扩展,适合各类教育管理平台快速搭建

拿走请记得给我点赞加关注!!!

<template>
  <el-container class="root-container" :class="{ 'dark-mode': isDarkMode }">
    <!-- 侧边栏 -->
    <el-aside width="250px" class="sidebar">
      <div class="logo-container">
        <img
            :src="logoImage"
            alt="Logo"
            class="logo-img"
        />
      </div>

      <el-menu
          :default-active="$route.path"
          class="el-menu-vertical-demo"
          :active-text-color="isDarkMode ? '#409EFF' : '#2a3643'"
          :background-color="isDarkMode ? '#2a3643' : '#ffffff'"
          :text-color="isDarkMode ? '#ffffff' : '#2a3643'"
          router>
        <!-- 用户管理菜单 -->
        <el-sub-menu index="1">
          <template #title>
            <el-icon><User /></el-icon>
            <span>用户管理</span>
          </template>
          <el-menu-item index="/user/admin">
            <el-icon><User /></el-icon>
            <span>管理员</span>
          </el-menu-item>
          <el-menu-item index="/user/teacher">
            <el-icon><Avatar /></el-icon>
            <span>教师</span>
          </el-menu-item>
          <el-menu-item index="/user/student">
            <el-icon><School /></el-icon>
            <span>学生</span>
          </el-menu-item>
        </el-sub-menu>

        <!-- 课件资源管理菜单 -->
        <el-sub-menu index="2">
          <template #title>
            <el-icon><Folder /></el-icon>
            <span>课件资源管理</span>
          </template>
          <el-menu-item index="/resource/list">
            <el-icon><List /></el-icon>
            <span>课件列表</span>
          </el-menu-item>
          <el-menu-item index="/resource/download">
            <el-icon><Download /></el-icon>
            <span>课件下载中心</span>
          </el-menu-item>
        </el-sub-menu>

        <!-- 数据统计菜单 -->
        <el-sub-menu index="3">
          <template #title>
            <el-icon><DataAnalysis /></el-icon>
            <span>数据统计</span>
          </template>
          <el-menu-item index="/dashboard/overview">
            <el-icon><Monitor /></el-icon>
            <span>大屏概览</span>
          </el-menu-item>
          <el-menu-item index="/stats/teacher-usage">
            <el-icon><User /></el-icon>
            <span>教师使用次数统计</span>
          </el-menu-item>
          <el-menu-item index="/stats/student-usage">
            <el-icon><School /></el-icon>
            <span>学生使用次数统计</span>
          </el-menu-item>
          <el-menu-item index="/stats/teaching-efficiency">
            <el-icon><PieChart /></el-icon>
            <span>教学效率指数</span>
          </el-menu-item>
          <el-menu-item index="/stats/learning-effect">
            <el-icon><TrendCharts /></el-icon>
            <span>学生学习效果</span>
          </el-menu-item>
        </el-sub-menu>

      </el-menu>
    </el-aside>

    <!-- 主体区域 -->
    <el-container>
      <!-- 顶部导航 -->
      <el-header class="header">
        <h1 class="header-title"></h1>
        <div class="header-right">
          <el-input
              v-model="searchText"
              placeholder="Search for something..."
              prefix-icon="Search"
              class="search-input"/>
          <el-icon class="header-icon"><Search /></el-icon>
          <el-icon class="header-icon"><Bell /></el-icon>
          <el-switch
              v-model="isDarkMode"
              inline-prompt
              :active-icon="Moon"
              :inactive-icon="Sunny"
              style="margin-right: 10px"
          />
          <el-dropdown>
            <el-avatar
                size="small"
                :src="'https://ai-public.mastergo.com/ai/img_res/de3f08ed1935c2e296ca6111c0906527.jpg'"
            />
            <template #dropdown>
              <el-dropdown-menu>
                <el-dropdown-item>个人中心</el-dropdown-item>
                <el-dropdown-item @click="logout">退出登录</el-dropdown-item>
              </el-dropdown-menu>
            </template>
          </el-dropdown>
        </div>
      </el-header>

      <!-- 内容区插槽 -->
      <el-main class="main-content">
        <router-view></router-view>
      </el-main>
    </el-container>
  </el-container>
</template>

<script setup lang="ts">
import {
  Document,
  Search,
  Bell,
  Sunny,
  Moon, User, Avatar, UserFilled, DataAnalysis, School, Folder, List, Download, Monitor, TrendCharts, PieChart
} from '@element-plus/icons-vue'
import { ref, watch, computed } from 'vue'
import { useRoute } from 'vue-router'
// 导入两种主题的logo图片


const route = useRoute()
const searchText = ref('')
const isDarkMode = ref(false)

import logoDark from '@/assets/慧教引擎.png'
import logoLight from '@/assets/慧教引擎(白天版).png'

const logoImage = computed(() => {
  return isDarkMode.value ? logoDark : logoLight
})
// 监听模式变化
watch(isDarkMode, (newVal) => {
  if (newVal) {
    document.documentElement.classList.add('dark')
  } else {
    document.documentElement.classList.remove('dark')
  }
  // 保存到本地存储
  localStorage.setItem('darkMode', String(newVal))
})

// 初始化时检查本地存储
const initDarkMode = () => {
  const savedMode = localStorage.getItem('darkMode')
  if (savedMode === 'true') {
    isDarkMode.value = true
    document.documentElement.classList.add('dark')
  }
}
initDarkMode()

const logout = () => {
  console.log('退出登录')
}
</script>

<style scoped>

/* 侧边栏样式调整 */
.sidebar {
  background: v-bind('isDarkMode ? "#283042" : "#3f9dfd"');
  transition: background-color 0.3s;
}

.el-menu {
  border-right: none;
}

/* 子菜单样式 */
.el-sub-menu .el-menu-item {
  padding-left: 50px !important;
  background-color: v-bind('isDarkMode ? "#1e2430" : "#3688e8"');
}

.el-sub-menu .el-menu-item:hover {
  background-color: v-bind('isDarkMode ? "#2d3648" : "#4aa0ff"') !important;
}

.el-sub-menu .el-menu-item.is-active {
  background-color: v-bind('isDarkMode ? "#409EFF" : "#2a7de9"');
  color: white;
}

/* 菜单图标样式 */
.el-menu-item [class^="el-icon"],
.el-sub-menu [class^="el-icon"] {
  font-size: 18px;
  margin-right: 10px;
}
.root-container {
  height: 100vh;
  width: 100%;
  margin: 0;
  padding: 0;
  transition: background-color 0.3s, color 0.3s;

}

.sidebar {
  background: v-bind('isDarkMode ? "#283042" : "#3f9dfd"');
  margin: 0;
  padding: 0;
  transition: background-color 0.3s;
  color: #3f9dfd;
}

.logo-container {
  display: flex;
  align-items: center;
  padding: 20px;
  height: 60px;
}

.logo-img {
  width: 150px;
  height: 110px;
  transition: opacity 0.3s ease;
}



.el-menu {
  background: v-bind('isDarkMode ? "#283042" : "#3f9dfd"');
  border-right: none;
  transition: background-color 0.3s;
  color: #9dd5d8;
}

.el-menu-item {
  color: v-bind('isDarkMode ? "#ffffff" : "#2a3643"');
  display: flex;
  padding: 0 36px !important;
  transition: background-color 0.3s, color 0.3s;
}

.el-menu-item .el-icon {
  margin-right: 8px;
}

.el-menu-item:hover {
  background-color: v-bind('isDarkMode ? "#3a495a" : "#f5f7fa"');
}

.header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 0 20px;
  height: 60px;
  border-bottom: 1px solid v-bind('isDarkMode ? "#3a495a" : "#e6e6e6"');
  background-color: v-bind('isDarkMode ? "#2a3643" : "#ffffff"');
  transition: background-color 0.3s, border-color 0.3s;
}

.header-title {
  font-size: 18px;
  margin: 0;
  color: v-bind('isDarkMode ? "#ffffff" : "#2a3643"');
}

.header-right {
  display: flex;
  align-items: center;
  gap: 20px;
}

.search-input {
  width: 200px;
}

.header-icon {
  font-size: 18px;
  cursor: pointer;
  color: v-bind('isDarkMode ? "#ffffff" : "#606266"');
}

/*内容区样式*/
.main-content {
  padding: 20px;
  background-color: v-bind('isDarkMode ? "#1a2029" : "#f5f7fa"');
  color: v-bind('isDarkMode ? "#ffffff" : "#2a3643"');
  transition: background-color 0.3s, color 0.3s;
}

/* 搜索框容器样式 */
.search-container {
  position: relative;
  display: flex;
  align-items: center;
}

/* 搜索输入框基础样式 */
.search-input {
  width: 180px;
  transition: width 0.3s;
}

/* 搜索框悬停状态 */
.search-input:hover {
  width: 220px;
}

/* 深度选择器修改Element Plus输入框内部样式 */
.search-input :deep(.el-input__wrapper) {
  padding-right: 30px;
  background-color: v-bind('isDarkMode ? "#3a495a" : "#f5f7fa"');
  border-radius: 20px;
  transition: background-color 0.3s;
}

.search-input :deep(.el-input__inner) {
  color: v-bind('isDarkMode ? "#ffffff" : "#2a3643"');
}

/* 搜索图标样式 */
.search-icon {
  position: absolute;
  color: v-bind('isDarkMode ? "#ffffff" : "#909399"');
  cursor: pointer;
}

/* 顶部导航图标基础样式 */
.header-icon {
  font-size: 28px;
  color: v-bind('isDarkMode ? "#ffffff" : "#606266"');
  padding: 5px;
  border-radius: 50%;
  transition: background-color 0.3s;
}

/* 顶部导航图标悬停状态 */
.header-icon:hover {
  background-color: v-bind('isDarkMode ? "#3a495a" : "#f0f2f5"');
}

/* 全局暗色模式样式 */
:root.dark {
  --el-color-primary: #409EFF;
  --el-color-primary-light-3: #3375b9;
  --el-color-primary-light-5: #2a598a;
  --el-color-primary-light-7: #213d5b;
  --el-color-primary-light-8: #1d3043;
  --el-color-primary-light-9: #18222c;
  --el-color-primary-dark-2: #66b1ff;
}
</style>