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.

117 lines
4.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package bootstrap
import (
_ "goskeleton/app/core/destroy" // 监听程序退出信号,用于资源的释放
"goskeleton/app/global/my_errors"
"goskeleton/app/global/variable"
"goskeleton/app/http/validator/common/register_validator"
"goskeleton/app/service/sys_log_hook"
"goskeleton/app/utils/casbin_v2"
"goskeleton/app/utils/gorm_v2"
"goskeleton/app/utils/snow_flake"
"goskeleton/app/utils/validator_translation"
"goskeleton/app/utils/websocket/core"
"goskeleton/app/utils/yml_config"
"goskeleton/app/utils/zap_factory"
"log"
"os"
)
// 检查项目必须的非编译目录是否存在,避免编译后调用的时候缺失相关目录
func checkRequiredFolders() {
//1.检查配置文件是否存在
if _, err := os.Stat(variable.BasePath + "/config/config.yml"); err != nil {
log.Fatal(my_errors.ErrorsConfigYamlNotExists + err.Error())
}
if _, err := os.Stat(variable.BasePath + "/config/gorm_v2.yml"); err != nil {
log.Fatal(my_errors.ErrorsConfigGormNotExists + err.Error())
}
//2.检查public目录是否存在
if _, err := os.Stat(variable.BasePath + "/public/"); err != nil {
log.Fatal(my_errors.ErrorsPublicNotExists + err.Error())
}
//3.检查storage/logs 目录是否存在
if _, err := os.Stat(variable.BasePath + "/storage/logs/"); err != nil {
log.Fatal(my_errors.ErrorsStorageLogsNotExists + err.Error())
}
// 4.自动创建软连接、更好的管理静态资源
if _, err := os.Stat(variable.BasePath + "/public/storage"); err == nil {
if err = os.RemoveAll(variable.BasePath + "/public/storage"); err != nil {
log.Fatal(my_errors.ErrorsSoftLinkDeleteFail + err.Error())
}
}
if err := os.Symlink(variable.BasePath+"/storage/app", variable.BasePath+"/public/storage"); err != nil {
log.Fatal(my_errors.ErrorsSoftLinkCreateFail + err.Error())
}
}
func init() {
// 1. 初始化 项目根路径,参见 variable 常量包相关路径app\global\variable\variable.go
//2.检查配置文件以及日志目录等非编译性的必要条件
checkRequiredFolders()
//3.初始化表单参数验证器注册在容器Web、Api共用容器
register_validator.WebRegisterValidator()
register_validator.ApiRegisterValidator()
// 4.启动针对配置文件(confgi.yml、gorm_v2.yml)变化的监听, 配置文件操作指针,初始化为全局变量
variable.ConfigYml = yml_config.CreateYamlFactory()
variable.ConfigYml.ConfigFileChangeListen()
// config>gorm_v2.yml 启动文件变化监听事件
variable.ConfigGormv2Yml = variable.ConfigYml.Clone("gorm_v2")
variable.ConfigGormv2Yml.ConfigFileChangeListen()
// 5.初始化全局日志句柄,并载入日志钩子处理函数
variable.ZapLog = zap_factory.CreateZapFactory(sys_log_hook.ZapLogHandler)
// 6.根据配置初始化 gorm mysql 全局 *gorm.Db
if variable.ConfigGormv2Yml.GetInt("Gormv2.Mysql.IsInitGlobalGormMysql") == 1 {
if dbMysql, err := gorm_v2.GetOneMysqlClient(); err != nil {
log.Fatal(my_errors.ErrorsGormInitFail + err.Error())
} else {
variable.GormDbMysql = dbMysql
}
}
// 根据配置初始化 gorm sqlserver 全局 *gorm.Db
if variable.ConfigGormv2Yml.GetInt("Gormv2.Sqlserver.IsInitGlobalGormSqlserver") == 1 {
if dbSqlserver, err := gorm_v2.GetOneSqlserverClient(); err != nil {
log.Fatal(my_errors.ErrorsGormInitFail + err.Error())
} else {
variable.GormDbSqlserver = dbSqlserver
}
}
// 根据配置初始化 gorm postgresql 全局 *gorm.Db
if variable.ConfigGormv2Yml.GetInt("Gormv2.PostgreSql.IsInitGlobalGormPostgreSql") == 1 {
if dbPostgre, err := gorm_v2.GetOnePostgreSqlClient(); err != nil {
log.Fatal(my_errors.ErrorsGormInitFail + err.Error())
} else {
variable.GormDbPostgreSql = dbPostgre
}
}
// 7.雪花算法全局变量
variable.SnowFlake = snow_flake.CreateSnowflakeFactory()
// 8.websocket Hub中心启动
if variable.ConfigYml.GetInt("Websocket.Start") == 1 {
// websocket 管理中心hub全局初始化一份
variable.WebsocketHub = core.CreateHubFactory()
if Wh, ok := variable.WebsocketHub.(*core.Hub); ok {
go Wh.Run()
}
}
// 9.casbin 依据配置文件设置参数(IsInit=1)初始化
if variable.ConfigYml.GetInt("Casbin.IsInit") == 1 {
var err error
if variable.Enforcer, err = casbin_v2.InitCasbinEnforcer(); err != nil {
log.Fatal(err.Error())
}
}
//10.全局注册 validator 错误翻译器,zh 代表中文en 代表英语
if err := validator_translation.InitTrans("zh"); err != nil {
log.Fatal(my_errors.ErrorsValidatorTransInitFail + err.Error())
}
}