From 753509e9105964c567503c6c48c68b6cbcd003a5 Mon Sep 17 00:00:00 2001 From: smail Date: Sat, 26 Sep 2026 12:09:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=96=B0=E5=A2=9E=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7=E5=AE=89=E5=85=A8=E9=85=8D=E7=BD=AE=E5=90=8E=E7=9A=84?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/controllers/user.go | 16 +++++++--- .../UserManagement/UserManagement.js | 32 ++++++++++++++++--- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/backend/controllers/user.go b/backend/controllers/user.go index b2e39ec3..d0377d21 100644 --- a/backend/controllers/user.go +++ b/backend/controllers/user.go @@ -150,14 +150,17 @@ func CreateUser(ctx *context.Context, w http.ResponseWriter, req *http.Request) writeAccountGroupError(w, err) return } - response.NewSuccessResponse(struct { - models.User - GroupIDs []int - MembershipVersion int - }{user, groupIDs, user.SecurityVersion}).FPrint(w) + response.NewSuccessResponse(userListItem{ + ID: user.ID, Account: user.Account, Name: user.Name, + Disabled: user.Disabled, Role: user.EffectiveRole(), IsAdmin: user.IsAdmin, + GroupIDs: groupIDs, MembershipVersion: user.SecurityVersion, + MustChangePassword: user.MustChangePassword, + ExternalEmailEnabled: user.ExternalEmailEnabled == 1, + }).FPrint(w) } type userListRequest struct { + UserID int `json:"user_id"` GroupID *int `json:"group_id"` CurrentPage int `json:"current_page"` PageSize int `json:"page_size"` @@ -231,6 +234,9 @@ func UserList(ctx *context.Context, w http.ResponseWriter, req *http.Request) { query := db.Instance.Table(&models.User{}) defer query.Close() accountgroup.ApplyScope(query, ctx.UserID, ctx.EffectiveRole()) + if reqData.UserID != 0 { + query.And("id = ?", reqData.UserID) + } if reqData.GroupID != nil { groups, err := accountgroup.VisibleGroups(db.Instance, ctx.UserID, ctx.EffectiveRole()) if err != nil { diff --git a/frontend/src/views/components/UserManagement/UserManagement.js b/frontend/src/views/components/UserManagement/UserManagement.js index 2cc1ff16..e4b4ff0e 100644 --- a/frontend/src/views/components/UserManagement/UserManagement.js +++ b/frontend/src/views/components/UserManagement/UserManagement.js @@ -130,10 +130,30 @@ export function usePage() { const title = ref(lang.editUser) const reflushList = async function () { + const selectedID = selectedUser.value?.ID await groups.refreshGroups() - if (selectedUser.value?.ID) { + if (selectedID && selectedUser.value?.ID === selectedID) { const users = groups.accountGroups.value.flatMap(group => group.rows) - selectedUser.value = users.find(item => item.ID === selectedUser.value.ID) || selectedUser.value + let current = users.find(item => item.ID === selectedID) + if (!current) { + const response = await http.post('/api/v1/user/list', { user_id: selectedID, page_size: 1 }) + if (response?.errorNo !== 0) throw new Error(response?.errorMsg || lang.fail) + current = response.data?.list?.find(item => item.ID === selectedID) + } + if (selectedUser.value?.ID !== selectedID) return + if (!current) { + selectedUser.value = null + userInfoDialog.value = false + return + } + const savedGroups = selectedUser.value.GroupIDs || [0] + const currentGroups = current.GroupIDs || [0] + if (current.Role === selectedUser.value.Role + && currentGroups.length === savedGroups.length + && savedGroups.every(id => currentGroups.includes(id))) { + editingMembershipVersion.value = current.MembershipVersion + } + selectedUser.value = current } } @@ -199,8 +219,12 @@ export function usePage() { externalEmailDialogVisible.value = true } - const handleSecurityChanged = function () { - reflushList() + const handleSecurityChanged = async function () { + try { + await reflushList() + } catch (error) { + ElNotification({ title: lang.fail, message: error?.message || lang.fail, type: 'error' }) + } } const submit = async function () {