<!--
 * @Author: your name
 * @Date: 2021-10-14 17:17:53
 * @LastEditTime: 2022-03-02 10:48:32
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \Foshan4A\src\App.vue
-->
<template>
  <div id="app">
    <!--全局休眠弹框-->
    <Dialog :flag="dialog" customClass="dormancyDialog" width="496px">
      <div class="dormancy">
        <div class="title">系统休眠,请输入密码解锁</div>
        <div class="content">
          <el-form @submit.native.prevent ref="form" :rules="rules" :model="form">
            <el-form-item prop="pwd">
              <el-input show-password placeholder="请输入密码" tabindex="1" @keyup.enter.native="onSubmit('form')" v-model="form.pwd"></el-input>
            </el-form-item>
            <div v-if="Number(errorNum) >= 2" class="flex-wrap">
              <el-form-item class="flex1" prop="identify">
                <el-input ref="identify" v-model.trim="form.identify" @keyup.enter.native="onSubmit('form')" placeholder="请输入验证码" name="identify" tabindex="1" />
              </el-form-item>
              <Identify @changeCode="changeCode" :identifyCode="form.CheckCode" :contentHeight="48" style="margin-left: 24px" />
            </div>
            <el-form-item>
              <el-button :loading="loading" style="line-height: normal" type="primary" class="button-public-shadow onSubmit" @click="onSubmit('form')">
                确定
              </el-button>
            </el-form-item>
          </el-form>
        </div>
      </div>
    </Dialog>
    <!--路由出口-->
    <router-view />
  </div>
</template>

<script>
import Dialog from "@/layout/components/Dialog/index.vue";
import Identify from "./views/login/identify.vue";
import { mapGetters } from "vuex";
import { SsoLogin } from "@/api/apiHome";
import { GetSSOCheckCode } from "@/api/login";
import { getCodeToken } from "@/utils/auth";
export default {
  name: "App",
  components: {
    Dialog,
    Identify,
  },
  data () {
    return {
      arr: [], //鼠标移动screenX值数组
      arrLen: [], //一段时间后上报的screenX值数组
      timer: null, //定时器
      time: null, //定时器时间 1=1S
      desc: null, //固定的定时器时间/和time保持一致
      form: {
        //表单数据
        pwd: "",
        identify: "",
        CheckCode: "",
      },
      rules: {
        //表单验证
        pwd: [{ required: true, message: "请输入密码", trigger: "blur" }],
      },
      flag: false,
      loading: false,
    };
  },
  computed: {
    ...mapGetters([
      "dialog",
      "token",
      "name",
      "systemSet",
      "roles",
      "errorNum",
    ]),
  },
  watch: {
    "$store.state.user.token": {
      handler (val) {
        if (val) {
          this.handleInit();
        } else {
          this.clearAll();
        }
      },
      deep: true,
    },
    $route: {
      handler () {
        this.$store.dispatch("auth/changeAuthMsg", []);
        this.$store.dispatch("auth/changeAuthArrs", []);
        this.$store.dispatch("auth/changeAuthList", []);
        this.$store.dispatch("auth/changeAuthId", null);
      },
      deep: true,
    },
  },
  mounted () {
    const num = Number(this.errorNum);
    if (this.dialog && num >= 2) {
      // this.flag = true;
      this.getCheckCode();
    }
    this.beforeUnload();
  },
  beforeDestroy () {
    //结束定时器和释放timer
    this.clearAll();
  },
  methods: {
    // 初始化
    handleInit () {
      this.handleMove();
      if (!this.dialog) {
        this.handleTimer();
      }
    },
    /**
     * @description: 清除页面定时器和监听
     * @param {*}
     * @return {*}
     */
    clearAll () {
      clearInterval(this.timer);
      this.timer = null;
      this.time = null;
      this.desc = null;
      this.arr = [];
      this.arrLen = [];
      this.handleRmove();
      sessionStorage.setItem("token", "");
    },
    // 页面刷新 重新启用方法
    beforeUnload () {
      window.addEventListener("beforeunload", () => {
        if (this.token) {
          sessionStorage.setItem("token", this.token);
        }
      });
      let oldViews = sessionStorage.getItem("token") || "";
      if (oldViews) {
        this.handleInit();
      }
    },
    /**
     * @description: 定时器方法
     * @param {*}
     * @return {*}
     */
    handleTimer () {
      const obj =
        typeof this.systemSet === "string"
          ? JSON.parse(this.systemSet)
          : this.systemSet;
      const { LockMins } = obj;
      this.time = LockMins * 60;
      this.desc = LockMins * 60;
      this.timer = setInterval(() => {
        this.time--;
        if (this.time === 0) {
          const result = this.arrLen;
          const rut = this.arr;
          result.push(rut.length);
          if (result.length >= 2) {
            if (result[result.length - 2] === result[result.length - 1]) {
              // 相同时 结束倒计时
              this.$store.dispatch("app/toggleDialog", true);
              this.getCheckCode();
              this.clearAll();
            } else {
              this.time = this.desc;
            }
          } else {
            this.time = this.desc;
          }
        }
      }, 1000);
    },
    /**
     * @description: 监听鼠标移动方法/防抖
     * @param {*}
     * @return {*}
     */
    handleMove () {
      window.addEventListener(
        "mousemove",
        _.debounce(this.handleDebounce, 100)
      );
    },
    /**
     * @description: 移除鼠标移动监听
     * @param {*}
     * @return {*}
     */
    handleRmove () {
      window.removeEventListener("mousemove", () => {
        this.arr = [];
      });
    },
    /**
     * @description: 防抖方法
     * @param {*} e
     * @return {*}
     */
    handleDebounce (e) {
      const screenX = e.screenX;
      this.arr.push(screenX);
    },
    /**
     * @description: 提交
     * @param {*}
     * @return {*}
     */
    onSubmit (formName) {
      this.$refs[formName].validate((valid) => {
        if (valid) {
          this.ssoLogin();
        } else {
          return false;
        }
      });
    },
    //锁屏验证
    async ssoLogin () {
      try {
        this.loading = true;
        const obj = {
          LoginName: this.name,
          LoginPwd: this.form.pwd,
          token: getCodeToken(),
          userType: sessionStorage.getItem('UserType')
        };
        if (Number(this.errorNum) >= 2) {
          obj.CheckCode = this.form.identify;
        }
        const res = await SsoLogin(obj);
        if (res.code === 0) {
          this.$store.dispatch("app/toggleDialog", false);
          this.$store.dispatch("app/getErrorNum", 0);
          this.arr = [];
          this.arrLen = [];
          this.time = this.desc;
          this.form.pwd = "";
          this.form.identify = "";
          this.form.CheckCode = "";
          this.handleTimer();
          this.loading = false;
        } else {
          const num = Number(res.returnData);
          this.form.identify = '';
          this.$store.dispatch("app/getErrorNum", num);
          if (num >= 2) {
            this.getCheckCode();
          }
          if (num >= 5) {
            await this.$store.dispatch("user/logout");
            this.$store.dispatch("app/getErrorNum", 0);
            this.clearAll();
            this.$store.dispatch("app/toggleDialog", false);
            this.$router.push(`/login?redirect=${this.$route.fullPath}`);
            location.reload();
          }
          this.$message.error(res.message);
          this.loading = false;
        }
      } catch (error) {
        console.log(error);
        this.loading = false;
      }
    },
    //验证码重新获取
    changeCode () {
      this.getCheckCode();
    },
    //获取动态验证码
    async getCheckCode () {
      const res = await GetSSOCheckCode({
        token: getCodeToken()
      });
      if (res.code === 0) {
        this.form.CheckCode = res.returnData;
      } else {
        this.$message.error(res.message);
      }
    },
  },
};
</script>

<style lang="scss" scoped>
::v-deep .dormancyDialog {
  .el-input__inner {
    height: 48px;
    line-height: 48px;
    background: #f5f7fa;
    border: 1px solid #ebeef5;
    border-radius: 6px;
  }
  .onSubmit {
    margin-top: 10px;
  }
}
</style>