/* * @desc:登录 * * * @Date: 2022/4/27 21:52 */ package controller import ( "context" "errors" "github.com/gogf/gf/v2/crypto/gmd5" "github.com/gogf/gf/v2/encoding/gjson" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/util/gconv" "github.com/gogf/gf/v2/util/gmode" "log" "tyj_admin/api/v1/system" "tyj_admin/internal/consts" "tyj_admin/internal/model" "tyj_admin/internal/service" "tyj_admin/internal/serviceGame" "tyj_admin/library/libUtils" "tyj_admin/library/liberr" ) var ( Login = loginController{} ) type loginController struct { BaseController } func (c *loginController) Login(ctx context.Context, req *system.UserLoginReq) (res *system.UserLoginRes, err error) { var ( user *model.LoginUserRes token string permissions []string menuList []*model.UserMenus ) ip := libUtils.GetClientIp(ctx) userAgent := libUtils.GetUserAgent(ctx) //判断验证码是否正确 debug := gmode.IsDevelop() if !debug { //if !service.Captcha().VerifyString(req.VerifyKey, req.VerifyCode) { // err = gerror.New("验证码输入错误") // return //} state := serviceGame.GameWhiteList().GetWhiteState(ctx, ip) if consts.White_List_Not_In == state { err = errors.New("ip error") service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{ Status: 0, Username: req.Username, Ip: ip, UserAgent: userAgent, Msg: err.Error(), Module: "系统后台", }) return } } user, err = service.User().GetAdminUserByUsernamePassword(ctx, req) if err != nil { // 保存登录失败的日志信息 service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{ Status: 0, Username: req.Username, Ip: ip, UserAgent: userAgent, Msg: err.Error(), Module: "系统后台", }) return } err = service.User().UpdateLoginInfo(ctx, user.Id, ip) if err != nil { return } // 报存登录成功的日志信息 service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{ Status: 1, Username: req.Username, Ip: ip, UserAgent: userAgent, Msg: "登录成功", Module: "系统后台", }) key := gconv.String(user.Id) + "-" + gmd5.MustEncryptString(user.UserName) + gmd5.MustEncryptString(user.UserPassword) if g.Cfg().MustGet(ctx, "gfToken.multiLogin").Bool() { key = gconv.String(user.Id) + "-" + gmd5.MustEncryptString(user.UserName) + gmd5.MustEncryptString(user.UserPassword+ip+userAgent) } user.UserPassword = "" token, err = service.SysGfToken().GenerateToken(ctx, key, user) if err != nil { return } //获取用户菜单数据 menuList, permissions, err = service.User().GetAdminRules(ctx, user.Id) if err != nil { return } res = &system.UserLoginRes{ UserInfo: user, Token: token, MenuList: menuList, Permissions: permissions, } return } // LoginOut 退出登录 func (c *loginController) LoginOut(ctx context.Context, req *system.UserLoginOutReq) (res *system.UserLoginOutRes, err error) { err = service.SysGfToken().RemoveToken(ctx, service.SysGfToken().GetRequestToken(g.RequestFromCtx(ctx))) return } // LoginMobile 手机登录 func (c *loginController) LoginMobile(ctx context.Context, req *system.UserLoginMobileReq) (res *system.UserLoginMobileRes, err error) { var ( user *model.LoginUserRes token string permissions []string menuList []*model.UserMenus ) //判断验证码是否正确 debug := gmode.IsDevelop() if !debug { //if !service.Captcha().VerifyString(req.VerifyKey, req.VerifyCode) { // err = gerror.New("验证码输入错误") // return //} } ip := libUtils.GetClientIp(ctx) userAgent := libUtils.GetUserAgent(ctx) user, err = service.User().GetAdminUserByPhone(ctx, req) if err != nil { // 保存登录失败的日志信息 service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{ Status: 0, Username: req.Phone, Ip: ip, UserAgent: userAgent, Msg: err.Error(), Module: "系统后台", }) return } err = service.User().UpdateLoginInfo(ctx, user.Id, ip) if err != nil { return } // 报存登录成功的日志信息 service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{ Status: 1, Username: req.Phone, Ip: ip, UserAgent: userAgent, Msg: "登录成功", Module: "系统后台", }) key := gconv.String(user.Id) + "-" + gmd5.MustEncryptString(user.UserName) + gmd5.MustEncryptString(user.UserPassword) if g.Cfg().MustGet(ctx, "gfToken.multiLogin").Bool() { key = gconv.String(user.Id) + "-" + gmd5.MustEncryptString(user.UserName) + gmd5.MustEncryptString(user.UserPassword+ip+userAgent) } user.UserPassword = "" token, err = service.SysGfToken().GenerateToken(ctx, key, user) if err != nil { return } //获取用户菜单数据 menuList, permissions, err = service.User().GetAdminRules(ctx, user.Id) if err != nil { return } res = &system.UserLoginMobileRes{ UserInfo: user, Token: token, MenuList: menuList, Permissions: permissions, } return } // MobileCode 获取验证码 func (c *loginController) MobileCode(ctx context.Context, req *system.MobileCodeReq) (res *system.MobileCodeRes, err error) { log.Println("MobileCode: ", gjson.MustEncodeString(req)) ip := libUtils.GetClientIp(ctx) userAgent := libUtils.GetUserAgent(ctx) user, err := service.User().GetUserByMobile(ctx, req.Phone) if err != nil { // 保存登录失败的日志信息 service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{ Status: 0, Username: req.Phone, Ip: ip, UserAgent: userAgent, Msg: err.Error(), Module: "系统后台", }) return } liberr.ValueIsNil(user, "手机验证码错误") code, err := service.User().GetCodeByMobile(ctx, req.Phone) if err != nil { // 保存登录失败的日志信息 service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{ Status: 0, Username: req.Phone + "_" + code, Ip: ip, UserAgent: userAgent, Msg: err.Error(), Module: "系统后台", }) return } err = service.AliYunSms().Main([]string{req.Phone, code}) if err != nil { // 保存登录失败的日志信息 service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{ Status: 0, Username: req.Phone, Ip: ip, UserAgent: userAgent, Msg: err.Error(), Module: "系统后台", }) return } return } // LoginEmail 邮件登录 func (c *loginController) LoginEmail(ctx context.Context, req *system.UserLoginEmailReq) (res *system.UserLoginEmailRes, err error) { var ( user *model.LoginUserRes token string permissions []string menuList []*model.UserMenus ) //判断验证码是否正确 debug := gmode.IsDevelop() if !debug { //if !service.Captcha().VerifyString(req.VerifyKey, req.VerifyCode) { // err = gerror.New("验证码输入错误") // return //} } ip := libUtils.GetClientIp(ctx) userAgent := libUtils.GetUserAgent(ctx) user, err = service.User().GetAdminUserByEmail(ctx, req) if err != nil { // 保存登录失败的日志信息 service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{ Status: 0, Username: req.Email, Ip: ip, UserAgent: userAgent, Msg: err.Error(), Module: "系统后台", }) return } err = service.User().UpdateLoginInfo(ctx, user.Id, ip) if err != nil { return } // 报存登录成功的日志信息 service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{ Status: 1, Username: req.Email, Ip: ip, UserAgent: userAgent, Msg: "登录成功", Module: "系统后台", }) key := gconv.String(user.Id) + "-" + gmd5.MustEncryptString(user.UserName) + gmd5.MustEncryptString(user.UserPassword) if g.Cfg().MustGet(ctx, "gfToken.multiLogin").Bool() { key = gconv.String(user.Id) + "-" + gmd5.MustEncryptString(user.UserName) + gmd5.MustEncryptString(user.UserPassword+ip+userAgent) } user.UserPassword = "" token, err = service.SysGfToken().GenerateToken(ctx, key, user) if err != nil { return } //获取用户菜单数据 menuList, permissions, err = service.User().GetAdminRules(ctx, user.Id) if err != nil { return } res = &system.UserLoginEmailRes{ UserInfo: user, Token: token, MenuList: menuList, Permissions: permissions, } return } // EmailCode 获取验证码 func (c *loginController) EmailCode(ctx context.Context, req *system.EmailCodeReq) (res *system.EmailCodeRes, err error) { log.Println("EmailCode: ", gjson.MustEncodeString(req)) ip := libUtils.GetClientIp(ctx) userAgent := libUtils.GetUserAgent(ctx) user, err := service.User().GetUserByEmail(ctx, req.Email) if err != nil { // 保存登录失败的日志信息 service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{ Status: 0, Username: req.Email, Ip: ip, UserAgent: userAgent, Msg: err.Error(), Module: "系统后台", }) return } liberr.ValueIsNil(user, "验证码错误") code, err := service.User().GetCodeByEmail(ctx, req.Email) if err != nil { // 保存登录失败的日志信息 service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{ Status: 0, Username: req.Email + "_" + code, Ip: ip, UserAgent: userAgent, Msg: err.Error(), Module: "系统后台", }) return } err = service.Email().SendEmail(req.Email, code) if err != nil { // 保存登录失败的日志信息 service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{ Status: 0, Username: req.Email, Ip: ip, UserAgent: userAgent, Msg: err.Error(), Module: "系统后台", }) return } return }