Files
2022-01-17 09:57:57 +08:00

127 lines
3.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package controller
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 (
// AccountLoginParams 登陆参数
AccountLoginParams struct {
Account, Password, Captcha string
}
// AccountLoginResponse 登陆响应
AccountLoginResponse struct {
Token string `json:"token"`
EffectTime int `json:"effect_time"`
}
)
// loginHandle 登陆操作1账户密码登陆2短信验证登陆
var loginHandle = map[int]func(params *AccountLoginParams, tenantID uint64) (*model.SysUser, error){
1: loginForPassword, 2: loginForSmsCaptcha,
}
// loginForPassword 密码登陆
func loginForPassword(params *AccountLoginParams, tenantID uint64) (*model.SysUser, error) {
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("操作错误,用户名或密码错误")
}
return mSysUser, nil
}
// loginForSmsCaptcha 短信验证码登陆
func loginForSmsCaptcha(params *AccountLoginParams, tenantID uint64) (*model.SysUser, error) {
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{
"id", "uuid", "tenant_id", "name", "mobile", "is_admin", "status",
}, model2.NewWhere("tenant_id", tenantID), model2.NewWhere("mobile", params.Account))
if err != nil {
return nil, err
} else if !isExist {
return nil, errors.New("操作错误,当前帐号信息不存在或已被删除")
}
return mSysUser, nil
}
// 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()
_uid := data.UUIDString()
_session.Token = utils.JWTEncrypt(utils.StringToInt(config.SystemConfig[config.SysTokenEffectTime]),
map[string]interface{}{config.TokenForUID: _uid})
service.Publish(config.EventForRedisHashProduce, config.RedisKeyForAccountAdmin, _uid, _session)
service.Publish(config.EventForAccountLoginProduce, data.TenantID, data.ID, equipment, ip)
return &AccountLoginResponse{Token: _session.Token, EffectTime: utils.StringToInt(config.SystemConfig[config.SysTokenEffectTime])}, nil
}
// 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}
}
}