From a49d54d66c690136fa4d5f468f08344b2227ad7e Mon Sep 17 00:00:00 2001 From: RockYang Date: Mon, 3 Jul 2023 15:18:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=9F=AD=E4=BF=A1=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E7=A0=81=E5=8A=9F=E8=83=BD=E5=B7=B2=E5=AE=8C=E6=88=90=EF=BC=8C?= =?UTF-8?q?=E6=89=8B=E6=9C=BA=E7=AB=AF=E5=90=8C=E6=AD=A5=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/go/core/app_server.go | 2 +- api/go/handler/user_handler.go | 47 ++++++++++++++- api/go/main.go | 1 + web/src/components/BindMobile.vue | 60 +++++++++++++------ web/src/components/ConfigDialog.vue | 5 ++ web/src/components/PasswordDialog.vue | 1 + web/src/components/SendMsg.vue | 2 +- web/src/components/mobile/BindMobile.vue | 76 ++++++++++++++++++++++++ web/src/components/mobile/SendMsg.vue | 62 +++++++++++++++++++ web/src/views/ChatPlus.vue | 16 ++++- web/src/views/Register.vue | 4 +- web/src/views/mobile/ChatList.vue | 8 +++ web/src/views/mobile/Profile.vue | 9 +++ 13 files changed, 267 insertions(+), 26 deletions(-) create mode 100644 web/src/components/mobile/BindMobile.vue create mode 100644 web/src/components/mobile/SendMsg.vue diff --git a/api/go/core/app_server.go b/api/go/core/app_server.go index 32f92477..3af4445e 100644 --- a/api/go/core/app_server.go +++ b/api/go/core/app_server.go @@ -184,7 +184,7 @@ func authorizeMiddleware(s *AppServer) gin.HandlerFunc { } session := sessions.Default(c) var value interface{} - if strings.Contains(c.Request.URL.Path, "/api/admin/") { + if strings.Contains(c.Request.URL.Path, "/api/admin/") { // 后台管理 API value = session.Get(types.SessionAdmin) } else { value = session.Get(types.SessionUser) diff --git a/api/go/handler/user_handler.go b/api/go/handler/user_handler.go index 76199413..0a7be51a 100644 --- a/api/go/handler/user_handler.go +++ b/api/go/handler/user_handler.go @@ -62,8 +62,6 @@ func (h *UserHandler) Register(c *gin.Context) { if err != nil || int(code.(float64)) != data.Code { resp.ERROR(c, "短信验证码错误") return - } else { - _ = h.levelDB.Delete(key) // 删除短信验证码 } // check if the username is exists @@ -117,6 +115,7 @@ func (h *UserHandler) Register(c *gin.Context) { return } + _ = h.levelDB.Delete(key) // 注册成功,删除短信验证码 resp.SUCCESS(c, user) } @@ -230,6 +229,7 @@ type userProfile struct { Id uint `json:"id"` Username string `json:"username"` Nickname string `json:"nickname"` + Mobile string `json:"mobile"` Avatar string `json:"avatar"` ChatConfig types.ChatConfig `json:"chat_config"` Calls int `json:"calls"` @@ -334,3 +334,46 @@ func (h *UserHandler) Password(c *gin.Context) { resp.SUCCESS(c) } + +// BindMobile 绑定手机号 +func (h *UserHandler) BindMobile(c *gin.Context) { + var data struct { + Mobile string `json:"mobile"` + Code int `json:"code"` + } + if err := c.ShouldBindJSON(&data); err != nil { + resp.ERROR(c, types.InvalidArgs) + return + } + + // 检查手机号是否被其他账号绑定 + var item model.User + res := h.db.Where("mobile = ?", data.Mobile).First(&item) + if res.Error == nil { + resp.ERROR(c, "该手机号已经被其他账号绑定") + return + } + + // 检查验证码 + key := CodeStorePrefix + data.Mobile + code, err := h.levelDB.Get(key) + if err != nil || int(code.(float64)) != data.Code { + resp.ERROR(c, "短信验证码错误") + return + } + + user, err := utils.GetLoginUser(c, h.db) + if err != nil { + resp.NotAuth(c) + return + } + + res = h.db.Model(&user).UpdateColumn("mobile", data.Mobile) + if res.Error != nil { + resp.ERROR(c, "更新数据库失败") + return + } + + _ = h.levelDB.Delete(key) // 删除短信验证码 + resp.SUCCESS(c) +} diff --git a/api/go/main.go b/api/go/main.go index af4041b7..25dca9e4 100644 --- a/api/go/main.go +++ b/api/go/main.go @@ -129,6 +129,7 @@ func main() { group.GET("profile", h.Profile) group.POST("profile/update", h.ProfileUpdate) group.POST("password", h.Password) + group.POST("bind/mobile", h.BindMobile) }), fx.Invoke(func(s *core.AppServer, h *handler.ChatHandler) { group := s.Engine.Group("/api/chat/") diff --git a/web/src/components/BindMobile.vue b/web/src/components/BindMobile.vue index 5ad077a6..26a6eb4c 100644 --- a/web/src/components/BindMobile.vue +++ b/web/src/components/BindMobile.vue @@ -2,24 +2,28 @@ -
+
+ +

当前用户已绑定手机号:{{ mobile }}, 绑定其他手机号之后自动解绑该手机号。

+
+ - + - + - + -
@@ -35,31 +39,51 @@ diff --git a/web/src/components/ConfigDialog.vue b/web/src/components/ConfigDialog.vue index 8de7c8e3..aec6c846 100644 --- a/web/src/components/ConfigDialog.vue +++ b/web/src/components/ConfigDialog.vue @@ -28,6 +28,10 @@ + + + + @@ -96,6 +100,7 @@ const form = ref({ username: '', nickname: '', avatar: '', + mobile: '', calls: 0, tokens: 0, chat_configs: {} diff --git a/web/src/components/PasswordDialog.vue b/web/src/components/PasswordDialog.vue index 7b20e0d3..7b92a15a 100644 --- a/web/src/components/PasswordDialog.vue +++ b/web/src/components/PasswordDialog.vue @@ -55,6 +55,7 @@ const save = function () { ElMessage.success({ message: '更新成功', appendTo: '#password-form', + duration: 1000, onClose: () => emits('logout', false) }) }).catch((e) => { diff --git a/web/src/components/SendMsg.vue b/web/src/components/SendMsg.vue index 20e2d7ed..7abb5b8b 100644 --- a/web/src/components/SendMsg.vue +++ b/web/src/components/SendMsg.vue @@ -1,5 +1,5 @@ @@ -74,6 +77,7 @@ import {checkSession} from "@/action/session"; import router from "@/router"; import {setChatConfig} from "@/store/chat"; import {removeArrayItem} from "@/utils/libs"; +import BindMobile from "@/components/mobile/BindMobile.vue"; const title = ref("会话列表") const chatName = ref("") @@ -88,10 +92,14 @@ const roles = ref([]) const models = ref([]) const showPicker = ref(false) const columns = ref([roles.value, models.value]) +const showBindMobileDialog = ref(false) checkSession().then((user) => { loginUser.value = user isLogin.value = true + if (user.mobile === '') { + showBindMobileDialog.value = true + } // 加载角色列表 httpGet(`/api/role/list?user_id=${user.id}`).then((res) => { if (res.data) { diff --git a/web/src/views/mobile/Profile.vue b/web/src/views/mobile/Profile.vue index 800ec24d..b33f9fac 100644 --- a/web/src/views/mobile/Profile.vue +++ b/web/src/views/mobile/Profile.vue @@ -13,6 +13,14 @@ disabled placeholder="用户名" /> +