视频地址: https://www.bilibili.com/video/BV1tE411h791?p=8
代码:https://github.com/why19970628/go_blog
创建项目
bee new class
运行
要养成良好的习惯,在终端运行,否则可能会找不要静态资源目录。
ORM
创建数据库
package models
import (
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
)
type User struct {
Id int
Name string
Pwd string
}
func init() {
// 注册驱动
//orm.RegisterDriver("mysql", orm.DR_MySQL)
// 注册默认数据库
// 我的mysql的root用户密码为tom,打算把数据表建立在名为test数据库里
// 备注:此处第一个参数必须设置为“default”(因为我现在只有一个数据库),否则编译报错说:必须有一个注册DB的别名为 default
orm.RegisterDataBase("default", "mysql", "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8")
orm.RegisterModel(new(User))
// //自动建表 重新
orm.RunSyncdb("default",false,true)
}
Beego ORM插入
package controllers
import (
"class/models"
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
_ "class/models"
)
type MainController struct {
beego.Controller
}
func (c *MainController) Get() {
// orm对象
o := orm.NewOrm()
user := models.User{
Id: 0,
Name: "wang",
Pwd: "666",
}
_, err := o.Insert(&user)
if err !=nil{
beego.Info("插入失败",err)
return
}
查询
除了id,需要给其他字段赋值
package controllers
import (
"class/models"
"fmt"
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
_ "class/models"
_ "github.com/go-playground/locales/om"
)
type MainController struct {
beego.Controller
}
func (c *MainController) Get() {
// orm对象
//o := orm.NewOrm()
//user := models.User{
// Id: 0,
// Name: "wang",
// Pwd: "666",
//}
//_, err := o.Insert(&user)
//if err !=nil{
// beego.Info("插入失败",err)
// return
o := orm.NewOrm()
user := models.User{}
//user.Id = 1
//err := o.Read(&user)
user.Name = "wang"
err := o.Read(&user,"Name")
if err != nil {
beego.Info("查询失败",err)
}
beego.Info("查询成功", user)
fmt.Print("查询:",user)
c.Data["data"] = "beego.me"
c.TplName = "index.html"
}
func (c *MainController) Post() {
c.Data["data"] = "哈哈"
c.TplName = "index.html"
}
文件上传
格式、大小、文件名
总结
//文章结构体
type Article struct {
Id int `orm:"pk;auto"`
ArtiName string `orm:"size(20)"` // 文章名字
Atime time.Time `orm:"auto_now"` // 发布时间
Acount int `orm:"default(0);null"` // 阅读量
Acontent string // 文章内容
Aimg string // 图片
Atype string // 类型
//ArticleType*ArticleType `orm:"rel(fk)"`
//User []*User `orm:"reverse(many)"`
}
删除提示
<script type="application/javascript">
window.onload =function () {
$(".dels").click(function() {
if(!confirm("是否确认删除?")){
return false
}
})
}
</script>
分页
获取总数,当前页,以及分页数量
// 显示首页内容
func (c *ArticleController)ShowIndex() {
o := orm.NewOrm()
var articles []models.Article
qs := o.QueryTable("Article")
//qs.All(&articles)
pageIndex := c.GetString("pageIndex")
pageIndex1 := 1
pageIndex1, _= strconv.Atoi(pageIndex)
if pageIndex1 < 1{
pageIndex1 =1
}
count, err := qs.Count()
pageSize := 2
start := pageSize * (pageIndex1 -1)
qs.Limit(pageSize,start).RelatedSel("ArticleType").All(&articles)
// 分页取整 +1
pageCount := float64(count)/float64(pageSize)
pageCount = math.Ceil(pageCount)
if err != nil{
beego.Info("查询所有文章信息出错")
return
}
// 分页: 判断当前页是否为首页或尾页
var FirstPage bool = false
var LastPage bool = false
//
if pageIndex1 ==1{
FirstPage = true
}
if pageIndex1 == int(pageCount){
LastPage = true
}
// 获取文章类型
var types []models.ArticleType
o.QueryTable("ArticleType").All(&types)
c.Data["types"] = types
beego.Info("count = ",count)
//beego.Info(articles)
c.Data["FirstPage"] =FirstPage
c.Data["LastPage"] =LastPage
c.Data["count"] =count
c.Data["pageCount"] = pageCount
c.Data["articles"] = articles
c.Data["pageIndex"] = pageIndex1
c.TplName = "index.html"
}
在模板中,可以添加函数来进行页数的加一减一操作
<ul class="pagenation">
<li><a href="/article/index">首页</a></li>
{{if compare .FirstPage true}}
<li>上一页</li>
{{else}}
<li> <a href="/article/index?pageIndex={{.pageIndex | PageUp}}">上一页</a></li>
{{end}}
{{if compare .LastPage true}}
<li>下一页</li>
{{else}}
<li> <a href="/article/index?pageIndex={{.pageIndex | PageDown}}">下一页</a></li>
{{end}}
<li><a href="/article/index?pageIndex={{.pageCount}}">末页</a></li>
<li>共{{.count}}条记录/共{{.pageCount}}页/当前{{.pageIndex}}页</li>
</ul>
- 在main函数中注册函数,实现分页效果
package main
import (
_ "class/models"
_ "class/routers"
"github.com/astaxie/beego"
"strconv"
)
func main() {
beego.AddFuncMap("PageUp",PageUp)
beego.AddFuncMap("PageDown",PageDown)
beego.Run()
}
func PageUp(page int) string {
pageIndex := page -1
if pageIndex <1{
}
pageIndex1 := strconv.Itoa(pageIndex)
return pageIndex1
}
func PageDown(page int) string {
pageIndex := page + 1
pageIndex1 := strconv.Itoa(pageIndex)
return pageIndex1
}
惰性查询
在需要查询关联表的时候,需要加入 RelatedSel的属性来关联查询,不然获取不到值
qs.Limit(pageSize,start).RelatedSel("ArticleType").All(&articles)