Skip to content

Commit 9615264

Browse files
committed
feat:Add token when login and get current user
1 parent 988b8ab commit 9615264

File tree

13 files changed

+136
-16
lines changed

13 files changed

+136
-16
lines changed

api/entrance.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ func AppRun() {
4040
// user.Use()
4141
user.POST("/register", guest.RegisterByEmail)
4242
user.POST("/login", guest.Login)
43+
user.GET("/currentUser", guest.GetCurrentUser)
4344

4445
user.POST("/topic", guest.PostArticle)
4546
user.GET("/topics", guest.GetArticleList)

api/guest/users.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,15 @@ import (
44
"fmt"
55

66
"github.com/gin-gonic/gin"
7+
"github.com/nk-akun/NeighborBBS/model"
78
"github.com/nk-akun/NeighborBBS/service"
89
)
910

11+
// GetCurrentUser ...
12+
func GetCurrentUser(c *gin.Context) {
13+
service.UserService.GetCurrentUser(c)
14+
}
15+
1016
// RegisterByEmail ...
1117
func RegisterByEmail(c *gin.Context) {
1218
user, err := service.UserService.SignUp(c)
@@ -23,7 +29,9 @@ func Login(c *gin.Context) {
2329
if err != nil {
2430
setAPIResponse(c, nil, err.Error(), false)
2531
} else {
26-
setAPIResponse(c, user, "登录成功", true)
32+
token := service.UserService.SetToken(user.ID)
33+
value := model.NewResponseValue().Set("token", token).Set("user", user)
34+
setAPIResponse(c, value, "登录成功", true)
2735
}
2836
}
2937

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ require (
1212
github.com/mitchellh/mapstructure v1.3.3 // indirect
1313
github.com/natefinch/lumberjack v2.0.0+incompatible
1414
github.com/pelletier/go-toml v1.8.1 // indirect
15+
github.com/satori/go.uuid v1.2.0 // indirect
1516
github.com/spf13/afero v1.4.0 // indirect
1617
github.com/spf13/cast v1.3.1 // indirect
1718
github.com/spf13/jwalterweatherman v1.1.0 // indirect

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,8 @@ github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40T
199199
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
200200
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
201201
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
202+
github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
203+
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
202204
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
203205
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
204206
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=

model/constant.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,6 @@ const (
88
CTXAPIResponseValue = "api_response_value"
99
CTXAPIResponseMessage = "api_response_message"
1010
CTXAPIResponseSuccess = "api_response_success"
11+
12+
TokenExpireDays = 2
1113
)

model/model.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,15 @@ type User struct {
3333
DeleteTime int64 `gorm:"column:delete_time;default:null" json:"delete_time"`
3434
}
3535

36+
// UserToken stores user's token
37+
type UserToken struct {
38+
Model
39+
UserID int64 `gorm:"column:user_id;type:int" json:"user_id"`
40+
Token string `gorm:"size:32;unique;not null" json:"token"`
41+
ExpiredAt int64 `gorm:"column:expired_at;type:int" json:"expired_at"`
42+
CreateTime int64 `gorm:"column:create_time;default:null" json:"create_time"`
43+
}
44+
3645
// Article stores article infomation
3746
type Article struct {
3847
Model

model/response.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,21 @@ type CommentInfo struct {
6969
LikeCount int `json:"like_count"`
7070
CreateTime int64 `json:"create_time"`
7171
}
72+
73+
// ResponseValue ...
74+
type ResponseValue struct {
75+
Value map[string]interface{}
76+
}
77+
78+
// NewResponseValue ...
79+
func NewResponseValue() *ResponseValue {
80+
return &ResponseValue{
81+
Value: make(map[string]interface{}),
82+
}
83+
}
84+
85+
// Set set data into ResponseValue
86+
func (r *ResponseValue) Set(name string, data interface{}) *ResponseValue {
87+
r.Value[name] = data
88+
return r
89+
}

repository/token_repo.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package repository
2+
3+
import (
4+
"github.com/nk-akun/NeighborBBS/logs"
5+
"github.com/nk-akun/NeighborBBS/model"
6+
"gorm.io/gorm"
7+
)
8+
9+
type userTokenRepository struct {
10+
}
11+
12+
// UserTokenRepository is the entrance as a convenient interface
13+
var UserTokenRepository = newUserTokenRepository()
14+
15+
func newUserTokenRepository() *userTokenRepository {
16+
return new(userTokenRepository)
17+
}
18+
19+
func (r *userTokenRepository) Create(db *gorm.DB, userToken *model.UserToken) error {
20+
return db.Create(userToken).Error
21+
}
22+
23+
func (r *userTokenRepository) GetUserIDByToken(db *gorm.DB, token string) (*model.UserToken, error) {
24+
return r.take(db, "token = ?", token)
25+
}
26+
27+
func (r *userTokenRepository) take(db *gorm.DB, column string, value interface{}) (*model.UserToken, error) {
28+
result := &model.UserToken{}
29+
// err := db.Where(column, value).Take(result).Error
30+
err := db.Where(column, value).Find(&result).Error
31+
if err != nil {
32+
logs.Logger.Errorf("query db error:", err)
33+
return nil, err
34+
}
35+
return result, nil
36+
}

service/users.go

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ package service
22

33
import (
44
"errors"
5+
"time"
56

67
"github.com/gin-gonic/gin"
78
"github.com/nk-akun/NeighborBBS/logs"
89
"github.com/nk-akun/NeighborBBS/model"
910
"github.com/nk-akun/NeighborBBS/repository"
1011
"github.com/nk-akun/NeighborBBS/util"
12+
uuid "github.com/satori/go.uuid"
1113
"golang.org/x/crypto/bcrypt"
1214
)
1315

@@ -21,6 +23,30 @@ func newUserService() *userService {
2123
return new(userService)
2224
}
2325

26+
// GetCurrentUser ...
27+
func (s *userService) GetCurrentUser(c *gin.Context) *model.User {
28+
token := s.GetToken(c)
29+
userToken, err := repository.UserTokenRepository.GetUserIDByToken(util.DB(), token)
30+
if err != nil {
31+
logs.Logger.Errorf("数据库查询token出错")
32+
return nil
33+
}
34+
if userToken == nil || userToken.ExpiredAt < util.NowTimestamp() { // 不存在或者过期了
35+
return nil
36+
}
37+
user, err := repository.UserRepository.GetUserByUserID(util.DB(), userToken.UserID)
38+
if err != nil {
39+
logs.Logger.Errorf("数据库查询user出错")
40+
return nil
41+
}
42+
return user
43+
}
44+
45+
func (s *userService) GetToken(c *gin.Context) string {
46+
token := c.GetHeader("X-User-Token")
47+
return token
48+
}
49+
2450
func (s *userService) SignUp(c *gin.Context) (*model.User, error) {
2551
req := getReqFromContext(c).(*model.RegisterRequest)
2652

@@ -80,7 +106,7 @@ func (s *userService) SignUp(c *gin.Context) (*model.User, error) {
80106
// })
81107
}
82108

83-
func (s *userService) Login(c *gin.Context) (*model.User, error) {
109+
func (s *userService) Login(c *gin.Context) (user *model.User, err error) {
84110
req := getReqFromContext(c).(*model.LoginRequest)
85111
if req.Email == "" && req.Username == "" || req.Email != "" && req.Username != "" {
86112
return nil, errors.New("请使用用户名或邮箱二者之一登录")
@@ -89,7 +115,6 @@ func (s *userService) Login(c *gin.Context) (*model.User, error) {
89115
return s.loginByEmail(req.Email, req.Password)
90116
}
91117
return s.loginByUsername(req.Username, req.Password)
92-
93118
}
94119

95120
func (s *userService) loginByEmail(email string, password string) (*model.User, error) {
@@ -113,3 +138,16 @@ func (s *userService) loginByUsername(username string, password string) (*model.
113138
}
114139
return user, nil
115140
}
141+
142+
func (s *userService) SetToken(userID int64) string {
143+
token := uuid.NewV4().String()
144+
expireTime := time.Now().Add(time.Hour * 24 * time.Duration(model.TokenExpireDays))
145+
userToken := &model.UserToken{
146+
UserID: userID,
147+
Token: token,
148+
ExpiredAt: util.Timestamp(expireTime),
149+
CreateTime: util.NowTimestamp(),
150+
}
151+
repository.UserTokenRepository.Create(util.DB(), userToken)
152+
return token
153+
}

site/assets/images/logo.png

217 KB
Loading

0 commit comments

Comments
 (0)