GinVueAdmin源码分析1-Viper配置

news/2024/3/29 19:17:03/文章来源:https://blog.csdn.net/delete_you/article/details/129135222

目录

      • 文件结构
      • config.yaml
      • global.go
      • 定义结构体
      • 常量域
      • viper.go
      • 主入口

文件结构

本节将完全按照 ginvueadmin 中配置 viper 的方式作为详解,同时分析 config.yaml

本小节用到的所有文件及其对应作用
路径起点为项目根目录

路径及文件名作用
main.go主入口
config.yaml配置文件
global\global.go全局变量
core\viper.go初始化 viper
core\constant.go常量定义
config\config.go管理全部的配置
config\jwt.goconfig 下辖 jwt 对象
config\local.goconfig 下辖 local 对象
config\system.goconfig 下辖 system 对象

config.yaml

根目录下新建文件 config.yaml

没什么可说的,编写配置文件

这里写了三个对象,这三个对象也是我们后续需要定义的三个结构体

jwt:signing-key: signJwtexpires-time: 2dbuffer-time: 1dissuer: zhillersystem:port: 10086local:path: uploads/filestore-path: uploads/file

global.go

新建文件 global/global.go

在这定义全部的全局变量,后续将在主入口中执行对应初始化过程

这里定义了三个全局变量,我们此次仅需要使用 G_VIPER

import ("ginlogin/config""github.com/spf13/viper""gorm.io/gorm""sync"
)var (G_DB     *gorm.DB		// 数据库G_VIPER  *viper.Viper	// viper原始对象G_CONFIG config.Server	// 序列化后的对象,之后存取变量都用它lock sync.RWMutex
)

定义结构体

以下四个文件存放于 config 文件夹下

我们注意到之前在 config.yaml 中定义了四个对象 jwt、local、system
当我们使用 viper 实例进行数据读取时,一般都会指定数据类型(比如 viper.GetString(“xxx”)),非常麻烦
而为每一个配置项都定义一个结构体,在结构体内就把类型都定义好,使用 viper 的 unmarshal 方法将 config.yaml 中的配置项一一映射到结构体内,之后随取随用即可

接下来我们就需要为这三个对象定义对应的结构体,除此之外 config.yaml 还需要配置一个单独的总结构体
结构体之间是嵌套的,不可以缺少任意一个,否则 unmarshal 会报错

首先是 config.yaml 整体的结构

// 文件 config.go
type Server struct {JWT    JWT    `mapstructure:"jwt" json:"jwt" yaml:"jwt"`System System `mapstructure:"system" json:"system" yaml:"system"`Local  Local  `mapstructure:"local" json:"local" yaml:"local"`
}

接下来就是三个对象

// 文件 jwt.go
type JWT struct {SigningKey  string `mapstructure:"signing-key" json:"signing-key" yaml:"signing-key"`    // jwt签名ExpiresTime string `mapstructure:"expires-time" json:"expires-time" yaml:"expires-time"` // 过期时间BufferTime  string `mapstructure:"buffer-time" json:"buffer-time" yaml:"buffer-time"`    // 缓冲时间Issuer      string `mapstructure:"issuer" json:"issuer" yaml:"issuer"`                   // 签发者
}
// 文件 local.go
type Local struct {Path      string `mapstructure:"path" json:"path" yaml:"path"`                   // 本地文件访问路径StorePath string `mapstructure:"store-path" json:"store-path" yaml:"store-path"` // 本地文件存储路径
}
// 文件 system.go
type System struct {PORT int `mapstructure:"port" json:"port" yaml:"port"`
}

常量域

新建存储常量的文件 core/constant.go

由于 config.yaml 本来就在根目录,所以路径直接写文件名即可

const (CONFIG_PATH = "config.yaml"
)

viper.go

import ("fmt""ginlogin/global""github.com/fsnotify/fsnotify""github.com/spf13/viper"
)func Viper() *viper.Viper {// 实例化viper对象,指定文件路径以及对应的文件类型v := viper.New()v.SetConfigFile(CONFIG_PATH)v.SetConfigType("yaml")// 读配置文件err := v.ReadInConfig()if err != nil {fmt.Errorf("发生错误:%s \n", err)}// 监听配置文件的变化v.WatchConfig()// 每次修改配置文件中的配置项,都重新unmarshal一次v.OnConfigChange(func(evt fsnotify.Event) {fmt.Println("配置文件发生改变", evt.Name)// 注意使用 & 引用if err = v.Unmarshal(&global.G_CONFIG); err != nil {fmt.Println(err)}})// 首次unmarshalif err = v.Unmarshal(&global.G_CONFIG); err != nil {fmt.Println(err)}// viper配置完毕后我们说一句话,证明成功配置了fmt.Println("当前服务器运行端口:", global.G_CONFIG.System.PORT)// 返回viper实例return v
}

主入口

根目录下 main.go

为 viper 全局变量赋予指定实例

import ("ginlogin/core""ginlogin/global"
)func main() {global.G_VIPER = core.Viper()...
}

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

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

相关文章

Windows下载安装Prometheus

目录 资料 下载 解压 点击prometheus.exe运行 资料 Prometheus是一个开源的系统监控和报警系统,同时也支持多种exporter采集数据,还支持pushgateway进行数据上报,Prometheus性能足够支撑上万台规模的集群。 官网:https://pr…

阿里大数据之路总结

一、数据采集 二、数据同步 2.1、数据同步方式: 数据同步的三种方式:直连方式、数据文件同步、数据库日志解析方式 关系型数据库的结构化数据:MYSQL、Oracle、DB2、SQL Server非关系型数据库的非结构化数据(数据库表形式存储&am…

【ESP 保姆级教程】疯狂毕设篇 —— 案例:基于ESP8266和EMQX的教室灯光控制系统

忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-02-26 ❤️❤️ 本篇更新记录 2022-02-26 ❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请…

智慧物联网源码带手机端源码 物联网系统源码

在智慧工厂领域,智慧城市领域,都需要对设备进行监控。比如工厂需要对周围环境温度、湿度、气压、电压,灯的开关进行监控。这时候就需要物联网平台来进行管理。 推荐一个基于java开发的物联网平台,前端HTML带云组态、可接入视频监…

酷炫的数据可视化,背后的制作工具究竟是什么?

数据可视化已经成为当代互联网的热词,不论是哪个行业都在使用。那么背后制作出数据可视化的可视化工具是什么呢?它又有哪些呢? 一、可视化工具是什么 可视化工具其实是 Visual Studio 调试器用户界面的组件,听起来很复杂对吧。但…

图节点嵌入相关算法学习笔记

引言 本篇笔记为coggle 2月打卡任务,正好也在学习cs224w,干脆就一起做了,以下是任务列表: 任务名称难度任务1:图属性与图构造低、1任务2:图查询与遍历低、2任务3:节点中心性与应用中、2任务4&…

redis(10)事务和锁机制

Redis事务定义 Redis 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 Redis 事务的主要作用就是串联多个命令防止别的命令插队。 Multi、Exec、discard Redis 事务中…

15 Nacos客户端实例注册源码分析

Nacos客户端实例注册源码分析 实例客户端注册入口 流程图&#xff1a; 实际上我们在真实的生产环境中&#xff0c;我们要让某一个服务注册到Nacos中&#xff0c;我们首先要引入一个依赖&#xff1a; <dependency><groupId>com.alibaba.cloud</groupId>&l…

idea debug elasticsearch8.6.2 源码

前置依赖&#xff1a; gradle 7.5.1&#xff1a;Gradle | Releases openJDK 17&#xff1a;https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.exe idea&#xff1a;IntelliJ IDEA 2022.1 (Ultimate Edition) 1、下载源码 8.6.2 zip包 并解压 地址&…

在 Flutter 中使用 webview_flutter 4.0 | 基础用法与事件处理

大家好&#xff0c;我是 17。 Flutter WebView 一共写了四篇文章 在 Flutter 中使用 webview_flutter 4.0 | 基础用法与事件处理在 Flutter 中使用 webview_flutter 4.0 | js 交互Flutter WebView 性能优化&#xff0c;让 h5 像原生页面一样优秀&#xff0c;已入选 掘金一周 …

「回顾RKDC2023」飞凌嵌入式受邀亮相第七届瑞芯微开发者大会

2023年2月23-24日&#xff0c;第七届瑞芯微开发者大会&#xff08;RKDC2023&#xff09;在福州隆重举行&#xff0c;飞凌嵌入式作为瑞芯微生态合作伙伴受邀参会&#xff0c;并与数千名开发者科技公司代表及行业领袖共同聚焦行业新兴产品需求&#xff0c;探讨新硬件发展趋势&…

STC32单片机 普通 I/O 口中断功能介绍和使用

STC32单片机 普通 I/O 口中断功能和使用✨STC32单片机普通 I/O 口中断&#xff0c;不是传统外部中断. &#x1f516;手册上描述&#xff1a;STC32G 系列支持所有的 I/O 中断&#xff0c;且支持 4 种中断模式&#xff1a;下降沿中断、上升沿中断、低电平中断、高电平中断。每组 …

网络方面的复习

这个博客参考了许多up主的视频和网上其他的博主的文章&#xff0c;还有我老师的ppt 这里是目录一、osi七层模型&#xff08;参考模型&#xff09;1.物理层2.数据链路层&#xff08;数据一跳一跳进行传递&#xff09;3.网络层&#xff08;端到端传输&#xff09;4.传输层&#x…

C语言深度剖析:关键字

C语言深度剖析:关键字C语言深度剖析:关键字前言定义与声明&#xff08;补充内容&#xff09;最宏大的关键字-auto最快的关键字-register关键字static被冤枉的关键字-sizeof整型在内存中的存储原码、反码、补码大小端补充理解变量内容的存储和取出为什么都是补码整型取值范围关于…

Pages Hexo 博客使用总结

参考&#xff1a;https://blog.csdn.net/yaorongke/article/details/119089190 Hexo Fluid 首页&#xff1a;https://hexo.fluid-dev.com/docs/ Hexo Fluid 配置&#xff1a;https://hexo.fluid-dev.com/docs/guide/#%E5%B1%95%E7%A4%BA-pv-%E4%B8%8E-uv-%E7%BB%9F%E8%AE%A1 文…

IM即时通讯开发如何解决大量离线消息导致客户端卡顿的

大部分做后端开发的朋友&#xff0c;都在开发接口。客户端或浏览器h5通过HTTP请求到我们后端的Controller接口&#xff0c;后端查数据库等返回JSON给客户端。大家都知道&#xff0c;HTTP协议有短连接、无状态、三次握手四次挥手等特点。而像游戏、实时通信等业务反而很不适合用…

改进的 A*算法的路径规划(路径规划+代码+毕业设计)

引言 近年来&#xff0c;随着智能时代的到来&#xff0c;路径规划技术飞快发展&#xff0c;已经形成了一套较为成熟的理论体系。其经典规划算法包括 Dijkstra 算法、A算法、D算法、Field D算法等&#xff0c;然而传统的路径规划算法在复杂的场景的表现并不如人意&#xff0c;例…

improve-2

BFC 块级格式化上下文&#xff0c;是一个独立的渲染区域&#xff0c;让处于 BFC 内部的元素与外部的元素相互隔离&#xff0c;使内外元素的定位不会相互影响。 IE下为 Layout&#xff0c;可通过 zoom:1 触发 触发条件: 根元素position: absolute/fixeddisplay: inline-block /…

区块链到底是个啥???

点击上方“小强的进阶之路”&#xff0c;选择“星标”公众号优质文章&#xff0c;及时送达预计阅读时间: 2分钟区块链起源2008 年&#xff0c;金融系统崩溃&#xff0c;世界惊恐万状。随后多年&#xff0c;银行、监管机构等负责金融系统运行的中央实体管理不善。那一时期&#…

BurpSuite安装

BurpSuiteBurpSuite简介BurpSuite安装BurpSuite简介 BurpSuite (简称Burp&#xff09;是基于Java开发的Web安全领域的集成工具&#xff0c;被称为信息安全界的瑞士军刀&#xff0c;它包含Proxy、Intruder、Repeater、Decoder.Comparer等多个模块&#xff0c;模块间通过共享相互…