gen.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655
  1. package tools
  2. import (
  3. "IotAdmin/app/system/models"
  4. "IotAdmin/app/system/service"
  5. "IotAdmin/common/global"
  6. "bytes"
  7. "fmt"
  8. "strconv"
  9. "strings"
  10. "text/template"
  11. "time"
  12. "IotAdmin/core/sdk/api"
  13. "IotAdmin/core/sdk/config"
  14. "IotAdmin/core/sdk/pkg"
  15. "github.com/gin-gonic/gin"
  16. "gorm.io/gorm"
  17. "IotAdmin/app/other/models/tools"
  18. )
  19. type Gen struct {
  20. api.Api
  21. }
  22. // Preview 生成预览
  23. // @Summary 生成预览
  24. // @Description 生成预览
  25. // @Tags 系統接口 / 生成工具 / 生成代码
  26. // @Param tableId path string false "tableId / 表Id"
  27. // @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
  28. // @Router /api/sys/gen-preview/{tableId} [get]
  29. func (e Gen) Preview(c *gin.Context) {
  30. e.Context = c
  31. log := e.GetLogger()
  32. table := tools.SysTables{}
  33. id, err := pkg.StringToInt(c.Param("tableId"))
  34. if err != nil {
  35. log.Error(err)
  36. e.Error(500, err, fmt.Sprintf("tableId接收失败!错误详情:%s", err.Error()))
  37. return
  38. }
  39. table.TableId = id
  40. tModel, err := template.ParseFiles("template/v4/model.go.template")
  41. if err != nil {
  42. log.Error(err)
  43. e.Error(500, err, fmt.Sprintf("model模版读取失败!错误详情:%s", err.Error()))
  44. return
  45. }
  46. tApis, err := template.ParseFiles("template/v4/no_actions/apis.go.template")
  47. if err != nil {
  48. log.Error(err)
  49. e.Error(500, err, fmt.Sprintf("api模版读取失败!错误详情:%s", err.Error()))
  50. return
  51. }
  52. tVueApi, err := template.ParseFiles("template/v4/vue-api.go.template")
  53. if err != nil {
  54. log.Error(err)
  55. e.Error(500, err, fmt.Sprintf("vue-api-ts模版读取失败!错误详情:%s", err.Error()))
  56. return
  57. }
  58. tVueView, err := template.ParseFiles("template/v4/vue-view.go.template")
  59. if err != nil {
  60. log.Error(err)
  61. e.Error(500, err, fmt.Sprintf("vue-view模版读取失败!错误详情:%s", err.Error()))
  62. return
  63. }
  64. tRouter, err := template.ParseFiles("template/v4/no_actions/router_check_role.go.template")
  65. if err != nil {
  66. log.Error(err)
  67. e.Error(500, err, fmt.Sprintf("路由模版读取失败!错误详情:%s", err.Error()))
  68. return
  69. }
  70. tDto, err := template.ParseFiles("template/v4/dto.go.template")
  71. if err != nil {
  72. log.Error(err)
  73. e.Error(500, err, fmt.Sprintf("dto模版读取失败!错误详情:%s", err.Error()))
  74. return
  75. }
  76. tService, err := template.ParseFiles("template/v4/no_actions/service.go.template")
  77. if err != nil {
  78. log.Error(err)
  79. e.Error(500, err, fmt.Sprintf("service模版读取失败!错误详情:%s", err.Error()))
  80. return
  81. }
  82. db, err := pkg.GetOrm(c)
  83. if err != nil {
  84. log.Errorf("get db connection error, %s", err.Error())
  85. e.Error(500, err, fmt.Sprintf("数据库链接获取失败!错误详情:%s", err.Error()))
  86. return
  87. }
  88. tab, _ := table.Get(db, false)
  89. var (
  90. bVueApi bytes.Buffer
  91. bVueView bytes.Buffer
  92. bModel bytes.Buffer
  93. bApis bytes.Buffer
  94. bRouter bytes.Buffer
  95. bDto bytes.Buffer
  96. bService bytes.Buffer
  97. )
  98. err = tModel.Execute(&bModel, tab)
  99. err = tApis.Execute(&bApis, tab)
  100. err = tVueApi.Execute(&bVueApi, tab)
  101. err = tVueView.Execute(&bVueView, tab)
  102. err = tRouter.Execute(&bRouter, tab)
  103. err = tDto.Execute(&bDto, tab)
  104. err = tService.Execute(&bService, tab)
  105. mp := make(map[string]interface{})
  106. mp["template/vue-api.go.template"] = bVueApi.String()
  107. mp["template/vue-view.go.template"] = bVueView.String()
  108. mp["template/model.go.template"] = bModel.String()
  109. mp["template/api.go.template"] = bApis.String()
  110. mp["template/router.go.template"] = bRouter.String()
  111. mp["template/dto.go.template"] = bDto.String()
  112. mp["template/service.go.template"] = bService.String()
  113. e.OK(mp, "")
  114. }
  115. // GenCode 生成代码
  116. // @Summary 生成代码
  117. // @Description 生成代码
  118. // @Tags 系統接口 / 生成工具 / 生成代码
  119. // @Param tableId path string false "tableId / 表Id"
  120. // @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
  121. // @Router /api/sys/gen-code/{tableId} [get]
  122. func (e Gen) GenCode(c *gin.Context) {
  123. e.Context = c
  124. log := e.GetLogger()
  125. table := tools.SysTables{}
  126. id, err := pkg.StringToInt(c.Param("tableId"))
  127. if err != nil {
  128. log.Error(err)
  129. e.Error(500, err, fmt.Sprintf("tableId参数接收失败!错误详情:%s", err.Error()))
  130. return
  131. }
  132. db, err := pkg.GetOrm(c)
  133. if err != nil {
  134. log.Errorf("get db connection error, %s", err.Error())
  135. e.Error(500, err, fmt.Sprintf("数据库链接获取失败!错误详情:%s", err.Error()))
  136. return
  137. }
  138. table.TableId = id
  139. tab, _ := table.Get(db, false)
  140. e.NOActionsGen(c, tab)
  141. e.OK("", "Code generated successfully!")
  142. }
  143. // GenApiToFile 生成 Menu 迁移文件 (弃用)
  144. // @Summary 生成 Menu 迁移文件
  145. // @Description 生成 Menu 迁移文件
  146. // @Tags 系統接口 / 生成工具 / 生成代码
  147. // @Param tableId path string false "tableId / 表Id"
  148. // @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
  149. // @Router /api/sys/gen-api-to-file/{tableId} [get]
  150. func (e Gen) GenApiToFile(c *gin.Context) {
  151. e.Context = c
  152. log := e.GetLogger()
  153. table := tools.SysTables{}
  154. id, err := pkg.StringToInt(c.Param("tableId"))
  155. if err != nil {
  156. log.Error(err)
  157. e.Error(500, err, fmt.Sprintf("tableId参数获取失败!错误详情:%s", err.Error()))
  158. return
  159. }
  160. db, err := pkg.GetOrm(c)
  161. if err != nil {
  162. log.Errorf("get db connection error, %s", err.Error())
  163. e.Error(500, err, fmt.Sprintf("数据库链接获取失败!错误详情:%s", err.Error()))
  164. return
  165. }
  166. table.TableId = id
  167. tab, _ := table.Get(db, false)
  168. e.genApiToFile(c, tab)
  169. e.OK("", "Code generated successfully!")
  170. }
  171. func (e Gen) NOActionsGen(c *gin.Context, tab tools.SysTables) {
  172. e.Context = c
  173. log := e.GetLogger()
  174. tab.MLTBName = strings.Replace(tab.TBName, "_", "-", -1)
  175. basePath := "template/v4/"
  176. routerFile := basePath + "no_actions/router_check_role.go.template"
  177. if tab.IsAuth == 2 {
  178. routerFile = basePath + "no_actions/router_no_check_role.go.template"
  179. }
  180. model, err := template.ParseFiles(basePath + "model.go.template")
  181. if err != nil {
  182. log.Error(err)
  183. e.Error(500, err, fmt.Sprintf("model模版读取失败!错误详情:%s", err.Error()))
  184. return
  185. }
  186. apis, err := template.ParseFiles(basePath + "no_actions/apis.go.template")
  187. if err != nil {
  188. log.Error(err)
  189. e.Error(500, err, fmt.Sprintf("api模版读取失败!错误详情:%s", err.Error()))
  190. return
  191. }
  192. router, err := template.ParseFiles(routerFile)
  193. if err != nil {
  194. log.Error(err)
  195. e.Error(500, err, fmt.Sprintf("路由模版失败!错误详情:%s", err.Error()))
  196. return
  197. }
  198. sDto, err := template.ParseFiles(basePath + "dto.go.template")
  199. if err != nil {
  200. log.Error(err)
  201. e.Error(500, err, fmt.Sprintf("dto模版解析失败失败!错误详情:%s", err.Error()))
  202. return
  203. }
  204. sService, err := template.ParseFiles(basePath + "no_actions/service.go.template")
  205. if err != nil {
  206. log.Error(err)
  207. e.Error(500, err, fmt.Sprintf("service模版失败!错误详情:%s", err.Error()))
  208. return
  209. }
  210. vueApi, err := template.ParseFiles(basePath + "vue-api.go.template")
  211. if err != nil {
  212. log.Error(err)
  213. e.Error(500, err, fmt.Sprintf("vue-api模版解析失败!错误详情:%s", err.Error()))
  214. return
  215. }
  216. vueView, err := template.ParseFiles(basePath + "vue-view.go.template")
  217. if err != nil {
  218. log.Error(err)
  219. e.Error(500, err, fmt.Sprintf("vue-view模版解析失败!错误详情:%s", err.Error()))
  220. return
  221. }
  222. _ = pkg.PathCreate("./app/" + tab.PackageName + "/apis/")
  223. _ = pkg.PathCreate("./app/" + tab.PackageName + "/models/")
  224. _ = pkg.PathCreate("./app/" + tab.PackageName + "/router/")
  225. _ = pkg.PathCreate("./app/" + tab.PackageName + "/service/dto/")
  226. _ = pkg.PathCreate(config.GenConfig.FrontPath + "/api/" + tab.PackageName + "/")
  227. err = pkg.PathCreate(config.GenConfig.FrontPath + "/views/" + tab.PackageName + "/" + tab.BusinessName + "/")
  228. if err != nil {
  229. log.Error(err)
  230. e.Error(500, err, fmt.Sprintf("views目录创建失败!错误详情:%s", err.Error()))
  231. return
  232. }
  233. var bModel bytes.Buffer
  234. err = model.Execute(&bModel, tab)
  235. var bApis bytes.Buffer
  236. err = apis.Execute(&bApis, tab)
  237. var bRouter bytes.Buffer
  238. err = router.Execute(&bRouter, tab)
  239. var bDto bytes.Buffer
  240. err = sDto.Execute(&bDto, tab)
  241. var bService bytes.Buffer
  242. var bVueApi bytes.Buffer
  243. err = vueApi.Execute(&bVueApi, tab)
  244. var bVueView bytes.Buffer
  245. err = vueView.Execute(&bVueView, tab)
  246. err = sService.Execute(&bService, tab)
  247. pkg.FileCreate(bModel, "./app/"+tab.PackageName+"/models/"+tab.BusinessName+".go")
  248. pkg.FileCreate(bApis, "./app/"+tab.PackageName+"/apis/"+tab.BusinessName+".go")
  249. pkg.FileCreate(bRouter, "./app/"+tab.PackageName+"/router/"+tab.BusinessName+".go")
  250. pkg.FileCreate(bDto, "./app/"+tab.PackageName+"/service/dto/"+tab.BusinessName+".go")
  251. pkg.FileCreate(bService, "./app/"+tab.PackageName+"/service/"+tab.BusinessName+".go")
  252. pkg.FileCreate(bVueApi, config.GenConfig.FrontPath+"/api/"+tab.PackageName+"/_"+tab.BusinessName+".ts")
  253. pkg.FileCreate(bVueView, config.GenConfig.FrontPath+"/views/"+tab.PackageName+"/"+tab.BusinessName+"/index.vue")
  254. }
  255. func (e Gen) genApiToFile(c *gin.Context, tab tools.SysTables) {
  256. err := e.MakeContext(c).
  257. MakeOrm().
  258. Errors
  259. if err != nil {
  260. e.Logger.Error(err)
  261. e.Error(500, err, err.Error())
  262. return
  263. }
  264. basePath := "template/"
  265. t1, err := template.ParseFiles(basePath + "api_migrate.template")
  266. if err != nil {
  267. e.Logger.Error(err)
  268. e.Error(500, err, fmt.Sprintf("数据迁移模版解析失败!错误详情:%s", err.Error()))
  269. return
  270. }
  271. i := strconv.FormatInt(time.Now().UnixNano()/1e6, 10)
  272. var b1 bytes.Buffer
  273. err = t1.Execute(&b1, struct {
  274. tools.SysTables
  275. GenerateTime string
  276. }{tab, i})
  277. pkg.FileCreate(b1, "./cmd/migrate/migration/version-local/"+i+"_migrate.go")
  278. }
  279. // GenMenuAndApi 生成菜单API到DB
  280. // @Summary 生成菜单及接口
  281. // @Description 生成菜单API到DB
  282. // @Tags 系統接口 / 生成工具 / 生成代码
  283. // @Param tableId path string false "tableId / 表Id"
  284. // @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
  285. // @Router /api/sys/gen-menu-api/{tableId} [get]
  286. func (e Gen) GenMenuAndApi(c *gin.Context) {
  287. s := service.SysMenuService{}
  288. err := e.MakeContext(c).
  289. MakeOrm().
  290. MakeService(&s.Service).
  291. Errors
  292. if err != nil {
  293. e.Logger.Error(err)
  294. e.Error(500, err, err.Error())
  295. return
  296. }
  297. table := tools.SysTables{}
  298. id, err := pkg.StringToInt(c.Param("tableId"))
  299. if err != nil {
  300. e.Logger.Error(err)
  301. e.Error(500, err, fmt.Sprintf("tableId参数解析失败!错误详情:%s", err.Error()))
  302. return
  303. }
  304. table.TableId = id
  305. tab, _ := table.Get(e.Orm, true)
  306. tab.MLTBName = strings.Replace(tab.TBName, "_", "-", -1)
  307. tx := e.Orm.Debug().Begin()
  308. defer func() {
  309. if err != nil {
  310. tx.Rollback()
  311. } else {
  312. tx.Commit()
  313. }
  314. }()
  315. menu, err := e.genDir(tab)
  316. if err != nil {
  317. e.Logger.Error(err)
  318. e.Error(500, err, fmt.Sprintf("生成菜单失败!错误详情:%s", err.Error()))
  319. return
  320. }
  321. aList, aDetail := e.GenQueryApis(tab)
  322. cMenu, err := e.genMenu(tab, menu.MenuId, aList, aDetail)
  323. if err != nil {
  324. e.Logger.Error(err)
  325. e.Error(500, err, fmt.Sprintf("生成菜单失败!错误详情:%s", err.Error()))
  326. return
  327. }
  328. err = e.genListBtn(tab, cMenu.MenuId, aList, aDetail)
  329. if err != nil {
  330. e.Logger.Error(err)
  331. e.Error(500, err, fmt.Sprintf("生成菜单失败!错误详情:%s", err.Error()))
  332. return
  333. }
  334. err = e.genCreateBtn(tab, cMenu.MenuId)
  335. if err != nil {
  336. e.Logger.Error(err)
  337. e.Error(500, err, fmt.Sprintf("生成菜单失败!错误详情:%s", err.Error()))
  338. return
  339. }
  340. err = e.genUpdateBtn(tab, cMenu.MenuId)
  341. if err != nil {
  342. e.Logger.Error(err)
  343. e.Error(500, err, fmt.Sprintf("生成菜单失败!错误详情:%s", err.Error()))
  344. return
  345. }
  346. err = e.genDeleteBtn(tab, cMenu.MenuId)
  347. if err != nil {
  348. e.Logger.Error(err)
  349. e.Error(500, err, fmt.Sprintf("生成菜单失败!错误详情:%s", err.Error()))
  350. return
  351. }
  352. e.OK("", "数据生成成功!")
  353. }
  354. func (e Gen) genDir(tab tools.SysTables) (*models.SysMenu, error) {
  355. var err error
  356. menu := &models.SysMenu{}
  357. e.Orm.Model(menu).First(menu, models.SysMenu{Path: tab.PackageName, MenuType: global.Directory})
  358. if menu.MenuId == 0 {
  359. menu = &models.SysMenu{}
  360. menu.MenuName = tab.TableComment
  361. menu.Icon = "pass"
  362. menu.Path = tab.PackageName
  363. menu.MenuType = global.Directory
  364. menu.Action = ""
  365. menu.ParentId = 0
  366. menu.NoCache = false
  367. menu.Component = "Layout"
  368. menu.Sort = 0
  369. menu.IsHide = false
  370. menu.IsFrame = false
  371. menu.CreateBy = 1
  372. e.Orm.Model(menu).Save(menu)
  373. s := &service.SysMenuService{}
  374. err = s.InIitPaths(e.Orm, menu)
  375. }
  376. return menu, err
  377. }
  378. func (e Gen) genMenu(tab tools.SysTables, menuId int, aList models.SysApi, aDetail models.SysApi) (*models.SysMenu, error) {
  379. var err error
  380. CMenu := &models.SysMenu{}
  381. e.Orm.Model(CMenu).Preload("SysApi").First(CMenu, models.SysMenu{Path: tab.BusinessName, MenuType: global.Menu, ParentId: menuId})
  382. if CMenu.MenuId != 0 {
  383. err := e.Orm.Model(CMenu).Association("SysApi").Delete(CMenu.SysApi)
  384. if err != nil {
  385. return nil, err
  386. }
  387. }
  388. CMenu.MenuName = tab.TableComment
  389. CMenu.Icon = "app-indicator"
  390. CMenu.Path = tab.BusinessName
  391. CMenu.MenuType = global.Menu
  392. CMenu.Action = ""
  393. CMenu.Permission = tab.PackageName + ":" + tab.BusinessName
  394. CMenu.ParentId = menuId
  395. CMenu.NoCache = false
  396. CMenu.Component = "/" + tab.PackageName + "/" + tab.BusinessName + "/index"
  397. CMenu.Sort = 1
  398. CMenu.IsHide = false
  399. CMenu.IsFrame = false
  400. CMenu.CreateBy = 1
  401. CMenu.UpdateBy = 1
  402. CMenu.SysApi = []models.SysApi{aList, aDetail}
  403. e.Orm.Model(CMenu).Session(&gorm.Session{FullSaveAssociations: true}).Save(CMenu)
  404. s := &service.SysMenuService{}
  405. err = s.InIitPaths(e.Orm, CMenu)
  406. return CMenu, err
  407. }
  408. func (e Gen) genListBtn(tab tools.SysTables, menuId int, aList models.SysApi, aDetail models.SysApi) error {
  409. MList := &models.SysMenu{}
  410. menuPath := "#"
  411. menuIcon := "eye"
  412. e.Orm.Model(MList).Preload("SysApi").First(MList, models.SysMenu{Path: menuPath, Icon: menuIcon, MenuType: global.Button, ParentId: menuId})
  413. if MList.MenuId != 0 {
  414. err := e.Orm.Model(MList).Association("SysApi").Delete(MList.SysApi)
  415. if err != nil {
  416. return err
  417. }
  418. }
  419. MList.MenuName = "查询" + tab.FunctionName
  420. MList.Icon = menuIcon
  421. MList.Path = menuPath
  422. MList.MenuType = global.Button
  423. MList.Action = ""
  424. MList.Permission = tab.PackageName + ":" + tab.BusinessName + ":query"
  425. MList.ParentId = menuId
  426. MList.NoCache = false
  427. MList.Sort = 1
  428. MList.IsHide = true
  429. MList.IsFrame = false
  430. MList.SysApi = []models.SysApi{aList, aDetail}
  431. MList.CreateBy = 1
  432. MList.UpdateBy = 1
  433. e.Orm.Model(MList).Session(&gorm.Session{FullSaveAssociations: true}).Save(MList)
  434. //if MList.MenuId == 0 {
  435. // e.Orm.Model(MList).Session(&gorm.Session{FullSaveAssociations: true}).Create(MList)
  436. //} else {
  437. // e.Orm.Model(MList).Session(&gorm.Session{FullSaveAssociations: true}).Save(MList)
  438. //}
  439. s := &service.SysMenuService{}
  440. err := s.InIitPaths(e.Orm, MList)
  441. return err
  442. }
  443. func (e Gen) GenQueryApis(tab tools.SysTables) (models.SysApi, models.SysApi) {
  444. AList := models.SysApi{}
  445. handle := "IotAdmin/app/" + tab.PackageName + "/apis.(*" + tab.ClassName + "Api).GetPage-fm"
  446. title := "获取" + tab.FunctionName + "列表"
  447. path := "/api/" + tab.ModuleName
  448. action := "GET"
  449. e.Orm.Model(&AList).Where(models.SysApi{Path: path, Action: action}).Assign(models.SysApi{
  450. Handle: handle,
  451. Title: title,
  452. Type: "BUS",
  453. }).FirstOrCreate(&AList)
  454. ADetail := models.SysApi{}
  455. handle2 := "IotAdmin/app/" + tab.PackageName + "/apis.(*" + tab.ClassName + "Api).Get-fm"
  456. title2 := "获取" + tab.FunctionName + "详情"
  457. path2 := "/api/" + tab.ModuleName + "/:" + tab.PkColumn
  458. action2 := "GET"
  459. e.Orm.Model(&ADetail).Where(models.SysApi{Path: path2, Action: action2}).Assign(models.SysApi{
  460. Handle: handle2,
  461. Title: title2,
  462. Type: "BUS",
  463. }).FirstOrCreate(&ADetail)
  464. return AList, ADetail
  465. }
  466. func (e Gen) genCreateBtn(tab tools.SysTables, menuId int) error {
  467. ACreate := models.SysApi{}
  468. handle := "IotAdmin/app/" + tab.PackageName + "/apis.(*" + tab.ClassName + "Api).Insert-fm"
  469. title := "添加" + tab.FunctionName
  470. path := "/api/" + tab.ModuleName
  471. action := "POST"
  472. e.Orm.Model(&ACreate).Where(models.SysApi{Path: path, Action: action}).Assign(models.SysApi{
  473. Handle: handle,
  474. Title: title,
  475. Type: "BUS",
  476. }).FirstOrCreate(&ACreate)
  477. menuIcon := "plus-square"
  478. menuPath := "#"
  479. MCreate := &models.SysMenu{}
  480. e.Orm.Model(MCreate).Preload("SysApi").First(MCreate, models.SysMenu{Path: menuPath, Icon: menuIcon, MenuType: global.Button, ParentId: menuId})
  481. if MCreate.MenuId != 0 {
  482. err := e.Orm.Model(&MCreate).Association("SysApi").Delete(MCreate.SysApi)
  483. if err != nil {
  484. return err
  485. }
  486. }
  487. MCreate.MenuName = "新增" + tab.FunctionName
  488. MCreate.Icon = menuIcon
  489. MCreate.Path = menuPath
  490. MCreate.MenuType = global.Button
  491. MCreate.Action = ""
  492. MCreate.Permission = tab.PackageName + ":" + tab.BusinessName + ":add"
  493. MCreate.ParentId = menuId
  494. MCreate.NoCache = false
  495. MCreate.Sort = 2
  496. MCreate.BtnClass = "btn btn-light-primary"
  497. MCreate.BtnScript = "handleCreate"
  498. MCreate.IsHide = false
  499. MCreate.IsFrame = false
  500. MCreate.SysApi = []models.SysApi{ACreate}
  501. MCreate.CreateBy = 1
  502. MCreate.UpdateBy = 1
  503. e.Orm.Model(MCreate).Session(&gorm.Session{FullSaveAssociations: true}).Save(MCreate)
  504. //if MCreate.MenuId == 0 {
  505. // e.Orm.Model(MCreate).Session(&gorm.Session{FullSaveAssociations: true}).Create(MCreate)
  506. //} else {
  507. // e.Orm.Model(MCreate).Session(&gorm.Session{FullSaveAssociations: true}).Save(MCreate)
  508. //}
  509. s := &service.SysMenuService{}
  510. err := s.InIitPaths(e.Orm, MCreate)
  511. return err
  512. }
  513. func (e Gen) genUpdateBtn(tab tools.SysTables, menuId int) error {
  514. AUpdate := models.SysApi{}
  515. handle := "IotAdmin/app/" + tab.PackageName + "/apis.(*" + tab.ClassName + "Api).Update-fm"
  516. title := "修改" + tab.FunctionName
  517. path := "/api/" + tab.ModuleName + "/:" + tab.PkColumn
  518. action := "PUT"
  519. e.Orm.Model(&AUpdate).Where(models.SysApi{Path: path, Action: action}).Assign(models.SysApi{
  520. Handle: handle,
  521. Title: title,
  522. Type: "BUS",
  523. }).FirstOrCreate(&AUpdate)
  524. menuIcon := "pencil-square"
  525. menuPath := "#"
  526. MUpdate := &models.SysMenu{}
  527. e.Orm.Debug().Model(MUpdate).Preload("SysApi").First(MUpdate, models.SysMenu{Path: menuPath, Icon: menuIcon, MenuType: global.Button, ParentId: menuId})
  528. if MUpdate.MenuId != 0 {
  529. err := e.Orm.Model(MUpdate).Association("SysApi").Delete(MUpdate.SysApi)
  530. if err != nil {
  531. return err
  532. }
  533. }
  534. MUpdate.MenuName = "修改" + tab.FunctionName
  535. MUpdate.Icon = menuIcon
  536. MUpdate.Path = menuPath
  537. MUpdate.MenuType = global.Button
  538. MUpdate.Action = ""
  539. MUpdate.Permission = tab.PackageName + ":" + tab.BusinessName + ":edit"
  540. MUpdate.ParentId = menuId
  541. MUpdate.NoCache = false
  542. MUpdate.Sort = 3
  543. MUpdate.BtnClass = "btn btn-light-success"
  544. MUpdate.BtnScript = "handleUpdate@1"
  545. MUpdate.IsHide = false
  546. MUpdate.IsFrame = false
  547. MUpdate.SysApi = []models.SysApi{AUpdate}
  548. MUpdate.CreateBy = 1
  549. MUpdate.UpdateBy = 1
  550. e.Orm.Model(MUpdate).Session(&gorm.Session{FullSaveAssociations: true}).Save(MUpdate)
  551. //if MUpdate.MenuId == 0 {
  552. // e.Orm.Model(MUpdate).Session(&gorm.Session{FullSaveAssociations: true}).Create(MUpdate)
  553. //} else {
  554. // e.Orm.Model(MUpdate).Session(&gorm.Session{FullSaveAssociations: true}).Save(MUpdate)
  555. //}
  556. s := &service.SysMenuService{}
  557. err := s.InIitPaths(e.Orm, MUpdate)
  558. return err
  559. }
  560. func (e Gen) genDeleteBtn(tab tools.SysTables, menuId int) error {
  561. ADelete := models.SysApi{}
  562. handle := "IotAdmin/app/" + tab.PackageName + "/apis.(*" + tab.ClassName + "Api).Delete-fm"
  563. title := "删除" + tab.FunctionName
  564. path := "/api/" + tab.ModuleName
  565. action := "DELETE"
  566. e.Orm.Model(&ADelete).Where(models.SysApi{Path: path, Action: action}).Assign(models.SysApi{
  567. Handle: handle,
  568. Title: title,
  569. Type: "BUS",
  570. }).FirstOrCreate(&ADelete)
  571. menuIcon := "dash-square"
  572. menuPath := "#"
  573. MDelete := &models.SysMenu{}
  574. e.Orm.Model(MDelete).Preload("SysApi").First(MDelete, models.SysMenu{Path: menuPath, Icon: menuIcon, MenuType: global.Button, ParentId: menuId})
  575. if MDelete.MenuId != 0 {
  576. err := e.Orm.Model(MDelete).Association("SysApi").Delete(MDelete.SysApi)
  577. if err != nil {
  578. return err
  579. }
  580. }
  581. MDelete.MenuName = "删除" + tab.FunctionName
  582. MDelete.Icon = menuIcon
  583. MDelete.Path = menuPath
  584. MDelete.MenuType = global.Button
  585. MDelete.Action = ""
  586. MDelete.Permission = tab.PackageName + ":" + tab.BusinessName + ":remove"
  587. MDelete.ParentId = menuId
  588. MDelete.NoCache = false
  589. MDelete.Sort = 4
  590. MDelete.BtnClass = "btn btn-light-danger"
  591. MDelete.BtnScript = "handleDelete@0"
  592. MDelete.IsHide = false
  593. MDelete.IsFrame = false
  594. MDelete.SysApi = []models.SysApi{ADelete}
  595. MDelete.CreateBy = 1
  596. MDelete.UpdateBy = 1
  597. e.Orm.Model(MDelete).Session(&gorm.Session{FullSaveAssociations: true}).Save(MDelete)
  598. //if MDelete.MenuId == 0 {
  599. // e.Orm.Model(MDelete).Session(&gorm.Session{FullSaveAssociations: true}).Create(MDelete)
  600. //} else {
  601. // e.Orm.Model(MDelete).Session(&gorm.Session{FullSaveAssociations: true}).Save(MDelete)
  602. //}
  603. s := &service.SysMenuService{}
  604. err := s.InIitPaths(e.Orm, MDelete)
  605. return err
  606. }