基于原生Go語言開發(fā)一個博客系統(tǒng)
更新時間:2024年02月28日 10:50:18 作者:lucky九年
這篇文章主要為大家詳細介紹了如何基于原生Go語言開發(fā)一個簡單的博客系統(tǒng),文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
如何使用原生Go開發(fā)一個web項目
循序漸進,掌握編程思維和思路
初步具有工程思維,能適應一般的開發(fā)工作
1. 搭建項目
package main import ( "encoding/json" "log" "net/http" ) type IndexData struct { Title string `json:"title"` Desc string `json:"desc"` } func index(w http.ResponseWriter,r *http.Request) { w.Header().Set("Content-Type","application/json") var indexData IndexData indexData.Title = "碼神之路go博客" indexData.Desc = "現在是入門教程" jsonStr,_ := json.Marshal(indexData) w.Write(jsonStr) } func main() { //程序入口,一個項目 只能有一個入口 //web程序,http協(xié)議 ip port server := http.Server{ Addr: "127.0.0.1:8080", } http.HandleFunc("/",index) if err := server.ListenAndServe();err != nil{ log.Println(err) } }
2. 響應頁面
func indexHtml(w http.ResponseWriter,r *http.Request) { t := template.New("index.html") viewPath, _ := os.Getwd() t,_ = t.ParseFiles(viewPath + "/template/index.html") var indexData IndexData indexData.Title = "碼神之路go博客" indexData.Desc = "現在是入門教程" err := t.Execute(w,indexData) fmt.Println(err) } func main() { //程序入口,一個項目 只能有一個入口 //web程序,http協(xié)議 ip port server := http.Server{ Addr: "127.0.0.1:8080", } http.HandleFunc("/",index) http.HandleFunc("/index.html",indexHtml) if err := server.ListenAndServe();err != nil{ log.Println(err) } }
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> hello mszlu blog!! {{.Title}} {{.Desc}} </body> </html>
3. 首頁
3.1 頁面解析
func index(w http.ResponseWriter,r *http.Request) { var indexData IndexData indexData.Title = "碼神之路go博客" indexData.Desc = "現在是入門教程" t := template.New("index.html") //1. 拿到當前的路徑 path,_ := os.Getwd() //訪問博客首頁模板的時候,因為有多個模板的嵌套,解析文件的時候,需要將其涉及到的所有模板都進行解析 home := path + "/template/home.html" header := path + "/template/layout/header.html" footer := path + "/template/layout/footer.html" personal := path + "/template/layout/personal.html" post := path + "/template/layout/post-list.html" pagination := path + "/template/layout/pagination.html" t,_ = t.ParseFiles(path + "/template/index.html",home,header,footer,personal,post,pagination) //頁面上涉及到的所有的數據,必須有定義 t.Execute(w,indexData) }
3.2 首頁數據格式定義
config/config.go
package config type Viewer struct { Title string Description string Logo string Navigation []string Bilibili string Avatar string UserName string UserDesc string } type SystemConfig struct { AppName string Version float32 CurrentDir string CdnURL string QiniuAccessKey string QiniuSecretKey string Valine bool ValineAppid string ValineAppkey string ValineServerURL string }
models/category.go
package models type Category struct { Cid int Name string CreateAt string UpdateAt string }
models/post.go
package models import ( "goblog/config" "html/template" "time" ) type Post struct { Pid int `json:"pid"` // 文章ID Title string `json:"title"` // 文章ID Slug string `json:"slug"` // 自定也頁面 path Content string `json:"content"` // 文章的html Markdown string `json:"markdown"` // 文章的Markdown CategoryId int `json:"categoryId"` //分類id UserId int `json:"userId"` //用戶id ViewCount int `json:"viewCount"` //查看次數 Type int `json:"type"` //文章類型 0 普通,1 自定義文章 CreateAt time.Time `json:"createAt"` // 創(chuàng)建時間 UpdateAt time.Time `json:"updateAt"` // 更新時間 } type PostMore struct { Pid int `json:"pid"` // 文章ID Title string `json:"title"` // 文章ID Slug string `json:"slug"` // 自定也頁面 path Content template.HTML `json:"content"` // 文章的html CategoryId int `json:"categoryId"` // 文章的Markdown CategoryName string `json:"categoryName"` // 分類名 UserId int `json:"userId"` // 用戶id UserName string `json:"userName"` // 用戶名 ViewCount int `json:"viewCount"` // 查看次數 Type int `json:"type"` // 文章類型 0 普通,1 自定義文章 CreateAt string `json:"createAt"` UpdateAt string `json:"updateAt"` } type PostReq struct { Pid int `json:"pid"` Title string `json:"title"` Slug string `json:"slug"` Content string `json:"content"` Markdown string `json:"markdown"` CategoryId int `json:"categoryId"` UserId int `json:"userId"` Type int `json:"type"` } type SearchResp struct { Pid int `orm:"pid" json:"pid"` // 文章ID Title string `orm:"title" json:"title"` } type PostRes struct { config.Viewer config.SystemConfig Article PostMore }
models/home.go
package models type HomeData struct { config.Viewer Categorys []Category Posts []PostMore Total int Page int Pages []int PageEnd bool }
4. 配置文件讀取
config.toml:
[viewer] Title = "碼神之路Go語言博客" Description = "碼神之路Go語言博客" Logo = "/resource/images/logo.png" Navigation = ["首頁","/", "GO語言","/golang", "歸檔","/pigeonhole", "關于","/about"] Bilibili = "https://space.bilibili.com/473844125" Zhihu = "https://www.zhihu.com/people/ma-shen-zhi-lu" Avatar = "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Finews.gtimg.com%2Fnewsapp_bt%2F0%2F13147603927%2F1000.jpg&refer=http%3A%2F%2Finews.gtimg.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1647242040&t=c6108010ed46b4acebe18955acdd2d24" UserName = "碼神之路" UserDesc = "長得非常帥的程序員" [system] CdnURL = "https://static.mszlu.com/goblog/es6/md-assets" QiniuAccessKey = "替換自己的" QiniuSecretKey = "替換自己的" Valine = true ValineAppid = "替換自己的" ValineAppkey = "替換自己的" ValineServerURL = "替換自己的"
package config import ( "github.com/BurntSushi/toml" "os" ) type TomlConfig struct { Viewer Viewer System SystemConfig } type Viewer struct { Title string Description string Logo string Navigation []string Bilibili string Avatar string UserName string UserDesc string } type SystemConfig struct { AppName string Version float32 CurrentDir string CdnURL string QiniuAccessKey string QiniuSecretKey string Valine bool ValineAppid string ValineAppkey string ValineServerURL string } var Cfg *TomlConfig func init() { Cfg = new(TomlConfig) var err error Cfg.System.CurrentDir, err = os.Getwd() if err != nil { panic(err) } Cfg.System.AppName = "mszlu-go-blog" Cfg.System.Version = 1.0 _,err = toml.DecodeFile("config/config.toml",&Cfg) if err != nil { panic(err) } }
5. 假數據-顯示首頁內容
package main import ( "html/template" "log" "ms-go-blog/config" "ms-go-blog/models" "net/http" "time" ) type IndexData struct { Title string `json:"title"` Desc string `json:"desc"` } func IsODD(num int) bool { return num%2 == 0 } func GetNextName(strs []string,index int) string{ return strs[index+1] } func Date(layout string) string{ return time.Now().Format(layout) } func index(w http.ResponseWriter,r *http.Request) { t := template.New("index.html") //1. 拿到當前的路徑 path := config.Cfg.System.CurrentDir //訪問博客首頁模板的時候,因為有多個模板的嵌套,解析文件的時候,需要將其涉及到的所有模板都進行解析 home := path + "/template/home.html" header := path + "/template/layout/header.html" footer := path + "/template/layout/footer.html" personal := path + "/template/layout/personal.html" post := path + "/template/layout/post-list.html" pagination := path + "/template/layout/pagination.html" t.Funcs(template.FuncMap{"isODD":IsODD,"getNextName":GetNextName,"date":Date}) t,err := t.ParseFiles(path + "/template/index.html",home,header,footer,personal,post,pagination) if err != nil { log.Println(err) } //頁面上涉及到的所有的數據,必須有定義 var categorys = []models.Category{ { Cid: 1, Name: "go", }, } var posts = []models.PostMore{ { Pid: 1, Title: "go博客", Content: "內容", UserName: "碼神", ViewCount: 123, CreateAt: "2022-02-20", CategoryId:1, CategoryName: "go", Type:0, }, } var hr = &models.HomeResponse{ config.Cfg.Viewer, categorys, posts, 1, 1, []int{1}, true, } t.Execute(w,hr) } func main() { //程序入口,一個項目 只能有一個入口 //web程序,http協(xié)議 ip port server := http.Server{ Addr: "127.0.0.1:8080", } http.HandleFunc("/",index) http.Handle("/resource/",http.StripPrefix("/resource/",http.FileServer(http.Dir("public/resource/")))) if err := server.ListenAndServe();err != nil{ log.Println(err) } }
后續(xù)內容在gitee上面: 傳送門
到此這篇關于基于原生Go語言開發(fā)一個博客系統(tǒng)的文章就介紹到這了,更多相關Go博客系統(tǒng)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
go 原生http web 服務跨域restful api的寫法介紹
這篇文章主要介紹了go 原生http web 服務跨域restful api的寫法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04Go?Web開發(fā)之Gin多服務配置及優(yōu)雅關閉平滑重啟實現方法
這篇文章主要為大家介紹了Go?Web開發(fā)之Gin多服務配置及優(yōu)雅關閉平滑重啟實現方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01Go源碼字符串規(guī)范檢查lint工具strchecker使用詳解
這篇文章主要為大家介紹了Go源碼字符串規(guī)范檢查lint工具strchecker使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06