feat(passport): 增加多租户手机号登录支持并修复邮箱验证码校验
- 修复邮箱登录验证码未校验问题,恢复输入错误提示及刷新验证码逻辑 - 新增多租户选项登录流程,支持单租户直接登录及多租户选择弹窗 - 扩展登录接口及模型,新增 TenantOption 类型和 LoginOutcome 联合结果类型 - 新增 loginBySelectTenant 二次登录接口及对应组件逻辑 - 统一保存登录态,包括 token、租户ID和用户ID到本地存储 - 调整前端短信登录逻辑,根据返回状态决定流程,支持多租户弹窗选择 - 确保新增代码无类型错误并通过构建验证
This commit is contained in:
@@ -270,6 +270,35 @@
|
||||
</a-list>
|
||||
</div>
|
||||
</a-modal>
|
||||
|
||||
<!-- 多租户选择登录 -->
|
||||
<a-modal
|
||||
:width="420"
|
||||
:footer="null"
|
||||
:mask-closable="false"
|
||||
title="请选择要登录的租户"
|
||||
v-model:visible="showSelectTenantModal"
|
||||
>
|
||||
<div class="flex flex-col justify-start">
|
||||
<a-list item-layout="horizontal" :data-source="pendingTenants">
|
||||
<template #renderItem="{ item }">
|
||||
<a-list-item
|
||||
class="cursor-pointer hover:border-gray-100"
|
||||
@click="onSelectTenant(item)"
|
||||
>
|
||||
<a-list-item-meta :description="`租户ID: ${item.tenantId}`">
|
||||
<template #title>
|
||||
{{ item.tenantName }}
|
||||
</template>
|
||||
</a-list-item-meta>
|
||||
<template #actions>
|
||||
<RightOutlined />
|
||||
</template>
|
||||
</a-list-item>
|
||||
</template>
|
||||
</a-list>
|
||||
</div>
|
||||
</a-modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -291,8 +320,10 @@
|
||||
loginBySuperAdminSms,
|
||||
getCaptcha,
|
||||
loginByEmail,
|
||||
loginByUserId
|
||||
loginByUserId,
|
||||
loginBySelectTenant
|
||||
} from '@/api/passport/login';
|
||||
import type { TenantOption } from '@/api/passport/login/model';
|
||||
import QrLogin from '@/components/QrLogin/index.vue';
|
||||
|
||||
import { User } from '@/api/system/user/model';
|
||||
@@ -467,6 +498,10 @@
|
||||
// 多用户选择账号登录
|
||||
const showSelectLoginUser = ref<boolean>(false);
|
||||
const admins = ref<User[]>([]);
|
||||
// 多租户选择登录
|
||||
const showSelectTenantModal = ref<boolean>(false);
|
||||
const pendingTenants = ref<TenantOption[]>([]);
|
||||
const selectingTenant = ref<boolean>(false);
|
||||
// const tenantId = getTenantId();
|
||||
|
||||
// 表格选中数据
|
||||
@@ -585,23 +620,18 @@
|
||||
loading.value = true;
|
||||
form.code = form.smsCode?.toLowerCase();
|
||||
loginBySuperAdminSms(form)
|
||||
.then((msg) => {
|
||||
if (msg == '请选择登录用户') {
|
||||
showSelectLoginUser.value = true;
|
||||
listAdminsByPhoneAll({
|
||||
phone: form.phone,
|
||||
templateId: TEMPLATE_ID
|
||||
}).then((data) => {
|
||||
admins.value = data;
|
||||
});
|
||||
return false;
|
||||
} else {
|
||||
message.success(msg);
|
||||
.then((outcome) => {
|
||||
if (outcome.status === 'selectTenant') {
|
||||
pendingTenants.value = outcome.tenants;
|
||||
showSelectTenantModal.value = true;
|
||||
loading.value = false;
|
||||
resetFields();
|
||||
cleanPageTabs();
|
||||
goHome();
|
||||
return;
|
||||
}
|
||||
message.success(outcome.message);
|
||||
loading.value = false;
|
||||
resetFields();
|
||||
cleanPageTabs();
|
||||
goHome();
|
||||
})
|
||||
.catch((e: Error) => {
|
||||
message.error(e.message);
|
||||
@@ -616,6 +646,29 @@
|
||||
onLoginBySms();
|
||||
};
|
||||
|
||||
/* 选择租户后二次登录 */
|
||||
const onSelectTenant = (item: TenantOption) => {
|
||||
if (selectingTenant.value || item.tenantId == null) return;
|
||||
selectingTenant.value = true;
|
||||
loginBySelectTenant({
|
||||
phone: form.phone,
|
||||
code: form.smsCode || '',
|
||||
tenantId: item.tenantId,
|
||||
remember: form.remember
|
||||
})
|
||||
.then((outcome) => {
|
||||
showSelectTenantModal.value = false;
|
||||
message.success(outcome.message);
|
||||
resetFields();
|
||||
cleanPageTabs();
|
||||
goHome();
|
||||
})
|
||||
.catch((e: Error) => message.error(e.message))
|
||||
.finally(() => {
|
||||
selectingTenant.value = false;
|
||||
});
|
||||
};
|
||||
|
||||
/* 保存编辑 */
|
||||
const submit = () => {
|
||||
if (!formRef.value) {
|
||||
@@ -624,11 +677,11 @@
|
||||
formRef.value
|
||||
.validate()
|
||||
.then(() => {
|
||||
// if (form.code?.toLowerCase() !== text.value) {
|
||||
// message.error('验证码错误');
|
||||
// changeCaptcha();
|
||||
// return;
|
||||
// }
|
||||
if (form.code?.toLowerCase() !== text.value) {
|
||||
message.error('验证码错误');
|
||||
changeCaptcha();
|
||||
return;
|
||||
}
|
||||
const account = (form.account || '').trim();
|
||||
// 邮箱格式判断
|
||||
const isEmail = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(account);
|
||||
|
||||
Reference in New Issue
Block a user