当前位置: 首页 > news >正文

建设企业网站登录入口浏览器下载安装2023最新版

建设企业网站登录入口,浏览器下载安装2023最新版,东莞网网站公司简介,广科网站开发前言 Gin框架是一个轻量级的Web框架#xff0c;基于Go语言开发#xff0c;旨在提供高性能和简洁的API。它具有快速的路由和中间件支持#xff0c;使得构建Web应用变得更加简单和高效。无论是构建小型的API服务还是大型的Web应用#xff0c;Gin框架都能够满足你的需求。 无论… 前言 Gin框架是一个轻量级的Web框架基于Go语言开发旨在提供高性能和简洁的API。它具有快速的路由和中间件支持使得构建Web应用变得更加简单和高效。无论是构建小型的API服务还是大型的Web应用Gin框架都能够满足你的需求。 无论你是一个有经验的开发者还是一个刚刚入门的初学者本文都将为你提供清晰的指导和实用的示例代码。无论你是想构建一个简单的API服务还是一个复杂的Web应用Gin框架都能够帮助你快速实现你的想法。 目录 ​编辑 前言 适用人群 构建第一个Gin应用 1.下载并安装Gin 2.项目导入 3.快速使用示例 路由和中间件 API路由配置 路由分组 静态文件路由设置 静态路径映射 静态文件路由 路由中间件 优雅封装 Gin客户端初始化 定义api路由 在项目入口启动Gin服务 总结 适用人群 懂得安装 Go 环境及其基本语法会使用 Go Modules 管理项目 构建第一个Gin应用 1.下载并安装Gin go get -u github.com/gin-gonic/gin 2.项目导入 import github.com/gin-gonic/gin 3.快速使用示例 package mainimport github.com/gin-gonic/ginfunc main() {r : gin.Default()r.GET(/ping, func(c *gin.Context) {c.JSON(200, gin.H{message: pong,})})r.Run() // 监听并在 0.0.0.0:8080 上启动服务 } 路由和中间件 API路由配置 Gin的API路由配置相当简单只需要调用对应请求方式的方法设置请求路径与请求函数即可 router.GET(/ping, func(c *gin.Context) {c.JSON(200, gin.H{message: pong,})}) 路由分组 我们可通过Group方法设置路由分组 // 可使用Group方法设置路由分组 userGroup : router.Group(/user) // 该接口实际路径为/user/register userGroup.POST(/register, controller.UserController.Register) userGroup.POST(/login, controller.UserController.Login) 静态文件路由设置 静态路径映射 router.Static允许我们指定路径映射如下当我们访问路径为localhost:8080/storage时实际上是访问到localhost:8080/storage/app/public //当访问路径为localhost:8080/storage时实际上是访问到localhost:8080/storage/app/public router.Static(/storage, ./storage/app/public) 静态文件路由 设置静态文件夹路由 router.Static(/assets, ./assets) 设置静态文件路由 router.StaticFile(/favicon.ico, ./resources/favicon.ico) 路由中间件 使用use方法可使用gin自带的中间件或者自定义的中间件 我们这里自定义中间件函数返回类型需为gin.HandlerFunc这里我们定义三个常用的中间件作为示例 跨域处理中间件 // 跨域处理中间件 func Cors() gin.HandlerFunc {config : cors.DefaultConfig()config.AllowAllOrigins trueconfig.AllowHeaders []string{Origin, Content-Length, Content-Type, Authorization}config.AllowCredentials trueconfig.ExposeHeaders []string{New-Token, New-Expires-In, Content-Disposition}return cors.New(config) } 登录认证中间件这里使用的是JWT认证 // JWTAuth JWT 鉴权中间件 func JWTAuth(GuardName string) gin.HandlerFunc {return func(c *gin.Context) {// Token 获取tokenStr : c.Request.Header.Get(Authorization)if tokenStr {response.TokenFail(c)c.Abort() // 终止请求return}tokenStr tokenStr[len(service.TokenType)1:]// Token 解析校验token, err : jwt.ParseWithClaims(tokenStr, service.CustomClaims{}, func(token *jwt.Token) (interface{}, error) {return []byte(global.App.Config.Jwt.Secret), nil})// Token 黑名单校验if err ! nil || service.JwtService.IsInBlacklist(tokenStr) {response.TokenFail(c)c.Abort()return}// Token 发布者校验和过期校验claims : token.Claims.(*service.CustomClaims)if claims.Issuer ! GuardName || !token.Valid {response.TokenFail(c)c.Abort()return}// token 续签if claims.ExpiresAt.Time.Unix()-time.Now().Unix() global.App.Config.Jwt.RefreshGracePeriod {lock : global.Lock(refresh_token_lock, global.App.Config.Jwt.JwtBlacklistGracePeriod)if lock.Get() {err, user : service.JwtService.GetUserInfo(GuardName, claims.ID)if err ! nil {global.App.Log.Error(err.Error())lock.Release()} else {tokenData, _, _ : service.JwtService.CreateToken(GuardName, user)c.Header(new-token, tokenData.AccessToken)c.Header(new-expires-in, strconv.Itoa(tokenData.ExpiresIn))_ service.JwtService.JoinBlackList(token)}}}//将token信息和id信息存入上下文c.Set(token, token)c.Set(id, claims.ID)} } gin自带的Recovery中间件默认日志是是打印在控制台的故使用自定义Recovery中间件来自定义日志输出方式 这些配置信息根据自己情况调整这里我是通过viper读取配置到全局变量中后面我应该会出文讲解Go使用Viper读取配置 // CustomRecovery 进行程序的恢复防止程序因 panic 而终止和记录错误日志的中间件 func CustomRecovery() gin.HandlerFunc {// 开启程序的恢复并将错误日志写入到指定的日志文件中return gin.RecoveryWithWriter(lumberjack.Logger{// 日志文件名Filename: global.App.Config.Log.RootDir / global.App.Config.Log.Filename,// 文件最大大小MaxSize: global.App.Config.Log.MaxSize,// 旧文件的最大个数MaxBackups: global.App.Config.Log.MaxBackups,// 旧文件的最大保留天数MaxAge: global.App.Config.Log.MaxAge,// 是否压缩Compress: global.App.Config.Log.Compress,},response.ServerError) } 挂载自定义的中间件需要注意使用中间件的顺序gin.Logger()中间件需要放在其他中间件前面不然可能导致middleware.CustomRecovery()中的日志无法正常使用 router : gin.New() router.Use(gin.Logger(), middleware.Cors(), middleware.CustomRecovery()) 优雅封装 接下来我们优雅的封装Gin的大部分使用 Gin客户端初始化 我们在RunServer()方法中实现了优雅地关闭服务器当关闭服务器时如果有请求未结束会等待5秒5秒后再关闭服务器 // bootstrap/Router.go package bootstrap import (contextgithub.com/gin-gonic/ginswaggerfiles github.com/swaggo/filesginSwagger github.com/swaggo/gin-swaggerlognet/http_ online-practice-system/docsonline-practice-system/globalonline-practice-system/internal/middlewareonline-practice-system/routesosos/signalsyscalltime ) // 初始化路由 func setupRouter() *gin.Engine {if global.App.Config.App.Env production {gin.SetMode(gin.ReleaseMode)}router : gin.New()router.Use(gin.Logger(), middleware.Cors(), middleware.CustomRecovery())// 前端项目静态资源router.Static(/storage, ./storage/app/public)// Swagger 配置router.GET(/swagger/*any, ginSwagger.WrapHandler(swaggerfiles.Handler))// 注册 api 分组路由apiGroup : router.Group(/api)routes.SetUserGroupRoutes(apiGroup)return router } // RunServer 启动服务器 func RunServer() {r : setupRouter()//创建一个 http.Server 对象 srv其中指定服务器的监听地址和路由处理器为之前设置的路由 rsrv : http.Server{Addr: : global.App.Config.App.Port,Handler: r,}//使用 srv.ListenAndServe() 方法来异步启动服务器。go func() {if err : srv.ListenAndServe(); err ! nil err ! http.ErrServerClosed {global.App.Log.Fatal(服务器启动失败 err.Error())}}()// 等待中断信号以优雅地关闭服务器设置 5 秒的超时时间, 当收到中断信号时会触发 quit 通道从而执行后续的关闭服务器操作。quit : make(chan os.Signal)//Notify函数让signal包将输入的中断信号 SIGINT 或终止信号 SIGTERM 转发到通道quitsignal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)//收到信号后会执行下面的代码首先打印日志然后调用 srv.Shutdown() 方法来关闭服务器。-quitlog.Println(Shutdown Server ...)//创建一个带有超时的上下文 ctx超时时间设置为 5 秒ctx, cancel : context.WithTimeout(context.Background(), 5*time.Second)defer cancel()//调用 srv.Shutdown() 方法来关闭服务器此时会触发 http.Server 的关闭事件从而退出阻塞if err : srv.Shutdown(ctx); err ! nil {global.App.Log.Fatal(服务器关闭时出现错误 err.Error())}global.App.Log.Fatal(服务器顺利关闭~~~) } 定义api路由 // api/Router.go package routes import (github.com/gin-gonic/ginonline-practice-system/internal/controlleronline-practice-system/internal/middlewareonline-practice-system/internal/service ) // SetUserGroupRoutes 定义 User 分组路由 func SetUserGroupRoutes(router *gin.RouterGroup) {userGroup : router.Group(/user)userGroup.POST(/register, controller.UserController.Register)userGroup.POST(/login, controller.UserController.Login)//使用 JWTAuth 鉴权中间件authRouter : userGroup.Use(middleware.JWTAuth(service.AppGuardName)){authRouter.GET(/userInfo, controller.UserController.GetUserInfo)authRouter.GET(/logout, controller.UserController.UserLogout)authRouter.POST(/image_upload, controller.UploadController.ImageUpload)authRouter.GET(/image_get_url/:id, controller.UploadController.GetUrlById)} } 在项目入口启动Gin服务 package mainimport (online-practice-system/bootstrap )func main() {// 启动gin web服务器bootstrap.RunServer() } 总结 感谢您的观看如果您对gin的使用感兴趣的可以看看我几个月前搭建的go web脚手架使用了一些主流的开发框架虽然可能部分设计不是很合理但是对于我个人来说搭建一般的web项目还是足够了。未使用go-wire的版本go-web-starter: 基于ginform框架的web开发脚手架 (gitee.com)使用了go-wire进行全局依赖注入的改造版go-web-wire-starter: 使用go-wire框架与gin框架搭建的web开发脚手架有助于web开发者快速开发curd操作以及学习go-wire框架的工程化实践 (gitee.com) 实现的功能有如下 • 配置统一管理 • Jwt令牌生成校验续签黑名单 • 定时任务 • 文件存储支持本地七牛云Kodo阿里云Oss腾讯云Cos等存储服务支持扩展 • 分布式锁 • 限流器基于令牌桶算法 • 邮件服务 • 自定义命令行命令代码中以数据库迁移migrate命令为示例 使用的技术栈如下图
http://www.pierceye.com/news/970597/

相关文章:

  • 网站风格的表现形式重庆观音桥房价
  • 哪些公司的网站做的很好手机网页素材
  • 天津地铁建设网站百度广告太多
  • 保定php网站制作wordpress的seo收件箱
  • 网站建设公司-跨界鱼科技优外国网站设计风格
  • 网站营销平台注册微信公众号流程
  • 西安专业网站建设服务公司商标查询网入口
  • 营销型网站设计房地产wordpress多媒体路径
  • 门户网站建设解决方案wordpress图片广告
  • 哈尔滨h5模板建站设计一个软件需要多少钱
  • 青岛网站建设方案服务惠民卡看电影怎么用
  • 兰州新站点seo加盟网站建设工作有底薪吗
  • 哈尔滨建设网站官网清远头条新闻
  • 泉州网站设计平台wordpress cenos
  • 网站内容批量替换站长之家网站素材
  • asp.net 获取网站域名展览馆展示设计
  • 网站网页设计公司家庭做网站
  • php网站开发实战的书网站开发排行榜
  • 摄影师都在哪些网站发布作品云虚拟主机搭建网站
  • 中小企业电子商务网站建设传奇手游代理平台
  • 网站建设需要每年交钱吗如何选择宣传片制作
  • 建设网站为网站网站做广告芜湖市网站建设
  • 网站建设和维护怎么学android开发编辑wordpress
  • 有哪些学做衣服的网站生产管理软件app
  • 网站换域名 蜘蛛不来广告宣传片制作公司
  • 百度做个网站要多少钱如何在淘宝网做自己的网站
  • 网站建设属于营业范围里的哪一项深圳外贸建站网络推广联客易
  • 网站开发公司 郑州wordpress 服务器环境
  • 网站搭建什么意思砀山做网站
  • 营销型网站服务长沙做网站费用