forked from mydevc/go-gin-mvc
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
fuxiaojun
committed
Feb 20, 2019
1 parent
cd305b6
commit 800ad36
Showing
42 changed files
with
1,295 additions
and
1,083 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,24 +1,162 @@ | ||
# go-gin-mvc | ||
基于gin-gonic/gin 框架搭建的MVC架构的基础项目空架子。<br/> | ||
此框架没有经过商用检验,不成熟,请谨慎参考,推荐另一套比较完善的架构: | ||
https://github.com/winlion/restgo/tree/master/restgo | ||
|
||
## 此项目集成了小型网站开发常用的功能:<br/> | ||
1、基于redis存储的session;<br/> | ||
2、基于redis存储的cache操作;<br/> | ||
3、基于gorm的数据库操作,主从分离配置,连接维持,防止长时间空闲连接报错;<br/> | ||
4、基于beanstalk的队列服务;<br/> | ||
5、类php laravel框架的数据验证,可自定义友好错误提示;<br/> | ||
6、csrf防跨站攻击;<br/> | ||
7、jwt集成;<br/> | ||
8、配置文件读取;<br/> | ||
9、定时任务;<br/> | ||
|
||
<br/> | ||
## 其它注意事项<br/> | ||
1、队列需要单启服务,与http独立<br/> | ||
2、依赖包用govendor管理,命令:<br/> | ||
cd项目根目录<br/> | ||
govendor sync vendor/vendor.json <br/> | ||
基于gin-gonic/gin 框架搭建的MVC架构的基础项目空架子,未经商用检验,请谨慎参考。 | ||
|
||
## 此项目集成了小型网站开发常用的功能: | ||
- 基于redis连接池存储的session操作; | ||
``` | ||
详见代码:route/router.go | ||
关键代码: | ||
//不用连接池 | ||
//store,err:=redis.NewStore(10,"tcp","rs1.rs.youfa365.com:6379","",[]byte("asfajfa;lskjr2")) | ||
//使用连接池 | ||
store, err := redis.NewStoreWithPool(utils.RedisPool, []byte("as&8(0fajfa;lskjr2")) | ||
``` | ||
|
||
- 基于redis连接池存储的cache操作; | ||
|
||
- 基于xorm的数据库操作,主从分离配置,支持多从库配置,鲜活连接定时PING操作,集成xorm/cmd; | ||
|
||
- 基于rabbitmq的队列应用,注意生产者与消费者队列名称的一致性 | ||
``` | ||
多个任务可发送到一个队列,也可以灵活应用一个队列一个任务; | ||
生产者与消费者消息传递的是序列化的结构体,结构体由生产者提供,并自行反序列化操作; | ||
消费者: | ||
console/queue_daemon.go | ||
(队列需要单独控制台命令启动,与http服务独立[避免相互影响];) | ||
生产者(这里仅测试使用,正式应用一般在web代码中) | ||
console/queue_daemon.go | ||
``` | ||
|
||
- csrf防跨站攻击,此功能集成此中间件完成[点这里](https://github.com/utrack/gin-csrf),更多[中间件](https://github.com/gin-gonic/contrib)。 | ||
这里要重点说一下,utrack/gin-csrf这个中间件没有加白名单机制排除一些例外,这在实际应用中是很常见的,尤其是对外合作接口中。 | ||
我把此中间件代码集成到我自己的代码中来,把白名单功能补上了。这里直接用包名+函数名来定位,在配置文件conf/csrf_except.ini中配置, | ||
key值随意,不空,不重复即可,因不是实时读取,修改后需要重启web服务才生效。 | ||
|
||
- 数据验证,可自定义友好错误提示,[更多实例参考](https://github.com/thedevsaddam/govalidator); | ||
``` | ||
user_controller.go | ||
func UserAddAction(ctx *gin.Context) { | ||
if ctx.Request.Method == "POST" { | ||
//参数检验 | ||
rules := govalidator.MapData{ | ||
"name": []string{"required", "between:3,8"}, | ||
"age": []string{"digits:11"}, | ||
} | ||
messages := govalidator.MapData{ | ||
"name": []string{"required:用户名不能为空", "between:3到8位"}, | ||
"age": []string{"digits:手机号码为11位数字"}, | ||
} | ||
opts := govalidator.Options{ | ||
Request: ctx.Request, // request object | ||
Rules: rules, // rules map | ||
Messages: messages, // custom message map (Optional) | ||
RequiredDefault: false, // all the field to be pass the rules | ||
} | ||
v := govalidator.New(opts) | ||
e := v.Validate() | ||
//校验结果判断 | ||
if len(e)>0 { | ||
ctx.JSON(200, e) | ||
return | ||
} | ||
name := ctx.PostForm("name") | ||
age_str := ctx.PostForm("age") | ||
age_int, _ := strconv.Atoi(age_str) | ||
model_users.UserAdd(&entitys.User{Name: name, Age: age_int}) | ||
ctx.HTML(http.StatusOK, "user_add.html", gin.H{ | ||
"name": name, | ||
"age": age_int, | ||
}) | ||
} else { | ||
ctx.HTML(http.StatusOK, "user_add.html", gin.H{ | ||
"title": "用户添加", | ||
}) | ||
} | ||
} | ||
``` | ||
|
||
- INI配置文件读取操作,可分别加载多个配置文件; | ||
``` | ||
utils/config.go | ||
package utils | ||
import ( | ||
"fmt" | ||
"github.com/go-ini/ini" | ||
"os" | ||
) | ||
var Config *ini.File | ||
var CsrfExcept *ini.File | ||
var RootPath string | ||
func init() { | ||
RootPath="/Users/fuxiaojun/data/golang/gopath/src/go-gin-mvc" | ||
var err error | ||
Config, err = ini.Load(RootPath+"/conf/config.ini"); | ||
if err != nil { | ||
fmt.Printf("Fail to read file: %v", err) | ||
os.Exit(1) | ||
} | ||
CsrfExcept, err = ini.Load(RootPath+"/conf/csrf_except.ini"); | ||
if err != nil { | ||
fmt.Printf("Fail to read file: %v", err) | ||
os.Exit(1) | ||
} | ||
} | ||
使用: | ||
m_dsn := utils.Config.Section("mysql_master").Key("master").String() | ||
slaves := utils.Config.Section("mysql_slave").Keys() | ||
for _, s_dsn := range slaves { | ||
fmt.Println(s_dsn.String()) | ||
} | ||
``` | ||
|
||
- 定时任务; | ||
``` | ||
main.go | ||
//定时程序启动 | ||
c := cron.New() | ||
//数据库状态检查 | ||
c.AddFunc("*/600 * * * * *", models.DbCheck) | ||
c.Start() | ||
``` | ||
|
||
--- | ||
|
||
###cmd/xorm安装注意事项 | ||
``` | ||
正常安装命令: | ||
go get github.com/go-xorm/cmd/xorm | ||
但会报错,有两个包无法安装,cloud.google.com/go/civil,golang.org/x/crypto/md4,移步到https://github.com/GoogleCloudPlatform/google-cloud-go下载相应的包 | ||
GOPATH目录下新建cloud.google.com 文件夹(与github.com同级) | ||
cloud.google.com/go/civil | ||
golang.org/x/crypto/md4 | ||
进入cmd/xorm 运行命令 go build | ||
查看帮助 xorm help reverse | ||
``` | ||
##xorm生成struct | ||
``` | ||
xorm reverse mysql "root:12345678@tcp(dbm1.rs.youfa365.com:3306)/test?charset=utf8" . | ||
``` | ||
|
||
|
||
## 技术支持 | ||
- Mail:mydev@126.com |
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,28 +1,39 @@ | ||
[system] | ||
appname = xxx | ||
httpport = 8080 | ||
usecache = true | ||
app_name = xxx | ||
http_port = 8080 | ||
use_cache = true | ||
|
||
[cookie] | ||
domain = "" | ||
|
||
[session] | ||
sessionon = true | ||
sessionname = sessionid | ||
sessionname = gsessionid | ||
sessiongcmaxlifetime=14400 | ||
sessioncookielifetime=14400 | ||
sessiondomain="xxx.com" | ||
sessiondomain="localhost" | ||
sessionsecret="uqerhiiau86890akjfuKkUl" | ||
csrfscret="uqerhiiauayuUTYRrBB86890" | ||
|
||
[redis] | ||
address=192.168.1.168:6379 | ||
host=rs1.rs.youfa365.com:6379 | ||
database=0 | ||
max_idle=10 | ||
max_active=10240 | ||
idle_timeout=240 | ||
timeout=20 | ||
|
||
[mysql] | ||
masterDsn = "dbm1:xxx@tcp(dbm1.rs.xxx.com:3306)/dbname?charset=utf8&parseTime=True&loc=Asia%2fShanghai" | ||
slaveCount = 1 | ||
slaveDsn1 = "dbm1:xxx@tcp(dbs1.rs.xxx.com:3306)/dbname?charset=utf8&parseTime=True&loc=Asia%2fShanghai" | ||
slaveDsn2 = "dbm1:xxx@tcp(dbs1.rs.xxx.com:3306)/dbname?charset=utf8&parseTime=True&loc=Asia%2fShanghai" | ||
slaveDsn3 = "dbm1:xxx@tcp(dbs1.rs.xxx.com:3306)/dbname?charset=utf8&parseTime=True&loc=Asia%2fShanghai" | ||
[rabbitmq] | ||
connect=amqp://admin:[email protected]:5672/ | ||
|
||
|
||
|
||
[router] | ||
public="public" | ||
view_path="views/*" | ||
|
||
|
||
[mysql_master] | ||
master = "root:12345678@tcp(dbm1.rs.youfa365.com:3306)/test?charset=utf8&parseTime=True&loc=Asia%2fShanghai" | ||
[mysql_slave] | ||
dbs1 = "root:12345678@tcp(dbm1.rs.youfa365.com:3306)/test?charset=utf8&parseTime=True&loc=Asia%2fShanghai" | ||
dbs2 = "root:12345678@tcp(dbm1.rs.youfa365.com:3306)/test?charset=utf8&parseTime=True&loc=Asia%2fShanghai" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
[fuction] | ||
f1=users.UserAddAction |
Oops, something went wrong.