Login.vue 6.3 KB
Newer Older
陈文彬 已提交
1
<template>
N
nebv 已提交
2 3 4 5
  <div class="login">
    <div class="login-mask" />
    <div class="login-form-wrap">
      <div class="login-form mx-6">
V
vben 已提交
6
        <AppLocalePicker v-if="showLocale" class="login-form__locale" />
N
nebv 已提交
7 8
        <div class="login-form__content px-2 py-10">
          <header>
V
vben 已提交
9
            <img :src="logo" class="mr-4" />
N
nebv 已提交
10
            <h1>{{ title }}</h1>
陈文彬 已提交
11 12
          </header>

V
vben 已提交
13
          <a-form class="login-form__main" :model="formData" :rules="formRules" ref="formRef">
陈文彬 已提交
14
            <a-form-item name="account">
V
vben 已提交
15
              <a-input size="large" v-model:value="formData.account" placeholder="username: vben" />
陈文彬 已提交
16 17 18 19 20 21
            </a-form-item>
            <a-form-item name="password">
              <a-input-password
                size="large"
                visibilityToggle
                v-model:value="formData.password"
V
vben 已提交
22
                placeholder="password: 123456"
陈文彬 已提交
23 24
              />
            </a-form-item>
25 26 27 28

            <a-row>
              <a-col :span="12">
                <a-form-item>
V
vben 已提交
29
                  <!-- No logic, you need to deal with it yourself -->
V
vben 已提交
30 31 32
                  <a-checkbox v-model:checked="autoLogin" size="small">{{
                    t('sys.login.autoLogin')
                  }}</a-checkbox>
33 34 35 36
                </a-form-item>
              </a-col>
              <a-col :span="12">
                <a-form-item :style="{ 'text-align': 'right' }">
V
vben 已提交
37
                  <!-- No logic, you need to deal with it yourself -->
V
vben 已提交
38
                  <a-button type="link" size="small">{{ t('sys.login.forgetPassword') }}</a-button>
39 40 41
                </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
                @click="login"
                :loading="formState.loading"
V
vben 已提交
50
                >{{ t('sys.login.loginButton') }}</a-button
陈文彬 已提交
51 52 53 54 55 56 57 58 59
              >
            </a-form-item>
          </a-form>
        </div>
      </div>
    </div>
  </div>
</template>
<script lang="ts">
V
vben 已提交
60
  import { defineComponent, reactive, ref, unref, toRaw } from 'vue';
V
vben 已提交
61
  import { Checkbox, Form, Input, Row, Col } from 'ant-design-vue';
62

V
vben 已提交
63
  import { Button } from '/@/components/Button';
V
vben 已提交
64
  import { AppLocalePicker } from '/@/components/Application';
65

陈文彬 已提交
66
  import { userStore } from '/@/store/modules/user';
V
vben 已提交
67

陈文彬 已提交
68
  import { useMessage } from '/@/hooks/web/useMessage';
V
vben 已提交
69
  import { useGlobSetting, useProjectSetting } from '/@/hooks/setting';
V
vben 已提交
70
  import logo from '/@/assets/images/logo.png';
V
vben 已提交
71
  import { useI18n } from '/@/hooks/web/useI18n';
V
vben 已提交
72

陈文彬 已提交
73
  export default defineComponent({
74
    components: {
V
vben 已提交
75 76 77 78 79
      [Checkbox.name]: Checkbox,
      [Form.name]: Form,
      [Form.Item.name]: Form.Item,
      [Input.name]: Input,
      [Input.Password.name]: Input.Password,
80
      AButton: Button,
V
vben 已提交
81
      AppLocalePicker,
V
vben 已提交
82 83
      [Row.name]: Row,
      [Col.name]: Col,
84
    },
陈文彬 已提交
85
    setup() {
86 87 88
      const formRef = ref<any>(null);
      const autoLoginRef = ref(false);

V
vben 已提交
89
      const globSetting = useGlobSetting();
V
vben 已提交
90
      const { locale } = useProjectSetting();
陈文彬 已提交
91
      const { notification } = useMessage();
V
vben 已提交
92
      const { t } = useI18n();
陈文彬 已提交
93 94

      const formData = reactive({
V
vben 已提交
95 96
        account: 'vben',
        password: '123456',
陈文彬 已提交
97
      });
98

陈文彬 已提交
99 100 101 102 103
      const formState = reactive({
        loading: false,
      });

      const formRules = reactive({
V
vben 已提交
104 105 106 107
        account: [{ required: true, message: t('sys.login.accountPlaceholder'), trigger: 'blur' }],
        password: [
          { required: true, message: t('sys.login.passwordPlaceholder'), trigger: 'blur' },
        ],
陈文彬 已提交
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
      });

      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({
V
vben 已提交
124 125
              message: t('sys.login.loginSuccessTitle'),
              description: `${t('sys.login.loginSuccessDesc')}: ${userInfo.realName}`,
陈文彬 已提交
126 127 128 129 130 131 132 133 134 135 136 137 138 139
              duration: 3,
            });
          }
        } catch (error) {
        } finally {
          formState.loading = false;
        }
      }
      return {
        formRef,
        formData,
        formState,
        formRules,
        login: handleLogin,
140
        autoLogin: autoLoginRef,
N
nebv 已提交
141
        title: globSetting && globSetting.title,
V
vben 已提交
142
        logo,
V
vben 已提交
143
        t,
V
vben 已提交
144
        showLocale: locale.show,
陈文彬 已提交
145 146 147 148
      };
    },
  });
</script>
V
vben 已提交
149 150 151 152 153 154 155 156
<style lang="less">
  .login-form__locale {
    position: absolute;
    top: 14px;
    right: 14px;
    z-index: 1;
  }

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

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

170
      .respond-to(xlarge, { display: block;});
陈文彬 已提交
171 172 173
    }

    &-form {
V
vben 已提交
174 175 176
      position: relative;
      bottom: 60px;
      width: 400px;
N
nebv 已提交
177 178
      background: @white;
      border: 10px solid rgba(255, 255, 255, 0.5);
179
      border-width: 8px;
N
nebv 已提交
180 181
      border-radius: 4px;
      background-clip: padding-box;
182
      .respond-to(xlarge, { margin: 0 120px 0 50px});
N
nebv 已提交
183

V
vben 已提交
184 185 186 187
      &__main {
        margin: 30px auto 0 auto !important;
      }

N
nebv 已提交
188 189 190 191 192 193
      &-wrap {
        position: absolute;
        top: 0;
        right: 0;
        display: flex;
        width: 100%;
V
vben 已提交
194 195
        height: 100%;
        // height: 90%;
N
nebv 已提交
196 197
        justify-content: center;
        align-items: center;
V
vben 已提交
198 199
        .respond-to(xlarge, {
        justify-content: flex-end;
200
          });
V
vben 已提交
201 202
      }

N
nebv 已提交
203
      &__content {
V
vben 已提交
204
        position: relative;
N
nebv 已提交
205 206
        width: 100%;
        height: 100%;
V
vben 已提交
207
        padding: 60px 0 40px 0;
N
nebv 已提交
208 209 210 211 212 213 214 215 216 217
        border: 1px solid #999;
        border-radius: 2px;

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

          img {
            display: inline-block;
218
            width: 48px;
N
nebv 已提交
219 220 221 222 223 224 225 226 227 228 229 230 231
          }

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

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