zzzz
2024-04-09 19061b17591c3a2310348033eb51194f5a9a4527
src/page/login/login.vue
@@ -1,183 +1,228 @@
<template>
  <div class="login_page">
    <headers :mess="loginWay" />
    <!-- <div class="img_mess">
      <div class="logo_content animated fadeInRight">
        <img :src="Logo" alt />
      </div>
    </div> -->
    <headers />
    <div class="login_title animated slideInDown">
      <span>{{ $t("登錄賬號") }}</span>
    </div>
    <div class="logins_content">
      <div class="login_title animated slideInDown">
        <span>{{ '手机号登录' }}</span>
      </div>
      <div class="login_forms">
        <div class="top_forms">
          <!-- <div class="user_name">
            <input type="text" :placeholder="placeholder" v-model="userName" />
          </div>
          <div class="password">
            <input type="password"  placeholder="登录密码" v-model="userPassword" @input="handleInput()" />
          </div> -->
          <el-input placeholder="请输入手机号" :size="medium" v-model="userName" clearable>
          <el-input
            :placeholder="$t('hj9')"
            :size="medium"
            maxlength="11"
            v-model="userName"
            clearable
          >
          </el-input>
          <el-input style="margin-top: 0.46rem;" show-password placeholder="登录密码" :size="medium" v-model="userPassword"   @input="handleInput()">
          <el-input
            style="margin-top: 0.46rem"
            show-password
            :placeholder="$t('hj10')"
            :size="medium"
            v-model="userPassword"
            @input="handleInput()"
          >
          </el-input>
        </div>
        <div class="bottom_btns" :class="btnClass ? 'on' : 'off'" >
          <div class="top_btn " @click="loginIN" :class="dengl ? 'animated pulse' : ''">
            <span>{{ '安全登录' }}</span>
          </div>
          <div class="mes" @click="getApp()">
            <span>{{ '忘记密码?' }}</span>
        <div class="bottom_btns">
          <van-button
            type="info"
            :disabled="!btnClass"
            class="butn"
            @click="loginIN"
            >{{ $t("立即登录") }}</van-button
          >
          <div class="password-operate" data-v-8cc76a7b="">
            <div class="forget" data-v-8cc76a7b="" @click="getApp()">
              {{ $t("hj12") }}
            </div>
            <div class="remember" data-v-8cc76a7b="">
              <van-checkbox @change="checkboxChange" v-model="checked">{{
                $t("記住帳戶密碼")
              }}</van-checkbox>
            </div>
          </div>
        </div>
      </div>
    </div>
    <div class="login_bom">
        <div class="line">
          <div class="left_line"></div>
          <div class="center_line">
            <span>{{ '其他登录方式' }}</span>
          </div>
          <div class="right_line"></div>
      <div class="register" data-v-8cc76a7b="">
        {{ $t("還沒賬號?")
        }}<span
          @click="$router.push('/register')"
          data-v-8cc76a7b=""
          style="color: rgb(5, 106, 239)"
          >{{ $t("免費註冊") }}</span
        >
      </div>
      <div class="imgDemo">
        <div class="appImg" @click="getApp()"><img src="@/assets/img/apple.png"/></div>
        <div class="appImg" @click="getApp()"><img src="@/assets/img/google.png"/></div>
        <div class="appImg" @click="getApp()"><img src="@/assets/img/facebook.png"/></div>
      </div>
      <div class="myzh"><span class="mes">没有账户?</span><span @click="$router.push('/register')"  class="mes" style="color: rgb(54,124,248);">{{ '注册' }}</span> </div>
    </div>
    <el-alert
    v-show="alertShow"
    :closable="closable"
    :title="texts"
    type="warning" center></el-alert>
  </div>
</template>
<script>
import { Toast } from 'mint-ui'
import headers from "./components/header.vue";
import Logo from "@/assets/img/LOGO2.png";
import * as api from '@/axios/api';
import * as api from "@/axios/api";
import { Notify } from "vant";
import { mapActions, mapMutations } from "vuex";
export default {
  name: "newLogin",
  data() {
    return {
      loginWay: "手机号登录",
      checked: false,
      loginWay: this.$t("hj8"),
      currentLoginMode: "email",
      placeholder: "电子邮箱",
      Logo,
      placeholder: this.$t("hj16"),
      userPassword: "",
      userName: "",
      btnClass: false,
      medium: "medium",
      alertShow:false,
      closable:false,
      texts:"",
      dengl:false,
      loginBtn:false,
    };
  },
  components: {
    headers
    headers,
  },
  mounted() {
    const ret = window.localStorage.getItem("login_admin");
    this.checked = window.localStorage.getItem("login_checked") === "true";
    if (ret && this.checked) {
      this.userPassword = JSON.parse(ret).userPassword;
      this.userName = JSON.parse(ret).phone;
      this.btnClass = true;
    }
  },
  methods: {
    getApp(){
     // Toast('您所在的地区暂未开通此服务')
    ...mapActions(["setUseInfo"]),
    ...mapMutations(["undataToken"]),
    checkboxChange(e) {
      window.localStorage.setItem("login_checked", e);
    },
    getApp() {
      // Toast('您所在的地区暂未开通此服务')
      //Toast 弹窗大小
      this.texts="您所在的地区暂未开通此服务"
      this.alertShow=true
      setTimeout(()=>{
        this.alertShow=false
      },2000)
      Notify({ type: "warning", message: this.$t("hj17") });
    },
    handleInput() {
      console.log(this.userPassword !== "" && this.userName !== '');
      if (this.userPassword !== "" && this.userName !== '') {
      if (this.userPassword !== "" && this.userName !== "") {
        this.btnClass = true;
      } else {
        this.btnClass = false;
      }
    },
    async loginIN() {
      this.dengl=true
      setTimeout(()=>{
        this.dengl=false
      },1000)
      if(this.loginBtn){
        return;
      }
      this.loginBtn = true;
      let opts = {
        phone: this.userName,
        userPwd: this.userPassword
      }
      let data = await api.login(opts)
        userPwd: this.userPassword,
      };
      let data = await api.login(opts);
      if (data.status === 0) {
        this.$store.state.userInfo.phone = this.userName
        this.$store.state.userInfo.token = data.data.token
        window.localStorage.clear()
        this.setUseInfo();
        if (this.checked) {
          window.localStorage.setItem(
            "login_admin",
            JSON.stringify({
              phone: this.userName,
              userPassword: this.userPassword,
            })
          );
        } else {
          window.localStorage.setItem("login_admin", "");
        }
        this.$store.state.userInfo.phone = this.userName;
        this.$store.state.userInfo.token = data.data.token;
        this.undataToken(data.data.token);
        window.localStorage.setItem("USERTOKEN", data.data.token);
        this.$router.push('/home')
        this.loginBtn = false;
      } else {
        this.texts=data.msg
      this.alertShow=true
      this.loginBtn = false;
      setTimeout(()=>{
        this.alertShow=false
      },2000)
        //Toast(data.msg)
      }
        Notify({ type: "success", message: this.$t("hj36") });
        setTimeout(() => {
          this.$router.push("/home");
        }, 1000);
      } else {
        Notify({ type: "warning", message: data.msg });
      }
      if (navigator.vibrate) {
        // 支持
        navigator.vibrate([55]);
      }
    },
  },
  beforeDestroy() { },
  created() { }
  beforeDestroy() {},
  created() {},
};
</script>
<style scoped lang="less">
.password-operate {
  display: flex;
  justify-content: space-between;
  margin-top: 0.53333rem;
  .forget {
    font-style: normal;
    font-weight: 400;
    font-size: 0.37333rem;
    line-height: 0.53333rem;
    color: #8c9fad;
  }
}
.register {
  font-style: normal;
  font-weight: 400;
  font-size: 0.37333rem;
  color: #8c9fad;
  margin: 0 auto;
  padding: 0.34667rem 0.4rem;
  span {
    color: rgb(5, 106, 239);
  }
}
.login_title {
  font-family: "DINPro", serif;
  font-style: normal;
  font-weight: 500;
  font-size: 0.48rem;
  line-height: 0.66667rem;
  color: #14181f;
  margin-left: 0.53333rem;
}
/deep/ .van-checkbox__label {
  font-style: normal;
  font-weight: 400;
  font-size: 0.37333rem;
  line-height: 0.53333rem;
  color: #8c9fad;
}
/deep/ .van-button__text {
  font-size: 24px;
  font-family: "DINPro";
}
.login_page {
  position: relative;
  background-color: #fff !important;
  width: 100%;
  height: 100%;
  overflow: hidden;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
  height: 100vh;
}
.logins_content {
  display: flex;
  flex-direction: column;
  flex: 1;
  width: 100%;
  height: 9.7436rem;
  margin-top: 0.4359rem;
  padding: 0 0.4564rem;
  .login_title {
    width: 100%;
    height: 2.0513rem;
    display: flex;
    align-items: center;
    font-size: 0.7023rem;
    color: #000;
    font-weight: 600 !important;
    >span {
      font-weight: 600 !important;
    }
  }
  background: #fff;
  // padding: 0 0.4564rem;
  .login_forms {
    width: 100%;
    height: auto;
    margin-top: 0.35rem;
    border-top-left-radius: 0.26667rem;
    border-top-right-radius: 0.26667rem;
    padding: 0.34667rem 0.4rem;
    flex: 1;
    display: flex;
    flex-direction: column;
    .top_forms {
      width: 100%;
      height: auto;
@@ -188,12 +233,12 @@
      .user_name,
      .password {
        width: 100%;
        height: 35%;
        height: 50px;
        background: rgb(246, 246, 247);
        // background: #1e1e1e;
        border-radius: 0.3564rem;
        >input {
        > input {
          width: 100%;
          height: 100%;
          padding-left: 0.3564rem;
@@ -204,38 +249,44 @@
    /deep/.el-input__inner {
      width: 100%;
      height: 1.45rem !important;
      height: 70px;
      background-color: rgb(246, 246, 247) !important;
      // background: #1e1e1e;
      border-radius: 0.3564rem;
      border-radius: 8px;
      font-size: 0.45rem !important;
      border: none;
    }
    .bottom_btns {
      width: 100%;
      height: 3.3333rem;
      margin-top: 0.8528rem;
      // margin-top: 0.8528rem;
      .butn {
        width: 100%;
        margin-top: 40px;
        height: 60px;
        border-radius: 8px;
      }
      .top_btn {
        border: none;
        width: 100%;
        height: 1.25rem;
        border-radius: 0.3564rem;
        background: rgb(154,197,250);
        border-radius: 8px;
        background: #0066ed;
        color: #fff;
        display: flex;
        align-items: center;
        justify-content: center;
        font-size: 0.5128rem;
        margin-top: 0.75rem;
        >span {
        > span {
          font-weight: 530 !important;
        }
      }
      .mes {
        width: 100%;
        // width: 100%;
        height: 20%;
        margin-top: 0.4rem;
        display: flex;
@@ -246,78 +297,89 @@
    }
  }
}
.login_bom{
.login_bom {
  position: absolute;
  bottom: 2.6rem;
  width: 100%;
  height: 4rem;
  padding: 0 2rem;
}
  .line{
    //分割线
    width: 100%;
    height: 0.3846rem;
    display: flex;
    align-items: center;
    justify-content: center;
    margin-top: 0.3846rem;
    .left_line{
      width: 20%;
      height: 0.01rem;
      background: #e5e5e5;
    }
    .center_line{
      width: 50%;
      height: 0.01rem;
      background: #fff;
      display: flex;
      align-items: center;
      justify-content: center;
      >span{
        font-size: 0.3046rem;
        color: #000;
        background-color: #fff;
      }
    }
    .right_line{
      width: 20%;
      height: 0.01rem;
      background: #e5e5e5;
    }
.line {
  //分割线
  width: 100%;
  height: 0.3846rem;
  display: flex;
  align-items: center;
  justify-content: center;
  margin-top: 0.3846rem;
  .left_line {
    width: 20%;
    height: 0.01rem;
    background: #e5e5e5;
  }
  .myzh{
    width: calc(100% - 4rem);
    position: absolute;
    bottom: 0.01rem;
    text-align: center;
     .mes {
        width: 100%;
        height: 40%;
        font-size: 0.3846rem;
      }
  }
  .imgDemo{
  .center_line {
    width: 50%;
    height: 0.01rem;
    background: #fff;
    display: flex;
    justify-content: space-between;
    position: relative;
    transform:translateY(50%);
  }
  .appImg{
    width: 1.4rem;
    height: 1.4rem;
    display: flex;
    justify-content: center;
    align-items: center;
    background-color: rgb(246,246,247);
    border-radius: 100%;
    justify-content: center;
    > span {
      font-size: 0.3046rem;
      color: #000;
      background-color: #fff;
    }
  }
  .appImg img{
    width: 0.8rem;
    height: 0.8rem;
  .right_line {
    width: 20%;
    height: 0.01rem;
    background: #e5e5e5;
  }
}
.myzh {
  // width: calc(100% - 4rem);
  // position: absolute;
  bottom: 0.01rem;
  text-align: center;
  display: flex;
  align-items: center;
  .mes {
    // width: 100%;
    height: 40%;
    font-size: 0.3846rem;
  }
}
.imgDemo {
  display: flex;
  justify-content: space-between;
  position: relative;
  transform: translateY(50%);
}
.appImg {
  width: 1.4rem;
  height: 1.4rem;
  display: flex;
  justify-content: center;
  align-items: center;
  background-color: rgb(246, 246, 247);
  border-radius: 100%;
}
.appImg img {
  width: 0.8rem;
  height: 0.8rem;
}
.img_mess {
  width: 100%;
@@ -330,53 +392,42 @@
    width: 3rem;
    height: 3.5769rem;
    >img {
    > img {
      width: 100%;
      height: 100%;
    }
  }
}
/deep/.el-alert{
  width: 70%!important;
  height: 1rem!important;
  position: absolute!important;
  top: 0!important;
  bottom: 0!important;
  left: 0!important;
  right: 0!important;
  margin: auto!important;
  font-size: 0.3rem!important;
}
/deep/.el-alert__title{
  font-size: 0.3rem!important;
}
/deep/.el-input__suffix{
  width: 1rem!important;
/deep/.el-input__suffix {
  width: 1rem !important;
  display: flex;
    justify-content: center;
    align-items: center;
  justify-content: center;
  align-items: center;
}
/deep/.el-input__suffix-inner{
/deep/.el-input__suffix-inner {
  display: flex;
    justify-content: center;
    align-items: center;
  justify-content: center;
  align-items: center;
}
/deep/.el-input__icon{
  width: 1rem!important;
/deep/.el-input__icon {
  width: 1rem !important;
  display: flex;
    justify-content: center;
    align-items: center;
  justify-content: center;
  align-items: center;
}
.on .top_btn {
        background: #2d8cf0!important;
      }
  /deep/.el-icon-circle-close::before{
    font-size: 0.5rem!important;
  }
/deep/.el-input__clear{
  font-size: 0.5rem!important;
  background: #2d8cf0 !important;
}
/deep/.el-icon-circle-close::before {
  font-size: 0.5rem !important;
}
/deep/.el-input__clear {
  font-size: 0.5rem !important;
}
</style>