feat: 增强系统设置结构体
This commit is contained in:
@@ -18,25 +18,22 @@ import (
|
|||||||
// 使用结构体标签作为唯一事实来源
|
// 使用结构体标签作为唯一事实来源
|
||||||
type SystemSettings struct {
|
type SystemSettings struct {
|
||||||
// 负载均衡和重试配置
|
// 负载均衡和重试配置
|
||||||
BlacklistThreshold int `json:"blacklist_threshold" default:"1" desc:"Error count before blacklisting a key" validate:"min=0"`
|
BlacklistThreshold int `json:"blacklist_threshold" default:"1" name:"黑名单阈值" category:"失败重试" desc:"一个 Key 连续失败多少次后进入黑名单" validate:"min=0"`
|
||||||
MaxRetries int `json:"max_retries" default:"3" desc:"Maximum retry attempts with different keys" validate:"min=0"`
|
MaxRetries int `json:"max_retries" default:"3" name:"最大重试次数" category:"失败重试" desc:"单个请求使用不同 Key 的最大重试次数" validate:"min=0"`
|
||||||
|
|
||||||
// 服务器超时配置 (秒)
|
// 服务器超时配置 (秒)
|
||||||
ServerReadTimeout int `json:"server_read_timeout" default:"120" desc:"HTTP server read timeout in seconds" validate:"min=1"`
|
ServerReadTimeout int `json:"server_read_timeout" default:"120" name:"读取超时" category:"服务器配置" desc:"HTTP 服务器读取超时时间(秒)" validate:"min=1"`
|
||||||
ServerWriteTimeout int `json:"server_write_timeout" default:"1800" desc:"HTTP server write timeout in seconds" validate:"min=1"`
|
ServerWriteTimeout int `json:"server_write_timeout" default:"1800" name:"写入超时" category:"服务器配置" desc:"HTTP 服务器写入超时时间(秒)" validate:"min=1"`
|
||||||
ServerIdleTimeout int `json:"server_idle_timeout" default:"120" desc:"HTTP server idle timeout in seconds" validate:"min=1"`
|
ServerIdleTimeout int `json:"server_idle_timeout" default:"120" name:"空闲超时" category:"服务器配置" desc:"HTTP 服务器空闲超时时间(秒)" validate:"min=1"`
|
||||||
ServerGracefulShutdownTimeout int `json:"server_graceful_shutdown_timeout" default:"60" desc:"Graceful shutdown timeout in seconds" validate:"min=1"`
|
ServerGracefulShutdownTimeout int `json:"server_graceful_shutdown_timeout" default:"60" name:"优雅关闭超时" category:"服务器配置" desc:"服务优雅关闭的等待超时时间(秒)" validate:"min=1"`
|
||||||
|
|
||||||
// 请求超时配置 (秒)
|
// 请求超时配置 (秒)
|
||||||
RequestTimeout int `json:"request_timeout" default:"30" desc:"Request timeout in seconds" validate:"min=1"`
|
RequestTimeout int `json:"request_timeout" default:"30" name:"请求超时" category:"请求配置" desc:"请求处理的总体超时时间(秒)" validate:"min=1"`
|
||||||
ResponseTimeout int `json:"response_timeout" default:"30" desc:"Response timeout in seconds (TLS handshake & response header)" validate:"min=1"`
|
ResponseTimeout int `json:"response_timeout" default:"30" name:"响应超时" category:"请求配置" desc:"TLS 握手和响应头的超时时间(秒)" validate:"min=1"`
|
||||||
IdleConnTimeout int `json:"idle_conn_timeout" default:"120" desc:"Idle connection timeout in seconds" validate:"min=1"`
|
IdleConnTimeout int `json:"idle_conn_timeout" default:"120" name:"空闲连接超时" category:"请求配置" desc:"空闲连接的超时时间(秒)" validate:"min=1"`
|
||||||
|
|
||||||
// 性能配置
|
|
||||||
// MaxConcurrentRequests int `json:"max_concurrent_requests" default:"100" desc:"Maximum number of concurrent requests" validate:"min=1"`
|
|
||||||
|
|
||||||
// 请求日志配置(数据库日志)
|
// 请求日志配置(数据库日志)
|
||||||
RequestLogRetentionDays int `json:"request_log_retention_days" default:"30" desc:"Number of days to retain request logs in database" validate:"min=1"`
|
RequestLogRetentionDays int `json:"request_log_retention_days" default:"30" name:"日志保留天数" category:"日志配置" desc:"请求日志在数据库中的保留天数" validate:"min=1"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// GenerateSettingsMetadata 使用反射从 SystemSettings 结构体动态生成元数据
|
// GenerateSettingsMetadata 使用反射从 SystemSettings 结构体动态生成元数据
|
||||||
@@ -54,9 +51,11 @@ func GenerateSettingsMetadata(s *SystemSettings) []models.SystemSettingInfo {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nameTag := field.Tag.Get("name")
|
||||||
descTag := field.Tag.Get("desc")
|
descTag := field.Tag.Get("desc")
|
||||||
defaultTag := field.Tag.Get("default")
|
defaultTag := field.Tag.Get("default")
|
||||||
validateTag := field.Tag.Get("validate")
|
validateTag := field.Tag.Get("validate")
|
||||||
|
categoryTag := field.Tag.Get("category")
|
||||||
|
|
||||||
var minValue *int
|
var minValue *int
|
||||||
if strings.HasPrefix(validateTag, "min=") {
|
if strings.HasPrefix(validateTag, "min=") {
|
||||||
@@ -68,10 +67,12 @@ func GenerateSettingsMetadata(s *SystemSettings) []models.SystemSettingInfo {
|
|||||||
|
|
||||||
info := models.SystemSettingInfo{
|
info := models.SystemSettingInfo{
|
||||||
Key: jsonTag,
|
Key: jsonTag,
|
||||||
|
Name: nameTag,
|
||||||
Value: fieldValue.Interface(),
|
Value: fieldValue.Interface(),
|
||||||
Type: field.Type.String(),
|
Type: field.Type.String(),
|
||||||
DefaultValue: defaultTag,
|
DefaultValue: defaultTag,
|
||||||
Description: descTag,
|
Description: descTag,
|
||||||
|
Category: categoryTag,
|
||||||
MinValue: minValue,
|
MinValue: minValue,
|
||||||
}
|
}
|
||||||
settingsInfo = append(settingsInfo, info)
|
settingsInfo = append(settingsInfo, info)
|
||||||
@@ -325,7 +326,6 @@ func (sm *SystemSettingsManager) DisplayCurrentSettings() {
|
|||||||
sm.settings.ServerIdleTimeout, sm.settings.ServerGracefulShutdownTimeout)
|
sm.settings.ServerIdleTimeout, sm.settings.ServerGracefulShutdownTimeout)
|
||||||
logrus.Infof(" Request timeouts: request=%ds, response=%ds, idle_conn=%ds",
|
logrus.Infof(" Request timeouts: request=%ds, response=%ds, idle_conn=%ds",
|
||||||
sm.settings.RequestTimeout, sm.settings.ResponseTimeout, sm.settings.IdleConnTimeout)
|
sm.settings.RequestTimeout, sm.settings.ResponseTimeout, sm.settings.IdleConnTimeout)
|
||||||
// logrus.Infof(" Performance: max_concurrent=%d", sm.settings.MaxConcurrentRequests)
|
|
||||||
logrus.Infof(" Request log retention: %d days", sm.settings.RequestLogRetentionDays)
|
logrus.Infof(" Request log retention: %d days", sm.settings.RequestLogRetentionDays)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2,6 +2,7 @@ package handler
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"gpt-load/internal/config"
|
"gpt-load/internal/config"
|
||||||
|
"gpt-load/internal/models"
|
||||||
"gpt-load/internal/response"
|
"gpt-load/internal/response"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
@@ -9,15 +10,28 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// GetSettings handles the GET /api/settings request.
|
// GetSettings handles the GET /api/settings request.
|
||||||
// It retrieves all system settings and returns them with detailed information.
|
// It retrieves all system settings, groups them by category, and returns them.
|
||||||
func GetSettings(c *gin.Context) {
|
func GetSettings(c *gin.Context) {
|
||||||
settingsManager := config.GetSystemSettingsManager()
|
settingsManager := config.GetSystemSettingsManager()
|
||||||
currentSettings := settingsManager.GetSettings()
|
currentSettings := settingsManager.GetSettings()
|
||||||
|
|
||||||
// 使用新的动态元数据生成器
|
|
||||||
settingsInfo := config.GenerateSettingsMetadata(¤tSettings)
|
settingsInfo := config.GenerateSettingsMetadata(¤tSettings)
|
||||||
|
|
||||||
response.Success(c, settingsInfo)
|
// Group settings by category
|
||||||
|
categorized := make(map[string][]models.SystemSettingInfo)
|
||||||
|
for _, s := range settingsInfo {
|
||||||
|
categorized[s.Category] = append(categorized[s.Category], s)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the response structure
|
||||||
|
var responseData []models.CategorizedSettings
|
||||||
|
for categoryName, settings := range categorized {
|
||||||
|
responseData = append(responseData, models.CategorizedSettings{
|
||||||
|
CategoryName: categoryName,
|
||||||
|
Settings: settings,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
response.Success(c, responseData)
|
||||||
}
|
}
|
||||||
|
|
||||||
// UpdateSettings handles the PUT /api/settings request.
|
// UpdateSettings handles the PUT /api/settings request.
|
||||||
|
@@ -2,14 +2,18 @@ package models
|
|||||||
|
|
||||||
// SystemSettingInfo 表示系统配置的详细信息(用于API返回)
|
// SystemSettingInfo 表示系统配置的详细信息(用于API返回)
|
||||||
type SystemSettingInfo struct {
|
type SystemSettingInfo struct {
|
||||||
Key string `json:"key"`
|
Key string `json:"key"`
|
||||||
Value interface{} `json:"value"`
|
Name string `json:"name"`
|
||||||
Type string `json:"type"` // "int", "bool", "string"
|
Value any `json:"value"`
|
||||||
DefaultValue interface{} `json:"default_value"`
|
Type string `json:"type"` // "int", "bool", "string"
|
||||||
Description string `json:"description"`
|
DefaultValue any `json:"default_value"`
|
||||||
Category string `json:"category"` // "timeout", "performance", "logging", etc.
|
Description string `json:"description"`
|
||||||
Required bool `json:"required"`
|
Category string `json:"category"`
|
||||||
MinValue *int `json:"min_value,omitempty"`
|
MinValue *int `json:"min_value,omitempty"`
|
||||||
MaxValue *int `json:"max_value,omitempty"`
|
}
|
||||||
ValidOptions []string `json:"valid_options,omitempty"`
|
|
||||||
|
// CategorizedSettings a list of settings grouped by category
|
||||||
|
type CategorizedSettings struct {
|
||||||
|
CategoryName string `json:"category_name"`
|
||||||
|
Settings []SystemSettingInfo `json:"settings"`
|
||||||
}
|
}
|
||||||
|
@@ -21,7 +21,7 @@ export default defineConfig(({ mode }) => {
|
|||||||
// 代理配置示例
|
// 代理配置示例
|
||||||
proxy: {
|
proxy: {
|
||||||
"/api": {
|
"/api": {
|
||||||
target: env.VITE_API_BASE_URL,
|
target: env.VITE_API_BASE_URL || "http://127.0.0.1:3000",
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
Reference in New Issue
Block a user