# as
martini 轻巧脚手架
# 依赖
~~~ go
go get -u github.com/go-martini/martini
go get -u github.com/martini-contrib/encoder
go get -u github.com/hoisie/redis
go get -u github.com/martini-contrib/sessions
go get -u github.com/ascoders/xsrftoken
go get -u gopkg.in/mgo.v2
go get -u github.com/dchest/captcha
go get -u github.com/jordan-wright/email
~~~
# 自动路由
自动路由最强悍的地方就是每次运行程序,都会根据`controllers`中的注释生成路由文件`router/auto.go`。为了享受自动生成路由带来的便利,你可以如下编写注释:
~~~ go
type Article struct {
controllers.Base
}
// @router /article [Get]
func (this *Article) Other() []byte {
return response.Success("Delete success!")
}
~~~
> 第一次执行程序会生成自动路由文件,但无法调用它,第二次启动就能自动加载第一次生成的路由文件了。
# 注释路由
在控制器的每个函数上,按照规范添加注释,可以自动生成注释路由文件。
最基础的写法,默认响应`get`请求:
~~~go
// @router /example
~~~
url可以带参数:
~~~go
// @router /example/:id
~~~
设置响应类型,多个用`,`分隔:
~~~go
// @router /example [post]
~~~
设置响应前执行的函数,下例先执行`Csrf`方法,例如做权限控制,多个用`,`分隔:
~~~go
// @router /example (csrf)
~~~
也可以混合使用
~~~go
// @router /example (csrf,before) [put,delete]
~~~
如果开启了自动`restful路由`,可以复写注释路由替换默认的`restful路由`,替换`Gets` `Get` `Add` `Update` `Delete`方法,使用`this.Restful.[RestfulApi]`:
~~~go
// @router /users (before) [get]
func (this *User) Gets(req *http.Request) []byte {
return this.Restful.Gets(req)
}
~~~
注释路由的参数**对大小写不敏感**
# 控制器规范
~~~
controllers
|-- user
| |-- user.go
| |-- extend.go
|-- article
| |-- article.go
~~~
每个控制器主文件必写`New`方法,供初始化路由时使用,如:
~~~go
func New() *User {
controller := &User{}
controller.NewModel(models.NewUser()) // 初始化数据模型
return controller
}
~~~
每个`package`对应一个资源,并自动开启`restful Api`,需要权限验证或禁用某些api,可以复写`restful`方法。以`user`为例,自动生成的`restful api`如下:
~~~ go
user := &user.User{}
r.Get ("/api/users", user.Before, user.Gets)
r.Get ("/api/users/:id", user.Before, user.Get)
r.Post ("/api/users", user.Before, user.Add)
r.Patch ("/api/users", user.Before, user.Update)
r.Delete("/api/users/:id", user.Before, user.Delete)
~~~
覆写`Before`方法,可以做权限验证等处理:
~~~ go
func (this *User) Before(w http.ResponseWriter) {
// 只要有输出语句,后面的路由逻辑不会执行
w.Write([]byte("没有权限"))
}
~~~
# 自动缓存
脚手架使用`martini`映射接口的特性,覆盖了`http.ResponseWriter`并重写`write()`方法,在其调用前生成以当前`url`作为`key`,当前输出内容为`value`的缓存,并在http请求发生前优先使用缓存。如果路由遵循`restful`规范,只有`get`请求会使用缓存(因为其他操作数据可能发生了变化),这一切都是自动的。
需要注意如下两点:
1. 手动清除缓存:引入`lib/redis`,调用`redis.Delete`方法。
2. 在配置文件`conf/conf.go`中修改默认缓存周期`CACHE_EXPIRE`。
# Csrf过滤
如果将 `conf.CSRF_DEFAULT` 设置为 `true`,系统会自动在所有非 `get` 方法添加 `csrf` 验证。也可以在需要的`get`方法中,通过注释路由手动添加,使用 `(crsf)` 关键字,如:
~~~go
@router /example (csrf)
~~~
# 验证码
书写注释路由时,使用 `(captcha)` 关键字,可以开启验证码校验功能:
~~~go
// @router /example (csrf,captcha)
~~~
# 自动验证
使用`this.Parse`解析表单时,如果数据`struct`按照规范书写了验证`tag`,将会自动按照规范进行验证。
`tag`属性:`valid`:
- `Required` 字符串不为空
- `Min(min int)` 最小值
- `Max(max int)` 最大值
- `Range(min, max int)` 数值的范围
- `MinSize(min int)` 最小长度
- `MaxSize(max int)` 最大长度
- `Length(length int)` 长度
- `AlphaNumeric` alpha字符或数字
- `Email` 邮箱格式
- `IP` IP格式
- `Base64` base64编码
- `Mobile` 手机号
- `Tel` 固定电话号
- `Phone` 手机号或固定电话号
- `ZipCode` 邮政编码
- `-` 解析请求时会忽略此字段(用户无法通过提交参数修改此字段)
> 特别说明:(POST)新增数据时会检查结构体中所有被标识为`required`的字段,而局部更新时(PATCH)只会对提交的属性进行验证。
# 其它tag功能说明
`tag`属性:`bson`:
- `someValue` 写入数据库时的`key`
- `-` 这个字段不会写入数据库
`tag`属性:`json`:
- `someValue` 与客户端交互时`json`的`key`
- `-` 这个字段不会发送到客户端
# 增改最佳实践
**新增一条记录**
用户需要提交所有记录应该包含的字段,**服务器*需要验证*全部`required`的字段**以避免非空字段出现空值。同时通过设置`valid:"-"`对不应由用户设置的字段进行屏蔽(例如账户余额),而在业务逻辑中添加:
~~~go
func (this *Controller) Add(req *http.Request) (int, []byte) {
// 实例化用户表结构体
// @return type struct
user := &user.Data{}
// 将req.form转换为map
// @return map[string]string
params := this.ReqFormToMap(req)
// 根据用户表结构体的设置,将params参数解析到结构体中,参数类型错误返回error
// 同时进行自动验证,验证失败返回error
// 如果提交参数包含valid:"-"的,会返回禁止修改的error
if err := this.Parse(user, params); err != nil {
return this.Error(err.Error())
}
// 手动设置敏感字段,例如给新注册用户送10元现金
// user.Money = 10
// 添加用户
if err := this.Model.Add(data); err != nil {
return response.Error(err.Error())
}
}
~~~
**更新一条记录**
用户需要提交条目的`id`以及需要修改的所有字段,**此时*不会验证*全部`required`的字段**,而是仅仅对提交的字段做验证(因为未改动的字段符合过滤规范),同时也适用`valid:"-"`规则:
~~~go
func (this *Controller) Add(req *http.Request) (int, []byte) {
// 实例化用户表结构体
// @return type struct
user := &user.Data{}
// 将req.form转换为map
// @return map[string]string
params := this.ReqFormToMap(req)
// 将用户提交参数转换为可以执行update命令的参数
// 例如nickname字段设置了bson:"n",会将提交的nickname参数修改为n
// 同时进行自动验证,验证失败返回error
// 如果提交参数包含valid:"-"的,会返回禁止修改的error
// @return map[string]string
if err, opts := this.ParseToUpdateMap(data, params); err == nil {
// 手动设置敏感字段,例如刷新用户操作时间
// user.LastOperate = time.Now()
// 更新用户
err := this.Model.Update(param["id"], opts)
return response.Must("更新成功", err)
} else {
return response.Error(err.Error())
}
}
~~~
有时会进行特殊更新,即只更新指定的字段(用户无法通过指定任意字段来更新任意字段,或某个字段的更新要经过特殊的过滤逻辑)例如修改密码。为了避免任意更新,这些字段一般会被设置`valid:"-"`规则,无法通过`this.ParseToUpdateMap`的验证,此时可以通过传入额外参数豁免`valid:"-"`的规则:
~~~go
// 用户通过邮箱验证,才有修改密码的权限
// if bla..bla..bla
// return "token验证失败"
// 为password和nickname字段豁免valid:"-"的验证
// 用户可能通过了更高级别的验证,而获取了对这些“敏感”字段的修改权
// 但同样会根据valid的设置验证字段格式
if err, opts := thi
没有合适的资源?快使用搜索试试~ 我知道了~
基于 martini 的 go语言框架.zip
![preview](https://csdnimg.cn/release/downloadcmsfe/public/img/white-bg.ca8570fa.png)
共39个文件
go:35个
md:4个
![preview-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/scale.ab9e0183.png)
需积分: 5 0 下载量 52 浏览量
2024-05-23
17:09:53
上传
评论
收藏 32KB ZIP 举报
温馨提示
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
资源推荐
资源详情
资源评论
![zip](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
收起资源包目录
![package](https://csdnimg.cn/release/downloadcmsfe/public/img/package.f3fc750b.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
共 39 条
- 1
资源评论
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/d7864c98224046ec9a7f43fa6207c84e_qq_51320133.jpg!1)
生瓜蛋子
- 粉丝: 3830
- 资源: 6140
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)