fix: align user group access controls

This commit is contained in:
fawney19
2026-05-10 17:28:23 +08:00
parent a8ac944959
commit d246f6b42c
33 changed files with 1958 additions and 1018 deletions

View File

@@ -1552,6 +1552,10 @@ function formatUserEffectiveRateLimitSource(user: User): string {
if (source.source === 'group' && source.group_name) {
return `继承自分组:${source.group_name}`
}
if (source.source === 'combined') {
const groupNames = Array.isArray(source.group_names) ? source.group_names.join('、') : ''
return groupNames ? `用户额外限制与分组叠加:${groupNames}` : '用户额外限制与分组叠加'
}
if (source.source === 'user') {
return '用户单独配置'
}
@@ -1596,14 +1600,6 @@ function editUser(user: User) {
unlimited: user.unlimited,
role: user.role,
is_active: user.is_active,
allowed_providers: user.allowed_providers == null ? null : [...user.allowed_providers],
allowed_api_formats: user.allowed_api_formats == null ? null : [...user.allowed_api_formats],
allowed_models: user.allowed_models == null ? null : [...user.allowed_models],
rate_limit: user.rate_limit ?? null,
allowed_providers_mode: user.allowed_providers_mode ?? (user.allowed_providers == null ? 'unrestricted' : 'specific'),
allowed_api_formats_mode: user.allowed_api_formats_mode ?? (user.allowed_api_formats == null ? 'unrestricted' : 'specific'),
allowed_models_mode: user.allowed_models_mode ?? (user.allowed_models == null ? 'unrestricted' : 'specific'),
rate_limit_mode: user.rate_limit_mode ?? (user.rate_limit == null ? 'system' : 'custom'),
group_ids: (user.groups || []).map(group => group.id),
}
showUserFormDialog.value = true
@@ -1624,14 +1620,6 @@ async function handleUserFormSubmit(data: UserFormData & { password?: string; un
email: data.email || undefined,
unlimited: data.unlimited,
role: data.role,
allowed_providers: data.allowed_providers,
allowed_providers_mode: data.allowed_providers_mode,
allowed_api_formats: data.allowed_api_formats,
allowed_api_formats_mode: data.allowed_api_formats_mode,
allowed_models: data.allowed_models,
allowed_models_mode: data.allowed_models_mode,
rate_limit: data.rate_limit ?? null,
rate_limit_mode: data.rate_limit_mode,
group_ids: data.group_ids ?? [],
}
if (data.password) {
@@ -1649,14 +1637,6 @@ async function handleUserFormSubmit(data: UserFormData & { password?: string; un
initial_gift_usd: data.initial_gift_usd,
unlimited: data.unlimited,
role: data.role,
allowed_providers: data.allowed_providers,
allowed_providers_mode: data.allowed_providers_mode,
allowed_api_formats: data.allowed_api_formats,
allowed_api_formats_mode: data.allowed_api_formats_mode,
allowed_models: data.allowed_models,
allowed_models_mode: data.allowed_models_mode,
rate_limit: data.rate_limit ?? null,
rate_limit_mode: data.rate_limit_mode,
group_ids: data.group_ids ?? [],
})
// 如果创建时指定为禁用,则更新状态

View File

@@ -15,6 +15,9 @@
数据预览
</p>
<ul class="space-y-1 text-muted-foreground">
<li v-if="importUsersPreview.user_groups?.length">
用户组: {{ importUsersPreview.user_groups.length }}
</li>
<li>用户: {{ importUsersPreview.users?.length || 0 }} </li>
<li>
API Keys: {{ importUsersPreview.users?.reduce((sum: number, u: { api_keys?: unknown[] }) => sum + (u.api_keys?.length || 0), 0) }}
@@ -93,6 +96,16 @@
class="space-y-4"
>
<div class="grid grid-cols-2 gap-4 text-sm">
<div v-if="importUsersResult.stats.user_groups">
<p class="font-medium">
用户组
</p>
<p class="text-muted-foreground">
创建: {{ importUsersResult.stats.user_groups.created }},
更新: {{ importUsersResult.stats.user_groups.updated }},
跳过: {{ importUsersResult.stats.user_groups.skipped }}
</p>
</div>
<div>
<p class="font-medium">
用户

View File

@@ -36,7 +36,9 @@ function looksLikeConfigExport(value: JsonObject): boolean {
}
function looksLikeUsersExport(value: JsonObject): boolean {
return hasArrayField(value, 'users') || hasArrayField(value, 'standalone_keys')
return hasArrayField(value, 'users')
|| hasArrayField(value, 'standalone_keys')
|| hasArrayField(value, 'user_groups')
}
export function useConfigExportImport(systemConfig: { value: SystemConfig }) {
@@ -231,6 +233,11 @@ export function useConfigExportImport(systemConfig: { value: SystemConfig }) {
return
}
if (root.user_groups != null && !Array.isArray(root.user_groups)) {
error('无效的用户数据文件user_groups 必须是数组')
return
}
if (root.standalone_keys != null && !Array.isArray(root.standalone_keys)) {
error('无效的用户数据文件standalone_keys 必须是数组')
return