login.vue 6.36 KB
<template>
  <div class="login">
    <div class="title w80" style="padding-top: 20px;">
      <img src="/src/assets/images/login_title.png" alt="">
    </div>
    <div class="login-box">
      
      <div class="content clearfix">
        <div class="banner_wrap">
          <div class="banner_title">
            <span>金融数智服务平台</span>
            <div>数据驱动智能管理,赋能机构智慧决策。</div>
          </div>
          <img class="banner" src="/src/assets/images/login_bg.png" alt="banner" />
        </div>
        <div class="login-form">
          <div class="form-title">登录</div>
          <el-form ref="ruleFormRef" :model="state.loginForm" :rules="rules" @keyup.enter="submitForm" label-position="top">
            <el-form-item prop="loginName" label="账号">
              <el-input v-model.trim="state.loginForm.loginName" maxlength="20" placeholder="请输入账号" size="large">
                <template #prefix>
                  <el-icon><User /></el-icon>
                </template>
              </el-input>
            </el-form-item>
            <el-form-item prop="password" label="密码">
              <el-input v-model.trim="state.loginForm.password" type="password" maxlength="20" placeholder="请输入密码" show-password size="large">
                <template #prefix>
                  <el-icon><Lock /></el-icon>
                </template>
              </el-input>
            </el-form-item>
            <el-form-item prop="code" label="验证码">
              <el-input v-model.trim="state.loginForm.code" maxlength="6" placeholder="请输入验证码" size="large">
                <template #prefix>
                  <el-icon><Message /></el-icon>
                </template>
                <template #suffix>
                  <img class="code" :src="state.captchaImage" v-debounceClick="()=>getCode()" alt="" />
                </template>
              </el-input>
            </el-form-item>
          </el-form>
          <div style="padding-top: 50px">
            <el-button style="width: 100%" type="primary" :loading="state['isLogin']" @click="submitForm('isLogin')" size="large">登 录</el-button>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script setup lang="ts">
import getImage from "./../assets/getImage";
import * as api from "./../interface/api";
import {setToken} from "./../utils/auth";
import router from "./../router";
import { loginMain } from './../store/index'
let loginAct = loginMain()

let state: any = reactive({
  loginForm: {
    loginName: undefined,
    password: undefined,
    code: undefined,
    uuid: ''
  },
  captchaImage: ""
})

let rules = reactive<FormRules>({
  loginName: [{ required: true, message: "请输入账号", trigger: ["blur",'change'] }],
  password: [{ required: true, message: "请输入密码", trigger: ["blur",'change'] }],
  code: [{ required: true, message: "请输入验证码", trigger: ["blur",'change'] }],
})

let getCode = () => {
  // state.captchaImage = '/api/web/web_verifyCodeFrontController/web_getImage.form?mathRandom=' + Math.random();
  api.getInfoList({}, '/captchaImage').then((res: any)=> {
    console.log(res)
    let captchaEnabled = res.captchaEnabled === undefined ? true : res.captchaEnabled;
    if (captchaEnabled) {
      state.loginForm.uuid = res.uuid;
      state.captchaImage = "data:image/gif;base64," + res.img;
    }
  })
}

let ruleFormRef = ref(null)
let submitForm = (status: string) => {
  ruleFormRef.value.validate((valid: boolean, fields: Object)=> {
    if (valid) {
      state[status] = true
      api.userLogin(state.loginForm).then((res: any)=> {
        if (res.code !== 200 ) {
          ElMessage.error(res.msg)
          getCode()
          return
        }
        setToken(res.data.token)
        let userInfoData = res.data
        // let userInfo = {userId: userInfoData.id, loginName: userInfoData.loginName, loginTimes: userInfoData.loginTimes, mail: userInfoData.mail}
        loginAct.setUserInfo(userInfoData)
        ElMessage.success("登录成功")
        router.push("/")
      }).finally(()=> {
        state[status] = false
      })
    }
  })
}

onMounted(()=> {
  getCode()
})

</script>

<style scoped lang="scss">
.login {
  position: absolute;
  width: 100%;
  height: 100%;
  background-image: url('./../assets/images/login_bgs.png');
  background-size: 100% 100%;
  min-height: 880px;
  overflow-y: hidden;
  .login-box {
    width: 1300px;
    margin: 50px auto 0;
    position: relative;
    .title {
      font-size: 32px;
      font-weight: 600;
      color: #3958e1;
      width: 100%;
      margin: 0 auto;
      position: absolute;
      z-index: 100;
      top: -7%;
      left: -28%;
    }
    .content {
      display: flex;
      width: 100%;
      margin: 0 auto;
      justify-content: space-between;
      .banner_wrap {
        position: relative;
        .banner_title {
          color: #222222;
          position: absolute;
          top: 60px;
          left: 60px;
          font-size: 36px;
          position: relative;
          z-index: 10;
          margin-left: 45px;
          span {
            font-family: PingFang-SC, PingFang-SC;
            font-weight: 800;
            font-size: 46px;
            color: #333333;
            line-height: 65px;
          }
          div {
            font-family: PingFangSC, PingFang SC;
            font-weight: 400;
            font-size: 26px;
            color: #999999;
            line-height: 37px;
          }
        }
        .banner {
          position: absolute;
          // width: 650px;
          left: 0px;
          bottom: -35px;
        }
      }

      .login-form {
        position: relative;
        width: 532px;
        text-align: center;
        box-sizing: border-box;
        padding: 100px 100px 150px;
        background-image: url('./../assets/images/login_item_bg.png');
        background-size: 100% 100%;
        border-radius: 10px;
        margin-top: 50px;
        margin-right: 30px;
        .form-title {
          font-size: 24px;
          font-weight: 600;
          color: #409EFF;
          text-align: left;
          padding-bottom: 23px;
        }

        img {
          width: 20px;
          height: 20px;
        }
        img.code {
          width: 120px;
          height: 34px;
          cursor: pointer;
        }
      }
    }
  }
}
:deep(.el-form-item--label-top .el-form-item__label) {
  width: 100% !important;
}
</style>