抖音极简版项目Go实现 | 青训营

616 阅读4分钟

抖音极简版项目Go实现

项目简介

抖音极简版是一个基于Web的视频分享平台,用户可以在平台上注册、登录、发布视频和浏览视频。本文将使用Go语言、Gin框架和GORM库来实现这个项目。

技术栈介绍

  • Go语言:Go是一种开源的编译型静态语言,具有高性能、简洁易用等特点,适合构建高并发的Web应用程序。
  • Gin框架:Gin是一个轻量级的Web框架,具有快速、易用、高性能等特点,适合构建RESTful API。
  • GORM库:GORM是一个强大的ORM库,提供了简单易用的API来操作数据库,支持多种数据库,如MySQL、PostgreSQL等。

项目结构

├── main.go
├── handlers.go
├── models.go
└── README.md
  • main.go:项目的入口文件,包含了项目的启动逻辑和路由配置。
  • handlers.go:包含了项目的接口处理函数,处理用户注册、登录、发布视频和浏览视频等请求。
  • models.go:定义了数据库模型,用于映射数据库表结构。

数据库连接

首先,我们需要连接到MySQL数据库。可以使用GORM库来简化数据库操作。在main.go文件中,添加以下代码:

db, err := gorm.Open("mysql", "user:password@/database?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
    log.Fatal(err)
}

defer db.Close()

这里的userpassworddatabase需要替换为实际的数据库用户名、密码和数据库名。

数据库模型

然后,我们需要定义数据库模型来映射表结构。在models.go文件中,添加以下代码:

type User struct {
    gorm.Model
    Username string `gorm:"unique"`
    Password string
}

type Video struct {
    gorm.Model
    UserID uint
    Title  string
    URL    string
}

这里的UserVideo分别对应了用户表和视频表。gorm.Model是GORM提供的基础模型,包含了一些常用的字段,如ID、创建时间和更新时间等。

用户注册

接下来,我们需要创建用户注册的接口。在handlers.go文件中,添加以下代码:

func Register(c *gin.Context) {
    var user User
    if err := c.ShouldBindJSON(&user); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

    if err := db.Create(&user).Error; err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
        return
    }

    c.JSON(http.StatusOK, gin.H{"message": "User registered successfully"})
}

这里使用了Gin框架的ShouldBindJSON方法来将请求的JSON数据绑定到user结构体上。然后,使用GORM库的Create方法将用户信息插入到数据库中。

用户登录

然后,我们需要创建用户登录的接口。在handlers.go文件中,添加以下代码:

func Login(c *gin.Context) {
    var user User
    if err := c.ShouldBindJSON(&user); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

    if err := db.Where("username = ?", user.Username).First(&user).Error; err != nil {
        c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid username"})
        return
    }

    if user.Password != user.Password {
        c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid password"})
        return
    }

    token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
        "username": user.Username,
    })

    tokenString, err := token.SignedString([]byte("secret"))
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to generate token"})
        return
    }

    c.JSON(http.StatusOK, gin.H{"token": tokenString})
}

这里使用了Gin框架的ShouldBindJSON方法来将请求的JSON数据绑定到user结构体上。然后,使用GORM库的Where方法根据用户名从数据库中查询用户信息。如果用户名不存在,返回未授权的错误;如果密码不正确,也返回未授权的错误。如果用户名和密码都正确,使用jwt库生成JWT,并返回给客户端。

视频发布

接着,我们需要创建视频发布的接口。在handlers.go文件中,添加以下代码:

func PublishVideo(c *gin.Context) {
    var video Video
    if err := c.ShouldBindJSON(&video); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

    token := c.Request.Header.Get("Authorization")
    // 验证用户的JWT,确保用户已经登录

    // 获取用户ID
    // video.UserID = userID

    if err := db.Create(&video).Error; err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
        return
    }

    c.JSON(http.StatusOK, gin.H{"message": "Video published successfully"})
}

这里使用了Gin框架的ShouldBindJSON方法来将请求的JSON数据绑定到video结构体上。然后,从请求头中获取用户的JWT,验证用户是否已经登录。接着,获取用户ID,并将视频信息插入到数据库中。

视频浏览

最后,我们需要创建视频浏览的接口。在handlers.go文件中,添加以下代码:

func GetVideos(c *gin.Context) {
    var videos []Video
    if err := db.Find(&videos).Error; err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
        return
    }

    c.JSON(http.StatusOK, gin.H{"videos": videos})
}

这里使用了GORM库的Find方法来从数据库中获取视频列表。然后,将视频列表返回给客户端。

总结

通过以上步骤,我们成功实现了抖音极简版的基本功能,包括用户注册登录、发布视频和浏览视频。使用Go语言、Gin框架和GORM库,我们可以快速构建出高性能的Web应用程序。这个抖音极简版项目可以作为学习Go语言和Web开发的练手项目,帮助开发者更好地理解和掌握相关技术。