Login.vue 5.4 KB
Newer Older
陈文彬 已提交
1
<template>
N
nebv 已提交
2 3 4 5 6 7 8 9
  <div class="login">
    <div class="login-mask" />
    <div class="login-form-wrap">
      <div class="login-form mx-6">
        <div class="login-form__content px-2 py-10">
          <header>
            <img src="/@/assets/images/logo.png" class="mr-4" />
            <h1>{{ title }}</h1>
陈文彬 已提交
10 11
          </header>

N
nebv 已提交
12
          <a-form class="mx-auto mt-10" :model="formData" :rules="formRules" ref="formRef">
陈文彬 已提交
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
            <a-form-item name="account">
              <a-input size="large" v-model:value="formData.account" placeholder="vben" />
            </a-form-item>
            <a-form-item name="password">
              <a-input-password
                autofocus="autofocus"
                size="large"
                visibilityToggle
                v-model:value="formData.password"
                placeholder="123456"
              />
            </a-form-item>
            <a-form-item name="verify" v-if="openLoginVerify">
              <BasicDragVerify v-model:value="formData.verify" ref="verifyRef" />
            </a-form-item>
            <a-form-item>
              <a-button
                type="primary"
                size="large"
                class="rounded-sm"
                block
                @click="login"
                :loading="formState.loading"
                >登录</a-button
              >
            </a-form-item>
          </a-form>
        </div>
      </div>
    </div>
  </div>
</template>
<script lang="ts">
  import { defineComponent, reactive, ref, unref, toRaw, computed } from 'vue';
  import { BasicDragVerify, DragVerifyActionType } from '/@/components/Verify/index';
  import { userStore } from '/@/store/modules/user';
  import { appStore } from '/@/store/modules/app';
  import { useMessage } from '/@/hooks/web/useMessage';
N
nebv 已提交
51
  import { useSetting } from '/@/hooks/core/useSetting';
陈文彬 已提交
52 53 54
  export default defineComponent({
    components: { BasicDragVerify },
    setup() {
N
nebv 已提交
55
      const { globSetting } = useSetting();
陈文彬 已提交
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
      const { notification } = useMessage();
      const formRef = ref<any>(null);
      const verifyRef = ref<RefInstanceType<DragVerifyActionType>>(null);

      const openLoginVerifyRef = computed(() => appStore.getProjectConfig.openLoginVerify);

      const formData = reactive({
        account: '',
        password: '',
        verify: undefined,
      });
      const formState = reactive({
        loading: false,
      });

      const formRules = reactive({
        account: [{ required: true, message: '请输入账号', trigger: 'blur' }],
        password: [{ required: true, message: '请输入密码', 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: '登录成功',
              description: `欢迎回来: ${userInfo.realName}`,
              duration: 3,
            });
          }
        } catch (error) {
        } finally {
          resetVerify();
          formState.loading = false;
        }
      }

      return {
        formRef,
        verifyRef,
        formData,
        formState,
        formRules,
        login: handleLogin,
        openLoginVerify: openLoginVerifyRef,
N
nebv 已提交
118
        title: globSetting && globSetting.title,
陈文彬 已提交
119 120 121 122 123
      };
    },
  });
</script>
<style lang="less" scoped>
N
nebv 已提交
124 125
  @import (reference) '../../../design/index.less';

陈文彬 已提交
126
  .login {
N
nebv 已提交
127 128
    position: relative;
    height: 100vh;
陈文彬 已提交
129 130 131 132
    background: url(../../../assets/images/login/login-bg.png) no-repeat;
    background-size: 100% 100%;

    &-mask {
N
nebv 已提交
133 134
      display: none;
      height: 100%;
陈文彬 已提交
135 136
      background: url(../../../assets/images/login/login-in.png) no-repeat;
      background-size: 100% 100%;
N
nebv 已提交
137 138

      .respond-to(large, { display: block;});
陈文彬 已提交
139 140 141
    }

    &-form {
N
nebv 已提交
142 143 144
      width: 100%;
      background: @white;
      border: 10px solid rgba(255, 255, 255, 0.5);
陈文彬 已提交
145
      border-width: 10px;
N
nebv 已提交
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
      border-radius: 4px;
      background-clip: padding-box;
      .respond-to(xlarge, { margin: 0 56px});

      &-wrap {
        position: absolute;
        top: 0;
        right: 0;
        display: flex;
        width: 100%;
        height: 100%;
        justify-content: center;
        align-items: center;
        .respond-to(large, { width: 40%;});
        .respond-to(xlarge, { width: 33.3%;});
      }

      &__content {
        width: 100%;
        height: 100%;
        border: 1px solid #999;
        border-radius: 2px;

        header {
          display: flex;
          justify-content: center;
          align-items: center;

          img {
            display: inline-block;
176
            width: 80px;
N
nebv 已提交
177 178 179 180 181 182 183 184 185 186 187 188 189 190
          }

          h1 {
            margin-bottom: 0;
            font-size: 24px;
            color: @primary-color;
            text-align: center;
          }
        }

        form {
          width: 80%;
        }
      }
陈文彬 已提交
191 192 193
    }
  }
</style>