4. 代码生成

4.1 第一步创建代码模版:使用的是golang的模版格式

4.1.1 查询页面

4.1.2 新增页面

4.1.3 预览页面

4.1.4 内置的方法

具体内容请看代码

t := stdtpl.Must(stdtpl.New(tpl.Name).Funcs(stdtpl.FuncMap{
		"GenStructField":              GenStructField,
		"GenClassField":               GenClassField,
		"LowerSnakeCase":              LowerSnakeCase,
		"ToUpper":                     ToUpper,
		"LcFirst":                     LcFirst,
		"ToLower":                     strings.ToLower,
		"Split":                       strings.Split,
		"Join":                        strings.Join,
		"GetDefaultValue":             GetDefaultValue,
		"GenClassDefaultValue":        GenClassDefaultValue,
		"GenQueryCond":                GenQueryCond,
		"GenQueryStructField":         GenQueryStructField,
		"RemoveLastChar":              RemoveLastChar,
		"GenCreateSql":                GenCreateSql,
		"GenCreateColumnSql":          GenCreateColumnSql,
		"TableName":                   curdmodel.NamingStrategy.TableName,
		"CamelName2":                  CamelName2,
		"CamelName":                   CamelName,
		"GenPBMessageProperty":        GenPBMessageProperty,
		"GenPBQueryCond":              GenPBQueryCond,
		"GenPBToStrcut":               GenPBToStrcut,
		"GenStrcutToPB":               GenStrcutToPB,
		"GenDeleteChildren":           GenDeleteChildren,
		"GenDeleteChildrenByParentID": GenDeleteChildrenByParentID,
		"GenSwagQueryParam":           GenSwagQueryParam,
		"GetTemplateById":             GetTemplateById,
		"GetMetadataById":             GetMetadataById,
		"GetMetadataByName":           GetMetadataByName,
		"ConvertTSType":               ConvertTSType,
		"GenCreateIndexsql":           GenCreateIndexsql,
		"GenCreateUniqueIndexsql":     GenCreateUniqueIndexsql,
		"JsonMarshal":                 curdmodel.ObjectToJsonString,
		"JsonUnmarshal":               curdmodel.JsonToStringArray,
		"GenPageConfig":               GenPageConfig,
		"RecursiveGetRefMetadatas":    RecursiveGetRefMetadatas,
		"RecursiveGetRefMetadatas2":   RecursiveGetRefMetadatas2,
		"GenMenuConfig":               GenMenuConfig,
	}).Parse(tpl.Content))

4.1.5 在模版中可以获取到的上下文数据

具体内容请看代码

type GenContext struct {
	Metadata *curdmodel.Metadata
	Service  *curdmodel.Service
	CodeFile *curdmodel.CodeFile
	Template *curdmodel.Template
	Config   Config
}

4.1.6 例子

// Import{{$.Metadata.Name}}
// @Summary 导入
// @Description 导入
// @Tags {{$.Metadata.DisplayName}}管理
// @Accept  mpfd
// @Produce  json
// @Param authorization header string true "Bearer+空格+Token"
// @Param files formData file true "要上传的文件"
// @Success 200 {object} apipb.CommonResponse
// @Router /api{{ if ne $.Service.Package "" }}/{{ToLower $.Service.Package}}{{end}}/{{ToLower $.Service.Name}}/{{ToLower $.Metadata.Name}}/import [post]
func Import{{$.Metadata.Name}}(c *gin.Context) {
	resp := &apipb.Query{{$.Metadata.Name}}Response{
		Code: apipb.Code_Success,
	}
	//从{{$.Metadata.DisplayName}}中读取文件
	file, fileHeader, err := c.Request.FormFile("files")
	if err != nil {
		fmt.Println(err)
		resp.Code = apipb.Code_BadRequest
		resp.Message = err.Error()
		c.JSON(http.StatusBadRequest, resp)
		return
	}
	//defer 结束时关闭文件
	defer file.Close()
	fmt.Println("filename: " + fileHeader.Filename)
	buf, err := ioutil.ReadAll(file)
	if err != nil {
		fmt.Println(err)
		resp.Code = apipb.Code_BadRequest
		resp.Message = err.Error()
		c.JSON(http.StatusBadRequest, resp)
		return
	}

	var list []*apipb.{{$.Metadata.Name}}Info
	err = json.Unmarshal(buf, &list)
	if err != nil {
		fmt.Println(err)
		resp.Code = apipb.Code_BadRequest
		resp.Message = err.Error()
		c.JSON(http.StatusBadRequest, resp)
		return
	}
	successCount := 0
	failCount := 0
	for _, f := range list {
		err = model.Update{{$.Metadata.Name}}All(model.PBTo{{$.Metadata.Name}}(f))
		if err == gorm.ErrRecordNotFound {
			_, err = model.Create{{$.Metadata.Name}}(model.PBTo{{$.Metadata.Name}}(f))
		}
		if err != nil {
			failCount++
			fmt.Println(err)
		} else {
			successCount++
		}
	}
	resp.Message = fmt.Sprintf("导入成功数量:%d,导入失败数量:%d", successCount, failCount)
	c.JSON(http.StatusOK, resp)
}
//删除子表
{{GenDeleteChildren $.Metadata }}
func Update{{$.Metadata.Name}}(m *{{$.Metadata.Name}}) error {
	return dbClient.DB().Transaction(func(tx *gorm.DB) error {
		old{{$.Metadata.Name}} := &{{$.Metadata.Name}}{}
		err := tx{{- range $.Metadata.Preloads}}.Preload("{{.}}"){{- end}}.Preload(clause.Associations).Where("id = ?", m.ID).First(old{{$.Metadata.Name}}).Error
		if err != nil {
			return err
		}

{{- range $.Metadata.MetadataFields }}{{ if ne .RefMetadata "" }}{{ if not .DotNotGen }}
		err = Delete{{CamelName .Name}}(tx, old{{$.Metadata.Name}}, m)
		if err != nil {
			return err
		}
{{ end }}{{ end }}{{- end }}
		duplication, err := dbClient.UpdateWithCheckDuplicationAndOmit(tx, m,true, []string{"created_at"}, "id <> ?  and {{$.Metadata.UniqueFields}}", m.ID, {{$.Metadata.Fields}})
		if err != nil {
			return err
		}
		if duplication {
			return errors.New("存在相同{{$.Metadata.DisplayName}}")
		}

		return nil
	})
}

4.2 第二步创建文件代码模版

4.2.1 查询

4.2.2 新增

4.2.3 预览

4.3 第三步创建功能代码模版

4.3.1 查询

4.3.2 新增

4.3.3 预览

4.4 第四步创建服务

4.4.1 查询

4.4.2 新增

4.4.3 预览