feat(passport): 支持邮箱和用户ID登录合并账号登录

- LoginParam 接口新增 email 和 userId 字段
- 新增 loginByEmail 和 loginByUserId 接口调用,逻辑与 login 类似
- 登录页账号输入框改为 account,支持输入邮箱或用户ID
- 提交时根据账号格式(邮箱或纯数字)调用对应登录接口
- 校验规则改为校验 account 字段,格式不符时提示错误
- 手机号短信登录改用 loginBySuperAdminSms 接口替代 loginBySms
- 登录成功后保存租户ID和用户ID至 localStorage
- 优化登录页相关导入及逻辑,提升登录体验
This commit is contained in:
2026-07-18 17:00:39 +08:00
parent bef50c2f26
commit 2037b0699a
5 changed files with 259 additions and 11 deletions

View File

@@ -77,12 +77,12 @@
<!-- </template>-->
<!-- </a-input>-->
<!-- </a-form-item>-->
<a-form-item name="username">
<a-form-item name="account">
<a-input
allow-clear
size="large"
v-model:value="form.userId"
:placeholder="`用户ID`"
v-model:value="form.account"
placeholder="邮箱 / 用户ID"
>
<template #prefix>
<UserOutlined />
@@ -278,7 +278,12 @@
RightOutlined
} from '@ant-design/icons-vue';
import { goHomeRoute, cleanPageTabs } from '@/utils/page-tab-util';
import { login, loginBySms, getCaptcha } from '@/api/passport/login';
import {
loginBySuperAdminSms,
getCaptcha,
loginByEmail,
loginByUserId
} from '@/api/passport/login';
import QrLogin from '@/components/QrLogin/index.vue';
import { User } from '@/api/system/user/model';
@@ -346,8 +351,10 @@
console.warn('获取网站配置失败,使用默认配置:', e.message);
}
};
const { form } = useFormData<User>({
userId: undefined,
type LoginForm = User & { account?: string };
const { form } = useFormData<LoginForm>({
account: '',
username: '',
phone: '',
password: '',
@@ -383,7 +390,7 @@
// 表单验证规则
const rules = reactive({
userId: [
account: [
{
required: true,
message: t('login.username'),
@@ -479,7 +486,7 @@
.then(() => {
loading.value = true;
form.code = form.smsCode?.toLowerCase();
loginBySms(form)
loginBySuperAdminSms(form)
.then((msg) => {
if (msg == '请选择登录用户') {
showSelectLoginUser.value = true;
@@ -524,10 +531,25 @@
// changeCaptcha();
// return;
// }
const account = (form.account || '').trim();
// 邮箱格式判断
const isEmail = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(account);
// 纯数字判断用户ID
const isPureNumber = /^\d+$/.test(account);
if (!isEmail && !isPureNumber) {
message.error('请输入正确的邮箱或用户ID');
return;
}
loading.value = true;
form.code = form.code?.toLowerCase();
form.phone = undefined;
login(form)
const payload = {
password: form.password,
code: form.code?.toLowerCase(),
remember: form.remember
};
const loginApi = isEmail
? loginByEmail({ ...payload, email: account })
: loginByUserId({ ...payload, userId: account });
loginApi
.then((msg) => {
if (msg == '请选择登录用户') {
showSelectLoginUser.value = true;