Login.vue 5.5 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
      background: url(../../../assets/images/login/login-in.png) no-repeat;
137 138
      background-position: 50% 30%;
      background-size: 80% 80%;
N
nebv 已提交
139

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

    &-form {
N
nebv 已提交
144 145 146
      width: 100%;
      background: @white;
      border: 10px solid rgba(255, 255, 255, 0.5);
147
      border-width: 8px;
N
nebv 已提交
148 149 150 151 152 153 154 155 156 157 158 159 160
      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;
161 162 163 164 165
        .respond-to(large, {
          width: 520px;
          right: calc(50% - 260px);
          });
        .respond-to(xlarge, { width: 520px; right:0});
N
nebv 已提交
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
      }

      &__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;
181
            width: 64px;
N
nebv 已提交
182 183 184 185 186 187 188 189 190 191 192 193 194 195
          }

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

        form {
          width: 80%;
        }
      }
陈文彬 已提交
196 197 198
    }
  }
</style>