小程序 + Go 开发《共享遛狗》系列教程第六篇:后端构建
2023-12-25 04:58:46
**微信小程序 + Go 开发《共享遛狗》**
**第六篇:后端构建**
**技术选型**
对于后端开发,我们选择使用 Go 语言。Go 语言是一种高性能、并发的编程语言,非常适合构建 Web 服务。
**数据库设计**
我们使用 MySQL 作为数据库。数据库设计如下:
CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT,
username VARCHAR(255) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE dogs (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
breed VARCHAR(255),
age INT,
PRIMARY KEY (id)
);
CREATE TABLE walks (
id INT NOT NULL AUTO_INCREMENT,
user_id INT NOT NULL,
dog_id INT NOT NULL,
start_time DATETIME,
end_time DATETIME,
PRIMARY KEY (id)
);
**ORM**
我们使用 GORM 作为 ORM(对象关系映射)框架。GORM 可以帮助我们轻松地将 Go 语言对象映射到数据库表。
**CRUD 操作**
使用 GORM,我们可以轻松地进行 CRUD(创建、读取、更新、删除)操作。以下是一些示例代码:
```go
// 创建用户
user := &models.User{
Username: "alice",
Password: "123456",
}
db.Create(user)
// 读取用户
var user models.User
db.First(&user, 1)
// 更新用户
user.Password = "654321"
db.Save(&user)
// 删除用户
db.Delete(&user)
RESTful API
我们使用 Gin 作为 RESTful API 框架。Gin 是一个高性能的 Web 框架,非常适合构建 RESTful API。
以下是一些示例代码:
// 获取所有用户
router.GET("/users", func(c *gin.Context) {
var users []models.User
db.Find(&users)
c.JSON(200, users)
})
// 获取单个用户
router.GET("/users/:id", func(c *gin.Context) {
var user models.User
db.First(&user, c.Param("id"))
c.JSON(200, user)
})
// 创建用户
router.POST("/users", func(c *gin.Context) {
var user models.User
if err := c.BindJSON(&user); err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
db.Create(&user)
c.JSON(201, user)
})
// 更新用户
router.PUT("/users/:id", func(c *gin.Context) {
var user models.User
if err := c.BindJSON(&user); err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
db.Save(&user)
c.JSON(200, user)
})
// 删除用户
router.DELETE("/users/:id", func(c *gin.Context) {
var user models.User
db.Delete(&user, c.Param("id"))
c.JSON(204, nil)
})
JWT
我们使用 JWT(JSON Web Token)进行身份验证。JWT 是一种用于在分布式系统中安全地传递信息的方法。
以下是一些示例代码:
// 生成 JWT
token, err := jwt.NewWithClaims(jwt.SigningMethodHS256, &myClaims{
Username: user.Username,
StandardClaims: jwt.StandardClaims{
ExpiresAt: time.Now().Add(time.Hour * 24).Unix(),
},
}).SignedString([]byte("secret"))
if err != nil {
return err
}
// 解析 JWT
claims, err := jwt.ParseWithClaims(token, &myClaims{}, func(token *jwt.Token) (interface{}, error) {
return []byte("secret"), nil
})
if err != nil {
return err
}
session
我们使用 session 来存储用户的状态。session 是一个存储在服务器上的临时数据结构,用于跟踪用户的信息。
以下是一些示例代码:
// 设置 session
session, _ := session.NewSession(c, opts...)
session.Options(opts...)
session.Set("username", "alice")
session.Save()
// 获取 session
session, _ := session.GetSession(c, opts...)
username := session.Get("username")
WebSocket
我们使用 WebSocket 来实现实时通信。WebSocket 是一种双向通信协议,允许客户端和服务器在全双工通信信道上交换数据。
以下是一些示例代码:
// 客户端代码
var conn, _, err = websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil)
if err != nil {
return err
}
defer conn.Close()
for {
_, message, err := conn.ReadMessage()
if err != nil {
return err
}
fmt.Printf("received message: %s\n", message)
}
// 服务端代码
router.GET("/ws", func(c *gin.Context) {
wsh := websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
CheckOrigin: func(r *http.Request) bool { return true },
}
conn, err := wsh.Upgrade(c.Writer, c.Request, nil)
if err != nil {
return
}
defer conn.Close()
for {
_, message, err := conn.ReadMessage()
if err != nil {
return
}
fmt.Printf("received message: %s\n", message)
err = conn.WriteMessage(websocket.TextMessage, []byte("pong"))
if err != nil {
return
}
}
})
完整代码
完整的代码可以在 GitHub 上找到:https://github.com/siadat/shared-dog-walking
总结
本教程介绍了如何使用 Go 语言构建微信小程序共享遛狗应用的后端。我们介绍了技术选型、数据库设计、ORM、CRUD 操作、RESTful API、JWT、session 和 WebSocket 的使用。