基于原生Go语言开发一个博客系统

 更新时间:2024年02月28日 10:50:18   作者:lucky九年  
这篇文章主要为大家详细介绍了如何基于原生Go语言开发一个简单的博客系统,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

如何使用原生Go开发一个web项目

循序渐进,掌握编程思维和思路

初步具有工程思维,能适应一般的开发工作

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协议 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协议 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"`     // 创建时间
	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协议 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)
	}
}

后续内容在gitee上面: 传送门

到此这篇关于基于原生Go语言开发一个博客系统的文章就介绍到这了,更多相关Go博客系统内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解go-admin在线开发平台学习(安装、配置、启动)

    详解go-admin在线开发平台学习(安装、配置、启动)

    这篇文章主要介绍了go-admin在线开发平台学习(安装、配置、启动),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Bililive-go 实现直播自动监控录制功能

    Bililive-go 实现直播自动监控录制功能

    最近有直播录制的需求,但是自己手动录制太麻烦繁琐,于是用了开源项目Bililive-go进行全自动监控录制,对Bililive-go 直播自动监控录制实现思路感兴趣的朋友,一起看看吧
    2024-03-03
  • 解决golang json解析出现值为空的问题

    解决golang json解析出现值为空的问题

    这篇文章主要介绍了解决golang json解析出现值为空的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • golang编程入门之http请求天气实例

    golang编程入门之http请求天气实例

    这篇文章主要介绍了golang编程入门之http请求天气实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • gin正确多次读取http request body内容实现详解

    gin正确多次读取http request body内容实现详解

    这篇文章主要为大家介绍了gin正确多次读取http request body内容实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Go设计模式之访问者模式讲解和代码示例

    Go设计模式之访问者模式讲解和代码示例

    访问者是一种行为设计模式, 允许你在不修改已有代码的情况下向已有类层次结构中增加新的行为,本文将通过代码示例给大家详细的介绍一下Go设计模式之访问者模式,需要的朋友可以参考下
    2023-08-08
  • 浅析Golang中的内存逃逸

    浅析Golang中的内存逃逸

    内存逃逸分析是go的编译器在编译期间,根据变量的类型和作用域,确定变量是堆上还是栈上。本文将通过示例浅析一下Golang中的内存逃逸,需要的可以了解一下
    2022-10-10
  • golang高性能的http请求 fasthttp详解

    golang高性能的http请求 fasthttp详解

    fasthttp 是 Go 的快速 HTTP 实现,当前在 1M 并发的生产环境使用非常成功,可以从单个服务器进行 100K qps 的持续连接,总而言之,fasthttp 比 net/http 快 10 倍,下面通过本文给大家介绍golang fasthttp http请求的相关知识,一起看看吧
    2021-09-09
  • Go调度器学习之协作与抢占详解

    Go调度器学习之协作与抢占详解

    如果某个G执行时间过长,其他的G如何才能被正常调度,这就引出了接下来的话题:协作与抢占。本文将通过一些示例为大家详细讲讲调度器中协作与抢占的相关知识,需要的可以参考一下
    2023-04-04
  • Go Gin框架优雅重启和停止实现方法示例

    Go Gin框架优雅重启和停止实现方法示例

    Web应用程序中,有时需要重启或停止服务器,无论是因为更新代码还是进行例行维护,这时需要保证应用程序的可用性和数据的一致性,就需要优雅地关闭和重启应用程序,即不丢失正在处理的请求和不拒绝新的请求,本文将详解如何在Go语言中使用Gin这个框架实现优雅的重启停止
    2024-01-01

最新评论