package controller import ( "electricity_bill_calc/cache" "electricity_bill_calc/exceptions" "electricity_bill_calc/model" "electricity_bill_calc/response" "electricity_bill_calc/security" "electricity_bill_calc/service" "net/http" "github.com/gofiber/fiber/v2" ) func InitializeUserHandlers(router *fiber.App) { router.Delete("/login", security.MustAuthenticated, doLogout) router.Post("/login", doLogin) } type _LoginForm struct { Username string `json:"uname"` Password string `json:"upass"` Type int16 `json:"type"` } func doLogin(c *fiber.Ctx) error { result := response.NewResult(c) loginData := new(_LoginForm) if err := c.BodyParser(loginData); err != nil { return result.Error(http.StatusInternalServerError, "表单解析失败。") } var ( session *model.Session err error ) if loginData.Type == model.USER_TYPE_ENT { session, err = service.UserService.ProcessEnterpriseUserLogin(loginData.Username, loginData.Password) } else { session, err = service.UserService.ProcessManagementUserLogin(loginData.Username, loginData.Password) } if err != nil { if authError, ok := err.(*exceptions.AuthenticationError); ok { if authError.NeedReset { return result.LoginNeedReset() } return result.Error(int(authError.Code), authError.Message) } else { return result.Error(http.StatusInternalServerError, err.Error()) } } return result.LoginSuccess(session) } func doLogout(c *fiber.Ctx) error { result := response.NewResult(c) session := c.Locals("session") if session == nil { return result.Success("用户会话已结束。") } _, err := cache.ClearSession(session.(*model.Session).Token) if err != nil { return result.Error(http.StatusInternalServerError, err.Error()) } return result.Success("用户已成功登出系统。") }