修复三个问题:1.钉钉登录时保留管理员角色 2.用户管理已支持设置管理员角色 3.网站设置添加注册功能开关

This commit is contained in:
Your Name 2026-01-02 16:08:44 +08:00
parent e1989510de
commit cfa38c9b36
3 changed files with 92 additions and 5 deletions

View File

@ -508,8 +508,17 @@ public class UserService {
if (primaryDept != null) {
user.setDeptId(primaryDeptId);
user.setDeptName(primaryDept.getDeptName());
// 根据主部门类型设置角色
user.setRoleIds("receiving".equals(primaryDept.getDeptType()) ? "5" : "6");
// 根据主部门类型设置角色(但如果用户已经是管理员,保留管理员角色)
String currentRoleIds = user.getRoleIds();
boolean isAdmin = currentRoleIds != null &&
(currentRoleIds.contains("1") || currentRoleIds.contains("2"));
if (!isAdmin) {
// 只有非管理员用户才根据部门类型设置角色
user.setRoleIds("receiving".equals(primaryDept.getDeptType()) ? "5" : "6");
} else {
log.info("用户已是管理员,保留管理员角色: userId={}, roleIds={}",
user.getId(), currentRoleIds);
}
user.setStatus(1); // 启用用户
needUpdate = true;
log.info("同步用户多个部门: userId={}, 部门数量={}, 主部门={}",
@ -530,7 +539,17 @@ public class UserService {
setUserDepartments(user.getId(), List.of(defaultDept.getId()), defaultDept.getId());
user.setDeptId(defaultDept.getId());
user.setDeptName(defaultDept.getDeptName());
user.setRoleIds("receiving".equals(defaultDept.getDeptType()) ? "5" : "6");
// 根据部门类型设置角色(但如果用户已经是管理员,保留管理员角色)
String currentRoleIds = user.getRoleIds();
boolean isAdmin = currentRoleIds != null &&
(currentRoleIds.contains("1") || currentRoleIds.contains("2"));
if (!isAdmin) {
// 只有非管理员用户才根据部门类型设置角色
user.setRoleIds("receiving".equals(defaultDept.getDeptType()) ? "5" : "6");
} else {
log.info("用户已是管理员,保留管理员角色: userId={}, roleIds={}",
user.getId(), currentRoleIds);
}
user.setStatus(1); // 启用用户
needUpdate = true;
log.warn("已有用户无法匹配,使用默认部门: userId={}, deptId={}, deptName={}, 钉钉部门: {}",

View File

@ -74,7 +74,7 @@
</a-button>
</a-form-item>
<div class="auth-switch">
<div v-if="registerEnabled" class="auth-switch">
<span class="switch-text">还没有账号?</span>
<button type="button" class="switch-link" @click="activeTab = 'register'">
注册账号
@ -226,12 +226,14 @@ import * as departmentApi from '@/api/department'
import { isDingTalkFeatureEnabled } from '@/api/dingtalk'
import request from '@/utils/request'
import type { Result } from '@/api/types'
import { getSystemConfig } from '@/api/system'
const router = useRouter()
const authStore = useAuthStore()
const siteSettingsStore = useSiteSettingsStore()
const activeTab = ref<'login' | 'register'>('login')
const registerEnabled = ref(true)
const loading = ref(false)
const registerLoading = ref(false)
@ -393,6 +395,22 @@ const checkDingTalkLogin = async () => {
}
}
// 检查注册功能是否启用
const checkRegisterEnabled = async () => {
try {
const response = await getSystemConfig('site.register.enabled')
if (response.data) {
registerEnabled.value = response.data === 'true' || response.data === '1'
} else {
registerEnabled.value = true // 默认开启
}
console.log('注册功能状态:', registerEnabled.value)
} catch (error) {
console.error('检查注册功能状态失败:', error)
registerEnabled.value = true // 默认开启
}
}
// 处理钉钉登录
const handleDingTalkLogin = async () => {
dingTalkLoginLoading.value = true
@ -430,6 +448,9 @@ onMounted(() => {
// 检查钉钉登录是否启用
checkDingTalkLogin()
// 检查注册功能是否启用
checkRegisterEnabled()
// 监听网站设置更新事件(在加载后监听,确保能接收到事件)
window.addEventListener('siteSettingsUpdated', handleSiteSettingsUpdate)

View File

@ -62,6 +62,18 @@
</div>
</a-form-item>
<a-divider orientation="left">功能开关</a-divider>
<a-form-item label="注册功能">
<a-switch
v-model:checked="siteSettings.registerEnabled"
checked-children="开启"
un-checked-children="关闭"
/>
<div style="margin-top: 8px; font-size: 12px; color: #888;">
控制登录页面是否显示注册功能
</div>
</a-form-item>
<a-form-item>
<a-button type="primary" size="large" @click="handleSaveSiteSettings" :loading="savingSiteSettings">
<template #icon><Icon name="check" size="sm" /></template>
@ -1384,8 +1396,10 @@ const router = useRouter()
const siteSettings = reactive({
siteName: 'DesignHub',
logoUrl: '',
registerEnabled: true,
siteNameConfigId: null as number | null,
logoConfigId: null as number | null
logoConfigId: null as number | null,
registerEnabledConfigId: null as number | null
})
const loading = reactive({
@ -2519,11 +2533,21 @@ const loadSiteSettings = async () => {
} else {
siteSettings.logoUrl = siteSettingsStore.logoUrl
}
// 查找注册功能开关配置
const registerConfig = configs.find((c: any) => c.configKey === 'site.register.enabled')
if (registerConfig) {
siteSettings.registerEnabled = registerConfig.configValue === 'true' || registerConfig.configValue === '1'
siteSettings.registerEnabledConfigId = registerConfig.id
} else {
siteSettings.registerEnabled = true // 默认开启
}
} catch (error) {
console.error('加载网站设置失败:', error)
// 如果API失败,尝试从store读取
siteSettings.siteName = siteSettingsStore.siteName
siteSettings.logoUrl = siteSettingsStore.logoUrl
siteSettings.registerEnabled = true // 默认开启
} finally {
loadingSiteSettings.value = false
}
@ -2599,6 +2623,29 @@ const handleSaveSiteSettings = async () => {
}
}
// 保存注册功能开关
if (siteSettings.registerEnabledConfigId) {
// 如果配置已存在,更新
await updateSystemConfig(siteSettings.registerEnabledConfigId, {
configValue: siteSettings.registerEnabled ? 'true' : 'false'
})
} else {
// 如果配置不存在,创建
const response = await createSystemConfig({
configKey: 'site.register.enabled',
configValue: siteSettings.registerEnabled ? 'true' : 'false',
configGroup: 'site',
configName: '注册功能开关',
description: '控制登录页面是否显示注册功能',
valueType: 'boolean',
builtIn: 0,
sortOrder: 3
})
if (response.data && response.data.id) {
siteSettings.registerEnabledConfigId = response.data.id
}
}
// 更新全局store(这会自动更新所有使用store的组件)
siteSettingsStore.updateSiteSettings(siteSettings.siteName, siteSettings.logoUrl)