返回

小程序 + Go 开发《共享遛狗》系列教程第六篇:后端构建

前端







**微信小程序 + 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 的使用。