tools_gen_table.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766
  1. /*
  2. * @desc:代码生成功能
  3. * @company:云南省奇讯科技有限公司
  4. * @Author: yixiaohu
  5. * @Date: 2021/7/22 15:30
  6. */
  7. package service
  8. import (
  9. "bufio"
  10. "context"
  11. "database/sql"
  12. "fmt"
  13. "gfast/app/common/global"
  14. comModel "gfast/app/common/model"
  15. comService "gfast/app/common/service"
  16. "gfast/app/system/dao"
  17. "gfast/app/system/model"
  18. "github.com/gogf/gf/database/gdb"
  19. "github.com/gogf/gf/encoding/gjson"
  20. "github.com/gogf/gf/errors/gerror"
  21. "github.com/gogf/gf/frame/g"
  22. "github.com/gogf/gf/os/gfile"
  23. "github.com/gogf/gf/os/gtime"
  24. "github.com/gogf/gf/os/gview"
  25. "github.com/gogf/gf/text/gregex"
  26. "github.com/gogf/gf/text/gstr"
  27. "github.com/gogf/gf/util/gconv"
  28. "io"
  29. "os"
  30. "strings"
  31. )
  32. type toolsGenTable struct{}
  33. var ToolsGenTable = new(toolsGenTable)
  34. // SelectListByPage 查询已导入的数据表
  35. func (s *toolsGenTable) SelectListByPage(param *dao.ToolsGenTableSearchReq) (total int, list []*model.ToolsGenTable, err error) {
  36. model := dao.ToolsGenTable.M
  37. if param != nil {
  38. if param.TableName != "" {
  39. model = model.Where(dao.ToolsGenTable.C.TableName+" like ?", "%"+param.TableName+"%")
  40. }
  41. if param.TableComment != "" {
  42. model = model.Where(dao.ToolsGenTable.C.TableComment+"like ?", "%"+param.TableComment+"%")
  43. }
  44. if param.BeginTime != "" {
  45. model = model.Where(dao.ToolsGenTable.C.CreateTime+" >= ", param.BeginTime)
  46. }
  47. if param.EndTime != "" {
  48. model = model.Where(dao.ToolsGenTable.C.CreateTime+" <= ", param.EndTime)
  49. }
  50. total, err = model.Count()
  51. if err != nil {
  52. g.Log().Error(err)
  53. err = gerror.New("获取总行数失败")
  54. return
  55. }
  56. if param.PageNum == 0 {
  57. param.PageNum = 1
  58. }
  59. if param.PageSize == 0 {
  60. param.PageSize = comModel.PageSize
  61. }
  62. err = model.Page(param.PageNum, param.PageSize).Order(dao.ToolsGenTable.C.TableId + " asc").Scan(&list)
  63. if err != nil {
  64. g.Log().Error(err)
  65. err = gerror.New("获取数据失败")
  66. }
  67. }
  68. return
  69. }
  70. // SelectDbTableList 查询据库表
  71. func (s *toolsGenTable) SelectDbTableList(param *dao.ToolsGenTableSearchReq) (total int, list []*model.ToolsGenTable, err error) {
  72. db := g.DB()
  73. if s.getDbDriver() != "pgsql" {
  74. err = gerror.New("代码生成暂时只支持postgres数据库")
  75. return
  76. }
  77. sql := " from pg_tables where schemaname='public'"
  78. //sql := " from information_schema.tables where table_schema = (select database())" +
  79. // " and table_name NOT LIKE 'qrtz_%' AND table_name NOT LIKE 'gen_%' and table_name NOT IN (select tablename from " + dao.ToolsGenTable.Table + ") "
  80. if param != nil {
  81. if param.TableName != "" {
  82. sql += gdb.FormatSqlWithArgs(" and lower(tablename) like lower(?)", []interface{}{"%" + param.TableName + "%"})
  83. }
  84. //if param.TableComment != "" {
  85. // sql += gdb.FormatSqlWithArgs(" and lower(table_comment) like lower(?)", []interface{}{"%" + param.TableComment + "%"})
  86. //}
  87. //
  88. //if param.BeginTime != "" {
  89. // sql += gdb.FormatSqlWithArgs(" and date_format(create_time,'%y%m%d') >= date_format(?,'%y%m%d') ", []interface{}{param.BeginTime})
  90. //}
  91. //
  92. //if param.EndTime != "" {
  93. // sql += gdb.FormatSqlWithArgs(" and date_format(create_time,'%y%m%d') <= date_format(?,'%y%m%d') ", []interface{}{param.EndTime})
  94. //}
  95. }
  96. countSql := "select count(1) " + sql
  97. total, err = db.GetCount(countSql)
  98. if err != nil {
  99. g.Log().Error(err)
  100. err = gerror.New("读取总表数失败")
  101. return
  102. }
  103. //sql = "table_name, table_comment, create_time, update_time " + sql
  104. sql = "tablename " + sql
  105. if param.PageNum == 0 {
  106. param.PageNum = 1
  107. }
  108. if param.PageSize == 0 {
  109. param.PageSize = comModel.PageSize
  110. }
  111. page := (param.PageNum - 1) * param.PageSize
  112. sql += " order by tablename asc limit " + gconv.String(param.PageSize) + " offset " + gconv.String(page)
  113. err = db.GetScan(&list, "select "+sql)
  114. if err != nil {
  115. g.Log().Error(err)
  116. err = gerror.New("读取数据失败")
  117. }
  118. return
  119. }
  120. //获取数据库驱动类型
  121. func (s *toolsGenTable) getDbDriver() string {
  122. config := g.DB().GetConfig()
  123. return gstr.ToLower(config.Type)
  124. }
  125. // SelectDbTableListByNames 查询数据库中对应的表数据
  126. func (s *toolsGenTable) SelectDbTableListByNames(tableNames []string) ([]*model.ToolsGenTable, error) {
  127. if s.getDbDriver() != "pgsql" {
  128. return nil, gerror.New("代码生成只支持postgres数据库")
  129. }
  130. db := g.DB()
  131. sql := "select * from information_schema.tables where table_name NOT LIKE 'gleke_%' and table_name NOT LIKE 'gen_%' " +
  132. " and table_schema = 'public' "
  133. if len(tableNames) > 0 {
  134. in := gstr.TrimRight(gstr.Repeat("?,", len(tableNames)), ",")
  135. sql += " and " + gdb.FormatSqlWithArgs("table_name in ("+in+")", gconv.SliceAny(tableNames))
  136. }
  137. var result []*model.ToolsGenTable
  138. err := db.GetScan(&result, sql)
  139. if err != nil {
  140. g.Log().Error(err)
  141. return nil, gerror.New("获取表格信息失败")
  142. }
  143. return result, err
  144. }
  145. // ImportGenTable 导入表结构
  146. func (s *toolsGenTable) ImportGenTable(tableList []*model.ToolsGenTable) error {
  147. if tableList != nil {
  148. tx, err := g.DB().Begin()
  149. if err != nil {
  150. return err
  151. }
  152. for _, table := range tableList {
  153. tableName := table.TableName
  154. s.InitTable(table)
  155. _, err := tx.Model(dao.ToolsGenTable.Table).FieldsEx("table_id").Insert(table)
  156. if err != nil {
  157. g.Log().Error("ImportGenTable", err)
  158. return err
  159. }
  160. tableIDMax, errMax := tx.Model(dao.ToolsGenTable.Table).Max("table_id")
  161. tmpId := int64(tableIDMax)
  162. if errMax != nil || tmpId <= 0 {
  163. tx.Rollback()
  164. return gerror.New("保存数据失败")
  165. }
  166. table.TableId = tmpId
  167. // 保存列信息
  168. genTableColumns, errTable := ToolsGenTableColumn.SelectDbTableColumnsByName(tableName)
  169. if errTable != nil || len(genTableColumns) <= 0 {
  170. tx.Rollback()
  171. return gerror.New("获取列数据失败")
  172. }
  173. for _, column := range genTableColumns {
  174. ToolsGenTableColumn.InitColumnField(column, table)
  175. _, err = tx.Model(dao.ToolsGenTableColumn.Table).FieldsEx("column_id").Insert(column)
  176. if err != nil {
  177. tx.Rollback()
  178. return gerror.New("保存列数据失败")
  179. }
  180. }
  181. }
  182. return tx.Commit()
  183. } else {
  184. return gerror.New("参数错误")
  185. }
  186. }
  187. // InitTable 初始化表信息
  188. func (s *toolsGenTable) InitTable(table *model.ToolsGenTable) {
  189. table.ClassName = s.ConvertClassName(table.TableName)
  190. table.PackageName = g.Cfg().GetString("gen.packageName")
  191. table.ModuleName = g.Cfg().GetString("gen.moduleName")
  192. table.BusinessName = s.GetBusinessName(table.TableName)
  193. table.FunctionName = strings.ReplaceAll(table.TableComment, "表", "")
  194. table.FunctionAuthor = g.Cfg().GetString("gen.author")
  195. table.TplCategory = "crud"
  196. table.CreateTime = gtime.Now()
  197. table.UpdateTime = table.CreateTime
  198. }
  199. // ConvertClassName 表名转换成类名
  200. func (s *toolsGenTable) ConvertClassName(tableName string) string {
  201. return gstr.CaseCamel(s.removeTablePrefix(tableName))
  202. }
  203. // GetBusinessName 获取业务名
  204. func (s *toolsGenTable) GetBusinessName(tableName string) string {
  205. return s.removeTablePrefix(tableName)
  206. }
  207. //删除表前缀
  208. func (s *toolsGenTable) removeTablePrefix(tableName string) string {
  209. autoRemovePre := g.Cfg().GetBool("gen.autoRemovePre")
  210. tablePrefix := g.Cfg().GetString("gen.tablePrefix")
  211. if autoRemovePre && tablePrefix != "" {
  212. searchList := strings.Split(tablePrefix, ",")
  213. for _, str := range searchList {
  214. if strings.HasPrefix(tableName, str) {
  215. tableName = strings.Replace(tableName, str, "", 1) //注意,只替换一次
  216. }
  217. }
  218. }
  219. return tableName
  220. }
  221. // Delete 删除表信息
  222. func (s *toolsGenTable) Delete(ids []int) error {
  223. tx, err := g.DB().Begin()
  224. if err != nil {
  225. g.Log().Error(err)
  226. return gerror.New("开启删除事务出错")
  227. }
  228. _, err = tx.Model(dao.ToolsGenTable.Table).Where(dao.ToolsGenTable.C.TableId+" in(?)", ids).Delete()
  229. if err != nil {
  230. g.Log().Error(err)
  231. tx.Rollback()
  232. return gerror.New("删除表格数据失败")
  233. }
  234. _, err = tx.Model(dao.ToolsGenTableColumn.Table).Where(dao.ToolsGenTableColumn.C.TableId+" in(?)", ids).Delete()
  235. if err != nil {
  236. g.Log().Error(err)
  237. tx.Rollback()
  238. return gerror.New("删除表格字段数据失败")
  239. }
  240. tx.Commit()
  241. return nil
  242. }
  243. // GetTableInfoByTableId 获取表格信息
  244. func (s *toolsGenTable) GetTableInfoByTableId(tableId int64) (info *model.ToolsGenTable, err error) {
  245. err = dao.ToolsGenTable.WherePri(tableId).Scan(&info)
  246. if err != nil {
  247. g.Log().Error(err)
  248. err = gerror.New("获取表格信息出错")
  249. }
  250. return
  251. }
  252. // SaveEdit 更新表及字段生成信息
  253. func (s *toolsGenTable) SaveEdit(req *dao.ToolsGenTableEditReq) (err error) {
  254. err = nil
  255. if req == nil {
  256. err = gerror.New("参数错误")
  257. return
  258. }
  259. var table *model.ToolsGenTable
  260. err = dao.ToolsGenTable.Where("table_id=?", req.TableId).Scan(&table)
  261. g.Log().Info(req.TableId)
  262. g.Log().Info(table)
  263. //g.Log().Error("table_id=?",err)
  264. if err != nil || table == nil {
  265. err = gerror.New("数据不存在")
  266. g.Log().Error(err)
  267. return
  268. }
  269. if req.TableName != "" {
  270. table.TableName = req.TableName
  271. }
  272. if req.TableComment != "" {
  273. table.TableComment = req.TableComment
  274. }
  275. if req.BusinessName != "" {
  276. table.BusinessName = req.BusinessName
  277. }
  278. if req.ClassName != "" {
  279. table.ClassName = req.ClassName
  280. }
  281. if req.FunctionAuthor != "" {
  282. table.FunctionAuthor = req.FunctionAuthor
  283. }
  284. if req.FunctionName != "" {
  285. table.FunctionName = req.FunctionName
  286. }
  287. if req.ModuleName != "" {
  288. table.ModuleName = req.ModuleName
  289. }
  290. if req.PackageName != "" {
  291. table.PackageName = req.PackageName
  292. }
  293. if req.Remark != "" {
  294. table.Remark = req.Remark
  295. }
  296. if req.TplCategory != "" {
  297. table.TplCategory = req.TplCategory
  298. }
  299. if req.Params != "" {
  300. table.Options = req.Params
  301. }
  302. table.UpdateTime = gtime.Now()
  303. var options g.Map
  304. if req.TplCategory == "tree" {
  305. //树表设置options
  306. options = g.Map{
  307. "treeCode": req.TreeCode,
  308. "treeParentCode": req.TreeParentCode,
  309. "treeName": req.TreeName,
  310. }
  311. table.Options = gconv.String(options)
  312. } else {
  313. table.Options = ""
  314. }
  315. var tx *gdb.TX
  316. tx, err = g.DB().Begin()
  317. if err != nil {
  318. return
  319. }
  320. g.Log().Info("tx.Model(dao.ToolsGenTable.Table).Save(table)")
  321. _, err = tx.Model(dao.ToolsGenTable.Table).Where("table_id=?", req.TableId).Update(table)
  322. g.Log().Error("tx.Model(dao.ToolsGenTable.Table).Save(table)", err)
  323. if err != nil {
  324. tx.Rollback()
  325. return err
  326. }
  327. //保存列数据
  328. g.Log().Infof("req.Columns")
  329. if req.Columns != nil {
  330. for _, column := range req.Columns {
  331. if column.ColumnId > 0 {
  332. var dbColumn *model.ToolsGenTableColumn
  333. err = dao.ToolsGenTableColumn.Where("column_id=?", column.ColumnId).Scan(&dbColumn)
  334. g.Log().Error("保存列数据", err)
  335. if dbColumn != nil {
  336. dbColumn.ColumnComment = column.ColumnComment
  337. dbColumn.GoType = column.GoType
  338. dbColumn.HtmlType = column.HtmlType
  339. dbColumn.QueryType = column.QueryType
  340. dbColumn.GoField = column.GoField
  341. dbColumn.DictType = column.DictType
  342. dbColumn.IsInsert = column.IsInsert
  343. dbColumn.IsEdit = column.IsEdit
  344. dbColumn.IsList = column.IsList
  345. dbColumn.IsQuery = column.IsQuery
  346. dbColumn.IsRequired = column.IsRequired
  347. if tc, e := options["treeParentCode"]; options != nil && e && tc != "" && tc == dbColumn.HtmlField {
  348. dbColumn.IsQuery = "0"
  349. dbColumn.IsList = "0"
  350. dbColumn.HtmlType = "select"
  351. }
  352. //获取字段关联表信息
  353. if column.LinkLabelName != "" {
  354. dbColumn.LinkTableName = column.LinkTableName
  355. dbColumn.LinkLabelId = column.LinkLabelId
  356. dbColumn.LinkLabelName = column.LinkLabelName
  357. var linkTable *model.ToolsGenTable
  358. err = dao.ToolsGenTable.Where("table_name =?", column.LinkTableName).Scan(&linkTable)
  359. g.Log().Error("获取字段关联表信息", err)
  360. g.Log().Info("获取字段关联表信息")
  361. if err != nil {
  362. tx.Rollback()
  363. return
  364. }
  365. dbColumn.LinkTableClass = linkTable.ClassName
  366. dbColumn.LinkTablePackage = linkTable.PackageName
  367. } else {
  368. dbColumn.LinkTableName = ""
  369. dbColumn.LinkTableClass = ""
  370. dbColumn.LinkTablePackage = ""
  371. dbColumn.LinkLabelId = ""
  372. dbColumn.LinkLabelName = ""
  373. }
  374. _, err = tx.Model(dao.ToolsGenTableColumn.Table).Where("column_id=?", column.ColumnId).Update(dbColumn)
  375. g.Log().Info("Save(dbColumn)")
  376. g.Log().Error("Save(dbColumn)", err)
  377. if err != nil {
  378. tx.Rollback()
  379. return
  380. }
  381. }
  382. }
  383. }
  384. }
  385. tx.Commit()
  386. return
  387. }
  388. func (s *toolsGenTable) SelectRecordById(tableId int64) (entityExtend *dao.ToolsGenTableExtend, err error) {
  389. var table *model.ToolsGenTable
  390. table, err = s.GetTableInfoByTableId(tableId)
  391. if err != nil {
  392. return
  393. }
  394. m := gconv.Map(table)
  395. gconv.Struct(m, &entityExtend)
  396. if entityExtend.TplCategory == "tree" {
  397. opt := gjson.New(entityExtend.Options)
  398. entityExtend.TreeParentCode = opt.GetString("treeParentCode")
  399. entityExtend.TreeCode = opt.GetString("treeCode")
  400. entityExtend.TreeName = opt.GetString("treeName")
  401. }
  402. //表字段数据
  403. var columns []*model.ToolsGenTableColumn
  404. columns, err = ToolsGenTableColumn.SelectGenTableColumnListByTableId(tableId)
  405. if err != nil {
  406. return
  407. }
  408. entityExtend.Columns = columns
  409. return
  410. }
  411. func (s *toolsGenTable) GenCode(ids []int, ctx context.Context) (err error) {
  412. //获取当前运行时目录
  413. curDir, err := os.Getwd()
  414. if err != nil {
  415. return gerror.New("获取本地路径失败")
  416. }
  417. frontDir := g.Cfg().GetString("gen.frontDir")
  418. if !gfile.IsDir(frontDir) {
  419. err = gerror.New("项目前端路径不存在,请检查是否已在配置文件中配置!")
  420. return
  421. }
  422. for _, id := range ids {
  423. var genData g.MapStrStr
  424. var extendData *dao.ToolsGenTableExtend
  425. genData, extendData, err = s.GenData(gconv.Int64(id), ctx)
  426. packageName := gstr.SubStr(extendData.PackageName, gstr.Pos(extendData.PackageName, "/"))
  427. businessName := gstr.CaseCamelLower(extendData.BusinessName)
  428. for key, code := range genData {
  429. switch key {
  430. case "controller":
  431. path := strings.Join([]string{curDir, packageName, "/api/", extendData.TableName, ".go"}, "")
  432. err = s.createFile(path, code, false)
  433. case "dao":
  434. path := strings.Join([]string{curDir, packageName, "/dao/", extendData.TableName, ".go"}, "")
  435. err = s.createFile(path, code, false)
  436. case "dao_internal":
  437. path := strings.Join([]string{curDir, packageName, "/dao/internal/", extendData.TableName, ".go"}, "")
  438. err = s.createFile(path, code, true)
  439. case "model":
  440. path := strings.Join([]string{curDir, packageName, "/model/", extendData.TableName, ".go"}, "")
  441. err = s.createFile(path, code, true)
  442. case "router":
  443. path := strings.Join([]string{curDir, packageName, "/router/", extendData.TableName, ".go"}, "")
  444. err = s.createFile(path, code, false)
  445. case "service":
  446. path := strings.Join([]string{curDir, packageName, "/service/", extendData.TableName, ".go"}, "")
  447. err = s.createFile(path, code, false)
  448. case "sql":
  449. path := strings.Join([]string{curDir, "/data/gen_sql/", packageName, "/", extendData.TableName, ".sql"}, "")
  450. hasSql := gfile.Exists(path)
  451. err = s.createFile(path, code, false)
  452. if !hasSql {
  453. //第一次生成则向数据库写入菜单数据
  454. err = s.writeDb(path, ctx)
  455. if err != nil {
  456. return
  457. }
  458. //清除菜单缓存
  459. comService.Cache.New().Remove(global.SysAuthMenu)
  460. }
  461. case "vue":
  462. path := strings.Join([]string{frontDir, "/src/views/", extendData.ModuleName, "/", businessName, "/list/index.vue"}, "")
  463. if gstr.ContainsI(extendData.PackageName, "plugins") {
  464. path = strings.Join([]string{frontDir, "/src/views/plugins/", extendData.ModuleName, "/", businessName, "/list/index.vue"}, "")
  465. }
  466. err = s.createFile(path, code, false)
  467. case "jsApi":
  468. path := strings.Join([]string{frontDir, "/src/api/", extendData.ModuleName, "/", businessName, ".js"}, "")
  469. if gstr.ContainsI(extendData.PackageName, "plugins") {
  470. path = strings.Join([]string{frontDir, "/src/api/plugins/", extendData.ModuleName, "/", businessName, ".js"}, "")
  471. }
  472. err = s.createFile(path, code, false)
  473. }
  474. }
  475. //生成对应的模块路由
  476. err = s.genModuleRouter(curDir, extendData.ModuleName, extendData.PackageName)
  477. }
  478. return
  479. }
  480. // createFile 创建文件
  481. func (s *toolsGenTable) createFile(fileName, data string, cover bool) (err error) {
  482. if !gfile.Exists(fileName) || cover {
  483. var f *os.File
  484. f, err = gfile.Create(fileName)
  485. if err == nil {
  486. f.WriteString(data)
  487. }
  488. f.Close()
  489. }
  490. return
  491. }
  492. // GenData 获取生成数据
  493. func (s *toolsGenTable) GenData(tableId int64, ctx context.Context) (data g.MapStrStr, extendData *dao.ToolsGenTableExtend, err error) {
  494. extendData, err = ToolsGenTable.SelectRecordById(tableId)
  495. if err != nil {
  496. return
  497. }
  498. if extendData == nil {
  499. err = gerror.New("表格数据不存在")
  500. return
  501. }
  502. g.Log().Info(extendData)
  503. g.Log().Info(extendData.Columns)
  504. ToolsGenTableColumn.SetPkColumn(extendData, extendData.Columns)
  505. view := gview.New()
  506. view.SetConfigWithMap(g.Map{
  507. "Paths": g.Cfg().GetString("gen.templatePath"),
  508. "Delimiters": []string{"{{", "}}"},
  509. })
  510. view.BindFuncMap(g.Map{
  511. "UcFirst": func(str string) string {
  512. return gstr.UcFirst(str)
  513. },
  514. "Sum": func(a, b int) int {
  515. return a + b
  516. },
  517. "CaseCamelLower": gstr.CaseCamelLower, //首字母小写驼峰
  518. "CaseCamel": gstr.CaseCamel, //首字母大写驼峰
  519. "HasSuffix": gstr.HasSuffix, //是否存在后缀
  520. "ContainsI": gstr.ContainsI, //是否包含子字符串
  521. "VueTag": func(t string) string {
  522. return t
  523. },
  524. })
  525. //树形菜单选项
  526. tplData := g.Map{"table": extendData}
  527. daoKey := "dao"
  528. daoValue := ""
  529. var tmpDao string
  530. if tmpDao, err = view.Parse(ctx, "go/dao.template", tplData); err == nil {
  531. daoValue = tmpDao
  532. daoValue, err = s.trimBreak(daoValue)
  533. } else {
  534. return
  535. }
  536. daoInternalKey := "dao_internal"
  537. daoInternalValue := ""
  538. var tmpInternalDao string
  539. if tmpInternalDao, err = view.Parse(ctx, "go/dao_internal.template", tplData); err == nil {
  540. daoInternalValue = tmpInternalDao
  541. daoInternalValue, err = s.trimBreak(daoInternalValue)
  542. } else {
  543. return
  544. }
  545. modelKey := "model"
  546. modelValue := ""
  547. var tmpModel string
  548. if tmpModel, err = view.Parse(ctx, "go/model.template", tplData); err == nil {
  549. modelValue = tmpModel
  550. modelValue, err = s.trimBreak(modelValue)
  551. } else {
  552. return
  553. }
  554. controllerKey := "controller"
  555. controllerValue := ""
  556. var tmpController string
  557. if tmpController, err = view.Parse(ctx, "go/controller.template", tplData); err == nil {
  558. controllerValue = tmpController
  559. controllerValue, err = s.trimBreak(controllerValue)
  560. } else {
  561. return
  562. }
  563. serviceKey := "service"
  564. serviceValue := ""
  565. var tmpService string
  566. if tmpService, err = view.Parse(ctx, "go/service.template", tplData); err == nil {
  567. serviceValue = tmpService
  568. serviceValue, err = s.trimBreak(serviceValue)
  569. } else {
  570. return
  571. }
  572. routerKey := "router"
  573. routerValue := ""
  574. var tmpRouter string
  575. if tmpRouter, err = view.Parse(ctx, "go/router.template", tplData); err == nil {
  576. routerValue = tmpRouter
  577. routerValue, err = s.trimBreak(routerValue)
  578. } else {
  579. return
  580. }
  581. sqlKey := "sql"
  582. sqlValue := ""
  583. var tmpSql string
  584. if tmpSql, err = view.Parse(ctx, "sql/sql.template", tplData); err == nil {
  585. sqlValue = tmpSql
  586. sqlValue, err = s.trimBreak(sqlValue)
  587. } else {
  588. return
  589. }
  590. jsApiKey := "jsApi"
  591. jsApiValue := ""
  592. var tmpJsApi string
  593. if tmpJsApi, err = view.Parse(ctx, "js/api.template", tplData); err == nil {
  594. jsApiValue = tmpJsApi
  595. jsApiValue, err = s.trimBreak(jsApiValue)
  596. } else {
  597. return
  598. }
  599. vueKey := "vue"
  600. vueValue := ""
  601. var tmpVue string
  602. tmpFile := "vue/list-vue.template"
  603. if extendData.TplCategory == "tree" {
  604. //树表
  605. tmpFile = "vue/tree-vue.template"
  606. }
  607. if tmpVue, err = view.Parse(ctx, tmpFile, tplData); err == nil {
  608. vueValue = tmpVue
  609. vueValue, err = s.trimBreak(vueValue)
  610. } else {
  611. return
  612. }
  613. data = g.MapStrStr{
  614. daoKey: daoValue,
  615. daoInternalKey: daoInternalValue,
  616. modelKey: modelValue,
  617. controllerKey: controllerValue,
  618. serviceKey: serviceValue,
  619. routerKey: routerValue,
  620. sqlKey: sqlValue,
  621. jsApiKey: jsApiValue,
  622. vueKey: vueValue,
  623. }
  624. return
  625. }
  626. //剔除多余的换行
  627. func (s *toolsGenTable) trimBreak(str string) (rStr string, err error) {
  628. var b []byte
  629. if b, err = gregex.Replace("(([\\s\t]*)\r?\n){2,}", []byte("$2\n"), []byte(str)); err != nil {
  630. return
  631. }
  632. if b, err = gregex.Replace("(([\\s\t]*)/{4}\r?\n)", []byte("$2\n\n"), b); err == nil {
  633. rStr = gconv.String(b)
  634. }
  635. return
  636. }
  637. // 写入菜单数据
  638. func (s *toolsGenTable) writeDb(path string, ctx context.Context) (err error) {
  639. isAnnotation := false
  640. var fi *os.File
  641. fi, err = os.Open(path)
  642. if err != nil {
  643. return
  644. }
  645. defer fi.Close()
  646. br := bufio.NewReader(fi)
  647. var sqlStr []string
  648. now := gtime.Now()
  649. var res sql.Result
  650. var id int64
  651. var tx *gdb.TX
  652. tx, err = g.DB().Ctx(ctx).Begin()
  653. if err != nil {
  654. return
  655. }
  656. for {
  657. bytes, e := br.ReadBytes('\n')
  658. if e == io.EOF {
  659. break
  660. }
  661. str := gstr.Trim(string(bytes))
  662. if str == "" {
  663. continue
  664. }
  665. if strings.Contains(str, "/*") {
  666. isAnnotation = true
  667. }
  668. if isAnnotation {
  669. if strings.Contains(str, "*/") {
  670. isAnnotation = false
  671. }
  672. continue
  673. }
  674. if str == "" || strings.HasPrefix(str, "--") || strings.HasPrefix(str, "#") {
  675. continue
  676. }
  677. if strings.HasSuffix(str, ";") {
  678. if gstr.ContainsI(str, "select") {
  679. if gstr.ContainsI(str, "@now") {
  680. continue
  681. }
  682. if gstr.ContainsI(str, "@parentId") {
  683. id, err = res.LastInsertId()
  684. }
  685. }
  686. sqlStr = append(sqlStr, str)
  687. sql := strings.Join(sqlStr, "")
  688. gstr.ReplaceByArray(sql, []string{"@parentId", gconv.String(id), "@now", now.Format("Y-m-d H:i:s")})
  689. //插入业务
  690. g.Log().Info(sql)
  691. res, err = tx.Exec(sql)
  692. if err != nil {
  693. tx.Rollback()
  694. return
  695. }
  696. sqlStr = nil
  697. } else {
  698. sqlStr = []string{str}
  699. }
  700. }
  701. tx.Commit()
  702. return
  703. }
  704. // GenModuleRouter 生成模块路由
  705. func (s *toolsGenTable) genModuleRouter(curDir, moduleName, packageName string) (err error) {
  706. if gstr.CaseSnake(moduleName) != "system" {
  707. routerFilePath := strings.Join([]string{curDir, "/router/", gstr.CaseSnake(moduleName), ".go"}, "")
  708. if gstr.ContainsI(packageName, "plugins") {
  709. routerFilePath = strings.Join([]string{curDir, "/plugins/router/", gstr.CaseSnake(moduleName), ".go"}, "")
  710. }
  711. code := fmt.Sprintf(`package router%simport _ "%s/router"`, "\n", packageName)
  712. err = s.createFile(routerFilePath, code, false)
  713. }
  714. return
  715. }