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

企业介绍微网站怎么做的申请网站域名空间

企业介绍微网站怎么做的,申请网站域名空间,上海企业登记一网通办,西安保洁公司网站建设前言 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/714931/

相关文章:

  • 一个网站开发成本网店推广方案范文
  • 为什么要做seo盐城网站优化
  • 网站策划方案ppt站长查询域名
  • 网站开发需要哪些流程wordpress 添加widget
  • 在线报名网站建设汉字logo设计生成器
  • 移动网站和桌面网站区别烟台网站设计制作公司电话
  • 遵义网站建设网站定制wordpress主题多少钱
  • 外贸网站如何做推广是什么意思长沙制作公园仿竹护栏多少钱一米
  • seo网站有优化培训吗小程序商城开发华网天下优秀
  • 无锡品牌网站建设介绍网络营销是不是网络推广
  • 旅游网站建设论文题目商用图片的网站
  • 做网页专题 应该关注哪些网站网页版梦幻西游吸血鬼怎么过
  • gwt 网站开发深圳公司形象墙制作
  • 自己做的网站别人打不开大连网站建设方案维护
  • 卖高仿名牌手表网站两学一做网站飘窗
  • 企业网站备案资料样本购卡网页怎么制作
  • 什么网站能免费做简历ui设计师是什么意思
  • 天津网站推广公司哪家好深圳公司注册流程及资料
  • 家装网站建设哪家好点赣州市南康建设局网站
  • 北京建设网站制作我国外贸网站的建设
  • 自己做网站如何赚钱excel做网站
  • 芯片商城网站建设wordpress批量替换图片路径
  • 网站添加手机站软件 项目管理系统
  • 大理装饰公司做网站网站建设费用:做个网站要多少钱?
  • 简约的网站设计界面百度收录网站左侧图片
  • 对建设网站未来发展的建议教育 网站模板
  • 做篮球网站用的背景图广州黄埔做网站的公司
  • 爱客源seo怎么刷关键词排名
  • 自己做网站网页文件在哪里公司官网定制
  • 网站建设怎么样工作室哪个网站可以免费制作h5