A web demo using Beego framework, with MongoDB, MySQL and Redis support.
这是一个基于 Beego 框架构建的应用 demo,后台数据库使用 MongoDB 和 MySQL,并使用 Redis 存储 session 和一些统计数据。
该部分使用的数据库是 MongoDB 和 Redis。
功能 | URL | Mode |
---|---|---|
注册 | /v1/users/register | POST |
登录 | /v1/users/login | POST |
登出 | /v1/users/logout | POST |
修改密码 | /v1/users/passwd | POST |
上传多个文件 | /v1/users/uploads | POST |
下载文件 | /v1/users/downloads | GET |
在 static/test 目录下有如下的测试表单,除了用于测试外,也可看出具体的数据通讯协议:
- register.html
- login.html
- logout.html
- passwd.html
- uploads.html
说明:
- 输入数据通过 form 表单提交,返回数据均为 json。
- 使用 Beego 的 ParseForm 功能将输入数据解析到 struct 中。
- 使用 Beego 的 Validation 功能对数据进行校验。
- 使用 scrypt 算法进行密码处理。
- 对于数据库返回的错误,单独区分“记录不存在”和“记录重复”两种错误。
- 由于 Beego 本身不支持多文件上传,故单独实现了 uploads API 来展示该功能,该功能与数据库无关。
该部分使用的数据库是 MySQL。
功能 | URL | Mode |
---|---|---|
获取一个角色信息 | /v1/roles/:id | GET |
获取所有角色信息 | /v1/roles | GET |
新增一个角色信息 | /v1/roles | POST |
修改一个角色信息 | /v1/roles/:id | PUT |
删除一个角色信息 | /v1/roles/:id | DELETE |
认证 | /v1/roles/auth | POST |
roles表结构如下:
Field | Type | Null | Key |
---|---|---|---|
id | bigint(20) | NO | PRI |
name | varchar(255) | YES | |
password | varchar(255) | YES | |
reg_date | datetime | YES |
初始建数据库表的脚本位于:scripts/sql/db.sql。
多记录 api,提供如下参数:
- query=col1:op1:val1,col2:op2:val2 ...
- order=col1:asc|desc,col2:asc|esc ...
- limit=n,缺省为 10
- offset=n,缺省为 0
query 的 op 值:
- eq,等于
- ne,不等于
- gt,大于
- ge,大于等于
- lt,小于
- le,小于等于
说明:
- 参考 RESTful 模式设计 API。
- 使用 JSON Web Token (JWT) 做认证手段。
- 输入数据采用 json,返回数据也是 json。
- 数据库操作使用原生 SQL,没有采用 ORM。
- 对可能的 NULL 值做了处理。
- 多记录查询通过拼接 SQL 语句实现,故对输入参数做了一些校验和处理。
- 同样单独区分“记录不存在”和“记录重复”两种数据库错误。
包括安装 go,设置 $GOPATH 等,具体可参考:How to Write Go Code。
在 conf/app.conf 中设置 MongoDB 参数,如:
[mongodb]
url = mongodb://127.0.0.1:27017/beego-demo
完整的 url 写法可参考:http://godoc.org/gopkg.in/mgo.v2#Dial
这里单独封装了一个 mymongo 包来实现数据库的初始化,以简化后续的数据库操作。
在 conf/app.conf 中设置 MySQL 参数,如:
[mysql]
url = root:root@/beego-demo?charset=utf8&parseTime=True&loc=Local
完整的 url 写法可参考:https://github.com/go-sql-driver/mysql#dsn-data-source-name
这里单独封装了一个 mymysql 包来实现数据库的初始化,以简化后续的数据库操作。
在 conf/app.conf 中设置 Redis 参数,涉及两个地方,一个是 session,一个是 cache,两者可以不同:
sessionproviderconfig = 127.0.0.1:6379
[cache]
server = 127.0.0.1:6379
password =
这里单独封装了一个 myredis 包来实现数据库的初始化,以简化后续的数据库操作。
克隆代码:
$ git clone https://github.com/gwduan/beego-demo.git
$ cd beego-demo/
之前使用 glide 工具来管理依赖包,从go1.13 开始,切换到Go Modules 。
编译:
$ go build
运行:
$ ./beego-demo
也可安装 bee 工具,这在调试阶段很好用:
$ go get -u github.com/beego/bee
通过bee运行:
$ bee run
当前版本:
$ bee version
______
| ___ \
| |_/ / ___ ___
| ___ \ / _ \ / _ \
| |_/ /| __/| __/
\____/ \___| \___| v1.10.0
├── Beego : 1.12.0
├── GoVersion : go1.13.1
├── GOOS : linux
├── GOARCH : amd64
依赖包列表:
- github.com/astaxie/beego
- github.com/astaxie/beego/session/redis
- gopkg.in/mgo.v2
- github.com/gomodule/redigo/redis
- github.com/go-sql-driver/mysql
- golang.org/x/crypto/scrypt
- github.com/dgrijalva/jwt-go
正式部署时,可通过系统的 Init 服务来启动。在 scripts 目录下有 upstart 和 systemd 两套简易示例脚本,可参考使用。
例如,在 CentOS 6 下,复制 upstart/bdemo.conf 到 /etc/init/,相应修改后,执行:
# start bdemo
在 CentOS 7 下,复制 systemd/bdemo.service 到 /etc/systemd/system/,相应修改后,执行:
# systemctl daemon-reload
# systemctl enable bdemo.service
# systemctl start bdemo.service
由于 Init 是由 root 控制的,相应的服务缺省也具有 root 权限,故一般都应该做降权处理。可在 systemd 和 upstart 脚本中设置运行时的普通用户名和组名,具体可参考官方文档。
降权的问题在于普通用户无法绑定特权端口(如 80 ),不过实际环境下,还是建议在前面部署 Nginx 等成熟的 web 服务器,通过反向代理来访问应用。