-
Notifications
You must be signed in to change notification settings - Fork 13
Step 3:其他功能
medivhJay edited this page Sep 17, 2019
·
6 revisions
- 其实现有的三个示例模块已经包含了基本的说明, 随便看看现有模块的代码就可以开始进行操作了
- api免不了需要各种分页列表查询, 我还会抽时间写一份通用的分页工具出来,可能大概支持 gorm, mgo, mongo-driver, elastic.v7, redis 这几个驱动库的代码, 需要看具体情况了
- kafka支持(如果使用pkg/queue的话) kafka 使用的是 confluent-kafka-go; 所以需要本地环境安装libkafka模块,可从 这里 获得更多安装说明 使用方法
// 消费者
queue.NewConsumer().SetTopics("test").Do(func(consumer *kafka.Consumer, message *kafka.Message) {
// 该方法是需要自己定义的消费消息的方法, message.Value 是一个json的[]byte
var d map[string]interface{}
_ = jsoniter.Unmarshal(message.Value, &d)
fmt.Println(d)
})
// 生产者,直接发送消息给kafka,第二个参数 value 可以是任意类型也可以是 *kafka.Message
// 当类型不是 *kafka.Message 时将被转为json,如本示例,否则直接发送 *kafka.Message
queue.NewProducer().Send("test", map[string]int{"a": 1, "b": 2})
- 表单验证 表单验证使用了 validator.v9, 你可以在 这里 得到他更多的tag说明
# 定义表单结构体
type Params struct {
Id string `form:"id" binding:"required,max=32"`
}
# 控制器方法
func Function(ctx *gin.Context) {
var params Params
if validate := validator.Bind(ctx, ¶ms); !validate.IsValid() {
app.NewResponse(app.Fail, validate.ErrorsInfo).End(ctx)
return
}
// 到这里已经验证通过了, 可以继续使用 params.Id 获取传参了
}
- 验证码 比如你需要一个公共的验证码获取接口, 定义
// 获取验证码
func Captcha(ctx *gin.Context) {
cpat := captcha.New("唯一id,比如是用户的sessionid或者用户id之类的,每个用户肯定不能是一样的信息,这个id需要保存的, 因为需要验证验证码嘛")
// 这里返回的 content 是一个base64的字符串,让前端和APP来转吧
app.NewResponse(app.Success, gin.H{"content": cpat.ToBase64EncodeString()}).End(ctx)
}
// 在某个具体的接口需要验证验证码了
func SomeOperate(ctx *gin.Context) {
if !captcha.Verify("上边的唯一id", context.DefaultQuery("captcha", "")) {
// 验证不成功
return
}
}
- 邮件发送 全局调用一次该方法
# 因为该方法需要读取配置, 建议在配置服务启动之后再调用, server 包提供了这个功能, 所以在你的应用下调用
server.After = func(engine *gin.Engine) {
email.StartEmailSender()
}
# 发送一份普通邮件
email.Send(email.NewSender("subject", "body", "[email protected]", "[email protected]"))
# 发送一份HTML邮件
email.Send(email.NewHtmlSender("subject", email.ParseHtml("HTML模板路径", gin.H{"name":"value"}), ""))
# email.ParseHtml 使用 template 库, 第一个参数是模板路径, 第二个参数是模板需要填充的值
- payments包里主要提供了一个接口, 一般情况下实现 Payment 接口并注册进来即可, 微信支付宝操作无二
- unique 包提供了一个 Id() 方法,改方法使用雪花算法生成id, 由 sonyflake 提供
- redis 包主要是根据配置建立redis连接, 使用redis直接获取本包下的 Client 变量即可
- password 包提供了两个方法, 一个是对密码进行hash操作的 Hash 方法, 一个是对密码 hash 和 密码比对的 Verify 方法
- orm 包其实主要是建立 MySQL的连接,但是在这里边有一个 Database 结构体, 如果你自己定义的数据结构体里边包含一个没有Struct Field 的 Database 结构体, 在从orm包获取连接对象增删改查时将触发本包下的 BeforeCreate 和 BeforeUpdate 方法
- mongo 包对接的是MongoDB的官方 golang 驱动, 实现了一些简单的日常操作, 复杂操作调用链为 mongo.Collection(结构体).Database 或者 .Table , Collection 传入对象需要实现 app.Table 接口,这个接口是所有 mgo,mongo,和 gorm的结构体都需要实现的, 在这个项目下
- middlewares 下实现了三个gin中间件, 分别是 cors.go 跨域支持, csrftoken.go csrf_token验证支持, jwt.go json web token 的支持,需要注意的是, 如果使用 jwt, 需要对jwt.go 的 AuthEntity 变量进行赋值, 该值必须是实现了 jwt.go 的 AuthInterface 接口, 示例可看 这里和 这里
- sessions 包下提供了 sessions.Get 和 sessions.Set 操作
- mgo 包与 mongo 包类似, 只不过对接的是 mgo 驱动
- managers 包是对mgo和mongo以及gorm三个数据库驱动提供的后端 CURD 支持, 具体使用方式可查看这里的代码, 主要会对 gin 注册 List, Post, Put, Delete 四个接口,分别对应HTTP请求的GET,POST,PUT,DELETE, 这四个接口想要自己重新定义的话, 可以看一下这一行 和 这里
- log 包提供了 logrus 的log支持, 可按配置选择往文件写日志还是elasticsearch写日志
- app 包提供了一些常用操作, 像上边说的,所有模型结构体都需要实现 Table 接口
使用golang做web开发, 我们常常需要寻找并合理搭配各种路由库,session库,缓存库,DB库, 日志库等各种依赖, 将他们全部整合到一起
我们还要对公司内部管理后端提供 CURD 接口, 一个又一个的 Controller 写了出来
如果每一次都需要这样的操作, 人生将变得毫无意义
这个项目整合了golang做web开发中可能需要的大部分三方库,以及一些常用的中间件和通用功能
如果你有更好的想法,期待你的来信