前言
本文是记录的是"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 框架使用教程:
- 安装 Gin:
首先,确保你已经安装了 Go 语言。然后,在Goland里面或者其他开发工具里面使用以下命令安装 Gin:
代码语言:bash复制go get -u github.com/gin-gonic/gin
- 创建一个简单的 HTTP 服务器:
直接在项目里面,创建一个名为 main.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 言志志" 消息。
- 运行服务器:
在终端中,进入到包含 main.go
文件的目录,然后运行以下命令:
go run main.go
现在,你的 Gin 服务器应该已经启动并在监听 8080 端口。访问 http://localhost:8080
,你将看到 "Hello, World!" 消息。
- 添加路由和处理函数:
你可以根据需要添加更多的路由和处理函数。例如,添加一个 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!" 消息。
- 使用中间件:
Gin 提供了一些内置的中间件,如日志记录、跨域资源共享(CORS)等。要使用中间件,可以使用 Use()
方法将其添加到路由器中。例如,添加一个日志中间件:
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操作,可以看下面的教程
- 导入必要的包:
import (
"context"
"fmt"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"log"
"time"
)
- 定义数据结构:
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数据库:
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())
}
- 选择数据库和集合:
// 从客户端实例中获取名为"test"的数据库
db := client.Database("test")
// 从数据库实例中获取名为"users"的集合
collection := db.Collection("users")
然后就是基本的CRUD了。
- 插入数据(Create):
// 定义一个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):
// 定义一个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):
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):
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腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!