Add File
This commit is contained in:
326
frontend/src/views/system/appearance/LoginPreview.vue
Normal file
326
frontend/src/views/system/appearance/LoginPreview.vue
Normal file
@@ -0,0 +1,326 @@
|
|||||||
|
<template>
|
||||||
|
<div ref="appLoginView" class="appearance-login-view" :style="customStyle">
|
||||||
|
<div class="top-tab-container">
|
||||||
|
<div class="flex-top-tabs">
|
||||||
|
<div class="tab-card">
|
||||||
|
<span>{{ t('system.tab') }}</span>
|
||||||
|
<el-icon size="10">
|
||||||
|
<icon_close_outlined />
|
||||||
|
</el-icon>
|
||||||
|
</div>
|
||||||
|
<div class="tab-card active">
|
||||||
|
<div :title="pageName || 'SQLBot'" class="active-span">
|
||||||
|
<img :src="pageWeb" alt="" />
|
||||||
|
<span>{{ pageName || 'SQLBot' }}</span>
|
||||||
|
</div>
|
||||||
|
<el-icon size="10">
|
||||||
|
<icon_close_outlined />
|
||||||
|
</el-icon>
|
||||||
|
</div>
|
||||||
|
<div class="tab-card">
|
||||||
|
<span>{{ t('system.tab') }}</span>
|
||||||
|
<el-icon size="10">
|
||||||
|
<icon_close_outlined />
|
||||||
|
</el-icon>
|
||||||
|
</div>
|
||||||
|
<div class="tab-card">
|
||||||
|
<span>{{ t('system.tab') }}</span>
|
||||||
|
<el-icon size="10">
|
||||||
|
<icon_close_outlined />
|
||||||
|
</el-icon>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="login-container">
|
||||||
|
<div v-if="showLoginImage" class="left-img">
|
||||||
|
<el-image class="login-image" :src="pageBg || login_image" />
|
||||||
|
</div>
|
||||||
|
<div class="right-container">
|
||||||
|
<div class="login-form-center">
|
||||||
|
<div class="config-area">
|
||||||
|
<div class="login-logo">
|
||||||
|
<img class="login-logo-icon" :src="pageLogin" alt="" />
|
||||||
|
</div>
|
||||||
|
<div v-if="isBtnShow(showSlogan)" class="login-welcome">
|
||||||
|
{{ pageSlogan || t('system.available_to_everyone') }}
|
||||||
|
</div>
|
||||||
|
<div v-else class="login-welcome"></div>
|
||||||
|
</div>
|
||||||
|
<div class="form-area">
|
||||||
|
<div class="default-login-tabs">
|
||||||
|
<el-form size="small">
|
||||||
|
<el-form-item class="login-form-item" prop="username">
|
||||||
|
<el-input
|
||||||
|
readonly
|
||||||
|
:placeholder="
|
||||||
|
$t('datasource.please_enter') +
|
||||||
|
$t('common.empty') +
|
||||||
|
$t('common.your_account_email_address')
|
||||||
|
"
|
||||||
|
autofocus
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item prop="password">
|
||||||
|
<el-input
|
||||||
|
readonly
|
||||||
|
:placeholder="
|
||||||
|
$t('datasource.please_enter') +
|
||||||
|
$t('common.empty') +
|
||||||
|
$t('common.enter_your_password')
|
||||||
|
"
|
||||||
|
show-password
|
||||||
|
maxlength="30"
|
||||||
|
show-word-limit
|
||||||
|
type="password"
|
||||||
|
autocomplete="new-password"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<div class="login-btn">
|
||||||
|
<el-button type="primary" class="submit" size="small" :disabled="true">
|
||||||
|
{{ t('common.login_') }}
|
||||||
|
</el-button>
|
||||||
|
</div>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="showFoot" class="dynamic-login-foot" v-html="pageFootContent" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import icon_close_outlined from '@/assets/svg/icon_close_outlined.svg'
|
||||||
|
import login_image from '@/assets/embedded/login_image.png'
|
||||||
|
import aboutBg from '@/assets/embedded/LOGO-about.png'
|
||||||
|
import logoHeader from '@/assets/blue/LOGO-head_blue.png'
|
||||||
|
import logo from '@/assets/blue/LOGO-blue.png'
|
||||||
|
import loginImage from '@/assets/blue/login-image_blue.png'
|
||||||
|
import { propTypes } from '@/utils/propTypes'
|
||||||
|
import { isBtnShow } from '@/utils/utils'
|
||||||
|
import { useI18n } from 'vue-i18n'
|
||||||
|
import { computed, ref, onMounted, nextTick } from 'vue'
|
||||||
|
import elementResizeDetectorMaker from 'element-resize-detector'
|
||||||
|
const basePath = import.meta.env.VITE_API_BASE_URL
|
||||||
|
const baseUrl = basePath + '/system/appearance/picture/'
|
||||||
|
|
||||||
|
const { t } = useI18n()
|
||||||
|
const props = defineProps({
|
||||||
|
web: propTypes.string.def(''),
|
||||||
|
name: propTypes.string.def(''),
|
||||||
|
slogan: propTypes.string.def(''),
|
||||||
|
themeColor: propTypes.string.def(''),
|
||||||
|
customColor: propTypes.string.def(''),
|
||||||
|
login: propTypes.string.def(''),
|
||||||
|
showSlogan: propTypes.string.def('0'),
|
||||||
|
bg: propTypes.string.def(''),
|
||||||
|
height: propTypes.number.def(425),
|
||||||
|
foot: propTypes.string.def(''),
|
||||||
|
footContent: propTypes.string.def(''),
|
||||||
|
isBlue: propTypes.bool.def(false),
|
||||||
|
})
|
||||||
|
const appLoginView = ref()
|
||||||
|
const loginContainerWidth = ref(0)
|
||||||
|
const pageWeb = computed(() => {
|
||||||
|
return !props.web
|
||||||
|
? props.isBlue
|
||||||
|
? logoHeader
|
||||||
|
: '/LOGO-fold.svg'
|
||||||
|
: props.web.startsWith('blob')
|
||||||
|
? props.web
|
||||||
|
: baseUrl + props.web
|
||||||
|
})
|
||||||
|
const pageLogin = computed(() =>
|
||||||
|
!props.login
|
||||||
|
? props.isBlue
|
||||||
|
? logo
|
||||||
|
: aboutBg
|
||||||
|
: props.login.startsWith('blob')
|
||||||
|
? props.login
|
||||||
|
: baseUrl + props.login
|
||||||
|
)
|
||||||
|
const pageBg = computed(() =>
|
||||||
|
!props.bg
|
||||||
|
? props.isBlue
|
||||||
|
? loginImage
|
||||||
|
: null
|
||||||
|
: props.bg.startsWith('blob')
|
||||||
|
? props.bg
|
||||||
|
: baseUrl + props.bg
|
||||||
|
)
|
||||||
|
const pageName = computed(() => props.name)
|
||||||
|
const pageSlogan = computed(() => props.slogan)
|
||||||
|
const showFoot = computed(() => props.foot && props.foot === 'true')
|
||||||
|
const pageFootContent = computed(() =>
|
||||||
|
props.foot && props.foot === 'true' ? props.footContent : null
|
||||||
|
)
|
||||||
|
const customStyle = computed(() => {
|
||||||
|
const result = { height: `${props.height + 23}px` } as {
|
||||||
|
[key: string]: any
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
})
|
||||||
|
const showLoginImage = computed<boolean>(() => {
|
||||||
|
return !(loginContainerWidth.value < 555)
|
||||||
|
})
|
||||||
|
onMounted(() => {
|
||||||
|
const erd = elementResizeDetectorMaker()
|
||||||
|
erd.listenTo(appLoginView.value, () => {
|
||||||
|
nextTick(() => {
|
||||||
|
loginContainerWidth.value = appLoginView.value?.offsetWidth
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.appearance-login-view {
|
||||||
|
min-width: 390px;
|
||||||
|
min-height: 314px;
|
||||||
|
width: 100%;
|
||||||
|
height: 464px;
|
||||||
|
background-color: #fff;
|
||||||
|
position: relative;
|
||||||
|
border-radius: 6px;
|
||||||
|
overflow: hidden;
|
||||||
|
.top-tab-container {
|
||||||
|
width: 100%;
|
||||||
|
height: 22px;
|
||||||
|
background-color: #eff0f1;
|
||||||
|
.flex-top-tabs {
|
||||||
|
display: flex;
|
||||||
|
height: 23px;
|
||||||
|
padding-top: 3px;
|
||||||
|
align-items: center;
|
||||||
|
.active {
|
||||||
|
background-color: #fff;
|
||||||
|
height: 20px !important;
|
||||||
|
line-height: 20px !important;
|
||||||
|
border-top-left-radius: 4px;
|
||||||
|
border-top-right-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tab-card + .tab-card:not(.active) {
|
||||||
|
border-right: 1px solid #e0e0e2;
|
||||||
|
}
|
||||||
|
.tab-card {
|
||||||
|
padding: 0 8px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
width: 8%;
|
||||||
|
min-width: 100px;
|
||||||
|
height: 14px;
|
||||||
|
line-height: 14px;
|
||||||
|
font-size: 9px;
|
||||||
|
align-items: center;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
|
||||||
|
.active-span {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
img {
|
||||||
|
width: 14px;
|
||||||
|
height: 14px;
|
||||||
|
margin-right: 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-container {
|
||||||
|
height: calc(100% - 22px);
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
.left-img {
|
||||||
|
overflow: hidden;
|
||||||
|
height: 100%;
|
||||||
|
width: 40%;
|
||||||
|
min-width: 240px;
|
||||||
|
.login-image {
|
||||||
|
background-size: 100% 100%;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.right-container {
|
||||||
|
position: relative;
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
min-height: 290px;
|
||||||
|
.login-form-center {
|
||||||
|
width: 300px;
|
||||||
|
font-size: 10px;
|
||||||
|
.config-area {
|
||||||
|
.login-logo {
|
||||||
|
text-align: center;
|
||||||
|
img {
|
||||||
|
width: auto;
|
||||||
|
max-height: 52px;
|
||||||
|
@media only screen and (max-width: 1280px) {
|
||||||
|
width: auto;
|
||||||
|
max-height: 52px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.login-logo-icon {
|
||||||
|
width: auto;
|
||||||
|
height: 52px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.login-welcome {
|
||||||
|
text-align: center;
|
||||||
|
margin-top: 3px;
|
||||||
|
color: #646a73;
|
||||||
|
font-size: 12px;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
line-height: 16px;
|
||||||
|
word-wrap: break-word;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.form-area {
|
||||||
|
margin-top: 24px;
|
||||||
|
padding: 24px;
|
||||||
|
padding-top: 12px;
|
||||||
|
box-shadow: 0px 4px 15px rgba(31, 35, 41, 0.08);
|
||||||
|
border: 1px solid #dee0e3;
|
||||||
|
border-radius: 12px;
|
||||||
|
|
||||||
|
.login-form-item {
|
||||||
|
margin-top: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ed-form-item--default {
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.dynamic-login-foot {
|
||||||
|
visibility: visible;
|
||||||
|
width: 100%;
|
||||||
|
position: absolute;
|
||||||
|
z-index: 302;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
height: auto;
|
||||||
|
padding-top: 1px;
|
||||||
|
zoom: 1;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.login-btn {
|
||||||
|
:deep(button) {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
Reference in New Issue
Block a user