blob: 06f9199554e4a84faa535434e46da9fc35a71ec6 [file] [log] [blame]
<!--
~ Licensed to the Apache Software Foundation (ASF) under one or more
~ contributor license agreements. See the NOTICE file distributed with
~ this work for additional information regarding copyright ownership.
~ The ASF licenses this file to You under the Apache License, Version 2.0
~ (the "License"); you may not use this file except in compliance with
~ the License. You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<template>
<div class="__container_layout_index">
<a-layout style="height: 100vh">
<a-layout-sider
width="268"
v-model:collapsed="collapsed"
theme="light"
:trigger="null"
collapsible
>
<div class="logo">
<img :src="logo" />
<template v-if="!collapsed">Dubbo Admin</template>
</div>
<layout-menu></layout-menu>
</a-layout-sider>
<a-layout>
<layout_header :collapsed="collapsed"></layout_header>
<layout_bread></layout_bread>
<a-layout-content class="layout-content">
<router-view v-slot="{ Component }">
<transition name="slide-fade">
<component :is="Component"> </component>
</transition>
</router-view>
</a-layout-content>
<a-layout-footer class="layout-footer"
>© 2024 The Apache Software Foundation.
</a-layout-footer>
</a-layout>
</a-layout>
</div>
</template>
<script lang="ts" setup>
import { h, provide, ref } from 'vue'
import layoutMenu from './menu/layout_menu.vue'
import logo from '@/assets/logo.png'
import Layout_header from '@/layout/header/layout_header.vue'
import { PROVIDE_INJECT_KEY } from '@/base/enums/ProvideInject'
import Layout_bread from '@/layout/breadcrumb/layout_bread.vue'
import { PRIMARY_COLOR, TAB_HEADER_TITLE_VNODE } from '@/base/constants'
import { useRoute, useRouter } from 'vue-router'
let __null = PRIMARY_COLOR
const collapsed = ref<boolean>(false)
provide(PROVIDE_INJECT_KEY.COLLAPSED, collapsed)
const route = useRoute()
const router = useRouter()
let transitionFlag = ref(true)
router.beforeEach((to, from, next) => {
transitionFlag.value = false
next()
setTimeout(() => {
transitionFlag.value = true
}, 500)
})
TAB_HEADER_TITLE_VNODE.vnode = h('div', route.params?.pathId)
</script>
<style lang="less" scoped>
.__container_layout_index {
.logo {
height: 40px;
width: auto;
margin: 10px 15px;
padding-left: 10px;
padding-right: 10px;
border-radius: 8px;
background: v-bind('PRIMARY_COLOR');
line-height: 40px;
vertical-align: middle;
font-size: 22px;
color: white;
img {
width: 28px;
height: 28px;
margin-bottom: 5px;
margin-right: 5px;
}
}
.layout-content {
margin: 16px;
padding: 16px 16px 24px;
//background: #fff;
overflow-y: auto;
height: calc(100vh - 140px);
}
.layout-footer {
height: 30px;
text-align: center;
}
}
</style>
<style>
.slide-fade-enter-active {
animation: slide-fade-in 0.5s;
}
@keyframes slide-fade-in {
0% {
transform: translateX(80px);
opacity: 0;
}
50% {
transform: translateX(-2px);
opacity: 20;
}
100% {
transform: translateX(0);
opacity: 100;
}
}
.fade-enter-active {
animation: fade-in 0.6s ease-in-out;
}
.fade-leave-active {
animation: fade-in 0.6s reverse;
}
@keyframes fade-in {
0% {
transform: scale(0.9);
opacity: 0;
}
100% {
transform: scale(1);
opacity: 100;
}
}
</style>