package
0.0.0-20241124080009-a68f4f892810
Repository: https://github.com/chenle1232/luck-go.git
Documentation: pkg.go.dev

# README

我来帮你实现用户表的创建和接口。按照你的项目结构,我们需要完成以下步骤:

  1. 首先在 database/models 创建用户模型:
package models

import "time"

type User struct {
    ID        uint      `gorm:"primarykey"`
    Username  string    `gorm:"type:varchar(32);not null;unique"`
    Password  string    `gorm:"type:varchar(128);not null"`
    Email     string    `gorm:"type:varchar(128);unique"`
    CreatedAt time.Time
    UpdatedAt time.Time
}
  1. 创建数据库迁移文件:
package migrations

import (
    "luck-go/database/models"
    "gorm.io/gorm"
)

func CreateUsersTable(db *gorm.DB) error {
    return db.AutoMigrate(&models.User{})
}
  1. daos/users 实现用户 DAO:

    DAO 的实现是用来操作数据库的,比如创建用户,查询用户,更新用户,删除用户等

package user_dao

import (
    "luck-go/database/models"
    "gorm.io/gorm"
)

type UserDAO struct {
    db *gorm.DB
}

func NewUserDAO(db *gorm.DB) *UserDAO {
    return &UserDAO{db: db}
}

func (dao *UserDAO) Create(user *models.User) error {
    return dao.db.Create(user).Error
}
  1. 创建用户 DTO:
package user

type CreateUserDTO struct {
    Username string `json:"username" binding:"required"`
    Password string `json:"password" binding:"required"`
    Email    string `json:"email" binding:"required,email"`
}
  1. 创建用户 Handler:
package handlers

import (
    "luck-go/dtos/user"
    "luck-go/database/models"
    userDao "luck-go/daos/users"
    "github.com/gin-gonic/gin"
    "net/http"
)

type UserHandler struct {
    userDAO *userDao.UserDAO
}

func NewUserHandler(userDAO *userDao.UserDAO) *UserHandler {
    return &UserHandler{userDAO: userDAO}
}

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

    user := &models.User{
        Username: dto.Username,
        Password: dto.Password, // 注意:实际应用中应该对密码进行加密
        Email:    dto.Email,
    }

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

    c.JSON(http.StatusCreated, gin.H{"id": user.ID})
}
  1. routes/routes.go 添加路由:
// ... 现有代码 ...

func SetupRoutes(r *gin.Engine, db *gorm.DB) {
    // 初始化 DAO
    userDAO := user_dao.NewUserDAO(db)

    // 初始化 Handler
    userHandler := handlers.NewUserHandler(userDAO)

    api := r.Group("/api")
    {
        // 用户相关路由
        api.POST("/users", userHandler.CreateUser)

        // ... 其他现有路由 ...
    }
}
  1. 修改 cmd/main.go 以初始化数据库:
package main

import (
    "log"
    "luck-go/database/migrations"
    "luck-go/routes"
    "gorm.io/gorm"
    "gorm.io/driver/mysql"
)

func main() {
    // 数据库连接配置
    dsn := "carline:@tcp(rm-.mysql.rds.aliyuncs.com:3306)/test_cn?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Fatalf("数据库连接失败: %v", err)
    }

    // 运行迁移
    if err := migrations.CreateUsersTable(db); err != nil {
        log.Fatalf("数据库迁移失败: %v", err)
    }

    r := gin.Default()
    routes.SetupRoutes(r, db)

    err = r.Run(":7001")
    if err != nil {
        log.Fatalf("启动服务器失败: %v", err)
    }
}

现在你可以通过 POST 请求创建用户:

curl -X POST http://localhost:7001/api/users \
-H "Content-Type: application/json" \
-d '{
    "username": "testuser",
    "password": "password123",
    "email": "[email protected]"
}'

这个实现:

  1. 自动创建用户表
  2. 提供了创建用户的 API
  3. 遵循了你的项目结构
  4. 使用了 GORM 作为 ORM

注意:这是基础实现,实际应用中还需要:

  • 密码加密
  • 输入验证
  • 错误处理
  • 日志记录
  • 事务处理等 让我们先安装必要的依赖。在项目根目录下运行以下命令:
# 安装 GORM
go get -u gorm.io/gorm

# 安装 MySQL 驱动
go get -u gorm.io/driver/mysql

然后运行:

go mod tidy

如果遇到网络问题,可以设置 GOPROXY:

# 设置国内代理
go env -w GOPROXY=https://goproxy.cn,direct

安装完成后,你可以检查 go.mod 文件,应该会看到新添加的依赖:

require (
    gorm.io/gorm v1.25.7
    gorm.io/driver/mysql v1.5.4
)

现在你可以继续按照之前的步骤实现用户表和接口了。需要我重新列出具体实现步骤吗?