66 "ffly-baisc/internal/model"
77 "ffly-baisc/pkg/auth"
88 "ffly-baisc/pkg/utils"
9+ "fmt"
10+ "time"
911
1012 "gorm.io/gorm"
1113)
@@ -15,7 +17,40 @@ type LoginService struct {
1517 Password string `json:"password" binding:"required,min=6,max=20"`
1618}
1719
20+ // LoginLimiter 用户登录限流(一分钟内最多登录5次)
21+ func LoginLimiter (loginService * LoginService ) (bool , error ) {
22+ // 构造 redis key
23+ key := fmt .Sprintf ("login_attempts:%s" , loginService .Username )
24+
25+ // 使用 Redis 的 INCR 命令增加计数
26+ count , err := db .DB .Redis .Incr (key ).Result ()
27+ if err != nil {
28+ return false , err
29+ }
30+
31+ // 如果是第一次登录,则设置过期时间为 1 分钟
32+ if count == 1 {
33+ db .DB .Redis .Expire (key , time .Minute )
34+ }
35+
36+ // 检查是否超过限制
37+ if count > 5 {
38+ return true , fmt .Errorf ("登录次数过多,请稍后再试" )
39+ }
40+
41+ return false , nil
42+ }
43+
1844func (service * LoginService ) Login () (string , error ) {
45+ // 用户登录限流
46+ isLimit , err := LoginLimiter (service )
47+ if err != nil {
48+ return "" , err
49+ }
50+ if isLimit {
51+ return "" , err
52+ }
53+
1954 // 检查用户名是否存在
2055 var user model.User
2156 if err := db .DB .MySQL .Where ("username = ?" , service .Username ).First (& user ).Error ; err != nil {
@@ -42,43 +77,32 @@ func (service *LoginService) Login() (string, error) {
4277}
4378
4479type RegisterService struct {
45- Username string `json:"username" binding:"required,min=2,max=20"`
46- Password string `json:"password" binding:"required,min=6,max=20"`
47- ConfirmPassword string `json:"confirmPassword" binding:"required,min=6,max=20"`
48- Nickname string `json:"nickname"`
49- Email string `json:"email" binding:"omitempty,email"` // omitempty 允许为空
50- Phone string `json:"phone" binding:"omitempty,e164"` // omitempty 允许为空
80+ Username * string `json:"username" binding:"required,min=2,max=20"`
81+ Password * string `json:"password" binding:"required,min=6,max=20"`
82+ ConfirmPassword * string `json:"confirmPassword" binding:"required,min=6,max=20"`
83+ Nickname * string `json:"nickname"`
84+ Email * string `json:"email" binding:"omitempty,email"` // omitempty 允许为空
85+ Phone * string `json:"phone" binding:"omitempty,e164"` // omitempty 允许为空
5186}
5287
5388func (service * RegisterService ) Register () error {
54- // 检查用户名是否存在
55- var count int64
56- if err := db .DB .MySQL .Model (& model.User {}).Where ("username = ?" , service .Username ).Count (& count ).Error ; err != nil {
57- return err
58- }
59-
60- if count > 0 {
61- return errors .New ("用户名已存在" )
62- }
63-
64- if service .Password != service .ConfirmPassword {
89+ // 密码存在并且检查密码是否一致
90+ if * service .Password != "" && * service .Password != * service .ConfirmPassword {
6591 return errors .New ("两次密码输入不一致" )
6692 }
6793
68- // 加密密码
69- hashedPassword , err := utils .EncodePassword (service .Password )
70- if err != nil {
71- return err
72- }
73-
7494 // 创建用户
75- user := & model.User {
76- Username : & service .Username ,
77- Password : & hashedPassword ,
78- Nickname : & service .Nickname ,
79- Email : & service .Email ,
80- Phone : & service .Phone ,
95+ userCreateRequest := & model.UserCreateRequest {
96+ Username : service .Username ,
97+ Password : service .Password ,
98+ Nickname : service .Nickname ,
99+ Email : service .Email ,
100+ Phone : service .Phone ,
101+ }
102+ var userService UserService
103+ if err := userService .CreateUser (userCreateRequest ); err != nil {
104+ return err
81105 }
82106
83- return db . DB . MySQL . Create ( user ). Error
107+ return nil
84108}
0 commit comments