package controller import ( "fmt" "github.com/gin-gonic/gin" "time" "vote-video-api/api/dao" "vote-video-api/api/dto" "vote-video-api/api/model" "vote-video-api/api/requests" "vote-video-api/api/responses" "vote-video-api/api/service" "vote-video-api/global" "vote-video-api/utils" ) type Login struct{} func (r *Login) Login(c *gin.Context) { loginRequest := requests.LoginRequest{} req := loginRequest.Login if err := c.ShouldBind(&req); err != nil { responses.FailWithMessage(err.Error(), c) return } // 参数验证 if err := global.Validate.Struct(req); err != nil { responses.FailWithMessage(utils.Translate(err), c) return } // 开始事务 tx := global.Db.Begin() defer func() { if r := recover(); r != nil { tx.Rollback() utils.LogJsonErr("操作失败", r) responses.FailWithMessage("操作失败", c) return } }() // 检测用户信息 userDao := dao.UserDao{} maps := make(map[string]interface{}) maps["open_id"] = req.OpenId user, err := userDao.GetUser(maps) // 新用户处理方式 if user == nil { // 登录ip publicService := service.PublicService{} loginIp := publicService.GetUserIP(c.Request) // 新增用户 user = &model.User{ OpenId: req.OpenId, LoginIp: loginIp, } loginAt := model.LocalTime(time.Now()) user.LoginAt = &loginAt user, err = userDao.AddUser(tx, user) if err != nil { tx.Rollback() responses.FailWithMessage(err.Error(), c) return } } // 下发token token := &utils.Token{ UserId: fmt.Sprintf("%d", user.UserId), } // 生成jwt jwt, err := token.NewJWT() if err != nil || jwt == "" { responses.FailWithMessage("登陆失败", c) return } // 处理返回值 g := dto.LoginDto{ UserId: fmt.Sprintf("%d", user.UserId), Token: jwt, } tx.Commit() responses.OkWithData(g, c) }