// CUserManager2Dlg.cpp // #include "stdafx.h" #include "Servo.h" #include "CUserManager2Dlg.h" #include "afxdialogex.h" #include "CUserEdit2Dlg.h" #include "InputDialog.h" #include "resource.h" #include "ToolUnits.h" IMPLEMENT_DYNAMIC(CUserManager2Dlg, CDialogEx) CUserManager2Dlg::CUserManager2Dlg(CWnd* pParent) : CDialogEx(IDD_DIALOG_USER_MANAGER2, pParent) { } CUserManager2Dlg::~CUserManager2Dlg() { } void CUserManager2Dlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST1, m_listUsers); } BEGIN_MESSAGE_MAP(CUserManager2Dlg, CDialogEx) ON_WM_SIZE() ON_BN_CLICKED(IDC_BUTTON_ADD, &CUserManager2Dlg::OnBnClickedButtonAdd) ON_BN_CLICKED(IDC_BUTTON_EDIT, &CUserManager2Dlg::OnBnClickedButtonEdit) ON_BN_CLICKED(IDC_BUTTON_DEL, &CUserManager2Dlg::OnBnClickedButtonDel) ON_BN_CLICKED(IDC_BUTTON_RESET_PWD, &CUserManager2Dlg::OnBnClickedButtonResetPwd) ON_BN_CLICKED(IDC_BUTTON_ENABLE, &CUserManager2Dlg::OnBnClickedButtonEnable) ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, &CUserManager2Dlg::OnLvnItemchangedUsers) END_MESSAGE_MAP() BOOL CUserManager2Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); InitList(); RefreshUserList(); UpdateButtonState(); return TRUE; } void CUserManager2Dlg::OnSize(UINT nType, int cx, int cy) { CDialogEx::OnSize(nType, cx, cy); } void CUserManager2Dlg::InitList() { DWORD dwStyle = m_listUsers.GetExtendedStyle(); m_listUsers.SetExtendedStyle(dwStyle | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); m_listUsers.InsertColumn(0, _T("账号"), LVCFMT_LEFT, 90); m_listUsers.InsertColumn(1, _T("显示名"), LVCFMT_LEFT, 100); m_listUsers.InsertColumn(2, _T("角色"), LVCFMT_LEFT, 80); m_listUsers.InsertColumn(3, _T("级别"), LVCFMT_LEFT, 60); m_listUsers.InsertColumn(4, _T("状态"), LVCFMT_LEFT, 70); } void CUserManager2Dlg::RefreshUserList() { CString selectedName; int currentIndex = GetSelectedIndex(); if (currentIndex >= 0 && currentIndex < static_cast(m_users.size())) { selectedName = m_users[currentIndex].userName.c_str(); } m_users = CUserManager2::getInstance().getUsers(); m_listUsers.DeleteAllItems(); for (size_t i = 0; i < m_users.size(); ++i) { const auto& user = m_users[i]; CString account(user.userName.c_str()); CString display(user.displayName.c_str()); CString role(user.roleName.empty() ? L"-" : user.roleName.c_str()); CString level; level.Format(_T("%d"), user.roleLevel); CString state = user.enabled ? _T("启用") : _T("禁用"); int row = m_listUsers.InsertItem(static_cast(i), account); m_listUsers.SetItemText(row, 1, display); m_listUsers.SetItemText(row, 2, role); m_listUsers.SetItemText(row, 3, level); m_listUsers.SetItemText(row, 4, state); } if (!selectedName.IsEmpty()) { for (int i = 0; i < m_listUsers.GetItemCount(); ++i) { if (selectedName.CompareNoCase(m_listUsers.GetItemText(i, 0)) == 0) { m_listUsers.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED); m_listUsers.EnsureVisible(i, FALSE); break; } } } UpdateButtonState(); } void CUserManager2Dlg::UpdateButtonState() { int index = GetSelectedIndex(); BOOL hasSelection = (index >= 0); auto enable = [&](int id, BOOL enableFlag) { if (CWnd* p = GetDlgItem(id)) { p->EnableWindow(enableFlag); } }; enable(IDC_BUTTON_EDIT, hasSelection); enable(IDC_BUTTON_DEL, hasSelection); enable(IDC_BUTTON_RESET_PWD, hasSelection); enable(IDC_BUTTON_ENABLE, hasSelection); CString toggleText = _T("禁用/启用"); if (const auto* user = GetSelectedUser()) { toggleText = user->enabled ? _T("禁用") : _T("启用"); if (IsCurrentUser(*user)) { enable(IDC_BUTTON_DEL, FALSE); enable(IDC_BUTTON_ENABLE, FALSE); } } SetDlgItemText(IDC_BUTTON_ENABLE, toggleText); } int CUserManager2Dlg::GetSelectedIndex() const { if (!::IsWindow(m_listUsers.GetSafeHwnd())) { return -1; } return m_listUsers.GetNextItem(-1, LVNI_SELECTED); } const CUserManager2::UserInfo* CUserManager2Dlg::GetSelectedUser() const { int index = GetSelectedIndex(); if (index < 0 || index >= static_cast(m_users.size())) { return nullptr; } return &m_users[index]; } std::wstring CUserManager2Dlg::ToWString(const CString& text) const { CString trimmed(text); trimmed.Trim(); std::string str((LPTSTR)(LPCTSTR)trimmed); return CToolUnits::AnsiToWString(str); } void CUserManager2Dlg::ShowErrorMessage(const CString& action, int code) { const wchar_t* detail = UX_ErrorMessage(code); CString msg; msg.Format(_T("%s: %s"), action.GetString(), detail ? detail : L"Unknown"); AfxMessageBox(msg, MB_ICONERROR); } bool CUserManager2Dlg::IsCurrentUser(const CUserManager2::UserInfo& info) const { CString current(CUserManager2::getInstance().getCurrentUserName().c_str()); CString account(info.userName.c_str()); current.Trim(); account.Trim(); return !current.IsEmpty() && current.CompareNoCase(account) == 0; } void CUserManager2Dlg::OnBnClickedButtonAdd() { CUserEdit2Dlg dlg(false, this); if (dlg.DoModal() != IDOK) { return; } CString account = dlg.m_strUsername; account.Trim(); CString display = dlg.m_strDisplayName; display.Trim(); if (display.IsEmpty()) { display = account; } CString role = dlg.m_strRole; role.Trim(); CString password = dlg.m_strPassword; password.Trim(); int rc = CUserManager2::getInstance().addUser(ToWString(account), ToWString(display), ToWString(password), ToWString(role), dlg.m_bEnabled == TRUE); if (rc == UX_OK) { RefreshUserList(); AfxMessageBox(_T("新增用户成功")); } else { ShowErrorMessage(_T("新增用户失败"), rc); } } void CUserManager2Dlg::OnBnClickedButtonEdit() { const auto* user = GetSelectedUser(); if (!user) { AfxMessageBox(_T("请选择用户")); return; } CUserEdit2Dlg dlg(true, this); dlg.m_strUsername = user->userName.c_str(); dlg.m_strDisplayName = user->displayName.c_str(); dlg.m_strRole = user->roleName.c_str(); dlg.m_bEnabled = user->enabled ? TRUE : FALSE; if (dlg.DoModal() != IDOK) { return; } CString display = dlg.m_strDisplayName; display.Trim(); CString password = dlg.m_strPassword; password.Trim(); CString role = dlg.m_strRole; role.Trim(); int rc = CUserManager2::getInstance().updateUser(user->userName, ToWString(display), ToWString(password), ToWString(role), dlg.m_bEnabled == TRUE); if (rc == UX_OK) { RefreshUserList(); AfxMessageBox(_T("保存成功")); } else { ShowErrorMessage(_T("保存失败"), rc); } } void CUserManager2Dlg::OnBnClickedButtonDel() { const auto* user = GetSelectedUser(); if (!user) { AfxMessageBox(_T("请选择用户")); return; } if (IsCurrentUser(*user)) { AfxMessageBox(_T("不能删除当前登录用户")); return; } CString prompt; prompt.Format(_T("确定删除用户 %s ?"), CString(user->userName.c_str())); if (AfxMessageBox(prompt, MB_ICONQUESTION | MB_YESNO) != IDYES) { return; } int rc = CUserManager2::getInstance().deleteUser(user->userName); if (rc == UX_OK) { RefreshUserList(); AfxMessageBox(_T("删除成功")); } else { ShowErrorMessage(_T("删除失败"), rc); } } void CUserManager2Dlg::OnBnClickedButtonResetPwd() { const auto* user = GetSelectedUser(); if (!user) { AfxMessageBox(_T("请选择用户")); return; } CInputDialog dlg(_T("重置密码"), _T("请输入新密码:"), this); if (dlg.DoModal() != IDOK) { return; } CString password = dlg.GetInputText(); password.Trim(); if (password.IsEmpty()) { AfxMessageBox(_T("密码不能为空")); return; } int rc = CUserManager2::getInstance().resetPassword(user->userName, ToWString(password)); if (rc == UX_OK) { AfxMessageBox(_T("密码已重置")); } else { ShowErrorMessage(_T("重置失败"), rc); } } void CUserManager2Dlg::OnBnClickedButtonEnable() { const auto* user = GetSelectedUser(); if (!user) { AfxMessageBox(_T("请选择用户")); return; } bool enable = !user->enabled; int rc = CUserManager2::getInstance().setUserEnabled(user->userName, enable); if (rc == UX_OK) { RefreshUserList(); CString msg = enable ? _T("用户已启用") : _T("用户已禁用"); AfxMessageBox(msg); } else { ShowErrorMessage(_T("操作失败"), rc); } } void CUserManager2Dlg::OnLvnItemchangedUsers(NMHDR* /*pNMHDR*/, LRESULT* pResult) { UpdateButtonState(); *pResult = 0; }