diff --git a/model/userToken.go b/model/userToken.go index f80c4f0..a359eef 100644 --- a/model/userToken.go +++ b/model/userToken.go @@ -2,9 +2,10 @@ package model type UserToken struct { IdModel - UserId uint `json:"user_id" gorm:"default:0;not null;index"` - Token string `json:"token" gorm:"default:'';not null;index"` - ExpiredAt int64 `json:"expired_at" gorm:"default:0;not null;"` + UserId uint `json:"user_id" gorm:"default:0;not null;index"` + DeviceUuid string `json:"device_uuid"` + Token string `json:"token" gorm:"default:'';not null;index"` + ExpiredAt int64 `json:"expired_at" gorm:"default:0;not null;"` TimeModel } diff --git a/service/peer.go b/service/peer.go index 483e128..d64eb99 100644 --- a/service/peer.go +++ b/service/peer.go @@ -26,6 +26,13 @@ func (ps *PeerService) InfoByRowId(id uint) *model.Peer { return p } +// FindByUserIdAndUuid 根据用户id和uuid查找peer +func (ps *PeerService) FindByUserIdAndUuid(uuid string,userId uint) *model.Peer { + p := &model.Peer{} + global.DB.Where("uuid = ? and user_id = ?", uuid, userId).First(p) + return p +} + // UuidBindUserId 绑定用户id func (ps *PeerService) UuidBindUserId(uuid string, userId uint) { peer := ps.FindByUuid(uuid) @@ -35,6 +42,14 @@ func (ps *PeerService) UuidBindUserId(uuid string, userId uint) { } } +// UuidUnbindUserId 解绑用户id, 用于用户注销 +func (ps *PeerService) UuidUnbindUserId(uuid string, userId uint) { + peer := ps.FindByUserIdAndUuid(uuid, userId) + if peer.RowId > 0 { + global.DB.Model(peer).Update("user_id", 0) + } +} + // ListByUserIds 根据用户id取列表 func (ps *PeerService) ListByUserIds(userIds []uint, page, pageSize uint) (res *model.PeerList) { res = &model.PeerList{} diff --git a/service/user.go b/service/user.go index 5e50af5..c7f29ce 100644 --- a/service/user.go +++ b/service/user.go @@ -73,9 +73,10 @@ func (us *UserService) GenerateToken(u *model.User) string { func (us *UserService) Login(u *model.User, llog *model.LoginLog) *model.UserToken { token := us.GenerateToken(u) ut := &model.UserToken{ - UserId: u.Id, - Token: token, - ExpiredAt: time.Now().Add(time.Hour * 24 * 7).Unix(), + UserId: u.Id, + Token: token, + DeviceUuid: llog.Uuid, + ExpiredAt: time.Now().Add(time.Hour * 24 * 7).Unix(), } global.DB.Create(ut) llog.UserTokenId = ut.UserId @@ -153,9 +154,27 @@ func (us *UserService) Create(u *model.User) error { return res } -// Logout 退出登录 +// GetUuidByToken 根据token和user取uuid +func (us *UserService) GetUuidByToken(u *model.User, token string) string { + ut := &model.UserToken{} + err :=global.DB.Where("user_id = ? and token = ?", u.Id, token).First(ut).Error + if err != nil { + return "" + } + return ut.DeviceUuid +} + +// Logout 退出登录 -> 删除token, 解绑uuid func (us *UserService) Logout(u *model.User, token string) error { - return global.DB.Where("user_id = ? and token = ?", u.Id, token).Delete(&model.UserToken{}).Error + uuid := us.GetUuidByToken(u, token) + err := global.DB.Where("user_id = ? and token = ?", u.Id, token).Delete(&model.UserToken{}).Error + if err != nil { + return err + } + if uuid != "" { + AllService.PeerService.UuidUnbindUserId(uuid, u.Id) + } + return nil } // Delete 删除用户和oauth信息