sys_init.go 5.1 KB

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