作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯团队中之前的文件下载做得比较复杂,因为担心量太大,是后台做异步的下载,最终生成文件,传送文件到CDN服务器,最后再告诉用户下载链接。其实在查询接口中就可以实现流式下载,这样查询接口和下载接口可以合二为一,更加简单。下面是我的demo:1.建立一个download_file的文件夹作为项目文件夹gomodinitdownload_file2.生成go.mod文件,并准备对应的包:gogetgithub.com/gin-gonic/gin@latestgogetgit
渲染模板我的客服系统后端使用的golangGin框架,想把页面渲染出来,下面就是加载html模板页面packagerouterfuncInitViewRouter(engine*gin.Engine){//关于页面engine.GET("/aboutus.html",func(c*gin.Context){c.HTML(http.StatusOK,"aboutus.html",gin.H{"nav":"aboutus",})})//演示页面engine.GET("/show.html",func(c*gin.Context){c.HTML(http.StatusOK,"show.html",g
渲染模板我的客服系统后端使用的golangGin框架,想把页面渲染出来,下面就是加载html模板页面packagerouterfuncInitViewRouter(engine*gin.Engine){//关于页面engine.GET("/aboutus.html",func(c*gin.Context){c.HTML(http.StatusOK,"aboutus.html",gin.H{"nav":"aboutus",})})//演示页面engine.GET("/show.html",func(c*gin.Context){c.HTML(http.StatusOK,"show.html",g
在我的客服系统项目中,我使用的gin框架没有自带session功能,需要经过下面的整合处理使用的是 github.com/gin-contrib/sessions在我的tools包下packagetoolsimport("github.com/gin-contrib/sessions""github.com/gin-contrib/sessions/cookie""github.com/gin-gonic/gin")//中间件,处理sessionfuncSession(keyPairsstring)gin.HandlerFunc{store:=SessionConfig()returnses
在我的客服系统项目中,我使用的gin框架没有自带session功能,需要经过下面的整合处理使用的是 github.com/gin-contrib/sessions在我的tools包下packagetoolsimport("github.com/gin-contrib/sessions""github.com/gin-contrib/sessions/cookie""github.com/gin-gonic/gin")//中间件,处理sessionfuncSession(keyPairsstring)gin.HandlerFunc{store:=SessionConfig()returnses
前文再续,上一回我们完成了用户的登录逻辑,将之前用户管理模块中添加的用户账号进行账号和密码的校验,过程中使用图形验证码强制进行人机交互,防止账号的密码被暴力破解。本回我们需要为登录成功的用户生成Token,并且通过Iris的中间件(Middleware)进行鉴权操作。Iris模板复用在生成Token之前,首先我们需要对项目的模板进行优化改造,目前存在的页面模板有三块,分别是:首页模板(index.html)、登录页模板(signin.html)、后台用户管理页模板(/admin/user.html),虽然页面并不多,但不难发现,有很多重复的代码,比方说,首页模板和登录页模板都有公共的头部导航菜
前文再续,上一回我们完成了用户的登录逻辑,将之前用户管理模块中添加的用户账号进行账号和密码的校验,过程中使用图形验证码强制进行人机交互,防止账号的密码被暴力破解。本回我们需要为登录成功的用户生成Token,并且通过Iris的中间件(Middleware)进行鉴权操作。Iris模板复用在生成Token之前,首先我们需要对项目的模板进行优化改造,目前存在的页面模板有三块,分别是:首页模板(index.html)、登录页模板(signin.html)、后台用户管理页模板(/admin/user.html),虽然页面并不多,但不难发现,有很多重复的代码,比方说,首页模板和登录页模板都有公共的头部导航菜
学习ASP.NETCoreBlazor编程系列文章之目录学习ASP.NETCoreBlazor编程系列一——综述学习ASP.NETCoreBlazor编程系列二——第一个Blazor应用程序(上)学习ASP.NETCoreBlazor编程系列三——实体学习ASP.NETCoreBlazor编程系列五——列表页面学习ASP.NETCoreBlazor编程系列七——新增图书学习ASP.NETCoreBlazor编程系列八——数据校验学习ASP.NETCoreBlazor编程系列十三——路由(完)学习ASP.NETCoreBlazor编程系列十五——查询学习ASP.NETCoreBlazor编程系列
学习ASP.NETCoreBlazor编程系列文章之目录学习ASP.NETCoreBlazor编程系列一——综述学习ASP.NETCoreBlazor编程系列二——第一个Blazor应用程序(上)学习ASP.NETCoreBlazor编程系列三——实体学习ASP.NETCoreBlazor编程系列五——列表页面学习ASP.NETCoreBlazor编程系列七——新增图书学习ASP.NETCoreBlazor编程系列八——数据校验学习ASP.NETCoreBlazor编程系列十三——路由(完)学习ASP.NETCoreBlazor编程系列十五——查询学习ASP.NETCoreBlazor编程系列
我的客服系统有一些接口是专门给内部调用的,只允许其他内部系统来调用,不允许随意访问,可以使用IP白名单机制使用Gin框架实现IP白名单机制可以使用中间件的方式实现。你可以编写一个中间件函数,在每个请求到来时检查它的IP地址是否在白名单中,如果不在,则返回错误信息。例如,你可以这样编写中间件函数:funcIPWhiteList(whitelist[]string)gin.HandlerFunc{returnfunc(c*gin.Context){//获取请求的IP地址ip:=c.ClientIP()//检查IP地址是否在白名单中allowed:=falsefor_,value:=rangewhi