sys_auto.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. package system
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "go_server/ams_ast"
  5. "go_server/base/core"
  6. "go_server/global"
  7. "go_server/model/common/response"
  8. "go_server/service/base"
  9. "go_server/utils"
  10. "gorm.io/gorm"
  11. )
  12. type AutoService struct {
  13. base.SysCommonService
  14. }
  15. var isOpenAllTable bool = true // 是否开启全量同步
  16. // 仅全量同步模型
  17. func (s *AutoService) ModelAuto(c *gin.Context) {
  18. type AutoCode struct {
  19. TableName string `json:"tableName" example:"表名"`
  20. DbAlias string `json:"dbAlias" example:"业务数据库"`
  21. }
  22. var req AutoCode
  23. var err error
  24. defer func() {
  25. if err != nil {
  26. response.Resp(c, err.Error())
  27. }
  28. }()
  29. err = c.ShouldBindJSON(&req)
  30. if err != nil {
  31. return
  32. }
  33. err = utils.Verify(req, utils.AutoCodeVerify)
  34. if err != nil {
  35. return
  36. }
  37. if req.DbAlias == "" {
  38. response.Resp(c, "请填写别名")
  39. return
  40. }
  41. // 不开放一次生成全库
  42. if !isOpenAllTable && req.TableName == "" {
  43. response.Resp(c, "未开放全库生成")
  44. return
  45. }
  46. err = s.ModelAutoForCmd(req.DbAlias, req.TableName)
  47. if err != nil {
  48. return
  49. }
  50. response.Resp(c)
  51. }
  52. func (s *AutoService) ModelAutoForCmd(alias, tableName string) error {
  53. db, err := global.BizDBByAlias(alias)
  54. if err != nil {
  55. return err
  56. }
  57. dbAlias := alias
  58. dbName := db.Migrator().CurrentDatabase()
  59. tableNames := []string{}
  60. if tableName == "" {
  61. tbs, err := s.GetTables(dbAlias)
  62. if err != nil {
  63. return err
  64. }
  65. for _, tb := range tbs {
  66. tableNames = append(tableNames, tb.TableName)
  67. }
  68. } else {
  69. tableNames = append(tableNames, tableName)
  70. }
  71. for _, tbn := range tableNames {
  72. // 模型构建
  73. core.Log.Infof("模型:%s构建", tbn)
  74. err = ams_ast.BuildModelRegister(dbAlias, dbName, tbn).Initialize(db)
  75. if err != nil {
  76. return err
  77. }
  78. }
  79. return nil
  80. }
  81. // 通过表生成前后端代码
  82. func (s *AutoService) ServerCode(c *gin.Context) {
  83. type AutoCode struct {
  84. TableName string `json:"tableName" example:"表名"`
  85. DbAlias string `json:"dbAlias" example:"业务数据库"`
  86. }
  87. var req AutoCode
  88. var err error
  89. defer func() {
  90. if err != nil {
  91. response.Resp(c, err.Error())
  92. }
  93. }()
  94. err = c.ShouldBindJSON(&req)
  95. if err != nil {
  96. return
  97. }
  98. err = utils.Verify(req, utils.AutoCodeVerify)
  99. if err != nil {
  100. return
  101. }
  102. if req.DbAlias == "" {
  103. response.Resp(c, "请填写别名")
  104. return
  105. }
  106. // 不开放一次生成全库
  107. if !isOpenAllTable && req.TableName == "" {
  108. response.Resp(c, "未开放全库生成")
  109. return
  110. }
  111. db, err := global.BizDBByAlias(req.DbAlias)
  112. if err != nil {
  113. return
  114. }
  115. dbAlias := req.DbAlias
  116. dbName := db.Migrator().CurrentDatabase()
  117. tableNames := []string{}
  118. if req.TableName == "" {
  119. tbs, err := s.GetTables(dbAlias)
  120. if err != nil {
  121. return
  122. }
  123. for _, tb := range tbs {
  124. tableNames = append(tableNames, tb.TableName)
  125. }
  126. } else {
  127. tableNames = append(tableNames, req.TableName)
  128. }
  129. for _, tableName := range tableNames {
  130. err = s.autoCodeWithTable(db, req.DbAlias, dbName, tableName)
  131. if err != nil {
  132. return
  133. }
  134. }
  135. response.Resp(c)
  136. }
  137. func (s *AutoService) AutoServerCodeWithAlias(alias, tableName string) error {
  138. db, err := global.BizDBByAlias(alias)
  139. if err != nil {
  140. return err
  141. }
  142. dbAlias := alias
  143. dbName := db.Migrator().CurrentDatabase()
  144. tableNames := []string{}
  145. if tableName == "" {
  146. tbs, err := s.GetTables(dbAlias)
  147. if err != nil {
  148. return err
  149. }
  150. for _, tb := range tbs {
  151. tableNames = append(tableNames, tb.TableName)
  152. }
  153. } else {
  154. tableNames = append(tableNames, tableName)
  155. }
  156. for _, tablename := range tableNames {
  157. err = s.autoCodeWithTable(db, dbAlias, dbName, tablename)
  158. if err != nil {
  159. return err
  160. }
  161. }
  162. return nil
  163. }
  164. func (s *AutoService) autoCodeWithTable(db *gorm.DB, alias, dbName, tableName string) (err error) {
  165. // 模型构建
  166. err = ams_ast.BuildModelRegister(alias, dbName, tableName).Initialize(db)
  167. if err != nil {
  168. return
  169. }
  170. // 服务构建
  171. err = ams_ast.BuildServiceRegister(alias, dbName, tableName).Initialize()
  172. if err != nil {
  173. return
  174. }
  175. // 注入总路由
  176. err = ams_ast.BuildRootRouterRegister([]string{alias}).Inspect()
  177. if err != nil {
  178. return
  179. }
  180. // 注入子路由
  181. err = ams_ast.BuildSubRouterRegister(alias, tableName).Inspect()
  182. if err != nil {
  183. return
  184. }
  185. return
  186. }
  187. func (s *AutoService) Rollback(c *gin.Context) {
  188. type AutoCode struct {
  189. DbAlias string `json:"dbAlias" example:"业务数据库"`
  190. TableName string `json:"tableName" example:"表名"`
  191. }
  192. var req AutoCode
  193. var err error
  194. defer func() {
  195. if err != nil {
  196. response.Resp(c, err.Error())
  197. }
  198. }()
  199. err = c.ShouldBindJSON(&req)
  200. if err != nil {
  201. return
  202. }
  203. err = utils.Verify(req, utils.AutoCodeVerify)
  204. if err != nil {
  205. return
  206. }
  207. if req.DbAlias == "" {
  208. response.Resp(c, "请填写别名")
  209. return
  210. }
  211. // 不开放一次生成全库
  212. if !isOpenAllTable && req.TableName == "" {
  213. response.Resp(c, "未开放全库回滚")
  214. return
  215. }
  216. db, err := global.BizDBByAlias(req.DbAlias)
  217. if err != nil {
  218. return
  219. }
  220. dbAlias := req.DbAlias
  221. dbName := db.Migrator().CurrentDatabase()
  222. tableNames := []string{}
  223. if req.TableName == "" {
  224. tbs, err := s.GetTables(dbAlias)
  225. if err != nil {
  226. return
  227. }
  228. for _, tb := range tbs {
  229. tableNames = append(tableNames, tb.TableName)
  230. }
  231. } else {
  232. tableNames = append(tableNames, req.TableName)
  233. }
  234. for _, tableName := range tableNames {
  235. err = s.rollbackTable(dbAlias, dbName, tableName)
  236. if err != nil {
  237. return
  238. }
  239. }
  240. response.Resp(c)
  241. }
  242. func (s *AutoService) RollbackWithAlias(dbAlias, tableName string) error {
  243. db, err := global.BizDBByAlias(dbAlias)
  244. if err != nil {
  245. return err
  246. }
  247. dbName := db.Migrator().CurrentDatabase()
  248. tableNames := []string{}
  249. if tableName == "" {
  250. tbs, err := s.GetTables(dbAlias)
  251. if err != nil {
  252. return err
  253. }
  254. for _, tb := range tbs {
  255. tableNames = append(tableNames, tb.TableName)
  256. }
  257. } else {
  258. tableNames = append(tableNames, tableName)
  259. }
  260. for _, tb := range tableNames {
  261. err = s.rollbackTable(dbAlias, dbName, tb)
  262. if err != nil {
  263. return err
  264. }
  265. }
  266. return nil
  267. }
  268. func (s *AutoService) rollbackTable(dbAlias, dbName, tableName string) (err error) {
  269. // 模型构建
  270. err = ams_ast.BuildModelRegister(dbAlias, dbName, tableName).RollbackModel()
  271. if err != nil {
  272. return
  273. }
  274. // 服务构建
  275. err = ams_ast.BuildServiceRegister(dbAlias, dbName, tableName).RollBack() // todo -- 待验证
  276. if err != nil {
  277. return
  278. }
  279. // 注入总路由
  280. err = ams_ast.BuildRootRouterRegister([]string{dbAlias}).RollbackRootRouter()
  281. if err != nil {
  282. return
  283. }
  284. // 注入子路由
  285. err = ams_ast.BuildSubRouterRegister(dbAlias, tableName).Rollback() // todo
  286. if err != nil {
  287. return
  288. }
  289. return
  290. }