Golang:使用Iris打造一款个人博客(二)
上一篇 使用Iris打造一款个人博客之配置篇
现在该来看看 Iris 的视图功能了
路由模块
在 server目录下新建一个routeFun目录用来存放一些常用的路由函数
比如ajax请求服务,search文章的路由,还有一些before全局中间件等等
参考以下代码
ajax.go
package routeFunc
import (
"Iris_web/server/dbServer"
"github.com/kataras/iris"
)
func AjaxPage(ctx iris.Context) {
//获取ajax返回来的 pk 参数
page,_ := ctx.URLParamInt("pk")
iris.New().Logger().Info("page:", page)
iris.New().Logger().Info("get请求-->AjaxPage")
ArticleServer := dbServer.Article{}
count := ArticleServer.GetCounts()
iris.New().Logger().Info("数据 count:", count)
datas:= ArticleServer.GetPages(4, page)
// iris ajax请求获取不到数据的时候居然不会报错,只会返回空你看多神奇
if len(datas) != 0 {
ctx.ViewData("datas", datas)
if err := ctx.View("ajax_add.html"); err != nil {
ctx.Application().Logger().Infof(err.Error())
}
}else {
ctx.Application().Logger().Error("No Data ...")
}
}
archive.go
package routeFunc
import (
"Iris_web/server/dbServer"
"github.com/kataras/iris"
"strconv"
)
func ArchivesDetail(ctx iris.Context) {
uuid, _ := ctx.Params().GetInt("uuid")
ArticleServer := dbServer.Article{}
datas,_ := ArticleServer.GetArchive(uuid)
ctx.ViewData("datas", datas)
if err := ctx.View("article/" + strconv.Itoa(uuid) +".html"); err != nil {
ctx.Application().Logger().Infof(err.Error())
}
}
search.go
package routeFunc
import (
"Iris_web/server/dbServer"
"github.com/kataras/iris"
)
func Search(ctx iris.Context){
// 获取form表单
search_key := ctx.FormValue("search")
if search_key != "" {
iris.New().Logger().Info(" Search ",search_key)
SearchServer := dbServer.Article{}
datas := SearchServer.GetSearch(search_key)
ctx.ViewData("datas", datas)
ctx.ViewData("search_key", search_key)
if err := ctx.View("search.html"); err != nil {
ctx.Application().Logger().Infof(err.Error())
}
}else {
ctx.HTML("<h1>Not Search Key</h1>")
}
}
web_error.go
package routeFunc
import "github.com/kataras/iris"
//404
func NotFound(ctx iris.Context) {
ctx.View("404.html")
}
//500
func InternalServerError(ctx iris.Context) {
ctx.WriteString("凉凉,服务器错误")
}
数据库服务
在上面的代码中比如文章详情路由中需要数据库查询的数据依赖
所以要实现数据库操作的功能,方便调用
在 server目录下新建一个dbServer 目录用来存放一些常用的数据库操作代码
参考以下代码
article_server.go
package dbServer
import (
"Iris_web/datasource"
"Iris_web/models"
"time"
)
type Article struct{
models.Article
}
func (ae *Article) CreateArticle() error{
return datasource.Db.Create(ae).Error
}
func (ae *Article) GetCounts() (count int64){
datasource.Db.Model(ae).Count(&count)
return
}
func (ae *Article) GetSearch(key string) (articleList []Article) {
datasource.Db.Model(ae).Where( "title LIKE ?", "%"+key+"%").Or("content LIKE ?", "%"+key+"%").Find(&articleList)
return
}
func (ae *Article) GetArticleList() (articleList []Article){
datasource.Db.Find(&articleList)
return
}
func (ae *Article) GetId() (articleList []Article, err error) {
datasource.Db.Model(ae).Where("id = ?", 1).Find(&articleList)
err = datasource.Db.Model(ae).Related(&articleList).Error
return
}
func (ae *Article) GetArchive(uuid int) (article Article, err error) {
datasource.Db.Model(ae).Where("uuid = ?", uuid).First(&article)
err = datasource.Db.Model(ae).Related(&article).Error
return
}
func (ae *Article) GetPages(pageSize int,page int) (articleList []Article){
datasource.Db.Limit(pageSize).Offset((page-1)*pageSize).Find(&articleList)
return
}
func (ae *Article) UpdateArticle() (comments []Article, err error){
datasource.Db.Model(ae).Where("id = ?", 1).Updates(map[string]interface{}{"author": 9999,"content":444444,"create_time":time.Now()})
err = datasource.Db.Model(ae).Related(&comments).Error
return
}
func (ae *Article) DeleteArticle() (err error) {
err = datasource.Db.Where("id = ?", 1).Delete(ae).Error
return
}
其实就是定义了 一些数据库的增删改查,然后在路由函数中调用
count_server.go
package dbServer
import (
"Iris_web/datasource"
"Iris_web/models"
"github.com/jinzhu/gorm"
"time"
)
type G_count struct{
models.G_count
}
func (gc *G_count) GetGc() (res G_count,err error){
datasource.Db.Model(gc).Where("id = ?", 1).First(&res)
err = datasource.Db.Model(gc).Related(&res).Error
return
}
func (gc *G_count) UpdateGc(num int) *gorm.DB {
return datasource.Db.Model(gc).Where("id = ?", 1).Updates(map[string]interface{}{"count":num,"create_time":time.Now()})
}
这个可以记录用户访问的总次数,也就是访问量了
可以直接放在全局中间件
事实上这么写还是有些马虎,毕竟这只是一个个人博客,以后再继续封装吧
就这样server目录就差不好写好了,差什么就补什么,反正 demo 已经给你了
如何调用
写完了这些路由函数应该如何在主文件中调用呢?
参考一些代码
main.go
package main
import (
"Iris_web/controller"
"Iris_web/server/routeFunc"
"github.com/kataras/iris"
"github.com/kataras/iris/mvc"
)
func main() {
app := iris.New()
app.Logger().SetLevel("info")
//全局前置
//app.Use(before)
//tmp := iris.HTML("./templates", ".html")
tmp := iris.Django("./templates",".html") //这里使用Django模板 没办法 flask 落下的病根
//自动重载模板文件
tmp.Reload(true)
//加载静态文件
app.HandleDir("/static", "./static") //把app.StaticWeb("/static", "./static")干掉 会报错 iris版本原因
//错误处理
app.OnErrorCode(iris.StatusNotFound, routeFunc.NotFound)
app.OnErrorCode(iris.StatusInternalServerError, routeFunc.InternalServerError)
//注册进去
app.RegisterView(tmp)
archives := app.Party("/article")
archives.Get("/{uuid:int}", routeFunc.ArchivesDetail)
app.Get("/ajaxPage", routeFunc.AjaxPage)
app.Get("/search", routeFunc.Search)
路由篇也就差不多这样了(毕竟需求不大,不过思路有了,需求算个屁)
ps:这个系列的文章还是有一些门槛的,我跳过了一些基础的东西
一些demo可以直接参考Iris 中文文档 https://learnku.com/docs/iris-go
欢迎转载,但要声明出处,不然我顺着网线过去就是一拳。
个人技术博客:http://www.gzky.live
有疑问加站长微信联系(非本文作者)