master
Han Joker 2 months ago
parent f3904d8eb5
commit e6a0963e1a

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

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

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

@ -0,0 +1,7 @@
package system
import "github.com/gin-gonic/gin"
func Router(r *gin.Engine) {
r.GET("/ping", Ping)
}

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

@ -0,0 +1 @@
{"time":"2024-07-22T15:35:58.9737951+08:00","level":"INFO","msg":"service is listening","addr":":8084"}

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

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

@ -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{}))
}

@ -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)
}
}
Loading…
Cancel
Save