From 215d8bab380728164d7fe2958c2d2d1151fce892 Mon Sep 17 00:00:00 2001 From: Vben <anncwb@126.com> Date: 星期六, 10 四月 2021 21:41:22 +0800 Subject: [PATCH] refactor: refactor store --- src/views/sys/login/Login.vue | 377 ++++++++++++++++++++++++----------------------------- 1 files changed, 174 insertions(+), 203 deletions(-) diff --git a/src/views/sys/login/Login.vue b/src/views/sys/login/Login.vue index 2af0ae6..b01956a 100644 --- a/src/views/sys/login/Login.vue +++ b/src/views/sys/login/Login.vue @@ -1,247 +1,218 @@ <template> - <div class="login"> - <div class="login-mask" /> - <div class="login-form-wrap"> - <div class="login-form mx-6"> - <AppLocalePicker v-if="showLocale" class="login-form__locale" /> - <div class="login-form__content px-2 py-10"> - <header> - <img :src="logo" class="mr-4" /> - <h1>{{ title }}</h1> - </header> + <div :class="prefixCls" class="relative w-full h-full px-4"> + <AppLocalePicker + class="absolute top-4 right-4 enter-x text-white xl:text-gray-600" + :showText="false" + /> + <AppDarkModeToggle class="absolute top-3 right-7 enter-x" /> - <a-form class="mx-auto mt-10" :model="formData" :rules="formRules" ref="formRef"> - <a-form-item name="account"> - <a-input size="large" v-model:value="formData.account" placeholder="username: vben" /> - </a-form-item> - <a-form-item name="password"> - <a-input-password - size="large" - visibilityToggle - v-model:value="formData.password" - placeholder="password: 123456" - /> - </a-form-item> + <span class="-enter-x xl:hidden"> + <AppLogo :alwaysShowTitle="true" /> + </span> - <!-- <a-form-item name="verify" v-if="openLoginVerify"> - <BasicDragVerify v-model:value="formData.verify" ref="verifyRef" /> - </a-form-item> --> - <a-row> - <a-col :span="12"> - <a-form-item> - <!-- No logic, you need to deal with it yourself --> - <a-checkbox v-model:checked="autoLogin" size="small">{{ - t('sys.login.autoLogin') - }}</a-checkbox> - </a-form-item> - </a-col> - <a-col :span="12"> - <a-form-item :style="{ 'text-align': 'right' }"> - <!-- No logic, you need to deal with it yourself --> - <a-button type="link" size="small">{{ t('sys.login.forgetPassword') }}</a-button> - </a-form-item> - </a-col> - </a-row> - <a-form-item> - <a-button - type="primary" - size="large" - class="rounded-sm" - :block="true" - @click="login" - :loading="formState.loading" - >{{ t('sys.login.loginButton') }}</a-button - > - </a-form-item> - </a-form> + <div class="container relative h-full py-2 mx-auto sm:px-10"> + <div class="flex h-full"> + <div class="hidden xl:flex xl:flex-col xl:w-6/12 min-h-full mr-4 pl-4"> + <AppLogo class="-enter-x" /> + <div class="my-auto"> + <img + :alt="title" + src="../../../assets/svg/login-box-bg.svg" + class="w-1/2 -mt-16 -enter-x" + /> + <div class="mt-10 font-medium text-white -enter-x"> + <span class="mt-4 text-3xl inline-block"> {{ t('sys.login.signInTitle') }}</span> + </div> + <div class="mt-5 text-md text-white font-normal dark:text-gray-500 -enter-x"> + {{ t('sys.login.signInDesc') }} + </div> + </div> + </div> + <div class="h-full xl:h-auto flex py-5 xl:py-0 xl:my-0 w-full xl:w-6/12"> + <div + :class="`${prefixCls}-form`" + class="my-auto mx-auto xl:ml-20 xl:bg-transparent px-5 py-8 sm:px-8 xl:p-4 rounded-md shadow-md xl:shadow-none w-full sm:w-3/4 lg:w-2/4 xl:w-auto enter-x relative" + > + <LoginForm /> + <ForgetPasswordForm /> + <RegisterForm /> + <MobileForm /> + <QrCodeForm /> + </div> </div> </div> </div> </div> </template> <script lang="ts"> - import { defineComponent, reactive, ref, unref, toRaw } from 'vue'; - import { Checkbox } from 'ant-design-vue'; + import { defineComponent, computed } from 'vue'; - import { Button } from '/@/components/Button'; - import { AppLocalePicker } from '/@/components/Application'; - // import { BasicDragVerify, DragVerifyActionType } from '/@/components/Verify/index'; + import { AppLogo } from '/@/components/Application'; + import { AppLocalePicker, AppDarkModeToggle } from '/@/components/Application'; + import LoginForm from './LoginForm.vue'; + import ForgetPasswordForm from './ForgetPasswordForm.vue'; + import RegisterForm from './RegisterForm.vue'; + import MobileForm from './MobileForm.vue'; + import QrCodeForm from './QrCodeForm.vue'; - import { userStore } from '/@/store/modules/user'; - - // import { appStore } from '/@/store/modules/app'; - import { useMessage } from '/@/hooks/web/useMessage'; - import { useGlobSetting, useProjectSetting } from '/@/hooks/setting'; - import logo from '/@/assets/images/logo.png'; + import { useGlobSetting } from '/@/hooks/setting'; import { useI18n } from '/@/hooks/web/useI18n'; + import { useDesign } from '/@/hooks/web/useDesign'; + import { useLocaleStore } from '/@/store/modules/locale'; export default defineComponent({ + name: 'Login', components: { - // BasicDragVerify, - AButton: Button, - ACheckbox: Checkbox, + AppLogo, + LoginForm, + ForgetPasswordForm, + RegisterForm, + MobileForm, + QrCodeForm, AppLocalePicker, + AppDarkModeToggle, }, setup() { - const formRef = ref<any>(null); - const autoLoginRef = ref(false); - // const verifyRef = ref<RefInstanceType<DragVerifyActionType>>(null); - const globSetting = useGlobSetting(); - const { locale } = useProjectSetting(); - const { notification } = useMessage(); + const { prefixCls } = useDesign('login'); const { t } = useI18n(); + const localeStore = useLocaleStore(); - // const openLoginVerifyRef = computed(() => appStore.getProjectConfig.openLoginVerify); - - const formData = reactive({ - account: 'vben', - password: '123456', - // verify: undefined, - }); - - const formState = reactive({ - loading: false, - }); - - const formRules = reactive({ - account: [{ required: true, message: t('sys.login.accountPlaceholder'), trigger: 'blur' }], - password: [ - { required: true, message: t('sys.login.passwordPlaceholder'), trigger: 'blur' }, - ], - // verify: unref(openLoginVerifyRef) ? [{ required: true, message: '璇烽�氳繃楠岃瘉鐮佹牎楠�' }] : [], - }); - - // function resetVerify() { - // const verify = unref(verifyRef); - // if (!verify) return; - // formData.verify && verify.$.resume(); - // formData.verify = undefined; - // } - - async function handleLogin() { - const form = unref(formRef); - if (!form) return; - formState.loading = true; - try { - const data = await form.validate(); - const userInfo = await userStore.login( - toRaw({ - password: data.password, - username: data.account, - }) - ); - if (userInfo) { - notification.success({ - message: t('sys.login.loginSuccessTitle'), - description: `${t('sys.login.loginSuccessDesc')}: ${userInfo.realName}`, - duration: 3, - }); - } - } catch (error) { - } finally { - // resetVerify(); - formState.loading = false; - } - } return { - formRef, - // verifyRef, - formData, - formState, - formRules, - login: handleLogin, - autoLogin: autoLoginRef, - // openLoginVerify: openLoginVerifyRef, - title: globSetting && globSetting.title, - logo, t, - showLocale: locale.show, + prefixCls, + title: computed(() => globSetting?.title ?? ''), + showLocale: localeStore.getShowPicker, }; }, }); </script> <style lang="less"> - @import (reference) '../../../design/index.less'; + @prefix-cls: ~'@{namespace}-login'; + @logo-prefix-cls: ~'@{namespace}-app-logo'; + @countdown-prefix-cls: ~'@{namespace}-countdown-input'; + @dark-bg: #293146; - .login-form__locale { - position: absolute; - top: 14px; - right: 14px; - z-index: 1; + html[data-theme='dark'] { + .@{prefix-cls} { + background: @dark-bg; + + &::before { + background-image: url(/@/assets/svg/login-bg-dark.svg); + } + + .ant-input, + .ant-input-password { + background-color: #232a3b; + } + + .ant-btn:not(.ant-btn-link):not(.ant-btn-primary) { + border: 1px solid #4a5569; + } + + &-form { + background: transparent !important; + } + + .app-iconify { + color: #fff; + } + } } - .login { - position: relative; - height: 100vh; - background: url(../../../assets/images/login/login-bg.png) no-repeat; - background-size: 100% 100%; + .@{prefix-cls} { + overflow: hidden; + @media (max-width: @screen-xl) { + background: #293146; - &-mask { - display: none; - height: 100%; - background: url(../../../assets/images/login/login-in.png) no-repeat; - background-position: 30% 30%; - background-size: 80% 80%; - - .respond-to(xlarge, { display: block;}); + .@{prefix-cls}-form { + background: #fff; + } } - &-form { - position: relative; - bottom: 60px; - width: 400px; - background: @white; - border: 10px solid rgba(255, 255, 255, 0.5); - border-width: 8px; - border-radius: 4px; - background-clip: padding-box; - .respond-to(xlarge, { margin: 0 120px 0 50px}); + &::before { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + margin-left: -48%; + background-image: url(/@/assets/svg/login-bg.svg); + background-position: 100%; + background-repeat: no-repeat; + background-size: auto 100%; + content: ''; + @media (max-width: @screen-xl) { + display: none; + } + } - &-wrap { - position: absolute; - top: 0; - right: 0; + .@{logo-prefix-cls} { + position: absolute; + top: 12px; + height: 30px; + + &__title { + font-size: 16px; + color: #fff; + } + + img { + width: 32px; + } + } + + .container { + .@{logo-prefix-cls} { display: flex; - width: 100%; - height: 100%; - // height: 90%; - justify-content: center; - align-items: center; - .respond-to(xlarge, { - justify-content: flex-end; - }); - } + width: 60%; + height: 80px; - &__content { - position: relative; - width: 100%; - height: 100%; - padding: 60px 0 40px 0; - border: 1px solid #999; - border-radius: 2px; - - header { - display: flex; - justify-content: center; - align-items: center; - - img { - display: inline-block; - width: 48px; - } - - h1 { - margin-bottom: 0; - font-size: 24px; - text-align: center; - } + &__title { + font-size: 24px; + color: #fff; } - form { - width: 80%; + img { + width: 48px; } } } + + &-sign-in-way { + .anticon { + font-size: 22px; + color: #888; + cursor: pointer; + + &:hover { + color: @primary-color; + } + } + } + + input:not([type='checkbox']) { + min-width: 360px; + + @media (max-width: @screen-lg) { + min-width: 300px; + } + + @media (max-width: @screen-md) { + min-width: 280px; + } + + @media (max-width: @screen-sm) { + min-width: 180px; + } + } + .@{countdown-prefix-cls} input { + min-width: unset; + } + + .ant-divider-inner-text { + font-size: 12px; + color: @text-color-secondary; + } } </style> -- Gitblit v1.8.0