package console import ( "strings" "yunyan/comm" "yunyan/pb" "github.com/gin-gonic/gin" ) // ============================ 应用环境配置 (appcfg) ============================ // // 「应用环境配置」页(admin appconfig.vue)的后端:读写**选中部署应用业务库**里的 config 表 // (comm.TableAppConfig / pb.DBAppConfigItem)——即应用自有的 key/value 配置(音乐、OSS 等)。 // // 结构与「全局环境配置」(global_config, 存 console 公共库、按区域分组)一致,但去掉区域维度: // 应用 config 不分区域,且落在各应用自己的业务库里,故按部署 app_id 从 registry 动态取连接 // (与 modulecfg / analyze / 重置设备码同机制),不经 console 公共库。 // // 无加密字段(与 global_config 一致,明文 key/value)。 // appCfgList 列出某部署业务库 config 表的全部配置项(按 group 分组由前端做)。 func (this *serverComp) appCfgList(c *gin.Context) { var req struct { AppId uint32 `json:"app_id"` } _ = c.ShouldBindJSON(&req) if req.AppId == 0 { writeErr(c, pb.ErrorCode_ReqParameterError, "app_id 必填") return } db, err := this.module.registry.getServiceDB(req.AppId) if err != nil { writeErr(c, pb.ErrorCode_DBError, "连接应用业务库失败: "+err.Error()) return } if err := db.CreateTable(comm.TableAppConfig, &pb.DBAppConfigItem{}); err != nil { writeErr(c, pb.ErrorCode_DBError, err.Error()) return } items := make([]*pb.DBAppConfigItem, 0) if err := db.Find(comm.TableAppConfig, &items, ""); err != nil { writeErr(c, pb.ErrorCode_DBError, err.Error()) return } writeOK(c, gin.H{"items": items}) } // appCfgAdd 在某部署业务库新增一条 config(id 由库自增回填)。 func (this *serverComp) appCfgAdd(c *gin.Context) { var req struct { AppId uint32 `json:"app_id"` Group string `json:"group"` Key string `json:"key"` Value string `json:"value"` Description string `json:"description"` } if err := c.ShouldBindJSON(&req); err != nil { writeErr(c, pb.ErrorCode_ReqParameterError, err.Error()) return } if req.AppId == 0 { writeErr(c, pb.ErrorCode_ReqParameterError, "app_id 必填") return } if strings.TrimSpace(req.Key) == "" { writeErr(c, pb.ErrorCode_ReqParameterError, "键(key) 必填") return } db, err := this.module.registry.getServiceDB(req.AppId) if err != nil { writeErr(c, pb.ErrorCode_DBError, "连接应用业务库失败: "+err.Error()) return } if err := db.CreateTable(comm.TableAppConfig, &pb.DBAppConfigItem{}); err != nil { writeErr(c, pb.ErrorCode_DBError, err.Error()) return } m := &pb.DBAppConfigItem{ Group: strings.TrimSpace(req.Group), Key: strings.TrimSpace(req.Key), Value: req.Value, Description: strings.TrimSpace(req.Description), } if err := db.Insert(comm.TableAppConfig, m); err != nil { writeErr(c, pb.ErrorCode_DBError, err.Error()) return } writeOK(c, m) } // appCfgUpdate 更新某部署业务库的一条 config(按 id)。 func (this *serverComp) appCfgUpdate(c *gin.Context) { var req struct { AppId uint32 `json:"app_id"` Id uint64 `json:"id"` Group string `json:"group"` Key string `json:"key"` Value string `json:"value"` Description string `json:"description"` } if err := c.ShouldBindJSON(&req); err != nil { writeErr(c, pb.ErrorCode_ReqParameterError, err.Error()) return } if req.AppId == 0 || req.Id == 0 { writeErr(c, pb.ErrorCode_ReqParameterError, "app_id 与 id 必填") return } db, err := this.module.registry.getServiceDB(req.AppId) if err != nil { writeErr(c, pb.ErrorCode_DBError, "连接应用业务库失败: "+err.Error()) return } m := &pb.DBAppConfigItem{ Id: req.Id, Group: strings.TrimSpace(req.Group), Key: strings.TrimSpace(req.Key), Value: req.Value, Description: strings.TrimSpace(req.Description), } if err := db.Save(comm.TableAppConfig, m); err != nil { writeErr(c, pb.ErrorCode_DBError, err.Error()) return } writeOK(c, m) } // appCfgDel 按 id 批量删除某部署业务库的 config。 func (this *serverComp) appCfgDel(c *gin.Context) { var req struct { AppId uint32 `json:"app_id"` Ids []uint64 `json:"ids"` } _ = c.ShouldBindJSON(&req) if req.AppId == 0 { writeErr(c, pb.ErrorCode_ReqParameterError, "app_id 必填") return } if len(req.Ids) == 0 { writeErr(c, pb.ErrorCode_ReqParameterError, "ids 必填") return } db, err := this.module.registry.getServiceDB(req.AppId) if err != nil { writeErr(c, pb.ErrorCode_DBError, "连接应用业务库失败: "+err.Error()) return } if err := db.Delete(comm.TableAppConfig, "id IN ?", req.Ids); err != nil { writeErr(c, pb.ErrorCode_DBError, err.Error()) return } writeOK(c, gin.H{"deleted": len(req.Ids)}) }