From 7b8bb6b1d8d2505c06fa3740349b96798ec8c900 Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期四, 02 四月 2026 16:06:21 +0800
Subject: [PATCH] #登录页修复
---
rsf-design/src/views/auth/login/index.vue | 123 ++++++++++++++++++++++++++++++++++++++++
1 files changed, 121 insertions(+), 2 deletions(-)
diff --git a/rsf-design/src/views/auth/login/index.vue b/rsf-design/src/views/auth/login/index.vue
index 1f6abd5..2ed47e0 100644
--- a/rsf-design/src/views/auth/login/index.vue
+++ b/rsf-design/src/views/auth/login/index.vue
@@ -35,6 +35,23 @@
show-password
/>
</ElFormItem>
+ <ElFormItem v-if="requiresTenantSelection" prop="tenantId">
+ <ElSelect
+ v-model="formData.tenantId"
+ class="w-full"
+ clearable
+ filterable
+ :loading="tenantLoading"
+ :placeholder="$t('login.placeholder.tenant')"
+ >
+ <ElOption
+ v-for="tenant in tenantOptions"
+ :key="tenant.id"
+ :label="tenant.name"
+ :value="tenant.id"
+ />
+ </ElSelect>
+ </ElFormItem>
<div class="flex-cb mt-2 text-sm">
<ElCheckbox v-model="formData.rememberPassword">{{
@@ -72,9 +89,16 @@
<script setup>
import AppConfig from '@/config'
+ import { StorageConfig } from '@/utils/storage/storage-config'
import { useUserStore } from '@/store/modules/user'
import { useI18n } from 'vue-i18n'
- import { fetchGetUserInfo, fetchLogin, normalizeLoginResponse } from '@/api/auth'
+ import {
+ fetchGetSystemInfo,
+ fetchGetTenantList,
+ fetchGetUserInfo,
+ fetchLogin,
+ normalizeLoginResponse
+ } from '@/api/auth'
import { ElNotification } from 'element-plus'
defineOptions({ name: 'Login' })
const { t, locale } = useI18n()
@@ -90,13 +114,92 @@
const formData = reactive({
username: '',
password: '',
+ tenantId: '',
rememberPassword: true
})
+ const loginMode = ref('')
+ const tenantLoading = ref(false)
+ const tenantOptions = ref([])
+ const requiresTenantSelection = computed(() => loginMode.value === 'OFFLINE')
const rules = computed(() => ({
username: [{ required: true, message: t('login.placeholder.username'), trigger: 'blur' }],
- password: [{ required: true, message: t('login.placeholder.password'), trigger: 'blur' }]
+ password: [{ required: true, message: t('login.placeholder.password'), trigger: 'blur' }],
+ tenantId: requiresTenantSelection.value
+ ? [{ required: true, message: t('login.placeholder.tenant'), trigger: 'change' }]
+ : []
}))
const loading = ref(false)
+
+ const hydrateRememberedLogin = () => {
+ const rememberEnabled =
+ localStorage.getItem(StorageConfig.LOGIN_REMEMBER_ENABLED_KEY) !== 'false'
+ formData.rememberPassword = rememberEnabled
+ if (rememberEnabled) {
+ formData.username = localStorage.getItem(StorageConfig.LOGIN_REMEMBER_USERNAME_KEY) || ''
+ formData.password = localStorage.getItem(StorageConfig.LOGIN_REMEMBER_PASSWORD_KEY) || ''
+ }
+ }
+
+ const persistRememberedTenant = (tenantId) => {
+ if (tenantId === '' || tenantId === null || tenantId === void 0) {
+ localStorage.removeItem(StorageConfig.LOGIN_REMEMBER_TENANT_ID_KEY)
+ return
+ }
+ localStorage.setItem(StorageConfig.LOGIN_REMEMBER_TENANT_ID_KEY, String(tenantId))
+ }
+
+ const applyDefaultTenantSelection = () => {
+ if (!requiresTenantSelection.value || tenantOptions.value.length === 0) {
+ formData.tenantId = ''
+ return
+ }
+
+ const rememberedTenantId = localStorage.getItem(StorageConfig.LOGIN_REMEMBER_TENANT_ID_KEY)
+ const matchedTenant = tenantOptions.value.find(
+ (item) => String(item.id) === String(rememberedTenantId)
+ )
+
+ formData.tenantId = matchedTenant?.id ?? tenantOptions.value[0].id
+ persistRememberedTenant(formData.tenantId)
+ }
+
+ const loadLoginSupports = async () => {
+ const systemInfo = await fetchGetSystemInfo()
+ loginMode.value = systemInfo?.mode || ''
+
+ if (!requiresTenantSelection.value) {
+ tenantOptions.value = []
+ formData.tenantId = ''
+ return
+ }
+
+ tenantLoading.value = true
+ try {
+ const tenants = await fetchGetTenantList()
+ tenantOptions.value = Array.isArray(tenants) ? tenants : []
+ applyDefaultTenantSelection()
+ } finally {
+ tenantLoading.value = false
+ }
+ }
+
+ const persistRememberedLogin = () => {
+ localStorage.setItem(
+ StorageConfig.LOGIN_REMEMBER_ENABLED_KEY,
+ String(Boolean(formData.rememberPassword))
+ )
+
+ if (formData.rememberPassword) {
+ localStorage.setItem(StorageConfig.LOGIN_REMEMBER_USERNAME_KEY, formData.username || '')
+ localStorage.setItem(StorageConfig.LOGIN_REMEMBER_PASSWORD_KEY, formData.password || '')
+ } else {
+ localStorage.removeItem(StorageConfig.LOGIN_REMEMBER_USERNAME_KEY)
+ localStorage.removeItem(StorageConfig.LOGIN_REMEMBER_PASSWORD_KEY)
+ }
+
+ persistRememberedTenant(formData.tenantId)
+ }
+
const handleSubmit = async () => {
if (!formRef.value) return
try {
@@ -105,6 +208,7 @@
loading.value = true
const payload = normalizeLoginResponse(await fetchLogin(formData))
if (!payload.accessToken) return
+ persistRememberedLogin()
userStore.setToken(payload.accessToken, payload.refreshToken)
userStore.setLoginStatus(true)
const userInfo = await fetchGetUserInfo()
@@ -119,6 +223,21 @@
loading.value = false
}
}
+
+ watch(
+ () => formData.tenantId,
+ (value) => {
+ if (requiresTenantSelection.value) {
+ persistRememberedTenant(value)
+ }
+ }
+ )
+
+ onMounted(async () => {
+ hydrateRememberedLogin()
+ await loadLoginSupports()
+ })
+
const showLoginSuccessNotice = () => {
setTimeout(() => {
ElNotification({
--
Gitblit v1.9.1