123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- <template>
- <div class="relative flex-center wh-full" :style="{ backgroundColor: bgColor }">
- <dark-mode-switch
- :dark="theme.darkMode"
- class="absolute left-48px top-24px z-3 text-20px"
- @update:dark="theme.setDarkMode"
- />
- <n-card :bordered="false" size="large" class="z-4 !w-auto rounded-20px shadow-sm">
- <div class="w-300px sm:w-360px">
- <header class="flex-y-center justify-between">
- <system-logo class="text-64px text-primary" />
- <n-gradient-text type="primary" :size="28">{{ title }}</n-gradient-text>
- </header>
- <main class="pt-24px">
- <h3 class="text-18px text-primary font-medium">{{ activeModule.label }}</h3>
- <div class="pt-24px">
- <transition name="fade-slide" mode="out-in" appear>
- <div>
- <component :is="activeModule.component" />
- </div>
- </transition>
- </div>
- </main>
- </div>
- </n-card>
- <login-bg :theme-color="bgThemeColor" />
- </div>
- </template>
- <script setup lang="ts">
- import { computed } from 'vue';
- import type { Component } from 'vue';
- import { loginModuleLabels } from '@/constants';
- import { useThemeStore } from '@/store';
- import { useAppInfo } from '@/composables';
- import { getColorPalette, mixColor } from '@/utils';
- import { LoginBg, PwdLogin } from './components';
- interface Props {
- /** 登录模块分类 */
- module: UnionKey.LoginModule;
- }
- const props = defineProps<Props>();
- const theme = useThemeStore();
- const { title } = useAppInfo();
- interface LoginModule {
- key: string;
- label: string;
- component: Component;
- }
- const modules: LoginModule[] = [{ key: 'pwd-login', label: loginModuleLabels['pwd-login'], component: PwdLogin }];
- const activeModule = computed(() => {
- const active: LoginModule = { ...modules[0] };
- const findItem = modules.find(item => item.key === props.module);
- if (findItem) {
- Object.assign(active, findItem);
- }
- return active;
- });
- const bgThemeColor = computed(() => (theme.darkMode ? getColorPalette(theme.themeColor, 7) : theme.themeColor));
- const bgColor = computed(() => {
- const COLOR_WHITE = '#ffffff';
- const ratio = theme.darkMode ? 0.5 : 0.2;
- return mixColor(COLOR_WHITE, theme.themeColor, ratio);
- });
- </script>
- <style scoped></style>
|