36 changed files with 268 additions and 45 deletions
@ -0,0 +1,154 @@ |
|||||
|
<template> |
||||
|
<template v-if="getShow"> |
||||
|
<LoginFormTitle class="enter-x" /> |
||||
|
<Form |
||||
|
class="p-4 enter-x" |
||||
|
:model="formData" |
||||
|
:rules="getFormRules" |
||||
|
ref="formRef" |
||||
|
colon |
||||
|
labelAlign="left" |
||||
|
layout="vertical" |
||||
|
@keypress.enter="handleLogin" |
||||
|
> |
||||
|
<FormItem name="userName" class="enter-x" :label="t('AbpAccount.DisplayName:UserName')"> |
||||
|
<BInput |
||||
|
size="large" |
||||
|
v-model:value="formData.userName" |
||||
|
:placeholder="t('AbpAccount.DisplayName:UserName')" |
||||
|
class="fix-auto-fill" |
||||
|
/> |
||||
|
</FormItem> |
||||
|
<FormItem name="password" class="enter-x" :label="t('AbpAccount.DisplayName:Password')"> |
||||
|
<InputPassword |
||||
|
size="large" |
||||
|
visibilityToggle |
||||
|
autocomplete="off" |
||||
|
v-model:value="formData.password" |
||||
|
:placeholder="t('AbpAccount.DisplayName:Password')" |
||||
|
/> |
||||
|
</FormItem> |
||||
|
|
||||
|
<FormItem class="enter-x"> |
||||
|
<Button type="primary" size="large" block @click="handleLogin" :loading="loading"> |
||||
|
{{ L('Login') }} |
||||
|
</Button> |
||||
|
<Button size="large" block class="mt-4" @click="handleBackLogin"> |
||||
|
{{ L('GoBack') }} |
||||
|
</Button> |
||||
|
</FormItem> |
||||
|
</Form> |
||||
|
<BasicModal @register="registerModal" :title="t('sys.login.loginToPortalTitle')" :height="400"> |
||||
|
<List item-layout="horizontal" :data-source="portalModel"> |
||||
|
<template #renderItem="{ item }"> |
||||
|
<ListItem> |
||||
|
<ListItemMeta> |
||||
|
<template #title> |
||||
|
<Button type="text" @click="handleLoginTo(item.Id)" :loading="loading" :disabled="loading">{{ item.Name }}</Button> |
||||
|
</template> |
||||
|
<template #avatar> |
||||
|
<Avatar :src="item.Logo" /> |
||||
|
</template> |
||||
|
</ListItemMeta> |
||||
|
</ListItem> |
||||
|
</template> |
||||
|
</List> |
||||
|
</BasicModal> |
||||
|
</template> |
||||
|
</template> |
||||
|
<script lang="ts" setup> |
||||
|
import { reactive, ref, computed, unref, inject } from 'vue'; |
||||
|
import { Avatar, Form, Button, Input, List } from 'ant-design-vue'; |
||||
|
import { BasicModal, useModal } from '/@/components/Modal'; |
||||
|
import LoginFormTitle from './LoginFormTitle.vue'; |
||||
|
import { useLocalization } from '/@/hooks/abp/useLocalization'; |
||||
|
import { useLoginState, useFormRules, useFormValid, LoginStateEnum } from './useLogin'; |
||||
|
import { useAbpStoreWithOut } from '/@/store/modules/abp'; |
||||
|
import { useUserStoreWithOut } from '/@/store/modules/user'; |
||||
|
import { useI18n } from '/@/hooks/web/useI18n'; |
||||
|
import { useMessage } from '/@/hooks/web/useMessage'; |
||||
|
import { useGlobSetting } from '/@/hooks/setting'; |
||||
|
import { PortalLoginModel } from '/@/api/sys/model/userModel'; |
||||
|
|
||||
|
const FormItem = Form.Item; |
||||
|
const InputPassword = Input.Password; |
||||
|
const ListItem = List.Item; |
||||
|
const ListItemMeta = ListItem.Meta; |
||||
|
|
||||
|
const { notification } = useMessage(); |
||||
|
const [registerModal, { openModal, closeModal }] = useModal(); |
||||
|
const { t } = useI18n(); |
||||
|
const { L } = useLocalization('AbpAccount'); |
||||
|
const { handleBackLogin, getLoginState } = useLoginState(); |
||||
|
const userStore = useUserStoreWithOut(); |
||||
|
const abpStore = useAbpStoreWithOut(); |
||||
|
|
||||
|
const formRef = ref(); |
||||
|
const loading = ref(false); |
||||
|
const portalModel = ref<PortalLoginModel[]>([]); |
||||
|
|
||||
|
const formData = reactive({ |
||||
|
userName: '', |
||||
|
password: '', |
||||
|
}); |
||||
|
|
||||
|
const { validForm } = useFormValid(formRef); |
||||
|
const { getFormRules } = useFormRules(); |
||||
|
const globSetting = useGlobSetting(); |
||||
|
const cookies = inject<any>('$cookies'); |
||||
|
|
||||
|
const getShow = computed(() => unref(getLoginState) === LoginStateEnum.Portal); |
||||
|
|
||||
|
async function handleLoginTo(enterpriseId?: string) { |
||||
|
const data = await validForm(); |
||||
|
if (!data) return; |
||||
|
try { |
||||
|
loading.value = true; |
||||
|
closeModal(); |
||||
|
const userInfo = await userStore.login({ |
||||
|
username: data.userName, |
||||
|
password: data.password, |
||||
|
enterpriseId: enterpriseId, |
||||
|
mode: 'none', //不要默认的错误提示 |
||||
|
isPortalLogin: true, |
||||
|
loginCallback: () => { |
||||
|
return new Promise((resolve) => { |
||||
|
var currentTenant = abpStore.getApplication.currentTenant; |
||||
|
if (currentTenant.id) { |
||||
|
setTimeout(() => { |
||||
|
cookies?.set(globSetting.multiTenantKey, currentTenant.id); |
||||
|
return resolve(); |
||||
|
}, 100); |
||||
|
} else { |
||||
|
return resolve(); |
||||
|
} |
||||
|
}); |
||||
|
}, |
||||
|
}); |
||||
|
if (userInfo) { |
||||
|
notification.success({ |
||||
|
message: t('sys.login.loginSuccessTitle'), |
||||
|
description: `${t('sys.login.loginSuccessDesc')}: ${ |
||||
|
userInfo.realName ?? userInfo.username |
||||
|
}`, |
||||
|
duration: 3, |
||||
|
}); |
||||
|
} |
||||
|
} catch (error) { |
||||
|
portalModel.value = JSON.parse(error as string) as PortalLoginModel[]; |
||||
|
openModal(true); |
||||
|
// createConfirm({ |
||||
|
// iconType: 'info', |
||||
|
// title: '请选择登陆平台', |
||||
|
// content: '', |
||||
|
// okCancel: false, |
||||
|
// }); |
||||
|
} finally { |
||||
|
loading.value = false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
async function handleLogin() { |
||||
|
await handleLoginTo(); |
||||
|
} |
||||
|
</script> |
||||
Loading…
Reference in new issue