beego实战(一)

创建项目

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()
}


image.png

image.png

登录过滤

登录前只能仿问登录页,登录后允许仿问其它页面

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

userpost是一对多的关系,外键在多的一方(post)

  1. user模型中:反向关系,没有外键
Posts []*Post `orm:"reverse(many)"`
  1. 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)

  1. 一个user下有多个post
  2. 一个post下有多个comment

image.png