<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" />
|
|
<div class="logIn">
|
<div class="signUpTitle" v-if="flag == 'logIn'">
|
<ul>
|
<li
|
@click="signUpWay = 'authSignUp'"
|
:style="{
|
color: signUpWay == 'authSignUp' ? '#144941' : '#545C63',
|
}"
|
>
|
手机号登录
|
</li>
|
<li>|</li>
|
<li
|
@click="wechatLoginOpen"
|
:style="{ color: signUpWay == 'wechat' ? '#144941' : '#545C63' }"
|
>
|
微信登录
|
</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();
|
}
|
},
|
},
|
]"
|
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-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-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>
|
<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"
|
>
|
</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>
|
</el-form>
|
|
<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"
|
>
|
<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();
|
|
const userStore = useUserStore();
|
|
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 passFormData = ref({
|
telNumber: "",
|
password: "",
|
telCode: "",
|
password: "",
|
confirmPassword: "",
|
});
|
const closeDialog = () => {
|
countDown.value = 0;
|
clearInterval(timer);
|
if (passFormRef.value) {
|
passFormRef.value.resetFields();
|
}
|
dialogFormVisible.value = false;
|
};
|
// 弹窗打开事件
|
const openDialog = () => {};
|
|
const loginImgVerify = (code) => {
|
sliderImgDialogVisable.value = false;
|
MG.identity
|
.getPhoneCode({
|
phoneNumber: passFormData.value.telNumber,
|
imageCaptcha: code,
|
appRefCode: config.appRefCode,
|
})
|
.then((res) => {
|
if (res == "验证码发送成功") {
|
getSecond(60);
|
ElMessage.success(res);
|
} else {
|
ElMessage.error(res);
|
}
|
});
|
};
|
|
watchEffect(() => {
|
if (dialogFormVisible.value) {
|
}
|
});
|
|
//登录
|
|
const loginBtn = () => {
|
let query = {
|
phoneNumber: passFormData.value.telNumber,
|
phoneCaptcha: passFormData.value.telCode,
|
appRefCode: config.appRefCode,
|
platform: "string",
|
};
|
MG.identity.loginByMobilePhone(query).then((res) => {
|
console.log("res", res);
|
userStore.setToken(res.data.accessToken);
|
|
getUserInfo();
|
});
|
};
|
|
const getUserInfo = () => {
|
MG.identity.getCurrentAppUser().then((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");
|
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");
|
// let nameAndPassword = res.secretList.find((item) => item.type == 'LoginNameAndPassword')
|
let emailInfo = res.secretList.find((item) => item.type == "EMail");
|
if (teacherRole && teacherInfos) {
|
userStore.setUserInfo({
|
...userData,
|
...teacherInfos,
|
phoneNumber: phoneInfo?.credential,
|
Email: emailInfo ? emailInfo.credential : JSON.parse(teacherInfos.data).email,
|
icon: wechatInfo?.icon,
|
role: "Teacher",
|
roleId: teacherRole.role.id,
|
userId: res.userId,
|
});
|
} else if (wechatInfo) {
|
userStore.setUserInfo({
|
...userData,
|
...wechatInfo,
|
phoneNumber: phoneInfo?.credential,
|
Email: emailInfo?.credential,
|
role: "Student",
|
userId: res.userId,
|
});
|
} else if (studentInfo) {
|
userStore.setUserInfo({
|
...userData,
|
...studentInfo,
|
icon: wechatInfo?.icon,
|
phoneNumber: phoneInfo?.credential,
|
Email: emailInfo?.credential,
|
role: "Student",
|
userId: res.userId,
|
});
|
} else if (phoneInfo) {
|
userStore.setUserInfo({
|
...userData,
|
...phoneInfo,
|
name: phoneInfo?.credential,
|
icon: phoneInfo?.icon,
|
phoneNumber: phoneInfo?.credential,
|
role: "Student",
|
userId: res.userId,
|
});
|
}
|
}
|
router.go(0);
|
});
|
};
|
|
// 倒计时
|
const getSecond = (time) => {
|
if (!timer) {
|
countDown.value = time;
|
timer = setInterval(() => {
|
countDown.value--;
|
if (countDown.value == 0) {
|
clearInterval(timer);
|
timer = null;
|
}
|
}, 1000);
|
}
|
};
|
|
// 登录和重置密码按钮按钮
|
const signInSystem = async (formEl) => {
|
if (!formEl) return;
|
formEl.validate((valid) => {
|
if (valid) {
|
// if (signUpWay.value === 'phone') {
|
// // 账号密码登录
|
// passwordSignUp()
|
// } else if (signUpWay.value == 'authSignUp') {
|
// // 验证码登录
|
// codeSignUp()
|
// } else {
|
// // 重置密码
|
// changePassword()
|
// }
|
}
|
});
|
};
|
|
const logIn = () => {
|
dialogFormVisible.value = true;
|
flag.value = "logIn";
|
};
|
|
// 打开注册弹窗
|
const signUp = () => {
|
dialogFormVisible.value = true;
|
flag.value = "signUp";
|
};
|
const wechatLoginOpen = () => {
|
signUpWay.value = "wechat";
|
};
|
|
defineExpose({
|
logIn,
|
signUp,
|
});
|
</script>
|
|
<style lang="less" scoped>
|
// 用户信息填写界面
|
.changeUser {
|
.prompt-title {
|
width: 80%;
|
line-height: 24px;
|
color: #000;
|
span {
|
display: inline-block;
|
}
|
}
|
}
|
.fansdialog {
|
width: 806px;
|
|
.leftImg {
|
box-sizing: border-box;
|
width: 403px;
|
}
|
|
.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 {
|
width: 760px;
|
height: 600px;
|
|
p span {
|
line-height: 24px;
|
}
|
|
.el-dialog__header {
|
font-size: 18px;
|
color: #333;
|
}
|
|
.el-dialog__body {
|
overflow: auto;
|
height: 500px;
|
width: 760px;
|
}
|
|
.el-dialog__footer {
|
display: flex;
|
justify-content: center;
|
}
|
}
|
|
.wechatTipsDialog {
|
.el-dialog__header {
|
font-size: 18px;
|
}
|
|
.el-dialog__body {
|
display: flex;
|
align-items: center;
|
|
p {
|
margin-left: 10px;
|
line-height: 24px;
|
}
|
}
|
}
|
.sliderImgDialog {
|
.el-dialog__body {
|
min-height: 320px;
|
}
|
}
|
</style>
|
|
<style lang="less">
|
/** 登录注册弹窗 */
|
.logIn {
|
width: 403px;
|
height: 100%;
|
padding-top: 48px;
|
display: flex;
|
flex-direction: column;
|
justify-content: space-around;
|
|
.signUpTitle {
|
width: 100%;
|
ul {
|
display: flex;
|
justify-content: center;
|
width: 100%;
|
li {
|
height: 20px;
|
display: flex;
|
align-items: center;
|
.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;
|
}
|
}
|
}
|
}
|
|
/** 微信登录 */
|
.signUpContent {
|
display: flex;
|
height: 400px;
|
flex-wrap: wrap;
|
flex-direction: column;
|
justify-content: space-around;
|
align-content: center;
|
|
.el-image {
|
width: 176px;
|
}
|
|
h2 {
|
font-size: 20px;
|
color: #000;
|
font-weight: 700;
|
text-align: center;
|
}
|
|
p {
|
text-align: center;
|
line-height: 26px;
|
}
|
|
.wechatCode {
|
h2 {
|
margin-bottom: 24px;
|
}
|
}
|
}
|
|
/** 密码登录 */
|
.singUpPhone {
|
height: 400px;
|
display: flex;
|
flex-direction: column;
|
align-items: center;
|
|
h2 {
|
padding-top: 35px;
|
font-size: 20px;
|
color: #000;
|
font-weight: 700;
|
text-align: center;
|
}
|
|
.back {
|
display: flex;
|
align-items: center;
|
cursor: pointer;
|
margin: 10px 0px 0px 20px;
|
align-self: flex-start;
|
font-size: 12px;
|
color: #333;
|
}
|
|
.el-form {
|
margin-top: 26px;
|
}
|
|
.signInBtn {
|
width: 304px;
|
height: 41px;
|
margin-bottom: 33px;
|
border-radius: 3px;
|
// opacity: 0.55;
|
color: #fff;
|
font-size: 14px;
|
}
|
|
.codeBtn {
|
width: 101px;
|
height: 41px;
|
background-color: #019e58;
|
// opacity: 0.55;
|
}
|
.yanzhengBtn {
|
width: 100%;
|
height: 41px;
|
background-color: #019e58;
|
color: #fff;
|
}
|
.loginBtn {
|
width: 76%;
|
height: 41px;
|
background: linear-gradient(90deg, #019e58 0%, #144941 100%);
|
color: #fff;
|
margin-top: 50px;
|
}
|
|
.el-image {
|
display: flex;
|
flex-direction: column;
|
justify-content: center;
|
}
|
|
.authSignUp {
|
width: 305px;
|
flex: 1;
|
display: flex;
|
justify-content: end;
|
align-items: end;
|
padding-bottom: 20px;
|
|
span {
|
cursor: pointer;
|
color: #333;
|
font-size: 12px;
|
}
|
}
|
|
.codeWay {
|
.el-input {
|
width: 195px;
|
}
|
|
.el-button {
|
width: 100px;
|
padding: 0;
|
margin: 0 0 0 10px;
|
}
|
|
.authCodeBox {
|
width: 100px;
|
height: 50px;
|
margin-left: 10px;
|
cursor: pointer;
|
position: relative;
|
span {
|
position: absolute;
|
top: 35px;
|
height: 10px;
|
margin-bottom: 20px;
|
font-size: 10px;
|
color: #1f971f;
|
}
|
}
|
}
|
}
|
|
.claus {
|
margin-bottom: 10px;
|
color: #000;
|
font-size: 12px;
|
width: 100%;
|
text-align: center;
|
line-height: 26px;
|
}
|
}
|
.policy {
|
cursor: pointer;
|
color: #ff6c00;
|
}
|
/** 注册表单 */
|
.signUp {
|
width: 403px;
|
justify-content: space-around;
|
color: #333;
|
font-size: 12px;
|
|
span:first-child,
|
span:last-child {
|
cursor: pointer;
|
}
|
|
.logInTitle {
|
width: 96%;
|
font-size: 16px;
|
margin: 20px 0 0 20px;
|
font-weight: bold;
|
}
|
|
h4 {
|
font-size: 16px;
|
color: #ff6c00;
|
}
|
|
.logInBox {
|
margin-top: 20px;
|
padding: 0 40px;
|
width: 100%;
|
display: flex;
|
flex-direction: column;
|
justify-content: center;
|
align-items: center;
|
|
.el-form-item {
|
.el-button {
|
width: 100px;
|
height: 41px;
|
border-radius: 3px;
|
color: #fff;
|
font-size: 14px;
|
}
|
}
|
.agreement {
|
height: 40px;
|
display: flex;
|
align-items: center;
|
margin: 30px 0 0 0;
|
line-height: 32px;
|
height: 32px;
|
font-size: 12px;
|
color: #000;
|
|
.el-checkbox {
|
margin-right: 10px;
|
}
|
|
.el-link {
|
font-size: 12px;
|
}
|
|
p {
|
height: 100%;
|
display: flex;
|
align-items: center;
|
}
|
}
|
|
.hint {
|
font-size: 11px;
|
color: #545c63;
|
}
|
|
.codeWay {
|
.el-input {
|
width: 195px;
|
}
|
|
.el-button {
|
width: 100px;
|
padding: 0;
|
margin: 0 0 0 10px;
|
}
|
|
.authCodeBox {
|
width: 100px;
|
height: 50px;
|
margin-left: 10px;
|
cursor: pointer;
|
position: relative;
|
span {
|
position: absolute;
|
top: 35px;
|
left: 0;
|
width: 100px;
|
font-size: 10px;
|
color: #1f971f;
|
}
|
}
|
}
|
}
|
|
.logInBtn {
|
width: 304px;
|
height: 41px;
|
margin-top: 10px;
|
margin-bottom: 20px;
|
border-radius: 3px;
|
color: #fff;
|
font-size: 14px;
|
}
|
|
/** 选择用户类型 */
|
.changeUser {
|
width: 100%;
|
height: 100%;
|
display: flex;
|
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;
|
color: #000;
|
font-weight: bold;
|
}
|
|
.el-radio-group {
|
display: flex;
|
flex-direction: column;
|
|
.el-radio-button {
|
width: 166px;
|
}
|
|
/deep/ .el-radio-button__inner {
|
width: 166px;
|
height: 41px;
|
line-height: 24px;
|
border-radius: 4px;
|
border: 0;
|
border: 1px solid #dcdfe6;
|
}
|
|
.el-radio-button:nth-child(n + 1) {
|
margin-bottom: 27px;
|
}
|
}
|
}
|
}
|
|
.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>
|