feat: allow admins to bind member phone numbers

Members page previously only displayed phone status; add bind/replace UI and admin member update phone support for login and sync identity.
This commit is contained in:
whm
2026-08-05 14:41:27 +08:00
parent cb56e6847e
commit 3c9fe46359
4 changed files with 119 additions and 9 deletions

View File

@@ -2,12 +2,14 @@ package handler
import (
"encoding/json"
"fmt"
"net/http"
"strconv"
"aijianzhan/platform/internal/authx"
"aijianzhan/platform/internal/logic/applogic"
"aijianzhan/platform/internal/svc"
"aijianzhan/platform/internal/userstore"
"github.com/zeromicro/go-zero/rest/httpx"
"github.com/zeromicro/go-zero/rest/pathvar"
@@ -293,23 +295,43 @@ func memberUpdateHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
id, _ := strconv.ParseInt(pathvar.Vars(r)["id"], 10, 64)
var body struct {
Role string `json:"role"`
OrgUnitID int64 `json:"org_unit_id"`
Status string `json:"status"`
Role string `json:"role"`
OrgUnitID int64 `json:"org_unit_id"`
Status string `json:"status"`
Phone *string `json:"phone"` // 传则绑定/更换;传 "" 解绑
}
if err := json.NewDecoder(r.Body).Decode(&body); err != nil {
authx.WriteError(w, http.StatusBadRequest, err.Error())
return
}
l := applogic.NewMemberLogic(applogic.NewAuthLogic(r.Context(), svcCtx))
u, err := l.Update(id, body.Role, body.OrgUnitID, body.Status)
if err != nil {
authx.WriteError(w, http.StatusBadRequest, err.Error())
var u *userstore.User
var err error
if body.Phone != nil {
u, err = l.SetPhone(id, *body.Phone)
if err != nil {
authx.WriteError(w, http.StatusBadRequest, err.Error())
return
}
_ = svcCtx.Audit.Log(r.Context(), authx.TenantID(r.Context()), authx.UserID(r.Context()),
"member.bind_phone", fmt.Sprintf("成员 #%d phone=%s", id, u.Phone))
}
// 仅改手机时不必强制带 role/status若其它字段有值则再 Update
if body.Role != "" || body.Status != "" || body.OrgUnitID != 0 || body.Phone == nil {
u, err = l.Update(id, body.Role, body.OrgUnitID, body.Status)
if err != nil {
authx.WriteError(w, http.StatusBadRequest, err.Error())
return
}
}
if u == nil {
authx.WriteError(w, http.StatusBadRequest, "nothing to update")
return
}
httpx.OkJson(w, map[string]any{
"user_id": u.UserID,
"username": u.Username,
"phone": u.Phone,
"display_name": u.DisplayName,
"role": u.Role,
"org_unit_id": u.OrgUnitID,