UnisKB/ui/src/components/login-layout/index.vue

108 lines
3.1 KiB
Vue
Raw Normal View History

2023-09-15 09:40:35 +00:00
<template>
2023-10-12 08:36:16 +00:00
<div class="login-warp flex-center">
<div class="login-container w-full h-full">
<el-row class="container w-full h-full">
2024-01-31 08:38:58 +00:00
<el-col :xs="0" :sm="0" :md="10" :lg="10" :xl="10" class="left-container">
2024-07-22 09:38:45 +00:00
<div class="login-image" :style="{ backgroundImage: `url(${loginImage})` }"></div>
2023-10-12 08:36:16 +00:00
</el-col>
2023-12-12 03:32:45 +00:00
<el-col :xs="24" :sm="24" :md="14" :lg="14" :xl="14" class="right-container flex-center">
2025-02-10 08:59:59 +00:00
<el-dropdown trigger="click" type="primary" class="lang" v-if="lang">
2025-02-05 10:55:05 +00:00
<template #dropdown>
<el-dropdown-menu style="width: 180px">
<el-dropdown-item
v-for="(lang, index) in langList"
:key="index"
:value="lang.value"
@click="changeLang(lang.value)"
class="flex-between"
>
<span :class="lang.value === user.getLanguage() ? 'primary' : ''">{{
lang.label
}}</span>
<el-icon
:class="lang.value === user.getLanguage() ? 'primary' : ''"
v-if="lang.value === user.getLanguage()"
>
<Check />
</el-icon>
</el-dropdown-item>
</el-dropdown-menu>
</template>
<el-button>
{{ currentLanguage }}<el-icon class="el-icon--right"><arrow-down /></el-icon>
</el-button>
</el-dropdown>
2023-10-12 08:36:16 +00:00
<slot></slot>
</el-col>
</el-row>
2023-09-15 09:40:35 +00:00
</div>
2023-10-12 08:36:16 +00:00
</div>
2023-09-15 09:40:35 +00:00
</template>
<script setup lang="ts">
2024-07-16 09:32:27 +00:00
import { computed } from 'vue'
import { getThemeImg } from '@/utils/theme'
import useStore from '@/stores'
2025-02-05 10:55:05 +00:00
import { useLocalStorage } from '@vueuse/core'
import { langList, localeConfigKey, getBrowserLang } from '@/locales/index'
2025-02-10 08:59:59 +00:00
defineProps({
lang: {
type: Boolean,
default: true
}
})
2023-10-12 08:36:16 +00:00
defineOptions({ name: 'LoginLayout' })
2024-07-16 09:32:27 +00:00
const { user } = useStore()
2025-02-05 10:55:05 +00:00
const changeLang = (lang: string) => {
useLocalStorage(localeConfigKey, getBrowserLang()).value = lang
window.location.reload()
}
const currentLanguage = computed(() => {
return langList.value?.filter((v: any) => v.value === user.getLanguage())?.[0]?.label
2025-02-05 10:55:05 +00:00
})
2024-07-16 09:32:27 +00:00
const fileURL = computed(() => {
2024-07-16 09:39:15 +00:00
if (user.themeInfo?.loginImage) {
if (typeof user.themeInfo?.loginImage === 'string') {
return user.themeInfo?.loginImage
2024-07-16 09:32:27 +00:00
} else {
2024-07-16 09:39:15 +00:00
return URL.createObjectURL(user.themeInfo?.loginImage)
2024-07-16 09:32:27 +00:00
}
} else {
return ''
}
})
2024-07-22 09:38:45 +00:00
const loginImage = computed(() => {
2024-07-16 10:12:22 +00:00
if (user.themeInfo?.loginImage) {
2024-07-22 09:38:45 +00:00
return `${fileURL.value}`
2024-07-16 09:32:27 +00:00
} else {
2024-07-22 09:38:45 +00:00
return new URL(`../../assets/theme/${getThemeImg(user.themeInfo?.theme)}.jpg`, import.meta.url)
.href
2024-07-15 10:08:02 +00:00
}
})
2023-09-15 09:40:35 +00:00
</script>
<style lang="scss" scope>
.login-warp {
2023-10-12 08:36:16 +00:00
height: 100vh;
2023-09-15 09:40:35 +00:00
2023-10-12 08:36:16 +00:00
.login-image {
2024-07-16 09:32:27 +00:00
background-repeat: no-repeat;
background-position: center;
background-size: cover;
2023-10-12 08:36:16 +00:00
width: 100%;
height: 100%;
}
2025-02-05 10:55:05 +00:00
.right-container {
position: relative;
.lang {
position: absolute;
right: 20px;
top: 20px;
}
}
2023-09-15 09:40:35 +00:00
}
</style>