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
            <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
                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"
V
vben 已提交
32
                :block="true"
陈文彬 已提交
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
                @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 已提交
50
  import { useSetting } from '/@/hooks/core/useSetting';
V
vben 已提交
51 52
  import Button from '/@/components/Button/index.vue';

陈文彬 已提交
53
  export default defineComponent({
V
vben 已提交
54
    components: { BasicDragVerify, AButton: Button },
陈文彬 已提交
55
    setup() {
N
nebv 已提交
56
      const { globSetting } = useSetting();
陈文彬 已提交
57 58 59 60 61 62 63
      const { notification } = useMessage();
      const formRef = ref<any>(null);
      const verifyRef = ref<RefInstanceType<DragVerifyActionType>>(null);

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

      const formData = reactive({
V
vben 已提交
64 65
        account: 'vben',
        password: '123456',
陈文彬 已提交
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 118
        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 已提交
119
        title: globSetting && globSetting.title,
陈文彬 已提交
120 121 122 123 124
      };
    },
  });
</script>
<style lang="less" scoped>
N
nebv 已提交
125 126
  @import (reference) '../../../design/index.less';

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

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

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

    &-form {
N
nebv 已提交
143 144 145
      width: 100%;
      background: @white;
      border: 10px solid rgba(255, 255, 255, 0.5);
陈文彬 已提交
146
      border-width: 10px;
N
nebv 已提交
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 176
      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;
177
            width: 80px;
N
nebv 已提交
178 179 180 181 182 183 184 185 186 187 188 189 190 191
          }

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

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