新增了接口

This commit is contained in:
2024-12-30 16:34:26 +08:00
parent e6e78ad658
commit 60850d98da
153 changed files with 10293 additions and 5 deletions
+15
View File
@@ -0,0 +1,15 @@
package core
import (
"fmt"
"github.com/robfig/cron/v3"
)
func StartCron() {
c := cron.New(cron.WithSeconds())
// 启动定时任务调度器
c.Start()
fmt.Println("初始化定时器成功......")
}
+46
View File
@@ -0,0 +1,46 @@
package core
import (
"case-open-api/config"
"case-open-api/global"
"github.com/sirupsen/logrus"
"os"
"path"
"path/filepath"
)
// Logrus 日志记录到文件
func Logrus() *logrus.Logger {
// 日志文件
fileName := path.Join(config.C.Log.FilePath, config.C.Log.FileName)
// 获取文件夹路径
dirPath := filepath.Dir(fileName)
// 创建文件夹(如果不存在)
err := os.MkdirAll(dirPath, os.ModePerm)
if err != nil {
panic("初始化日志文件失败")
}
// 写入文件
src, err := os.OpenFile(fileName, os.O_CREATE|os.O_APPEND|os.O_RDWR, os.ModePerm)
if err != nil {
panic("初始化日志文件失败")
}
global.Logger = logrus.New()
// 设置输出
global.Logger.Out = src
// 设置日志级别
global.Logger.SetLevel(logrus.DebugLevel)
// 设置日志格式
global.Logger.SetFormatter(&logrus.TextFormatter{
TimestampFormat: "2006-01-02 15:04:05",
})
return global.Logger
}
+56
View File
@@ -0,0 +1,56 @@
package core
import (
"case-open-api/config"
"case-open-api/global"
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"time"
)
func Mysql() {
var err error
m := config.C.Mysql
dsn := fmt.Sprintf("%s:%s@(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s", m.Username,
m.Password, m.Host, m.Port, m.DbName, "10s")
// newLogger := logger.New(
// global.Logger,
// logger.Config{
// SlowThreshold: time.Second, // Slow SQL threshold
// LogLevel: logger.Info, // Log level
// IgnoreRecordNotFoundError: true, // Ignore ErrRecordNotFound error for logger
// ParameterizedQueries: false, // Don't include params in the SQL log
// Colorful: false, // Disable color
// },
// )
global.Db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logger.Info),
// Logger: newLogger,
})
if err != nil {
fmt.Println(err.Error())
panic(err.Error())
}
sqlDB, _ := global.Db.DB()
// SetMaxIdleConns 设置空闲连接池中连接的最大数量
sqlDB.SetMaxIdleConns(m.MaxIdleConns)
// SetMaxOpenConns 设置打开数据库连接的最大数量。
sqlDB.SetMaxOpenConns(m.MaxOpenConns)
// SetConnMaxLifetime 设置了连接可复用的最大时间。
sqlDB.SetConnMaxLifetime(time.Hour)
// 调试模式
//Db.LogMode(m.Debug) // 打印sql
// Db.SingularTable(true) // 全局禁用表名复数
fmt.Println("初始化数据库成功......")
}
+25
View File
@@ -0,0 +1,25 @@
package core
import (
"case-open-api/config"
"case-open-api/global"
"context"
"fmt"
"github.com/go-redis/redis/v8"
"strconv"
)
// Redis redis缓存
func Redis() {
global.Redis = redis.NewClient(&redis.Options{
Addr: config.C.Redis.Host + ":" + strconv.Itoa(config.C.Redis.Port),
Password: config.C.Redis.Password,
DB: config.C.Redis.Db,
PoolSize: config.C.Redis.PoolSize,
})
_, err := global.Redis.Ping(context.Background()).Result()
if err != nil {
panic("redis初始化失败! " + err.Error())
}
fmt.Println("初始化redis成功......")
}
+21
View File
@@ -0,0 +1,21 @@
package core
import (
"case-open-api/config"
"case-open-api/global"
"fmt"
"github.com/bwmarrin/snowflake"
)
// Snowflake 雪花算法
func Snowflake() {
// 创建雪花算法实例
node, err := snowflake.NewNode(config.C.Snowflake)
if err != nil {
panic("snowflake初始化失败! " + err.Error())
}
global.Snowflake = node
fmt.Println("初始化snowflake成功......")
}
+95
View File
@@ -0,0 +1,95 @@
package core
import (
"case-open-api/global"
"case-open-api/utils"
"github.com/go-playground/locales/zh"
ut "github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
zhTranslations "github.com/go-playground/validator/v10/translations/zh"
"reflect"
)
// Validator 验证器
func Validator() {
chzh := zh.New()
uni := ut.New(chzh, chzh)
global.Trans, _ = uni.GetTranslator("zh")
global.Validate = validator.New()
// 通过label标签返回自定义错误内容
global.Validate.RegisterTagNameFunc(func(field reflect.StructField) string {
label := field.Tag.Get("label")
if label == "" {
return field.Name
}
return label
})
_ = zhTranslations.RegisterDefaultTranslations(global.Validate, global.Trans)
// 注册自定义函数和标签
// 手机号验证
_ = global.Validate.RegisterValidation("Mobile", mobile) // 注册自定义函数,前一个参数是struct里tag自定义,后一个参数是自定义的函数
// 自定义required错误内容
_ = global.Validate.RegisterTranslation("required", global.Trans, func(ut ut.Translator) error {
return ut.Add("required", "{0}为必填字段!", false) // see universal-translator for details
}, func(ut ut.Translator, fe validator.FieldError) string {
t, _ := ut.T("required", fe.Field())
return t
})
// 自定义max错误内容
_ = global.Validate.RegisterTranslation("max", global.Trans, func(ut ut.Translator) error {
return ut.Add("max", "{0}超出最大长度", false) // see universal-translator for details
}, func(ut ut.Translator, fe validator.FieldError) string {
t, _ := ut.T("max", fe.Field())
return t
})
// 自定义min错误内容
_ = global.Validate.RegisterTranslation("min", global.Trans, func(ut ut.Translator) error {
return ut.Add("min", "{0}超出最小长度", false) // see universal-translator for details
}, func(ut ut.Translator, fe validator.FieldError) string {
t, _ := ut.T("min", fe.Field())
return t
})
// 自定义lt错误内容
_ = global.Validate.RegisterTranslation("lt", global.Trans, func(ut ut.Translator) error {
return ut.Add("lt", "{0}超出最大值", false) // see universal-translator for details
}, func(ut ut.Translator, fe validator.FieldError) string {
t, _ := ut.T("lt", fe.Field())
return t
})
// 自定义min错误内容
_ = global.Validate.RegisterTranslation("gt", global.Trans, func(ut ut.Translator) error {
return ut.Add("gt", "{0}不满足最小值", false) // see universal-translator for details
}, func(ut ut.Translator, fe validator.FieldError) string {
t, _ := ut.T("gt", fe.Field())
return t
})
// 自定义email错误内容
_ = global.Validate.RegisterTranslation("email", global.Trans, func(ut ut.Translator) error {
return ut.Add("email", "{0}邮件格式错误", false) // see universal-translator for details
}, func(ut ut.Translator, fe validator.FieldError) string {
t, _ := ut.T("email", fe.Field())
return t
})
// 自定义mobile错误内容
_ = global.Validate.RegisterTranslation("Mobile", global.Trans, func(ut ut.Translator) error {
return ut.Add("mobile", "手机号格式错误", false) // see universal-translator for details
}, func(ut ut.Translator, fe validator.FieldError) string {
t, _ := ut.T("mobile", fe.Field())
return t
})
}
// 自定义手机号验证
func mobile(fl validator.FieldLevel) bool {
return utils.RegexpMobile(fl.Field().String())
}
+41
View File
@@ -0,0 +1,41 @@
package core
import (
"case-open-api/config"
"fmt"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
)
// Viper 初始化配置文件
func Viper() {
// 如需增加环境判断 在此处增加
// 可根据 命令行 > 环境变量 > 默认值 等优先级进行判别读取
viper.New()
viper.SetConfigName("config")
viper.AddConfigPath("./")
viper.SetConfigType("yaml")
if err := viper.ReadInConfig(); err != nil {
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
panic("未找到该文件")
} else {
panic("读取失败")
}
}
// 将读取的配置信息保存至全局变量Conf
if err := viper.Unmarshal(&config.C); err != nil {
panic(fmt.Errorf("解析配置文件失败, err:%s \n", err))
}
// 自动监听配置修改
viper.WatchConfig()
// 配置文件发生变化后同步到全局变量Conf
viper.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("config file changed:", e.Name)
if err := viper.Unmarshal(&config.C); err != nil {
panic(fmt.Errorf("重载配置文件失败, err:%s \n", err))
}
})
}