使用Beego开发个人博客系统hblog(1)登录
关于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! 😊
- 原文作者:黄忠德
- 原文链接:https://huangzhongde.cn/post/Golang/hblog_1/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。