Files
2021-11-02 17:01:04 +08:00

84 lines
2.3 KiB
Go

package account
import (
model2 "ArmedPolice/app/common/model"
"ArmedPolice/app/handle"
"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"`
}
)
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.Token = utils.JWTEncrypt(config.SettingInfo.TokenEffectTime, map[string]interface{}{
config.TokenForUID: mSysUser.UUID,
})
session.UID = mSysUser.UUID
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, session.UIDToString(), session)
service.Publish(config.EventForAccountLoginProduce, session.TenantID, session.UID, ip)
return &InstanceLoginResponse{Token: session.Token, EffectTime: config.SettingInfo.TokenEffectTime}, nil
}
// Logout 退出请求
func (c *Instance) Logout() error {
if c.UID > 0 {
service.Publish(config.EventForRedisHashDestroy, config.RedisKeyForAccount, utils.UintToString(c.UID))
}
return nil
}
func NewInstance() InstanceHandle {
return func(session *service.Session) *Instance {
return &Instance{session}
}
}