QYF-GitLab1
17 小时以前 cf7e71c6d0fb64eeb6b5deac540da843b4bb465c
src/layout/components/login.vue
@@ -1,222 +1,146 @@
<template>
  <el-dialog
    align-center
    append-to-body
    v-model="dialogFormVisible"
    @close="closeDialog"
    @open="openDialog"
    class="fansdialog"
  >
    <div style="display: flex; justify-content: space-around">
      <el-image :src="dialogLeftImg" class="leftImg" />
  <el-dialog append-to-body v-model="dialogFormVisible" @close="closeDialog" @open="openDialog" width="804px"
    class="fansdialog" style="padding: 0; padding-bottom: 0px">
    <div class="changeDialog">
      <div class="leftImg"></div>
      <div class="logIn">
        <div class="signUpTitle" v-if="flag == 'logIn'">
          <ul>
            <li
              @click="signUpWay = 'authSignUp'"
              :style="{
                color: signUpWay == 'authSignUp' ? '#144941' : '#545C63',
              }"
            >
            <li @click="signUpWay = 'authSignUp'" :style="{
              color: signUpWay == 'authSignUp' ? '#019E58' : '#545C63',
            }" style="font-weight: 700">
              手机号登录
            </li>
            <li>|</li>
            <li
              @click="wechatLoginOpen"
              :style="{ color: signUpWay == 'wechat' ? '#144941' : '#545C63' }"
            >
            <li @click="wechatLoginOpen" :style="{ color: signUpWay == 'wechat' ? '#019E58' : '#545C63' }"
              style="font-weight: 700">
              微信登录
            </li>
          </ul>
        </div>
        <div v-else style="text-align: center; color: #144941">注册</div>
        <div
          class="singUpPhone"
          v-if="signUpWay === 'phone' || 'authSignUp'"
          :style="{ height: signUpWay == 'findPassword' ? '450px' : '400px' }"
        >
          <el-form
            :model="passFormData"
            v-if="signUpWay === 'phone' || 'authSignUp'"
            ref="passFormRef"
            @keyup.enter="signInSystem(passFormRef)"
          >
            <el-form-item
              v-if="signUpWay !== 'findPassword'"
              :rules="[
                { min: 11, max: 11, message: '请输入11位电话号码' },
                {
                  validator: (_, value, callback) => {
                    if (
                      !/^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/.test(
                        value
                      )
                    ) {
                      callback('请输入11位电话号码');
                    } else {
                      callback();
                    }
                  },
        <div class="singUpPhone" v-if="signUpWay === 'phone' || 'authSignUp'"
          :style="{ height: signUpWay == 'findPassword' ? '450px' : '400px' }">
          <el-form :model="passFormData" v-if="signUpWay === 'phone' || 'authSignUp'" ref="passFormRef"
            @keyup.enter="signInSystem(passFormRef)">
            <el-form-item v-if="signUpWay !== 'findPassword'" :rules="[
              { min: 11, max: 11, message: '请输入11位电话号码' },
              {
                validator: (_, value, callback) => {
                  if (
                    !/^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/.test(
                      value,
                    )
                  ) {
                    callback('请输入11位电话号码')
                  } else {
                    callback()
                  }
                },
              ]"
              prop="telNumber"
            >
              <el-input
                v-model="passFormData.telNumber"
                placeholder="请输入手机号"
                size="large"
              >
              },
            ]" prop="telNumber">
              <el-input v-model="passFormData.telNumber" placeholder="请输入手机号" size="large">
                <template #prepend>
                  <el-select
                    v-model="select"
                    placeholder="Select"
                    style="width: 110px"
                    class="selectPhone"
                  >
                  <el-select v-model="select" placeholder="Select" style="width: 110px" class="selectPhone">
                    <el-option label="中国+86" value="86" />
                  </el-select>
                </template>
              </el-input>
            </el-form-item>
            <el-form-item>
              <el-button class="yanzhengBtn" @click="sliderImgDialogVisable = true"
                >验证</el-button
              >
              <el-button class="yanzhengBtn" @click="sliderImgDialogVisable = true">验证</el-button>
            </el-form-item>
            <el-form-item
              v-if="signUpWay === 'authSignUp'"
              class="codeWay"
              :rules="[
                { required: true, message: '请输入验证码' },
                { min: 4, max: 6, message: '请输入有效验证码' },
              ]"
              prop="telCode"
            >
              <el-input
                v-model="passFormData.telCode"
                placeholder="请输入验证码"
                size="large"
              />
              <el-button
                type="primary"
                class="codeBtn"
                :disabled="countDown != 0"
                @click="getCode(passFormRef)"
                >{{
                  countDown == 0 ? "获取验证码" : "验证码(" + countDown + "s)"
                }}</el-button
              >
            <el-form-item v-if="signUpWay === 'authSignUp'" class="codeWay" :rules="[
              { required: true, message: '请输入验证码' },
              { min: 4, max: 6, message: '请输入有效验证码' },
            ]" prop="telCode">
              <el-input v-model="passFormData.telCode" placeholder="请输入验证码" size="large" />
              <el-button type="primary" class="codeBtn" :disabled="countDown != 0" @click="getCode(passFormRef)">{{
                countDown == 0 ?
                  '获取验证码' : '验证码(' + countDown + 's)' }}</el-button>
            </el-form-item>
            <el-form-item
              v-if="flag === 'signUp'"
              :rules="[
                { required: true, message: '请输入密码' },
                { min: 8, max: 16, message: '密码在8到16位之间' },
                {
                  validator: (rule, value, callback) => {
                    if (!/\d/.test(value) || /^\d+$/.test(value)) {
                      callback('密码不能为纯数字或字母');
                    } else {
                      callback();
                    }
                  },
            <el-form-item v-if="flag === 'signUp'" :rules="[
              { required: true, message: '请输入密码' },
              { min: 8, max: 16, message: '密码在8到16位之间' },
              {
                validator: (rule, value, callback) => {
                  if (!/\d/.test(value) || /^\d+$/.test(value)) {
                    callback('密码不能为纯数字或字母')
                  } else {
                    callback()
                  }
                },
              ]"
              prop="password"
              class="passwordInput"
            >
              <el-input
                type="password"
                show-password
                v-model="passFormData.password"
                placeholder="请输入密码"
                size="large"
                style="width: 304px"
              >
              },
            ]" prop="password" class="passwordInput">
              <el-input type="password" show-password v-model="passFormData.password" placeholder="请输入密码" size="large"
                style="width: 304px">
              </el-input>
            </el-form-item>
            <el-form-item
              v-if="flag === 'signUp'"
              :rules="[
                { required: true, message: '请输入确认密码' },
                { validator: validateLogInPassword },
              ]"
              prop="confirmPassword"
              class="passwordInput"
            >
              <el-input
                type="password"
                show-password
                v-model="passFormData.confirmPassword"
                placeholder="确认密码"
                size="large"
                style="width: 304px"
              />
            <el-form-item v-if="flag === 'signUp'" :rules="[
              { required: true, message: '请输入确认密码' },
              { validator: validateLogInPassword },
            ]" prop="confirmPassword" class="passwordInput">
              <el-input type="password" show-password v-model="passFormData.confirmPassword" placeholder="确认密码"
                size="large" style="width: 304px" />
            </el-form-item>
          </el-form>
          <el-button class="loginBtn" @click="loginBtn">登录</el-button>
          <el-button class="loginBtn" @click="loginBtn">登录 / 注册</el-button>
        </div>
      </div>
    </div>
    <el-dialog
      v-model="sliderImgDialogVisable"
      align-center
      destroy-on-close="true"
      width="420"
      class="sliderImgDialog"
    >
    <el-dialog v-model="sliderImgDialogVisable" align-center destroy-on-close="true" width="420"
      class="sliderImgDialog">
      <verify :MG="MG" @loginImgVerify="loginImgVerify"></verify>
    </el-dialog>
  </el-dialog>
</template>
<script setup>
import { ref, inject, watchEffect, reactive, nextTick } from "vue";
import dialogLeftImg from "@/assets/images/header/dialogLeftImg.png";
import verify from "@/components/sliderImg/component/verify.vue";
import "@/components/sliderImg/sliderImg.js";
import "@/components/sliderImg/sliderImg.css";
import { ElMessage } from "element-plus";
import { useUserStore } from "@/store";
import { useRouter } from "vue-router";
const router = useRouter();
import { ref, inject, watchEffect, reactive, nextTick } from 'vue'
import dialogLeftImg from '@/assets/images/header/dialogLeftImg.png'
import verify from '@/components/sliderImg/component/verify.vue'
import '@/components/sliderImg/sliderImg.js'
import '@/components/sliderImg/sliderImg.css'
import { ElMessage } from 'element-plus'
import { useUserStore } from '@/store'
import { useRouter } from 'vue-router'
const router = useRouter()
const userStore = useUserStore();
const userStore = useUserStore()
const MG = inject("MG");
const config = inject("config");
const dialogFormVisible = ref(false);
const sliderImgDialogVisable = ref(false);
const flag = ref("logIn"); // 登录或注册
const MG = inject('MG')
const config = inject('config')
const dialogFormVisible = ref(false)
const sliderImgDialogVisable = ref(false)
const flag = ref('logIn') // 登录或注册
const signUpWay = ref("authSignUp"); // 登录方式
const select = ref("中国+86");
const countDown = ref(0); // 倒计时时间
let timer = null; // 倒计时实例
const passFormRef = ref();
const signUpWay = ref('authSignUp') // 登录方式
const select = ref('中国+86')
const countDown = ref(0) // 倒计时时间
let timer = null // 倒计时实例
const passFormRef = ref()
const passFormData = ref({
  telNumber: "",
  password: "",
  telCode: "",
  password: "",
  confirmPassword: "",
});
  telNumber: '',
  password: '',
  telCode: '',
  password: '',
  confirmPassword: '',
})
const closeDialog = () => {
  countDown.value = 0;
  clearInterval(timer);
  countDown.value = 0
  clearInterval(timer)
  if (passFormRef.value) {
    passFormRef.value.resetFields();
    passFormRef.value.resetFields()
  }
  dialogFormVisible.value = false;
};
  dialogFormVisible.value = false
}
// 弹窗打开事件
const openDialog = () => {};
const openDialog = () => { }
const loginImgVerify = (code) => {
  sliderImgDialogVisable.value = false;
  sliderImgDialogVisable.value = false
  MG.identity
    .getPhoneCode({
      phoneNumber: passFormData.value.telNumber,
@@ -224,19 +148,14 @@
      appRefCode: config.appRefCode,
    })
    .then((res) => {
      if (res == "验证码发送成功") {
        getSecond(60);
        ElMessage.success(res);
      if (res == '验证码发送成功') {
        getSecond(60)
        ElMessage.success(res)
      } else {
        ElMessage.error(res);
        ElMessage.error(res)
      }
    });
};
watchEffect(() => {
  if (dialogFormVisible.value) {
  }
});
    })
}
//登录
@@ -245,39 +164,38 @@
    phoneNumber: passFormData.value.telNumber,
    phoneCaptcha: passFormData.value.telCode,
    appRefCode: config.appRefCode,
    platform: "string",
  };
    platform: 'string',
  }
  MG.identity.loginByMobilePhone(query).then((res) => {
    console.log("res", res);
    userStore.setToken(res.data.accessToken);
    console.log('res', res)
    userStore.setToken(res.data.accessToken)
    getUserInfo();
  });
};
    getUserInfo()
  })
}
const getUserInfo = () => {
  MG.identity.getCurrentAppUser().then((res) => {
    console.log("res", res);
    console.log('res', res)
    if (res) {
      let userInfo = res.infoList.find((item) => item.type == "userInfo");
      let userTypeObj = res.infoList.find((item) => item.type == "userType");
      let userInfo = res.infoList.find((item) => item.type == 'userInfo')
      let userTypeObj = res.infoList.find((item) => item.type == 'userType')
      const userData = {
        userName: userInfo && userInfo.data ? JSON.parse(userInfo.data).name : "",
        school: userInfo && userInfo.data ? JSON.parse(userInfo.data).school : "",
        city: userInfo && userInfo.data ? JSON.parse(userInfo.data).city : "",
        cityCode: userInfo && userInfo.data ? JSON.parse(userInfo.data).cityCode : "",
        address: userInfo && userInfo.data ? JSON.parse(userInfo.data).address : "",
        userType:
          userTypeObj && userTypeObj.data ? JSON.parse(userTypeObj.data).userType : "",
      };
      localStorage.setItem("xiehe-isUserInfo", userData?.userType == "" ? "-1" : "1");
      let teacherRole = res.roleLinks.find((item) => item.role.refCode == "teacher");
      let teacherInfos = res.infoList.find((item) => item.type == "teacherInfo");
      let wechatInfo = res.infoList.find((item) => item.type == "WeChat");
      let studentInfo = res.infoList.find((item) => item.type == "Default");
      let phoneInfo = res.secretList.find((item) => item.type == "MobilePhone");
        userName: userInfo && userInfo.data ? JSON.parse(userInfo.data).name : '',
        school: userInfo && userInfo.data ? JSON.parse(userInfo.data).school : '',
        city: userInfo && userInfo.data ? JSON.parse(userInfo.data).city : '',
        cityCode: userInfo && userInfo.data ? JSON.parse(userInfo.data).cityCode : '',
        address: userInfo && userInfo.data ? JSON.parse(userInfo.data).address : '',
        userType: userTypeObj && userTypeObj.data ? JSON.parse(userTypeObj.data).userType : '',
      }
      localStorage.setItem('xiehe-isUserInfo', userData?.userType == '' ? '-1' : '1')
      let teacherRole = res.roleLinks.find((item) => item.role.refCode == 'teacher')
      let teacherInfos = res.infoList.find((item) => item.type == 'teacherInfo')
      let wechatInfo = res.infoList.find((item) => item.type == 'WeChat')
      let studentInfo = res.infoList.find((item) => item.type == 'Default')
      let phoneInfo = res.secretList.find((item) => item.type == 'MobilePhone')
      // let nameAndPassword = res.secretList.find((item) => item.type == 'LoginNameAndPassword')
      let emailInfo = res.secretList.find((item) => item.type == "EMail");
      let emailInfo = res.secretList.find((item) => item.type == 'EMail')
      if (teacherRole && teacherInfos) {
        userStore.setUserInfo({
          ...userData,
@@ -285,19 +203,19 @@
          phoneNumber: phoneInfo?.credential,
          Email: emailInfo ? emailInfo.credential : JSON.parse(teacherInfos.data).email,
          icon: wechatInfo?.icon,
          role: "Teacher",
          role: 'Teacher',
          roleId: teacherRole.role.id,
          userId: res.userId,
        });
        })
      } else if (wechatInfo) {
        userStore.setUserInfo({
          ...userData,
          ...wechatInfo,
          phoneNumber: phoneInfo?.credential,
          Email: emailInfo?.credential,
          role: "Student",
          role: 'Student',
          userId: res.userId,
        });
        })
      } else if (studentInfo) {
        userStore.setUserInfo({
          ...userData,
@@ -305,9 +223,9 @@
          icon: wechatInfo?.icon,
          phoneNumber: phoneInfo?.credential,
          Email: emailInfo?.credential,
          role: "Student",
          role: 'Student',
          userId: res.userId,
        });
        })
      } else if (phoneInfo) {
        userStore.setUserInfo({
          ...userData,
@@ -315,32 +233,39 @@
          name: phoneInfo?.credential,
          icon: phoneInfo?.icon,
          phoneNumber: phoneInfo?.credential,
          role: "Student",
          role: 'Student',
          userId: res.userId,
        });
        })
      }
    }
    router.go(0);
  });
};
    if (localStorage.getItem('loginBack')) {
      console.log(localStorage.getItem('loginBack'))
      debugger
      window.location.href = localStorage.getItem('loginBack')
      localStorage.removeItem('loginBack')
    } else {
      router.go(0)
    }
  })
}
// 倒计时
const getSecond = (time) => {
  if (!timer) {
    countDown.value = time;
    countDown.value = time
    timer = setInterval(() => {
      countDown.value--;
      countDown.value--
      if (countDown.value == 0) {
        clearInterval(timer);
        timer = null;
        clearInterval(timer)
        timer = null
      }
    }, 1000);
    }, 1000)
  }
};
}
// 登录和重置密码按钮按钮
const signInSystem = async (formEl) => {
  if (!formEl) return;
  if (!formEl) return
  formEl.validate((valid) => {
    if (valid) {
      // if (signUpWay.value === 'phone') {
@@ -354,27 +279,27 @@
      //   changePassword()
      // }
    }
  });
};
  })
}
const logIn = () => {
  dialogFormVisible.value = true;
  flag.value = "logIn";
};
  dialogFormVisible.value = true
  flag.value = 'logIn'
}
// 打开注册弹窗
const signUp = () => {
  dialogFormVisible.value = true;
  flag.value = "signUp";
};
  dialogFormVisible.value = true
  flag.value = 'signUp'
}
const wechatLoginOpen = () => {
  signUpWay.value = "wechat";
};
  signUpWay.value = 'wechat'
}
defineExpose({
  logIn,
  signUp,
});
})
</script>
<style lang="less" scoped>
@@ -384,45 +309,29 @@
    width: 80%;
    line-height: 24px;
    color: #000;
    span {
      display: inline-block;
    }
  }
}
.fansdialog {
  width: 806px;
  .changeDialog {
    display: flex;
  }
  .leftImg {
    background-image: url('@/assets/images/header/dialogLeftImg.png');
    background-size: 100% 100%;
    background-position: center;
    background-repeat: no-repeat;
    box-sizing: border-box;
    width: 403px;
    width: 402px;
    height: 481px;
  }
  .el-dialog__header {
    padding: 0;
  }
  .el-dialog__body {
    width: 806px;
    height: 575px;
    display: flex;
    padding: 0 !important;
  }
  .leftImg {
    .el-image__inner {
      width: 403px;
    }
  }
  .el-dialog__header {
    padding: 0;
  }
  .el-dialog__body {
    width: 806px;
    display: flex;
    padding: 0 !important;
  }
}
.agreementDialog {
@@ -431,11 +340,6 @@
  p span {
    line-height: 24px;
  }
  .el-dialog__header {
    font-size: 18px;
    color: #333;
  }
  .el-dialog__body {
@@ -465,6 +369,7 @@
    }
  }
}
.sliderImgDialog {
  .el-dialog__body {
    min-height: 320px;
@@ -475,34 +380,45 @@
<style lang="less">
/** 登录注册弹窗 */
.logIn {
  width: 403px;
  height: 100%;
  padding-top: 48px;
  width: 402px;
  height: 481px;
  display: flex;
  flex-direction: column;
  justify-content: space-around;
  justify-content: center;
  padding-top: 30px;
  box-sizing: border-box;
  .signUpTitle {
    width: 100%;
    ul {
      display: flex;
      justify-content: center;
      width: 100%;
      li {
        height: 20px;
        display: flex;
        align-items: center;
        font-family: Microsoft YaHei UI, Microsoft YaHei UI;
        font-weight: bold;
        font-size: 16px;
        color: #019E58;
        .el-image {
          margin-right: 5px;
          width: 20px;
        }
      }
      li:nth-child(2n + 1) {
        cursor: pointer;
        margin: 0 10px;
      }
      li:first-child {
        margin-left: 0;
        .el-image {
          width: 10px;
        }
@@ -587,12 +503,14 @@
      background-color: #019e58;
      // opacity: 0.55;
    }
    .yanzhengBtn {
      width: 100%;
      height: 41px;
      background-color: #019e58;
      color: #fff;
    }
    .loginBtn {
      width: 76%;
      height: 41px;
@@ -639,6 +557,7 @@
        margin-left: 10px;
        cursor: pointer;
        position: relative;
        span {
          position: absolute;
          top: 35px;
@@ -660,10 +579,12 @@
    line-height: 26px;
  }
}
.policy {
  cursor: pointer;
  color: #019e58;
}
/** 注册表单 */
.signUp {
  width: 403px;
@@ -706,6 +627,7 @@
        font-size: 14px;
      }
    }
    .agreement {
      height: 40px;
      display: flex;
@@ -753,6 +675,7 @@
        margin-left: 10px;
        cursor: pointer;
        position: relative;
        span {
          position: absolute;
          top: 35px;
@@ -783,15 +706,18 @@
    flex-direction: column;
    justify-content: space-between;
    align-items: center;
    .el-form-item {
      &:last-child {
        margin-bottom: 0;
      }
      .el-button {
        height: 40px;
        margin-left: 10px;
      }
    }
    h2 {
      font-size: 20px;
      margin-top: 70px;
@@ -826,20 +752,4 @@
.selectPhone {
  background: #fff;
}
// .el-select {
//   width: 100px;
//   height: 30px;
//   color: red;
//   border: none !important;
//   /deep/ .select-trigger {
//     height: 100%;
//     .el-input--suffix {
//       height: 100%;
//       background-color: #fff;
//     }
//   }
// }
</style>