package
0.0.0-20241124080009-a68f4f892810
Repository: https://github.com/chenle1232/luck-go.git
Documentation: pkg.go.dev
# README
我来帮你实现用户表的创建和接口。按照你的项目结构,我们需要完成以下步骤:
- 首先在
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
}
- 创建数据库迁移文件:
package migrations
import (
"luck-go/database/models"
"gorm.io/gorm"
)
func CreateUsersTable(db *gorm.DB) error {
return db.AutoMigrate(&models.User{})
}
- 在
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
}
- 创建用户 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"`
}
- 创建用户 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})
}
- 在
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)
// ... 其他现有路由 ...
}
}
- 修改
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]"
}'
这个实现:
- 自动创建用户表
- 提供了创建用户的 API
- 遵循了你的项目结构
- 使用了 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
)
现在你可以继续按照之前的步骤实现用户表和接口了。需要我重新列出具体实现步骤吗?