chenluhua1980
2025-12-10 db9d120efcfe76bb73df089dca8986eca9ee0e6f
SourceCode/Bond/Servo/CUserManager2Dlg.cpp
@@ -1,20 +1,20 @@
// 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()
@@ -24,30 +24,299 @@
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;
}