前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go中级之手把手教你开发一个简易的个人博客网站(一)项目基本架构和数据库链接

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

原创
作者头像
言志志
修改2023-12-24 15:40:59
8341
修改2023-12-24 15:40:59
举报
文章被收录于专栏:Go语言学习笔记Go语言学习笔记

前言

本文是记录的是"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腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 项目介绍
    • 功能描述
      • 技术栈
        • 大致构思一下
        • 本次开发的一些基础知识
          • Gin
            • mongodb数据库
            • 完整操作
            相关产品与服务
            云数据库 MongoDB
            腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
            http://www.vxiaotou.com