系统初始化

This commit is contained in:
wilgx0
2022-04-22 17:18:40 +08:00
parent 6b1a05ae42
commit 6afe7740d9
10 changed files with 1002 additions and 3 deletions
@@ -0,0 +1,67 @@
package controller
import (
"context"
"github.com/shirou/gopsutil/host"
"github.com/tiger1103/gfast/v3/api/v1/system"
"github.com/tiger1103/gfast/v3/internal/app/system/service"
"runtime"
)
var DbInit = &sysDbInitController{}
type sysDbInitController struct {
BaseController
}
// 系统是否已经初始化
func (c *sysDbInitController) IsInit(ctx context.Context, req *system.DbInitIsInitReq) (res *system.DbInitIsInitRes, err error) {
res = new(system.DbInitIsInitRes)
// autoInit=false则前端将不走自动初始化的流程
if service.SysInitConfig["autoInit"].Bool() == false {
*res = system.DbInitIsInitRes(true)
return
}
// 判断是否已经生成配置文件
*res = system.DbInitIsInitRes(service.SysInit().IsCreateConfigFile())
return
}
// 获取环境检测信息
func (c *sysDbInitController) GetEnvInfo(ctx context.Context, req *system.DbInitGetEnvInfoReq) (res *system.DbInitGetEnvInfoRes, err error) {
sysInfo, err := host.Info()
if err != nil {
return
}
res = new(system.DbInitGetEnvInfoRes)
*res = system.DbInitGetEnvInfoRes{
"sysOsName": sysInfo.OS,
"goVersion": runtime.Version(),
}
return
}
// 创建配置文件及数据库等
func (c *sysDbInitController) CreateDb(ctx context.Context, req *system.DbInitCreateDbReq) (res *system.DbInitCreateDbRes, err error) {
// 生成配置文件
err = service.SysInit().CreateConfigFile(ctx, req)
if err != nil {
return
}
// 加载配置文件
err = service.SysInit().LoadConfigFile()
if err != nil {
return
}
// 生成数据库
err = service.SysInit().CreateDataBase(ctx, req.DbName)
if err != nil {
return
}
res = new(system.DbInitCreateDbRes)
*res = true
return
}
+4
View File
@@ -17,6 +17,10 @@ import (
func BindController(group *ghttp.RouterGroup) {
group.Group("/system", func(group *ghttp.RouterGroup) {
group.Middleware(commonService.Middleware().MiddlewareCORS)
// 系统初始化
group.Bind(
controller.DbInit,
)
//登录验证拦截
service.GfToken().Middleware(group)
//context拦截器
+213
View File
@@ -0,0 +1,213 @@
package service
import (
"bufio"
"bytes"
"context"
"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"
"github.com/tiger1103/gfast/v3/api/v1/system"
"github.com/tiger1103/gfast/v3/library/libUtils"
"gopkg.in/yaml.v2"
"io"
"os"
"strings"
"time"
)
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
}
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) 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
}