From e6a0963e1a1313d76d405f3ab31db54884dd308d Mon Sep 17 00:00:00 2001 From: Han Joker <540090808@qq.com> Date: Mon, 22 Jul 2024 17:06:33 +0800 Subject: [PATCH] basic code --- configs.yaml | 7 ++++ docker-compose.yaml | 14 +++++++ handlers/init.go | 17 +++++++++ handlers/system/router.go | 7 ++++ logs/app-202407.log | 2 + logs/app.log | 1 + utils/config.go | 30 +++++++++++++++ utils/db.go | 80 +++++++++++++++++++++++++++++++++++++++ utils/log.go | 64 +++++++++++++++++++++++++++++++ utils/mode.go | 22 +++++++++++ 10 files changed, 244 insertions(+) create mode 100644 configs.yaml create mode 100644 docker-compose.yaml create mode 100644 handlers/init.go create mode 100644 handlers/system/router.go create mode 100644 logs/app-202407.log create mode 100644 logs/app.log create mode 100644 utils/config.go create mode 100644 utils/db.go create mode 100644 utils/log.go create mode 100644 utils/mode.go diff --git a/configs.yaml b/configs.yaml new file mode 100644 index 0000000..94e4238 --- /dev/null +++ b/configs.yaml @@ -0,0 +1,7 @@ +app: + mode: "debug" # release, debug, test + addr: ":8084" + log: + path: "./logs" +db: + dsn: root:secret@tcp(localhost:3304)/gincms?charset=utf8mb4&parseTime=True&loc=Local \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..6056d6a --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,14 @@ +version: "3" + +services: + mysql: + image: mysql:8 + command: mysqld --character-set-server=utf8mb4 + restart: always + environment: + MYSQL_ROOT_PASSWORD: secret + MYSQL_DATABASE: gincms + ports: + - "3304:3306" + volumes: + - ./volumes/mysql/data:/var/lib/mysql \ No newline at end of file diff --git a/handlers/init.go b/handlers/init.go new file mode 100644 index 0000000..742472c --- /dev/null +++ b/handlers/init.go @@ -0,0 +1,17 @@ +package handlers + +import ( + "ginCms/handlers/system" + "github.com/gin-gonic/gin" +) + +// 初始化路由引擎 +func InitEngine() *gin.Engine { + // 1. 初始化路由引擎 + r := gin.Default() + + // 2. 注册不同模块的路由 + system.Router(r) + + return r +} diff --git a/handlers/system/router.go b/handlers/system/router.go new file mode 100644 index 0000000..8c02d61 --- /dev/null +++ b/handlers/system/router.go @@ -0,0 +1,7 @@ +package system + +import "github.com/gin-gonic/gin" + +func Router(r *gin.Engine) { + r.GET("/ping", Ping) +} diff --git a/logs/app-202407.log b/logs/app-202407.log new file mode 100644 index 0000000..e37be37 --- /dev/null +++ b/logs/app-202407.log @@ -0,0 +1,2 @@ +{"time":"2024-07-22T16:13:40.3400034+08:00","level":"INFO","msg":"service is listening","addr":":8084"} +{"time":"2024-07-22T16:18:14.1219434+08:00","level":"INFO","msg":"service is listening","addr":":8084"} diff --git a/logs/app.log b/logs/app.log new file mode 100644 index 0000000..68cbd00 --- /dev/null +++ b/logs/app.log @@ -0,0 +1 @@ +{"time":"2024-07-22T15:35:58.9737951+08:00","level":"INFO","msg":"service is listening","addr":":8084"} diff --git a/utils/config.go b/utils/config.go new file mode 100644 index 0000000..e188ca6 --- /dev/null +++ b/utils/config.go @@ -0,0 +1,30 @@ +package utils + +import ( + "github.com/spf13/viper" + "log" +) + +// 默认配置 +func defaultConfig() { + viper.SetDefault("app.mode", "debug") + viper.SetDefault("app.addr", ":8080") + viper.SetDefault("app.log.path", "./logs") + viper.SetDefault("db.dsn", "user:password@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local") +} + +// ParseConfig 解析配置 +func ParseConfig() { + // 1. 默认配置 + defaultConfig() + + // 2. 配置解析参数 + viper.AddConfigPath(".") // 从哪些目录搜索配置文件 + viper.SetConfigName("configs") // 配置文件名字 + viper.SetConfigType("yaml") // 配置类型(格式) + + // 3. 执行解析 + if err := viper.ReadInConfig(); err != nil { + log.Fatal(err) + } +} diff --git a/utils/db.go b/utils/db.go new file mode 100644 index 0000000..62f63fd --- /dev/null +++ b/utils/db.go @@ -0,0 +1,80 @@ +package utils + +import ( + "github.com/gin-gonic/gin" + "github.com/spf13/viper" + "gorm.io/driver/mysql" + "gorm.io/gorm" + gormLogger "gorm.io/gorm/logger" + "gorm.io/gorm/schema" + "log" + "time" +) + +// InitDB 初始化数据库连接 +func InitDB() { + // 1. 配置 + logLevel := gormLogger.Warn + // 根据应用的mod,控制级别 + switch gin.Mode() { + case gin.ReleaseMode: + logLevel = gormLogger.Warn + case gin.TestMode, gin.DebugMode: + fallthrough + default: + // 最多的日志 + logLevel = gormLogger.Info + } + // db 日志 + unionLogger := gormLogger.New( + log.New(LogWriter(), "\n", log.LstdFlags), + gormLogger.Config{ + SlowThreshold: time.Second, + Colorful: false, + IgnoreRecordNotFoundError: false, + ParameterizedQueries: false, + LogLevel: logLevel, + }, + ) + // gorm 连接配置 + conf := &gorm.Config{ + SkipDefaultTransaction: false, + NamingStrategy: schema.NamingStrategy{ + SingularTable: true, // 单数表名 + }, // 数据表命名策略 + FullSaveAssociations: false, + Logger: unionLogger, + NowFunc: nil, + DryRun: false, + PrepareStmt: false, + DisableAutomaticPing: false, + DisableForeignKeyConstraintWhenMigrating: true, // 数据表迁移时禁用外键约束 + IgnoreRelationshipsWhenMigrating: false, + DisableNestedTransaction: false, + AllowGlobalUpdate: false, + QueryFields: false, + CreateBatchSize: 0, + TranslateError: false, + PropagateUnscoped: false, + ClauseBuilders: nil, + ConnPool: nil, + Dialector: nil, + Plugins: nil, + } + + // 2. 创建db对象 + dsn := viper.GetString("db.dsn") + if dbNew, err := gorm.Open(mysql.Open(dsn), conf); err != nil { + log.Fatalln(err) + } else { + db = dbNew + } +} + +// 全局的db对象 +var db *gorm.DB + +// DB 全局访问db对象的方法 +func DB() *gorm.DB { + return db +} diff --git a/utils/log.go b/utils/log.go new file mode 100644 index 0000000..44c0cb1 --- /dev/null +++ b/utils/log.go @@ -0,0 +1,64 @@ +package utils + +import ( + "fmt" + "github.com/gin-gonic/gin" + "github.com/spf13/viper" + "io" + "log" + "log/slog" + "os" + "time" +) + +// SetLogger 设置日志 +func SetLogger() { + // 1. 设置集中的日志Writer + setLoggerWriter() + + // 2. 初始化 + initLogger() +} + +// logger +var logger *slog.Logger + +func Logger() *slog.Logger { + return logger +} + +// 公共的writer变量 +var logWriter io.Writer + +func LogWriter() io.Writer { + return logWriter +} + +// 设置writer +func setLoggerWriter() { + // 根据不同的mode,选择不同的writer + switch gin.Mode() { + case gin.ReleaseMode: + // 打开文件 + month := time.Now().Format("200601") + logfile := viper.GetString("app.log.path") + logfile += fmt.Sprintf("/app-%s.log", month) + + if file, err := os.OpenFile(logfile, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666); err != nil { + log.Println(err) + return + } else { + logWriter = file + } + case gin.TestMode, gin.DebugMode: + fallthrough + default: + logWriter = os.Stdout + } +} + +// 初始化日志 +func initLogger() { + // 使用json模式记录 + logger = slog.New(slog.NewJSONHandler(logWriter, &slog.HandlerOptions{})) +} diff --git a/utils/mode.go b/utils/mode.go new file mode 100644 index 0000000..2c98891 --- /dev/null +++ b/utils/mode.go @@ -0,0 +1,22 @@ +package utils + +import ( + "github.com/gin-gonic/gin" + "github.com/spf13/viper" + "strings" +) + +// SetMode 设置应用模式 +func SetMode() { + switch strings.ToLower(viper.GetString("app.mode")) { + case "release": + gin.SetMode(gin.ReleaseMode) + case "test": + gin.SetMode(gin.TestMode) + case "debug": + fallthrough + default: + gin.SetMode(gin.DebugMode) + } + +}