|
@@ -17,7 +17,7 @@
|
|
|
<el-tabs v-model="activeTab" @tab-change="handleTabChange" class="login-tabs">
|
|
<el-tabs v-model="activeTab" @tab-change="handleTabChange" class="login-tabs">
|
|
|
<el-tab-pane label="账号密码登录" name="password">
|
|
<el-tab-pane label="账号密码登录" name="password">
|
|
|
<el-form ref="passwordFormRef" :model="passwordForm" :rules="passwordRules" label-width="0">
|
|
<el-form ref="passwordFormRef" :model="passwordForm" :rules="passwordRules" label-width="0">
|
|
|
- <el-form-item prop="username" class="login-form-item">
|
|
|
|
|
|
|
+ <el-form-item prop="account" class="login-form-item">
|
|
|
<el-input
|
|
<el-input
|
|
|
v-model="passwordForm.account"
|
|
v-model="passwordForm.account"
|
|
|
placeholder="请输入账号"
|
|
placeholder="请输入账号"
|
|
@@ -37,10 +37,10 @@
|
|
|
/>
|
|
/>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
<!-- 增加动态验证码图片 -->
|
|
<!-- 增加动态验证码图片 -->
|
|
|
- <el-form-item prop="verifyCode" class="login-form-item">
|
|
|
|
|
|
|
+ <el-form-item prop="captcha" class="login-form-item">
|
|
|
<div class="gap10">
|
|
<div class="gap10">
|
|
|
<el-input
|
|
<el-input
|
|
|
- v-model="passwordForm.verifyCode"
|
|
|
|
|
|
|
+ v-model="passwordForm.captcha"
|
|
|
placeholder="请输入验证码"
|
|
placeholder="请输入验证码"
|
|
|
prefix-icon="Lock"
|
|
prefix-icon="Lock"
|
|
|
show-password
|
|
show-password
|
|
@@ -72,10 +72,10 @@
|
|
|
|
|
|
|
|
<el-tab-pane label="短信登录" name="sms">
|
|
<el-tab-pane label="短信登录" name="sms">
|
|
|
<el-form ref="smsFormRef" :model="smsForm" :rules="smsRules" label-width="0">
|
|
<el-form ref="smsFormRef" :model="smsForm" :rules="smsRules" label-width="0">
|
|
|
- <el-form-item prop="phone" class="login-form-item">
|
|
|
|
|
|
|
+ <el-form-item prop="account" class="login-form-item">
|
|
|
<el-input
|
|
<el-input
|
|
|
- v-model="smsForm.phone"
|
|
|
|
|
- placeholder="请输入手机号"
|
|
|
|
|
|
|
+ v-model="smsForm.account"
|
|
|
|
|
+ placeholder="请输入手机号或邮箱"
|
|
|
prefix-icon="Mobile"
|
|
prefix-icon="Mobile"
|
|
|
clearable
|
|
clearable
|
|
|
class="login-input"
|
|
class="login-input"
|
|
@@ -83,7 +83,7 @@
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
<el-form-item prop="smsCode" class="login-form-item">
|
|
<el-form-item prop="smsCode" class="login-form-item">
|
|
|
<el-input
|
|
<el-input
|
|
|
- v-model="smsForm.smsCode"
|
|
|
|
|
|
|
+ v-model="smsForm.verifyCode"
|
|
|
placeholder="请输入验证码"
|
|
placeholder="请输入验证码"
|
|
|
prefix-icon="Message"
|
|
prefix-icon="Message"
|
|
|
clearable
|
|
clearable
|
|
@@ -91,7 +91,6 @@
|
|
|
>
|
|
>
|
|
|
<template #append>
|
|
<template #append>
|
|
|
<el-button
|
|
<el-button
|
|
|
- type="primary"
|
|
|
|
|
:disabled="smsCountdown > 0"
|
|
:disabled="smsCountdown > 0"
|
|
|
@click="sendSmsCode"
|
|
@click="sendSmsCode"
|
|
|
:class="{'countdown-btn': smsCountdown > 0}"
|
|
:class="{'countdown-btn': smsCountdown > 0}"
|
|
@@ -115,52 +114,6 @@
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-form>
|
|
</el-form>
|
|
|
</el-tab-pane>
|
|
</el-tab-pane>
|
|
|
-
|
|
|
|
|
- <el-tab-pane label="邮箱登录" name="email">
|
|
|
|
|
- <el-form ref="emailFormRef" :model="emailForm" :rules="emailRules" label-width="0">
|
|
|
|
|
- <el-form-item prop="email" class="login-form-item">
|
|
|
|
|
- <el-input
|
|
|
|
|
- v-model="emailForm.email"
|
|
|
|
|
- placeholder="请输入邮箱"
|
|
|
|
|
- prefix-icon="Email"
|
|
|
|
|
- clearable
|
|
|
|
|
- class="login-input"
|
|
|
|
|
- />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- <el-form-item prop="emailCode" class="login-form-item">
|
|
|
|
|
- <el-input
|
|
|
|
|
- v-model="emailForm.emailCode"
|
|
|
|
|
- placeholder="请输入验证码"
|
|
|
|
|
- prefix-icon="Message"
|
|
|
|
|
- clearable
|
|
|
|
|
- class="login-input"
|
|
|
|
|
- >
|
|
|
|
|
- <template #append>
|
|
|
|
|
- <el-button
|
|
|
|
|
- type="primary"
|
|
|
|
|
- :disabled="emailCountdown > 0"
|
|
|
|
|
- @click="sendEmailCode"
|
|
|
|
|
- :class="{'countdown-btn': emailCountdown > 0}"
|
|
|
|
|
- size="small"
|
|
|
|
|
- >
|
|
|
|
|
- {{ emailCountdown > 0 ? `${emailCountdown}s` : '发送验证码' }}
|
|
|
|
|
- </el-button>
|
|
|
|
|
- </template>
|
|
|
|
|
- </el-input>
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- <el-form-item class="login-form-item">
|
|
|
|
|
- <el-button
|
|
|
|
|
- type="primary"
|
|
|
|
|
- @click="handleEmailLogin"
|
|
|
|
|
- :loading="loading"
|
|
|
|
|
- class="login-button"
|
|
|
|
|
- size="large"
|
|
|
|
|
- >
|
|
|
|
|
- 登录
|
|
|
|
|
- </el-button>
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-form>
|
|
|
|
|
- </el-tab-pane>
|
|
|
|
|
</el-tabs>
|
|
</el-tabs>
|
|
|
|
|
|
|
|
<!-- 其他登录方式 -->
|
|
<!-- 其他登录方式 -->
|
|
@@ -199,7 +152,7 @@ import { ref, reactive, watch, computed } from 'vue'
|
|
|
import { ElMessage } from 'element-plus'
|
|
import { ElMessage } from 'element-plus'
|
|
|
import QQIcon from '@/assets/imgs/QQ.png'
|
|
import QQIcon from '@/assets/imgs/QQ.png'
|
|
|
import WeChatIcon from '@/assets/imgs/WeChat.png'
|
|
import WeChatIcon from '@/assets/imgs/WeChat.png'
|
|
|
-import { getCaptcha, loginUsername } from '@/api/auth.js'
|
|
|
|
|
|
|
+import { getCaptcha, loginUsername, loginPhone, loginEmail, getSmsCode, getEmailCode } from '@/api/auth.js'
|
|
|
// 正则表达式
|
|
// 正则表达式
|
|
|
const PHONE_REGEX = /^1[3-9]\d{9}$/;
|
|
const PHONE_REGEX = /^1[3-9]\d{9}$/;
|
|
|
const EMAIL_REGEX = /^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$/;
|
|
const EMAIL_REGEX = /^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$/;
|
|
@@ -258,20 +211,13 @@ const passwordForm = reactive({
|
|
|
|
|
|
|
|
// 短信登录表单
|
|
// 短信登录表单
|
|
|
const smsForm = reactive({
|
|
const smsForm = reactive({
|
|
|
- phone: '',
|
|
|
|
|
- smsCode: ''
|
|
|
|
|
-})
|
|
|
|
|
-
|
|
|
|
|
-// 邮箱登录表单
|
|
|
|
|
-const emailForm = reactive({
|
|
|
|
|
- email: '',
|
|
|
|
|
- emailCode: ''
|
|
|
|
|
|
|
+ account: '',
|
|
|
|
|
+ verifyCode: ''
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
// 表单引用
|
|
// 表单引用
|
|
|
const passwordFormRef = ref(null)
|
|
const passwordFormRef = ref(null)
|
|
|
const smsFormRef = ref(null)
|
|
const smsFormRef = ref(null)
|
|
|
-const emailFormRef = ref(null)
|
|
|
|
|
|
|
|
|
|
// 加载状态
|
|
// 加载状态
|
|
|
const loading = ref(false)
|
|
const loading = ref(false)
|
|
@@ -283,31 +229,25 @@ const emailCountdown = ref(0)
|
|
|
// 表单验证规则
|
|
// 表单验证规则
|
|
|
const passwordRules = reactive({
|
|
const passwordRules = reactive({
|
|
|
account: [
|
|
account: [
|
|
|
- { required: true, message: '请输入账号', trigger: 'blur' }
|
|
|
|
|
|
|
+ { required: true, message: '请输入账号', trigger: 'blur' },
|
|
|
|
|
+ { validator: (val) => isPasswordPhone.value || isPasswordEmail.value, message: '请输入正确的(手机号或邮箱)', trigger: 'blur' }
|
|
|
],
|
|
],
|
|
|
password: [
|
|
password: [
|
|
|
{ required: true, message: '请输入密码', trigger: 'blur' },
|
|
{ required: true, message: '请输入密码', trigger: 'blur' },
|
|
|
{ min: 6, message: '密码长度不能少于6个字符', trigger: 'blur' }
|
|
{ min: 6, message: '密码长度不能少于6个字符', trigger: 'blur' }
|
|
|
|
|
+ ],
|
|
|
|
|
+ captcha: [
|
|
|
|
|
+ { required: true, message: '请输入验证码', trigger: 'blur' }
|
|
|
]
|
|
]
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
const smsRules = reactive({
|
|
const smsRules = reactive({
|
|
|
- phone: [
|
|
|
|
|
|
|
+ account: [
|
|
|
{ required: true, message: '请输入手机号', trigger: 'blur' },
|
|
{ required: true, message: '请输入手机号', trigger: 'blur' },
|
|
|
- { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' }
|
|
|
|
|
- ],
|
|
|
|
|
- smsCode: [
|
|
|
|
|
- { required: true, message: '请输入验证码', trigger: 'blur' },
|
|
|
|
|
- { min: 6, max: 6, message: '验证码长度为6个字符', trigger: 'blur' }
|
|
|
|
|
- ]
|
|
|
|
|
-})
|
|
|
|
|
|
|
+ { validator: (rule, val) => PHONE_REGEX.test(val) || EMAIL_REGEX.test(val), message: '请输入正确的(手机号或邮箱)', trigger: 'blur' }
|
|
|
|
|
|
|
|
-const emailRules = reactive({
|
|
|
|
|
- email: [
|
|
|
|
|
- { required: true, message: '请输入邮箱', trigger: 'blur' },
|
|
|
|
|
- { type: 'email', message: '请输入正确的邮箱', trigger: 'blur' }
|
|
|
|
|
],
|
|
],
|
|
|
- emailCode: [
|
|
|
|
|
|
|
+ verifyCode: [
|
|
|
{ required: true, message: '请输入验证码', trigger: 'blur' },
|
|
{ required: true, message: '请输入验证码', trigger: 'blur' },
|
|
|
{ min: 6, max: 6, message: '验证码长度为6个字符', trigger: 'blur' }
|
|
{ min: 6, max: 6, message: '验证码长度为6个字符', trigger: 'blur' }
|
|
|
]
|
|
]
|
|
@@ -320,22 +260,34 @@ const handleTabChange = () => {
|
|
|
passwordFormRef.value?.resetFields()
|
|
passwordFormRef.value?.resetFields()
|
|
|
} else if (activeTab.value === 'sms') {
|
|
} else if (activeTab.value === 'sms') {
|
|
|
smsFormRef.value?.resetFields()
|
|
smsFormRef.value?.resetFields()
|
|
|
- } else if (activeTab.value === 'email') {
|
|
|
|
|
- emailFormRef.value?.resetFields()
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 发送短信验证码
|
|
// 发送短信验证码
|
|
|
-const sendSmsCode = () => {
|
|
|
|
|
- if (!smsForm.phone) {
|
|
|
|
|
- ElMessage.warning('请先输入手机号')
|
|
|
|
|
|
|
+const sendSmsCode = async () => {
|
|
|
|
|
+ if (!smsForm.account) {
|
|
|
|
|
+ ElMessage.warning('请先输入手机号或邮箱')
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 验证手机号格式
|
|
// 验证手机号格式
|
|
|
- const phoneRegex = /^1[3-9]\d{9}$/
|
|
|
|
|
- if (!phoneRegex.test(smsForm.phone)) {
|
|
|
|
|
- ElMessage.warning('请输入正确的手机号')
|
|
|
|
|
|
|
+ if (!PHONE_REGEX.test(smsForm.account) && !EMAIL_REGEX.test(smsForm.account)) {
|
|
|
|
|
+ ElMessage.warning('请输入正确的手机号或邮箱')
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ let res = null;
|
|
|
|
|
+ if(PHONE_REGEX.test(smsForm.account)){
|
|
|
|
|
+ res = await getSmsCode({
|
|
|
|
|
+ phone: smsForm.account
|
|
|
|
|
+ })
|
|
|
|
|
+ } else if (EMAIL_REGEX.test(smsForm.account)){
|
|
|
|
|
+ res = await getEmailCode({
|
|
|
|
|
+ email: smsForm.account
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if(res.code !== 200){
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -377,17 +329,17 @@ const handlePasswordLogin = () => {
|
|
|
passwordFormRef.value?.validate(async (valid) => {
|
|
passwordFormRef.value?.validate(async (valid) => {
|
|
|
if (valid) {
|
|
if (valid) {
|
|
|
loading.value = true
|
|
loading.value = true
|
|
|
- const params = new URLSearchParams();
|
|
|
|
|
|
|
+ const params = {};
|
|
|
// 根据账号类型决定参数名
|
|
// 根据账号类型决定参数名
|
|
|
if (isPasswordPhone.value) {
|
|
if (isPasswordPhone.value) {
|
|
|
- params.append('phone', passwordForm.account);
|
|
|
|
|
|
|
+ params['phone'] = passwordForm.account;
|
|
|
} else if (isPasswordEmail.value) {
|
|
} else if (isPasswordEmail.value) {
|
|
|
- params.append('email', passwordForm.account);
|
|
|
|
|
|
|
+ params['email'] = passwordForm.account;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- params.append('password', passwordForm.password);
|
|
|
|
|
- params.append('captcha', passwordForm.captcha);
|
|
|
|
|
- params.append('uuid', passwordForm.uuid);
|
|
|
|
|
|
|
+ params['password'] = passwordForm.password;
|
|
|
|
|
+ params['captcha'] = passwordForm.captcha;
|
|
|
|
|
+ params['uuid'] = passwordForm.uuid;
|
|
|
const res = await loginUsername(params);
|
|
const res = await loginUsername(params);
|
|
|
loading.value = false
|
|
loading.value = false
|
|
|
if (res.code === 200) {
|
|
if (res.code === 200) {
|
|
@@ -403,35 +355,32 @@ const handlePasswordLogin = () => {
|
|
|
|
|
|
|
|
// 短信登录
|
|
// 短信登录
|
|
|
const handleSmsLogin = () => {
|
|
const handleSmsLogin = () => {
|
|
|
- smsFormRef.value?.validate((valid) => {
|
|
|
|
|
|
|
+ smsFormRef.value?.validate(async(valid) => {
|
|
|
if (valid) {
|
|
if (valid) {
|
|
|
loading.value = true
|
|
loading.value = true
|
|
|
- // 模拟登录请求
|
|
|
|
|
- setTimeout(() => {
|
|
|
|
|
- loading.value = false
|
|
|
|
|
|
|
+ const params = {};
|
|
|
|
|
+ let res = {};
|
|
|
|
|
+ params['code'] = smsForm.verifyCode;
|
|
|
|
|
+ // 根据账号类型决定参数名
|
|
|
|
|
+ if (PHONE_REGEX.test(smsForm.account)) {
|
|
|
|
|
+ params['phone'] = smsForm.account;
|
|
|
|
|
+ res = await loginPhone(params);
|
|
|
|
|
+ } else if (EMAIL_REGEX.test(smsForm.account)) {
|
|
|
|
|
+ params['email'] = smsForm.account;
|
|
|
|
|
+ res = await loginEmail(params);
|
|
|
|
|
+ }
|
|
|
|
|
+ loading.value = false
|
|
|
|
|
+ if (res.code === 200) {
|
|
|
ElMessage.success('登录成功')
|
|
ElMessage.success('登录成功')
|
|
|
- emit('login-success', { type: 'sms', userInfo: smsForm })
|
|
|
|
|
|
|
+ // emit('login-success', { type: 'sms', userInfo: smsForm })
|
|
|
dialogVisible.value = false
|
|
dialogVisible.value = false
|
|
|
- }, 1500)
|
|
|
|
|
|
|
+ } else {
|
|
|
|
|
+ ElMessage.error(res.msg || '登录失败')
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// 邮箱登录
|
|
|
|
|
-const handleEmailLogin = () => {
|
|
|
|
|
- emailFormRef.value?.validate((valid) => {
|
|
|
|
|
- if (valid) {
|
|
|
|
|
- loading.value = true
|
|
|
|
|
- // 模拟登录请求
|
|
|
|
|
- setTimeout(() => {
|
|
|
|
|
- loading.value = false
|
|
|
|
|
- ElMessage.success('登录成功')
|
|
|
|
|
- emit('login-success', { type: 'email', userInfo: emailForm })
|
|
|
|
|
- dialogVisible.value = false
|
|
|
|
|
- }, 1500)
|
|
|
|
|
- }
|
|
|
|
|
- })
|
|
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
// 微信登录
|
|
// 微信登录
|
|
|
const handleWechatLogin = () => {
|
|
const handleWechatLogin = () => {
|