package customerform import ( "appPlatform/models/modelAppPlatform" "appPlatform/overall" "appPlatform/overall/publicmethod" "encoding/json" "fmt" "strconv" "strings" "github.com/gin-gonic/gin" ) /* * @ 作者: 秦东 @ 时间: 2023-09-13 13:02:23 @ 功能: 数据库表结构 @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) HaveDataBaseTableStruct(c *gin.Context) { var requestData publicmethod.CommonId[string] err := c.ShouldBindJSON(&requestData) if err != nil { publicmethod.Result(100, err, c) return } if requestData.Id == "" { publicmethod.Result(101, err, c) return } //获取自定义表单设置主表信息 var customerFormCont modelAppPlatform.CustomerForm err = customerFormCont.GetCont(map[string]interface{}{"`id`": requestData.Id}, "`id`", "`tablename`") if err != nil { publicmethod.Result(107, err, c) return } var versionInfo []modelAppPlatform.CustomerFormVersion err = overall.CONSTANT_DB_AppPlatform.Model(&modelAppPlatform.CustomerFormVersion{}).Select("`id`,`tablekey`,`status`,`version`,`table_structure`").Where("`tablekey` = ? AND `status` BETWEEN ? AND ?", customerFormCont.TableNames, 1, 2).Order("status asc").Order("version asc").Order("id desc").Find(&versionInfo).Error if err != nil { publicmethod.Result(107, err, c) return } var sunFormStr string var versionIdStr string var sendCont CustomerFormDatabaseVesion if len(versionInfo) > 0 { for _, v := range versionInfo { var versionCont PublicFormDatabaseVesion versionCont.Id = requestData.Id versionCont.VersionId = strconv.FormatInt(v.Id, 10) versionCont.Name = fmt.Sprintf("V%v", v.Version) if v.Status == 1 { versionCont.IsMain = true sunFormStr = v.TableStructure versionIdStr = strconv.FormatInt(v.Id, 10) //主表单数据 var masterFormTable PublicFormDatabaseVesion masterFormTable.Id = requestData.Id masterFormTable.VersionId = versionIdStr masterFormTable.Name = v.TableKey masterFormTable.IsMain = true if num := HaveTableLog(v.TableKey); num > 0 { masterFormTable.IsEdit = false } else { masterFormTable.IsEdit = true } sendCont.TableList = append(sendCont.TableList, masterFormTable) } else { versionCont.IsMain = false } sendCont.Version = append(sendCont.Version, versionCont) } } if sunFormStr != "" { sunSqlMap := make(map[string]string) json.Unmarshal([]byte(sunFormStr), &sunSqlMap) if len(sunSqlMap) > 0 { for _, s := range sunSqlMap { var sunFromTableCont PublicFormDatabaseVesion sunFromTableCont.Id = requestData.Id sunFromTableCont.VersionId = versionIdStr sunFromTableCont.Name = s sunFromTableCont.IsMain = false if num := HaveTableLog(s); num > 0 { sunFromTableCont.IsEdit = false } else { sunFromTableCont.IsEdit = true } sendCont.TableList = append(sendCont.TableList, sunFromTableCont) } } } publicmethod.Result(0, sendCont, c) } /* * @ 作者: 秦东 @ 时间: 2023-09-13 14:34:04 @ 功能: 获取表格是否有记录 @ 参数 # @ 返回值 # @ 方法原型 # */ func HaveTableLog(tableName string) (logCount int64) { err := overall.CONSTANT_DB_CustomerForm.Table(tableName).Select("`id`").First(&logCount).Error if err != nil { logCount = 0 } return } /* * @ 作者: 秦东 @ 时间: 2023-09-13 13:03:11 @ 功能: 读取数据表结构 @ 参数 # @ 返回值 # @ 方法原型 # */ func ReadDatabaseForm(tableName string, tableType ...string) (list []Result, err error) { tableTypes := "" if len(tableType) > 0 { tableTypes = tableType[0] } gormDb := overall.CONSTANT_DB_CustomerForm switch tableTypes { default: gormDb = overall.CONSTANT_DB_CustomerForm } // sqlStr := fmt.Sprintf("DESC %v", tableName) sqlStr := fmt.Sprintf("SHOW FULL COLUMNS FROM `%v`", tableName) err = gormDb.Raw(sqlStr).Scan(&list).Error return } /* * @ 作者: 秦东 @ 时间: 2023-09-13 15:25:03 @ 功能: 获取表单结构{"table1693810889577":"table1693810889577","table1693811003658":"table1693811003658","table1693811044212":"table1693811044212"} @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) HaveFormTabelCont(c *gin.Context) { var requestData HaveVersionForm err := c.ShouldBindJSON(&requestData) if err != nil { publicmethod.Result(100, err, c) return } if requestData.Id == "" { publicmethod.Result(101, err, c) return } if requestData.Name == "" { publicmethod.Result(101, err, c) return } //获取自定义表单设置主表信息 var versionCont modelAppPlatform.CustomerFormVersion err = versionCont.GetCont(map[string]interface{}{"`id`": requestData.Id}, "`tablekey`", "`mastesformjson`", "`table_structure`") if err != nil { publicmethod.Result(107, err, c) return } var formJsonCont CustomerFormMaster err = json.Unmarshal([]byte(versionCont.MastesFormJson), &formJsonCont) masterForm, sunForm := AnalyseFormTableJson(formJsonCont) formStruct, err := ReadDatabaseForm(requestData.Name) if err != nil { publicmethod.Result(107, err, c) return } fmt.Printf("%s\n", masterForm) sendMap := make(map[string]interface{}) // sendMap["masterForm"] = masterForm // sendMap["sunForm"] = sunForm // sendMap["formStruct"] = formStruct // sendMap["err"] = err // sendMap["formJsonCont"] = formJsonCont var filedList []Result if requestData.Name == versionCont.TableKey { for _, v := range formStruct { if publicmethod.IsInTrue[string](v.Field, masterForm) { attFiled := strings.Split(v.Type, " ") if len(attFiled) >= 2 { v.Attribute = attFiled[1] v.Type = attFiled[0] } // fmt.Printf("attFiled--->%v--->%v\n", attFiled, len(attFiled)) filedList = append(filedList, v) } // attFiled := strings.Split(v.Type, " ") // if len(attFiled) >= 2 { // v.Attribute = attFiled[1] // v.Type = attFiled[0] // } // // fmt.Printf("attFiled--->%v--->%v\n", attFiled, len(attFiled)) // filedList = append(filedList, v) } } else { if fieldAry, isOk := sunForm[requestData.Name]; isOk { for _, v := range formStruct { if publicmethod.IsInTrue[string](v.Field, fieldAry.([]string)) { attFiled := strings.Split(v.Type, " ") if len(attFiled) >= 2 { v.Attribute = attFiled[1] v.Type = attFiled[0] } filedList = append(filedList, v) } } } } sendMap["filedlist"] = filedList if num := HaveTableLog(requestData.Name); num > 0 { sendMap["isedit"] = false } else { sendMap["isedit"] = true } publicmethod.Result(0, sendMap, c) } /* * @ 作者: 秦东 @ 时间: 2023-09-13 15:38:42 @ 功能: 根据版本获取数据库表集合 @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) HaveFormTableList(c *gin.Context) { var requestData publicmethod.CommonId[string] err := c.ShouldBindJSON(&requestData) if err != nil { publicmethod.Result(100, err, c) return } if requestData.Id == "" { publicmethod.Result(101, err, c) return } //获取自定义表单设置主表信息 var versionCont modelAppPlatform.CustomerFormVersion err = versionCont.GetCont(map[string]interface{}{"`id`": requestData.Id}, "`id`", "`tablekey`", "`status`", "`version`", "`table_structure`") if err != nil { publicmethod.Result(107, err, c) return } var customerFormCont modelAppPlatform.CustomerForm err = customerFormCont.GetCont(map[string]interface{}{"`tablename`": versionCont.TableKey}, "`id`") if err != nil { publicmethod.Result(107, err, c) return } formId := strconv.FormatInt(customerFormCont.Id, 10) var sendAry []PublicFormDatabaseVesion var masterFormTable PublicFormDatabaseVesion masterFormTable.Id = formId masterFormTable.VersionId = requestData.Id masterFormTable.Name = versionCont.TableKey masterFormTable.IsMain = true if num := HaveTableLog(versionCont.TableKey); num > 0 { masterFormTable.IsEdit = false } else { masterFormTable.IsEdit = true } sendAry = append(sendAry, masterFormTable) if versionCont.TableStructure != "" { sunSqlMap := make(map[string]string) json.Unmarshal([]byte(versionCont.TableStructure), &sunSqlMap) if len(sunSqlMap) > 0 { for _, s := range sunSqlMap { var sunFromTableCont PublicFormDatabaseVesion sunFromTableCont.Id = formId sunFromTableCont.VersionId = requestData.Id sunFromTableCont.Name = s sunFromTableCont.IsMain = false if num := HaveTableLog(s); num > 0 { sunFromTableCont.IsEdit = false } else { sunFromTableCont.IsEdit = true } sendAry = append(sendAry, sunFromTableCont) } } } publicmethod.Result(0, sendAry, c) } /* * @ 作者: 秦东 @ 时间: 2023-09-13 15:57:13 @ 功能: 拆析版本表单 @ 参数 # @ 返回值 # @ 方法原型 # */ func AnalyseFormTableJson(formJsonCont CustomerFormMaster) (masterForm []string, sunForm map[string]interface{}) { dataMap := make(map[string]interface{}) fieldType := []string{"input", "password", "colorPicker", "component", "datePicker", "checkbox", "cascader", "treeSelect", "textarea", "upload", "expand-user", "select", "radio", "inputSlot", "rate", "inputNumber", "slider", "switch", "tinymce"} cardFieldType := []string{"card"} customLayout := []string{"grid", "tabs"} sunFieldType := []string{"table", "flex"} for _, v := range formJsonCont.List { if publicmethod.IsInTrue[string](v.Type, fieldType) { masterForm = append(masterForm, v.Name) } //卡片数据 if publicmethod.IsInTrue[string](v.Type, cardFieldType) { if len(v.List) > 0 { sqlStr := ComponentMappingDataTableField(v.List) masterForm = append(masterForm, sqlStr...) } } //自定义布局 if publicmethod.IsInTrue[string](v.Type, customLayout) { if len(v.Columns) > 0 { for _, cv := range v.Columns { sqlStr := ComponentMappingDataTableField(cv.List) masterForm = append(masterForm, sqlStr...) } } } //子表 if publicmethod.IsInTrue[string](v.Type, sunFieldType) { if len(v.List) > 0 { sqlStr := ComponentMappingDataTableField(v.List) dataMap[v.Name] = sqlStr } } } sunForm = dataMap return } /** @ 作者: 秦东 @ 时间: 2023-09-13 16:14:07 @ 功能: 组件印射字段 @ 参数 # @ 返回值 # @ 方法原型 # */ func ComponentMappingDataTableField(list []MasterStruct) (mastSql []string) { if len(list) > 0 { for _, lv := range list { fieldType := []string{"input", "password", "colorPicker", "component", "datePicker", "checkbox", "cascader", "treeSelect", "textarea", "upload", "expand-user", "select", "radio", "inputSlot", "rate", "inputNumber", "slider", "switch", "tinymce"} if publicmethod.IsInTrue[string](lv.Type, fieldType) { mastSql = append(mastSql, lv.Name) } } } return } /* * @ 作者: 秦东 @ 时间: 2023-09-14 09:01:40 @ 功能: 优化/修复数据表 @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) OptimizeOrRepairFormTable(c *gin.Context) { var requestData OptimizeOrRepairTable err := c.ShouldBindJSON(&requestData) if err != nil { publicmethod.Result(100, err, c) return } if requestData.Name == "" { publicmethod.Result(101, err, c) return } if requestData.OptimizeOrRepair == 1 { //优化表 sqlStr := fmt.Sprintf("OPTIMIZE TABLE %v", requestData.Name) overall.CONSTANT_DB_CustomerForm.Exec(sqlStr) } else { //修复表 sqlStr1 := fmt.Sprintf("CHECK TABLE %v", requestData.Name) overall.CONSTANT_DB_CustomerForm.Exec(sqlStr1) sqlStr2 := fmt.Sprintf("REPAIR TABLE %v", requestData.Name) overall.CONSTANT_DB_CustomerForm.Exec(sqlStr2) } publicmethod.Result(0, err, c) } /* * @ 作者: 秦东 @ 时间: 2023-09-14 11:50:30 @ 功能: 表单结构数据处理 @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) FormFieldHandle(c *gin.Context) { var requestData Result err := c.ShouldBindJSON(&requestData) if err != nil { publicmethod.Result(100, err, c) return } var sendForm SendFieldCont sendForm.Field = requestData.Field sendForm.Type = requestData.Type sendForm.Attribute = requestData.Attribute sendForm.Collation = requestData.Collation sendForm.Null = requestData.Null sendForm.Key = requestData.Key sendForm.Default = requestData.Default sendForm.Extra = requestData.Extra sendForm.Privileges = requestData.Privileges sendForm.Comment = requestData.Comment if requestData.Type == "" { sendForm.Type = "varchar" } else { attFiled := strings.Split(requestData.Type, "(") sendForm.Type = attFiled[0] if len(attFiled) > 1 { fieldLenght := publicmethod.MatchBracket(requestData.Type, "(", ")") switch sendForm.Type { case "decimal", "float", "double": maxAndMin := strings.Split(fieldLenght, ",") switch len(maxAndMin) { case 1: sendForm.Integer = maxAndMin[0] case 2: sendForm.Integer = maxAndMin[0] sendForm.Decimal = maxAndMin[1] default: } default: sendForm.Integer = fieldLenght } } } publicmethod.Result(0, sendForm, c) } /* * @ 作者: 秦东 @ 时间: 2023-09-14 15:43:03 @ 功能: 编辑数据库表字段信息 @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) EditFormField(c *gin.Context) { var requestData EditDatabaseFormField err := c.ShouldBindJSON(&requestData) if err != nil { publicmethod.Result(100, err, c) return } if requestData.FormName == "" || requestData.Field == "" { publicmethod.Result(101, err, c) return } sqlStr := fmt.Sprintf("ALTER TABLE `%v` MODIFY COLUMN `%v` ", requestData.FormName, requestData.Field) switch requestData.Type { case "decimal", "float", "double": var integerIntVal int64 if requestData.Integer == "" { integerIntVal = 3 } else { integerInt, err := strconv.ParseInt(requestData.Integer, 10, 64) if err == nil { integerIntVal = integerInt } } decimalVal := integerIntVal - 1 if requestData.Decimal != "" { decimalVales, err := strconv.ParseInt(requestData.Decimal, 10, 64) if err == nil { decimalVal = decimalVales } } if decimalVal == 0 { decimalVal = integerIntVal } sqlStr = fmt.Sprintf(" %v %v(%v,%v) ", sqlStr, requestData.Type, integerIntVal, decimalVal) case "tinyint", "smallint", "mediumint", "int", "integer", "bigint": var integerIntVal int64 if requestData.Integer == "" { integerIntVal = 3 } else { integerInt, err := strconv.ParseInt(requestData.Integer, 10, 64) if err == nil { integerIntVal = integerInt } } sqlStr = fmt.Sprintf(" %v %v(%v) %v ", sqlStr, requestData.Type, integerIntVal, requestData.Attribute) case "enum", "set", "text", "tinytext", "mediumtext", "longtext", "blob", "year", "date", "time", "datetime", "timestamp": sqlStr = fmt.Sprintf(" %v %v ", sqlStr, requestData.Type) default: if requestData.Integer != "" { sqlStr = fmt.Sprintf(" %v %v(%v) ", sqlStr, requestData.Type, requestData.Integer) } else { sqlStr = fmt.Sprintf(" %v %v ", sqlStr, requestData.Type) } } if requestData.Null == "NO" { sqlStr = fmt.Sprintf(" %v NOT NULL ", sqlStr) } if !publicmethod.IsInTrue[string](requestData.Type, []string{"enum", "set", "text", "tinytext", "mediumtext", "longtext", "blob", "year", "date", "time", "datetime", "timestamp"}) { sqlStr = fmt.Sprintf(" %v DEFAULT '%v'", sqlStr, requestData.Default) } sqlStr = fmt.Sprintf(" %v COMMENT '%v'", sqlStr, requestData.Comment) err = publicmethod.ExecSql("CustomerForm", sqlStr) if err != nil { publicmethod.Result(106, err, c) return } publicmethod.Result(0, err, c) }