基于原生Go語言開發(fā)一個(gè)博客系統(tǒng)
如何使用原生Go開發(fā)一個(gè)web項(xiàng)目
循序漸進(jìn),掌握編程思維和思路
初步具有工程思維,能適應(yīng)一般的開發(fā)工作
1. 搭建項(xiàng)目
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 = "現(xiàn)在是入門教程"
jsonStr,_ := json.Marshal(indexData)
w.Write(jsonStr)
}
func main() {
//程序入口,一個(gè)項(xiàng)目 只能有一個(gè)入口
//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. 響應(yīng)頁面
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 = "現(xiàn)在是入門教程"
err := t.Execute(w,indexData)
fmt.Println(err)
}
func main() {
//程序入口,一個(gè)項(xiàng)目 只能有一個(gè)入口
//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 = "現(xiàn)在是入門教程"
t := template.New("index.html")
//1. 拿到當(dāng)前的路徑
path,_ := os.Getwd()
//訪問博客首頁模板的時(shí)候,因?yàn)橛卸鄠€(gè)模板的嵌套,解析文件的時(shí)候,需要將其涉及到的所有模板都進(jìn)行解析
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)
//頁面上涉及到的所有的數(shù)據(jù),必須有定義
t.Execute(w,indexData)
}
3.2 首頁數(shù)據(jù)格式定義
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"` //查看次數(shù)
Type int `json:"type"` //文章類型 0 普通,1 自定義文章
CreateAt time.Time `json:"createAt"` // 創(chuàng)建時(shí)間
UpdateAt time.Time `json:"updateAt"` // 更新時(shí)間
}
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"` // 查看次數(shù)
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", "關(guān)于","/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 = "長(zhǎng)得非常帥的程序員"
[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. 假數(shù)據(jù)-顯示首頁內(nèi)容
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. 拿到當(dāng)前的路徑
path := config.Cfg.System.CurrentDir
//訪問博客首頁模板的時(shí)候,因?yàn)橛卸鄠€(gè)模板的嵌套,解析文件的時(shí)候,需要將其涉及到的所有模板都進(jìn)行解析
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)
}
//頁面上涉及到的所有的數(shù)據(jù),必須有定義
var categorys = []models.Category{
{
Cid: 1,
Name: "go",
},
}
var posts = []models.PostMore{
{
Pid: 1,
Title: "go博客",
Content: "內(nèi)容",
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() {
//程序入口,一個(gè)項(xiàng)目 只能有一個(gè)入口
//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ù)內(nèi)容在gitee上面: 傳送門
到此這篇關(guān)于基于原生Go語言開發(fā)一個(gè)博客系統(tǒng)的文章就介紹到這了,更多相關(guān)Go博客系統(tǒng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go 原生http web 服務(wù)跨域restful api的寫法介紹
這篇文章主要介紹了go 原生http web 服務(wù)跨域restful api的寫法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04
Go?Web開發(fā)之Gin多服務(wù)配置及優(yōu)雅關(guān)閉平滑重啟實(shí)現(xiàn)方法
這篇文章主要為大家介紹了Go?Web開發(fā)之Gin多服務(wù)配置及優(yōu)雅關(guān)閉平滑重啟實(shí)現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Go源碼字符串規(guī)范檢查lint工具strchecker使用詳解
這篇文章主要為大家介紹了Go源碼字符串規(guī)范檢查lint工具strchecker使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06

