mirror of
https://github.com/tiger1103/gfast.git
synced 2026-09-22 10:33:11 +00:00
系统初始化
This commit is contained in:
@@ -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
|
||||
}
|
||||
@@ -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拦截器
|
||||
|
||||
@@ -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
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user