Skip to content

Commit e32e75b

Browse files
committed
chore: add code
1 parent 4876729 commit e32e75b

File tree

11 files changed

+412
-32
lines changed

11 files changed

+412
-32
lines changed

go.mod

+22-13
Original file line numberDiff line numberDiff line change
@@ -3,41 +3,50 @@ module github.com/1024casts/fastim
33
go 1.13
44

55
require (
6-
github.com/1024casts/snake v1.2.1
6+
github.com/1024casts/snake v1.2.2
77
github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a // indirect
88
github.com/fsnotify/fsnotify v1.4.9
99
github.com/gin-contrib/pprof v1.3.0
1010
github.com/gin-gonic/gin v1.6.3
1111
github.com/go-openapi/spec v0.19.9 // indirect
1212
github.com/go-openapi/swag v0.19.9 // indirect
13-
github.com/go-playground/validator/v10 v10.3.0 // indirect
13+
github.com/go-playground/validator/v10 v10.4.0 // indirect
1414
github.com/go-redis/redis v6.15.9+incompatible
15+
github.com/golang/snappy v0.0.2 // indirect
1516
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99 // indirect
1617
github.com/google/uuid v1.1.2 // indirect
1718
github.com/jinzhu/gorm v1.9.16
19+
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible // indirect
1820
github.com/lestrrat-go/strftime v1.0.3 // indirect
1921
github.com/lexkong/log v0.0.0-20180607165131-972f9cd951fc
20-
github.com/magiconair/properties v1.8.2 // indirect
22+
github.com/magiconair/properties v1.8.4 // indirect
2123
github.com/mailru/easyjson v0.7.6 // indirect
2224
github.com/mitchellh/mapstructure v1.3.3 // indirect
23-
github.com/pelletier/go-toml v1.8.0 // indirect
25+
github.com/pelletier/go-toml v1.8.1 // indirect
2426
github.com/pkg/errors v0.9.1
25-
github.com/prometheus/common v0.13.0 // indirect
26-
github.com/qiniu/api.v7 v7.2.5+incompatible
27-
github.com/spf13/afero v1.3.4 // indirect
27+
github.com/prometheus/common v0.14.0 // indirect
28+
github.com/prometheus/procfs v0.2.0 // indirect
29+
github.com/qiniu/api.v7 v0.0.0-20190520053455-bea02cd22bf4
30+
github.com/qiniu/api.v7/v7 v7.4.1
31+
github.com/spf13/afero v1.4.0 // indirect
2832
github.com/spf13/jwalterweatherman v1.1.0 // indirect
29-
github.com/spf13/pflag v1.0.5 // indirect
33+
github.com/spf13/pflag v1.0.5
3034
github.com/spf13/viper v1.7.1
3135
github.com/swaggo/gin-swagger v1.2.0
3236
github.com/swaggo/swag v1.6.7 // indirect
3337
github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf
38+
github.com/ugorji/go v1.1.9 // indirect
3439
github.com/willf/pad v0.0.0-20200313202418-172aa767f2a4 // indirect
3540
github.com/yuin/gopher-lua v0.0.0-20200816102855-ee81675732da // indirect
36-
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a // indirect
37-
golang.org/x/net v0.0.0-20200822124328-c89045814202 // indirect
38-
golang.org/x/sys v0.0.0-20200828194041-157a740278f4 // indirect
39-
golang.org/x/tools v0.0.0-20200828161849-5deb26317202 // indirect
41+
go.uber.org/multierr v1.6.0 // indirect
42+
go.uber.org/zap v1.16.0 // indirect
43+
golang.org/x/crypto v0.0.0-20200930160638-afb6bcd081ae // indirect
44+
golang.org/x/net v0.0.0-20200930145003-4acb6c075d10 // indirect
45+
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f // indirect
46+
golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c // indirect
4047
google.golang.org/appengine v1.6.6 // indirect
48+
google.golang.org/genproto v0.0.0-20200930140634-01fc692af84b // indirect
49+
google.golang.org/grpc v1.32.0 // indirect
4150
google.golang.org/protobuf v1.25.0 // indirect
42-
gopkg.in/ini.v1 v1.60.2 // indirect
51+
gopkg.in/ini.v1 v1.61.0 // indirect
4352
)

handler/v1/user/login.go

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package user
2+
3+
import (
4+
"github.com/1024casts/fastim/handler"
5+
"github.com/1024casts/fastim/internal/model"
6+
"github.com/1024casts/fastim/internal/service"
7+
"github.com/1024casts/fastim/pkg/errno"
8+
"github.com/gin-gonic/gin"
9+
"github.com/lexkong/log"
10+
)
11+
12+
// PhoneLogin 手机登录接口
13+
// @Summary 用户登录接口
14+
// @Description 仅限手机登录
15+
// @Tags 用户
16+
// @Produce json
17+
// @Param req body PhoneLoginCredentials true "phone"
18+
// @Success 200 {string} json "{"code":0,"message":"OK","data":{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6Ik"}}"
19+
// @Router /users/login [post]
20+
func PhoneLogin(c *gin.Context) {
21+
log.Info("Phone Login function called.")
22+
23+
// Binding the data with the u struct.
24+
var req PhoneLoginCredentials
25+
if err := c.Bind(&req); err != nil {
26+
log.Warnf("phone login bind param err: %v", err)
27+
handler.SendResponse(c, errno.ErrBind, nil)
28+
return
29+
}
30+
31+
log.Infof("req %#v", req)
32+
// check param
33+
if req.Phone == 0 || req.VerifyCode == 0 {
34+
log.Warn("phone login bind param is empty")
35+
handler.SendResponse(c, errno.ErrParam, nil)
36+
return
37+
}
38+
39+
// 验证校验码
40+
if !service.VCodeService.CheckLoginVCode(req.Phone, req.VerifyCode) {
41+
handler.SendResponse(c, errno.ErrVerifyCode, nil)
42+
return
43+
}
44+
45+
// 登录
46+
t, err := service.UserSvc.PhoneLogin(c, req.Phone, req.VerifyCode)
47+
if err != nil {
48+
handler.SendResponse(c, errno.ErrVerifyCode, nil)
49+
return
50+
}
51+
52+
handler.SendResponse(c, nil, model.Token{
53+
Token: t,
54+
})
55+
}

handler/v1/user/user.go

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package user
2+
3+
import (
4+
"github.com/1024casts/fastim/internal/model"
5+
)
6+
7+
// CreateRequest 创建用户请求
8+
type CreateRequest struct {
9+
Username string `json:"username"`
10+
Password string `json:"password"`
11+
}
12+
13+
// CreateResponse 创建用户响应
14+
type CreateResponse struct {
15+
Username string `json:"username"`
16+
}
17+
18+
// RegisterRequest 注册
19+
type RegisterRequest struct {
20+
Username string `json:"username" form:"username"`
21+
Email string `json:"email" form:"email"`
22+
Password string `json:"password" form:"password"`
23+
ConfirmPassword string `json:"confirm_password" form:"confirm_password"`
24+
}
25+
26+
// LoginCredentials 默认登录方式-邮箱
27+
type LoginCredentials struct {
28+
Email string `json:"email" form:"email"`
29+
Password string `json:"password" form:"password"`
30+
}
31+
32+
// PhoneLoginCredentials 手机登录
33+
type PhoneLoginCredentials struct {
34+
Phone int64 `json:"phone" form:"phone" binding:"required" example:"13010002000"`
35+
VerifyCode int `json:"verify_code" form:"verify_code" binding:"required" example:"120110"`
36+
}
37+
38+
// UpdateRequest 更新请求
39+
type UpdateRequest struct {
40+
Avatar string `json:"avatar"`
41+
Sex int `json:"sex"`
42+
}
43+
44+
// FollowRequest 关注请求
45+
type FollowRequest struct {
46+
UserID uint64 `json:"user_id"`
47+
}
48+
49+
// ListResponse 通用列表resp
50+
type ListResponse struct {
51+
TotalCount uint64 `json:"total_count"`
52+
HasMore int `json:"has_more"`
53+
PageKey string `json:"page_key"`
54+
PageValue int `json:"page_value"`
55+
Items interface{} `json:"items"`
56+
}
57+
58+
// SwaggerListResponse 文档
59+
type SwaggerListResponse struct {
60+
TotalCount uint64 `json:"totalCount"`
61+
UserList []model.UserInfo `json:"userList"`
62+
}

internal/dao/user_dao.go

+18-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
package dao
22

3-
import "github.com/1024casts/fastim/internal/model"
3+
import (
4+
"context"
5+
6+
"github.com/1024casts/fastim/internal/model"
7+
"github.com/pkg/errors"
8+
)
49

510
type UserDao interface {
611
CreateUser(user model.UserBaseModel) (id uint64, err error)
712
GetUserById(id uint64) (*model.UserBaseModel, error)
813
GetUsersByIds(ids []uint64) ([]*model.UserBaseModel, error)
14+
GetUserByPhone(ctx context.Context, phone int64) (*model.UserBaseModel, error)
915
}
1016

1117
type userDao struct{}
@@ -38,3 +44,14 @@ func (repo *userDao) GetUsersByIds(ids []uint64) ([]*model.UserBaseModel, error)
3844

3945
return users, result.Error
4046
}
47+
48+
// GetUserByPhone 根据手机号获取用户
49+
func (repo *userDao) GetUserByPhone(ctx context.Context, phone int64) (*model.UserBaseModel, error) {
50+
user := model.UserBaseModel{}
51+
err := model.DB.Where("phone = ?", phone).First(&user).Error
52+
if err != nil {
53+
return nil, errors.Wrap(err, "[user_repo] get user err by phone")
54+
}
55+
56+
return &user, nil
57+
}

internal/idl/user.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package idl
22

33
import (
4-
"github.com/1024casts/banhui/model"
5-
"github.com/1024casts/banhui/util"
4+
"github.com/1024casts/fastim/internal/model"
5+
"github.com/1024casts/fastim/pkg/utils"
66
)
77

88
type TransUserInput struct {
9-
CurUser *model.UserModel
10-
User *model.UserModel
9+
CurUser *model.UserBaseModel
10+
User *model.UserBaseModel
1111
Point int
1212
ActivityCount int
1313
IsFollow int
@@ -21,14 +21,14 @@ func TransUser(input *TransUserInput) *model.UserInfo {
2121
user := input.User
2222

2323
avatar := ""
24-
if user != nil && user.Id > 0 {
24+
if user != nil && user.ID > 0 {
2525
avatar = user.Avatar
2626
}
2727

2828
return &model.UserInfo{
29-
Id: user.Id,
29+
Id: user.ID,
3030
Username: user.Username,
31-
Avatar: util.GetAvatarUrl(avatar),
31+
Avatar: utils.GetAvatarUrl(avatar),
3232
Sex: user.Sex,
3333
PostCount: user.PostCount,
3434
CommentCount: user.CommentCount,

internal/model/user_base.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77

88
type UserBaseModel struct {
99
BaseModel
10-
Phone int `gorm:"column:phone" json:"phone"`
10+
Phone int64 `gorm:"column:phone" json:"phone"`
1111
Username string `gorm:"column:username" json:"username"`
1212
Avatar string `gorm:"column:avatar" json:"avatar"`
1313
Password string `gorm:"column:password" json:"password"`
@@ -56,3 +56,8 @@ type UserList struct {
5656
Lock *sync.Mutex
5757
IdMap map[uint64]*UserInfo
5858
}
59+
60+
// Token represents a JSON web token.
61+
type Token struct {
62+
Token string `json:"token"`
63+
}

internal/service/sms_service.go

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package service
2+
3+
import (
4+
"github.com/pkg/errors"
5+
"github.com/qiniu/api.v7/v7/auth"
6+
"github.com/qiniu/api.v7/v7/sms"
7+
"github.com/spf13/viper"
8+
)
9+
10+
// ServiceSms 短信服务
11+
// 使用七牛云
12+
// 直接初始化,可以避免在使用时再实例化
13+
var ServiceSms = NewSmsService()
14+
15+
// ISmsService 短信服务接口定义
16+
type ISmsService interface {
17+
Send(phoneNumber string, verifyCode int) error
18+
_sendViaQiNiu(phoneNumber string, verifyCode int) error
19+
}
20+
21+
// smsService 校验码服务,生成校验码和获得校验码
22+
type smsService struct{}
23+
24+
// NewSmsService 实例化一个sms
25+
func NewSmsService() ISmsService {
26+
return &smsService{}
27+
}
28+
29+
// Send 发送短信
30+
func (srv *smsService) Send(phoneNumber string, verifyCode int) error {
31+
// 校验参数的正确性
32+
if phoneNumber == "" || verifyCode == 0 {
33+
return errors.New("param phone or verify_code error")
34+
}
35+
36+
// 调用第三方发送服务
37+
return srv._sendViaQiNiu(phoneNumber, verifyCode)
38+
}
39+
40+
// _sendViaQiNiu 调用七牛短信服务
41+
func (srv *smsService) _sendViaQiNiu(phoneNumber string, verifyCode int) error {
42+
accessKey := viper.GetString("qiniu.access_key")
43+
secretKey := viper.GetString("qiniu.secret_key")
44+
45+
mac := auth.New(accessKey, secretKey)
46+
manager := sms.NewManager(mac)
47+
48+
args := sms.MessagesRequest{
49+
SignatureID: viper.GetString("qiniu.signature_id"),
50+
TemplateID: viper.GetString("qiniu.template_id"),
51+
Mobiles: []string{phoneNumber},
52+
Parameters: map[string]interface{}{
53+
"code": verifyCode,
54+
},
55+
}
56+
57+
ret, err := manager.SendMessage(args)
58+
if err != nil {
59+
return errors.Wrap(err, "send sms message error")
60+
}
61+
62+
if len(ret.JobID) == 0 {
63+
return errors.New("send sms message job id error")
64+
}
65+
66+
return nil
67+
}

0 commit comments

Comments
 (0)