You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
396 lines
11 KiB
396 lines
11 KiB
/* |
|
* @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 { |
|
// 保存登录失败的日志信息 |
|
service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{ |
|
Status: 0, |
|
Username: req.Username, |
|
Ip: ip, |
|
UserAgent: userAgent, |
|
Msg: err.Error(), |
|
Module: "系统后台", |
|
}) |
|
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 { |
|
// 保存登录失败的日志信息 |
|
service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{ |
|
Status: 0, |
|
Username: req.Phone, |
|
Ip: ip, |
|
UserAgent: userAgent, |
|
Msg: err.Error(), |
|
Module: "系统后台", |
|
}) |
|
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, |
|
Ip: ip, |
|
UserAgent: userAgent, |
|
Msg: err.Error(), |
|
Module: "系统后台", |
|
}) |
|
return |
|
} |
|
err = service.TencentSms().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 |
|
} |
|
service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{ |
|
Status: 0, |
|
Username: req.Phone, |
|
Ip: ip, |
|
UserAgent: userAgent, |
|
Msg: "获取验证码成功!" + "_" + code, |
|
Module: "系统后台", |
|
}) |
|
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 { |
|
// 保存登录失败的日志信息 |
|
service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{ |
|
Status: 0, |
|
Username: req.Email, |
|
Ip: ip, |
|
UserAgent: userAgent, |
|
Msg: err.Error(), |
|
Module: "系统后台", |
|
}) |
|
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, |
|
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 |
|
} |
|
|
|
service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{ |
|
Status: 0, |
|
Username: req.Email, |
|
Ip: ip, |
|
UserAgent: userAgent, |
|
Msg: "获取验证码成功!" + "_" + code, |
|
Module: "系统后台", |
|
}) |
|
return |
|
}
|
|
|