login.vue 7.13 KB
<template>
  <div class="login">
    <el-form
      ref="loginForm"
      :model="loginForm"
      :rules="loginRules"
      class="login-form"
    >
      <div class="title-container">
        <h3 class="title">
          {{ $t('login.title') }}
        </h3>
        <lang-select class="set-language"/>
      </div>
      <el-form-item prop="username">
        <el-input
          v-model="loginForm.username"
          type="text"
          auto-complete="off"
          :placeholder="$t('login.username')"
          @input="getWare"
        >
          <svg-icon
            slot="prefix"
            icon-class="user"
            class="el-input__icon input-icon"
          />
        </el-input>
      </el-form-item>
      <el-form-item prop="password">
        <el-input
          v-model="loginForm.password"
          type="password"
          auto-complete="off"
          :placeholder="$t('login.password')"
          @keyup.enter.native="handleLogin"
        >
          <svg-icon
            slot="prefix"
            icon-class="password"
            class="el-input__icon input-icon"
          />
        </el-input>
      </el-form-item>
      <el-form-item prop="warehouseCode">
        <el-select
          v-model="loginForm.warehouseCode"
          :placeholder="$t('login.warehouse')"
          style="width: 100%"
          @change="getWarehouseCode"
        >
          <el-option
            v-for="item in wareOptions"
            :key="item.code"
            :label="item.name"
            :value="item.code"
          />
          <svg-icon
            slot="prefix"
            icon-class="ware-house"
            class="el-input__icon input-icon"
          />
        </el-select>
      </el-form-item>
      <el-checkbox
        v-model="loginForm.rememberMe"
        style="margin: 0px 0px 25px 0px"
      >{{ $t('login.remember') }}
      </el-checkbox
      >
      <el-form-item style="width: 100%">
        <el-button
          :loading="loading"
          size="medium"
          type="primary"
          style="width: 100%"
          @click.native.prevent="handleLogin"
        >
          <span v-if="!loading">{{ $t('login.logIn') }}</span>
          <span v-else>{{ $t('login.loggingIn') }}</span>
        </el-button>
      </el-form-item>
    </el-form>
    <!--  底部  -->
    <div class="el-login-footer">
      <span
      >Copyright © 2018 长沙华恒机器人系统有限公司 All Rights Reserved.</span
      >
    </div>
  </div>
</template>

<script>
  import LangSelect from '@/components/LangSelect'
  import {getWareHouse} from "@/api/login";
  import Cookies from "js-cookie";
  import {encrypt, decrypt} from "@/utils/jsencrypt";

  export default {
    name: "Login",
    components: {LangSelect},
    data() {
      var validateWarehouse = (rule, value, callback) => {
        if (value === "") {
          callback(new Error("仓库不能为空"));
        } else {
          callback();
        }
      };
      return {
        address: 'localhost',
        flag: false,
        wareOptions: [],
        loginForm: {
          username: "admin",
          password: "admin123",
          warehouseCode: "",
          rememberMe: false,
        },
        loginRules: {
          username: [
            {
              required: true,
              trigger: ["blur", "change"],
              message: "用户名不能为空",
            },
          ],
          password: [
            {
              required: true,
              trigger: ["blur", "change"],
              message: "密码不能为空",
            },
          ],
          warehouseCode: [
            {
              required: true,
              trigger: ["blur", "change"],
              validator: validateWarehouse,
            },
          ],
        },
        loading: false,
        redirect: undefined,
        warehouseValue: "",
      };
    },
    watch: {
      $route: {
        handler: function (route) {
          this.redirect = route.query && route.query.redirect;
        },
        immediate: true,
      },
    },
    created() {
      this.getWare();
      this.getCookie();
    },
    methods: {
      showConfigIP() {
        this.flag = !this.flag
      },
      getWare() {
        getWareHouse(this.loginForm.username).then((response) => {
          this.wareOptions = response.data;
          if (response.data.length > 0) {
            this.loginForm.warehouseCode = response.data[0].code;
          } else {
            this.loginForm.warehouseCode = "";
          }

        });
      },
      getWarehouseCode(code) {
        this.$forceUpdate();
      },

      getCookie() {
        const username = Cookies.get("username");
        const password = Cookies.get("password");
        const rememberMe = Cookies.get("rememberMe");
        this.loginForm = {
          username: username === undefined ? this.loginForm.username : username,
          password:
            password === undefined ? this.loginForm.password : decrypt(password),
          rememberMe: rememberMe === undefined ? false : Boolean(rememberMe),
        };
      },
      handleLogin() {
          this.$refs.loginForm.validate((valid) => {
            if (valid) {
              this.loading = true;
              if (this.loginForm.rememberMe) {
                Cookies.set("username", this.loginForm.username, {expires: 30});
                Cookies.set("password", encrypt(this.loginForm.password), {
                  expires: 30,
                });
                Cookies.set("rememberMe", this.loginForm.rememberMe, {
                  expires: 30,
                });
              } else {
                Cookies.remove("username");
                Cookies.remove("password");
                Cookies.remove("rememberMe");
              }
              this.$store
                .dispatch("user/Login", this.loginForm)
                .then(() => {
                  this.$router.push({path: this.redirect || "/"});
                })
                .catch(() => {
                  this.loading = false;
                });
            }
          });
      },
    },
  };
</script>

<style rel="stylesheet/scss" lang="scss">
  .login {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100%;
    background-image: url("../assets/image/login-background.jpg");
    background-size: cover;
  }

  .title {
    margin: 0px auto 30px auto;
    text-align: center;
    color: #707070;
  }

  .login-form {
    border-radius: 6px;
    background: #ffffff;
    width: 400px;
    padding: 25px 25px 5px 25px;

    .el-input {
      height: 38px;

      input {
        height: 38px;
      }
    }

    .input-icon {
      height: 39px;
      width: 14px;
      margin-left: 2px;
    }

    .title-container {
      position: relative;

      .set-language {
        position: absolute;
        top: 0px;
        font-size: 18px;
        right: 0px;
        cursor: pointer;
      }
    }
  }

  .login-tip {
    font-size: 13px;
    text-align: center;
    color: #bfbfbf;
  }

  .el-login-footer {
    height: 40px;
    line-height: 40px;
    position: fixed;
    bottom: 0;
    width: 100%;
    text-align: center;
    color: #fff;
    font-family: Arial;
    font-size: 12px;
    letter-spacing: 1px;
  }
</style>