MainView.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. <template>
  2. <ElContainer class="h-full">
  3. <ElAside class="bg-slate-100 dark:bg-zinc-800" v-if="!isMobile">
  4. <div class="h-16 px-4 flex items-center justify-center cursor-pointer">
  5. <span class="text-lg font-[sh]">Admin</span>
  6. </div>
  7. <SideMenu :default-active="activeMenu" :menus="menus" />
  8. </ElAside>
  9. <ElContainer>
  10. <ElHeader class="!h-16 border-b !box-border border-neutral-200 dark:border-neutral-800 flex items-center">
  11. <div class="p-4 mr-4 cursor-pointer" @click="toggleMenu" v-if="isMobile">
  12. <Menu2 class="w-5 h-5" />
  13. </div>
  14. <el-breadcrumb separator="/">
  15. <el-breadcrumb-item :to="{ path: '/' }">主页</el-breadcrumb-item>
  16. <el-breadcrumb-item v-if="route.name !== 'home'">{{
  17. route.meta?.title || route.path
  18. }}</el-breadcrumb-item>
  19. </el-breadcrumb>
  20. <div class="grow"></div>
  21. <DarkSwitch class="mr-4" />
  22. <el-dropdown @command="onCommand">
  23. <UserAvatar />
  24. <template #dropdown>
  25. <el-dropdown-menu>
  26. <el-dropdown-item command="changePassword">修改密码</el-dropdown-item>
  27. <el-dropdown-item command="logout">退出登录</el-dropdown-item>
  28. </el-dropdown-menu>
  29. </template>
  30. </el-dropdown>
  31. </ElHeader>
  32. <ElMain class="bg-neutral-50 dark:bg-neutral-900" id="main-container">
  33. <RouterView></RouterView>
  34. </ElMain>
  35. </ElContainer>
  36. <ElDrawer
  37. v-model="showDrawer"
  38. direction="ltr"
  39. size="80%"
  40. v-if="isMobile"
  41. class="!bg-slate-100 dark:!bg-zinc-800"
  42. >
  43. <SideMenu :default-active="activeMenu" :menus="menus" />
  44. </ElDrawer>
  45. <ChangePwd v-model="showChangePwdDialog"> </ChangePwd>
  46. </ElContainer>
  47. </template>
  48. <script setup>
  49. import { ElAside, ElContainer, ElHeader, ElMain, ElMessageBox } from 'element-plus'
  50. import DarkSwitch from '@/components/DarkSwitch.vue'
  51. import SideMenu from '@/components/SideMenu.vue'
  52. import { useRoute } from 'vue-router'
  53. import { ref, watch, shallowRef, inject } from 'vue'
  54. import { User, Home, Menu2, Settings, Video } from '@vicons/tabler'
  55. import UserAvatar from '@/components/UserAvatar.vue'
  56. import ChangePwd from '@/components/ChangePwd.vue'
  57. import { http } from '@/plugins/http'
  58. const route = useRoute()
  59. const activeMenu = ref(route.name || '/home')
  60. const isMobile = inject('isMobile')
  61. const showDrawer = ref(false)
  62. const menus = [
  63. {
  64. name: '/home',
  65. title: '主页',
  66. icon: Home
  67. },
  68. {
  69. name: 'series',
  70. title: '短剧列表',
  71. icon: Video
  72. },
  73. {
  74. name: 'user-parent',
  75. title: '用户管理',
  76. icon: User,
  77. children: [
  78. {
  79. name: '/user',
  80. title: '用户列表'
  81. }
  82. ]
  83. },
  84. {
  85. name: 'settings',
  86. title: '系统设置',
  87. icon: Settings,
  88. children: [
  89. {
  90. name: '/sysConfig',
  91. title: '参数设置'
  92. }
  93. ]
  94. }
  95. ]
  96. function toggleMenu() {
  97. showDrawer.value = !showDrawer.value
  98. }
  99. watch(route, () => {
  100. activeMenu.value = route.name
  101. })
  102. const showChangePwdDialog = ref(false)
  103. function onCommand(cmd) {
  104. if (cmd === 'logout') {
  105. logout()
  106. } else if (cmd === 'changePassword') {
  107. showChangePwdDialog.value = true
  108. }
  109. }
  110. function logout() {
  111. ElMessageBox.confirm('确定退出登录吗?', '提示', {
  112. confirmButtonText: '确定',
  113. cancelButtonText: '取消',
  114. type: 'warning'
  115. }).then(() => {
  116. http.setToken(null)
  117. location.reload()
  118. })
  119. }
  120. </script>