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
})
}