Login.vue 6.4 KB
Newer Older
陈文彬 已提交
1
<template>
N
nebv 已提交
2 3 4 5 6 7
  <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>
V
vben 已提交
8
            <img :src="logo" class="mr-4" />
N
nebv 已提交
9
            <h1>{{ title }}</h1>
陈文彬 已提交
10 11
          </header>

N
nebv 已提交
12
          <a-form class="mx-auto mt-10" :model="formData" :rules="formRules" ref="formRef">
陈文彬 已提交
13
            <a-form-item name="account">
14
              <a-input size="large" v-model:value="formData.account" placeholder="Username: vben" />
陈文彬 已提交
15 16 17 18 19 20
            </a-form-item>
            <a-form-item name="password">
              <a-input-password
                size="large"
                visibilityToggle
                v-model:value="formData.password"
21
                placeholder="Password: 123456"
陈文彬 已提交
22 23
              />
            </a-form-item>
24 25

            <!-- <a-form-item name="verify" v-if="openLoginVerify">
陈文彬 已提交
26
              <BasicDragVerify v-model:value="formData.verify" ref="verifyRef" />
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
            </a-form-item> -->
            <a-row>
              <a-col :span="12">
                <a-form-item>
                  <!-- 未做逻辑,需要自行处理 -->
                  <a-checkbox v-model:checked="autoLogin" size="small">自动登录</a-checkbox>
                </a-form-item>
              </a-col>
              <a-col :span="12">
                <a-form-item :style="{ 'text-align': 'right' }">
                  <!-- 未做逻辑,需要自行处理 -->
                  <a-button type="link" size="small">忘记密码</a-button>
                </a-form-item>
              </a-col>
            </a-row>
陈文彬 已提交
42 43 44 45 46
            <a-form-item>
              <a-button
                type="primary"
                size="large"
                class="rounded-sm"
V
vben 已提交
47
                :block="true"
陈文彬 已提交
48 49 50 51 52 53 54 55 56 57 58 59
                @click="login"
                :loading="formState.loading"
                >登录</a-button
              >
            </a-form-item>
          </a-form>
        </div>
      </div>
    </div>
  </div>
</template>
<script lang="ts">
60 61 62 63 64 65 66 67 68 69 70 71 72
  import {
    defineComponent,
    reactive,
    ref,
    unref,
    toRaw,
    // computed
  } from 'vue';
  import { Checkbox } from 'ant-design-vue';

  import Button from '/@/components/Button/index.vue';
  // import { BasicDragVerify, DragVerifyActionType } from '/@/components/Verify/index';

陈文彬 已提交
73
  import { userStore } from '/@/store/modules/user';
74
  // import { appStore } from '/@/store/modules/app';
陈文彬 已提交
75
  import { useMessage } from '/@/hooks/web/useMessage';
N
nebv 已提交
76
  import { useSetting } from '/@/hooks/core/useSetting';
V
vben 已提交
77
  import logo from '/@/assets/images/logo.png';
V
vben 已提交
78

陈文彬 已提交
79
  export default defineComponent({
80 81 82 83 84
    components: {
      //  BasicDragVerify,
      AButton: Button,
      ACheckbox: Checkbox,
    },
陈文彬 已提交
85
    setup() {
86 87 88 89
      const formRef = ref<any>(null);
      const autoLoginRef = ref(false);
      // const verifyRef = ref<RefInstanceType<DragVerifyActionType>>(null);

N
nebv 已提交
90
      const { globSetting } = useSetting();
陈文彬 已提交
91 92
      const { notification } = useMessage();

93
      // const openLoginVerifyRef = computed(() => appStore.getProjectConfig.openLoginVerify);
陈文彬 已提交
94 95

      const formData = reactive({
V
vben 已提交
96 97
        account: 'vben',
        password: '123456',
98
        // verify: undefined,
陈文彬 已提交
99 100 101 102 103 104 105 106
      });
      const formState = reactive({
        loading: false,
      });

      const formRules = reactive({
        account: [{ required: true, message: '请输入账号', trigger: 'blur' }],
        password: [{ required: true, message: '请输入密码', trigger: 'blur' }],
107
        // verify: unref(openLoginVerifyRef) ? [{ required: true, message: '请通过验证码校验' }] : [],
陈文彬 已提交
108 109
      });

110 111 112 113 114 115
      // function resetVerify() {
      //   const verify = unref(verifyRef);
      //   if (!verify) return;
      //   formData.verify && verify.$.resume();
      //   formData.verify = undefined;
      // }
陈文彬 已提交
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137

      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 {
138
          // resetVerify();
陈文彬 已提交
139 140 141 142 143 144
          formState.loading = false;
        }
      }

      return {
        formRef,
145
        // verifyRef,
陈文彬 已提交
146 147 148 149
        formData,
        formState,
        formRules,
        login: handleLogin,
150 151
        autoLogin: autoLoginRef,
        // openLoginVerify: openLoginVerifyRef,
N
nebv 已提交
152
        title: globSetting && globSetting.title,
V
vben 已提交
153
        logo,
陈文彬 已提交
154 155 156 157 158
      };
    },
  });
</script>
<style lang="less" scoped>
N
nebv 已提交
159 160
  @import (reference) '../../../design/index.less';

陈文彬 已提交
161
  .login {
N
nebv 已提交
162 163
    position: relative;
    height: 100vh;
陈文彬 已提交
164 165 166 167
    background: url(../../../assets/images/login/login-bg.png) no-repeat;
    background-size: 100% 100%;

    &-mask {
N
nebv 已提交
168 169
      display: none;
      height: 100%;
陈文彬 已提交
170
      background: url(../../../assets/images/login/login-in.png) no-repeat;
V
vben 已提交
171
      background-position: 30% 30%;
172
      background-size: 80% 80%;
N
nebv 已提交
173

174
      .respond-to(xlarge, { display: block;});
陈文彬 已提交
175 176 177
    }

    &-form {
178
      width: 520px;
N
nebv 已提交
179 180
      background: @white;
      border: 10px solid rgba(255, 255, 255, 0.5);
181
      border-width: 8px;
N
nebv 已提交
182 183
      border-radius: 4px;
      background-clip: padding-box;
184
      .respond-to(xlarge, { margin: 0 120px 0 50px});
N
nebv 已提交
185 186 187 188 189 190 191

      &-wrap {
        position: absolute;
        top: 0;
        right: 0;
        display: flex;
        width: 100%;
192
        height: 90%;
N
nebv 已提交
193 194
        justify-content: center;
        align-items: center;
195
        .respond-to(large, {
196
          width: 600px;
V
vben 已提交
197
          right: calc(50% - 270px);
198
          });
V
vben 已提交
199
        .respond-to(xlarge, { width: 540px; right:0});
N
nebv 已提交
200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
      }

      &__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;
215
            width: 48px;
N
nebv 已提交
216 217 218 219 220
          }

          h1 {
            margin-bottom: 0;
            font-size: 24px;
221
            // color: @primary-color;
N
nebv 已提交
222 223 224 225 226 227 228 229
            text-align: center;
          }
        }

        form {
          width: 80%;
        }
      }
陈文彬 已提交
230 231 232
    }
  }
</style>