package customerform import ( "appPlatform/models/modelAppPlatform" "appPlatform/models/modelshr" "appPlatform/overall" "appPlatform/overall/publicmethod" "encoding/json" "fmt" "strconv" "strings" "time" "github.com/gin-gonic/gin" "gorm.io/gorm" ) /* * @ 作者: 秦东 @ 时间: 2023-08-28 16:19:38 @ 功能: 自定义表单列表 @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) CustomerFormList(c *gin.Context) { var requestData SearchForm // ersr := c.ShouldBindJSON(&requestData) c.ShouldBindJSON(&requestData) if requestData.Page == 0 { requestData.Page = 1 } if requestData.PageSize == 0 { requestData.PageSize = 15 } context, _ := c.Get(overall.MyContJwt) var userCont modelshr.ManCont userCont.GetLoginCont(context) // fmt.Printf("requestData---->%v---->%v\n", requestData, ersr) // var formList []modelAppPlatform.CustomerForm var formList []SendCustomerForm gormDb := overall.CONSTANT_DB_AppPlatform.Model(&modelAppPlatform.CustomerForm{}).Where("`states` BETWEEN ? AND ?", 1, 2) if requestData.GroupId == "100" { var oftenAppInfo modelAppPlatform.OftenApp oftenAppInfo.GetCont(map[string]interface{}{"`userKey`": userCont.Key}, "`appSignCode`") if oftenAppInfo.AppSignCode != "" { appId := strings.Split(oftenAppInfo.AppSignCode, ",") if len(appId) > 0 { gormDb = gormDb.Where("`signCode` IN ?", appId) } else { gormDb = gormDb.Where("`signCode` = ? AND `tablename` = ?", 110, "qindong") } } else { gormDb = gormDb.Where("`signCode` = ? AND `tablename` = ?", 110, "qindong") } } if requestData.KeyWords != "" { gormDb = gormDb.Where("`name` LIKE ? OR `tablename` LIKE ?", "%"+requestData.KeyWords+"%", "%"+requestData.KeyWords+"%") } if requestData.Classify != 0 { gormDb = gormDb.Where("`classify` = ?", requestData.Classify) } if requestData.GroupId != "" && requestData.GroupId != "100" { gormDb = gormDb.Where("`groupid` = ?", requestData.GroupId) } var total int64 totalErr := gormDb.Count(&total).Error if totalErr != nil { total = 0 } gormDb = publicmethod.PageTurningSettings(gormDb, requestData.Page, requestData.PageSize) err := gormDb.Order("`id` DESC").Find(&formList).Error if err != nil && len(formList) < 1 { publicmethod.Result(0, err, c) return } // var sendList []SendCustomerForm for i, v := range formList { // var sendCont SendCustomerForm // sendCont.IdStr = strconv.FormatInt(v.Id, 10) userContEs := HaveCustomerFormCreaterUs(v.TableNames) // sendCont.CreaterName = userContEs.Name // sendCont.CreaterTimeStr = publicmethod.UnixTimeToDay(v.CreaterTime, 1) if v.FlowKey != 0 { // sendCont.FlowKeyStr = strconv.FormatInt(v.FlowKey, 10) formList[i].FlowKeyStr = strconv.FormatInt(v.FlowKey, 10) } formList[i].IdStr = strconv.FormatInt(v.Id, 10) formList[i].CreaterName = userContEs.Name formList[i].CreaterTimeStr = publicmethod.UnixTimeToDay(v.CreaterTime, 1) var versionInfo modelAppPlatform.CustomerFormVersion versionInfo.GetCont(map[string]interface{}{"`status`": 1, "`tablekey`": v.TableNames}, "`id`") formList[i].VersionId = strconv.FormatInt(versionInfo.Id, 10) formList[i].SignCodeStr = strconv.FormatInt(v.SignCode, 10) formList[i].IsOften = JudgeAppOften(userCont.Key, v.SignCode) if v.States == 1 { formList[i].IsOpen = true } else { formList[i].IsOpen = false } // sendList = append(sendList, sendCont) } publicmethod.ResultList(0, requestData.Page, requestData.PageSize, total, int64(len(formList)), formList, c) } /* * @ 作者: 秦东 @ 时间: 2024-07-23 16:20:59 @ 功能: 判断App是不是经常使用 @ 参数 #userkey 当前人员 #appCode 应用识别 @ 返回值 # @ 方法原型 # */ func JudgeAppOften(userkey, appCode int64) bool { var oftenAppInfo modelAppPlatform.OftenApp oftenAppInfo.GetCont(map[string]interface{}{"`userKey`": userkey}, "`appSignCode`") appId := strings.Split(oftenAppInfo.AppSignCode, ",") if len(appId) > 0 { appCodeStr := strconv.FormatInt(appCode, 10) return publicmethod.IsInTrue[string](appCodeStr, appId) } return false } /* * @ 作者: 秦东 @ 时间: 2023-09-08 11:03:19 @ 功能: 获取启用自定义表单创建人 @ 参数 # @ 返回值 # @ 方法原型 # */ func HaveCustomerFormCreaterUs(tableKey string) (userCont modelshr.PersonArchives) { var formVersion modelAppPlatform.CustomerFormVersion err := formVersion.GetCont(map[string]interface{}{"`tablekey`": tableKey}, "`creater`") if err != nil { return } userCont.GetCont(map[string]interface{}{"`key`": formVersion.Creater}, "`name`", "`number`") return } /* * @ 作者: 秦东 @ 时间: 2023-08-29 13:16:12 @ 功能: 生成表单基本信息 @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) ProductionMarkOfCustomerForm(c *gin.Context) { var requestData AppOrForm c.ShouldBindJSON(&requestData) formNAme := "customer_form" switch requestData.Types { case 1: formNAme = "customer_form" case 2: formNAme = "app" case 3: formNAme = "app_form" default: formNAme = "customer_form" } uuid := publicmethod.GetUUid(1) tableName := fmt.Sprintf("%v_%v", formNAme, uuid) for { isTrue := overall.CONSTANT_DB_CustomerForm.Migrator().HasTable(tableName) if !isTrue { break } else { uuid = publicmethod.GetUUid(1) tableName = fmt.Sprintf("%v_%v", formNAme, uuid) } } var sendCont SendCustomerFormConfig switch requestData.Types { case 1: sendCont.FormName = fmt.Sprintf("未命名表单_%v", uuid) case 2: sendCont.FormName = fmt.Sprintf("未命名App_%v", uuid) case 3: sendCont.FormName = fmt.Sprintf("未命名App表单_%v", uuid) default: sendCont.FormName = fmt.Sprintf("未命名表单_%v", uuid) } sendCont.FormLogo = tableName sendCont.SignCode = strconv.FormatInt(uuid, 10) publicmethod.Result(0, sendCont, c) } /* * @ 作者: 秦东 @ 时间: 2023-08-29 15:21:58 @ 功能: 保存自定义表单 @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) SaveCustomerForm(c *gin.Context) { context, _ := c.Get(overall.MyContJwt) var requestData HaveCustomerFormConfig err := c.ShouldBindJSON(&requestData) if err != nil { publicmethod.Result(100, err, c) return } if requestData.Data == "" { publicmethod.Result(1, err, c, "自定义表单错误!") return } if requestData.Name == "" { publicmethod.Result(1, err, c, "未知表单名称!") return } if requestData.Classify == 0 { requestData.Classify = 1 } var formJsonCont CustomerFormMaster json.Unmarshal([]byte(requestData.JsonData), &formJsonCont) if formJsonCont.Form.FormName == "" { publicmethod.Result(1, err, c, "未知表单名称!") return } if formJsonCont.Form.Name == "" { publicmethod.Result(1, err, c, "未知表单标识!") return } var userCont modelshr.ManCont userCont.GetLoginCont(context) cureeTime := time.Now().Unix() var customerFormCont modelAppPlatform.CustomerForm err = customerFormCont.GetCont(map[string]interface{}{"`tablename`": formJsonCont.Form.Name}, "`id`") if err == nil || customerFormCont.Id != 0 { publicmethod.Result(1, err, c, "已有相同表单标识!请更换后再提交!") return } customerFormCont.Name = formJsonCont.Form.FormName //表单名称"` customerFormCont.TableNames = formJsonCont.Form.Name //创建表单名称"` customerFormCont.Classify = requestData.Classify //分类1:表单;2:流程表单"` customerFormCont.Permit = "" //授权范围"` customerFormCont.States = 1 //显示状态(1:启用;2:禁用,3:删除)"` // customerFormCont.MastesForm = requestData.Data //表单结构"` // customerFormCont.MastesFormJson = requestData.JsonData //表单结构json"` // customerFormCont.Creater = userCont.Key //创建人"` customerFormCont.CreaterTime = cureeTime //创建时间"` customerFormCont.EditTime = cureeTime //编辑时间"` // customerFormCont.TableStructure = "" //字表结构"` // customerFormCont.Dict = requestData.Dict customerFormCont.Icon = formJsonCont.Config.ImageUrl groupId, _ := strconv.ParseInt(formJsonCont.Config.GroupKey, 10, 64) customerFormCont.Groupid = groupId var formVersion modelAppPlatform.CustomerFormVersion formVersion.TableKey = formJsonCont.Form.Name //default:'';not null;comment:表单标识符"` varsionNum := HageFormVersionNum(formJsonCont.Form.Name) formVersion.Version = varsionNum //1;not null;comment:版本号"` if varsionNum > 1 { formVersion.Status = 2 } else { formVersion.Status = 1 //not null;comment:显示状态(1:启用;2:禁用,3:删除)"` } formVersion.MastesForm = requestData.Data //';comment:表单结构"` formVersion.MastesFormJson = requestData.JsonData //efault:'';comment:表单结构json"` formVersion.Creater = userCont.Key //ult:0;not null;comment:创建人"` formVersion.CreaterTime = cureeTime //not null;comment:创建时间"` formVersion.EditTime = cureeTime //efault:0;not null;comment:编辑时间"` // mastSql, _ := formJsonCont.CreateFormDatabaseTable() // mastSql, _ := formJsonCont.DisassembleForm() mastSql, _ := formJsonCont.CreateFormTable() formVersion.TableStructure = mastSql //;default:'';comment:字表结构"` formVersion.Dict = requestData.Dict //字表结构"` createDb := overall.CONSTANT_DB_AppPlatform.Begin() errMain := createDb.Create(&customerFormCont).Error errVer := createDb.Create(&formVersion).Error sendErr := publicmethod.MapOut[string]() if errMain != nil || errVer != nil { createDb.Rollback() sendErr := publicmethod.MapOut[string]() sendErr["errMain"] = errMain sendErr["errVer"] = errVer publicmethod.Result(104, sendErr, c) return } err = createDb.Commit().Error sendErr["err"] = err sendErr["customerFormCont"] = customerFormCont sendErr["formVersion"] = formVersion // err = createDb.Create(&customerFormCont).Error // if err != nil { // publicmethod.Result(104, customerFormCont, c) // return // } publicmethod.Result(0, sendErr, c) } /* * @ 作者: 秦东 @ 时间: 2023-09-08 11:23:48 @ 功能: 获取自定义表单版本号 @ 参数 # @ 返回值 # @ 方法原型 # */ func HageFormVersionNum(tableKey string) (num int64) { overall.CONSTANT_DB_AppPlatform.Model(&modelAppPlatform.CustomerFormVersion{}).Where("`tablekey` = ?", tableKey).Count(&num) num = num + 1 return } /* * @ 作者: 秦东 @ 时间: 2023-08-30 14:58:19 @ 功能: 查看自定义表单 @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) LookCustomerForm(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(1, requestData.Id, c, "未知表单!") return } var customerFormCont modelAppPlatform.CustomerForm err = customerFormCont.GetCont(map[string]interface{}{"id": requestData.Id}) if err != nil { publicmethod.Result(107, err, c) return } var sendCont LookCustomerFormInfo sendCont.CfId = customerFormCont.Id sendCont.Name = customerFormCont.Name //表单名称"` sendCont.Classify = customerFormCont.Classify //分类1:表单;2:流程表单"` sendCont.Permit = customerFormCont.Permit //授权范围"` // sendCont.OpenClose = false // if customerFormCont.States == 1 { // sendCont.OpenClose = true // } sendCont.States = customerFormCont.States //显示状态(1:启用;2:禁用,3:删除)"` // sendCont.MastesForm = customerFormCont.MastesForm //表单结构"` // sendCont.MastesFormJson = customerFormCont.MastesFormJson //表单结构json"` // sendCont.Creater = customerFormCont.Creater //创建人"` sendCont.CreaterTime = customerFormCont.CreaterTime //创建时间"` sendCont.EditTime = customerFormCont.EditTime //编辑时间"` // sendCont.TableStructure = customerFormCont.TableStructure //字表结构"` // sendCont.Dict = customerFormCont.Dict //字表结构"` var formVersion modelAppPlatform.CustomerFormVersion formVersion.GetCont(map[string]interface{}{"tablekey": customerFormCont.TableNames, "`status`": 1}) sendCont.Id = formVersion.Id sendCont.TableKey = customerFormCont.TableNames //创建表单名称"` sendCont.MastesForm = formVersion.MastesForm //表单结构"` sendCont.MastesFormJson = formVersion.MastesFormJson //表单结构json"` sendCont.Creater = formVersion.Creater //创建人"` sendCont.TableStructure = formVersion.TableStructure //字表结构"` sendCont.Dict = formVersion.Dict //字表结构"` sendCont.Status = formVersion.Status //显示状态(1:启用;2:禁用,3:删除)"` sendCont.GroupKey = strconv.FormatInt(customerFormCont.Groupid, 10) sendCont.Icon = customerFormCont.Icon sendCont.FlowIsOpen = customerFormCont.FlowIsOpen json.Unmarshal([]byte(customerFormCont.Permit), &sendCont.PermitList) if formVersion.TableKey != "" { masterFieldAry, mastErr := ReadDatabaseForm(formVersion.TableKey) if mastErr == nil { for _, v := range masterFieldAry { if !publicmethod.IsInTrue[string](v.Field, sendCont.FormField) { sendCont.FormField = append(sendCont.FormField, v.Field) } } } } if formVersion.TableStructure != "" { var sunTable map[string]string err = json.Unmarshal([]byte(formVersion.TableStructure), &sunTable) if err == nil { for _, v := range sunTable { sonFieldAry, sunErr := ReadDatabaseForm(v) sendCont.TableStructureMap = append(sendCont.TableStructureMap, v) if sunErr == nil { for _, v := range sonFieldAry { if !publicmethod.IsInTrue[string](v.Field, sendCont.FormField) { sendCont.FormField = append(sendCont.FormField, v.Field) } } } } } } publicmethod.Result(0, sendCont, c) } /* * @ 作者: 秦东 @ 时间: 2023-09-01 08:26:14 @ 功能: 编辑自定义表单状态 @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) EditCustomerFormStatus(c *gin.Context) { var requestData EditCustomerFormStatus err := c.ShouldBindJSON(&requestData) if err != nil { publicmethod.Result(100, err, c) return } if len(requestData.Id) < 1 { publicmethod.Result(1, err, c, "没有要删除得内容!") return } if requestData.Status == 0 { requestData.Status = 2 } editCustomerForm := publicmethod.MapOut[string]() editCustomerForm["`states`"] = requestData.Status if requestData.Status != 3 { err = overall.CONSTANT_DB_AppPlatform.Model(&modelAppPlatform.CustomerForm{}).Where("`id` IN ?", requestData.Id).Updates(editCustomerForm).Error if err != nil { publicmethod.Result(108, err, c) return } } else { if requestData.IsDelete { err = overall.CONSTANT_DB_AppPlatform.Where("`id` IN ?", requestData.Id).Delete(&modelAppPlatform.CustomerForm{}).Error } else { err = overall.CONSTANT_DB_AppPlatform.Model(&modelAppPlatform.CustomerForm{}).Where("`id` IN ?", requestData.Id).Updates(editCustomerForm).Error if err != nil { publicmethod.Result(108, err, c) return } } } publicmethod.Result(0, err, c) } /* * @ 作者: 秦东 @ 时间: 2023-09-08 14:08:34 @ 功能: 获取版本列表 @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) HaveCustomerFormVersion(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(1, err, c, "未知设置数据!请检查!") return } var list []SendVersionCont overall.CONSTANT_DB_AppPlatform.Where("`tablekey` = ? AND `status` BETWEEN ? AND ?", requestData.Id, 1, 2).Find(&list) for i, v := range list { list[i].CreaterTimeStr = publicmethod.UnixTimeToDay(v.CreaterTime, 24) var userCont modelshr.PersonArchives userCont.GetCont(map[string]interface{}{"`key`": v.Creater}, "`name`") list[i].CreaterName = userCont.Name } publicmethod.Result(0, list, c) } /* * @ 作者: 秦东 @ 时间: 2023-09-01 15:14:38 @ 功能: 编辑自定义表单设置 @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) SaveSetupCont(c *gin.Context) { var requestData HaveCustomerFormInfo err := c.ShouldBindJSON(&requestData) if err != nil { publicmethod.Result(100, err, c) return } if requestData.Id == 0 { publicmethod.Result(1, err, c, "未知设置数据!请检查!") return } if requestData.Name == "" { publicmethod.Result(1, err, c, "请输入表格名称!") return } if requestData.States == 0 { requestData.States = 1 } var saveCont modelAppPlatform.CustomerForm err = saveCont.GetCont(map[string]interface{}{"id": requestData.Id}) if err != nil { publicmethod.Result(107, err, c) return } var orgAry [][]int64 json.Unmarshal([]byte(requestData.Permit), &orgAry) var orgList []string if len(orgAry) > 0 { for i := 0; i < len(orgAry); i++ { if len(orgAry[i]) > 0 { for j := 0; j < len(orgAry[i]); j++ { orgId := strconv.FormatInt(orgAry[i][j], 10) if !publicmethod.IsInTrue[string](orgId, orgList) { orgList = append(orgList, orgId) } } } } } orgLists := strings.Join(orgList, ",") editCont := publicmethod.MapOut[string]() editCont["`name`"] = requestData.Name editCont["`permit`"] = requestData.Permit editCont["`permitstr`"] = orgLists editCont["`states`"] = requestData.States editCont["`edit_time`"] = time.Now().Unix() err = saveCont.EiteCont(map[string]interface{}{"id": requestData.Id}, editCont) if err != nil { publicmethod.Result(106, err, c) return } publicmethod.Result(0, orgLists, c) } /* * @ 作者: 秦东 @ 时间: 2023-09-05 08:03:04 @ 功能: 拆解表单结构,设计创建数据库表 @ 参数 # @ 返回值 # @ 方法原型 # */ func (c *CustomerFormMaster) DisassembleForm() (relevance string, err error) { isSunTable := false var masterSql []string var sunFormName []string sunFormNameAry := publicmethod.MapOut[string]() sunForm := publicmethod.MapOut[string]() for _, v := range c.List { fmt.Printf("类只能怪--->%v\n", v.Type) switch v.Type { // case "title": // fmt.Printf("type:%v <===========>label:%v <===========> Name:%v <===========> ModelValue:%v\n", v.Type, v.Control, v.Name, v.Control.ModelValue) case "grid", "tabs": if len(v.Columns) > 0 { for _, cv := range v.Columns { // fmt.Printf("type:%v <===========>label:%v <===========> Name:%v<===========> ModelValue:%v\n", v.Type, cv.Attr.Span, cv.Type, v.Control.ModelValue) sqlStr := ComponentMappingDataTable(c.Form.Name, cv.List) masterSql = append(masterSql, sqlStr...) } } case "card", "div": if len(v.List) > 0 { sqlStr := ComponentMappingDataTable(c.Form.Name, v.List) masterSql = append(masterSql, sqlStr...) } case "table", "flex": if len(v.List) > 0 { isSunTable = true if !publicmethod.IsInTrue[string](v.Name, sunFormName) { sunFormName = append(sunFormName, v.Name) sunFormNameAry[v.Name] = v.Name sqlStr := ComponentMappingDataTable(v.Name, v.List) sunForm[v.Name] = sqlStr CreateForm(v.Name, fmt.Sprintf("%v(%v)子表", c.Form.FormName, c.Form.Name), "InnoDB", false) } else { sunTableName := fmt.Sprintf("%v%v", v.Name, publicmethod.GetUUid(1)) sunFormName = append(sunFormName, sunTableName) sunFormNameAry[v.Name] = sunTableName sqlStr := ComponentMappingDataTable(sunTableName, v.List) sunForm[sunTableName] = sqlStr CreateForm(sunTableName, fmt.Sprintf("%v(%v)子表", c.Form.FormName, c.Form.Name), "InnoDB", false) } } case "input": masterSql = append(masterSql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v COMMENT '%v'", c.Form.Name, v.Name, CustomRules(v.CustomRules), v.Item.Label)) case "password", "colorPicker", "component": // sqlStr = fmt.Sprintf("%v varchar(255) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '%v'", sqlStr, lv.Item.Label) masterSql = append(masterSql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` varchar(255) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '%v'", c.Form.Name, v.Name, v.Item.Label)) case "datePicker", "checkbox", "cascader", "treeSelect", "textarea", "upload", "expand-user": // sqlStr = fmt.Sprintf("%v mediumtext COMMENT '%v'", sqlStr, lv.Item.Label) masterSql = append(masterSql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` mediumtext COMMENT '%v'", c.Form.Name, v.Name, v.Item.Label)) case "select", "radio", "inputSlot": // sqlStr = fmt.Sprintf("%v %v COMMENT '%v'", sqlStr, SelectUnit(lv.Config), lv.Item.Label) masterSql = append(masterSql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v COMMENT '%v'", c.Form.Name, v.Name, SelectUnit(v.Config), v.Item.Label)) case "rate", "inputNumber", "slider", "switch": // sqlStr = fmt.Sprintf("%v %v COMMENT '%v'", sqlStr, ControlJudge(lv.Type, lv.Control), lv.Item.Label) masterSql = append(masterSql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` %v COMMENT '%v'", c.Form.Name, v.Name, ControlJudge(v.Type, v.Control), v.Item.Label)) case "tinymce", "signaturemap": // sqlStr = fmt.Sprintf("%v longtext COMMENT '%v'", sqlStr, lv.Item.Label) masterSql = append(masterSql, fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v` longtext COMMENT '%v'", c.Form.Name, v.Name, v.Item.Label)) default: // fmt.Printf("type:%v <===========>label:%v <===========> Name:%v<===========> ModelValue:%v\n", v.Type, v.Item.Label, v.Name, v.Control.ModelValue) } } if isSunTable { err = CreateForm(c.Form.Name, c.Form.FormName, "InnoDB", true) } else { err = CreateForm(c.Form.Name, c.Form.FormName, "MyISAM", true) } if err != nil { return } // fmt.Printf("主表单结构---》%v\n", masterSql) CreateFormFiled(c.Form.Name, c.Form.FormName, true, masterSql) if len(sunForm) > 0 { relevanceByte, _ := json.Marshal(sunFormNameAry) relevance = string(relevanceByte) for i, v := range sunForm { // fmt.Printf("表单结构----拆解----》%v========>%v\n", i, v) CreateFormFiled(i, fmt.Sprintf("%v(%v)子表", c.Form.FormName, c.Form.Name), false, v) } } return } /* * @ 作者: 秦东 @ 时间: 2023-09-13 09:28:58 @ 功能: 创建数据表字段 @ 参数 #formName 表单名称 #formNotes 表单备注 #isMasters true 主表;false:子表 #sqlList 语句列表 @ 返回值 # @ 方法原型 # */ func CreateFormFiled(formName, formNotes string, isMasters bool, sqlList interface{}) { // fmt.Printf("函数类型----%v---%T\n", reflect.TypeOf(sqlList), sqlList) if sql, isOk := sqlList.([]string); isOk { for k, v := range sql { // fmt.Printf("%v\n", v) // overall.CONSTANT_DB_CustomerForm.Exec(v) syncSeting.Add(1) go CoroutineExecuteSql(k, v) // err := overall.CONSTANT_DB_CustomerForm.Exec(v).Error // fmt.Printf("字段创建----%v---%v\n", err, v) } syncSeting.Wait() } } // 协程执行mysql语句 func CoroutineExecuteSql(k int, sql string) { defer syncSeting.Done() overall.CONSTANT_DB_CustomerForm.Exec(sql) // err := overall.CONSTANT_DB_CustomerForm.Exec(sql).Error // overall.CONSTANT_DB_CustomerForm.Raw(sql) // fmt.Printf("协程执行mysql语句---:---%v---------->%v---------->%v\n", k, sql, err) } /* * @ 作者: 秦东 @ 时间: 2023-09-13 08:12:23 @ 功能: 创建表单 @ 参数 #formName 数据表名称 #notes 数据表描述 #engine 数据表引擎 MyISAM @ 返回值 # @ 方法原型 # */ func CreateForm(formName, notes, engine string, isMasters bool) (err error) { if engine == "" { engine = "MyISAM" } //判断表单是否存在 isTrue := overall.CONSTANT_DB_CustomerForm.Migrator().HasTable(formName) if !isTrue { //当数据表不存在时进行创建 if isMasters { //创建主表 sqlCreateTable := fmt.Sprintf("CREATE TABLE `%v` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`masters_key` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '主表标识',`creater` bigint(20) unsigned DEFAULT '0' COMMENT '创建人',`creater_time` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',`edit_time` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '编辑时间',`flow_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '流程识别标识',`states` int(11) unsigned NOT NULL DEFAULT '1' COMMENT '状态(1:启用,2:禁用;3:删除)',`flowIsOpen` int(1) unsigned NOT NULL DEFAULT '2' COMMENT '是否开启工作流',PRIMARY KEY (`id`) USING BTREE,UNIQUE KEY `id` (`id`) USING HASH,UNIQUE KEY `masters_key` (`masters_key`) USING HASH) ENGINE=%v DEFAULT CHARSET=utf8mb4 COMMENT='%v'", formName, engine, notes) err = overall.CONSTANT_DB_CustomerForm.Exec(sqlCreateTable).Error } else { //创建子表 sqlCreateTable := fmt.Sprintf("CREATE TABLE `%v` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`masters_key` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '主表标识',`creater` bigint(20) unsigned DEFAULT '0' COMMENT '创建人',`creater_time` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',`edit_time` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '编辑时间',`states` int(11) unsigned NOT NULL DEFAULT '1' COMMENT '状态(1:启用,2:禁用;3:删除)',PRIMARY KEY (`id`) USING BTREE,UNIQUE KEY `id` (`id`) USING HASH,KEY `masters_key` (`masters_key`) USING HASH) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='%v'", formName, notes) err = overall.CONSTANT_DB_CustomerForm.Exec(sqlCreateTable).Error } } return } /* * @ 作者: 秦东 @ 时间: 2023-09-12 16:15:59 @ 功能: 组件映射数据表 @ 参数 #tableName 表明 #list 组件列表 @ 返回值 #mastSql 数据库语句 @ 方法原型 #func ComponentMappingDataTable(tableName string, list []MasterStruct) (mastSql []string) */ func ComponentMappingDataTable(tableName string, list []MasterStruct) (mastSql []string) { if len(list) > 0 { for _, lv := range list { sqlStr := fmt.Sprintf("ALTER TABLE `%v` ADD COLUMN `%v`", tableName, lv.Name) switch lv.Type { case "input": sqlStr = fmt.Sprintf("%v %v COMMENT '%v'", sqlStr, CustomRules(lv.CustomRules), lv.Item.Label) case "password", "colorPicker", "component": sqlStr = fmt.Sprintf("%v varchar(255) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '%v'", sqlStr, lv.Item.Label) case "datePicker", "checkbox", "cascader", "treeSelect", "textarea", "upload", "expand-user": sqlStr = fmt.Sprintf("%v mediumtext COMMENT '%v'", sqlStr, lv.Item.Label) case "select", "radio", "inputSlot": sqlStr = fmt.Sprintf("%v %v COMMENT '%v'", sqlStr, SelectUnit(lv.Config), lv.Item.Label) case "rate", "inputNumber", "slider", "switch": sqlStr = fmt.Sprintf("%v %v COMMENT '%v'", sqlStr, ControlJudge(lv.Type, lv.Control), lv.Item.Label) case "tinymce": sqlStr = fmt.Sprintf("%v longtext COMMENT '%v'", sqlStr, lv.Item.Label) default: } mastSql = append(mastSql, sqlStr) } } return } /* * @ 作者: 秦东 @ 时间: 2023-09-12 14:59:51 @ 功能: 组件配置判断 @ 参数 # @ 返回值 # @ 方法原型 # */ func ControlJudge(class string, control ControlStruct) (sqlStr string) { switch class { case "rate": if control.Max < 10 { sqlStr = " tinyint(1) unsigned NOT NULL DEFAULT '0' " } else if control.Max <= 255 { sqlStr = " tinyint(3) unsigned NOT NULL DEFAULT '0' " } else if control.Max <= 4294967295 { sqlStr = " int(10) unsigned NOT NULL DEFAULT '0' " } else { sqlStr = " bigint(20) unsigned NOT NULL DEFAULT '0' " } case "switch": switch control.ModelValue.(type) { case bool: if control.ModelValue == true { sqlStr = " tinyint(1) unsigned NOT NULL DEFAULT '1' " } else { sqlStr = " tinyint(1) unsigned NOT NULL DEFAULT '0' " } case int, int8, int16: sqlStr = " int(10) unsigned NOT NULL DEFAULT '0' " case int32, int64: sqlStr = " bigint(20) unsigned NOT NULL DEFAULT '0' " case float32, float64: sqlStr = " float(20,10) unsigned DEFAULT '0' " default: sqlStr = " varchar(255) COLLATE utf8mb4_general_ci DEFAULT '' " } case "slider": if control.Max == 0 { sqlStr = " tinyint(3) unsigned NOT NULL DEFAULT '0' " } else if control.Max < 10 && control.Max > 0 { sqlStr = " tinyint(1) unsigned NOT NULL DEFAULT '0' " } else if control.Max <= 255 { sqlStr = " tinyint(3) unsigned NOT NULL DEFAULT '0' " } else if control.Max <= 4294967295 { sqlStr = " int(10) unsigned NOT NULL DEFAULT '0' " } else { sqlStr = " bigint(20) unsigned NOT NULL DEFAULT '0' " } default: sqlStr = " varchar(255) COLLATE utf8mb4_general_ci DEFAULT '' " } return } /* * @ 作者: 秦东 @ 时间: 2023-09-12 10:17:58 @ 功能: 下拉字段处理 @ 参数 #tableName 表名 #field 字段名 #rubric 备注 #control 控制器 @ 返回值 #sqlStr 补充SQL语句 @ 方法原型 # */ func SelectUnit(config UnitConfigStruct) (sqlStr string) { switch config.TransformData { case "number": sqlStr = " bigint(20) unsigned NOT NULL DEFAULT '0' " default: sqlStr = " varchar(255) COLLATE utf8mb4_general_ci DEFAULT '' " } return } /* * @ 作者: 秦东 @ 时间: 2023-09-12 09:29:23 @ 功能: 校验规则 @ 参数 #list 自定义规则 @ 返回值 #sqlStr 补充SQL语句 @ 方法原型 #func CustomRules(list []CustomRulesStruct) (sqlStr string) */ func CustomRules(list []CustomRulesStruct) (sqlStr string) { sqlStr = fmt.Sprintf("NOT NULL") if len(list) <= 0 { sqlStr = fmt.Sprintf(" varchar(255) COLLATE utf8mb4_general_ci %v DEFAULT '' ", sqlStr) return } var typeAry []string for _, v := range list { if !publicmethod.IsInTrue[string](v.Type, typeAry) { switch v.Type { case "int": sqlStr = fmt.Sprintf(" int(6) unsigned %v DEFAULT '1' ", sqlStr) case "number": sqlStr = fmt.Sprintf(" bigint(20) unsigned %v DEFAULT '0' ", sqlStr) case "money": sqlStr = fmt.Sprintf(" decimal(20,4) unsigned %v DEFAULT '0' ", sqlStr) case "mobile", "tel", "phone": sqlStr = fmt.Sprintf(" varchar(100) COLLATE utf8mb4_general_ci %v DEFAULT '' ", sqlStr) default: sqlStr = fmt.Sprintf(" varchar(255) COLLATE utf8mb4_general_ci %v DEFAULT '' ", sqlStr) } } } return } /* * @ 作者: 秦东 @ 时间: 2023-09-09 09:31:55 @ 功能: 编辑自定义表单内容 @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) EditCustomerFormInfo(c *gin.Context) { context, _ := c.Get(overall.MyContJwt) var requestData EditCustomerFormCont err := c.ShouldBindJSON(&requestData) if err != nil { publicmethod.Result(100, err, c) return } if requestData.Id == "" { publicmethod.Result(1, err, c, "自定义表单错误!") return } if requestData.Version == "" { publicmethod.Result(1, err, c, "自定义表单错误!") return } if requestData.Data == "" { publicmethod.Result(1, err, c, "自定义表单错误!") return } if requestData.Name == "" { publicmethod.Result(1, err, c, "未知表单名称!") return } if requestData.Classify == 0 { requestData.Classify = 1 } var formJsonCont CustomerFormMaster json.Unmarshal([]byte(requestData.JsonData), &formJsonCont) if formJsonCont.Form.FormName == "" { publicmethod.Result(1, err, c, "未知表单名称!") return } if formJsonCont.Form.Name == "" { publicmethod.Result(1, err, c, "未知表单标识!") return } var customerFormCont modelAppPlatform.CustomerForm err = customerFormCont.GetCont(map[string]interface{}{"`id`": requestData.Id}, "`tablename`") if err != nil { publicmethod.Result(107, err, c) return } var userCont modelshr.ManCont userCont.GetLoginCont(context) cureeTime := time.Now().Unix() mainData := publicmethod.MapOut[string]() mainData["`name`"] = formJsonCont.Form.FormName mainData["`classify`"] = requestData.Types mainData["`edit_time`"] = cureeTime if formJsonCont.Config.ImageUrl != "" { mainData["`icon`"] = formJsonCont.Config.ImageUrl } groupId, _ := strconv.ParseInt(formJsonCont.Config.GroupKey, 10, 64) mainData["`groupid`"] = groupId customerFormCont.EiteCont(map[string]interface{}{"`id`": requestData.Id}, mainData) versionData := publicmethod.MapOut[string]() versionData["`mastesform`"] = requestData.Data versionData["`mastesformjson`"] = requestData.JsonData versionData["`creater`"] = userCont.Key // mastSql, _ := formJsonCont.DisassembleForm() // mastSql, _ := formJsonCont.CreateFormDatabaseTable() mastSql, _ := formJsonCont.CreateFormTable() versionData["`table_structure`"] = mastSql versionData["`dict`"] = requestData.Dict var formVersion modelAppPlatform.CustomerFormVersion formVersion.EiteCont(map[string]interface{}{"`id`": requestData.Version}, versionData) publicmethod.Result(0, err, c) } /* * @ 作者: 秦东 @ 时间: 2023-09-09 09:45:42 @ 功能: 另存为新版 @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) SaveAsNewVersion(c *gin.Context) { context, _ := c.Get(overall.MyContJwt) var requestData HaveCustomerFormConfig err := c.ShouldBindJSON(&requestData) if err != nil { publicmethod.Result(100, err, c) return } if requestData.Data == "" { publicmethod.Result(1, err, c, "自定义表单错误!") return } if requestData.Name == "" { publicmethod.Result(1, err, c, "未知表单名称!") return } if requestData.Classify == 0 { requestData.Classify = 1 } var formJsonCont CustomerFormMaster json.Unmarshal([]byte(requestData.JsonData), &formJsonCont) if formJsonCont.Form.FormName == "" { publicmethod.Result(1, err, c, "未知表单名称!") return } if formJsonCont.Form.Name == "" { publicmethod.Result(1, err, c, "未知表单标识!") return } var userCont modelshr.ManCont userCont.GetLoginCont(context) cureeTime := time.Now().Unix() var customerFormCont modelAppPlatform.CustomerForm err = customerFormCont.GetCont(map[string]interface{}{"`tablename`": formJsonCont.Form.Name}, "`id`", "`tablename`") if err != nil { publicmethod.Result(107, err, c) return } mainData := publicmethod.MapOut[string]() if formJsonCont.Config.ImageUrl != "" { mainData["`icon`"] = formJsonCont.Config.ImageUrl } if formJsonCont.Config.GroupKey != "" { groupId, _ := strconv.ParseInt(formJsonCont.Config.GroupKey, 10, 64) mainData["`groupid`"] = groupId } if len(mainData) > 0 { mainData["`edit_time`"] = cureeTime customerFormCont.EiteCont(map[string]interface{}{"`id`": customerFormCont.Id}, mainData) } var formVersion modelAppPlatform.CustomerFormVersion formVersion.TableKey = customerFormCont.TableNames //default:'';not null;comment:表单标识符"` varsionNum := HageFormVersionNum(customerFormCont.TableNames) formVersion.Version = varsionNum //1;not null;comment:版本号"` if varsionNum > 1 { formVersion.Status = 2 } else { formVersion.Status = 1 //not null;comment:显示状态(1:启用;2:禁用,3:删除)"` } formVersion.MastesForm = requestData.Data //';comment:表单结构"` formVersion.MastesFormJson = requestData.JsonData //efault:'';comment:表单结构json"` formVersion.Creater = userCont.Key //ult:0;not null;comment:创建人"` formVersion.CreaterTime = cureeTime //not null;comment:创建时间"` formVersion.EditTime = cureeTime //efault:0;not null;comment:编辑时间"` // mastSql, _ := formJsonCont.DisassembleForm() // mastSql, _ := formJsonCont.CreateFormDatabaseTable() mastSql, _ := formJsonCont.CreateFormTable() formVersion.TableStructure = mastSql //;default:'';comment:字表结构"` formVersion.Dict = requestData.Dict //字表结构"` errVer := overall.CONSTANT_DB_AppPlatform.Create(&formVersion).Error if errVer != nil { publicmethod.Result(104, customerFormCont, c) return } publicmethod.Result(0, formVersion, c) } /* * @ 作者: 秦东 @ 时间: 2023-09-09 10:44:55 @ 功能: 启用版本 @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) EnableVersion(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(1, err, c, "未知启用版本!") return } var formVersion modelAppPlatform.CustomerFormVersion err = formVersion.GetCont(map[string]interface{}{"`id`": requestData.Id}) if err != nil { publicmethod.Result(107, err, c) return } overall.CONSTANT_DB_AppPlatform.Model(&modelAppPlatform.CustomerFormVersion{}).Where("`tablekey` = ? AND `status` = 1", formVersion.TableKey).Updates(map[string]interface{}{"`status`": 2}) err = formVersion.EiteCont(map[string]interface{}{"`id`": requestData.Id}, map[string]interface{}{"`status`": 1}) publicmethod.Result(0, err, c) } /* * @ 作者: 秦东 @ 时间: 2023-09-15 10:29:39 @ 功能: 检测是否存在提交和返回按钮 @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) JudgeSubmitCancel(c *gin.Context) { var requestData publicmethod.PublicName err := c.ShouldBindJSON(&requestData) if err != nil { publicmethod.Result(100, err, c) return } if requestData.Name == "" { publicmethod.Result(1, err, c, "未知表单数据!") return } isSubmit := false isCancel := false var formJsonCont CustomerFormMaster json.Unmarshal([]byte(requestData.Name), &formJsonCont) if len(formJsonCont.List) > 0 { for _, v := range formJsonCont.List { switch v.Type { case "grid", "tabs": if len(v.Columns) > 0 { for _, cv := range v.Columns { isSubmits, isCancels := PublicUnitJieXi(cv.List) if isSubmits { isSubmit = true } if isCancels { isCancel = true } } } case "card", "div": if len(v.List) > 0 { isSubmits, isCancels := PublicUnitJieXi(v.List) if isSubmits { isSubmit = true } if isCancels { isCancel = true } } case "button": if v.Control.Key == "submit" { isSubmit = true } if v.Control.Key == "cancel" { isCancel = true } default: // fmt.Printf("type:%v <===========>label:%v <===========> Name:%v<===========> ModelValue:%v\n", v.Type, v.Item.Label, v.Name, v.Control.ModelValue) } } } buttonIsTrue := 0 if isSubmit && isCancel { buttonIsTrue = 1 } else if isSubmit && !isCancel { buttonIsTrue = 2 } else if !isSubmit && isCancel { buttonIsTrue = 3 } else { buttonIsTrue = 4 } snedAry := publicmethod.MapOut[string]() snedAry["buttonIsTrue"] = buttonIsTrue snedAry["formJsonCont"] = formJsonCont publicmethod.Result(0, buttonIsTrue, c) } /* * @ 作者: 秦东 @ 时间: 2023-09-15 10:44:20 @ 功能: 通用组件解析 @ 参数 # @ 返回值 # @ 方法原型 # */ func PublicUnitJieXi(list []MasterStruct) (isSubmit, isCancel bool) { if len(list) > 0 { for _, v := range list { switch v.Type { case "button": if v.Control.Key == "submit" { isSubmit = true } if v.Control.Key == "cancel" { isCancel = true } default: } } } return } /* * @ 作者: 秦东 @ 时间: 2024-07-23 16:33:50 @ 功能: 编辑常用自定义App @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) SetOftenApp(c *gin.Context) { var requestData publicmethod.PublicId err := c.ShouldBindJSON(&requestData) if err != nil { publicmethod.Result(100, err, c) return } if requestData.Id == "" { publicmethod.Result(1, requestData.Id, c, "未知App!") return } context, _ := c.Get(overall.MyContJwt) var userCont modelshr.ManCont userCont.GetLoginCont(context) var oftenAppInfo modelAppPlatform.OftenApp err = oftenAppInfo.GetCont(map[string]interface{}{"`userKey`": userCont.Key}) if err != nil { oftenAppInfo.UserKey = userCont.Key //所有者"` oftenAppInfo.Time = time.Now().Unix() //编辑时间"` var signCode []string signCode = append(signCode, requestData.Id) oftenAppInfo.AppSignCode = strings.Join(signCode, ",") //节点名称"` err = overall.CONSTANT_DB_AppPlatform.Create(&oftenAppInfo).Error if err != nil { publicmethod.Result(104, requestData.Id, c) return } } else { if oftenAppInfo.AppSignCode != "" { appId := strings.Split(oftenAppInfo.AppSignCode, ",") if len(appId) > 0 { editInfo := publicmethod.MapOut[string]() if publicmethod.IsInTrue[string](requestData.Id, appId) { var newAppid []string for _, v := range appId { if v != requestData.Id { newAppid = append(newAppid, v) } } editInfo["appSignCode"] = strings.Join(newAppid, ",") } else { appId = append(appId, requestData.Id) editInfo["appSignCode"] = strings.Join(appId, ",") } editInfo["time"] = time.Now().Unix() var editContApp modelAppPlatform.OftenApp err = editContApp.EiteCont(map[string]interface{}{"`id`": oftenAppInfo.Id}, editInfo) } else { editInfo := publicmethod.MapOut[string]() editInfo["time"] = time.Now().Unix() var signCode []string signCode = append(signCode, requestData.Id) editInfo["appSignCode"] = strings.Join(signCode, ",") //节点名称"` var editContApp modelAppPlatform.OftenApp err = editContApp.EiteCont(map[string]interface{}{"`id`": oftenAppInfo.Id}, editInfo) } } else { editInfo := publicmethod.MapOut[string]() editInfo["time"] = time.Now().Unix() var signCode []string signCode = append(signCode, requestData.Id) editInfo["appSignCode"] = strings.Join(signCode, ",") //节点名称"` var editContApp modelAppPlatform.OftenApp err = editContApp.EiteCont(map[string]interface{}{"`id`": oftenAppInfo.Id}, editInfo) } } if err != nil { publicmethod.Result(106, requestData.Id, c) return } publicmethod.Result(0, err, c) } /* * @ 作者: 秦东 @ 时间: 2025-01-03 13:02:04 @ 功能: 根据数据源创建表单字段 @ 参数 #sqlDb 数据源指针 #formName 表单名称 #formNotes 表单备注 #isMasters true 主表;false:子表 #sqlList 语句列表 @ 返回值 # @ 方法原型 # */ func CreateDataSourceFormFiled(sqlDb *gorm.DB, formName, formNotes string, isMasters bool, sqlList interface{}) { if sql, isOk := sqlList.([]string); isOk { for k, v := range sql { syncSeting.Add(1) go CoroutineDataSourceExecuteSql(sqlDb, k, v) } syncSeting.Wait() } } // 协程执行mysql语句 func CoroutineDataSourceExecuteSql(sqlDb *gorm.DB, k int, sql string) { defer syncSeting.Done() sqlDb.Exec(sql) } func CreateDataSourceForm(sqlDb *gorm.DB, formName, notes, engine string, isMasters bool) (err error) { if engine == "" { engine = "MyISAM" } //判断表单是否存在 isTrue := sqlDb.Migrator().HasTable(formName) if !isTrue { //当数据表不存在时进行创建 if isMasters { //创建主表 sqlCreateTable := fmt.Sprintf("CREATE TABLE `%v` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`masters_key` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '主表标识',`creater` bigint(20) unsigned DEFAULT '0' COMMENT '创建人',`creater_time` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',`edit_time` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '编辑时间',`flow_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '流程识别标识',`states` int(11) unsigned NOT NULL DEFAULT '1' COMMENT '状态(1:启用,2:禁用;3:删除)',`flowIsOpen` int(1) unsigned NOT NULL DEFAULT '2' COMMENT '是否开启工作流',PRIMARY KEY (`id`) USING BTREE,UNIQUE KEY `id` (`id`) USING HASH,UNIQUE KEY `masters_key` (`masters_key`) USING HASH) ENGINE=%v DEFAULT CHARSET=utf8mb4 COMMENT='%v'", formName, engine, notes) err = sqlDb.Exec(sqlCreateTable).Error } else { //创建子表 sqlCreateTable := fmt.Sprintf("CREATE TABLE `%v` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`masters_key` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '主表标识',`creater` bigint(20) unsigned DEFAULT '0' COMMENT '创建人',`creater_time` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',`edit_time` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '编辑时间',`states` int(11) unsigned NOT NULL DEFAULT '1' COMMENT '状态(1:启用,2:禁用;3:删除)',PRIMARY KEY (`id`) USING BTREE,UNIQUE KEY `id` (`id`) USING HASH,KEY `masters_key` (`masters_key`) USING HASH) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='%v'", formName, notes) err = sqlDb.Exec(sqlCreateTable).Error } } return }