From 7d9b1456c4817450a8ec1ab5b3f7de5125be5407 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Sun, 19 Mar 2023 22:39:41 +0800 Subject: [PATCH] finish reset password --- backend/api.go | 34 ++++++++++++- backend/global/user.go | 48 ++++++++++++++++++- backend/register.go | 6 +-- backend/user.go | 11 +++++ frontend/vben/mock/sys/user.ts | 4 +- .../workbench/components/DynamicInfo.vue | 4 +- 6 files changed, 98 insertions(+), 9 deletions(-) diff --git a/backend/api.go b/backend/api.go index 268a4c7..e2cddc6 100644 --- a/backend/api.go +++ b/backend/api.go @@ -106,7 +106,7 @@ func init() { type message struct { M string `json:"msg"` } - writeresult(w, codeSuccess, &message{M: "成功, 请耐心等待通知"}, messageOk, typeSuccess) + writeresult(w, codeSuccess, &message{M: "已上报, 请耐心等待通知"}, messageOk, typeSuccess) }} apimap["/api/getUsersCount"] = &apihandler{"GET", func(w http.ResponseWriter, r *http.Request) { @@ -212,6 +212,38 @@ func init() { writeresult(w, codeSuccess, &message{M: "成功"}, messageOk, typeSuccess) }} + apimap["/api/resetPassword"] = &apihandler{"POST", func(w http.ResponseWriter, r *http.Request) { + type resetpwdbody struct { + Username string `json:"username"` + Mobile string `json:"mobile"` + } + if r.Header.Get("Authorization") != "" { + writeresult(w, codeError, nil, errInvalidToken.Error(), typeError) + return + } + var body resetpwdbody + defer r.Body.Close() + err := json.NewDecoder(r.Body).Decode(&body) + if err != nil { + writeresult(w, codeError, nil, err.Error(), typeError) + return + } + ip := r.RemoteAddr + i := strings.LastIndex(ip, ":") + if i >= 0 { + ip = ip[:i] + } + err = resetPassword(ip, body.Username, body.Mobile) + if err != nil { + writeresult(w, codeError, nil, err.Error(), typeError) + return + } + type message struct { + M string `json:"msg"` + } + writeresult(w, codeSuccess, &message{M: "已上报, 请耐心等待通知"}, messageOk, typeSuccess) + }} + apimap["/api/getMessageList"] = &apihandler{"GET", func(w http.ResponseWriter, r *http.Request) { token := r.Header.Get("Authorization") ret, err := getMessageList(token) diff --git a/backend/global/user.go b/backend/global/user.go index f8eebf9..dfde995 100644 --- a/backend/global/user.go +++ b/backend/global/user.go @@ -67,6 +67,7 @@ var ( ErrEmptyContact = errors.New("empty contact") ErrUsernameExists = errors.New("username exists") ErrInvalidName = errors.New("invalid name") + ErrInvalidContact = errors.New("invalid contact") ) func init() { @@ -367,8 +368,7 @@ func (u *UserDatabase) NotifyRegister(ip, name, cont, pswd string) error { } } - _, err := u.GetUserByName(name) - if err == nil { + if u.IsNameExists(name) { return ErrInvalidName } @@ -396,6 +396,50 @@ func (u *UserDatabase) NotifyRegister(ip, name, cont, pswd string) error { return nil } +// NotifyResetPassword will send notification to all supers +func (u *UserDatabase) NotifyResetPassword(ip, name, cont string) error { + if name == "" { + return ErrEmptyName + } + if cont == "" { + return ErrEmptyContact + } + for _, c := range name { + if !(c >= '0' && c <= '9') && !(c >= 'A' && c <= 'Z') && !(c >= 'a' && c <= 'z') { + return ErrInvalidName + } + } + + user, err := u.GetUserByName(name) + if err != nil { + return err + } + if cont != user.Cont { + return ErrInvalidContact + } + + tos, err := u.GetSuperIDs() + if err != nil { + return err + } + + m := Message{ + Date: time.Now().Unix(), + Text: "收到来自 " + ip + ", 用户名 " + user.Name + " 的重置密码请求, 联系方式: " + user.Cont, + Name: user.Name, + } + u.mu.Lock() + defer u.mu.Unlock() + for _, to := range tos { + m.ToID = to + err = u.db.InsertUnique(UserTableMessage, &m) + if err != nil { + return err + } + } + return nil +} + // notifyUserAdded will send notification to all supers func (u *UserDatabase) notifyUserAdded(opname, name string) error { if opname == "" || name == "" { diff --git a/backend/register.go b/backend/register.go index be209a0..37d9bb6 100644 --- a/backend/register.go +++ b/backend/register.go @@ -11,13 +11,13 @@ import ( var registerlimit = ttl.NewCache[string, bool](time.Minute * 10) var ( - errRegisterTooFast = errors.New("register too fast") - errInvalidIP = errors.New("invalid IP") + errRequestTooFast = errors.New("request too fast") + errInvalidIP = errors.New("invalid IP") ) func register(ip, name, mobile, npwd string) error { if registerlimit.Get(ip) { - return errRegisterTooFast + return errRequestTooFast } if ip == "" { return errInvalidIP diff --git a/backend/user.go b/backend/user.go index 268e33c..8ee442f 100644 --- a/backend/user.go +++ b/backend/user.go @@ -146,3 +146,14 @@ func setUserInfo(id int, nick, desc, avtr *string) error { } return global.UserDB.UpdateUserInfo(id, n, a, d) } + +func resetPassword(ip, name, mobile string) error { + if registerlimit.Get(ip) { + return errRequestTooFast + } + if ip == "" { + return errInvalidIP + } + registerlimit.Set(ip, true) + return global.UserDB.NotifyResetPassword(ip, name, mobile) +} diff --git a/frontend/vben/mock/sys/user.ts b/frontend/vben/mock/sys/user.ts index 60eb203..362c0e6 100644 --- a/frontend/vben/mock/sys/user.ts +++ b/frontend/vben/mock/sys/user.ts @@ -91,7 +91,7 @@ export default [ }, },*/ // mock reset password - { + /*{ url: '/api/resetPassword', timeout: 200, method: 'post', @@ -101,7 +101,7 @@ export default [ msg: '已将用户' + username + '电话' + mobile + '的重置请求上报, 请耐心等待!', }) }, - }, + },*/ // mock register /*{ url: '/api/register', diff --git a/frontend/vben/src/views/dashboard/workbench/components/DynamicInfo.vue b/frontend/vben/src/views/dashboard/workbench/components/DynamicInfo.vue index 057089b..1789833 100644 --- a/frontend/vben/src/views/dashboard/workbench/components/DynamicInfo.vue +++ b/frontend/vben/src/views/dashboard/workbench/components/DynamicInfo.vue @@ -17,7 +17,9 @@ ghost color="success" v-if=" - item.type in [MessageTypeEnum.MessageRegister, MessageTypeEnum.MessageResetPassword] + [MessageTypeEnum.MessageRegister, MessageTypeEnum.MessageResetPassword].includes( + item.type, + ) " >接受