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

栏目: Go · 发布时间: 6年前

内容简介:我们假定数据库是html就是个表单 + ajax提交数据 没什么可讲的解释一下: 4.1.

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. 准备路由

~goblog/routers/router.go
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. 准备模型

~goblog/models
user.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 中有一行

_ "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. 准备控制器

~goblog/controllers
user.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. 所有控制器都需要组合

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
手摸手教你用beego实现留言本之二(实现注册模块)

本文github地址:待传


以上所述就是小编给大家介绍的《手摸手教你用beego实现留言本之二(实现注册模块)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Big Java Late Objects

Big Java Late Objects

Horstmann, Cay S. / 2012-2 / 896.00元

The introductory programming course is difficult. Many students fail to succeed or have trouble in the course because they don't understand the material and do not practice programming sufficiently. ......一起来看看 《Big Java Late Objects》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

MD5 加密
MD5 加密

MD5 加密工具