Просмотр исходного кода

logout should unbind uuid and uid of peer

Tao Chen 1 год назад
Родитель
Сommit
d31d669734
3 измененных файлов с 43 добавлено и 8 удалено
  1. 4 3
      model/userToken.go
  2. 15 0
      service/peer.go
  3. 24 5
      service/user.go

+ 4 - 3
model/userToken.go

@@ -2,9 +2,10 @@ package model
2 2
 
3 3
 type UserToken struct {
4 4
 	IdModel
5
-	UserId    uint   `json:"user_id" gorm:"default:0;not null;index"`
6
-	Token     string `json:"token" gorm:"default:'';not null;index"`
7
-	ExpiredAt int64  `json:"expired_at" gorm:"default:0;not null;"`
5
+	UserId    	uint   `json:"user_id" gorm:"default:0;not null;index"`
6
+	DeviceUuid 	string `json:"device_uuid"`
7
+	Token     	string `json:"token" gorm:"default:'';not null;index"`
8
+	ExpiredAt 	int64  `json:"expired_at" gorm:"default:0;not null;"`
8 9
 	TimeModel
9 10
 }
10 11
 

+ 15 - 0
service/peer.go

@@ -26,6 +26,13 @@ func (ps *PeerService) InfoByRowId(id uint) *model.Peer {
26 26
 	return p
27 27
 }
28 28
 
29
+// FindByUserIdAndUuid 根据用户id和uuid查找peer
30
+func (ps *PeerService) FindByUserIdAndUuid(uuid string,userId uint) *model.Peer {
31
+	p := &model.Peer{}
32
+	global.DB.Where("uuid = ? and user_id = ?", uuid, userId).First(p)
33
+	return p
34
+}
35
+
29 36
 // UuidBindUserId 绑定用户id
30 37
 func (ps *PeerService) UuidBindUserId(uuid string, userId uint) {
31 38
 	peer := ps.FindByUuid(uuid)
@@ -35,6 +42,14 @@ func (ps *PeerService) UuidBindUserId(uuid string, userId uint) {
35 42
 	}
36 43
 }
37 44
 
45
+// UuidUnbindUserId 解绑用户id, 用于用户注销
46
+func (ps *PeerService) UuidUnbindUserId(uuid string, userId uint) {
47
+	peer := ps.FindByUserIdAndUuid(uuid, userId)
48
+	if peer.RowId > 0 {
49
+		global.DB.Model(peer).Update("user_id", 0)
50
+	}
51
+}
52
+
38 53
 // ListByUserIds 根据用户id取列表
39 54
 func (ps *PeerService) ListByUserIds(userIds []uint, page, pageSize uint) (res *model.PeerList) {
40 55
 	res = &model.PeerList{}

+ 24 - 5
service/user.go

@@ -73,9 +73,10 @@ func (us *UserService) GenerateToken(u *model.User) string {
73 73
 func (us *UserService) Login(u *model.User, llog *model.LoginLog) *model.UserToken {
74 74
 	token := us.GenerateToken(u)
75 75
 	ut := &model.UserToken{
76
-		UserId:    u.Id,
77
-		Token:     token,
78
-		ExpiredAt: time.Now().Add(time.Hour * 24 * 7).Unix(),
76
+		UserId:    	u.Id,
77
+		Token:     	token,
78
+		DeviceUuid: llog.Uuid,
79
+		ExpiredAt: 	time.Now().Add(time.Hour * 24 * 7).Unix(),
79 80
 	}
80 81
 	global.DB.Create(ut)
81 82
 	llog.UserTokenId = ut.UserId
@@ -153,9 +154,27 @@ func (us *UserService) Create(u *model.User) error {
153 154
 	return res
154 155
 }
155 156
 
156
-// Logout 退出登录
157
+// GetUuidByToken 根据token和user取uuid
158
+func (us *UserService) GetUuidByToken(u *model.User, token string) string {
159
+	ut := &model.UserToken{}
160
+	err :=global.DB.Where("user_id = ? and token = ?", u.Id, token).First(ut).Error
161
+	if err != nil {
162
+		return ""
163
+	}
164
+	return ut.DeviceUuid
165
+}
166
+
167
+// Logout 退出登录 -> 删除token, 解绑uuid
157 168
 func (us *UserService) Logout(u *model.User, token string) error {
158
-	return global.DB.Where("user_id = ? and token = ?", u.Id, token).Delete(&model.UserToken{}).Error
169
+	uuid := us.GetUuidByToken(u, token)
170
+	err := global.DB.Where("user_id = ? and token = ?", u.Id, token).Delete(&model.UserToken{}).Error
171
+	if err != nil {
172
+		return err
173
+	}
174
+	if uuid != "" {
175
+		AllService.PeerService.UuidUnbindUserId(uuid, u.Id)
176
+	}
177
+	return nil
159 178
 }
160 179
 
161 180
 // Delete 删除用户和oauth信息