jdysya 5cb134fa9d refactor(gateway): 重构 main.go 文件
- 移除日志初始化代码,改为使用 utils.InitLogger()
- 删除用户模型定义,移至 models 包
- 抽离路由处理逻辑到 handlers 包
- 使用 middleware 包中的 AuthRequired 中间件
- 优化数据库连接和迁移逻辑
- 简化 main 函数,提高代码可读性和维护性
2025-02-15 20:16:44 +08:00

148 lines
3.8 KiB
Go

package handlers
import (
"net/http"
"strconv"
"strings"
"gateway/models"
"gateway/utils"
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin"
"github.com/jinzhu/gorm"
"golang.org/x/crypto/bcrypt"
)
func GetLogin(c *gin.Context) {
c.HTML(http.StatusOK, "login.html", nil)
}
func PostLogin(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
username := c.PostForm("username")
password := c.PostForm("password")
var user models.User
if err := db.Where("mobile = ?", username).First(&user).Error; err != nil {
c.HTML(http.StatusUnauthorized, "login.html", gin.H{"error": "用户不存在或密码错误"})
return
}
if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password)); err != nil {
c.HTML(http.StatusUnauthorized, "login.html", gin.H{"error": "用户不存在或密码错误"})
return
}
session := sessions.Default(c)
session.Set("user", user.ID)
if err := session.Save(); err != nil {
utils.Logger.Errorf("Session保存失败: %v", err)
c.HTML(http.StatusInternalServerError, "login.html", gin.H{"error": "登录状态保存失败"})
return
}
c.Redirect(http.StatusSeeOther, "/")
}
}
func GetRegister(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
regions, err := getRegions(db)
if err != nil {
c.HTML(http.StatusInternalServerError, "register.html", gin.H{"error": "系统错误"})
return
}
c.HTML(http.StatusOK, "register.html", gin.H{"regions": regions})
}
}
func PostRegister(db *gorm.DB) gin.HandlerFunc {
return func(c *gin.Context) {
regionStr, exists := c.GetPostForm("region")
if !exists {
handleRegisterError(c, db, "请选择所在地区")
return
}
regionID, err := strconv.ParseUint(regionStr, 10, 32)
if err != nil {
handleRegisterError(c, db, "无效的地区参数")
return
}
user := models.User{
FullName: c.PostForm("fullname"),
Mobile: c.PostForm("mobile"),
RegionID: uint(regionID),
}
var region models.Region
if err := db.First(&region, user.RegionID).Error; err != nil {
handleRegisterError(c, db, "请选择有效地区")
return
}
if len(user.Mobile) != 11 {
handleRegisterError(c, db, "手机号格式不正确")
return
}
password := c.PostForm("password")
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
if err != nil {
utils.Logger.Errorf("密码加密失败: %v", err)
handleRegisterError(c, db, "注册失败")
return
}
user.Password = string(hashedPassword)
if err := db.Create(&user).Error; err != nil {
utils.Logger.Errorf("用户创建失败: %v", err)
errorMsg := "注册失败"
if strings.Contains(err.Error(), "UNIQUE constraint failed") {
errorMsg = "该手机号已注册"
}
handleRegisterError(c, db, errorMsg)
return
}
c.Redirect(http.StatusSeeOther, "/login")
}
}
func Logout(c *gin.Context) {
session := sessions.Default(c)
session.Clear()
if err := session.Save(); err != nil {
utils.Logger.Errorf("退出登录失败: %v", err)
c.HTML(http.StatusInternalServerError, "error.html", gin.H{"error": "退出登录失败"})
return
}
c.Redirect(http.StatusSeeOther, "/login")
}
func getRegions(db *gorm.DB) ([]models.Region, error) {
var regions []models.Region
if err := db.Find(&regions).Error; err != nil {
utils.Logger.Errorf("获取地区数据失败: %v", err)
return nil, err
}
return regions, nil
}
func handleRegisterError(c *gin.Context, db *gorm.DB, errorMessage string) {
regions, err := getRegions(db)
if err != nil {
c.HTML(http.StatusInternalServerError, "register.html", gin.H{"error": "系统错误"})
return
}
c.HTML(http.StatusBadRequest, "register.html", gin.H{
"error": errorMessage,
"regions": regions,
"form": gin.H{
"fullname": c.PostForm("fullname"),
"mobile": c.PostForm("mobile"),
},
})
}