手摸手教你用beego实现留言本之二(实现注册模块)

wujiangwei · 2019-01-14 18:03:39 · 1180 次点击 · 预计阅读时间 6 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2019-01-14 18:03:39 的文章,其中的信息可能已经有所发展或是发生改变。

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提交数据 没什么可讲的

<!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函数体里面 加入如下地址:
beego.Router("/user/register", &controllers.UserController{},"get:Register")
beego.Router("/user/saveUser", &controllers.UserController{},"post:SaveUser")
  1. 路由设置的参照来源:https://www.kancloud.cn/hello123/beego/126122 自定义方法及 RESTful 规则 这一小节

4. 准备模型

  1. 找到目录 ~goblog/models
  2. 新建文件 user.go
  3. 文件内容
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中有一行

_ "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 结构体是是否为指针,有个很简单的判断方法

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. 文件内容
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. 所有控制器都需要组合

type UserController struct {
    beego.Controller
}

5.2. 如果我们返回的是json类型,我们需要先定义一个结构体

type ResponseJson struct {
    State int
    Message string
    Data int
}

当然 结构体的名称和字段类型你可以随便起,但是结构体的名称和字段首字母必须大写,否则你返回的 json可能是个空对象

使用json直接在函数里加上:

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

本文github地址:https://github.com/wujiangweiphp/beegostudy


有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1180 次点击  
加入收藏 微博
被以下专栏收入,发现更多相似内容
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传