tools_gen_table.go 19 KB

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