joken-前端工程师

  博客园 :: 首页 :: 新随笔 :: :: :: 管理 ::

下面是一个使用 Go 语言和 Gin 框架实现的简单 CRUD(创建、读取、更新、删除)项目的目录结构和示例代码。假设我们有一个简单的用户管理系统。

目录结构

user-crud/
├── .gitignore
├── go.mod
├── go.sum
├── main.go
├── internal/
│   ├── app/
│   │   ├── middleware/
│   │   ├── router/
│   │   ├── service/
│   │   ├── repository/
│   │   ├── model/
│   │   └── config/
│   └── pkg/
│       ├── utils/
│       └── constants/
├── scripts/
├── Dockerfile
└── tests/
    ├── unit/
    └── integration/

示例代码

internal/app/model/user.go

package model

type User struct {
	ID       int    `json:"id"`
	Name     string `json:"name"`
	Email    string `json:"email"`
	Password string `json:"-"`
}

internal/app/repository/user_repository.go

package repository

import (
	"database/sql"
	"errors"

	"user-crud/internal/app/model"
)

type UserRepository interface {
	Create(user *model.User) error
	GetByID(id int) (*model.User, error)
	Update(user *model.User) error
	Delete(id int) error
}

type userRepository struct {
	db *sql.DB
}

func NewUserRepository(db *sql.DB) UserRepository {
	return &userRepository{db: db}
}

// ... 实现 Create, GetByID, Update, Delete 方法 ...

internal/app/service/user_service.go

package service

import (
	"user-crud/internal/app/model"
	"user-crud/internal/app/repository"
)

type UserService interface {
	Create(user *model.User) error
	GetByID(id int) (*model.User, error)
	Update(user *model.User) error
	Delete(id int) error
}

type userService struct {
	userRepo repository.UserRepository
}

func NewUserService(userRepo repository.UserRepository) UserService {
	return &userService{userRepo: userRepo}
}

// ... 实现 Create, GetByID, Update, Delete 方法 ...

internal/app/router/user_router.go

package router

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"user-crud/internal/app/service"
)

func SetupUserRoutes(router *gin.Engine, userService service.UserService) {
	user := router.Group("/users")
	{
		user.POST("/", createUserHandler(userService))
		user.GET("/:id", getUserHandler(userService))
		user.PUT("/:id", updateUserHandler(userService))
		user.DELETE("/:id", deleteUserHandler(userService))
	}
}

func createUserHandler(userService service.UserService) gin.HandlerFunc {
	return func(c *gin.Context) {
		var user model.User
		if err := c.ShouldBindJSON(&user); err != nil {
			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
			return
		}
		if err := userService.Create(&user); err != nil {
			c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
			return
		}
		c.JSON(http.StatusCreated, user)
	}
}

// ... 实现 getUserHandler, updateUserHandler, deleteUserHandler ...

main.go

package main

import (
	"database/sql"
	"log"
	"net/http"

	"github.com/gin-gonic/gin"
	_ "github.com/go-sql-driver/mysql"
	"user-crud/internal/app/router"
	"user-crud/internal/app/service"
	"user-crud/internal/app/repository"
)

func main() {
	db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/dbname?charset=utf8mb4&parseTime=True")
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	router := gin.Default()
	userService := service.NewUserService(repository.NewUserRepository(db))
	router.Use(gin.Logger())
	router.Use(gin.Recovery())
	router.GET("/ping", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "pong"}) })
	router.POST("/users", router.Group("/").Use(router.MiddlewareFunc()).POST("/users", router.Group("/").Use(router.MiddlewareFunc()), router.Group("/").Use(router.MiddlewareFunc()), createUserHandler(userService)))
	router.Run(":8080")
}

说明

  1. model: 定义用户模型。
  2. repository: 实现用户数据的存储和检索。
  3. service: 提供用户服务接口,调用 repository 进行数据操作。
  4. router: 设置路由和处理函数。
  5. main.go: 初始化数据库连接,设置路由并启动服务器。

请注意,上述代码仅为示例,实际项目中需要根据具体需求进行扩展和优化。

posted on 2025-04-15 20:32  joken1310  阅读(88)  评论(0)    收藏  举报