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
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 |
|
|
|
}
|
|
|