Beego系列之实战文章管理(3)

 今天要记录的是这两天写beego实战

1.控制器

2.数据库

3.路由

4.模板

5.前置校验

下面我们一一说说



第一个要说的是文件目录

conf 配置文件  比如配置ip端口等等

controllers  这个就是控制器文件

models 这个一般和操作数据库关系最大

routers  这个就是路由的配置文件了

static 这个是静态文件

views 这个就是我们放置模板文件的地方

main.go  程序运行的开始




其实只要理解了里面关键性的代码 其他都OK了


第一个

我们在写一个供别人访问的时候需要做这些

controllers  里定义结构体  创建方法引用结构体

比如这样

 同时在你的方法里定位模板的位置

比如

c.TplName = "article/index.html"

第二个

接下来就是根据你写的模板位置 写前端代码了  当然 这个顺序可以反着来


就是在views里创建的

第三个也是关键的一个

配置路由

beego.Router("/article/index", &controllers.ArtController{},"get:Index")

这里的ArtController是前边控制器创建的结构体,千万不要搞错了,后边的get:Index说的是 用get方法请求Index


这样子一个页面就下来了




那么再往下说

要渲染有数据的模板 那么首要就要现有数据

这里我们就说说models

首先我们新建model文件

第一步创建数据库数据结构

比如

//用户
type User struct {
Id int
Name string
Pwd string
}


这其实也是数据库的格式了

接下来就是连接数据库的操作了

func init() {
// set default database
orm.RegisterDataBase("default", "mysql", "root:root@tcp(127.0.0.1:3306)/gotest?charset=utf8&loc=Local", 30)

// register model
orm.RegisterModel(new(User))

// create table
orm.RunSyncdb("default", false, true)
}


在这里 gotest 是数据库 同时如果第一次玩时间操作的话你的时间往往会有8个小时的差距 这里 你就要设置  loc=Local

orm.RegisterModel(new(User))

这一步代表的是创建表user

这行代码里 RunSyncdb 第二个参数是说要不要覆盖之前创建好的,如果写为true那么你每次重启服务数据都被清空


第二步 控制器操作

其实模型里操作我基本都做到了这里了


基本的增删改查前边写过了 这里记录一下 进阶的

qs.Limit(limt,start).RelatedSel("ArticleType").Filter("ArticleType",tid).All(&artcile)

limt 多少条数据

start 第几条开始

连表查 ArticleType  查的是这里的条件 ArticleType标示 ArticleType_id 返回的数据到了&artcile

qs.RelatedSel("ArticleType").Filter("ArticleType",tid).Count()

这个是获取总数量的


这里说了 肯定也要说说怎么插入了

//1. orm对象
o := orm.NewOrm()
//2. 准备一个空箱子A
art := models.Article{}

//3. 空箱子A装东西
art.Title = title
art.Content = content
art.Image = fileimg

//4. 准备一个空箱子b ,从数据库拿数据放到里面
tp := models.ArticleType{}
tp.Id = artType
o.Read(&tp)

//5. 两个箱子关联起来
art.ArticleType = &tp

//6. 搬到仓库
re, err := o.Insert(&art) //返回插入的id 以及错误
if err != nil {
c.Ctx.WriteString("添加文章失败:")
println("报错了:", err)

return
}
beego.Info(re)
if re > 0 {
c.Ctx.WriteString("添加成功")
c.Redirect("/article/index",302)
} else {
c.Ctx.WriteString("添加失败")
}


中间有个文件上传的操作了

f,h,err := c.GetFile("images")
//文件格式
fileext :=path.Ext(h.Filename)
beego.Info(fileext)
if fileext != ".jpg" && fileext != ".png"{
c.Ctx.WriteString("文件类型不符合要求,请重新上传")
return
}

//文件大小
if h.Size > 500000{
c.Ctx.WriteString("文件太大,请重新上传")
return
}

//改文件名称
fileimg := "/static/img/" + time.Now().Format("2006-01-02-03-04-05")+fileext
defer f.Close()
err = c.SaveToFile("images","."+fileimg)

if err != nil {
c.Ctx.WriteString( fmt.Sprintf("%v",err) )
}


模板操作来


控制器里如果要渲染3条以上的数据 就要用到循环了

比如文章列表

这个时候模板是这么渲染的

{{range $index, $elem := .article}}
<tr>
<td>{{$index}}</td>
<td>{{$elem.Title}}</td>
<td>{{$elem.ArticleType.TypeName}}</td>
<td>{{.Content}}</td>
<td>{{.Addtime.Format "2006-01-02"}}</td>
<td>
<a href="/article/exit?id={{.Id}}"> 修改</a>
<a href="/article/del?id={{.Id}}"> 删除</a>
</td>
</tr>
{{end}}

当然还有这样

{{range .article}}
<tr>
<td>{{.Title}}</td>
<td>{{.Content}}</td>
<td>{{.Addtime}}</td>
</tr>
{{end}}

这些都是同一套数据的渲染


其实就是双大括号加点的方式


还有最关键的登录记忆

我们可以设置cookie 设置session

最后在路由配置里设置全局前置操作

获取到 相关参数 那你继续在线,没有那就对不起了


这个要放在所有路由的上边beego.InsertFilter

beego.InsertFilter("/",beego.BeforeRouter,fliteFunc)
var fliteFunc = func(Ctx *context.Context) {
var username = Ctx.Input.Cookie("username")
if username == ""{
Ctx.Redirect(302,"/user/login")
}
}




最后的最后 我再把代码贴一下喽,算了还是上传代码吧

beeDeno2.zip 

伍先生
  • 职业: 程序员,产品
  • 码龄: 4.1
  • 技能: PHP Go 前端
  • 微信: JwCode
  • 公众号/小程序: 渐悟分享