Beego框架学习

1.1软件框架

一个公司是由公司中的各部部门来组成的,每一个部门拥有特定的职能,部门与部门之间通过相互的配合来完成让公司运转起来。

一个软件框架是由其中各个软件模块组成的,每一个模块都有特定的功能,模块与模块之间通过相互配合来完成软件的开发。

软件框架是针对某一类软件设计问题而产生的。

作用:避免重复造轮子(写重复代码)

1.2beego

beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API、Web 及后端服务等各种应用,是一个 MVC 的框架,主要设计灵感来源于 tornado、sinatra 和 flask 这三个框架,但是结合了 Go 本身的一些特性(interface、struct 嵌入等)而设计的一个框架。

Beego.me

1.3MVC

  1. M Model,模型,数据库操作,增删改查
  2.  
  3. V View,视图, 接收C传输的数据,组织html界面
  4.  
  5. C Controller,控制器, 接收数据,数据处理,传输数据给MV并接收应答,返回应答给浏览器 

通过浏览器注册用户信息。

施乐公司

MVC的产生理念: 分工。让专门的人去做专门的事。

1.4环境安装

需要安装或者升级 Beego 和 Bee 的开发工具:

  1. go get -u github.com/astaxie/beego
  2.  
  3. go get -u github.com/beego/bee

安装完之后,bee 可执行文件默认存放在 $GOPATH/bin 里面,所以需要把 $GOPATH/bin 添加到您的环境变量中,才可以进行下一步

  1. echo 'export PATH="$GOPATH/bin:$PATH"' >> ~/.bashrc
  2.  
  3. source .bashrc

安装好之后,运营bee new quickstart来创建一个项目,注意:通过bee创建的项目代码都是在$GOPATH/src目录下面。

生成的项目目录结构如下:

quickstart

  1. |-- conf
  2. | -- app.conf
  3. |-- controllers
  4. | -- default.go
  5. |-- main.go
  6. |-- models
  7. |-- routers
  8. | -- router.go
  9. |-- static
  10. | |-- css
  11. | |-- img
  12. | -- js
  13. |-- tests
  14. | -- default_test.go
  15. -- views
  16. -- index.tpl

进入项目目录执行bee run命令,在浏览器输入网址:127.0.0.1:8080,显示如下:

1.5 beego的项目结构分析

  1. ├── conf
  2. └── app.conf
  3. ├── controllers
  4. ├── admin
  5. └── default.go
  6. ├── main.go
  7. ├── models
  8. └── models.go
  9. ├── static
  10. ├── css
  11. ├── ico
  12. ├── img
  13. └── js
  14. └── views
  15. ├── admin
  16. └── index.tpl

从上面的目录结构我们可以看出来 M(models 目录)、V(views 目录)和 C(controllers 目录)的结构, main.go 是入口文件。

1.6项目路由设置

打开我们项目的入口main.go

  1. package main
  2. import (
  3. _ "quickstart/routers"
  4. "github.com/astaxie/beego"
  5. )
  6. func main() {
  7. beego.Run()
  8. }

我们知道main函数是整个项目的入口并且go的执行过程如下图所示:

这时候我们就发现了main里面导入了"quickstart/routers",并且执行了这个包里面的init函数,routers包的内容如下:

  1. package routers
  2. import (
  3. "quickstart/controllers"
  4. "github.com/astaxie/beego"
  5. )
  6. func init() {
  7. beego.Router("/", &controllers.MainController{})
  8. }

路由包里面我们看到执行了路由注册 beego.Router, 这个函数的功能是映射 URL 到 controller,第一个参数是 URL (用户请求的地址),这里我们注册的是 /,也就是我们访问的不带任何参数的 URL,第二个参数是对应的 Controller,也就是我们即将把请求分发到那个控制器来执行相应的逻辑,我们可以执行类似的方式注册如下路由:

  1. beego.Router("/user", &controllers.UserController{})

这样用户就可以通过访问 /user 去执行 UserController 的逻辑。这就是我们所谓的路由(要在controllers包里面有名字为UserController才能调用)

1.7ORM

beego中内嵌了ORM框架,ORM框架可以将结构体和数据表进行对应起来,只需要通过结构体和对象就可以对数据表进行操作。

设计类:模型类。

ORM另外一个作用:根据设计的类生成数据库中的表。

安装ORM

  1. go get github.com/astaxie/beego/orm
  2.  
  3. go get -u github.com/go-sql-driver/mysql 

// 设置数据库基本信息

  1. orm.RegisterDataBase("default", "mysql", "root:123456@tcp(127.0.0.1:3306)/test1?charset=utf8")

// 映射model数据

  1. orm.RegisterModel(new(Book))

// 生成表

  1. orm.RunSyncdb("default", false, true)

1.7.1 ORM对数据进行操作

插入

  1. o := orm.NewOrm()
  2.  
  3. var user User
  4.  
  5. user.Name = "slene"
  6.  
  7. user.Pwd= true
  8.  
  9. id, err := o.Insert(&user)
  10.  
  11. if err == nil {
  12.  
  13. fmt.Println(id)
  14.  
  15. }

查询

  1. o := orm.NewOrm()
  2.  
  3. user := User{Id: }
  4.  
  5. err := o.Read(&user)
  6.  
  7. 也可以指定字段查询
  8.  
  9. user := User{Name: "slene"}
  10.  
  11. err = o.Read(&user, "Name")
  12.  
  13. ...

更新

  1. o := orm.NewOrm()
  2.  
  3. user := User{Id: }
  4.  
  5. if o.Read(&user) == nil {
  6.  
  7. user.Name = "MyName"
  8.  
  9. if num, err := o.Update(&user); err == nil {
  10.  
  11. fmt.Println(num)
  12.  
  13. }
  14.  
  15. }

也可以指定更新的字段

  1. // 只更新 Name
  2.  
  3. o.Update(&user, "Name")
  4.  
  5. // 指定多个字段
  6.  
  7. // o.Update(&user, "Field1", "Field2", ...)
  8.  
  9. ...

删除

  1. o := orm.NewOrm()
  2.  
  3. if num, err := o.Delete(&User{Id: }); err == nil {
  4.  
  5. fmt.Println(num)
  6.  
  7. }
  1. c.Data["errmsg"] = "sda"
  2. c.TplName = "login.html"
  3. 指定视图文件,同时可以给这个视图传递一些数据
  4. 能传递数据
  5.  
  6. c.Redirect("/login",)
  7. 跳转。不能传递数据。速度快
  8.  
  9. Redirect("/login",)
  10. 第一个参数是URL地址
  11. 第二个参数是HTTP的状态码
  12.  
  13. 1xx 请求已经被接收,需要继续发送请求
  14. 2xx 请求成功
  15. 3xx 请求资源被转移,请求被转接
  16. 4xx 请求失败
  17. 5xx 服务器错误         

1.8案例

注册

  1. 先实现注册视图
  2. 注册发送POST请求
  3. Beego处理传过来的数据
  4. 对数据进行判断
  5. 如果成功返回登陆界面

登陆

登陆成功返回字符串

登陆失败返回注册界面

新闻发布系统 

1模型创建

1.1 表属性设置

  1. 设置主键 `pk`
  2.  
  3. 设置自增`auto`
  4.  
  5. Field 类型为 int, int32, int64, uint, uint32, uint64 时,可以设置字段为自增健,当模型定义里没有主键时,符合上述类型且名称为 Id Field 将被视为自增健.
  6.  
  7. 设置默认值 `default()`
  8.  
  9. 设置长度`orm:size()`
  10.  
  11. 设置允许为空`null`,数据库默认是非空,设置null之后就可以变为`ALLOW NULL`
  12.  
  13. 设置唯一`orm:”unique”`
  14.  
  15. 设置浮点数精度orm:"digits(12);decimals(4)"` 总共12位,四位是小数位
  16.  
  17. 设置时间:`orm:"auto_now_add;type(datetime)"`
  18.  
  19. `orm:"auto_now;type(date)"`

auto_now 每次 model 保存时都会对时间自动更新

auto_now_add 第一次保存时才设置时间

设置时间的格式:type

2 新闻信息插入

 2.1请求数据处理

  1. GetString(key string) string
  2.  
  3. GetStrings(key string) []string
  4.  
  5. GetInt(key string) (int64, error)
  6.  
  7. GetBool(key string) (bool, error)
  8.  
  9. GetFloat(key string) (float64, error)

2.2 文件上传

在beego中能够很容易的处理文件上传,但是需要特别注意在上传文件时form里面一定要添加enctype="multipart/form-data",不然浏览器不会上传你的文件

文件上传前端代码如下:

  1. <form enctype="multipart/form-data" method="post">
  2.  
  3. <input type="file" name="uploadname" />
  4.  
  5. <input type="submit">
  6.  
  7. </form>

后台代码如下:

  1. func (c *FormController) Post() {
  2.  
  3. f, h, err := c.GetFile("uploadname")
  4.  
  5. defer f.Close()
  6.  
  7. if err != nil {
  8.  
  9. fmt.Println("getfile err ", err)
  10.  
  11. } else {
  12.  
  13. c.SaveToFile("uploadname", "/www/"+h.Filename)
  14.  
  15. }
  16.  
  17. }

注意后台保存文件名不能重复

3 新闻信息展示

3.1路由数据处理

固定路由

  1. beego.Router("/", &controllers.MainController{})

正则路由

  1. beego.Router("/api/:id([0-9]+)", &controllers.RController{})

自定义正则匹配数字 //匹配 /api/123

  1. controller获取,this.Ctx.Input.Param(":id") :id =
  1. beego.Router("/user/:username([\w]+)", &controllers.RController{})

正则字符串匹配 //匹配 /user/itcast

  1. Controller获取,this.Ctx.Input.Param(":username") :username = itcast
  2.  
  3. beego.Router("/download/ceshi/*", &controllers.RController{})

全匹配方式 //匹配 /download/ceshi/file/api.json

  1. Controller获取,this.Ctx.Input.Param(":splat") :splat= file/api.json(注意,这里的splat是系统规定的关键字,写错取不到数据)
  2.  
  3. beego.Router("/download/ceshi/*.*", &controllers.RController{})

文件名和文件地址匹配/download/ceshi/api.json

  1. Controller获取 this.Ctx.Input.Param(":path")
  2.  
  3. this.Ctx.Input.Param(":ext") :path = api :ext=json 

注解路由

  1. // @router /staticblock/:key [get]
  2.  
  3. func (this *CMSController) StaticBlock() {

  4. }

自定义方法

可以多个请求,访问一个方法

  1. beego.Router("/api",&RestController{},"get,post:ApiFunc")

不同的 method 对应不同的函数,通过 ; 进行分割

  1. beego.Router("/simple",&SimpleController{},"get:GetFunc;post:PostFunc")

所有的method访问同一个方法:

  1. beego.Router("/api/list",&RestController{},"*:ListFood")

如果同时存在 * 和对应的 HTTP Method,那么优先执行 HTTP Method 的方法,例如同时注册了如下所示的路由

  1. beego.Router("/simple",&SimpleController{},"*:AllFunc;post:PostFunc")

那么执行 POST 请求的时候,执行 PostFunc 而不执行 AllFunc。

注意:在注册了自定义方法之后,就不会再默认的访问GET或者POST方法

3.2查询方法

  1. ORM QuerySeter 来组织查询,每个返回 QuerySeter 的方法都会获得一个新的 QuerySeter 对象。

All方法

返回对应的结果集对象

  1. var users []*User
  2.  
  3. num, err := o.QueryTable("user").Filter("name", "slene").All(&users)
  4.  
  5. fmt.Printf("Returned Rows Num: %s, %s", num, err) 

One

尝试返回单条记录

  1. var user User
  2.  
  3. err := o.QueryTable("user").Filter("name", "slene").One(&user)
  4.  
  5. if err == orm.ErrMultiRows {
  6.  
  7. // 多条的时候报错
  8.  
  9. fmt.Printf("Returned Multi Rows Not One")
  10.  
  11. }
  12.  
  13. if err == orm.ErrNoRows {
  14.  
  15. // 没有找到记录
  16.  
  17. fmt.Printf("Not row found")
  18.  
  19. }

OrderBy

根据某一属性进行排序

3.3 视图页面数据获取与处理

  1. Range

4 编辑新闻信息

  1. ) 先获取详细信息
  2.  
  3. ) 修改详细信息

5 查看详细

  1. )所有信息的显示

6 删除信息

  1. 提示是否删除(前端处理)
  2.  
  3. 删除信息

7 分页展示

  1. 分页的好处
  2.  
  3. )数据都要读到缓存,加载缓慢,提升网页访问速度
  4.  
  5. )减少页面条目数

7.1模板函数

7.2 Limit函数

7.3 Count函数

7.4 URL传参

1 分页展示

分页的好处

1)数据都要读到缓存,加载缓慢,提升网页访问速度

2)减少页面条目数

1.1模板函数

1.2 Limit函数

获取部分数据

1.3 Count函数

获取数据条目数

表关系设置

一对一

  1. rel(one)
  2.  
  3. reverse(one)

一对多

  1. rel(fk) //forign key
  2.  
  3. reverse(many)

多对多

  1. rel(m2m)
  2.  
  3. reverse(many)

on_delete()

设置对应的 rel 关系删除时,如何处理关系字段。

  1. cascade 级联删除(默认值)
  2.  
  3. set_null 设置为 NULL,需要设置 null = true
  4.  
  5. set_default 设置为默认值,需要设置 default
  6.  
  7. do_nothing 什么也不做,忽略  

Filter

  1. exact / iexact 等于
  2.  
  3. contains / icontains 包含
  4.  
  5. [gt / gte](#gt / gte) 大于 / 大于等于
  6.  
  7. [lt / lte](#lt / lte) 小于 / 小于等于
  8.  
  9. startswith / istartswith 以...起始
  10.  
  11. endswith / iendswith 以...结束
  12.  
  13. in
  14.  
  15. isnull

RelatedSel()

  1. 相当于inner join 一对多关系的时候必须加这个方法才能进行多表查询

Session

Cookie

小结

Model

表的设计

  1. 表的属性
  2. 表之间的关系
  3. Insert

表的操作

  1. 把对应的字段赋值,插入
  2.  
  3. Delete
  4. 查询到数据,删除
  5.  
  6. Update
  7. 获取到相应数据,删除
  8.  
  9. Read
  10. Queryseter方法
  11.  
  12. All One Count Limit OrderBy Filter RelatedSel LoadRelated 

View

数据的获取

  1. {{.data}}
  2.  
  3. 逻辑控制
  4.  
  5. {{if }} {{else}} {{end}}
  6.  
  7. {{range}} {{end}}
  8.  
  9. {{range $index,$value := .data}}

视图函数

  1. {{.data | func}}
  2.  
  3. addFuncMap()

Controller

  1. 路由相关
  2. 正则路由
  3. URL传值
  4. 请求数据处理
  5. This.GetInt
  6. This.GetString

  7. 静态文件上传
  8. Session
  9. cache

Beego Learning Notes的更多相关文章

  1. rt-thread learning notes

    rt-thread learning notes 2018-01-15 > 001 具有相同优先级的线程,每个线程的时间片大小都可以在初始化或创建该线程时指定 rt_thread_t rt_th ...

  2. Mybatis Learning Notes 1

    Mybatis Learning Notes 主要的参考是博客园竹山一叶的Blog,这里记录的是自己补充的内容 实体类属性名和数据库不一致的处理 如果是实体类的结果和真正的数据库的column的名称不 ...

  3. Rust learning notes

    Rust learning notes Rust Version 1.42.0 $ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs ...

  4. D3 learning notes

    D3 https://d3js.org/ 数据驱动文档显示, 利用 SVG HTML CSS技术. D3.js is a JavaScript library for manipulating doc ...

  5. Coursera, Machine Learning, notes

      Basic theory (i) Supervised learning (parametric/non-parametric algorithms, support vector machine ...

  6. 【Learning Notes】线性链条件随机场(CRF)原理及实现

    1. 概述条件随机场(Conditional Random Field, CRF)是概率图模型(Probabilistic Graphical Model)与区分性分类( Discriminative ...

  7. SQL Learning Notes

    Sams Teach Yourself SQL in 10 Minutes

  8. go learning notes

    1)  cgo $go install test.go # command-line-arguments /usr/bin/ld: unrecognized option '--build-id=no ...

  9. Java learning notes (1):Basic Knowlege points

    Basic Knowlege points: 1: it's necessary that there is only one public class in per .java file 2: .j ...

随机推荐

  1. html 未选择复选框不上传

    问题 之前就遇到类似的问题,在一个列表中,如果有复选框,并且不选中 会导致这个复选框不上传,导致后台接收不到复选框数据 解决方法我想到的就是 <td> <input type=&qu ...

  2. HBase 中读 HDFS 调优

    HDFS Read调优 在基于 HDFS 存储的 HBase 中,主要有两种调优方式: 绕过RPC的选项,称为short circuit reads 开启让HDFS推测性地从多个datanode读数据 ...

  3. django入门(二)MTV开发模式

    MTV开发模式,顾名思义,M是models,T是templates,V是view. 之前的教程没有牵扯到html,然后今天将告诉你如何转到自己做的静态页面 首先还是先创建一个app,python ma ...

  4. intellij手动创建Mybatis遇到java.io.IOException: Could not find resource mybatis.xml

    将配置文件夹设置成resources即可

  5. js数组和对象

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. JVM 引用类型

    1.强引用 强引用,是在我们的开发工作当中普遍存在的.如果一个对象具有强引用,那就类似我们经常穿的衣服啊等必不可少的生活用品,我们肯定不会把他扔掉,同样jvm的垃圾回收器也不会回收它.当内存空间不足的 ...

  7. SQL Server带列名导出到Excel(Export to CSV with headers)的几个思路

    https://www.cnblogs.com/downmoon/archive/2012/05/04/2482995.html   SQL Server 2008中SQL应用系列及BI学习笔记系列- ...

  8. Bugku-CTF之多次

    Day33   多次 http://123.206.87.240:9004 本题有2个flag flag均为小写 flag格式 flag{}  

  9. 小白科普:Netty有什么用?

    随着移动互联网的爆发性增长,小明公司的电子商务系统访问量越来越大,由于现有系统是个单体的巨型应用,已经无法满足海量的并发请求,拆分势在必行. 在微服务的大潮之中, 架构师小明把系统拆分成了多个服务,根 ...

  10. 从TCL欲成JDI股东看,面板行业进入“群架”时代

    当下,屏幕早已成为第一入口.PC.智能手机.平板电脑.电视.家庭智能终端.智慧交通.智能穿戴设备.汽车中控大屏--种种设备都是以屏幕为最重要的视觉呈现方式,让人们在一个个奇幻世界中畅游.也正是因为屏幕 ...