gen_table.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. package admin
  2. import (
  3. "gfast/app/model/admin/gen_table"
  4. "gfast/app/service/admin/gen_service"
  5. "gfast/app/service/admin/user_service"
  6. "gfast/library/response"
  7. "github.com/gogf/gf/encoding/gcompress"
  8. "github.com/gogf/gf/encoding/gjson"
  9. "github.com/gogf/gf/errors/gerror"
  10. "github.com/gogf/gf/frame/g"
  11. "github.com/gogf/gf/net/ghttp"
  12. "github.com/gogf/gf/os/gfile"
  13. "github.com/gogf/gf/os/gview"
  14. "github.com/gogf/gf/text/gregex"
  15. "github.com/gogf/gf/text/gstr"
  16. "github.com/gogf/gf/util/gconv"
  17. "github.com/gogf/gf/util/grand"
  18. "github.com/gogf/gf/util/gvalid"
  19. "strings"
  20. )
  21. type Gen struct{}
  22. // @Summary 查询数据库列表
  23. // @Description 查询数据库列表
  24. // @Tags 系统工具
  25. // @Param data body gen_table.SelectPageReq true "data"
  26. // @Success 0 {object} response.Response "{"code": 200, "data": [...]}"
  27. // @Router /system/tools/gen/dataList [get]
  28. // @Security
  29. func (c *Gen) DataList(r *ghttp.Request) {
  30. var req *gen_table.SelectPageReq
  31. //获取参数
  32. if err := r.Parse(&req); err != nil {
  33. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  34. }
  35. total, list, err := gen_service.SelectDbTableList(req)
  36. if err != nil {
  37. response.FailJson(true, r, err.Error())
  38. }
  39. response.SusJson(true, r, "ok", g.Map{
  40. "total": total,
  41. "list": list,
  42. })
  43. }
  44. // @Summary 表列表
  45. // @Description 表列表
  46. // @Tags 系统工具
  47. // @Param data body gen_table.SelectPageReq true "data"
  48. // @Success 0 {object} response.Response "{"code": 200, "data": [...]}"
  49. // @Router /system/tools/gen/tableList [post]
  50. // @Security
  51. func (c *Gen) TableList(r *ghttp.Request) {
  52. var req *gen_table.SelectPageReq
  53. //获取参数
  54. if err := r.Parse(&req); err != nil {
  55. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  56. }
  57. total, list, err := gen_service.SelectListByPage(req)
  58. if err != nil {
  59. response.FailJson(true, r, err.Error())
  60. }
  61. response.SusJson(true, r, "ok", g.Map{
  62. "total": total,
  63. "list": list,
  64. })
  65. }
  66. // @Summary 导入表结构操作
  67. // @Description 导入表结构操作
  68. // @Tags 系统工具
  69. // @Param tables body string true "tables"
  70. // @Success 0 {object} response.Response "{"code": 200, "data": [...]}"
  71. // @Router /system/tools/gen/importTableSave [post]
  72. // @Security
  73. func (c *Gen) ImportTableSave(r *ghttp.Request) {
  74. tables := r.GetString("tables")
  75. if tables == "" {
  76. response.FailJson(true, r, "请选择要导入的表格")
  77. }
  78. user := user_service.GetLoginAdminInfo(r)
  79. operName := user.UserName
  80. tableArr := strings.Split(tables, ",")
  81. tableList, err := gen_service.SelectDbTableListByNames(tableArr)
  82. if err != nil {
  83. response.FailJson(true, r, err.Error())
  84. }
  85. if tableList == nil {
  86. response.FailJson(true, r, "表信息不存在")
  87. }
  88. err = gen_service.ImportGenTable(tableList, operName)
  89. if err != nil {
  90. response.FailJson(true, r, err.Error())
  91. }
  92. response.SusJson(true, r, "导入数据表成功")
  93. }
  94. // @Summary 根据表格ID获取表格字段列表数据
  95. // @Description 根据表格ID获取表格字段列表数据
  96. // @Tags 系统工具
  97. // @Param tableId body integer true "tableId"
  98. // @Success 0 {object} response.Response "{"code": 200, "data": [...]}"
  99. // @Router /system/tools/gen/columnList [post]
  100. // @Security
  101. func (c *Gen) ColumnList(r *ghttp.Request) {
  102. tableId := r.GetInt64("tableId")
  103. if tableId == 0 {
  104. response.FailJson(true, r, "参数错误")
  105. }
  106. list, err := gen_service.SelectGenTableColumnListByTableId(tableId)
  107. if err != nil {
  108. response.FailJson(true, r, err.Error())
  109. }
  110. var tableInfo *gen_table.Entity
  111. var tableMap g.Map
  112. tableInfo, err = gen_service.GetTableInfoByTableId(tableId)
  113. tableMap = gconv.Map(tableInfo)
  114. //如果是树表则设置树表配置
  115. if tableInfo != nil && tableInfo.TplCategory == "tree" {
  116. options := gjson.New(tableInfo.Options)
  117. tableMap["tree_code"] = options.Get("tree_code")
  118. tableMap["tree_parent_code"] = options.Get("tree_parent_code")
  119. tableMap["tree_name"] = options.Get("tree_name")
  120. }
  121. res := g.Map{
  122. "rows": list,
  123. "info": tableMap,
  124. }
  125. response.SusJson(true, r, "ok", res)
  126. }
  127. // @Summary 编辑表格信息
  128. // @Description 编辑表格信息
  129. // @Tags 系统工具
  130. // @Param data body gen_table.EditReq true "data"
  131. // @Success 0 {object} response.Response "{"code": 200, "data": [...]}"
  132. // @Router /system/tools/gen/editSave [post]
  133. // @Security
  134. func (c *Gen) EditSave(r *ghttp.Request) {
  135. var req *gen_table.EditReq
  136. //获取参数
  137. if err := r.Parse(&req); err != nil {
  138. response.FailJson(true, r, err.(*gvalid.Error).FirstString())
  139. }
  140. userInfo := user_service.GetLoginAdminInfo(r)
  141. req.UserName = userInfo.UserName
  142. err := gen_service.SaveEdit(req)
  143. if err != nil {
  144. response.FailJson(true, r, err.Error())
  145. }
  146. response.SusJson(true, r, "设置成功")
  147. }
  148. // @Summary 删除表格数据
  149. // @Description 删除表格数据
  150. // @Tags 系统工具
  151. // @Param ids body integer true "ids[1,2,3...]"
  152. // @Success 0 {object} response.Response "{"code": 200, "data": [...]}"
  153. // @Router /system/tools/gen/delete [delete]
  154. // @Security
  155. func (c *Gen) Delete(r *ghttp.Request) {
  156. ids := r.GetInts("ids")
  157. if len(ids) == 0 {
  158. response.FailJson(true, r, "参数错误")
  159. }
  160. err := gen_service.Delete(ids)
  161. if err != nil {
  162. response.FailJson(true, r, err.Error())
  163. }
  164. response.SusJson(true, r, "删除成功")
  165. }
  166. // @Summary 代码生成预览
  167. // @Description 代码生成预览
  168. // @Tags 系统工具
  169. // @Param tableId body integer true "tableId"
  170. // @Success 0 {object} response.Response "{"code": 200, "data": [...]}"
  171. // @Router /system/tools/gen/preview [post]
  172. // @Security
  173. func (c *Gen) Preview(r *ghttp.Request) {
  174. tableId := r.GetInt64("tableId")
  175. if tableId == 0 {
  176. response.FailJson(true, r, "参数错误")
  177. }
  178. data, _, err := c.genData(tableId)
  179. if err != nil {
  180. response.FailJson(true, r, err.Error())
  181. }
  182. response.SusJson(true, r, "ok", data)
  183. }
  184. //下载生成的代码
  185. func (c *Gen) BatchGenCode(r *ghttp.Request) {
  186. tableIds := r.GetString("tables")
  187. if tableIds == "" {
  188. response.FailJson(true, r, "请选择要生成的表")
  189. }
  190. ids := gstr.Split(tableIds, ",")
  191. dataFilePath := g.Cfg().GetString("adminInfo.dataDir")
  192. dataFileRange := grand.S(10)
  193. //生成文件
  194. for _, id := range ids {
  195. data, entity, err := c.genData(gconv.Int64(id))
  196. if err != nil {
  197. response.FailJson(true, r, err.Error())
  198. }
  199. pathMap := c.getPath(entity)
  200. for key, val := range data {
  201. switch key {
  202. case "vm/go/" + entity.BusinessName + "_controller.go.vm":
  203. err = gfile.PutContents(dataFilePath+"/gen/"+dataFileRange+"/go/"+pathMap["controller"], val)
  204. if err != nil {
  205. response.FailJson(true, r, err.Error())
  206. }
  207. case "vm/go/" + entity.BusinessName + "_service.go.vm":
  208. err = gfile.PutContents(dataFilePath+"/gen/"+dataFileRange+"/go/"+pathMap["service"], val)
  209. if err != nil {
  210. response.FailJson(true, r, err.Error())
  211. }
  212. case "vm/go/" + entity.BusinessName + "_model.go.vm":
  213. err = gfile.PutContents(dataFilePath+"/gen/"+dataFileRange+"/go/"+pathMap["model"], val)
  214. if err != nil {
  215. response.FailJson(true, r, err.Error())
  216. }
  217. case "vm/html/" + entity.BusinessName + "_api.js.vm":
  218. err = gfile.PutContents(dataFilePath+"/gen/"+dataFileRange+"/vue/"+pathMap["api"], val)
  219. if err != nil {
  220. response.FailJson(true, r, err.Error())
  221. }
  222. case "vm/html/" + entity.BusinessName + "_vue.js.vm":
  223. err = gfile.PutContents(dataFilePath+"/gen/"+dataFileRange+"/vue/"+pathMap["vue"], val)
  224. if err != nil {
  225. response.FailJson(true, r, err.Error())
  226. }
  227. }
  228. }
  229. }
  230. //打包
  231. err := gcompress.ZipPathWriter(dataFilePath+"/gen/"+dataFileRange, r.Response.Writer)
  232. if err != nil {
  233. response.FailJson(true, r, err.Error())
  234. }
  235. //删除生成的文件
  236. gfile.Remove(dataFilePath + "/gen/" + dataFileRange)
  237. //设置下载文件名
  238. r.Response.Header().Set("Content-Length", gconv.String(r.Response.BufferLength()))
  239. r.Response.Header().Set("Content-Type", "application/force-download")
  240. r.Response.Header().Set("Accept-Ranges", "bytes")
  241. r.Response.Header().Set("Content-Disposition", "attachment; filename=gfast.zip")
  242. r.Response.Buffer()
  243. }
  244. //获取生成文件的目录
  245. func (c *Gen) getPath(entity *gen_table.EntityExtend) g.MapStrStr {
  246. controller := "app/controller/" + entity.ModuleName + "/" + entity.ClassName + ".go"
  247. service := "app/service/" + entity.ModuleName + "/" + entity.BusinessName + "_service/" + entity.ClassName + ".go"
  248. model := "app/model/" + entity.ModuleName + "/" + entity.BusinessName + "/" + entity.ClassName + ".go"
  249. vue := "views/" + entity.ModuleName + "/" + entity.BusinessName + "/index.vue"
  250. api := "api/" + entity.ModuleName + "/" + entity.BusinessName + ".js"
  251. return g.MapStrStr{
  252. "controller": controller,
  253. "service": service,
  254. "model": model,
  255. "vue": vue,
  256. "api": api,
  257. }
  258. }
  259. //获取生成数据
  260. func (c *Gen) genData(tableId int64) (data g.MapStrStr, entity *gen_table.EntityExtend, err error) {
  261. entity, err = gen_service.SelectRecordById(tableId)
  262. if err != nil {
  263. return
  264. }
  265. if entity == nil {
  266. err = gerror.New("表格数据不存在")
  267. return
  268. }
  269. gen_service.SetPkColumn(entity, entity.Columns)
  270. controllerKey := "vm/go/" + entity.BusinessName + "_controller.go.vm"
  271. controllerValue := ""
  272. serviceKey := "vm/go/" + entity.BusinessName + "_service.go.vm"
  273. serviceValue := ""
  274. modelKey := "vm/go/" + entity.BusinessName + "_model.go.vm"
  275. modelValue := ""
  276. apiJsKey := "vm/html/" + entity.BusinessName + "_api.js.vm"
  277. apiJsValue := ""
  278. vueKey := "vm/html/" + entity.BusinessName + "_vue.js.vm"
  279. vueValue := ""
  280. view := gview.New()
  281. view.BindFuncMap(g.Map{
  282. "UcFirst": func(str string) string {
  283. return gstr.UcFirst(str)
  284. },
  285. "add": func(a, b int) int {
  286. return a + b
  287. },
  288. })
  289. view.SetConfigWithMap(g.Map{
  290. "Paths": []string{"template"},
  291. "Delimiters": []string{"{{", "}}"},
  292. })
  293. //树形菜单选项
  294. var options g.Map
  295. if entity.TplCategory == "tree" {
  296. options = gjson.New(entity.Options).ToMap()
  297. }
  298. var tmpController string
  299. if tmpController, err = view.Parse("vm/go/"+entity.TplCategory+"/controller.template", g.Map{"table": entity}); err == nil {
  300. controllerValue = tmpController
  301. } else {
  302. return
  303. }
  304. var tmpService string
  305. if tmpService, err = view.Parse("vm/go/"+entity.TplCategory+"/service.template", g.Map{"table": entity, "options": options}); err == nil {
  306. serviceValue = tmpService
  307. } else {
  308. return
  309. }
  310. var tmpModel string
  311. if tmpModel, err = view.Parse("vm/go/"+entity.TplCategory+"/model.template", g.Map{"table": entity}); err == nil {
  312. modelValue = tmpModel
  313. modelValue, err = c.trimBreak(modelValue)
  314. } else {
  315. return
  316. }
  317. var tmpJs string
  318. if tmpJs, err = view.Parse("vm/html/js.template", g.Map{"table": entity}); err == nil {
  319. apiJsValue = tmpJs
  320. } else {
  321. return
  322. }
  323. var tmpVue string
  324. if tmpVue, err = view.Parse("vm/html/vue_"+entity.TplCategory+".template", g.Map{"table": entity, "options": options}); err == nil {
  325. vueValue = tmpVue
  326. vueValue, err = c.trimBreak(vueValue)
  327. } else {
  328. return
  329. }
  330. data = g.MapStrStr{
  331. modelKey: modelValue,
  332. serviceKey: serviceValue,
  333. controllerKey: controllerValue,
  334. apiJsKey: apiJsValue,
  335. vueKey: vueValue,
  336. }
  337. return
  338. }
  339. //剔除多余的换行
  340. func (c *Gen) trimBreak(str string) (s string, err error) {
  341. var b []byte
  342. if b, err = gregex.Replace("(([\\s\t]*)\r?\n){2,}", []byte("$2\n"), []byte(str)); err == nil {
  343. s = gconv.String(b)
  344. }
  345. return
  346. }