@@ -528,7 +583,10 @@ const formData = ref({
group_id: null as number | null,
status: 'active' as 'active' | 'inactive',
use_custom_key: false,
- custom_key: ''
+ custom_key: '',
+ enable_ip_restriction: false,
+ ip_whitelist: '',
+ ip_blacklist: ''
})
// 自定义Key验证
@@ -664,12 +722,16 @@ const handlePageSizeChange = (pageSize: number) => {
const editKey = (key: ApiKey) => {
selectedKey.value = key
+ const hasIPRestriction = (key.ip_whitelist?.length > 0) || (key.ip_blacklist?.length > 0)
formData.value = {
name: key.name,
group_id: key.group_id,
status: key.status,
use_custom_key: false,
- custom_key: ''
+ custom_key: '',
+ enable_ip_restriction: hasIPRestriction,
+ ip_whitelist: (key.ip_whitelist || []).join('\n'),
+ ip_blacklist: (key.ip_blacklist || []).join('\n')
}
showEditModal.value = true
}
@@ -751,14 +813,26 @@ const handleSubmit = async () => {
}
}
+ // Parse IP lists only if IP restriction is enabled
+ const parseIPList = (text: string): string[] =>
+ text.split('\n').map(ip => ip.trim()).filter(ip => ip.length > 0)
+ const ipWhitelist = formData.value.enable_ip_restriction ? parseIPList(formData.value.ip_whitelist) : []
+ const ipBlacklist = formData.value.enable_ip_restriction ? parseIPList(formData.value.ip_blacklist) : []
+
submitting.value = true
try {
if (showEditModal.value && selectedKey.value) {
- await keysAPI.update(selectedKey.value.id, formData.value)
+ await keysAPI.update(selectedKey.value.id, {
+ name: formData.value.name,
+ group_id: formData.value.group_id,
+ status: formData.value.status,
+ ip_whitelist: ipWhitelist,
+ ip_blacklist: ipBlacklist
+ })
appStore.showSuccess(t('keys.keyUpdatedSuccess'))
} else {
const customKey = formData.value.use_custom_key ? formData.value.custom_key : undefined
- await keysAPI.create(formData.value.name, formData.value.group_id, customKey)
+ await keysAPI.create(formData.value.name, formData.value.group_id, customKey, ipWhitelist, ipBlacklist)
appStore.showSuccess(t('keys.keyCreatedSuccess'))
// Only advance tour if active, on submit step, and creation succeeded
if (onboardingStore.isCurrentStep('[data-tour="key-form-submit"]')) {
@@ -805,7 +879,10 @@ const closeModals = () => {
group_id: null,
status: 'active',
use_custom_key: false,
- custom_key: ''
+ custom_key: '',
+ enable_ip_restriction: false,
+ ip_whitelist: '',
+ ip_blacklist: ''
}
}
diff --git a/frontend/src/views/user/UsageView.vue b/frontend/src/views/user/UsageView.vue
index 0058c527..1b85fced 100644
--- a/frontend/src/views/user/UsageView.vue
+++ b/frontend/src/views/user/UsageView.vue
@@ -273,19 +273,6 @@
-