MainView.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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">
  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 LogoSvg from '@/components/LogoSvg.vue'
  55. import { User, MoodSmile, Wallet, Home, ExternalLink, Menu2, Settings, Photo } from '@vicons/tabler'
  56. import UserAvatar from '@/components/UserAvatar.vue'
  57. import ChangePwd from '@/components/ChangePwd.vue'
  58. import { http } from '@/plugins/http'
  59. const route = useRoute()
  60. const activeMenu = ref(route.name || 'home')
  61. const isMobile = inject('isMobile')
  62. const showDrawer = ref(false)
  63. const menus = ref([
  64. {
  65. name: 'home',
  66. title: '主页',
  67. icon: shallowRef(Home)
  68. },
  69. {
  70. name: 'gallery',
  71. title: '虚拟数据',
  72. icon: shallowRef(Photo)
  73. },
  74. {
  75. name: 'user-parent',
  76. title: '用户管理',
  77. icon: shallowRef(User),
  78. children: [
  79. {
  80. name: 'user',
  81. title: '用户列表'
  82. }
  83. ]
  84. },
  85. {
  86. name: 'membership-parent',
  87. title: '会员管理',
  88. icon: shallowRef(MoodSmile),
  89. children: [
  90. {
  91. name: 'member',
  92. title: '会员列表'
  93. },
  94. {
  95. name: 'memberOrder',
  96. title: '会员订单'
  97. },
  98. {
  99. name: 'memberPlan',
  100. title: '会员计划'
  101. }
  102. ]
  103. },
  104. {
  105. name: 'money',
  106. title: '提现申请',
  107. icon: shallowRef(Wallet),
  108. children: [
  109. {
  110. name: 'withdraw',
  111. title: '提现申请'
  112. }
  113. ]
  114. },
  115. {
  116. name: 'settings',
  117. title: '系统设置',
  118. icon: shallowRef(Settings),
  119. children: [
  120. {
  121. name: 'sysConfig',
  122. title: '参数设置'
  123. }
  124. ]
  125. }
  126. ])
  127. function toggleMenu() {
  128. showDrawer.value = !showDrawer.value
  129. }
  130. watch(route, () => {
  131. activeMenu.value = route.name
  132. })
  133. const showChangePwdDialog = ref(false)
  134. function onCommand(cmd) {
  135. if (cmd === 'logout') {
  136. logout()
  137. } else if (cmd === 'changePassword') {
  138. showChangePwdDialog.value = true
  139. }
  140. }
  141. function logout() {
  142. ElMessageBox.confirm('确定退出登录吗?', '提示', {
  143. confirmButtonText: '确定',
  144. cancelButtonText: '取消',
  145. type: 'warning'
  146. }).then(() => {
  147. http.setToken(null)
  148. location.reload()
  149. })
  150. }
  151. </script>