Go中级之手把手教你开发一个简易的个人博客网站(一)项目基本架构和数据库链接

2023-12-24 15:40:59 浏览数 (3)

前言

本文是记录的是"Go语言之手把手教你开发一个简易的个人博客网站(一)"

此文是个人学习归纳的记录,腾讯云独家发布,未经允许,严禁转载,如有不对, 还望斧正, 感谢!

嗯,一个程序员,怎么能没有自己的博客网站呢? 然后就写了自己的个人博客站点, 然后想着归纳一下, 出个简易版的Go语言的教程。

当然,现在创建一个个人站点,其实很简单,可以用低代码平台来做,github上也有很多框架什么的,只要你动手去做,没有什么完成不了的。

项目介绍

功能描述

一个个人博客网站,用来记录个人的文章,前台用来展示文章,后台给作者使用,用来对文章进行管理。

很简单,功能很简单。

技术栈

本次选用前后端分离的架构

前端:html,less,element-plus,Vue3,javascript

后端:golang,gin,Mongodb

开发工具: Goland

开发前端用的技术都是目前比较流行的,后端gin框架也是golang里面非常容易上手的,Mongodb的话,比较轻量,使用方便。

大致构思一下

草图,不规范,实际开发中不会这样草率,我一个人的话,就图一个方便。

项目最终的目录结构,额,完整版的不便展示,我自己还在用,下面的,我有些代码结构改了一下。

代码语言:go复制
GoServe
├── configs
├── docs
├── global
├── internal
│   ├── dao
│   ├── middleware
│   ├── model
│   ├── routers
│   └── service
├── pkg
├── main.go

configs:配置文件。

docs:文档集合。

global:全局变量。

internal:内部模块。

dao:所有与数据相关的操作都在 dao 层进行

middleware:中间件。

model:模型层,用于存放 model 对象。

routers:路由相关逻辑处理。

service:项目核心业务逻辑。

pkg:项目相关的模块包。

本次开发的一些基础知识

Gin

Gin 是一个用 Go 语言编写的 HTTP Web 框架,它具有简洁的 API、高性能和良好的生态系统。以下是一个简单的 Gin 框架使用教程:

  1. 安装 Gin:

首先,确保你已经安装了 Go 语言。然后,在Goland里面或者其他开发工具里面使用以下命令安装 Gin:

代码语言:bash复制
go get -u github.com/gin-gonic/gin
  1. 创建一个简单的 HTTP 服务器:

直接在项目里面,创建一个名为 main.go 的文件,然后添加以下代码:

代码语言:go复制
package main

import "github.com/gin-gonic/gin"

func main() {
    r := gin.Default()

    r.GET("/", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "this is 言志志",
        })
    })

    r.Run(":9090")
}

这段代码创建了一个简单的 HTTP 服务器,监听 8080 端口。当访问根路径("/")时,服务器会返回一个 JSON 格式的 "this is 言志志" 消息。

  1. 运行服务器:

在终端中,进入到包含 main.go 文件的目录,然后运行以下命令:

代码语言:bash复制
go run main.go

现在,你的 Gin 服务器应该已经启动并在监听 8080 端口。访问 http://localhost:8080,你将看到 "Hello, World!" 消息。

  1. 添加路由和处理函数:

你可以根据需要添加更多的路由和处理函数。例如,添加一个 POST 请求路由:

代码语言:go复制
r.POST("/submit", func(c *gin.Context) {
    c.JSON(200, gin.H{
        "message": "Form submitted successfully!",
    })
})

这将在服务器上创建一个新的 POST 路由,当用户访问 http://localhost:8080/submit 时,将返回一个 JSON 格式的 "Form submitted successfully!" 消息。

  1. 使用中间件:

Gin 提供了一些内置的中间件,如日志记录、跨域资源共享(CORS)等。要使用中间件,可以使用 Use() 方法将其添加到路由器中。例如,添加一个日志中间件:

代码语言:go复制
import "github.com/gin-contrib/zap"

func main() {
    r := gin.New()

    // 使用日志中间件
    logger, _ := zap.New()
    r.Use(ginzap.Ginzap(logger, time.RFC3339, true))

    // ... 其他路由和处理函数

    r.Run(":8080")
}

这将为每个请求添加日志记录功能。

这只是 Gin 框架的一个简单入门教程,看到这,你就差不多入门了,官方文档也很详细,自己去搜就行了。

mongodb数据库

MongoDB是一个文档型,非关系型数据库,支持动态模式,不需要预先定义数据结构。在项目初期,可以更容易地调整数据模型以适应需求变化,对于小型项目来说,MongoDB数据库提供了灵活性、高性能、可扩展性和易用性等优势。

博客在本地测试的话,你需要自己安装Mongodb数据库到你电脑上,或者使用云的,这个自己去搜,我只介绍了在本地的。

还有一点就是,go里面流行的gorm,并没有支持Mongodb

所以我们首先是安装Go的MongoDB驱动程序

使用以下命令安装go.mongodb.org/mongo-driver包:

代码语言:bash复制
go get go.mongodb.org/mongo-driver/mongo

安装完成后,您可以在Go代码中导入这个包:

代码语言:go复制
import (
    "go.mongodb.org/mongo-driver/mongo"
)

接下来,需要创建一个mongo.Client结构体的实例,并使用mongo.Connect函数连接到MongoDB数据库。

要在Go代码中使用MongoDB,需要使用mongo.Client结构体的方法来操作数据库和集合。可以使用Client.Database方法获取数据库,然后使用Database.Collection方法获取集合。

链接MongoDB数据库并实现对数据的CRUD操作,可以看下面的教程

  • 导入必要的包:
代码语言:go复制
import (
    "context"
    "fmt"
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "log"
    "time"
)
  • 定义数据结构:
代码语言:go复制
type User struct {
    ID        primitive.ObjectID `bson:"_id,omitempty"`
    Name      string             `bson:"name"`
    Age       int                `bson:"age"`
    CreatedAt time.Time          `bson:"created_at"`
}

后面的Tab标记是提示Mongodb数据库的

  • 连接到MongoDB数据库:
代码语言:go复制
func main() {
    // 创建一个客户端选项,指定MongoDB的连接URI
    clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")

    // 使用客户端选项连接到MongoDB数据库
    client, err := mongo.Connect(context.Background(), clientOptions)
    if err != nil {
        log.Fatal(err)
    }

    // 在程序结束时断开与数据库的连接
    defer client.Disconnect(context.Background())
}
  • 选择数据库和集合:
代码语言:go复制
// 从客户端实例中获取名为"test"的数据库
db := client.Database("test")

// 从数据库实例中获取名为"users"的集合
collection := db.Collection("users")

然后就是基本的CRUD了。

  • 插入数据(Create):
代码语言:go复制
// 定义一个User结构体实例
user := User{
    Name:      "John Doe",
    Age:       30,
    CreatedAt: time.Now(),
}

// 向集合中插入一个新文档,包含上面定义的User结构体实例
result, err := collection.InsertOne(context.Background(), user)
if err != nil {
    log.Fatal(err)
}

// 输出插入文档的ID
fmt.Println("Inserted ID:", result.InsertedID)
  • 查询数据(Read):
代码语言:go复制
// 定义一个User类型的切片,用于存储查询结果
var users []User

// 定义一个过滤器,用于筛选出名为"John Doe"的文档
filter := bson.M{"name": "John Doe"}

// 使用过滤器从集合中查询文档
cur, err := collection.Find(context.Background(), filter)
if err != nil {
    log.Fatal(err)
}

// 将查询结果解码为User类型的切片
err = cur.All(context.Background(), &users)
if err != nil {
    log.Fatal(err)
}

// 遍历查询结果并输出
for _, user := range users {
    fmt.Println(user)
}
  • 更新数据(Update):
代码语言:go复制
filter := bson.M{"name": "John Doe"}
update := bson.M{"$set": bson.M{"age": 31}}

result, err := collection.UpdateMany(context.Background(), filter, update)
if err != nil {
    log.Fatal(err)
}
fmt.Println("Updated", result.ModifiedCount, "documents")
  • 删除数据(Delete):
代码语言:go复制
filter := bson.M{"name": "John Doe"}

result, err := collection.DeleteMany(context.Background(), filter)
if err != nil {
    log.Fatal(err)
}
fmt.Println("Deleted", result.DeletedCount, "documents")

完整操作

创建一个go项目,然后先新建一个main.go文件,键入以下代码

代码语言:go复制
package main

import(
    	"GoServe/global"
)

func init(){
err := setupDB()
	if err != nil {
		log.Fatalf("init.setupDBEngine err: %v", err)
	}
}

func main(){
    r := gin.Default()
    r.Run(":9090")
}

func setupDB() error {
    err := global.MongodbJoin()
    if err != nil {
		return err
	}
	return nil
}

然后我在global文件夹下面创建了一个db.go的文件,键入以下代码

代码语言:go复制
package global

import (
	"context"
	"fmt"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"log"
)

// Client 定义一个全局变量,存储连接了数据库之后的句柄
var Client *mongo.Client

// MongodbJoin 函数用于连接到MongoDB数据库
func MongodbJoin() error {
	// 设置连接选项
	clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")

	// 使用连接选项连接到MongoDB
	var err error
	Client, err = mongo.Connect(context.Background(), clientOptions)
	if err != nil {
		return fmt.Errorf("数据库连接失败:%v", err)
	}

	// 确保在最后关闭链接
	err = Client.Disconnect(context.Background())
	if err != nil {
		return fmt.Errorf("无法断开与Mongodb数据库的连接:%v", err)
	}

	return nil
}

到这里,我们就大概了解了博客的gin框架的使用和mongodb数据库的链接使用,下一期我们将抽离配置信息,完成配置模块,和相关代码的修改。

本次实践参考《go语言编程之旅》,我是在已经完成了之后,才看到这本书的,然后学习了作者的方法,按照他的思路将我的代码进行了结构上的重构。

我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!

0 人点赞