refactor: 清理数据库字段命名歧义

- users 表:重命名 allowed_endpoints 为 allowed_api_formats(修正历史命名错误)
- api_keys 表:删除 allowed_endpoints 字段(未使用的功能)
- providers 表:删除 rate_limit 字段(与 rpm_limit 重复)
- usage 表:重命名 provider 为 provider_name(避免与 provider_id 外键混淆)

同步更新前后端所有相关代码
This commit is contained in:
fawney19
2026-01-07 19:53:32 +08:00
parent 6885cf1f6d
commit a12b43ce5c
24 changed files with 155 additions and 107 deletions

View File

@@ -22,7 +22,7 @@ export interface UserExport {
password_hash: string
role: string
allowed_providers?: string[] | null
allowed_endpoints?: string[] | null
allowed_api_formats?: string[] | null
allowed_models?: string[] | null
model_capability_settings?: any
quota_usd?: number | null
@@ -40,7 +40,6 @@ export interface UserApiKeyExport {
balance_used_usd?: number
current_balance_usd?: number | null
allowed_providers?: string[] | null
allowed_endpoints?: string[] | null
allowed_api_formats?: string[] | null
allowed_models?: string[] | null
rate_limit?: number | null // null = 无限制

View File

@@ -98,7 +98,7 @@ export interface User {
used_usd?: number
total_usd?: number
allowed_providers?: string[] | null // 允许使用的提供商 ID 列表
allowed_endpoints?: string[] | null // 允许使用的端点 ID 列表
allowed_api_formats?: string[] | null // 允许使用的 API 格式列表
allowed_models?: string[] | null // 允许使用的模型名称列表
created_at: string
last_login_at?: string

View File

@@ -10,7 +10,7 @@ export interface User {
used_usd: number
total_usd: number
allowed_providers: string[] | null // 允许使用的提供商 ID 列表
allowed_endpoints: string[] | null // 允许使用的端点 ID 列表
allowed_api_formats: string[] | null // 允许使用的 API 格式列表
allowed_models: string[] | null // 允许使用的模型名称列表
created_at: string
updated_at?: string
@@ -23,7 +23,7 @@ export interface CreateUserRequest {
role?: 'admin' | 'user'
quota_usd?: number | null
allowed_providers?: string[] | null
allowed_endpoints?: string[] | null
allowed_api_formats?: string[] | null
allowed_models?: string[] | null
}
@@ -34,7 +34,7 @@ export interface UpdateUserRequest {
quota_usd?: number | null
password?: string
allowed_providers?: string[] | null
allowed_endpoints?: string[] | null
allowed_api_formats?: string[] | null
allowed_models?: string[] | null
}

View File

@@ -273,8 +273,8 @@
class="w-full h-10 px-3 border rounded-lg bg-background text-left flex items-center justify-between hover:bg-muted/50 transition-colors"
@click="endpointDropdownOpen = !endpointDropdownOpen"
>
<span :class="form.allowed_endpoints.length ? 'text-foreground' : 'text-muted-foreground'">
{{ form.allowed_endpoints.length ? `已选择 ${form.allowed_endpoints.length}` : '全部可用' }}
<span :class="form.allowed_api_formats.length ? 'text-foreground' : 'text-muted-foreground'">
{{ form.allowed_api_formats.length ? `已选择 ${form.allowed_api_formats.length}` : '全部可用' }}
</span>
<ChevronDown
class="h-4 w-4 text-muted-foreground transition-transform"
@@ -294,14 +294,14 @@
v-for="format in apiFormats"
:key="format.value"
class="flex items-center gap-2 px-3 py-2 hover:bg-muted/50 cursor-pointer"
@click="toggleSelection('allowed_endpoints', format.value)"
@click="toggleSelection('allowed_api_formats', format.value)"
>
<input
type="checkbox"
:checked="form.allowed_endpoints.includes(format.value)"
:checked="form.allowed_api_formats.includes(format.value)"
class="h-4 w-4 rounded border-gray-300 cursor-pointer"
@click.stop
@change="toggleSelection('allowed_endpoints', format.value)"
@change="toggleSelection('allowed_api_formats', format.value)"
>
<span class="text-sm">{{ format.label }}</span>
</div>
@@ -374,7 +374,7 @@ export interface UserFormData {
role: 'admin' | 'user'
is_active?: boolean
allowed_providers?: string[] | null
allowed_endpoints?: string[] | null
allowed_api_formats?: string[] | null
allowed_models?: string[] | null
}
@@ -414,7 +414,7 @@ const form = ref({
unlimited: false,
is_active: true,
allowed_providers: [] as string[],
allowed_endpoints: [] as string[],
allowed_api_formats: [] as string[],
allowed_models: [] as string[]
})
@@ -435,7 +435,7 @@ function resetForm() {
unlimited: false,
is_active: true,
allowed_providers: [],
allowed_endpoints: [],
allowed_api_formats: [],
allowed_models: []
}
}
@@ -454,7 +454,7 @@ function loadUserData() {
unlimited: props.user.quota_usd == null,
is_active: props.user.is_active ?? true,
allowed_providers: props.user.allowed_providers || [],
allowed_endpoints: props.user.allowed_endpoints || [],
allowed_api_formats: props.user.allowed_api_formats || [],
allowed_models: props.user.allowed_models || []
}
}
@@ -495,7 +495,7 @@ async function loadAccessControlOptions() {
}
// 切换选择
function toggleSelection(field: 'allowed_providers' | 'allowed_endpoints' | 'allowed_models', value: string) {
function toggleSelection(field: 'allowed_providers' | 'allowed_api_formats' | 'allowed_models', value: string) {
const arr = form.value[field]
const index = arr.indexOf(value)
if (index === -1) {
@@ -520,7 +520,7 @@ async function handleSubmit() {
quota_usd: form.value.unlimited ? null : form.value.quota,
role: form.value.role,
allowed_providers: form.value.allowed_providers.length > 0 ? form.value.allowed_providers : null,
allowed_endpoints: form.value.allowed_endpoints.length > 0 ? form.value.allowed_endpoints : null,
allowed_api_formats: form.value.allowed_api_formats.length > 0 ? form.value.allowed_api_formats : null,
allowed_models: form.value.allowed_models.length > 0 ? form.value.allowed_models : null
}

View File

@@ -22,7 +22,7 @@ export const MOCK_ADMIN_USER: User = {
used_usd: 156.78,
total_usd: 1234.56,
allowed_providers: null,
allowed_endpoints: null,
allowed_api_formats: null,
allowed_models: null,
created_at: '2024-01-01T00:00:00Z',
last_login_at: new Date().toISOString()
@@ -38,7 +38,7 @@ export const MOCK_NORMAL_USER: User = {
used_usd: 45.32,
total_usd: 245.32,
allowed_providers: null,
allowed_endpoints: null,
allowed_api_formats: null,
allowed_models: null,
created_at: '2024-06-01T00:00:00Z',
last_login_at: new Date().toISOString()
@@ -274,7 +274,7 @@ export const MOCK_ALL_USERS: AdminUser[] = [
used_usd: 156.78,
total_usd: 1234.56,
allowed_providers: null,
allowed_endpoints: null,
allowed_api_formats: null,
allowed_models: null,
created_at: '2024-01-01T00:00:00Z'
},
@@ -288,7 +288,7 @@ export const MOCK_ALL_USERS: AdminUser[] = [
used_usd: 45.32,
total_usd: 245.32,
allowed_providers: null,
allowed_endpoints: null,
allowed_api_formats: null,
allowed_models: null,
created_at: '2024-06-01T00:00:00Z'
},
@@ -302,7 +302,7 @@ export const MOCK_ALL_USERS: AdminUser[] = [
used_usd: 23.45,
total_usd: 123.45,
allowed_providers: null,
allowed_endpoints: null,
allowed_api_formats: null,
allowed_models: null,
created_at: '2024-03-15T00:00:00Z'
},
@@ -316,7 +316,7 @@ export const MOCK_ALL_USERS: AdminUser[] = [
used_usd: 89.12,
total_usd: 589.12,
allowed_providers: null,
allowed_endpoints: null,
allowed_api_formats: null,
allowed_models: null,
created_at: '2024-02-20T00:00:00Z'
},
@@ -330,7 +330,7 @@ export const MOCK_ALL_USERS: AdminUser[] = [
used_usd: 30.00,
total_usd: 30.00,
allowed_providers: null,
allowed_endpoints: null,
allowed_api_formats: null,
allowed_models: null,
created_at: '2024-04-10T00:00:00Z'
}

View File

@@ -690,7 +690,7 @@ const mockHandlers: Record<string, (config: AxiosRequestConfig) => Promise<Axios
used_usd: 0,
total_usd: 0,
allowed_providers: null,
allowed_endpoints: null,
allowed_api_formats: null,
allowed_models: null,
created_at: new Date().toISOString()
}

View File

@@ -907,7 +907,7 @@ function editUser(user: any) {
role: user.role,
is_active: user.is_active,
allowed_providers: user.allowed_providers || [],
allowed_endpoints: user.allowed_endpoints || [],
allowed_api_formats: user.allowed_api_formats || [],
allowed_models: user.allowed_models || []
}
showUserFormDialog.value = true
@@ -929,7 +929,7 @@ async function handleUserFormSubmit(data: UserFormData & { password?: string })
quota_usd: data.quota_usd,
role: data.role,
allowed_providers: data.allowed_providers,
allowed_endpoints: data.allowed_endpoints,
allowed_api_formats: data.allowed_api_formats,
allowed_models: data.allowed_models
}
if (data.password) {
@@ -946,7 +946,7 @@ async function handleUserFormSubmit(data: UserFormData & { password?: string })
quota_usd: data.quota_usd,
role: data.role,
allowed_providers: data.allowed_providers,
allowed_endpoints: data.allowed_endpoints,
allowed_api_formats: data.allowed_api_formats,
allowed_models: data.allowed_models
})
// 如果创建时指定为禁用,则更新状态