Files
2021-11-15 17:32:23 +08:00

88 lines
2.5 KiB
Go

package account
import (
model2 "ArmedPolice/app/common/model"
"ArmedPolice/app/model"
"ArmedPolice/app/service"
"ArmedPolice/config"
"ArmedPolice/utils"
"errors"
)
type Instance struct{ *service.Session }
type InstanceHandle func(session *service.Session) *Instance
type (
InstanceLoginResponse struct {
Token string `json:"token"`
EffectTime int `json:"effect_time"`
WsUrl string `json:"ws_url"`
}
)
func (c *Instance) Login(account, password, captchaKey, captchaValue, ip string) (interface{}, error) {
// 验证验证码
//if pass, _ := handle.NewCaptcha().Validate(&handle.CaptchaImage{Key: captchaKey, Captcha: captchaValue}); !pass {
// return nil, errors.New("验证码错误")
//}
mSysUser := model.NewSysUser()
isExist, err := mSysUser.GetByAccountOrMobile(account)
if err != nil {
return nil, err
} else if !isExist {
return nil, errors.New("操作错误,该帐号信息不存在")
}
if !mSysUser.ValidatePassword(password) {
return nil, errors.New("操作错误,用户名或密码错误")
}
if mSysUser.TenantID > 0 {
mSysTenant := model.NewSysTenant()
var count int64
if err = model2.Count(mSysTenant.SysTenant, &count, model2.NewWhere("id", mSysUser.TenantID)); err != nil {
return nil, err
} else if count <= 0 {
return nil, errors.New("操作错误,当前组织下所有用户已禁止登陆")
}
}
session := service.NewSession()
session.UID = mSysUser.UUID
key := session.UIDToString()
session.Token = utils.JWTEncrypt(config.SettingInfo.TokenEffectTime, map[string]interface{}{
config.TokenForUID: key,
})
session.TenantID = mSysUser.TenantID
session.Name = mSysUser.Name
session.Avatar = mSysUser.Avatar
session.Mobile = mSysUser.Mobile
session.IsAdmin = mSysUser.IsAdminUser()
service.Publish(config.EventForRedisHashProduce, config.RedisKeyForAccount, key, session)
service.Publish(config.EventForAccountLoginProduce, session.TenantID, session.UID, ip)
return &InstanceLoginResponse{Token: session.Token, EffectTime: config.SettingInfo.TokenEffectTime,
WsUrl: config.SystemConfig[config.WsDomain].(string)}, nil
}
// Logout 退出请求
func (c *Instance) Logout() error {
if c.Session != nil && c.UID > 0 {
service.Publish(config.EventForRedisHashDestroy, config.RedisKeyForAccount, utils.UintToString(c.UID))
service.HubMessage.UnregisterHandle(service.NewWebsocket(c.UIDToString(), nil))
}
return nil
}
func NewInstance() InstanceHandle {
return func(session *service.Session) *Instance {
return &Instance{session}
}
}