// 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<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;
|
}
|