关于beego的更多介绍可以看我前面的文章Go语言Beego框架介绍]或是查看官网。

安装

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

创建项目

1bee new github.com/hzde0128/hblog

导入静态页面

这里使用的X-admin2.2,官网下载http://x.xuebingsi.com/2.2版本,将文件解压,html文件放入views目录,修改文件的后缀为.tpl,也可以不修改,看个人喜好,css,js,fonts放入static目录。然后运行项目

1cd $GOPATH/src/github.com/hzde0128/hblog
2go mod init
3bee run

配置基本的路由

修改routers/router.go文件

 1  // 登录页面
 2	beego.Router("/login", &controllers.UserController{}, "*:Login")
 3	// 登出页面
 4	beego.Router("/admin/logout", &controllers.UserController{}, "*:Logout")
 5	// 修改密码
 6	beego.Router("/admin/user", &controllers.UserController{}, "*:User")
 7	// 后台首页
 8	beego.Router("/admin/", &controllers.AdminController{})
 9	// 后台信息首页
10	beego.Router("/admin/info", &controllers.AdminController{}, "*:Info")
11	// 文章管理
12	beego.Router("/admin/blog/", &controllers.BlogCoontroller{})
13	// 添加文章
14	beego.Router("/admin/blog/add", &controllers.BlogCoontroller{}, "*:Add")
15	// 分类管理
16	beego.Router("/admin/category/", &controllers.CategoryController{})
17	// 标签管理
18	beego.Router("/admin/tag/", &controllers.TagController{})

暂时想到的就这么多,不够后面再加。

配置控制器

上面的路由对应不同的控制器,我们需要一一创建,我们先只是展示GET页面请求。

登录/退出

 1type UserController struct {
 2   beego.Controller
 3}
 4
 5// 展示登录页面
 6func (c *UserController) Login() {
 7	c.TplName = "login.tpl"
 8}
 9
10// 退出操作
11func (c *UserController) Logout() {
12	c.DelSession("username")
13	// 退出后跳转到/目录
14	c.Redirect("/", http.StatusFound)
15}

后台管理界面

 1type AdminController struct {
 2	beego.Controller
 3}
 4
 5func (c *AdminController) Get() {
 6	c.TplName = "admin/index.tpl"
 7}
 8
 9func (c *AdminController) Info() {
10	c.TplName = "admin/info.tpl"
11}

博客页面

 1type BlogCoontroller struct {
 2	beego.Controller
 3}
 4
 5// 文章列表页面
 6func (c *BlogCoontroller) Get() {
 7	c.TplName = "admin/list.tpl"
 8}
 9
10// 添加文章
11func (c *BlogCoontroller) Add() {
12	c.TplName = "admin/article.tpl"
13}
14

分类页面

1type CategoryController struct {
2	beego.Controller
3}
4
5func (c *CategoryController) Get() {
6	c.TplName = "admin/category.tpl"
7}
8

标签页面

1type TagController struct {
2	beego.Controller
3}
4
5func (c *TagController) Get() {
6	c.TplName = "admin/tag.tpl"
7}

修改静态页的路径

有了路由之后,可以打开相应的页面进行调整,包括css,js的路径,修改成/static/开头的绝对路径。用不到的页面暂时先删除,后面需要再添加。

创建用户模型

创建用户模型实现用户登录功能

 1package models
 2
 3import (
 4	"github.com/astaxie/beego/orm"
 5	"time"
 6)
 7
 8// User 用户表结构体
 9type User struct {
10	Id         int       // 自增Id
11	UserName   string    `orm:"unique;size(32)"`             // 用户名
12	Password   string    `orm:"size(32)"`                    // 密码
13	Email      string    `orm:"size(50)"`                    // Email
14	LastLogin  time.Time `orm:"auto_now_add;type(datetime)"` // 上次登录时间
15	LoginCount int       // 登录次数
16	LastIp     string    `orm:"size(32)"` // 上次登录IP
17	Active     int8      // 激活状态
18}
19
20// 指定表名 user
21func (m *User) TableName() string {
22	return "user"
23}
24
25func (u *User) Insert() error {
26	if _, err := orm.NewOrm().Insert(u); err != nil {
27		return err
28	}
29	return nil
30}
31
32func (u *User) Read(fields ...string) error {
33	if err := orm.NewOrm().Read(u, fields...); err != nil {
34		return err
35	}
36	return nil
37}
38
39func (u *User) Update(fields ...string) error {
40	if _, err := orm.NewOrm().Update(u, fields...); err != nil {
41		return err
42	}
43	return nil
44}
45
46func (u *User) Delete() error {
47	if _, err := orm.NewOrm().Delete(u); err != nil {
48		return err
49	}
50	return nil
51}
52
53func (u *User) Query() orm.QuerySeter {
54	return orm.NewOrm().QueryTable(u)
55}
56
57func (u *User) ReadOrCreate(field string, fields ...string) (bool, int64, error) {
58	if created, id, err := orm.NewOrm().ReadOrCreate(u, field, fields...); err != nil {
59		return false, 0, err
60	} else {
61		return created, id, nil
62	}
63}

初始化数据库

这里用到MySQL数据库,也可以选择其它数据库

修改conf/app.conf配置文件,添加mysql相关配置信息

1# 数据库相关设置
2[mysql]
3address = 127.0.0.1
4port = 3306
5user = root
6password = root
7dbname = myblog

创建utils包,并创建config.go文件,实现对配置文件进行解析

 1package utils
 2
 3import (
 4	"github.com/astaxie/beego"
 5	"gopkg.in/ini.v1"
 6)
 7
 8var Cfg = new(AppConf)
 9
10type AppConf struct {
11	MysqlConf `ini:"mysql"`
12}
13
14type MysqlConf struct {
15	Address  string `ini:"address"`
16	Port     int    `ini:"port"`
17	Username string `ini:"user"`
18	Password string `ini:"password"`
19	Dbname   string `ini:"dbname"`
20}
21
22// 加载配置文件
23func init() {
24	err := ini.MapTo(Cfg, "conf/app.conf")
25	if err != nil {
26		beego.Error("读取配置文件失败,", err)
27		return
28	}
29}

orm建表

使用beego里面的orm工具,并创建一个用户admin,密码admin888,采用md5加密存储在数据库中,后面可以在管理界面进行修改操作。这里没有开放注册页功能,所以直接初始化一个后台管理员。_ "github.com/go-sql-driver/mysql"导入相应的驱动

 1package models
 2
 3import (
 4	"crypto/md5"
 5	"fmt"
 6	"github.com/astaxie/beego"
 7	"github.com/astaxie/beego/orm"
 8	_ "github.com/go-sql-driver/mysql"
 9	"github.com/hzde0128/hblog/utils"
10	"strconv"
11)
12
13func init() {
14	dsn := utils.Cfg.MysqlConf.Username + ":" + utils.Cfg.Password + "@" + "tcp(" + utils.Cfg.MysqlConf.Address + ":" + strconv.Itoa(utils.Cfg.MysqlConf.Port) + ")/" + utils.Cfg.MysqlConf.Dbname + "?charset=utf8"
15	beego.Debug(dsn)
16	orm.RegisterDataBase("default", "mysql", dsn)
17	orm.RegisterModel(new(User), new(Tag), new(Category), new(Article))
18	orm.RunSyncdb("default", false, true)
19
20	// 初始化用户
21	user := User{}
22	user.UserName = "admin"
23	data := []byte("admin888")
24	has := md5.Sum(data)
25	user.Password = fmt.Sprintf("%x", has)
26	_, _, err := user.ReadOrCreate("username", "password")
27	if err != nil {
28		beego.Info("读取或创建失败,", err)
29		return
30	}
31}

main函数调用models实现建表

1	_ "github.com/hzde0128/hblog/models"

用户登录验证

修改模版页的post请求到/login

1<form method="post" class="layui-form" action="/login">
2            <input name="username" placeholder="用户名"  type="text" lay-verify="required" class="layui-input" >
3            <hr class="hr15">
4            <input name="password" lay-verify="required" placeholder="密码"  type="password" class="layui-input">
5            <hr class="hr15">
6            <input value="登录" lay-submit lay-filter="login" style="width:100%;" type="submit">
7            <hr class="hr20" >
8        </form>

修改对应的控制器函数

 1func (c *UserController) Login() {
 2	if c.Ctx.Request.Method == "GET" {
 3		c.TplName = "login.tpl"
 4	}
 5
 6	if c.Ctx.Request.Method == "POST" {
 7		username := strings.TrimSpace(c.GetString("username"))
 8		password := strings.TrimSpace(c.GetString("password"))
 9
10		beego.Info(username, password)
11
12		// 验证数据有效性
13		valid := validation.Validation{}
14		if v := valid.Required(username, "username"); !v.Ok {
15			beego.Info("请输入用户名")
16			c.Redirect("/login", http.StatusFound)
17		}
18		if v := valid.Required(password, "password"); !v.Ok {
19			beego.Info("请输入密码")
20			c.Redirect("/login", http.StatusFound)
21		}
22
23		user := models.User{}
24		user.UserName = username
25		data := []byte(password)
26		has := md5.Sum(data)
27		user.Password = fmt.Sprintf("%x", has)
28		err := user.Read("username", "password")
29		if err != nil {
30			beego.Info("用户名或密码错误!")
31			c.Redirect("/login", http.StatusFound)
32		}
33
34		c.Redirect("/admin/", http.StatusFound)
35	}
36
37}

保存Cookie和Session

要开启session,我们在conf/app.conf中添加一项配置

1# 开启session
2sessionon = true

在登录成功是使用Cookie和Session函数

1    // 验证成功,设置Cookie和Session
2		c.Ctx.SetCookie("username", username, time.Hour*24*7)
3		c.SetSession("username", username)

登录时显示用户名

1func (c *UserController) Login() {
2	if c.Ctx.Request.Method == "GET" {
3		username := c.Ctx.GetCookie("username")
4		if username != ""{
5			c.Data["username"] = username
6		}
7		c.TplName = "login.tpl"
8	}
9  ...

修改login.tpl

1        <form method="post" class="layui-form" action="/login">
2            <input name="username" placeholder="用户名"  type="text" lay-verify="required" class="layui-input" value="{{ .username }}">
3            <hr class="hr15">
4            <input name="password" lay-verify="required" placeholder="密码"  type="password" class="layui-input">
5            <hr class="hr15">
6            <input value="登录" lay-submit lay-filter="login" style="width:100%;" type="submit">
7            <hr class="hr20" >
8        </form>

这样再次登录时可以显示用户名了。

退出时清除cookie和session

1func (c *UserController) Logout() {
2	c.DelSession("username")
3	username := c.Ctx.GetCookie("username")
4	c.Ctx.SetCookie("username", username, -1)
5	c.Redirect("/", http.StatusFound)
6}

项目地址

https://github.com/hzde0128/hblog

欢迎star和fork! 😊