| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- <script setup lang="ts">
- import {useLoginUserStore} from "../store";
- import {computed, type ComputedRef, ref} from "vue";
- import type {RouteRecordRaw} from "vue-router";
- import router, {adminRoutes} from "../router";
- const title = ref<string>("标题");
- const loginUserStore = useLoginUserStore()
- const login = computed(()=>loginUserStore.loginUser.isLogin)
- const loginHandler = () => {
- }
- const logoutHandler = () => {
- }
- const menus:ComputedRef<RouteRecordRaw[] | undefined> = computed(()=>{
- return adminRoutes[0].children;
- })
- const isCollapse = ref(false)
- const handleOpen = (key: string, keyPath: string[]) => {
- console.log(key, keyPath)
- }
- const handleClose = (key: string, keyPath: string[]) => {
- console.log(key, keyPath)
- }
- </script>
- <template>
- <el-container>
- <el-header class="header">
- <div class="header-left" @click="router.push('/')">
- <img src="/src/assets/logo.svg" alt="logo" class="logo">
- <h2 class="title">{{title}}</h2>
- </div>
- <h1>后台管理</h1>
- <div class="header-right">
- <template v-if="login">
- <el-dropdown placement="bottom">
- <el-button> {{ loginUserStore.loginUser?.user?.name }} </el-button>
- <template #dropdown>
- <el-dropdown-menu>
- <el-dropdown-item>个人信息</el-dropdown-item>
- <el-dropdown-item @click="logoutHandler">退出</el-dropdown-item>
- </el-dropdown-menu>
- </template>
- </el-dropdown>
- </template>
- <template v-else>
- <el-button type="primary" size="small" @click="loginHandler">登录</el-button>
- <el-button size="small">注册</el-button>
- </template>
- </div>
- </el-header>
- <el-container class="main-container">
- <el-aside class="menu">
- <el-radio-group v-model="isCollapse" style="margin-bottom: 20px;display: flex;justify-content: center">
- <el-radio-button :value="false">expand</el-radio-button>
- <el-radio-button :value="true">collapse</el-radio-button>
- </el-radio-group>
- <el-menu
- router
- class="el-menu-vertical"
- :collapse="isCollapse"
- @open="handleOpen"
- @close="handleClose"
- >
- <el-menu-item :index="menu.path" v-for="menu in menus" :key="menu.path">
- <el-icon><Component :is="menu.meta?.icon"/></el-icon>
- <template #title>{{menu.meta?.title}}</template>
- </el-menu-item>
- </el-menu>
- </el-aside>
- <el-main>
- <router-view/>
- </el-main>
- </el-container>
- </el-container>
- </template>
- <style scoped>
- .el-container {
- height: 100vh;
- }
- .header {
- display: flex;
- align-items: center;
- justify-content: space-between;
- padding: 0 20px;
- margin-bottom: 10px;
- border-bottom: 1px solid
- }
- .header-left {
- display: flex;
- align-items: center;
- gap: 10px;
- }
- .logo {
- width: 40px;
- height: 40px;
- }
- .title {
- margin: 0;
- font-size: 20px;
- }
- .header-right {
- display: flex;
- align-items: center;
- gap: 10px;
- }
- .menu{
- width: 200px;
- }
- .main-container {
- flex: 1;
- }
- .el-menu-vertical-demo:not(.el-menu--collapse) {
- width: 200px;
- min-height: 400px;
- }
- </style>
|