diff --git a/internal/controllers/env_controller.go b/internal/controllers/env_controller.go index 47692d8..18d8cc7 100644 --- a/internal/controllers/env_controller.go +++ b/internal/controllers/env_controller.go @@ -35,6 +35,7 @@ func (ec *EnvController) CreateEnvVar(c *gin.Context) { Value string `json:"value" binding:"required"` Remark string `json:"remark"` Hidden *bool `json:"hidden"` + Enabled *bool `json:"enabled"` } if err := c.ShouldBindJSON(&req); err != nil { @@ -47,7 +48,12 @@ func (ec *EnvController) CreateEnvVar(c *gin.Context) { hidden = *req.Hidden } - envVar := ec.envService.CreateEnvVar(req.Name, req.Value, req.Remark, hidden, userID) + enabled := true + if req.Enabled != nil { + enabled = *req.Enabled + } + + envVar := ec.envService.CreateEnvVar(req.Name, req.Value, req.Remark, hidden, enabled, userID) utils.Success(c, vo.ToEnvVO(envVar)) } @@ -133,10 +139,11 @@ func (ec *EnvController) UpdateEnvVar(c *gin.Context) { } var req struct { - Name string `json:"name"` - Value string `json:"value"` - Remark string `json:"remark"` - Hidden *bool `json:"hidden"` + Name string `json:"name"` + Value string `json:"value"` + Remark string `json:"remark"` + Hidden *bool `json:"hidden"` + Enabled *bool `json:"enabled"` } if err := c.ShouldBindJSON(&req); err != nil { @@ -155,7 +162,13 @@ func (ec *EnvController) UpdateEnvVar(c *gin.Context) { if req.Hidden != nil { hidden = *req.Hidden } - envVar := ec.envService.UpdateEnvVar(id, req.Name, req.Value, req.Remark, hidden) + + enabled := existing.Enabled + if req.Enabled != nil { + enabled = *req.Enabled + } + + envVar := ec.envService.UpdateEnvVar(id, req.Name, req.Value, req.Remark, hidden, enabled) if envVar == nil { utils.NotFound(c, "环境变量不存在") return diff --git a/internal/database/migrate.go b/internal/database/migrate.go index 9fd5c16..fbcdea8 100644 --- a/internal/database/migrate.go +++ b/internal/database/migrate.go @@ -30,10 +30,20 @@ func Migrate() error { &models.NotifyBinding{}, } + // 检查环境变量表中是否已存在 enabled 列 + hasEnabled := DB.Migrator().HasColumn(&models.EnvironmentVariable{}, "enabled") if err := AutoMigrate(allModels...); err != nil { return err } + // 如果原来没有 enabled 列,说明是平滑升级,将现有的环境变量默认设置为启用 + if !hasEnabled { + logger.Infof("[Database] 为现有环境变量初始化启用状态...") + if err := DB.Model(&models.EnvironmentVariable{}).Where("1=1").Update("enabled", true).Error; err != nil { + logger.Errorf("[Database] 初始化环境变量启用状态失败: %v", err) + } + } + return nil } diff --git a/internal/models/env.go b/internal/models/env.go index 837405b..0139580 100644 --- a/internal/models/env.go +++ b/internal/models/env.go @@ -13,6 +13,7 @@ type EnvironmentVariable struct { Value BigText `json:"value"` Remark string `json:"remark" gorm:"size:500"` Hidden bool `json:"hidden" gorm:"default:true"` + Enabled bool `json:"enabled" gorm:"default:true"` UserID string `json:"user_id" gorm:"size:20;index"` CreatedAt LocalTime `json:"created_at"` UpdatedAt LocalTime `json:"updated_at"` diff --git a/internal/models/vo/sys_vo.go b/internal/models/vo/sys_vo.go index 01c61b1..92a76fb 100644 --- a/internal/models/vo/sys_vo.go +++ b/internal/models/vo/sys_vo.go @@ -36,6 +36,7 @@ type EnvVO struct { Value string `json:"value"` Remark string `json:"remark"` Hidden bool `json:"hidden"` + Enabled bool `json:"enabled"` CreatedAt models.LocalTime `json:"created_at"` UpdatedAt models.LocalTime `json:"updated_at"` } @@ -51,6 +52,7 @@ func ToEnvVO(env *models.EnvironmentVariable) *EnvVO { Value: string(env.Value), Remark: env.Remark, Hidden: env.Hidden, + Enabled: env.Enabled, CreatedAt: env.CreatedAt, UpdatedAt: env.UpdatedAt, } diff --git a/internal/services/env_service.go b/internal/services/env_service.go index 6d2c83a..646a8dd 100644 --- a/internal/services/env_service.go +++ b/internal/services/env_service.go @@ -16,13 +16,14 @@ func NewEnvService() *EnvService { return &EnvService{} } -func (es *EnvService) CreateEnvVar(name, value, remark string, hidden bool, userID string) *models.EnvironmentVariable { +func (es *EnvService) CreateEnvVar(name, value, remark string, hidden, enabled bool, userID string) *models.EnvironmentVariable { env := &models.EnvironmentVariable{ ID: utils.GenerateID(), Name: name, Value: models.BigText(value), Remark: remark, Hidden: hidden, + Enabled: enabled, UserID: userID, CreatedAt: models.Now(), UpdatedAt: models.Now(), @@ -65,16 +66,17 @@ func (es *EnvService) GetEnvVarByID(id string) *models.EnvironmentVariable { return &env } -func (es *EnvService) UpdateEnvVar(id string, name, value, remark string, hidden bool) *models.EnvironmentVariable { +func (es *EnvService) UpdateEnvVar(id string, name, value, remark string, hidden, enabled bool) *models.EnvironmentVariable { var env models.EnvironmentVariable if err := database.DB.Where("id = ?", id).First(&env).Error; err != nil { return nil } updates := map[string]interface{}{ - "name": name, - "value": models.BigText(value), - "remark": remark, - "hidden": hidden, + "name": name, + "value": models.BigText(value), + "remark": remark, + "hidden": hidden, + "enabled": enabled, } database.DB.Model(&env).Updates(updates) return &env @@ -165,13 +167,18 @@ func (es *EnvService) formatEnvVars(envs []models.EnvironmentVariable) []string nameToIndex := make(map[string]int) for _, env := range envs { + value := string(env.Value) + if !env.Enabled { + value = "" + } + if idx, ok := nameToIndex[env.Name]; ok { - mergedList[idx].values = append(mergedList[idx].values, string(env.Value)) + mergedList[idx].values = append(mergedList[idx].values, value) } else { nameToIndex[env.Name] = len(mergedList) mergedList = append(mergedList, mergedEnv{ name: env.Name, - values: []string{string(env.Value)}, + values: []string{value}, }) } } diff --git a/web/src/api/index.ts b/web/src/api/index.ts index 09900f3..2f930ca 100644 --- a/web/src/api/index.ts +++ b/web/src/api/index.ts @@ -377,6 +377,7 @@ export interface EnvVar { value: string remark: string hidden: boolean + enabled: boolean } export interface EnvListResponse { diff --git a/web/src/views/environments/Environments.vue b/web/src/views/environments/Environments.vue index 1bc96cc..972d1b2 100644 --- a/web/src/views/environments/Environments.vue +++ b/web/src/views/environments/Environments.vue @@ -7,7 +7,7 @@ import { Input } from '@/components/ui/input' import { Textarea } from '@/components/ui/textarea' import { Label } from '@/components/ui/label' import Pagination from '@/components/Pagination.vue' -import { Plus, Pencil, Trash2, Eye, EyeOff, Search, AlertTriangle, Terminal } from 'lucide-vue-next' +import { Plus, Pencil, Trash2, Eye, EyeOff, Search, AlertTriangle, Terminal, Zap, ZapOff } from 'lucide-vue-next' import TextOverflow from '@/components/TextOverflow.vue' import { api, type EnvVar } from '@/api' import { toast } from 'vue-sonner' @@ -61,7 +61,7 @@ function handlePageChange(page: number) { } function openCreate() { - editingEnv.value = { name: '', value: '', remark: '', hidden: true } + editingEnv.value = { name: '', value: '', remark: '', hidden: true, enabled: true } isEdit.value = false showDialog.value = true } @@ -133,6 +133,16 @@ function toggleShow(id: string) { showValues.value[id] = !showValues.value[id] } +async function toggleEnabled(env: EnvVar) { + try { + await api.env.update(env.id, { ...env, enabled: !env.enabled }) + env.enabled = !env.enabled + toast.success(env.enabled ? '变量已启用' : '变量已禁用') + } catch { + toast.error('操作失败') + } +} + function maskValue(value: string) { return '•'.repeat(Math.min(value.length, 20)) } @@ -166,7 +176,7 @@ onMounted(loadEnvVars) 变量名 - 操作 + 操作
@@ -183,7 +193,13 @@ onMounted(loadEnvVars) - + +
+
+ + +