|
|
|
<!--
|
|
|
|
* default.vue
|
|
|
|
* Copyright (C) 2024 veypi <i@veypi.com>
|
|
|
|
* 2024-05-31 17:09
|
|
|
|
* Distributed under terms of the MIT license.
|
|
|
|
-->
|
|
|
|
<template>
|
|
|
|
<div class="page">
|
|
|
|
<div class="header flex justify-center items-center">
|
|
|
|
<div class="ico" @click="router.push('/')"></div>
|
|
|
|
<div>OneAuth</div>
|
|
|
|
<div class="grow"></div>
|
|
|
|
<OneIcon class="mx-2" @click="toggle_lang" :name="$i18n.locale !== 'zh-CN' ? 'in-Zh_Cn' : 'in-en'"></OneIcon>
|
|
|
|
<OneIcon class="mx-2" @click="toggle_fullscreen" :name="app.layout.fullscreen ? 'compress' : 'expend'"></OneIcon>
|
|
|
|
<OneIcon class="mx-2" @click="toggle_theme" :name="app.layout.theme === '' ? 'light' : 'dark'"></OneIcon>
|
|
|
|
<div class="mr-4 ml-2" id='oaer'></div>
|
|
|
|
</div>
|
|
|
|
<div class="menu">
|
|
|
|
<Menu :show_name="menu_mode === 2"></Menu>
|
|
|
|
</div>
|
|
|
|
<div class="menu-hr"></div>
|
|
|
|
<div class="main px-8 py-6">
|
|
|
|
<slot />
|
|
|
|
</div>
|
|
|
|
<div class="footer flex justify-around items-center">
|
|
|
|
<div @click="util.goto('https://veypi.com')">© 2024 veypi</div>
|
|
|
|
<div>使用说明</div>
|
|
|
|
<div>联系我们</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script lang="ts" setup>
|
|
|
|
import { OneIcon } from '@veypi/one-icon'
|
|
|
|
import oaer from '@veypi/oaer'
|
|
|
|
import { useI18n } from 'vue-i18n';
|
|
|
|
import { apitoken } from '@veypi/oaer/lib/api';
|
|
|
|
|
|
|
|
let i18n = useI18n()
|
|
|
|
let app = useAppConfig()
|
|
|
|
let router = useRouter()
|
|
|
|
const colorMode = useColorMode()
|
|
|
|
|
|
|
|
app.host = window.location.protocol + '//' + window.location.host
|
|
|
|
api.apitoken.value = oaer.Token()
|
|
|
|
api.apitoken.set_updator(oaer.TokenRefresh)
|
|
|
|
oaer.init(app.host).then((e) => {
|
|
|
|
oaer.render_ui('oaer')
|
|
|
|
}).catch(() => {
|
|
|
|
oaer.logout()
|
|
|
|
})
|
|
|
|
oaer.on('logout', () => {
|
|
|
|
useRouter().push('/login')
|
|
|
|
})
|
|
|
|
|
|
|
|
let menu_mode = ref(1)
|
|
|
|
let toggle_menu = (m: 0 | 1 | 2) => {
|
|
|
|
menu_mode.value = m
|
|
|
|
if (m == 0) {
|
|
|
|
app.layout.menu_width = 0
|
|
|
|
} else if (m == 1) {
|
|
|
|
app.layout.menu_width = 40
|
|
|
|
} else {
|
|
|
|
app.layout.menu_width = 108
|
|
|
|
}
|
|
|
|
}
|
|
|
|
toggle_menu(2)
|
|
|
|
|
|
|
|
const toggle_lang = () => {
|
|
|
|
if (i18n.locale.value === 'zh-CN') {
|
|
|
|
i18n.locale.value = 'en-US'
|
|
|
|
} else {
|
|
|
|
i18n.locale.value = 'zh-CN'
|
|
|
|
}
|
|
|
|
localStorage.setItem('lang', i18n.locale.value)
|
|
|
|
}
|
|
|
|
const toggle_fullscreen = () => {
|
|
|
|
app.layout.fullscreen = !app.layout.fullscreen
|
|
|
|
if (app.layout.fullscreen) {
|
|
|
|
let docElm = document.documentElement;
|
|
|
|
docElm.requestFullscreen();
|
|
|
|
} else {
|
|
|
|
document.exitFullscreen();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
const toggle_theme = () => {
|
|
|
|
app.layout.theme =
|
|
|
|
app.layout.theme === '' ? 'dark' : ''
|
|
|
|
document.documentElement.setAttribute('theme', app.layout.theme)
|
|
|
|
colorMode.preference = app.layout.theme === '' ? 'light' : 'dark'
|
|
|
|
}
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
|
|
oaer.render_ui('oaer')
|
|
|
|
useMenuStore().default()
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<style scoped lang="scss">
|
|
|
|
.page {
|
|
|
|
height: 100vh;
|
|
|
|
width: 100vw;
|
|
|
|
|
|
|
|
.header {
|
|
|
|
height: v-bind('app.layout.header_height + "px"');
|
|
|
|
user-select: none;
|
|
|
|
background: var(--header-bg);
|
|
|
|
color: var(--header-txt);
|
|
|
|
font-size: 24px;
|
|
|
|
|
|
|
|
.ico {
|
|
|
|
width: v-bind('app.layout.header_height * 0.8 + "px"');
|
|
|
|
height: v-bind('app.layout.header_height * 0.8 + "px"');
|
|
|
|
background: url('/favicon.ico') no-repeat;
|
|
|
|
background-size: cover;
|
|
|
|
}
|
|
|
|
|
|
|
|
#oaer {
|
|
|
|
width: v-bind('app.layout.header_height * 0.6 + "px"');
|
|
|
|
height: v-bind('app.layout.header_height * 0.6 + "px"');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
.menu {
|
|
|
|
overflow: hidden;
|
|
|
|
vertical-align: top;
|
|
|
|
display: inline-block;
|
|
|
|
width: v-bind("app.layout.menu_width + 'px'");
|
|
|
|
height: calc(100vh - v-bind('app.layout.header_height + app.layout.footer_height + "px"'));
|
|
|
|
transition: width 0.3s linear;
|
|
|
|
}
|
|
|
|
|
|
|
|
.menu-hr {
|
|
|
|
vertical-align: top;
|
|
|
|
display: inline-block;
|
|
|
|
width: 1px;
|
|
|
|
height: calc(100vh - v-bind('app.layout.header_height + app.layout.footer_height + "px"'));
|
|
|
|
background: #999;
|
|
|
|
}
|
|
|
|
|
|
|
|
.main {
|
|
|
|
vertical-align: top;
|
|
|
|
display: inline-block;
|
|
|
|
overflow: auto;
|
|
|
|
width: calc(100vw - v-bind("app.layout.menu_width + 1 + 'px'"));
|
|
|
|
height: calc(100vh - v-bind('app.layout.header_height + app.layout.footer_height + "px"'));
|
|
|
|
transition: width 0.3s linear;
|
|
|
|
}
|
|
|
|
|
|
|
|
.footer {
|
|
|
|
height: v-bind("app.layout.footer_height + 'px'");
|
|
|
|
user-select: none;
|
|
|
|
background: var(--footer-bg);
|
|
|
|
color: var(--footer-txt);
|
|
|
|
font-size: 12px;
|
|
|
|
line-height: v-bind("app.layout.footer_height + 'px'");
|
|
|
|
|
|
|
|
div {
|
|
|
|
cursor: pointer;
|
|
|
|
opacity: 0.6;
|
|
|
|
}
|
|
|
|
|
|
|
|
div:hover {
|
|
|
|
opacity: 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
</style>
|