| | |
| | | // CUserManager2Dlg.cpp: 实现文件 |
| | | // CUserManager2Dlg.cpp |
| | | // |
| | | |
| | | #include "stdafx.h" |
| | | #include "Servo.h" |
| | | #include "CUserManager2Dlg.h" |
| | | #include "afxdialogex.h" |
| | | |
| | | |
| | | // CUserManager2Dlg 对话框 |
| | | #include "CUserEdit2Dlg.h" |
| | | #include "InputDialog.h" |
| | | #include "resource.h" |
| | | #include "ToolUnits.h" |
| | | |
| | | IMPLEMENT_DYNAMIC(CUserManager2Dlg, CDialogEx) |
| | | |
| | | CUserManager2Dlg::CUserManager2Dlg(CWnd* pParent /*=nullptr*/) |
| | | 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() |
| | | |
| | | |
| | | // CUserManager2Dlg 消息处理程序 |
| | | |
| | | |
| | | BOOL CUserManager2Dlg::OnInitDialog() |
| | | { |
| | | CDialogEx::OnInitDialog(); |
| | | |
| | | // TODO: 在此添加额外的初始化 |
| | | InitList(); |
| | | RefreshUserList(); |
| | | UpdateButtonState(); |
| | | |
| | | return TRUE; // return TRUE unless you set the focus to a control |
| | | // 异常: OCX 属性页应返回 FALSE |
| | | return TRUE; |
| | | } |
| | | |
| | | void CUserManager2Dlg::OnSize(UINT nType, int cx, int cy) |
| | | { |
| | | CDialogEx::OnSize(nType, cx, cy); |
| | | } |
| | | |
| | | // TODO: 在此处添加消息处理程序代码 |
| | | 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<int>(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<int>(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<int>(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; |
| | | } |