From 259d8dcbd7932f0a9a2af4dff493d5ff6dc390ad Mon Sep 17 00:00:00 2001 From: Gmaker689 <1711322114@qq.com> Date: Sun, 24 May 2026 13:14:41 +0800 Subject: [PATCH] =?UTF-8?q?feat(login/register):=20=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=B3=A8=E5=86=8C=E7=99=BB=E5=BD=95handler?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E7=94=A8=E6=88=B7=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/internal/handler/login.go | 38 ++++++++++++++++++++++++++++ backend/internal/handler/register.go | 37 +++++++++++++++++++++++++++ backend/internal/model/user.go | 13 ++++++++++ 3 files changed, 88 insertions(+) create mode 100644 backend/internal/handler/login.go create mode 100644 backend/internal/handler/register.go create mode 100644 backend/internal/model/user.go diff --git a/backend/internal/handler/login.go b/backend/internal/handler/login.go new file mode 100644 index 0000000..c193012 --- /dev/null +++ b/backend/internal/handler/login.go @@ -0,0 +1,38 @@ +package handler + +import ( + "net/http" + + "gen2d/internal/model" + + "github.com/gin-gonic/gin" +) + +// LoginRequest 登录请求参数。 +type LoginRequest struct { + Username string `json:"username" binding:"required"` // 用户名 + Password string `json:"password" binding:"required"` // 密码 +} + +// LoginResponse 登录成功返回的凭证及用户信息。 +type LoginResponse struct { + Token string `json:"token"` // 访问令牌 + ExpiresIn int64 `json:"expiresIn"` // 过期时间(秒) + User model.User `json:"user"` // 用户信息 +} + +// Login 用户登录接口,校验用户名/密码并返回访问令牌。 +func Login(c *gin.Context) { + var req LoginRequest + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, model.Fail(http.StatusBadRequest, "参数错误: "+err.Error())) + return + } + + // TODO: 调用 service 层校验用户凭证并签发 token + c.JSON(http.StatusOK, model.OK(LoginResponse{ + Token: "placeholder-token", + ExpiresIn: 7200, + User: model.User{Username: req.Username}, + })) +} diff --git a/backend/internal/handler/register.go b/backend/internal/handler/register.go new file mode 100644 index 0000000..756bdd0 --- /dev/null +++ b/backend/internal/handler/register.go @@ -0,0 +1,37 @@ +package handler + +import ( + "net/http" + + "gen2d/internal/model" + + "github.com/gin-gonic/gin" +) + +// RegisterRequest 注册请求参数。 +type RegisterRequest struct { + Username string `json:"username" binding:"required,min=3,max=32"` // 用户名 + Password string `json:"password" binding:"required,min=6,max=64"` // 密码 + Email string `json:"email" binding:"omitempty,email"` // 邮箱(可选) +} + +// RegisterResponse 注册成功返回的用户信息。 +type RegisterResponse struct { + ID uint `json:"id"` + Username string `json:"username"` +} + +// Register 用户注册接口,创建新用户账号。 +func Register(c *gin.Context) { + var req RegisterRequest + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, model.Fail(http.StatusBadRequest, "参数错误: "+err.Error())) + return + } + + // TODO: 调用 service 层创建用户 + c.JSON(http.StatusCreated, model.OK(RegisterResponse{ + ID: 0, + Username: req.Username, + })) +} diff --git a/backend/internal/model/user.go b/backend/internal/model/user.go new file mode 100644 index 0000000..f5a4c06 --- /dev/null +++ b/backend/internal/model/user.go @@ -0,0 +1,13 @@ +package model + +import "time" + +// User 用户实体。 +type User struct { + ID uint `json:"id"` + Username string `json:"username"` + Password string `json:"-"` // 密码哈希,JSON 序列化时忽略 + Email string `json:"email,omitempty"` + CreatedAt time.Time `json:"createdAt"` + UpdatedAt time.Time `json:"updatedAt"` +}