使用 Go 和 Gin 框架构建简单的用户和物品管理 Web 服务

使用 Go 和 Gin 框架构建简单的用户和物品管理 Web 服务

在本项目中,我们使用 Go 语言和 Gin 框架构建了一个简单的 Web 服务,能够管理用户和物品的信息。该服务实现了两个主要接口:根据用户 ID 获取用户名称,以及根据物品 ID 获取物品名称。本文将介绍项目的整体结构、数据库设计、接口实现以及如何测试这些接口。

项目结构

项目的目录结构如下:

数据库设计

本项目使用 MySQL 数据库存储用户和物品信息。我们创建了两张表:

示例数据

我们在数据库中插入了一些示例用户和物品数据:

sql 复制代码
-- 插入用户数据
INSERT INTO users (name) VALUES ('张三'); -- 用户ID 1
INSERT INTO users (name) VALUES ('李四'); -- 用户ID 2

-- 插入物品数据
INSERT INTO items (name, user_id) VALUES ('书籍', 1);  -- 张三的书籍
INSERT INTO items (name, user_id) VALUES ('电脑', 2);  -- 李四的电脑
INSERT INTO items (name, user_id) VALUES ('手机', 1);   -- 张三的手机

接口实现

1.获取用户名称

go 复制代码
// GetUserByID 根据用户ID获取用户名称
func GetUserByID(c *gin.Context) {
    id := c.Param("id") // 从请求中获取用户ID
    var user models.User

    err := database.DB.QueryRow("SELECT id, name FROM users WHERE id = ?", id).Scan(&user.ID, &user.Name)
    
    if err != nil {
        if err == sql.ErrNoRows {
            c.JSON(http.StatusNotFound, gin.H{"message": "用户未找到"})
        } else {
            c.JSON(http.StatusInternalServerError, gin.H{"message": "查询用户时出错"})
        }
        return
    }

    c.JSON(http.StatusOK, user)
}

2.获取物品名称

go 复制代码
// GetItemByID 根据物品ID获取物品信息
func GetItemByID(c *gin.Context) {
    id := c.Param("id") // 从请求中获取物品ID
    var item models.Item

    err := database.DB.QueryRow("SELECT id, name, user_id FROM items WHERE id = ?", id).Scan(&item.ID, &item.Name, &item.UserID)
    
    if err != nil {
        if err == sql.ErrNoRows {
            c.JSON(http.StatusNotFound, gin.H{"message": "物品未找到"})
        } else {
            c.JSON(http.StatusInternalServerError, gin.H{"message": "查询物品时出错"})
        }
        return
    }

    // 查询物品所属用户的信息
    var user models.User
    err = database.DB.QueryRow("SELECT id, name FROM users WHERE id = ?", item.UserID).Scan(&user.ID, &user.Name)
    if err == nil {
        fmt.Println("用户名称:", user.Name) // 模拟打印日志
    }

    c.JSON(http.StatusOK, item)
}

3.路由设置

我们将上述接口绑定到路由中:

go 复制代码
func SetupRouter() *gin.Engine {
    router := gin.Default()

    // 用户相关接口
    router.GET("/user/:id", controllers.GetUserByID) // 根据用户ID获取用户名称

    // 物品相关接口
    router.GET("/item/:id", controllers.GetItemByID) // 根据物品ID获取物品名称

    return router
}

4.数据库连接

go 复制代码
package database

import (
	"database/sql"

	_ "github.com/go-sql-driver/mysql"
)

var DB *sql.DB

func InitDB() error {
	dsn := "root:P110040593abc@tcp(127.0.0.1:3306)/pj12db?charset=utf8mb4&parseTime=True&loc=Local" // 数据库信息
	var err error
	DB, err = sql.Open("mysql", dsn)
	if err != nil {
		return err
	}
	// 连接数据库
	return DB.Ping()
}

测试接口

使用 Postman 来测试接口:

获取用户名称:GET http://localhost:8080/user/1 # 查询用户ID为1(张三)

查询结果:

获取物品名称:GET http://localhost:8080/item/2 # 查询物品ID为2(电脑)

查询结果:

相关推荐
我才是银古11 分钟前
基于 robotgo 实现 Windows 桌面 RPA 自动化框架:技术全解
go·rpa·robotgo
掘金一周13 分钟前
裁员了,公司很爽快,赔偿一分没少 | 沸点周刊 7.8
前端·人工智能·后端
神奇小汤圆14 分钟前
MySQL 5.7 频繁被 Systemd 杀死:一次惊心动魄的故障排查之旅
后端
lpfasd12315 分钟前
2026年第27周科技社区趋势周报
github
一只专注api接口开发的技术猿16 分钟前
电商评论自动化监控与情感数据分析完整落地教程(附可直接运行 Python 代码)
大数据·数据库·python·数据分析·自动化
hh真是个慢性子18 分钟前
GaussDB Inside 2.23.01.280 集中式一主一备安装
数据库·database·gaussdb·国产数据库·高斯
沉静的小伙22 分钟前
Spring事务
java·数据库·spring
行思理25 分钟前
fastadmin 新手部分功能点
后端·php
大侠锅锅26 分钟前
第 3 篇:节点自动化纳管——从裸机到可管理的 7 步安装流水线
数据库·自动化·边缘计算·iot
笃行35036 分钟前
踩坑实战 | MySQL/PostgreSQL 迁移必踩:LEFT JOIN 莫名丢数据,KES 外连接消除避坑指南
数据库