上次我准备用Java的ssm框架来搭建一个博客系统,我觉得后来觉得Java实在太罗嗦了,贼多的配置文件。最近接触了go的web开发,框架有beego,gin、revel以及iris,beego虽然很重量级,性能也差iris太远,但是它对国人的学习是十分有好的,首先它的作者是国人,理念呢也还是参照传统的mvc概念,加上详尽的文档是一个非常好的入门go web的框架,所以我决定使用beego搭建一个个人博客,前台展示使用layui,毕竟我比较懒!
准备工作:
a.下载Sublime Text3,安装go插件,在mysql创建数据库db_beego,然后导入db_beego.sql(在github上有,链接在文章最下面),主要就是创建了用户,文章,评论表并且插入几条测试数据,大家随便看下知道就可以了。
b.你的电脑肯定安装了go环境,然后安装beego,可以参考https://blog.csdn.net/suresand/article/details/79548796
$ go get -u github.com/astaxie/beego
$ go get -u github.com/beego/bee
直接安装beego的框架及开发工具
或许还需要安装go-mysql的驱动
go get github.com/go-sql-driver/mysql
c.然后在你的gopath的src目录下执行:
bee new blog
然后看见自动创建的blog文件夹,进入blog文件夹:
bee run
访问http://localhost:8080/出现welcome to beego画面表示准备工作完成,然后就可以开始我们的开发了,当然由于我的水平有限,有模糊的地方请大家详细参考beego文档https://beego.me/docs/intro/
一 配置文件
首先配置app.conf,这个app.conf配置文件可以做很多事,这里我们主要配置数据库的链接信息:
appname = blog
httpport = 8080
runmode = dev
# MYSQL地址
dbhost = localhost
# MYSQL端口
dbport = 3306
# MYSQL用户名
dbuser = root
# MYSQL密码
dbpassword = 你的密码
# MYSQL数据库名称
dbname = db_beego
# MYSQL表前缀
dbprefix = tb_
二 构建登陆逻辑
我在考虑是先把所有的结构搭出来,还是一个一个去实现呢,然后我选择了后者,因为这样可以更快的做出效果提升兴趣,所以我准备一上来就把登陆逻辑做个模版出来
a.首先我们需要将数据库连接注册到beego的orm中,这是各个操作都会用到的,在models文件下新建base.go:
package models
import (
"github.com/astaxie/beego/orm"
"github.com/astaxie/beego"
)
func Init() {
dbhost := beego.AppConfig.String("dbhost")
dbport := beego.AppConfig.String("dbport")
dbuser := beego.AppConfig.String("dbuser")
dbpassword := beego.AppConfig.String("dbpassword")
dbname := beego.AppConfig.String("dbname")
if dbport == "" {
dbport = "3306"
}
dsn := dbuser + ":" + dbpassword + "@tcp(" + dbhost + ":" + dbport + ")/" + dbname + "?charset=utf8&loc=Asia%2FShanghai"
orm.RegisterDataBase("default", "mysql", dsn)
orm.RegisterModel(new(User))
}
//返回带前缀的表名
func TableName(str string) string {
return beego.AppConfig.String("dbprefix") + str
}
上面这段代码还是很容易看懂的,就是初始化数据库连接,并且将User注册到orm里去
b.登录当然是跟用户相关了,在models继续新建user.go:
package models
import "time"
type User struct {
Id int
Username string
Password string
Email string
LoginCount int
LastTime time.Time
LastIp string
State int8
Created time.Time
Updated time.Time
}
func (m *User) TableName() string {
return TableName("user")
}
c.我们要注意不允许在未登录的情况下访问我们的controller,所以需要判断是否已经登录,在controller文件下新建base.go:
package controllers
import (
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
"strings"
"github.com/Echosong/beego_blog/models"
)
type baseController struct {
beego.Controller
o orm.Ormer
controllerName string
actionName string
}
func (p *baseController) Prepare() {
controllerName, actionName := p.GetControllerAndAction()
p.controllerName = strings.ToLower(controllerName[0 : len(controllerName)-10])
p.actionName = strings.ToLower(actionName)
p.o = orm.NewOrm();
if strings.ToLower( p.controllerName) == "admin" && strings.ToLower(p.actionName) != "login"{
if p.GetSession("user") == nil{
p.History("未登录","/admin/login")
//p.Ctx.WriteString(p.controllerName +"==="+ p.actionName)
}
}
//初始化前台页面相关元素
if strings.ToLower( p.controllerName) == "blog"{
p.Data["actionName"] = strings