Files

167 lines
5.3 KiB
Go
Raw Normal View History

2022-01-04 15:04:37 +08:00
package controller
2022-01-05 11:29:27 +08:00
import (
"SciencesServer/app/api/admin/model"
model2 "SciencesServer/app/common/model"
"SciencesServer/app/handle"
"SciencesServer/app/service"
"SciencesServer/app/session"
"SciencesServer/config"
"SciencesServer/utils"
"errors"
"fmt"
)
type Account struct {
session *session.Admin
tenantID uint64
}
type AccountHandle func(session *session.Admin, tenantID uint64) *Account
type (
2022-03-05 15:31:22 +08:00
// loginHandleReturn 登陆操作返回信息
loginHandleReturn struct {
*model.SysUser
TenantID uint64 `json:"tenant_id"`
TenantIdentity model2.SysUserTenantIdentity
}
2022-01-05 11:29:27 +08:00
// AccountLoginParams 登陆参数
AccountLoginParams struct {
Account, Password, Captcha string
}
// AccountLoginResponse 登陆响应
AccountLoginResponse struct {
Token string `json:"token"`
EffectTime int `json:"effect_time"`
}
)
// loginHandle 登陆操作1账户密码登陆2短信验证登陆
2022-03-05 15:31:22 +08:00
var loginHandle = map[int]func(params *AccountLoginParams, tenantID uint64) (*loginHandleReturn, error){
2022-01-05 11:29:27 +08:00
1: loginForPassword, 2: loginForSmsCaptcha,
}
// loginForPassword 密码登陆
2022-03-05 15:31:22 +08:00
func loginForPassword(params *AccountLoginParams, tenantID uint64) (*loginHandleReturn, error) {
2022-01-05 11:29:27 +08:00
if params.Password == "" {
return nil, errors.New("操作错误,密码不可为空")
}
mSysUser := model.NewSysUser()
isExist, err := mSysUser.GetByAccountOrMobile(params.Account, tenantID)
if err != nil {
return nil, err
} else if !isExist {
return nil, errors.New("操作错误,当前帐号信息不存在或已被删除")
}
if !mSysUser.ValidatePassword(params.Password) {
return nil, errors.New("操作错误,用户名或密码错误")
}
2022-03-05 15:31:22 +08:00
out := &loginHandleReturn{SysUser: mSysUser, TenantIdentity: 0}
if !mSysUser.IsAdminUser() {
// 查询用户租户信息
mSysUserTenant := model.NewSysUserTenant()
if isExist, err = model2.FirstField(mSysUserTenant.SysUserTenant, []string{"id", "tenant_id", "identity"},
model2.NewWhere("uid", mSysUser.UUID),
model2.NewWhere("tenant_id", tenantID)); err != nil {
return nil, err
} else if !isExist {
return nil, errors.New("操作错误,无权限登陆此后台,请联系管理员")
}
out.TenantID = tenantID
out.TenantIdentity = mSysUserTenant.Identity
}
return out, nil
2022-01-05 11:29:27 +08:00
}
// loginForSmsCaptcha 短信验证码登陆
2022-03-05 15:31:22 +08:00
func loginForSmsCaptcha(params *AccountLoginParams, tenantID uint64) (*loginHandleReturn, error) {
2022-01-05 11:29:27 +08:00
if params.Password == "" {
return nil, errors.New("操作错误,验证码不可为空")
}
// 验证验证码
if pass, _ := handle.NewCaptcha().Validate(&handle.CaptchaSms{Mobile: params.Account, Captcha: params.Captcha}); !pass {
return nil, errors.New("操作错误,验证码错误")
}
mSysUser := model.NewSysUser()
isExist, err := model2.FirstField(mSysUser.SysUser, []string{
2022-03-05 15:31:22 +08:00
"id", "uuid", "name", "mobile", "is_admin", "status",
}, model2.NewWhere("mobile", params.Account))
2022-01-05 11:29:27 +08:00
if err != nil {
return nil, err
} else if !isExist {
return nil, errors.New("操作错误,当前帐号信息不存在或已被删除")
}
2022-03-05 15:31:22 +08:00
out := &loginHandleReturn{SysUser: mSysUser, TenantIdentity: 0}
if !mSysUser.IsAdminUser() {
// 查询用户租户信息
mSysUserTenant := model.NewSysUserTenant()
if isExist, err = model2.FirstField(mSysUserTenant.SysUserTenant, []string{"id", "tenant_id", "identity"},
model2.NewWhere("uid", mSysUser.UUID),
model2.NewWhere("tenant_id", tenantID)); err != nil {
return nil, err
} else if !isExist {
return nil, errors.New("操作错误,无权限登陆此后台,请联系管理员")
}
out.TenantID = tenantID
out.TenantIdentity = mSysUserTenant.Identity
}
return out, nil
2022-01-05 11:29:27 +08:00
}
// Login 登录请求
func (c *Account) Login(mode int, params *AccountLoginParams, equipment, ip string) (*AccountLoginResponse, error) {
_handle, has := loginHandle[mode]
if !has {
return nil, errors.New("操作错误,未知的登陆模式")
}
data, err := _handle(params, c.tenantID)
if err != nil {
return nil, err
} else if data.Status != model2.SysUserStatusForNormal {
return nil, errors.New(fmt.Sprintf("操作错误,当前账号【%s】状态异常已禁止登陆请联系管理员", data.Name))
}
_session := session.NewAdmin()
_session.UID = data.UUID
_session.TenantID = data.TenantID
_session.Name = data.Name
_session.Mobile = data.Mobile
_session.IsAdmin = data.IsAdminUser()
2022-03-05 15:31:22 +08:00
_session.IsSystemAdmin = data.TenantIdentity == model2.SysUserTenantIdentityForSystemAdmin
2022-01-05 11:29:27 +08:00
_uid := data.UUIDString()
2022-01-17 09:57:57 +08:00
_session.Token = utils.JWTEncrypt(utils.StringToInt(config.SystemConfig[config.SysTokenEffectTime]),
map[string]interface{}{config.TokenForUID: _uid})
2022-01-05 11:29:27 +08:00
service.Publish(config.EventForRedisHashProduce, config.RedisKeyForAccountAdmin, _uid, _session)
2022-01-05 18:40:08 +08:00
service.Publish(config.EventForAccountLoginProduce, data.TenantID, data.ID, equipment, ip)
2022-01-05 11:29:27 +08:00
2022-01-17 09:57:57 +08:00
return &AccountLoginResponse{Token: _session.Token, EffectTime: utils.StringToInt(config.SystemConfig[config.SysTokenEffectTime])}, nil
2022-01-05 11:29:27 +08:00
}
// Logout 退出请求
func (c *Account) Logout() error {
if c.session != nil && c.session.UID > 0 {
service.Publish(config.EventForRedisHashDestroy, config.RedisKeyForAccountAdmin, utils.UintToString(c.session.UID))
}
return nil
}
func NewAccount() AccountHandle {
return func(session *session.Admin, tenantID uint64) *Account {
return &Account{session: session, tenantID: tenantID}
}
}