koahub-handlebars koahub-handlebars koahub handlebars templates Installation $ npm install koahub-handlebars Use with koa  var koa = require('koa');  var hbs = require('koahub-handlebars');    var app = koa();    // koahub-handlebars is middleware. `…
在前两篇文章介绍路由的时候,我们了解到gin可用通过类似DefaultQuery或DefaultPostForm等方法获取到前端提交过来的参数.参数不多的情况下也很好用,但是想想看,如果接口有很多个参数的时候再用这种方法就要调用很多次获取参数的方法,本文将介绍一种新的接收参数的方法来解决这个问题:模型绑定. gin中的模型绑定可以理解为:把请求的参数映射为一个具体的类型.gin支持JSON,XML,YAML和表单参数等多种参数格式,只需要在对应的字段上声明标签. 绑定表单或者查询字符串 type…
本文是对前几篇文章的一些补充,主要包含两部分:单元测试和实际项目中使用路由的小问题. 拾遗1:单元测试 Golang单元测试要求代码文件以_test结尾,单元测试方法以Test开头,参数为*testing.T类型.以下是一个计算hash值的工具包和对应的单元测试. hashUtils.go package utils import ( "crypto/md5" "crypto/sha1" "fmt" ) func Md5(str string)…
基于滴答清单 Web 开发的 PC 客户端 关于「滴答清单」 滴答清单是一款不可多得的 GTD 效率工具,它有着清晰明了的界面设计.恰到好处的功能设置.稳定的同步服务,如果你还缺少一款简洁而有效的 GTD 时间管理工具,滴答清单是不错的选择. -- 少数派 滴答清单是一款跨平台同步的待办事项和任务提醒软件: 滴答清单能够协助您完成待办事务,比如工作计划.生日提醒.旅行安排.会议准备等,以便更好的规划时间和安排生活: 滴答清单几乎覆盖了日常生活中的所有平台: PC(高级会员) Android iP…
Gin是一个用Golang编写的HTTP网络框架.它的特点是类似于Martini的API,性能更好.在golang web开发领域是一个非常热门的web框架. 启动一个Gin web服务器 使用下面的命令安装Gin go get -u github.com/gin-gonic/gin 在代码里添加依赖 import "github.com/gin-gonic/gin" 快速启动一个Gin服务器的代码如下 package main import "github.com/gin-…
在基于gin的golang web开发:路由中我们介绍了Gin的路由和一些获取链接中参数的方法,本文继续介绍其他获取参数的方法. 文件上传 在web开发中文件上传是一个很常见的需求,下面我们来看一下基于Gin的文件上传. func main() { router := gin.Default() router.MaxMultipartMemory = 8 << 20 // 8 MiB router.POST("/upload", func(c *gin.Context) {…
Gin除了模型绑定还提供了模型验证功能.你可以给字段指定特定的规则标签,如果一个字段用binding:"required"标签修饰,在绑定时该字段的值为空,那么将返回一个错误.开发web api的时候大部分参数都是需要验证的,比如email参数要验证是否是邮箱格式.phone参数要验证是否是手机号格式等等,使用模型验证方法可以将验证过程隔离在业务之外. 内置的验证标签 Gin通过集成go-playground/validator提供模型验证功能,并提供了很多常用验证规则可以满足我们大部…
web开发基本都离不开访问数据库,在Gin中使用mysql数据库需要依赖mysql的驱动.直接使用驱动提供的API就要写很多样板代码.你可以找到很多扩展包这里介绍的是jmoiron/sqlx.另外还有一个用来处理空值的包guregu/null. go get github.com/go-sql-driver/mysql go get gopkg.in/guregu/null.v4 go get github.com/jmoiron/sqlx 连接数据库 jmoiron/sqlx包为databas…
在前文介绍访问数据库时介绍了github.com/jmoiron/sqlx包,本文基于这个包使用数据库事务. defer 在使用数据库事务之前,首先需要了解go语言的defer关键字.defer是go语言的延迟执行语句,defer后面的语句会被go进行延迟处理,在函数即将结束的时候,defer后面的语句将逆序执行.也就是说,先defer的语句最后执行.defer很像java或者C#中的finally语句.下面通过一个例子看一下defer. package main import "fmt&quo…
Go语言访问mysql数据库需要用到标准库database/sql和mysql的驱动.标准库的Api使用比较繁琐这里再引入另一个库github.com/jmoiron/sqlx. go get github.com/jmoiron/sqlx go get github.com/go-sql-driver/mysql 连接数据库 db, err := sqlx.Connect("mysql", "...?parseTime=true") if err != nil {…
gin中间件(middleware)提供了类似于面向切面编程或路由拦截器的功能,可以在请求前和请求之后添加一些自定义逻辑.实际开发中有很多场景会用到中间件,例如:权限验证,缓存,错误处理,日志,事务等. 使用中间件 gin的中间件分为三类:全局中间件.路由中间件.分组路由中间件. 全局中间件:注册全局中间件之后注册的路由才会生效,如果有一些不希望使用全局中间件的路由规则,注册路由代码要放在注册全局中间件之前. 路由中间件:在注册路由时传入的中间件,只对当前路由规则生效. 分组路由中间件:在分组路…
在前后端分离的项目维护一份完整且及时更新的api文档会极大的提高我们的工作效率,传统项目中接口文档都是由后端开发手写的,这种文档很难保证及时性,久而久之便失去了参考意义.swagger给我们提供了一种新的维护文档的方式,在gin中只需要编写一些注释即可生成一份可交互的接口文档. go get -u github.com/swaggo/swag/cmd/swag go get -u github.com/swaggo/gin-swagger go get -u github.com/swaggo/…
作为后端开发者我们要记住一句话:"永远不要相信用户的输入",这里所说的用户可能是人,也可能是另一个应用程序."永远不要相信用户的输入"是安全编码的准则,也就是说,任何输入的内容在验证无害之前都是有害的.很多应用程序的安全漏洞都和用户输入有关,比如SQL注入漏洞. 我们可以通过参数验证.sql语句过滤和参数化查询等方式对用户的输入进行处理来规避这种安全隐患.本文介绍第一种方法,并对基于gin的golang web开发:模型验证进行补充,了解更多的参数验证方法. 验证非…
Golang天生适合运行在docker容器中,这得益于:Golang的静态编译,当在编译的时候关闭cgo的时候,可以完全不依赖系统环境. 一些基础 测试容器时我们经常需要进入容器查看运行情况,以下命令启动一个centos容器并进入bash交互环境. docker run -it --rm centos bash -it 组合参数-i: 以交互模式运行容器,-t: 为容器重新分配一个伪输入终端. --rm 在容器退出时就能够自动清理容器. alpine镜像中没有bash,启动容器并进入终端的命令为…
JSON Web Token(JWT)是一种很流行的跨域认证解决方案,JWT基于JSON可以在进行验证的同时附带身份信息,对于前后端分离项目很有帮助. eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c JWT由三部分组成,每个部分之间用点…
微服务开发中服务间调用的主流方式有两种HTTP.RPC,HTTP相对来说比较简单.本文将使用 Resty 包来实现基于HTTP的微服务调用. Resty简介 Resty 是一个简单的HTTP和REST客户端工具包,简单是指使用上非常简单.Resty在使用简单的基础上提供了非常强大的功能,涉及到HTTP客户端的方方面面,可以满足我们日常开发使用的大部分需求. go get安装 go get github.com/go-resty/resty/v2 使用Resty提交HTTP请求 client :=…
前文分别介绍过了Resty和gin-jwt两个包,Resty是一个HTTP和REST客户端,gin-jwt是一个实现了JWT的Gin中间件.本文将使用这两个包来实现一个简单的用户登录功能. 环境准备 实现登录功能之前要提前准备一个用于查询用户是否存在的服务.访问服务http://127.0.0.1:18081/users?username=root时返回用户root的相关信息 { "total": 1, "data": [ { "id": 1,…
前言 Spring Boot 天生的适合 web 应用开发,它可以快速的嵌入 Tomcat, Jetty 或 Netty 用于包含一个 HTTP 服务器.且开发十分简单,只需要引入 web 开发所需的包,然后编写业务代码即可. 自动配置原理? 在进行 web 开发之前让我再来回顾一下自动配置,可以参考系列文章第三篇.Spring Boot 为 Spring MVC 提供了自动配置,添加了如下的功能: 视图解析的支持. 静态资源映射,WebJars 的支持. 转换器 Converter 的支持.…
模板引擎的使用在web开发中是不可避免和必要的.hi.py框架使用jinja2作为模板引擎. 为了使用hi.py提供的jinja2引擎,首先需要引入它: from hi import hi,template 然后就是使用它: @app.route(r'^/template/(?P<name>\w+)/(?P<age>\d+)/?$',['GET']) def tpl(req,res,param): param['title']='jinja2 测试' tpl_engine = te…
作为一名IT届的后生,当初也经历过懵懂无知的实习期,对那种无力感深有体会.在这,希望能用我这几年的开发经验,让各位即将踏入或者刚刚踏入web开发领域的新人们少走些弯路.鉴于这是入门篇,下面我就从零为大家介绍. 这里我主要介绍基于 H5,CSS,JS,PHP的web开发,入门篇的内容简单,完全可以自学,下面就为大家整理些制作静态网页的基础知识.以下是HTML5的内容. HTML5:万维网的核心语言.标准通用标记语言下的一个应用超文本标记语言(HTML)的第五次重大修改.博主我用的是HBuilder…
本文提纲 1. spring-boot-starter-web 依赖概述 1.1 spring-boot-starter-web 职责 1.2 spring-boot-starter-web 依赖关系 2. Spring MVC on Spring Boot 2.1 Spring MVC 体系温故知新 2.2 重要的类 2.3 Spring Boot MVC 2.3.1 控制器 2.3.2 数据绑定 2.3.3 视图和视图解析 一.spring-boot-starter-web 依赖概述 在 S…
问题由来 最近在研究适合团队开发的web架构解决方案,该架构即要适合分工协作又要有一定扩展性,适合不同的数据库需要,因此我查阅了一些资料,初步构想出了一套架构,请各位多多指教. 探索 web开发架构最经典莫过于三层架构,表示层.逻辑层.数据处理层. 数据访问层:其功能主要是负责数据库的访问. 业务逻辑层:是整个系统的核心,它与这个系统的业务(领域)有关. 表示层:是系统的UI部分,负责使用者与整个系统的交互.理想的状态是表示层不应包括系统的业务逻辑. 这些是经典的解释,如果要适合不同的数据库则需…
Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域处理 十.签权 十一.国际化 十二.统一的渲染控制 十三.WebSocket 十四.与Spring.Jsr330的常用注解对比 1.Solon的MVC注解 主要注解: 注解 说明 @Controller 控制器注解(只有一个注解,会自动通过不同的返回值做不同的处理) @Param 请求参数注解(一般…
模板 简介 模板是一个包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值只在请 求的上下文中才能知道. 渲染 使用真实值替换变量,再返回最终得到的响应字符串,这一过程 称为渲染.为了渲染模板,Flask 使用了一个名为 Jinja2 的强大模板引擎. 以下列代码为例: from flask import Flask, render_template # ... @app.route('/') def index(): return render_template('index.htm…
在做WEB开发的时候,我们不可避免的就是在前端页面之间进行跳转,中间进行数据的查询等等操作.我们在使用SpringBoot之前包括我在内其实大部分都是用的是JSP页面,可以说使用的已经很熟悉.但是我们在使用springBoot开发框架以后我们会发现一个致命的问题,就是SpringBoot对Jsp的支持可以说是惨不忍睹,官方推荐我们进行使用的是Thymeleaf模板引擎进行.其实我这里也没搞清楚模板引擎原理是什么,以后有机会再深入了解,我们只需要学会怎么用就行,目前而言.当然模板引擎有很多,比如f…
一.Vue教程 vue.js是一套构建用户界面的渐进式框架.vue采用自底向上增量开发的设计.vue的核心库只关心视图层,非常容易学习,非常容易与其它库和已有项目整合.vue完全有能力驱动采用单文件组件和vue生态系统支持的库开发的复杂单页应用.vue.js的目标是通过尽可能简单的API实现响应的数据绑定和组合的视图组件. 这里介绍一些我学习vue时用的教程. 1.入门教程 官网教程:https://cn.vuejs.org/v2/guide/ vue.js的官网教程是很全面的,包括文档和视频.…
单击第一个图标,第一个图标突出显示,单击第二个图标,第一个变灰,第二个突出显示,反之一样.单击history读取历史记录. Controller ZCL_SUS_C_ORDER_CHANGE 1.    DO_INIT method DO_INIT. *CALL METHOD SUPER->DO_INIT *    . if  ZORDERCHANGEMODEL is initial. create object ZORDERCHANGEMODEL. select * from usr02 in…
Model-View-Controller 简称MVC. 简单的说就是把数据处理,显示,页面事件及处理过程分离开来,企业应用多数都采用这种方式,多层架构的优缺点不再多言,google一下啥都知道. 在企业应用中我们以SRMSUS 为例. 系统由以下结构组成   Controller来处理系统事件及数据过程 Views 是页面/子页面 Page 是带有逻辑过程的页面,之前介绍过 Page Fragments ,例如很多页面需要header及footer,这个东西就是一些代码片断,可以被出入到需要的…
这个婚礼邀请函是之前帮别人做的,现在人家婚礼举办过了也没啥关系了,想着就修改成通用模板进行开源,方便大家尤其是小白们克隆项目之后稍微修改就能够直接使用. 当时自己开始这个项目时候也是查阅了很多教程文章,但无一列外都需要大量的小程序开发知识储备,对于当时需要快速构建一个项目的我来说真的焦急,很希望有一个可以直接使用的模板,项目完成后有深入的想法可以再学习. 扫码体验 ​ 项目展示(多图警告) 首页 ​ 照片页 ​ 地图页 ​ 祝福页 ​ 留言页 ​ 项目下载 https://github.com/…
hi-nginx通过redis管理会话. 要开启管理,需要做三件事. 第一件开启userid: userid on; userid_name SESSIONID; userid_domain localhost; userid_path /; userid_expires 300s; 这个功能是nginx内建的,可以直接使用.需要注意的是,hi-nginx只认识SESSIONID的userid_name. 第二件是配置redis服务器: hi_redis_host 127.0.0.1; hi_r…