### 1. 准备表
我们假定数据库是 `my_blog`,表名是 `user`
```
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`password` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
```
### 2. 准备模板register.tpl
> html就是个表单 + ajax提交数据 没什么可讲的
```html
<!DOCTYPE html>
<html>
<head>
<title>用户注册</title>
<link href="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<script type="text/javascript" src="http://cdn.static.runoob.com/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div class="form-group">
<label for="text">用户名:</label>
<input type="text" class="form-control" id="name" placeholder="用户名">
</div>
<div class="form-group">
<label for="text">密码:</label>
<input type="text" class="form-control" id="password" placeholder="密码">
</div>
<div class="form-group">
<button class="btn btn-primary" onclick="register()">注册</button>
<button class="btn btn-primary" onclick="login()">登录</button>
</div>
<div>
<label id="status"></label>
</div>
</div>
<!--JS部分-->
<script type="text/javascript">
//登陆功能
function register() {
$.ajax({
type: 'POST',
url: '/user/saveUser',
data: {
"name": $("#name").val(),
"password": $("#password").val()
},
success: function (result) {
if(result.State > 0){
alert(result.Message);
}else{
alert("注册成功");
//location.href = "/user/login"
}
}
})
}
</script>
</body>
</html>
```
### 3. 准备路由
1. 找到文件 `~goblog/routers/router.go`
2. 编辑文件,在 `init`函数体里面 加入如下地址:
```go
beego.Router("/user/register", &controllers.UserController{},"get:Register")
beego.Router("/user/saveUser", &controllers.UserController{},"post:SaveUser")
```
3. 路由设置的参照来源:https://www.kancloud.cn/hello123/beego/126122
`自定义方法及 RESTful 规则` 这一小节
### 4. 准备模型
1. 找到目录 `~goblog/models`
2. 新建文件 `user.go`
3. 文件内容
```go
package models
import (
"fmt"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
)
type User struct {
Id int
Name string `orm:"size(50)"`
Password string `orm:"size(50)"`
}
func init() {
orm.RegisterDriver("mysql", orm.DRMySQL) //设置驱动
orm.RegisterDataBase("default", "mysql", "root:@/my_blog?charset=utf8", 30)//连接数据库
orm.RegisterModel(new(User)) //注册模型
}
/**
添加一条数据
*/
func (user User) SaveOne() (int, error) {
o := orm.NewOrm()
if created, id, err := o.ReadOrCreate(&user,"name"); err == nil {
if created {
return int(id) , nil
} else {
//更新
user.Id = int(id)
if num, err := o.Update(&user); err == nil && num > 0 {
return int(id) , nil
}
}
}
return 0 , fmt.Errorf("save fail")
}
```
解释一下:
4.1. `imports`中有一行
```go
_ "github.com/go-sql-driver/mysql"
```
这句话是引入sql驱动mysql, 由于mysql在当前包中没有显示的调用,所有会被编译错误
但是我们的orm中有需要,所以用 `_` 来声明 是会触发调用mysql包的 `init` 函数
4.2 设置`struct` 用来保存`user` 表中的数据结构
一般有几个字段设置几个成员,根据名称设置值,注意两点:
. 字段首字母大写
. 数据库中下划线改成大写首字母
4.3 `init` 函数中做了三件事,分别是注册驱动、连接mysql 和 注册模型 注册模型可能会出现
```
goblog:<Ormer> cannot use non-ptr model struct `goblog/models.User`
```
错误,这时候需要仔细检查调用者`orm` 在传递user 结构体是是否为指针,有个很简单的判断方法
```go
o := orm.NewOrm()
err := o.Read(你的参数)
fmt.Println(你的参数)
```
如果打印出来携带 `&` 那么就是正确的,因为orm传递过去的方法是指针类型,否则不带的话,
你需要在参数前面手动加上 `&`
4.4 有关模型的使用详细可参照 :https://www.kancloud.cn/hello123/beego/126104
### 5. 准备控制器
1. 找到目录 `~goblog/controllers`
2. 新建文件 `user.go`
3. 文件内容
```go
package controllers
import (
"github.com/astaxie/beego"
"goblog/models"
)
type UserController struct {
beego.Controller
}
type ResponseJson struct {
State int
Message string
Data int
}
func (c *UserController) Register() {
c.TplName = "register.tpl"
}
func (c *UserController) SaveUser() {
user := models.User{}
user.Name = c.Input().Get("name")
user.Password = c.Input().Get("password")
response := ResponseJson{State:0,Message:"ok"}
if id, err := user.SaveOne(); err != nil {
response.State = 500
response.Message = "保存失败,请稍后再试"
} else {
response.Data = id
}
c.Data["json"] = response
c.ServeJSON()
}
```
解释说明
5.1. 所有控制器都需要组合
```go
type UserController struct {
beego.Controller
}
```
5.2. 如果我们返回的是json类型,我们需要先定义一个结构体
```go
type ResponseJson struct {
State int
Message string
Data int
}
```
当然 结构体的名称和字段类型你可以随便起,但是结构体的名称和字段`首字母必须大写`,否则你返回的
json可能是个空对象
使用json直接在函数里加上:
```go
response := ResponseJson{State:0,Message:"ok"}
c.Data["json"] = response
c.ServeJSON()
```
更多类型返回细节可以参见 : https://www.kancloud.cn/hello123/beego/126130
5.3 获取web参数 可参见:https://www.kancloud.cn/hello123/beego/126125
### 6. 运行
```
bee run
```
<img src="https://static.studygolang.com/190114/43fed0751da4f1463c3d9f9cf13120d0.png" width="80%" align="center"/>
本文github地址:https://github.com/wujiangweiphp/beegostudy
有疑问加站长微信联系(非本文作者))