Browse Source

代码生成下载

yxh 5 years ago
parent
commit
4fbecae513

+ 116 - 10
app/controller/admin/gen_table.go

@@ -5,13 +5,17 @@ import (
 	"gfast/app/service/admin/gen_service"
 	"gfast/app/service/admin/user_service"
 	"gfast/library/response"
+	"github.com/gogf/gf/encoding/gcompress"
 	"github.com/gogf/gf/encoding/gjson"
+	"github.com/gogf/gf/errors/gerror"
 	"github.com/gogf/gf/frame/g"
 	"github.com/gogf/gf/net/ghttp"
+	"github.com/gogf/gf/os/gfile"
 	"github.com/gogf/gf/os/gview"
 	"github.com/gogf/gf/text/gregex"
 	"github.com/gogf/gf/text/gstr"
 	"github.com/gogf/gf/util/gconv"
+	"github.com/gogf/gf/util/grand"
 	"github.com/gogf/gf/util/gvalid"
 	"strings"
 )
@@ -182,15 +186,101 @@ func (c *Gen) Preview(r *ghttp.Request) {
 	if tableId == 0 {
 		response.FailJson(true, r, "参数错误")
 	}
-	entity, err := gen_service.SelectRecordById(tableId)
+	data, _, err := c.genData(tableId)
 	if err != nil {
 		response.FailJson(true, r, err.Error())
 	}
+	response.SusJson(true, r, "ok", data)
+}
+
+//下载生成的代码
+func (c *Gen) BatchGenCode(r *ghttp.Request) {
+	tableIds := r.GetString("tables")
+	if tableIds == "" {
+		response.FailJson(true, r, "请选择要生成的表")
+	}
+	ids := gstr.Split(tableIds, ",")
+	dataFilePath := g.Cfg().GetString("adminInfo.dataDir")
+	dataFileRange := grand.S(10)
+	//生成文件
+	for _, id := range ids {
+		data, entity, err := c.genData(gconv.Int64(id))
+		if err != nil {
+			response.FailJson(true, r, err.Error())
+		}
+		pathMap := c.getPath(entity)
+		for key, val := range data {
+			switch key {
+			case "vm/go/" + entity.BusinessName + "_controller.go.vm":
+				err = gfile.PutContents(dataFilePath+"/gen/"+dataFileRange+"/go/"+pathMap["controller"], val)
+				if err != nil {
+					response.FailJson(true, r, err.Error())
+				}
+			case "vm/go/" + entity.BusinessName + "_service.go.vm":
+				err = gfile.PutContents(dataFilePath+"/gen/"+dataFileRange+"/go/"+pathMap["service"], val)
+				if err != nil {
+					response.FailJson(true, r, err.Error())
+				}
+			case "vm/go/" + entity.BusinessName + "_model.go.vm":
+				err = gfile.PutContents(dataFilePath+"/gen/"+dataFileRange+"/go/"+pathMap["model"], val)
+				if err != nil {
+					response.FailJson(true, r, err.Error())
+				}
+			case "vm/html/" + entity.BusinessName + "_api.js.vm":
+				err = gfile.PutContents(dataFilePath+"/gen/"+dataFileRange+"/vue/"+pathMap["api"], val)
+				if err != nil {
+					response.FailJson(true, r, err.Error())
+				}
+			case "vm/html/" + entity.BusinessName + "_vue.js.vm":
+				err = gfile.PutContents(dataFilePath+"/gen/"+dataFileRange+"/vue/"+pathMap["vue"], val)
+				if err != nil {
+					response.FailJson(true, r, err.Error())
+				}
+			}
+		}
+	}
+	//打包
+	err := gcompress.ZipPathWriter(dataFilePath+"/gen/"+dataFileRange, r.Response.Writer)
+	if err != nil {
+		response.FailJson(true, r, err.Error())
+	}
+	//删除生成的文件
+	gfile.Remove(dataFilePath + "/gen/" + dataFileRange)
+	//设置下载文件名
+	r.Response.Header().Set("Content-Length", gconv.String(r.Response.BufferLength()))
+	r.Response.Header().Set("Content-Type", "application/force-download")
+	r.Response.Header().Set("Accept-Ranges", "bytes")
+	r.Response.Header().Set("Content-Disposition", "attachment; filename=gfast.zip")
+	r.Response.Buffer()
+}
+
+//获取生成文件的目录
+func (c *Gen) getPath(entity *gen_table.EntityExtend) g.MapStrStr {
+	controller := "app/controller/" + entity.ModuleName + "/" + entity.ClassName + ".go"
+	service := "app/service/" + entity.ModuleName + "/" + entity.BusinessName + "/" + entity.ClassName + ".go"
+	model := "app/model/" + entity.ModuleName + "/" + entity.BusinessName + "/" + entity.ClassName + ".go"
+	vue := "views/" + entity.ModuleName + "/" + entity.BusinessName + "/index.vue"
+	api := "api/" + entity.ModuleName + "/" + entity.BusinessName + ".js"
+	return g.MapStrStr{
+		"controller": controller,
+		"service":    service,
+		"model":      model,
+		"vue":        vue,
+		"api":        api,
+	}
+}
+
+//获取生成数据
+func (c *Gen) genData(tableId int64) (data g.MapStrStr, entity *gen_table.EntityExtend, err error) {
+	entity, err = gen_service.SelectRecordById(tableId)
+	if err != nil {
+		return
+	}
 	if entity == nil {
-		response.FailJson(true, r, "表格数据不存在")
+		err = gerror.New("表格数据不存在")
+		return
 	}
 	gen_service.SetPkColumn(entity, entity.Columns)
-
 	controllerKey := "vm/go/" + entity.BusinessName + "_controller.go.vm"
 	controllerValue := ""
 	serviceKey := "vm/go/" + entity.BusinessName + "_service.go.vm"
@@ -220,31 +310,47 @@ func (c *Gen) Preview(r *ghttp.Request) {
 	if entity.TplCategory == "tree" {
 		options = gjson.New(entity.Options).ToMap()
 	}
-	if tmpController, err := view.Parse("vm/go/"+entity.TplCategory+"/controller.template", g.Map{"table": entity}); err == nil {
+	var tmpController string
+	if tmpController, err = view.Parse("vm/go/"+entity.TplCategory+"/controller.template", g.Map{"table": entity}); err == nil {
 		controllerValue = tmpController
+	} else {
+		return
 	}
-	if tmpService, err := view.Parse("vm/go/"+entity.TplCategory+"/service.template", g.Map{"table": entity, "options": options}); err == nil {
+	var tmpService string
+	if tmpService, err = view.Parse("vm/go/"+entity.TplCategory+"/service.template", g.Map{"table": entity, "options": options}); err == nil {
 		serviceValue = tmpService
+	} else {
+		return
 	}
-	if tmpModel, err := view.Parse("vm/go/"+entity.TplCategory+"/model.template", g.Map{"table": entity}); err == nil {
+	var tmpModel string
+	if tmpModel, err = view.Parse("vm/go/"+entity.TplCategory+"/model.template", g.Map{"table": entity}); err == nil {
 		modelValue = tmpModel
 		modelValue, err = c.trimBreak(modelValue)
+	} else {
+		return
 	}
-	if tmpJs, err := view.Parse("vm/html/js.template", g.Map{"table": entity}); err == nil {
+	var tmpJs string
+	if tmpJs, err = view.Parse("vm/html/js.template", g.Map{"table": entity}); err == nil {
 		apiJsValue = tmpJs
+	} else {
+		return
 	}
-	if tmpVue, err := view.Parse("vm/html/vue_"+entity.TplCategory+".template", g.Map{"table": entity, "options": options}); err == nil {
+	var tmpVue string
+	if tmpVue, err = view.Parse("vm/html/vue_"+entity.TplCategory+".template", g.Map{"table": entity, "options": options}); err == nil {
 		vueValue = tmpVue
 		vueValue, err = c.trimBreak(vueValue)
+	} else {
+		return
 	}
 
-	response.SusJson(true, r, "ok", g.Map{
+	data = g.MapStrStr{
 		modelKey:      modelValue,
 		serviceKey:    serviceValue,
 		controllerKey: controllerValue,
 		apiJsKey:      apiJsValue,
 		vueKey:        vueValue,
-	})
+	}
+	return
 }
 
 //剔除多余的换行

+ 1 - 0
app/service/admin/model_service/field.go

@@ -55,6 +55,7 @@ func SelectFieldsAll(req *model_fields.SelectPageReq) (list []*model_fields.Fiel
 		fInfo.FieldTitle = field.FieldTitle
 		fInfo.FieldType = field.FieldType
 		fInfo.FieldRules = field.FieldRules
+		fInfo.FieldDefault = field.FieldDefault
 		if gstr.ContainsI(modelInfo.SearchList, field.FieldName) {
 			//列表查询
 			fInfo.SearchList = "1"

+ 3 - 0
app/service/admin/model_service/info.go

@@ -188,6 +188,9 @@ func CreateModel(modelId int64) error {
 				}
 				SqlFields.Append(fmt.Sprintf("`%s` TINYINT UNSIGNED NOT NULL DEFAULT %s COMMENT '%s'",
 					fi.FieldName, fi.FieldDefault, fi.FieldTitle))
+			//部门选择器
+			case "DepartmentSelector":
+				SqlFields.Append(fmt.Sprintf("`%s` VARCHAR(300) %s DEFAULT '' COMMENT '%s'", fi.FieldName, fi.FieldDefault, fi.FieldTitle))
 			default:
 				return gerror.New("不能识别字段类型")
 			}

+ 6 - 1
app/service/common/com_model_service/model.go

@@ -48,7 +48,12 @@ func GetModelRuleByModelId(r *ghttp.Request, modelId int64, masterId int64) (rul
 	//获取可编辑字段
 	fieldEdit := garray.NewStrArrayFrom(gstr.Split(modelInfo.ModelEdit, ","))
 	for _, field := range modelFields {
-		rule := new(model_fields.FieldRule)
+		rule := &model_fields.FieldRule{
+			FOptions:  g.List{},
+			FAttr:     g.Map{},
+			FProps:    g.Map{},
+			FValidate: make([]model_fields.Validate, 0),
+		}
 		fAttr := g.Map{}
 		//主键跳过不在表单显示
 		if field.FieldName == modelInfo.ModelPk {