tools_gen_table.go 20 KB

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