|
|
|
@ -15,7 +15,8 @@
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<!-- 登录表单 -->
|
|
|
|
|
<form @submit.prevent="login" class="login-form">
|
|
|
|
|
<button @click="login" v-if="false">测试登录</button>
|
|
|
|
|
<form @submit.prevent="Login1" class="login-form">
|
|
|
|
|
<div class="input-group">
|
|
|
|
|
<!-- 用户标识输入框(用户名/邮箱/手机) -->
|
|
|
|
|
<input
|
|
|
|
@ -70,20 +71,17 @@
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
<script setup name="UserLogin">
|
|
|
|
|
import { ref, computed } from 'vue';
|
|
|
|
|
import axios from 'axios';
|
|
|
|
|
import request from '@/utils/request';
|
|
|
|
|
import { ElMessage } from 'element-plus';
|
|
|
|
|
import { useUserStore } from '@/stores/user.ts';
|
|
|
|
|
import { useUserStore } from '@/stores/user.js';
|
|
|
|
|
|
|
|
|
|
export default {
|
|
|
|
|
name: 'UserLogin',
|
|
|
|
|
//TODO: 引入props, { emit }然后实现登陆成功跳转
|
|
|
|
|
setup() {
|
|
|
|
|
const currentType = ref('username'); // 当前选择的登录方式
|
|
|
|
|
const cooldown = ref(0); // 验证码发送倒计时
|
|
|
|
|
const userStore = useUserStore(); // 引入用户状态管理
|
|
|
|
|
const emit = defineEmits(['toggleForm', 'LoginSuccess']); // 定义事件
|
|
|
|
|
// 登录方式
|
|
|
|
|
const loginTypes = [
|
|
|
|
|
{ label: '用户名登录', value: 'username' },
|
|
|
|
@ -102,19 +100,26 @@ export default {
|
|
|
|
|
// 输入框类型
|
|
|
|
|
const inputType = computed(() => {
|
|
|
|
|
switch (currentType.value) {
|
|
|
|
|
case 'email': return 'email'; // 邮箱输入类型
|
|
|
|
|
case 'phone': return 'tel'; // 电话号码输入类型
|
|
|
|
|
default: return 'text'; // 默认文本输入类型
|
|
|
|
|
case 'email':
|
|
|
|
|
return 'email'; // 邮箱输入类型
|
|
|
|
|
case 'phone':
|
|
|
|
|
return 'tel'; // 电话号码输入类型
|
|
|
|
|
default:
|
|
|
|
|
return 'text'; // 默认文本输入类型
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 输入框提示文字
|
|
|
|
|
const placeholder = computed(() => {
|
|
|
|
|
switch (currentType.value) {
|
|
|
|
|
case 'username': return '请输入用户名';
|
|
|
|
|
case 'email': return '请输入邮箱';
|
|
|
|
|
case 'phone': return '请输入手机号';
|
|
|
|
|
default: return '';
|
|
|
|
|
case 'username':
|
|
|
|
|
return '请输入用户名';
|
|
|
|
|
case 'email':
|
|
|
|
|
return '请输入邮箱';
|
|
|
|
|
case 'phone':
|
|
|
|
|
return '请输入手机号';
|
|
|
|
|
default:
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
@ -125,7 +130,7 @@ export default {
|
|
|
|
|
|
|
|
|
|
// 验证输入框是否有效
|
|
|
|
|
const isValidInput = computed(() => {
|
|
|
|
|
const value = loginForm.value.userFlag
|
|
|
|
|
const value = loginForm.value.userFlag;
|
|
|
|
|
if (!value) return false; // 输入不能为空
|
|
|
|
|
|
|
|
|
|
switch (currentType.value) {
|
|
|
|
@ -174,16 +179,15 @@ export default {
|
|
|
|
|
console.error('发送验证码失败:', error);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//登录
|
|
|
|
|
/*
|
|
|
|
|
function login1() {
|
|
|
|
|
//前端测试登录
|
|
|
|
|
function Login1() {
|
|
|
|
|
userStore.login({
|
|
|
|
|
avatar: '/assets/default-avatar/boy_1.png',
|
|
|
|
|
avatar:require('@/assets/default-avatar/boy_1.png'),
|
|
|
|
|
userName: '珈人一号'
|
|
|
|
|
})
|
|
|
|
|
}*/
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
emit('LoginSuccess');
|
|
|
|
|
}
|
|
|
|
|
// 登录
|
|
|
|
|
async function login() {
|
|
|
|
|
if (!isvalidForm.value) return;
|
|
|
|
|
|
|
|
|
@ -191,7 +195,7 @@ export default {
|
|
|
|
|
const loginData = {
|
|
|
|
|
userFlag: loginForm.value.userFlag,
|
|
|
|
|
password: loginForm.value.password
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (showVerifyCode.value) {
|
|
|
|
|
loginData.verifyCode = loginForm.value.verifyCode; // 验证码
|
|
|
|
@ -202,7 +206,6 @@ export default {
|
|
|
|
|
|
|
|
|
|
if (response.code === 200) {
|
|
|
|
|
// 登录成功,保存token到本地存储
|
|
|
|
|
//还应读入用户数据,后续设计
|
|
|
|
|
const { accessToken, refreshToken } = response.data;
|
|
|
|
|
localStorage.setItem('accessToken', accessToken);
|
|
|
|
|
localStorage.setItem('refreshToken', refreshToken);
|
|
|
|
@ -210,15 +213,14 @@ export default {
|
|
|
|
|
userStore.login({
|
|
|
|
|
avatar: '/assets/default-avatar/boy_1.png',
|
|
|
|
|
userName: '珈人一号'
|
|
|
|
|
})
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
ElMessage({
|
|
|
|
|
message: '登录成功',
|
|
|
|
|
type: 'success',
|
|
|
|
|
duration: 500
|
|
|
|
|
});
|
|
|
|
|
//TODO:跳转到目标页面
|
|
|
|
|
//or 关闭登录弹窗
|
|
|
|
|
// TODO: 跳转到目标页面或关闭登录弹窗
|
|
|
|
|
} else {
|
|
|
|
|
// 登录失败
|
|
|
|
|
ElMessage({
|
|
|
|
@ -227,38 +229,19 @@ export default {
|
|
|
|
|
duration: 500
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('登录失败:', error);
|
|
|
|
|
alert(error.response?.message || '登录失败,请稍后重试');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//切换登陆方式时重置表单
|
|
|
|
|
// 切换登录方式时重置表单
|
|
|
|
|
const switchLoginType = (type) => {
|
|
|
|
|
currentType.value = type;
|
|
|
|
|
loginForm.value.userFlag = '';
|
|
|
|
|
loginForm.value.password = '';
|
|
|
|
|
loginForm.value.verifyCode = '';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 返回模板需要使用的数据和方法
|
|
|
|
|
return {
|
|
|
|
|
currentType,
|
|
|
|
|
loginTypes,
|
|
|
|
|
loginForm,
|
|
|
|
|
inputType,
|
|
|
|
|
placeholder,
|
|
|
|
|
showVerifyCode,
|
|
|
|
|
cooldown,
|
|
|
|
|
sendCode,
|
|
|
|
|
//login1,
|
|
|
|
|
login,
|
|
|
|
|
switchLoginType,
|
|
|
|
|
isValidInput
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<style scoped>
|
|
|
|
|