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

wujiangwei · · 1059 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

### 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

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

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

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