sys_init.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. package service
  2. import (
  3. "bufio"
  4. "bytes"
  5. "context"
  6. "github.com/gogf/gf/v2/container/gvar"
  7. "github.com/gogf/gf/v2/database/gdb"
  8. "github.com/gogf/gf/v2/database/gredis"
  9. "github.com/gogf/gf/v2/frame/g"
  10. "github.com/tiger1103/gfast/v3/api/v1/system"
  11. "github.com/tiger1103/gfast/v3/library/libUtils"
  12. "gopkg.in/yaml.v2"
  13. "io"
  14. "os"
  15. "strings"
  16. "time"
  17. )
  18. type ISysInit interface {
  19. // 生成配置文件
  20. CreateConfigFile(ctx context.Context, req *system.DbInitCreateDbReq) (err error)
  21. // 生成数据库
  22. CreateDataBase(ctx context.Context, dbName string) (err error)
  23. // 加载配置文件
  24. LoadConfigFile() (err error)
  25. // 是否已生成配置文件
  26. IsCreateConfigFile() bool
  27. }
  28. func SysInit() ISysInit {
  29. return &sysInit{}
  30. }
  31. type sysInit struct{}
  32. var SysInitConfig map[string]*gvar.Var
  33. func init() {
  34. ctx := context.TODO()
  35. c, err := g.Cfg("initialize").Get(ctx, "initialize")
  36. if err != nil {
  37. g.Log().Panic(ctx, err)
  38. }
  39. SysInitConfig = make(map[string]*gvar.Var)
  40. SysInitConfig = c.MapStrVar()
  41. }
  42. // 是否已经生成配置文件
  43. func (s *sysInit) IsCreateConfigFile() bool {
  44. return libUtils.FileIsExisted(SysInitConfig["configPath"].String())
  45. }
  46. // 加载配置文件
  47. func (s *sysInit) LoadConfigFile() (err error) {
  48. var (
  49. ctx = context.TODO()
  50. )
  51. fileName, _ := libUtils.ParseFilePath(SysInitConfig["configPath"].String())
  52. // 加载数据库配置
  53. c1, err := g.Cfg(fileName).Get(ctx, "database.default")
  54. if err != nil {
  55. return
  56. }
  57. dbConfig := c1.MapStrVar()
  58. gdb.SetConfig(gdb.Config{
  59. "default": gdb.ConfigGroup{
  60. gdb.ConfigNode{
  61. Host: dbConfig["host"].String(),
  62. Port: dbConfig["port"].String(),
  63. User: dbConfig["user"].String(),
  64. Pass: dbConfig["pass"].String(),
  65. Name: dbConfig["name"].String(),
  66. Type: dbConfig["type"].String(),
  67. Role: dbConfig["role"].String(),
  68. Debug: dbConfig["debug"].Bool(),
  69. Charset: dbConfig["charset"].String(),
  70. DryRun: dbConfig["dryRun"].Bool(),
  71. MaxIdleConnCount: dbConfig["maxIdle"].Int(),
  72. MaxOpenConnCount: dbConfig["maxOpen"].Int(),
  73. MaxConnLifeTime: dbConfig["maxLifetime"].Duration() * time.Second,
  74. },
  75. },
  76. })
  77. // 加载redis配置
  78. c2, err := g.Cfg(fileName).Get(ctx, "redis.default")
  79. if err != nil {
  80. return
  81. }
  82. redisConfig := c2.Map()
  83. err = gredis.SetConfigByMap(redisConfig)
  84. if err != nil {
  85. return
  86. }
  87. return
  88. }
  89. // 创建配置文件
  90. func (s *sysInit) CreateConfigFile(ctx context.Context, req *system.DbInitCreateDbReq) (err error) {
  91. yamlConfig := req.ToDbInitConfig()
  92. b, err := yaml.Marshal(yamlConfig)
  93. if err != nil {
  94. return
  95. }
  96. err = libUtils.WriteToFile(SysInitConfig["configPath"].String(), string(b))
  97. return
  98. }
  99. // 读取sql文件
  100. func (s *sysInit) ReadSqlFile(path string) (sqlArr []string, err error) {
  101. inputFile, inputError := os.Open(path)
  102. if inputError != nil {
  103. return nil, inputError
  104. }
  105. defer inputFile.Close()
  106. inputReader := bufio.NewReader(inputFile)
  107. var (
  108. flag bool = true
  109. buffer bytes.Buffer
  110. )
  111. for {
  112. inputString, readerError := inputReader.ReadString('\n')
  113. inputString = strings.TrimSpace(inputString)
  114. if strings.HasPrefix(inputString, "--") {
  115. flag = false
  116. }
  117. if strings.HasPrefix(inputString, "/*") {
  118. flag = false
  119. }
  120. if flag && inputString != "" {
  121. if strings.HasSuffix(inputString, ";") {
  122. if buffer.Len() == 0 {
  123. sqlArr = append(sqlArr, inputString)
  124. } else {
  125. buffer.WriteString(inputString)
  126. sqlArr = append(sqlArr, buffer.String())
  127. buffer.Reset()
  128. }
  129. } else {
  130. buffer.WriteString(inputString + " ")
  131. }
  132. }
  133. if !flag && strings.HasPrefix(inputString, "*/") {
  134. flag = true
  135. }
  136. if !flag && strings.HasPrefix(inputString, "--") {
  137. flag = true
  138. }
  139. if readerError == io.EOF {
  140. break
  141. }
  142. }
  143. return
  144. }
  145. // 创建数据库表
  146. func (s *sysInit) CreateDataBase(ctx context.Context, dbName string) (err error) {
  147. sqlArr, err := s.ReadSqlFile(SysInitConfig["sqlFilePath"].String())
  148. if err != nil {
  149. return
  150. }
  151. if len(sqlArr) == 0 {
  152. return
  153. }
  154. // newSqlArr := SqlArr(sqlArr).Split(10)
  155. db := g.DB()
  156. for _, item := range sqlArr {
  157. _, err = db.Exec(ctx, item)
  158. if err != nil {
  159. return
  160. }
  161. }
  162. return
  163. }
  164. type SqlArr []string
  165. func (arr SqlArr) Split(num int) (result SqlArr) {
  166. if len(arr) == 0 {
  167. return
  168. }
  169. var (
  170. buffer bytes.Buffer
  171. i int
  172. )
  173. for _, item := range arr {
  174. buffer.WriteString(item)
  175. i++
  176. if i == num {
  177. result = append(result, buffer.String())
  178. buffer.Reset()
  179. i = 0
  180. }
  181. }
  182. if buffer.Len() > 0 {
  183. result = append(result, buffer.String())
  184. }
  185. return
  186. }