You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

240 lines
5.1 KiB

package service
import (
"bufio"
"bytes"
"context"
"fmt"
"github.com/gogf/gf/v2/container/gvar"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/database/gredis"
"github.com/gogf/gf/v2/frame/g"
"gopkg.in/yaml.v3"
"io"
"os"
"strings"
"time"
"tyj_admin/api/v1/system"
"tyj_admin/library/libUtils"
)
type ISysInit interface {
// 生成配置文件
CreateConfigFile(ctx context.Context, req *system.DbInitCreateDbReq) (err error)
// 生成数据库
CreateDataBase(ctx context.Context, dbName string) (err error)
// 加载配置文件
LoadConfigFile() (err error)
// 是否已生成配置文件
IsCreateConfigFile() bool
//创建数据库
CreateDataBaseByName(ctx context.Context, req *system.DbInitCreateDbReq) (err error)
}
func SysInit() ISysInit {
return &sysInit{}
}
type sysInit struct{}
var SysInitConfig map[string]*gvar.Var
func init() {
ctx := context.TODO()
c, err := g.Cfg("initialize").Get(ctx, "initialize")
if err != nil {
g.Log().Panic(ctx, err)
}
SysInitConfig = make(map[string]*gvar.Var)
SysInitConfig = c.MapStrVar()
}
// 创建数据库
func (s *sysInit) CreateDataBaseByName(ctx context.Context, req *system.DbInitCreateDbReq) (err error) {
db, err := gdb.New(gdb.ConfigNode{
Type: "mysql",
Host: req.DbHost,
Port: fmt.Sprintf("%d", req.DbPort),
User: req.DbUser,
Pass: req.DbPass,
})
if err != nil {
return
}
defer db.Close(ctx)
_, err = db.Exec(ctx, fmt.Sprintf("CREATE DATABASE IF NOT EXISTS `%s` DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci", req.DbName))
if err != nil {
return
}
return
}
// 是否已经生成配置文件
func (s *sysInit) IsCreateConfigFile() bool {
return libUtils.FileIsExisted(SysInitConfig["configPath"].String())
}
// 加载配置文件
func (s *sysInit) LoadConfigFile() (err error) {
var (
ctx = context.TODO()
)
fileName, _ := libUtils.ParseFilePath(SysInitConfig["configPath"].String())
// 加载数据库配置
c1, err := g.Cfg(fileName).Get(ctx, "database.default")
if err != nil {
return
}
dbConfig := c1.MapStrVar()
gdb.SetConfig(gdb.Config{
"default": gdb.ConfigGroup{
gdb.ConfigNode{
Host: dbConfig["host"].String(),
Port: dbConfig["port"].String(),
User: dbConfig["user"].String(),
Pass: dbConfig["pass"].String(),
Name: dbConfig["name"].String(),
Type: dbConfig["type"].String(),
Role: dbConfig["role"].String(),
Debug: dbConfig["debug"].Bool(),
Charset: dbConfig["charset"].String(),
DryRun: dbConfig["dryRun"].Bool(),
MaxIdleConnCount: dbConfig["maxIdle"].Int(),
MaxOpenConnCount: dbConfig["maxOpen"].Int(),
MaxConnLifeTime: dbConfig["maxLifetime"].Duration() * time.Second,
},
},
})
// 加载redis配置
c2, err := g.Cfg(fileName).Get(ctx, "redis.default")
if err != nil {
return
}
redisConfig := c2.Map()
err = gredis.SetConfigByMap(redisConfig)
if err != nil {
return
}
return
}
// 创建配置文件
func (s *sysInit) CreateConfigFile(ctx context.Context, req *system.DbInitCreateDbReq) (err error) {
yamlConfig := req.ToDbInitConfig()
b, err := yaml.Marshal(yamlConfig)
if err != nil {
return
}
err = libUtils.WriteToFile(SysInitConfig["configPath"].String(), string(b))
return
}
// 读取sql文件
func (s *sysInit) ReadSqlFile(path string) (sqlArr []string, err error) {
inputFile, inputError := os.Open(path)
if inputError != nil {
return nil, inputError
}
defer inputFile.Close()
inputReader := bufio.NewReader(inputFile)
var (
flag bool = true
buffer bytes.Buffer
)
for {
inputString, readerError := inputReader.ReadString('\n')
inputString = strings.TrimSpace(inputString)
if strings.HasPrefix(inputString, "--") {
flag = false
}
if strings.HasPrefix(inputString, "/*") {
flag = false
}
if flag && inputString != "" {
if strings.HasSuffix(inputString, ";") {
if buffer.Len() == 0 {
sqlArr = append(sqlArr, inputString)
} else {
buffer.WriteString(inputString)
sqlArr = append(sqlArr, buffer.String())
buffer.Reset()
}
} else {
buffer.WriteString(inputString + " ")
}
}
if !flag && strings.HasPrefix(inputString, "*/") {
flag = true
}
if !flag && strings.HasPrefix(inputString, "--") {
flag = true
}
if readerError == io.EOF {
break
}
}
return
}
// 创建数据库表
func (s *sysInit) CreateDataBase(ctx context.Context, dbName string) (err error) {
sqlArr, err := s.ReadSqlFile(SysInitConfig["sqlFilePath"].String())
if err != nil {
return
}
if len(sqlArr) == 0 {
return
}
// newSqlArr := SqlArr(sqlArr).Split(10)
db := g.DB()
for _, item := range sqlArr {
_, err = db.Exec(ctx, item)
if err != nil {
return
}
}
return
}
type SqlArr []string
func (arr SqlArr) Split(num int) (result SqlArr) {
if len(arr) == 0 {
return
}
var (
buffer bytes.Buffer
i int
)
for _, item := range arr {
buffer.WriteString(item)
i++
if i == num {
result = append(result, buffer.String())
buffer.Reset()
i = 0
}
}
if buffer.Len() > 0 {
result = append(result, buffer.String())
}
return
}