- **Code Organization & Architecture:** - Restructured component with clear sections (Hooks, Constants, Helper Functions, etc.) - Added comprehensive code organization comments for better maintainability - Extracted reusable helper functions and constants for better separation of concerns - **Performance Optimizations:** - Implemented extensive use of useCallback and useMemo hooks for expensive operations - Optimized data processing pipeline with dedicated processing functions - Memoized chart configurations, performance metrics, and grouped stats data - Cached helper functions like getTrendSpec, handleCopyUrl, and modal handlers - **UI/UX Enhancements:** - Added Empty state component with construction illustrations for better UX - Implemented responsive grid layout with conditional API info section visibility - Enhanced button styling with consistent rounded design and hover effects - Added mini trend charts to statistics cards for visual data representation - Improved form field consistency with reusable createFormField helper - **Feature Improvements:** - Added self-use mode detection to conditionally hide/show API information section - Enhanced chart configurations with centralized CHART_CONFIG constant - Improved time handling with dedicated helper functions (getTimeInterval, getInitialTimestamp) - Added comprehensive performance metrics calculation (RPM/TPM trends) - Implemented advanced data aggregation and processing workflows - **Code Quality & Maintainability:** - Extracted complex data processing logic into dedicated functions - Added proper prop destructuring and state organization - Implemented consistent naming conventions and helper utilities - Enhanced error handling and loading states management - Added comprehensive JSDoc-style comments for better code documentation - **Technical Debt Reduction:** - Replaced repetitive form field definitions with reusable components - Consolidated chart update logic into centralized updateChartSpec function - Improved data flow with better state management patterns - Reduced code duplication through strategic use of helper functions This refactor significantly improves component performance, maintainability, and user experience while maintaining backward compatibility and existing functionality.
410 lines
16 KiB
Go
410 lines
16 KiB
Go
package model
|
|
|
|
import (
|
|
"one-api/common"
|
|
"one-api/setting"
|
|
"one-api/setting/config"
|
|
"one-api/setting/operation_setting"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
type Option struct {
|
|
Key string `json:"key" gorm:"primaryKey"`
|
|
Value string `json:"value"`
|
|
}
|
|
|
|
func AllOption() ([]*Option, error) {
|
|
var options []*Option
|
|
var err error
|
|
err = DB.Find(&options).Error
|
|
return options, err
|
|
}
|
|
|
|
func InitOptionMap() {
|
|
common.OptionMapRWMutex.Lock()
|
|
common.OptionMap = make(map[string]string)
|
|
|
|
// 添加原有的系统配置
|
|
common.OptionMap["FileUploadPermission"] = strconv.Itoa(common.FileUploadPermission)
|
|
common.OptionMap["FileDownloadPermission"] = strconv.Itoa(common.FileDownloadPermission)
|
|
common.OptionMap["ImageUploadPermission"] = strconv.Itoa(common.ImageUploadPermission)
|
|
common.OptionMap["ImageDownloadPermission"] = strconv.Itoa(common.ImageDownloadPermission)
|
|
common.OptionMap["PasswordLoginEnabled"] = strconv.FormatBool(common.PasswordLoginEnabled)
|
|
common.OptionMap["PasswordRegisterEnabled"] = strconv.FormatBool(common.PasswordRegisterEnabled)
|
|
common.OptionMap["EmailVerificationEnabled"] = strconv.FormatBool(common.EmailVerificationEnabled)
|
|
common.OptionMap["GitHubOAuthEnabled"] = strconv.FormatBool(common.GitHubOAuthEnabled)
|
|
common.OptionMap["LinuxDOOAuthEnabled"] = strconv.FormatBool(common.LinuxDOOAuthEnabled)
|
|
common.OptionMap["TelegramOAuthEnabled"] = strconv.FormatBool(common.TelegramOAuthEnabled)
|
|
common.OptionMap["WeChatAuthEnabled"] = strconv.FormatBool(common.WeChatAuthEnabled)
|
|
common.OptionMap["TurnstileCheckEnabled"] = strconv.FormatBool(common.TurnstileCheckEnabled)
|
|
common.OptionMap["RegisterEnabled"] = strconv.FormatBool(common.RegisterEnabled)
|
|
common.OptionMap["AutomaticDisableChannelEnabled"] = strconv.FormatBool(common.AutomaticDisableChannelEnabled)
|
|
common.OptionMap["AutomaticEnableChannelEnabled"] = strconv.FormatBool(common.AutomaticEnableChannelEnabled)
|
|
common.OptionMap["LogConsumeEnabled"] = strconv.FormatBool(common.LogConsumeEnabled)
|
|
common.OptionMap["DisplayInCurrencyEnabled"] = strconv.FormatBool(common.DisplayInCurrencyEnabled)
|
|
common.OptionMap["DisplayTokenStatEnabled"] = strconv.FormatBool(common.DisplayTokenStatEnabled)
|
|
common.OptionMap["DrawingEnabled"] = strconv.FormatBool(common.DrawingEnabled)
|
|
common.OptionMap["TaskEnabled"] = strconv.FormatBool(common.TaskEnabled)
|
|
common.OptionMap["DataExportEnabled"] = strconv.FormatBool(common.DataExportEnabled)
|
|
common.OptionMap["ChannelDisableThreshold"] = strconv.FormatFloat(common.ChannelDisableThreshold, 'f', -1, 64)
|
|
common.OptionMap["EmailDomainRestrictionEnabled"] = strconv.FormatBool(common.EmailDomainRestrictionEnabled)
|
|
common.OptionMap["EmailAliasRestrictionEnabled"] = strconv.FormatBool(common.EmailAliasRestrictionEnabled)
|
|
common.OptionMap["EmailDomainWhitelist"] = strings.Join(common.EmailDomainWhitelist, ",")
|
|
common.OptionMap["SMTPServer"] = ""
|
|
common.OptionMap["SMTPFrom"] = ""
|
|
common.OptionMap["SMTPPort"] = strconv.Itoa(common.SMTPPort)
|
|
common.OptionMap["SMTPAccount"] = ""
|
|
common.OptionMap["SMTPToken"] = ""
|
|
common.OptionMap["SMTPSSLEnabled"] = strconv.FormatBool(common.SMTPSSLEnabled)
|
|
common.OptionMap["Notice"] = ""
|
|
common.OptionMap["About"] = ""
|
|
common.OptionMap["HomePageContent"] = ""
|
|
common.OptionMap["Footer"] = common.Footer
|
|
common.OptionMap["SystemName"] = common.SystemName
|
|
common.OptionMap["Logo"] = common.Logo
|
|
common.OptionMap["ServerAddress"] = ""
|
|
common.OptionMap["WorkerUrl"] = setting.WorkerUrl
|
|
common.OptionMap["WorkerValidKey"] = setting.WorkerValidKey
|
|
common.OptionMap["WorkerAllowHttpImageRequestEnabled"] = strconv.FormatBool(setting.WorkerAllowHttpImageRequestEnabled)
|
|
common.OptionMap["PayAddress"] = ""
|
|
common.OptionMap["CustomCallbackAddress"] = ""
|
|
common.OptionMap["EpayId"] = ""
|
|
common.OptionMap["EpayKey"] = ""
|
|
common.OptionMap["Price"] = strconv.FormatFloat(setting.Price, 'f', -1, 64)
|
|
common.OptionMap["MinTopUp"] = strconv.Itoa(setting.MinTopUp)
|
|
common.OptionMap["TopupGroupRatio"] = common.TopupGroupRatio2JSONString()
|
|
common.OptionMap["Chats"] = setting.Chats2JsonString()
|
|
common.OptionMap["GitHubClientId"] = ""
|
|
common.OptionMap["GitHubClientSecret"] = ""
|
|
common.OptionMap["TelegramBotToken"] = ""
|
|
common.OptionMap["TelegramBotName"] = ""
|
|
common.OptionMap["WeChatServerAddress"] = ""
|
|
common.OptionMap["WeChatServerToken"] = ""
|
|
common.OptionMap["WeChatAccountQRCodeImageURL"] = ""
|
|
common.OptionMap["TurnstileSiteKey"] = ""
|
|
common.OptionMap["TurnstileSecretKey"] = ""
|
|
common.OptionMap["QuotaForNewUser"] = strconv.Itoa(common.QuotaForNewUser)
|
|
common.OptionMap["QuotaForInviter"] = strconv.Itoa(common.QuotaForInviter)
|
|
common.OptionMap["QuotaForInvitee"] = strconv.Itoa(common.QuotaForInvitee)
|
|
common.OptionMap["QuotaRemindThreshold"] = strconv.Itoa(common.QuotaRemindThreshold)
|
|
common.OptionMap["PreConsumedQuota"] = strconv.Itoa(common.PreConsumedQuota)
|
|
common.OptionMap["ModelRequestRateLimitCount"] = strconv.Itoa(setting.ModelRequestRateLimitCount)
|
|
common.OptionMap["ModelRequestRateLimitDurationMinutes"] = strconv.Itoa(setting.ModelRequestRateLimitDurationMinutes)
|
|
common.OptionMap["ModelRequestRateLimitSuccessCount"] = strconv.Itoa(setting.ModelRequestRateLimitSuccessCount)
|
|
common.OptionMap["ModelRequestRateLimitGroup"] = setting.ModelRequestRateLimitGroup2JSONString()
|
|
common.OptionMap["ModelRatio"] = operation_setting.ModelRatio2JSONString()
|
|
common.OptionMap["ModelPrice"] = operation_setting.ModelPrice2JSONString()
|
|
common.OptionMap["CacheRatio"] = operation_setting.CacheRatio2JSONString()
|
|
common.OptionMap["GroupRatio"] = setting.GroupRatio2JSONString()
|
|
common.OptionMap["UserUsableGroups"] = setting.UserUsableGroups2JSONString()
|
|
common.OptionMap["CompletionRatio"] = operation_setting.CompletionRatio2JSONString()
|
|
common.OptionMap["TopUpLink"] = common.TopUpLink
|
|
//common.OptionMap["ChatLink"] = common.ChatLink
|
|
//common.OptionMap["ChatLink2"] = common.ChatLink2
|
|
common.OptionMap["QuotaPerUnit"] = strconv.FormatFloat(common.QuotaPerUnit, 'f', -1, 64)
|
|
common.OptionMap["RetryTimes"] = strconv.Itoa(common.RetryTimes)
|
|
common.OptionMap["DataExportInterval"] = strconv.Itoa(common.DataExportInterval)
|
|
common.OptionMap["DataExportDefaultTime"] = common.DataExportDefaultTime
|
|
common.OptionMap["DefaultCollapseSidebar"] = strconv.FormatBool(common.DefaultCollapseSidebar)
|
|
common.OptionMap["MjNotifyEnabled"] = strconv.FormatBool(setting.MjNotifyEnabled)
|
|
common.OptionMap["MjAccountFilterEnabled"] = strconv.FormatBool(setting.MjAccountFilterEnabled)
|
|
common.OptionMap["MjModeClearEnabled"] = strconv.FormatBool(setting.MjModeClearEnabled)
|
|
common.OptionMap["MjForwardUrlEnabled"] = strconv.FormatBool(setting.MjForwardUrlEnabled)
|
|
common.OptionMap["MjActionCheckSuccessEnabled"] = strconv.FormatBool(setting.MjActionCheckSuccessEnabled)
|
|
common.OptionMap["CheckSensitiveEnabled"] = strconv.FormatBool(setting.CheckSensitiveEnabled)
|
|
common.OptionMap["DemoSiteEnabled"] = strconv.FormatBool(operation_setting.DemoSiteEnabled)
|
|
common.OptionMap["SelfUseModeEnabled"] = strconv.FormatBool(operation_setting.SelfUseModeEnabled)
|
|
common.OptionMap["ModelRequestRateLimitEnabled"] = strconv.FormatBool(setting.ModelRequestRateLimitEnabled)
|
|
common.OptionMap["CheckSensitiveOnPromptEnabled"] = strconv.FormatBool(setting.CheckSensitiveOnPromptEnabled)
|
|
common.OptionMap["StopOnSensitiveEnabled"] = strconv.FormatBool(setting.StopOnSensitiveEnabled)
|
|
common.OptionMap["SensitiveWords"] = setting.SensitiveWordsToString()
|
|
common.OptionMap["StreamCacheQueueLength"] = strconv.Itoa(setting.StreamCacheQueueLength)
|
|
common.OptionMap["AutomaticDisableKeywords"] = operation_setting.AutomaticDisableKeywordsToString()
|
|
common.OptionMap["ApiInfo"] = ""
|
|
|
|
// 自动添加所有注册的模型配置
|
|
modelConfigs := config.GlobalConfig.ExportAllConfigs()
|
|
for k, v := range modelConfigs {
|
|
common.OptionMap[k] = v
|
|
}
|
|
|
|
common.OptionMapRWMutex.Unlock()
|
|
loadOptionsFromDatabase()
|
|
}
|
|
|
|
func loadOptionsFromDatabase() {
|
|
options, _ := AllOption()
|
|
for _, option := range options {
|
|
err := updateOptionMap(option.Key, option.Value)
|
|
if err != nil {
|
|
common.SysError("failed to update option map: " + err.Error())
|
|
}
|
|
}
|
|
}
|
|
|
|
func SyncOptions(frequency int) {
|
|
for {
|
|
time.Sleep(time.Duration(frequency) * time.Second)
|
|
common.SysLog("syncing options from database")
|
|
loadOptionsFromDatabase()
|
|
}
|
|
}
|
|
|
|
func UpdateOption(key string, value string) error {
|
|
// Save to database first
|
|
option := Option{
|
|
Key: key,
|
|
}
|
|
// https://gorm.io/docs/update.html#Save-All-Fields
|
|
DB.FirstOrCreate(&option, Option{Key: key})
|
|
option.Value = value
|
|
// Save is a combination function.
|
|
// If save value does not contain primary key, it will execute Create,
|
|
// otherwise it will execute Update (with all fields).
|
|
DB.Save(&option)
|
|
// Update OptionMap
|
|
return updateOptionMap(key, value)
|
|
}
|
|
|
|
func updateOptionMap(key string, value string) (err error) {
|
|
common.OptionMapRWMutex.Lock()
|
|
defer common.OptionMapRWMutex.Unlock()
|
|
common.OptionMap[key] = value
|
|
|
|
// 检查是否是模型配置 - 使用更规范的方式处理
|
|
if handleConfigUpdate(key, value) {
|
|
return nil // 已由配置系统处理
|
|
}
|
|
|
|
// 处理传统配置项...
|
|
if strings.HasSuffix(key, "Permission") {
|
|
intValue, _ := strconv.Atoi(value)
|
|
switch key {
|
|
case "FileUploadPermission":
|
|
common.FileUploadPermission = intValue
|
|
case "FileDownloadPermission":
|
|
common.FileDownloadPermission = intValue
|
|
case "ImageUploadPermission":
|
|
common.ImageUploadPermission = intValue
|
|
case "ImageDownloadPermission":
|
|
common.ImageDownloadPermission = intValue
|
|
}
|
|
}
|
|
if strings.HasSuffix(key, "Enabled") || key == "DefaultCollapseSidebar" {
|
|
boolValue := value == "true"
|
|
switch key {
|
|
case "PasswordRegisterEnabled":
|
|
common.PasswordRegisterEnabled = boolValue
|
|
case "PasswordLoginEnabled":
|
|
common.PasswordLoginEnabled = boolValue
|
|
case "EmailVerificationEnabled":
|
|
common.EmailVerificationEnabled = boolValue
|
|
case "GitHubOAuthEnabled":
|
|
common.GitHubOAuthEnabled = boolValue
|
|
case "LinuxDOOAuthEnabled":
|
|
common.LinuxDOOAuthEnabled = boolValue
|
|
case "WeChatAuthEnabled":
|
|
common.WeChatAuthEnabled = boolValue
|
|
case "TelegramOAuthEnabled":
|
|
common.TelegramOAuthEnabled = boolValue
|
|
case "TurnstileCheckEnabled":
|
|
common.TurnstileCheckEnabled = boolValue
|
|
case "RegisterEnabled":
|
|
common.RegisterEnabled = boolValue
|
|
case "EmailDomainRestrictionEnabled":
|
|
common.EmailDomainRestrictionEnabled = boolValue
|
|
case "EmailAliasRestrictionEnabled":
|
|
common.EmailAliasRestrictionEnabled = boolValue
|
|
case "AutomaticDisableChannelEnabled":
|
|
common.AutomaticDisableChannelEnabled = boolValue
|
|
case "AutomaticEnableChannelEnabled":
|
|
common.AutomaticEnableChannelEnabled = boolValue
|
|
case "LogConsumeEnabled":
|
|
common.LogConsumeEnabled = boolValue
|
|
case "DisplayInCurrencyEnabled":
|
|
common.DisplayInCurrencyEnabled = boolValue
|
|
case "DisplayTokenStatEnabled":
|
|
common.DisplayTokenStatEnabled = boolValue
|
|
case "DrawingEnabled":
|
|
common.DrawingEnabled = boolValue
|
|
case "TaskEnabled":
|
|
common.TaskEnabled = boolValue
|
|
case "DataExportEnabled":
|
|
common.DataExportEnabled = boolValue
|
|
case "DefaultCollapseSidebar":
|
|
common.DefaultCollapseSidebar = boolValue
|
|
case "MjNotifyEnabled":
|
|
setting.MjNotifyEnabled = boolValue
|
|
case "MjAccountFilterEnabled":
|
|
setting.MjAccountFilterEnabled = boolValue
|
|
case "MjModeClearEnabled":
|
|
setting.MjModeClearEnabled = boolValue
|
|
case "MjForwardUrlEnabled":
|
|
setting.MjForwardUrlEnabled = boolValue
|
|
case "MjActionCheckSuccessEnabled":
|
|
setting.MjActionCheckSuccessEnabled = boolValue
|
|
case "CheckSensitiveEnabled":
|
|
setting.CheckSensitiveEnabled = boolValue
|
|
case "DemoSiteEnabled":
|
|
operation_setting.DemoSiteEnabled = boolValue
|
|
case "SelfUseModeEnabled":
|
|
operation_setting.SelfUseModeEnabled = boolValue
|
|
case "CheckSensitiveOnPromptEnabled":
|
|
setting.CheckSensitiveOnPromptEnabled = boolValue
|
|
case "ModelRequestRateLimitEnabled":
|
|
setting.ModelRequestRateLimitEnabled = boolValue
|
|
case "StopOnSensitiveEnabled":
|
|
setting.StopOnSensitiveEnabled = boolValue
|
|
case "SMTPSSLEnabled":
|
|
common.SMTPSSLEnabled = boolValue
|
|
case "WorkerAllowHttpImageRequestEnabled":
|
|
setting.WorkerAllowHttpImageRequestEnabled = boolValue
|
|
}
|
|
}
|
|
switch key {
|
|
case "EmailDomainWhitelist":
|
|
common.EmailDomainWhitelist = strings.Split(value, ",")
|
|
case "SMTPServer":
|
|
common.SMTPServer = value
|
|
case "SMTPPort":
|
|
intValue, _ := strconv.Atoi(value)
|
|
common.SMTPPort = intValue
|
|
case "SMTPAccount":
|
|
common.SMTPAccount = value
|
|
case "SMTPFrom":
|
|
common.SMTPFrom = value
|
|
case "SMTPToken":
|
|
common.SMTPToken = value
|
|
case "ServerAddress":
|
|
setting.ServerAddress = value
|
|
case "WorkerUrl":
|
|
setting.WorkerUrl = value
|
|
case "WorkerValidKey":
|
|
setting.WorkerValidKey = value
|
|
case "PayAddress":
|
|
setting.PayAddress = value
|
|
case "Chats":
|
|
err = setting.UpdateChatsByJsonString(value)
|
|
case "CustomCallbackAddress":
|
|
setting.CustomCallbackAddress = value
|
|
case "EpayId":
|
|
setting.EpayId = value
|
|
case "EpayKey":
|
|
setting.EpayKey = value
|
|
case "Price":
|
|
setting.Price, _ = strconv.ParseFloat(value, 64)
|
|
case "MinTopUp":
|
|
setting.MinTopUp, _ = strconv.Atoi(value)
|
|
case "TopupGroupRatio":
|
|
err = common.UpdateTopupGroupRatioByJSONString(value)
|
|
case "GitHubClientId":
|
|
common.GitHubClientId = value
|
|
case "GitHubClientSecret":
|
|
common.GitHubClientSecret = value
|
|
case "LinuxDOClientId":
|
|
common.LinuxDOClientId = value
|
|
case "LinuxDOClientSecret":
|
|
common.LinuxDOClientSecret = value
|
|
case "Footer":
|
|
common.Footer = value
|
|
case "SystemName":
|
|
common.SystemName = value
|
|
case "Logo":
|
|
common.Logo = value
|
|
case "WeChatServerAddress":
|
|
common.WeChatServerAddress = value
|
|
case "WeChatServerToken":
|
|
common.WeChatServerToken = value
|
|
case "WeChatAccountQRCodeImageURL":
|
|
common.WeChatAccountQRCodeImageURL = value
|
|
case "TelegramBotToken":
|
|
common.TelegramBotToken = value
|
|
case "TelegramBotName":
|
|
common.TelegramBotName = value
|
|
case "TurnstileSiteKey":
|
|
common.TurnstileSiteKey = value
|
|
case "TurnstileSecretKey":
|
|
common.TurnstileSecretKey = value
|
|
case "QuotaForNewUser":
|
|
common.QuotaForNewUser, _ = strconv.Atoi(value)
|
|
case "QuotaForInviter":
|
|
common.QuotaForInviter, _ = strconv.Atoi(value)
|
|
case "QuotaForInvitee":
|
|
common.QuotaForInvitee, _ = strconv.Atoi(value)
|
|
case "QuotaRemindThreshold":
|
|
common.QuotaRemindThreshold, _ = strconv.Atoi(value)
|
|
case "PreConsumedQuota":
|
|
common.PreConsumedQuota, _ = strconv.Atoi(value)
|
|
case "ModelRequestRateLimitCount":
|
|
setting.ModelRequestRateLimitCount, _ = strconv.Atoi(value)
|
|
case "ModelRequestRateLimitDurationMinutes":
|
|
setting.ModelRequestRateLimitDurationMinutes, _ = strconv.Atoi(value)
|
|
case "ModelRequestRateLimitSuccessCount":
|
|
setting.ModelRequestRateLimitSuccessCount, _ = strconv.Atoi(value)
|
|
case "ModelRequestRateLimitGroup":
|
|
err = setting.UpdateModelRequestRateLimitGroupByJSONString(value)
|
|
case "RetryTimes":
|
|
common.RetryTimes, _ = strconv.Atoi(value)
|
|
case "DataExportInterval":
|
|
common.DataExportInterval, _ = strconv.Atoi(value)
|
|
case "DataExportDefaultTime":
|
|
common.DataExportDefaultTime = value
|
|
case "ModelRatio":
|
|
err = operation_setting.UpdateModelRatioByJSONString(value)
|
|
case "GroupRatio":
|
|
err = setting.UpdateGroupRatioByJSONString(value)
|
|
case "UserUsableGroups":
|
|
err = setting.UpdateUserUsableGroupsByJSONString(value)
|
|
case "CompletionRatio":
|
|
err = operation_setting.UpdateCompletionRatioByJSONString(value)
|
|
case "ModelPrice":
|
|
err = operation_setting.UpdateModelPriceByJSONString(value)
|
|
case "CacheRatio":
|
|
err = operation_setting.UpdateCacheRatioByJSONString(value)
|
|
case "TopUpLink":
|
|
common.TopUpLink = value
|
|
//case "ChatLink":
|
|
// common.ChatLink = value
|
|
//case "ChatLink2":
|
|
// common.ChatLink2 = value
|
|
case "ChannelDisableThreshold":
|
|
common.ChannelDisableThreshold, _ = strconv.ParseFloat(value, 64)
|
|
case "QuotaPerUnit":
|
|
common.QuotaPerUnit, _ = strconv.ParseFloat(value, 64)
|
|
case "SensitiveWords":
|
|
setting.SensitiveWordsFromString(value)
|
|
case "AutomaticDisableKeywords":
|
|
operation_setting.AutomaticDisableKeywordsFromString(value)
|
|
case "StreamCacheQueueLength":
|
|
setting.StreamCacheQueueLength, _ = strconv.Atoi(value)
|
|
}
|
|
return err
|
|
}
|
|
|
|
// handleConfigUpdate 处理分层配置更新,返回是否已处理
|
|
func handleConfigUpdate(key, value string) bool {
|
|
parts := strings.SplitN(key, ".", 2)
|
|
if len(parts) != 2 {
|
|
return false // 不是分层配置
|
|
}
|
|
|
|
configName := parts[0]
|
|
configKey := parts[1]
|
|
|
|
// 获取配置对象
|
|
cfg := config.GlobalConfig.Get(configName)
|
|
if cfg == nil {
|
|
return false // 未注册的配置
|
|
}
|
|
|
|
// 更新配置
|
|
configMap := map[string]string{
|
|
configKey: value,
|
|
}
|
|
config.UpdateConfigFromMap(cfg, configMap)
|
|
|
|
return true // 已处理
|
|
}
|