|
|
|
/*
|
|
|
|
* @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 + "_" + 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 {
|
|
|
|
// 保存登录失败的日志信息
|
|
|
|
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 + "_" + 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
|
|
|
|
}
|