(二)Go的Mysql、Redis、Cookie、Logger等的文件配置

初始化配置

在这里插入图片描述

文章目录

  • 初始化配置
    • 一、配置yaml文件
    • 二、Go读取配置文件
    • 三、初始化日志Logger
    • 四、初始化数据库(MySQL或SqlLite)
    • 五、初始化缓存(Redis)
    • 六、中间件服务(middleware)

一、配置yaml文件

Server:Mode: debug # 服务器模式,可选值为 debug 或 releasePort: :8765 # 服务器端口号DbType: "mysql" # 数据库类型,可选值为 mysql 或 sqliteDbAutoMigrate: true # 是否自动迁移数据库表结构,如果表结构没有变化,可以设为 false 提高启动速度DbLogMode: "error" # 数据库日志级别,可选值有 silent, error, warn, info, 默认为 infoJWT: # JWT 鉴权配置Secret: "abc123321" # JWT 密钥Expire: 24 # JWT 过期时间,单位为小时Issuer: "gin-vue-blog" # JWT 签发者Mysql: # MySQL 数据库配置Host: "127.0.0.1" # MySQL 主机地址Port: "3306" # MySQL 端口号Config: "charset=utf8mb4&parseTime=True&loc=Local" # MySQL 配置,例如字符集和时区设置Dbname: "gvb" # MySQL 数据库名称Username: "root" # MySQL 用户名Password: "123456" # MySQL 密码Sqlite: # SQLite 数据库配置Dsn: "gvb.db" # SQLite 数据库文件路径Redis: # Redis 缓存配置DB: 0 # Redis 数据库索引Addr: '' # Redis 服务器地址Password: '' # Redis 访问密码,如果没有设置密码则留空Session: # 会话(Session)配置Name: "mysession" # 会话名称Salt: "salt" # 加密盐MaxAge: 600 # 会话过期时间,单位为秒Log: # 日志配置Level: "debug" # 日志级别,可选值有 debug, info, warn, errorFormat: "text" # 日志格式,可选值有 text, jsonDirectory: "log" # 日志存储目录Email: # 邮件发送配置Host: "smtp.qq.com" # SMTP 服务器地址Port: 465 # SMTP 服务器端口号From: "" # 发件人邮箱IsSSL: true # 是否开启 SSLSecret: "" # SMTP 密钥Nickname: "" # 发件人昵称Captcha: # 验证码配置SendEmail: true # 是否通过邮件发送验证码ExpireTime: 5  # 验证码过期时间,单位为分钟Upload: # 文件上传配置OssType: "qiniu" # 文件上传类型,可选值为 local 或 qiniuPath: "public/uploaded" # 本地文件访问路径,OssType="local" 生效StorePath: "../public/uploaded" # 本地文件上传路径,相对于 main.go,OssType="local" 生效Qiniu: # 七牛云存储配置ImgPath: "" # 外链Zone: "z1" # 存储区域,可选值有 z0, z1, z2, na0, as0Bucket: "" # 存储空间名称AccessKey: "-" # 七牛云 AccessKeySecretKey: "" # 七牛云 SecretKeyUseHttps: false # 是否使用 HTTPS 协议进行图片上传和访问UseCdnDomains: false # 是否使用七牛云 CDN 加速域名

二、Go读取配置文件

1.结构体的定义

type Config struct {Server struct {Mode          string // debug | releasePort          stringDbType        string // mysql | sqliteDbAutoMigrate bool   // 是否自动迁移数据库表结构DbLogMode     string // silent | error | warn | info}Log struct {Level     string // debug | info | warn | errorPrefix    stringFormat    string // text | jsonDirectory string}JWT struct {Secret stringExpire int64 // hourIssuer string}Mysql struct {Host     string // 服务器地址Port     string // 端口Config   string // 高级配置Dbname   string // 数据库名Username string // 数据库用户名Password string // 数据库密码}SQLite struct {Dsn string // Data Source Name}Redis struct {DB       int    // 指定 Redis 数据库Addr     string // 服务器地址:端口Password string // 密码}Session struct {Name   stringSalt   stringMaxAge int}Email struct {To       string // 收件人 多个以英文逗号分隔 例:a@qq.com,b@qq.comFrom     string // 发件人 要发邮件的邮箱Host     string // 服务器地址, 例如 smtp.qq.com 前往要发邮件的邮箱查看其 smtp 协议Secret   string // 密钥, 不是邮箱登录密码, 是开启 smtp 服务后获取的一串验证码Nickname string // 发件人昵称, 通常为自己的邮箱名Port     int    // 前往要发邮件的邮箱查看其 smtp 协议端口, 大多为 465IsSSL    bool   // 是否开启 SSL}Captcha struct {SendEmail  bool // 是否通过邮箱发送验证码ExpireTime int  // 过期时间}Upload struct {// Size      int    // 文件上传的最大值OssType   string // local | qiniuPath      string // 本地文件访问路径StorePath string // 本地文件存储路径}Qiniu struct {ImgPath       string // 外链链接Zone          string // 存储区域Bucket        string // 空间名称AccessKey     string // 秘钥AKSecretKey     string // 秘钥SKUseHTTPS      bool   // 是否使用httpsUseCdnDomains bool   // 上传是否使用 CDN 上传加速}
}

2.从指定路径中读取配置信息到结构体里面

// 定义一个Public的变量
var Conf *Configfunc GetConfig() *Config {if Conf == nil {log.Panic("配置文件未初始化")return nil}return Conf
}// 从指定路径读取配置文件
func ReadConfig(path string) *Config {v := viper.New()v.SetConfigFile(path)v.AutomaticEnv()                                   // 允许使用环境变量v.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) // SERVER_APPMODE => SERVER.APPMODEif err := v.ReadInConfig(); err != nil {panic("配置文件读取失败: " + err.Error())}if err := v.Unmarshal(&Conf); err != nil {panic("配置文件反序列化失败: " + err.Error())}log.Println("配置文件内容加载成功: ", path)return Conf
}// 数据库类型
func (*Config) DbType() string {if Conf.Server.DbType == "" {Conf.Server.DbType = "sqlite"}return Conf.Server.DbType
}// 数据库连接字符串
func (*Config) DbDSN() string {switch Conf.Server.DbType {case "mysql":conf := Conf.Mysqlreturn fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?%s",conf.Username, conf.Password, conf.Host, conf.Port, conf.Dbname, conf.Config,)case "sqlite":return Conf.SQLite.Dsn// 默认使用 sqlite, 并且使用内存数据库default:Conf.Server.DbType = "sqlite"if Conf.SQLite.Dsn == "" {Conf.SQLite.Dsn = "file::memory:"}return Conf.SQLite.Dsn}
}

三、初始化日志Logger

在1.21.0版本后,go添加了slog的结构化日志库。故使用轻量级的日志库。

func InitLogger(conf *g.Config) *slog.Logger {var level slog.Level// 设置日志级别switch conf.Log.Level {case "debug":level = slog.LevelDebugcase "info":level = slog.LevelInfocase "warn":level = slog.LevelWarncase "error":level = slog.LevelErrordefault:level = slog.LevelInfo}option := &slog.HandlerOptions{AddSource: true, // 是否显示代码详细位置Level:     level,ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {if a.Key == slog.TimeKey {if t, ok := a.Value.Any().(time.Time); ok {a.Value = slog.StringValue(t.Format(time.DateTime))}}return a},}var handler slog.Handlerswitch conf.Log.Format {case "json":handler = slog.NewJSONHandler(os.Stdout, option)case "text":fallthroughdefault: //默认texthandler = slog.NewTextHandler(os.Stdout, option)}loggers := slog.New(handler)slog.SetDefault(loggers)return loggers
}

四、初始化数据库(MySQL或SqlLite)

func InitDatabase(conf *g.Config) *gorm.DB {dbtype := conf.DbType() // 数据库类型dsn := conf.DbDSN()     //DSNvar db *gorm.DBvar err errorvar level logger.LogLevelswitch conf.Server.DbLogMode {case "silent":level = logger.Silentcase "info":level = logger.Infocase "warn":level = logger.Warncase "error":fallthroughdefault:level = logger.Error}config := &gorm.Config{Logger:                                   logger.Default.LogMode(level),DisableForeignKeyConstraintWhenMigrating: true, // 禁用外键约束SkipDefaultTransaction:                   true, // 禁用默认事务(提高运行速度)NamingStrategy: schema.NamingStrategy{SingularTable: true, // 单数表名},}switch dbtype {case "mysql":db, err = gorm.Open(mysql.Open(dsn), config)case "sqlite":db, err = gorm.Open(sqlite.Open(dsn), config)default:log.Fatal("不支持的数据库类型: ", dbtype)}if err != nil {log.Fatal("数据库连接失败", err)}log.Println("数据库连接成功", dbtype, dsn)if conf.Server.DbAutoMigrate {if err := model.MakeMigrate(db); err != nil {log.Fatal("数据库迁移失败", err)}log.Println("数据库自动迁移成功")}return db
}

五、初始化缓存(Redis)

func InitRedis(conf *g.Config) *redis.Client {rdb := redis.NewClient(&redis.Options{Addr:     conf.Redis.Addr,Password: conf.Redis.Password,DB:       conf.Redis.DB,})_, err := rdb.Ping(context.Background()).Result()if err != nil {log.Fatal("Redis 连接失败: ", err)}log.Println("Redis 连接成功", conf.Redis.Addr, conf.Redis.DB, conf.Redis.Password)return rdb
}

六、中间件服务(middleware)

1.跨域请求

func CORS() gin.HandlerFunc {return cors.New(cors.Config{AllowOrigins:     []string{"*"},AllowMethods:     []string{"PUT", "POST", "GET", "DELETE", "OPTIONS", "PATCH"},AllowHeaders:     []string{"Origin", "Authorization", "Content-Type", "X-Requested-With"},ExposeHeaders:    []string{"Content-Type"},AllowCredentials: true,AllowOriginFunc: func(origin string) bool {return true},MaxAge: 24 * time.Hour,})
}

2.绑定db,将*gorm.DB绑定到context的g.CTX_DB键上

func WithGormDB(db *gorm.DB) gin.HandlerFunc {return func(ctx *gin.Context) {ctx.Set(g.CTX_DB, db)ctx.Next()}
}

3.绑定Redis

func WithRedisDB(rdb *redis.Client) gin.HandlerFunc {return func(ctx *gin.Context) {ctx.Set(g.CTX_RDB, rdb)ctx.Next()}
}

4.设置cookie,用于在请求和响应之间存储会话信息

func WithCookieStore(name, secret string) gin.HandlerFunc {store := cookie.NewStore([]byte(secret))store.Options(sessions.Options{Path: "/", MaxAge: 600})return sessions.Sessions(name, store)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/2796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Github进行fork后如何与原仓库同步

前言 fork了一个仓库以后怎么同步源仓库的代码? 步骤 1、执行命令 git remote -v 查看你的远程仓库的路径。 以一个实际例子说明, 来源仓库: TheFirstLineOfCode/basaltgit remote -v得到: origin https://github.com/ghmi…

53.基于微信小程序与SpringBoot的戏曲文化系统设计与实现(项目 + 论文)

项目介绍 本站采用SpringBoot Vue框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得基于SpringBoot Vue技术的戏曲文化系统设计与实现管理工作系统化、规范化。 技术选型 后端:…

【Linux】日志分析与管理

作为一个运维,如果不会看日志,就好比是冬天刚刚用热水泡完了脚,接着就立马让人把水喝掉。 目录 一、Inode介绍 1.1 什么是inode 1.2 inode表内容 1.3 查看inode号的方式 二、日志分析 2.1 日志的用途 2.2 日志的分类 2.3 日志级别 2…

MATLAB基于图像特征的火灾检测

实验目标 基于图像特征的火灾检测 实验环境 Windows电脑、MATLAB R2020a 实验内容 1.读取图像,彩色图像的灰度化处理,进行边缘检测,实现对火焰的检测。 2.对两幅RGB图像进行火焰特征提取实验 3.对比分析边缘检测算法处理结果和基于图像…

比赛记录:Codeforces Round 940 (Div. 2) and CodeCraft-23 A~E

传送门:CF [前题提要]:感觉这场题目其实都很经典.遗憾的是赛时C题答案统计看成了不同的下棋的方案数,然后以为刚开始不能放不是一种答案(直接特判输出了0),卡了一场比赛.幸好最后15min险过CD,不然掉大分了 A. Stickogon 难点在于读懂题意. 读懂题意之后不难发现每根木棒都形成…

Git--原理与使用

目录 一、课程目标二、初始Git三、安装Git3.1 Linux-centos 四、Git的基本操作4.1 创建Git本地仓库 五、配置Git六、认识工作区、暂存区、版本库七、添加文件八、查看.git九、修改文件十、版本回退十一、撤销修改11.1 情况一:对于工作区的代码,还有add11…

阿斯达年代记三强争霸加速器用什么好 超好用的免费加速器

阿斯达年代记:三强争霸的核心玩法围绕着阿斯达大陆上的权力斗争,玩家将投身于三大势力——阿斯达联邦、亚高同盟及边缘叛军之间错综复杂的竞争之中。每个阵营都有其独特的背景故事、目标和战略,玩家的选择不仅影响个人的游戏进程,…

【IC设计】奇数分频与偶数分频 电路设计(含讲解、RTL代码、Testbench代码)

文章目录 原理分析实现和仿真偶数分频的电路RTL代码偶数分频的电路Testbench代码偶数分频的电路仿真波形占空比为50%的三分频电路RTL代码占空比为50%的三分频电路Testbench代码占空比为50%的三分频电路仿真波形 参考资料 原理分析 分频电路是将给定clk时钟信号频率降低为div_c…

【STM32+HAL+Proteus】系列学习教程---串口USART(DMA 方式)定长,不定长收发。

实现目标 1、利用UART实现上位机PC与下位机开发板之间的数据通信 2、学会STM32CubeMX软件关于UART的DMA模式配置 3、具体目标:1、实现串口定长收发数据通信;2、串口不定长收发数据通信。 一、DMA简介 1、什么是DMA? DMA(Direct Memory …

多级嵌套对象数组:根据最里层id找出它所属的每层父级,适用于树形数据格式

文章目录 需求分析 需求 已知一个树形格式数据如下: // 示例数据 const data [{"id": "1","parentId": null,"children": [{"id": "1.1","parentId": "1","children"…

2024土木工程、城市规划与交通运输国际会议(ICCEUPT2024)

2024土木工程、城市规划与交通运输国际会议(ICCEUPT2024) 会议简介 我们诚挚邀请您参加2024年国际土木工程、城市规划和交通会议(ICCEUPT2024)。本次大会将在北京隆重举行,旨在搭建交流合作平台,汇聚行业精英,共同…

uniapp开发微信小程序图片太大处理

一、图片太大 压缩图片如果使用的蓝湖可以使用压缩(看你小程序使用的图片是否有清晰度要求) 没有使用蓝湖的可以使用压缩图片:在线缩小图片大小(免费)该链接压缩压缩后如果还是大的话查看图片的尺寸是否太大&am…

社科大与美国杜兰大学金融管理硕士——成为自己的光,独立又明亮

随着全球化的发展,金融管理成为了全球范围内备受瞩目的领域。无论是企业还是国家,都需要专业的金融管理人才来推动经济发展。在这样的背景下,社科大与美国杜兰大学联合推出的金融管理硕士项目备受关注。你想知道金融管理硕士项目的意义和价值…

求臻医学MRD产品斩获2023年度肿瘤标志物年度十大创新技术产品奖

2024年4月20日,中国肿瘤标志物学术大会开幕式暨名家讲坛在南京隆重召开! 会议期间,中国抗癌协会肿瘤标志专业委员会联合中国抗癌协会肿瘤临床检验与伴随诊断专业委员会、中国抗癌协会肿瘤基因诊断专业委员等共同发布“2023 年度肿瘤标志物创新技术产品”…

gps路径压缩算法

公司的gps点位特别多,导致数据存储以及查询都会造成一定的压力. 所以我们需要使用gps路径压缩算法 我调研了两种: k-means 和 Douglas-Peucker k-means 压缩的底层原理是: 自定义簇的数量,假设是100个,那么就会计算所有gps点,把最相近的点,放在一个簇里,以此类推,计算出100个…

适合普通人的黄金投资品种有哪些?

黄金一直以来都是投资者眼中的避险资产,无论是经济波动还是通货膨胀,它总能保持其独特的价值。对于普通人而言,投资黄金似乎是一件遥不可及的事情,但其实只要选对品种,普通投资者也可以轻松参与其中。在当前市场上&…

初学python记录:力扣2385. 感染二叉树需要的总时间

题目: 给你一棵二叉树的根节点 root ,二叉树中节点的值 互不相同 。另给你一个整数 start 。在第 0 分钟,感染 将会从值为 start 的节点开始爆发。 每分钟,如果节点满足以下全部条件,就会被感染: 节点此…

[GXYCTF2019]BabyUpload-BUUTF

题&#xff1a; 步骤&#xff08;先上传木马&#xff0c;在上传.htaccess&#xff09; 准备工作 他过滤了<? ,ph等 准备&#xff1a;一句话木马&#xff0c;.htaccess文件 .htaccess SetHandler application/x-httpd-php //解析为php文件 muma1.jpg<script languag…

【文件IO】 文件系统的操作 | 文件类型 | File的构造和方法 | 字节流 | 字符流 | InputStream | OutStream

文章目录 [toc] 文件IO一、文件的概念文件系统文件路径&#xff1a;文件类型 二、文件操作1.文件系统的操作&#xff1a;File的构造和方法创建文件删除文件等线程结束后删除文件列出目录内容创建目录重命名 2.文件内容的操作&#xff1a;1.字节流&#xff1a;对应二进制文件Inp…

数睿通2.0版本升级:探索数据血缘的奥秘

引言 数睿通 2.0 迎来了 4 月份的更新&#xff0c;该版本更新了许多用户期望的数据血缘模块&#xff0c;把原来外链跳转 neo4j 页面改为自研页面&#xff0c;方便后期的二次开发完善&#xff0c;此外&#xff0c;新版本摒弃了 neo4j 的血缘数据存储方案&#xff0c;一来是因为…