AdminLayout.vue 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. <script setup lang="ts">
  2. import {useLoginUserStore} from "../store";
  3. import {computed, type ComputedRef, ref} from "vue";
  4. import type {RouteRecordRaw} from "vue-router";
  5. import router, {adminRoutes} from "../router";
  6. const title = ref<string>("标题");
  7. const loginUserStore = useLoginUserStore()
  8. const login = computed(()=>loginUserStore.loginUser.isLogin)
  9. const loginHandler = () => {
  10. }
  11. const logoutHandler = () => {
  12. }
  13. const menus:ComputedRef<RouteRecordRaw[] | undefined> = computed(()=>{
  14. return adminRoutes[0].children;
  15. })
  16. const isCollapse = ref(false)
  17. const handleOpen = (key: string, keyPath: string[]) => {
  18. console.log(key, keyPath)
  19. }
  20. const handleClose = (key: string, keyPath: string[]) => {
  21. console.log(key, keyPath)
  22. }
  23. </script>
  24. <template>
  25. <el-container>
  26. <el-header class="header">
  27. <div class="header-left" @click="router.push('/')">
  28. <img src="/src/assets/logo.svg" alt="logo" class="logo">
  29. <h2 class="title">{{title}}</h2>
  30. </div>
  31. <h1>后台管理</h1>
  32. <div class="header-right">
  33. <template v-if="login">
  34. <el-dropdown placement="bottom">
  35. <el-button> {{ loginUserStore.loginUser?.user?.name }} </el-button>
  36. <template #dropdown>
  37. <el-dropdown-menu>
  38. <el-dropdown-item>个人信息</el-dropdown-item>
  39. <el-dropdown-item @click="logoutHandler">退出</el-dropdown-item>
  40. </el-dropdown-menu>
  41. </template>
  42. </el-dropdown>
  43. </template>
  44. <template v-else>
  45. <el-button type="primary" size="small" @click="loginHandler">登录</el-button>
  46. <el-button size="small">注册</el-button>
  47. </template>
  48. </div>
  49. </el-header>
  50. <el-container class="main-container">
  51. <el-aside class="menu">
  52. <el-radio-group v-model="isCollapse" style="margin-bottom: 20px;display: flex;justify-content: center">
  53. <el-radio-button :value="false">expand</el-radio-button>
  54. <el-radio-button :value="true">collapse</el-radio-button>
  55. </el-radio-group>
  56. <el-menu
  57. router
  58. class="el-menu-vertical"
  59. :collapse="isCollapse"
  60. @open="handleOpen"
  61. @close="handleClose"
  62. >
  63. <el-menu-item :index="menu.path" v-for="menu in menus" :key="menu.path">
  64. <el-icon><Component :is="menu.meta?.icon"/></el-icon>
  65. <template #title>{{menu.meta?.title}}</template>
  66. </el-menu-item>
  67. </el-menu>
  68. </el-aside>
  69. <el-main>
  70. <router-view/>
  71. </el-main>
  72. </el-container>
  73. </el-container>
  74. </template>
  75. <style scoped>
  76. .el-container {
  77. height: 100vh;
  78. }
  79. .header {
  80. display: flex;
  81. align-items: center;
  82. justify-content: space-between;
  83. padding: 0 20px;
  84. margin-bottom: 10px;
  85. border-bottom: 1px solid
  86. }
  87. .header-left {
  88. display: flex;
  89. align-items: center;
  90. gap: 10px;
  91. }
  92. .logo {
  93. width: 40px;
  94. height: 40px;
  95. }
  96. .title {
  97. margin: 0;
  98. font-size: 20px;
  99. }
  100. .header-right {
  101. display: flex;
  102. align-items: center;
  103. gap: 10px;
  104. }
  105. .menu{
  106. width: 200px;
  107. }
  108. .main-container {
  109. flex: 1;
  110. }
  111. .el-menu-vertical-demo:not(.el-menu--collapse) {
  112. width: 200px;
  113. min-height: 400px;
  114. }
  115. </style>