|
|
@@ -0,0 +1,123 @@
|
|
|
+<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>
|