创建项目
bee new zhiliao_blob
go mod init zhiliao_blob
go mod vendor
bee run
MVC基本结构
controller
//controllers/cms/login.go
package cms;
import (
"github.com/astaxie/beego"
)
type LoginController struct {
beego.Controller
}
func (l *LoginController) Get(){
l.TplName = "cms/login.html"
}
router
// routers/router.go
package routers
import (
"github.com/astaxie/beego"
"zhiliao_blob/controllers/cms"
)
func init() {
beego.Router("/cms",&cms.LoginController{})
}
view
// views/cms/login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
login
</body>
</html>
main.go
package main
import (
_ "zhiliao_blob/routers"
"github.com/astaxie/beego"
"fmt"
)
func main() {
fmt.Println("aa")
beego.Run()
}
登录模块
model
//models/user.go
package models
import (
"time"
"github.com/astaxie/beego/orm"
)
type User struct {
Id int `orm:"pk;auto"`
UserName string `orm:"description(用户名);index;unique"`
Password string `orm:"description(密码)"`
IsAdmin int `orm:"description(1是管理员,2是普通用户);default(2)"`
CreateTime time.Time `orm:"auto_now_add;type(datetime);description(创建时间)"`
Cover string `orm:"description(头像);default(static/upload/bq3.png)"`
}
func (u *User) TableName() string{
return "sys_user"
}
func init(){
orm.RegisterModel(new(User))
}
mysql和orm
配置mysql
//conf/app.conf
include "mysql.conf"
// conf/mysql.conf
username = root
password = 123456
host = 127.0.0.1
port = 3306
database = zhiliao_blob
初始化连接mysql和自动建表
//main.go
package main
import (
"fmt"
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
_ "zhiliao_blob/routers"
_ "github.com/go-sql-driver/mysql"
_ "zhiliao_blob/models"
)
func init() {
username := beego.AppConfig.String("username")
password := beego.AppConfig.String("password")
host := beego.AppConfig.String("host")
port := beego.AppConfig.String("port")
database := beego.AppConfig.String("database")
datasource := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&loc=Local",username,password,host,port,database)
orm.RegisterDriver("mysql",orm.DRMySQL)
orm.RegisterDataBase("default","mysql",datasource)
fmt.Println("连接数据")
name := "default"
force := false
verbose := true
err := orm.RunSyncdb(name,force,verbose)
if err != nil {
panic(err)
}
//orm.Debug = true
}
func main() {
fmt.Println("aa")
orm.RunCommand()
beego.Run()
}
登录过滤
登录前只能仿问登录页,登录后允许仿问其它页面
router
package routers
import (
"github.com/astaxie/beego"
"zhiliao_blob/controllers/cms"
)
func init() {
beego.Router("/cms",&cms.LoginController{}) //登录页
beego.Router("/cms/main/main",&cms.MainController{}) // cms主页
beego.Router("/cms/main/welcome",&cms.MainController{},"get:Welcome") //cms欢迎页
}
开启session
// conf/app.conf
sessionon = true
controller
登录逻辑判断,验证用户名和密码,以及存session
package cms;
import (
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
"zhiliao_blob/models"
"fmt"
)
type LoginController struct {
beego.Controller
}
func (l *LoginController) Post() {
username := l.GetString("username") // 特殊字符过滤。?/
password := l.GetString("password") // 长度校验
md5_pwd := utils.GetMd5(password)
o := orm.NewOrm()
exist := o.QueryTable(new(models.User)).Filter("UserName",username).Filter("Password",password).Exist()
// Filter("Password",md5_pwd)
if exist {
l.SetSession("cms_user_name",username)
fmt.Println("登录成功")
l.Redirect(beego.URLFor("MainController.Get"),302)
}else {
fmt.Println("登录error")
l.Redirect(beego.URLFor("LoginController.Get"),302)
}
}
路由过滤
判断是否有session
package utils
import (
"github.com/astaxie/beego/context"
"github.com/astaxie/beego"
)
func CmsLoginFilter(ctx *context.Context) {
cms_user_name := ctx.Input.Session("cms_user_name")
if cms_user_name == nil{
ctx.Redirect(302,beego.URLFor("LoginController.Get"))
}
}
main.go 应用路由过滤
package main
import (
"github.com/astaxie/beego"
_ "zhiliao_blob/routers"
"zhiliao_blob/utils"
)
func main() {
beego.InsertFilter("cms/main/*",beego.BeforeRouter,utils.CmsLoginFilter)
beego.Run()
}
帖子(post)模块
建立model
user
和post
是一对多的关系,外键在多的一方(post)
- user模型中:反向关系,没有外键
Posts []*Post `orm:"reverse(many)"`
- post模型中:正向关系,有外键
Author *User `orm:"description(帖子作者);rel(fk)"`
post
// models/post.go
package models
import (
"time"
)
type Post struct {
Id int `orm:"pk;auto"`
Title string `orm:"description(帖子标题)"`
Desc string `orm:"description(帖子描述)"`
Content string `orm:"size(4000);description(帖子内容)"`
Cover string `orm:"description(帖子封面图);default(static/upload/no_pic.jpg)"`
ReadNum int `orm:"description(帖子阅读数);default(0)"`
StarNum int `orm:"description(帖子点赞数);default(0)"`
Author *User `orm:"description(帖子作者);rel(fk)"` //关联user
CreateTime time.Time `orm:"auto_now_add;type(datetime);description(创建时间)"`
}
func (p *Post) TableName() string {
return "sys_post"
}
修改user
的model
type User struct {
//...
Posts []*Post `orm:"reverse(many)"` //新增
}
func (u *User) TableName() string{
return "sys_user"
}
func init(){
orm.RegisterModel(new(User),new(Post)) //新增
}
controller
返回切片数据
// controllers/cms/post.go
package cms
import (
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
"zhiliao_blob/models"
"fmt"
)
type PostController struct {
beego.Controller
}
func (p *PostController) Get() {
o := orm.NewOrm()
posts := []models.Post{}
qs := o.QueryTable(new(models.Post))
qs.All(&posts)
fmt.Println("posts---",posts)
p.Data["posts"] = posts;
p.TplName = "cms/post-list.html"
}
view
在模板中遍历展示切片数据
{{range .posts}}
{{.Id}}
{{.Title}}
{{date .CreateTime "Y-m-d H:i:s"}}
{{end}}
新增帖子(post)
import (
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
"zhiliao_blob/models"
"zhiliao_blob/utils"
"fmt"
"time"
"strconv"
)
func (p *PostController) DoAdd() {
title := p.GetString("title")
desc := p.GetString("desc")
content := p.GetString("content")
f,h,err := p.GetFile("cover")
defer f.Close()
var cover string
if err != nil{
cover = "static/upload/no_pic.jpg"
}
timeUnix := time.Now().Unix()
time_str := strconv.FormatInt(timeUnix,10)
path := "static/upload/"+time_str+h.Filename
err1 := p.SaveToFile("cover",path)
if err1 != nil {
cover = "static/upload/no_pic.jpg"
}
cover = path
o := orm.NewOrm()
author := p.GetSession("cms_user_name")
user := models.User{}
o.QueryTable(new(models.User)).Filter("user_name",author).One(&user)
fmt.Println("&user",&user)
post := models.Post {
Title:title,
Desc:desc,
Content:content,
Cover:cover,
Author:&user,
}
fmt.Println("&post",&post)
_,err2 := o.Insert(&post)
if err2 != nil{
fmt.Println("=============")
fmt.Println(err2)
p.Data["json"] = map[string] interface{}{"code":500,"msg":err2}
p.Data["json"] = map[string]interface{}{"code":200,"msg":"添加成功"}
p.ServeJSON()
}
}
//fmt.Println("&post",&post)
&user &{1 admin 123456 2 2021-05-10 10:24:48 +0800 CST static/upload/bq3.png []}
//fmt.Println("&user",&user)
&post &{0 g g ggggg static/upload/1620639477Characters_官方_页面2_捏脸(全部能展示完全).png 0 0 0xc000350000 0001-01-01 00:00:00 +0000 UTC}
删除
func (p *PostController) PostDelete() {
id,err := p.GetInt("id")
if err != nil {
p.Ctx.WriteString("id参数错误")
}
o := orm.NewOrm()
_,err2 := o.QueryTable(new(models.Post)).Filter("id",id).Delete()
if err2 != nil {
fmt.Println(err2)
p.Ctx.WriteString("删除错误")
}
p.Redirect(beego.URLFor("PostController.Get"),302)
}
编辑
根据id获取要编辑的数据
func (p *PostController) ToEdit() {
id,err := p.GetInt("id")
if err != nil{
p.Ctx.WriteString("id参数错误")
}
o := orm.NewOrm()
post := models.Post{}
o.QueryTable(new(models.Post)).Filter("id",id).One(&post)
p.Data["post"] = post
fmt.Println("post----",post)
p.TplName = "cms/post-edit.html"
}
//fmt.Println("post----",post)
post---- {1 a a a static/upload/no_pic.jpg 0 0 0xc00053e000 2021-05-10 16:51:22 +0800 CST}
更新
o := orm.NewOrm()
id,err := p.GetInt("id")
if err !=nil {
p.Data["json"] = map[string]interface{}{"code":500,"msg":"id参数错误"}
}
qs := o.QueryTable(new(models.Post)).Filter("id",id)
title := p.GetString("title")
desc := p.GetString("desc")
content := p.GetString("content")
f,h,err1 := p.GetFile("cover")
if err1 != nil {
_,err4 := qs.Update(orm.Params{
"title":title,
"desc":desc,
"content":content,
})
if err4 != nil {
p.Data["json"] = map[string]interface{}{"code":500,"msg":"更新失败"}
}
p.Data["json"] = map[string]interface{}{"code":200,"msg":"更新成功"}
p.ServeJSON()
}
defer f.Close()
// 生成时间戳,防止重名
timeUnix:=time.Now().Unix() // int64类型
time_str := strconv.FormatInt(timeUnix,10) // 将int64转为字符串 convert:转换
path := "static/upload/"+time_str+h.Filename
// 保存获取到的文件
err2 := p.SaveToFile("cover",path)
if err2 != nil {
_,err5 := qs.Update(orm.Params{
"title":title,
"desc":desc,
"content":content,
})
if err5 != nil {
p.Data["json"] = map[string]interface{}{"code":500,"msg":"更新失败"}
}
p.Data["json"] = map[string]interface{}{"code":200,"msg":"更新成功"}
p.ServeJSON()
}
_,err6 := qs.Update(orm.Params{
"title":title,
"desc":desc,
"content":content,
"cover":path,
})
if err6 != nil {
p.Data["json"] = map[string]interface{}{"code":500,"msg":"更新失败"}
}
p.Data["json"] = map[string]interface{}{"code":200,"msg":"更新成功"}
p.ServeJSON()
}
评论(comment)
- 一个user下有多个post
- 一个post下有多个comment