From d380fc3f9c5e1b763f097c5b62e3d47ffb26fe9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8B=97=E5=B8=A6=E9=81=93=E9=95=BF?= Date: Sun, 13 Jul 2025 01:57:02 +0800 Subject: [PATCH 1/3] =?UTF-8?q?[=E4=BC=98=E5=8C=96]=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=B3=A8=E5=86=8C=E5=92=8C=E5=AE=A1=E6=89=B9?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 添加用户注册中心相关文件。 2. 在 `main.cpp` 中更新启动界面逻辑。 3. 在 `data_UserControl.cpp` 和 `data_UserControl.h` 中添加用户检查相关功能。 4. 更新 `CheckNewUser` 界面及其逻辑。 --- CMakeLists.txt | 3 + main.cpp | 9 +- module/data/data_UserControl.cpp | 128 +++++++ module/data/data_UserControl.h | 11 + .../equipmentclassmanagehomepage.cpp | 3 +- view/RegisterCenter/checknewuser.cpp | 79 +++- view/RegisterCenter/checknewuser.h | 12 + view/RegisterCenter/checknewuser.ui | 357 +++++++++++++++++- view/RegisterCenter/checkuserblock.cpp | 18 + view/RegisterCenter/checkuserblock.h | 32 ++ view/RegisterCenter/checkuserblock.ui | 109 ++++++ 11 files changed, 734 insertions(+), 27 deletions(-) create mode 100644 view/RegisterCenter/checkuserblock.cpp create mode 100644 view/RegisterCenter/checkuserblock.h create mode 100644 view/RegisterCenter/checkuserblock.ui diff --git a/CMakeLists.txt b/CMakeLists.txt index 0ccb80b..9ad82cf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -138,6 +138,9 @@ set(SHARED_SOURCES view/SplashScreen/splashscreen.cpp view/SplashScreen/splashscreen.h view/SplashScreen/splashscreen.ui + view/RegisterCenter/checkuserblock.cpp + view/RegisterCenter/checkuserblock.h + view/RegisterCenter/checkuserblock.ui ) list(REMOVE_DUPLICATES SHARED_SOURCES) diff --git a/main.cpp b/main.cpp index 825eecf..f969482 100644 --- a/main.cpp +++ b/main.cpp @@ -19,6 +19,7 @@ #include "view/loginPage/registerpage.h" #include "view/messageCenter/messagewindow.h" #include "view/equipmentManage/equipment_home.h" +#include "view/RegisterCenter/checknewuser.h" #include "view/SplashScreen/splashscreen.h" void setup_tasks() { @@ -32,8 +33,8 @@ void setup_tasks() { int main(int argc, char *argv[]) { QApplication a(argc, argv); - view::SplashScreen::SplashScreen splash; - splash.show(); + //view::SplashScreen::SplashScreen splash; + //splash.show(); service::logger::instance().setLogFile( @@ -54,9 +55,9 @@ int main(int argc, char *argv[]) { // log(LogLevel::ERR) << "无法加载样式表文件: " << styleFile.fileName(); // } - view::EquipmentClass::EquipmentClassManageHomepage b; + view::RegisterCenter::CheckNewUser b; b.show(); - splash.close(); + //splash.close(); setup_tasks(); service::taskManager::getTimer().startAll(); diff --git a/module/data/data_UserControl.cpp b/module/data/data_UserControl.cpp index 420ad06..5c99f19 100644 --- a/module/data/data_UserControl.cpp +++ b/module/data/data_UserControl.cpp @@ -79,6 +79,12 @@ namespace data::UserControl { QString storedPassword = row["password"].toString(); QString status = row["status"].toString(); + bool issys = permission::isUserInGroup(userId, "System"); + if (issys) { + log(service::LogLevel::ERR) << "登录失败。用户属于系统: " << idNumber; + return std::unexpected(UserControlError::UserNotFound); + } + if (status != "AllRight") { log(service::LogLevel::ERR) << "登录失败。用户状态异常: " << idNumber << " status: " << status; return std::unexpected(UserControlError::UserNotFound); @@ -493,4 +499,126 @@ namespace data::UserControl { return groupsMap; } } + namespace check { + QList getAllUserId(int page, int pageSize) { + service::DatabaseManager db(service::Path::user()); + QString query = R"( + SELECT id FROM users WHERE status != 'Deleted' AND id NOT LIKE '-%' + ORDER BY created_at DESC + LIMIT ? OFFSET ? + )"; + QVariantList params; + params << pageSize << (page - 1) * pageSize; + + auto results = db.executePreparedQueryAndFetchAll(query, params); + QList userIds; + for (const auto &row: results) { + userIds.append(row["id"].toInt()); + } + return userIds; + } + + QList getUncheckedUserId(int page, int pageSize) { + service::DatabaseManager db(service::Path::user()); + QString query = R"( + SELECT id FROM users WHERE status == 'Unchecked' AND id NOT LIKE '-%' + ORDER BY created_at DESC + LIMIT ? OFFSET ? + )"; + int offset = (page - 1) * pageSize; + auto results = db.executePreparedQueryAndFetchAll(query, {pageSize, offset}); + QList userIds; + for (const auto &row: results) { + userIds.append(row["id"].toInt()); + } + return userIds; + } + + QList getAllUserId() { + service::DatabaseManager db(service::Path::user()); + QString query = R"( + SELECT id FROM users WHERE status != 'Deleted' AND id NOT LIKE '-%' + )"; + auto results = db.executePreparedQueryAndFetchAll(query, {}); + QList userIds; + for (const auto &row: results) { + userIds.append(row["id"].toInt()); + } + return userIds; + } + + QList getUncheckedUserId() { + service::DatabaseManager db(service::Path::user()); + QString query = R"( + SELECT id FROM users WHERE status == 'Unchecked' AND id NOT LIKE '-%' + )"; + auto results = db.executePreparedQueryAndFetchAll(query, {}); + QList userIds; + for (const auto &row: results) { + userIds.append(row["id"].toInt()); + } + return userIds; + } + + int getUncheckedUserCount() { + service::DatabaseManager db(service::Path::user()); + QString query = R"( + SELECT COUNT(*) as count FROM users WHERE status == 'Unchecked' + )"; + auto results = db.executePreparedQueryAndFetchAll(query, {}); + + if (!results.isEmpty()) { + return results.first()["count"].toInt(); + } + + return 0; + } + + int getAllUserCount() { + service::DatabaseManager db(service::Path::user()); + QString query = R"( + SELECT COUNT(*) as count FROM users WHERE status != 'Deleted' + )"; + auto results = db.executePreparedQueryAndFetchAll(query, {}); + + if (!results.isEmpty()) { + return results.first()["count"].toInt(); + } + + return 0; + } + + bool allowUserRegister(int userId) { + service::DatabaseManager db(service::Path::user()); + QString query = R"( + UPDATE users SET status = 'AllRight' WHERE id = ? AND status = 'Unchecked' + )"; + if (!db.executePreparedNonQuery(query, {userId})) { + return false; + } + return true; + } + + bool banUser(int userId) { + service::DatabaseManager db(service::Path::user()); + QString query = R"( + UPDATE users SET status = 'Banned' WHERE id = ? + )"; + if (!db.executePreparedNonQuery(query, {userId})) { + return false; + } + return true; + } + + bool unbanUser(int userId) { + service::DatabaseManager db(service::Path::user()); + QString query = R"( + UPDATE users SET status = 'AllRight' WHERE id = ? AND status = 'Banned' + )"; + if (!db.executePreparedNonQuery(query, {userId})) { + return false; + } + return true; + } + } } diff --git a/module/data/data_UserControl.h b/module/data/data_UserControl.h index ae69c76..1dc45c6 100644 --- a/module/data/data_UserControl.h +++ b/module/data/data_UserControl.h @@ -270,6 +270,17 @@ namespace data::UserControl { QMap loadUsersMap(); QMap loadGroupsMap(); } + namespace check { + QList getAllUserId(int page = 1, int itemsPerPage = 10); + QList getUncheckedUserId(int page = 1, int itemsPerPage = 10); + QList getAllUserId(); + QList getUncheckedUserId(); + int getUncheckedUserCount(); + int getAllUserCount(); + bool allowUserRegister(int userId); + bool banUser(int userId); + bool unbanUser(int userId); + } } diff --git a/view/EquipmentClass/equipmentclassmanagehomepage.cpp b/view/EquipmentClass/equipmentclassmanagehomepage.cpp index 98b3901..0e7308b 100644 --- a/view/EquipmentClass/equipmentclassmanagehomepage.cpp +++ b/view/EquipmentClass/equipmentclassmanagehomepage.cpp @@ -31,8 +31,6 @@ EquipmentClassManageHomepage::~EquipmentClassManageHomepage() { } void EquipmentClassManageHomepage::initializeUI() { - // 假设你的.ui文件中QScrollArea内的QWidget的objectName是scrollAreaWidgetContents - // 这与MessageWindow中的messageBoxAreaItem是类似作用 auto *layout = new QVBoxLayout(ui->scrollAreaWidgetContents); layout->setSpacing(5); layout->setAlignment(Qt::AlignTop); @@ -92,6 +90,7 @@ void EquipmentClassManageHomepage::on_addButton_clicked() { } void EquipmentClassManageHomepage::on_refreshButton_clicked() { + m_totalPages = data::UserControl::check::getAllUserCount() / m_itemsPerPage + 1; loadEquipmentClasses(); } diff --git a/view/RegisterCenter/checknewuser.cpp b/view/RegisterCenter/checknewuser.cpp index eb71853..5913c17 100644 --- a/view/RegisterCenter/checknewuser.cpp +++ b/view/RegisterCenter/checknewuser.cpp @@ -5,15 +5,90 @@ // You may need to build the project (run Qt uic code generator) to get "ui_CheckNewUser.h" resolved #include "checknewuser.h" + +#include "checkuserblock.h" #include "ui_CheckNewUser.h" namespace view::RegisterCenter { CheckNewUser::CheckNewUser(QWidget *parent) : - QWidget(parent), ui(new Ui::CheckNewUser) { + QWidget(parent), ui(new Ui::CheckNewUser), + m_currentPage(1),m_itemsPerPage(10),m_totalPages(){ ui->setupUi(this); + + // --- 分页逻辑初始化 --- + m_currentPage = 1; + // 从数据层获取总页数 + m_totalPages = data::UserControl::check::getAllUserCount() / m_itemsPerPage + 1; + + loadDataFromDatabase(m_currentPage); } CheckNewUser::~CheckNewUser() { delete ui; } -} // view::RegisterCenter + +void CheckNewUser::loadDataFromDatabase(int page) { + // 从数据库获取设备分类数据 + auto records = data::UserControl::check::getAllUserId(page, m_itemsPerPage); + + ui->scrollAreaWidgetContents->setUpdatesEnabled(false); + + auto *layout = qobject_cast(ui->scrollAreaWidgetContents->layout()); + if (!layout) { + layout = new QVBoxLayout(ui->scrollAreaWidgetContents); + layout->setSpacing(5); + layout->setAlignment(Qt::AlignTop); + layout = qobject_cast(ui->scrollAreaWidgetContents->layout()); + } + + // 清除现有的消息块 + QLayoutItem *child; + while ((child = layout->takeAt(0)) != nullptr) { + delete child->widget(); + delete child; + } + + // 为每个设备分类记录创建信息块 + for (const auto &record : records) { + auto *block = new CheckUserBlock(); // 创建信息块实例 + layout->addWidget(block); + } + + // 加载完数据后更新分页控件 + ui->scrollAreaWidgetContents->setUpdatesEnabled(true); + updatePaginationControls(); + ui->label_num->setNum(data::UserControl::check::getAllUserCount()); + ui->label_num_2->setNum(data::UserControl::check::getUncheckedUserCount()); +} + +void CheckNewUser::updatePaginationControls() { + if (m_totalPages == 0) { + ui->pageLabel->setText("0 / 0"); + ui->prevButton->setEnabled(false); + ui->nextButton->setEnabled(false); + return; + } +} + + void CheckNewUser::on_prevButton_clicked() { + if (m_currentPage > 1) { + m_currentPage--; + loadDataFromDatabase(m_currentPage); + } + } + + void CheckNewUser::on_nextButton_clicked() { + if (m_currentPage < m_totalPages) { + m_currentPage++; + loadDataFromDatabase(m_currentPage); + } + } + + void CheckNewUser::on_addButton_clicked() { + } + + void CheckNewUser::on_refreshButton_clicked() { + m_totalPages = data::UserControl::check::getAllUserCount() / m_itemsPerPage + 1; + loadDataFromDatabase(); + } +} diff --git a/view/RegisterCenter/checknewuser.h b/view/RegisterCenter/checknewuser.h index 6ba46b8..892dfe9 100644 --- a/view/RegisterCenter/checknewuser.h +++ b/view/RegisterCenter/checknewuser.h @@ -18,9 +18,21 @@ Q_OBJECT public: explicit CheckNewUser(QWidget *parent = nullptr); ~CheckNewUser() override; + void loadDataFromDatabase(int page=1); +private: + void updatePaginationControls(); + +private slots: + void on_prevButton_clicked(); + void on_nextButton_clicked(); + void on_addButton_clicked(); + void on_refreshButton_clicked(); private: Ui::CheckNewUser *ui; + int m_currentPage; + int m_totalPages; + const int m_itemsPerPage = 10; }; } // view::RegisterCenter diff --git a/view/RegisterCenter/checknewuser.ui b/view/RegisterCenter/checknewuser.ui index d009612..02d362b 100644 --- a/view/RegisterCenter/checknewuser.ui +++ b/view/RegisterCenter/checknewuser.ui @@ -6,60 +6,379 @@ 0 0 - 400 - 476 + 555 + 687 CheckNewUser + + /* ---- 整体页面背景 ---- */ +QWidget#view--EquipmentClass--EquipmentClassManageHomepage { + background-color: #FAFAFA; /* 使用一个非常柔和的灰白色作为背景 */ +} + +/* ---- 全局标签和标题 ---- */ +QLabel { + background-color: transparent; + color: #1F1F1F; + font-family: "Segoe UI Variable", "Microsoft YaHei UI"; +} + +/* 主标题,增加一些底部间距 */ +QLabel#label_Title { + padding-bottom: 10px; +} + + +/* ---- 信息卡片 ---- */ + +/* 中间层(frame_2)增加淡色背景、圆角和内边距 */ +QFrame#frame_2 { + background-color: #F6F6F6; /* 一个非常非常淡的灰色 */ + border: none; + border-radius: 8px; /* 圆角比内层卡片稍大,形成包裹感 */ + padding: 2px; /* 关键:增加一点内边距,让背景色能露出来 */ +} + +/* 将卡片样式应用到最内层的 frame_4 */ +QFrame#frame_4,QFrame#frame_5 { + background-color: #FFFFFF; + border: 1px solid #E5E5E5; /* 微妙的边框,增加立体感 */ + border-radius: 6px; + padding: 10px; +} + + +/* ---- 操作栏 (新建、翻页) ---- */ +QFrame#frame_3 { + background-color: transparent; + border: none; + padding-top: 5px; + padding-bottom: 5px; +} + + + +QPushButton#pushButton:hover { + background-color: #1185E5; +} +QPushButton#pushButton:pressed { + background-color: #006ABC; +} + + +/* ---- 翻页按钮 (次要操作按钮) ---- */ +QPushButton#prevButton, QPushButton#nextButton { + background-color: transparent; + color: #3B3B3B; + border: 0px solid #E5E5E5; + border-radius: 4px; + font-weight: 600; + /* 固定大小,使其看起来更像图标按钮 */ + min-width: 32px; + max-width: 32px; + min-height: 32px; + max-height: 32px; +} +QPushButton#prevButton:hover, QPushButton#nextButton:hover { + background-color: #E5E5E5; + border-color: #D0D0D0; +} +QPushButton#prevButton:pressed, QPushButton#nextButton:pressed { + background-color: #D0D0D0; + border-color: #C2C2C2; + color: #1F1F1F; +} + +/* 页码标签 */ +QLabel#pageLabel { + font-weight: 600; + padding-left: 8px; + padding-right: 8px; +} + + +/* ---- 滚动区域 ---- */ +QScrollArea#messageBoxArea { + background-color: transparent; + border: none; /* 移除滚动区域自身的边框 */ +} + +/* 滚动区域的内容QWidget,也设为透明,让里面的卡片自己决定背景 */ +QWidget#scrollAreaWidgetContents { + background-color: transparent; +} + + +/* ---- 全局滚动条美化 ---- */ +QScrollBar:vertical { + border: none; + background: transparent; + width: 8px; + margin: 0px; +} +QScrollBar::handle:vertical { + background: #D0D0D0; + border-radius: 4px; + min-height: 25px; +} +QScrollBar::handle:vertical:hover { + background: #A0A0A0; +} +QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical { + height: 0px; +} +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { + background: none; +} + - + + + + Segoe UI Variable + 20 + false + true + + - TextLabel + 注册管理 - + QFrame::Shape::StyledPanel QFrame::Shadow::Raised - + - - - TextLabel + + + + 75 + 0 + + + + + 100 + 16777215 + + + QFrame::Shape::StyledPanel + + + QFrame::Shadow::Raised + + + + + + + Segoe UI Variable + 16 + false + true + + + + Qt::LayoutDirection::LeftToRight + + + 0 + + + Qt::AlignmentFlag::AlignCenter + + + + + + + + Segoe UI Variable + 12 + false + + + + 总数 + + + Qt::AlignmentFlag::AlignCenter + + + + - - - TextLabel + + + + 75 + 0 + + + + + 100 + 16777215 + + + + QFrame::Shape::StyledPanel + + + QFrame::Shadow::Raised + + + + + + Segoe UI Variable + 16 + false + true + + + + Qt::LayoutDirection::LeftToRight + + + 0 + + + Qt::AlignmentFlag::AlignCenter + + + + + + + + Segoe UI Variable + 12 + false + + + + 待审批 + + + Qt::AlignmentFlag::AlignCenter + + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + - + QFrame::Shape::StyledPanel QFrame::Shadow::Raised - + + + + + /* ---- “新建”按钮 (主操作按钮) ---- */ +QPushButton { + background-color: #0078D4; + color: white; + border: none; + border-radius: 4px; + padding: 8px 16px; + font-weight: 600; + font-size: 10pt; +} + + + 新建 + + + + + + + QPushButton { + background-color: white; + color: black; + border: none; + border-radius: 4px; + padding: 8px 16px; + font-weight: 600; + font-size: 10pt; +} + + + 刷新 + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + < + + + + + + + 1 / 5 + + + Qt::AlignmentFlag::AlignCenter + + + - + - PushButton + > @@ -67,7 +386,7 @@ - + true @@ -76,8 +395,8 @@ 0 0 - 380 - 320 + 537 + 426 diff --git a/view/RegisterCenter/checkuserblock.cpp b/view/RegisterCenter/checkuserblock.cpp new file mode 100644 index 0000000..03c49ef --- /dev/null +++ b/view/RegisterCenter/checkuserblock.cpp @@ -0,0 +1,18 @@ +// +// Created by gouzuang on 25-7-13. +// + +// You may need to build the project (run Qt uic code generator) to get "ui_CheckUserBlock.h" resolved + +#include "checkuserblock.h" +#include "ui_CheckUserBlock.h" + +namespace view::RegisterCenter { + CheckUserBlock::CheckUserBlock(QWidget *parent) : QWidget(parent), ui(new Ui::CheckUserBlock) { + ui->setupUi(this); + } + + CheckUserBlock::~CheckUserBlock() { + delete ui; + } +} // view::RegisterCenter diff --git a/view/RegisterCenter/checkuserblock.h b/view/RegisterCenter/checkuserblock.h new file mode 100644 index 0000000..bcf7cc9 --- /dev/null +++ b/view/RegisterCenter/checkuserblock.h @@ -0,0 +1,32 @@ +// +// Created by gouzuang on 25-7-13. +// + +#ifndef CHECKUSERBLOCK_H +#define CHECKUSERBLOCK_H + +#include + +namespace view::RegisterCenter { +QT_BEGIN_NAMESPACE +namespace Ui { class CheckUserBlock; } +QT_END_NAMESPACE + +class CheckUserBlock : public QWidget { +Q_OBJECT + +public: + explicit CheckUserBlock(QWidget *parent = nullptr); + ~CheckUserBlock() override; + + + +private: + Ui::CheckUserBlock *ui; + int m_currentPage; + int m_totalPages; + const int m_itemsPerPage = 10; +}; +} // view::RegisterCenter + +#endif //CHECKUSERBLOCK_H diff --git a/view/RegisterCenter/checkuserblock.ui b/view/RegisterCenter/checkuserblock.ui new file mode 100644 index 0000000..ab93399 --- /dev/null +++ b/view/RegisterCenter/checkuserblock.ui @@ -0,0 +1,109 @@ + + + view::RegisterCenter::CheckUserBlock + + + + 0 + 0 + 498 + 295 + + + + CheckUserBlock + + + + + + + 0 + 0 + + + + + 100 + 100 + + + + + 16777215 + 100 + + + + QPushButton#frame { + /* 设置背景颜色 */ + background-color: #F3F2F1; + + /* 关键:设置圆角半径,这里设为 8px,你可以根据需要调整 */ + border-radius: 8px; + + /* 设置一个细微的边框,使其看起来更清晰 */ + border: 1px solid #E1DFDD; + } + + /* 鼠标悬停时的效果,可以增加一些交互感 */ + QPushButton#frame:hover { + background-color: #E1DFDD; + } + + QPushButton#frame QLabel { + background-color: transparent; + border: none; /* 同时最好也禁用边框 */ + } + + + + + + + + + + 14 + true + + + + 姓名 + + + + + + + 学工号 + + + + + + + + + + Microsoft YaHei UI + 10 + + + + 用户组 + + + + + + + + + + + + + + + From 5521fc63357cd1ab3f9de8781b63b940e2980849 Mon Sep 17 00:00:00 2001 From: Gouzuang <87839812+Gouzuang@users.noreply.github.com> Date: Sun, 13 Jul 2025 11:16:18 +0800 Subject: [PATCH 2/3] =?UTF-8?q?[=E4=BC=98=E5=8C=96]=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=AE=A1=E6=89=B9=E7=95=8C=E9=9D=A2=E5=8F=8A?= =?UTF-8?q?=E4=BA=A4=E4=BA=92=EF=BC=8C=E5=AE=8C=E5=96=84=E5=88=86=E9=A1=B5?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E4=B8=8E=E6=8C=89=E9=92=AE=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=EF=BC=8C=E6=96=B0=E5=A2=9E=E7=94=A8=E6=88=B7=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 4 - module/data/data_UserControl.cpp | 20 +++- module/data/data_UserControl.h | 10 ++ .../equipmentclassmanagehomepage.ui | 19 +++ view/RegisterCenter/checknewuser.cpp | 19 ++- view/RegisterCenter/checknewuser.ui | 19 +++ view/RegisterCenter/checkuserblock.cpp | 112 +++++++++++++++++- view/RegisterCenter/checkuserblock.h | 18 ++- view/RegisterCenter/checkuserblock.ui | 36 +++++- 9 files changed, 234 insertions(+), 23 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ad82cf..9913d40 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -134,10 +134,6 @@ set(SHARED_SOURCES view/EquipmentClass/equipmentclassblock.cpp view/EquipmentClass/equipmentclassblock.h view/EquipmentClass/equipmentclassblock.ui - view/SplashScreen/SplashScreen.qml - view/SplashScreen/splashscreen.cpp - view/SplashScreen/splashscreen.h - view/SplashScreen/splashscreen.ui view/RegisterCenter/checkuserblock.cpp view/RegisterCenter/checkuserblock.h view/RegisterCenter/checkuserblock.ui diff --git a/module/data/data_UserControl.cpp b/module/data/data_UserControl.cpp index 5c99f19..482897c 100644 --- a/module/data/data_UserControl.cpp +++ b/module/data/data_UserControl.cpp @@ -503,7 +503,7 @@ namespace data::UserControl { QList getAllUserId(int page, int pageSize) { service::DatabaseManager db(service::Path::user()); QString query = R"( - SELECT id FROM users WHERE status != 'Deleted' AND id NOT LIKE '-%' + SELECT id FROM users WHERE status != 'Deleted' AND id_number NOT LIKE '-%' ORDER BY created_at DESC LIMIT ? OFFSET ? )"; @@ -521,7 +521,7 @@ namespace data::UserControl { QList getUncheckedUserId(int page, int pageSize) { service::DatabaseManager db(service::Path::user()); QString query = R"( - SELECT id FROM users WHERE status == 'Unchecked' AND id NOT LIKE '-%' + SELECT id FROM users WHERE status == 'Unchecked' AND id_number NOT LIKE '-%' ORDER BY created_at DESC LIMIT ? OFFSET ? )"; @@ -537,7 +537,7 @@ namespace data::UserControl { QList getAllUserId() { service::DatabaseManager db(service::Path::user()); QString query = R"( - SELECT id FROM users WHERE status != 'Deleted' AND id NOT LIKE '-%' + SELECT id FROM users WHERE status != 'Deleted' AND id_number NOT LIKE '-%' )"; auto results = db.executePreparedQueryAndFetchAll(query, {}); QList userIds; @@ -550,7 +550,7 @@ namespace data::UserControl { QList getUncheckedUserId() { service::DatabaseManager db(service::Path::user()); QString query = R"( - SELECT id FROM users WHERE status == 'Unchecked' AND id NOT LIKE '-%' + SELECT id FROM users WHERE status == 'Unchecked' AND id_number NOT LIKE '-%' )"; auto results = db.executePreparedQueryAndFetchAll(query, {}); QList userIds; @@ -620,5 +620,17 @@ namespace data::UserControl { } return true; } + + QString getUserStatus(int userId) { + service::DatabaseManager db(service::Path::user()); + QString query = R"( + SELECT status FROM users WHERE id = ? + )"; + auto results = db.executePreparedQueryAndFetchAll(query, {userId}); + if (results.isEmpty()) { + return QString(); + } + return results.first()["status"].toString(); + } } } diff --git a/module/data/data_UserControl.h b/module/data/data_UserControl.h index 1dc45c6..1fadabb 100644 --- a/module/data/data_UserControl.h +++ b/module/data/data_UserControl.h @@ -25,6 +25,15 @@ namespace data::UserControl { MutiResultFound }; + struct UserData { + int userId; + int id_number; + QString username; + QList> groups; + QString status; + QDateTime created_at; + }; + inline int currentUserId = -1; // 内建用户组ID字典 @@ -280,6 +289,7 @@ namespace data::UserControl { bool allowUserRegister(int userId); bool banUser(int userId); bool unbanUser(int userId); + QString getUserStatus(int userId); } } diff --git a/view/EquipmentClass/equipmentclassmanagehomepage.ui b/view/EquipmentClass/equipmentclassmanagehomepage.ui index 16d60f5..334c872 100644 --- a/view/EquipmentClass/equipmentclassmanagehomepage.ui +++ b/view/EquipmentClass/equipmentclassmanagehomepage.ui @@ -258,6 +258,16 @@ QPushButton { padding: 8px 16px; font-weight: 600; font-size: 10pt; + } + + QPushButton:hover { /* 鼠标悬停时 */ + background-color: #005FA8; /* 比默认蓝色稍深一点 */ + } + + QPushButton:pressed { /* 按钮按下时 */ + background-color: #004C8C; /* 更深的蓝色 */ + padding-top: 9px; /* 模拟下沉效果 */ + padding-bottom: 7px; } @@ -276,6 +286,15 @@ QPushButton { padding: 8px 16px; font-weight: 600; font-size: 10pt; + } + QPushButton:hover { /* 鼠标悬停时 */ + background-color: #f0f0f0; /* 可以是更浅的颜色 */ + } + + QPushButton:pressed { /* 按钮按下时 */ + background-color: #e0e0e0; /* 可以是更深的颜色 */ + padding-top: 9px; /* 让按钮看起来稍微下沉 */ + padding-bottom: 7px; } diff --git a/view/RegisterCenter/checknewuser.cpp b/view/RegisterCenter/checknewuser.cpp index 5913c17..f45ac85 100644 --- a/view/RegisterCenter/checknewuser.cpp +++ b/view/RegisterCenter/checknewuser.cpp @@ -14,11 +14,7 @@ CheckNewUser::CheckNewUser(QWidget *parent) : QWidget(parent), ui(new Ui::CheckNewUser), m_currentPage(1),m_itemsPerPage(10),m_totalPages(){ ui->setupUi(this); - - // --- 分页逻辑初始化 --- - m_currentPage = 1; - // 从数据层获取总页数 - m_totalPages = data::UserControl::check::getAllUserCount() / m_itemsPerPage + 1; + service::style::setMica(this); loadDataFromDatabase(m_currentPage); } @@ -28,6 +24,12 @@ CheckNewUser::~CheckNewUser() { } void CheckNewUser::loadDataFromDatabase(int page) { + // --- 分页逻辑初始化 --- + m_currentPage = 1; + // 从数据层获取总页数 + m_totalPages = data::UserControl::check::getAllUserCount() / m_itemsPerPage + 1; + updatePaginationControls(); + // 从数据库获取设备分类数据 auto records = data::UserControl::check::getAllUserId(page, m_itemsPerPage); @@ -39,6 +41,10 @@ void CheckNewUser::loadDataFromDatabase(int page) { layout->setSpacing(5); layout->setAlignment(Qt::AlignTop); layout = qobject_cast(ui->scrollAreaWidgetContents->layout()); + if (!layout) { + log(LogLevel::ERR) << "错误:布局创建后仍然为空!"; + return; // 提前退出以避免崩溃 + } } // 清除现有的消息块 @@ -50,7 +56,7 @@ void CheckNewUser::loadDataFromDatabase(int page) { // 为每个设备分类记录创建信息块 for (const auto &record : records) { - auto *block = new CheckUserBlock(); // 创建信息块实例 + auto *block = new CheckUserBlock(record); // 创建信息块实例 layout->addWidget(block); } @@ -68,6 +74,7 @@ void CheckNewUser::updatePaginationControls() { ui->nextButton->setEnabled(false); return; } + ui->pageLabel->setText(QString("%1 / %2").arg(m_currentPage).arg(m_totalPages)); } void CheckNewUser::on_prevButton_clicked() { diff --git a/view/RegisterCenter/checknewuser.ui b/view/RegisterCenter/checknewuser.ui index 02d362b..4c1730c 100644 --- a/view/RegisterCenter/checknewuser.ui +++ b/view/RegisterCenter/checknewuser.ui @@ -320,6 +320,16 @@ QPushButton { padding: 8px 16px; font-weight: 600; font-size: 10pt; + } + + QPushButton:hover { /* 鼠标悬停时 */ + background-color: #005FA8; /* 比默认蓝色稍深一点 */ + } + + QPushButton:pressed { /* 按钮按下时 */ + background-color: #004C8C; /* 更深的蓝色 */ + padding-top: 9px; /* 模拟下沉效果 */ + padding-bottom: 7px; } @@ -338,6 +348,15 @@ QPushButton { padding: 8px 16px; font-weight: 600; font-size: 10pt; + } + QPushButton:hover { /* 鼠标悬停时 */ + background-color: #f0f0f0; /* 可以是更浅的颜色 */ + } + + QPushButton:pressed { /* 按钮按下时 */ + background-color: #e0e0e0; /* 可以是更深的颜色 */ + padding-top: 9px; /* 让按钮看起来稍微下沉 */ + padding-bottom: 7px; } diff --git a/view/RegisterCenter/checkuserblock.cpp b/view/RegisterCenter/checkuserblock.cpp index 03c49ef..bbf3dd7 100644 --- a/view/RegisterCenter/checkuserblock.cpp +++ b/view/RegisterCenter/checkuserblock.cpp @@ -8,11 +8,121 @@ #include "ui_CheckUserBlock.h" namespace view::RegisterCenter { - CheckUserBlock::CheckUserBlock(QWidget *parent) : QWidget(parent), ui(new Ui::CheckUserBlock) { + CheckUserBlock::CheckUserBlock(int userId, QWidget *parent): QWidget(parent), ui(new Ui::CheckUserBlock), + userId(userId), acceptButton("接受", this), + rejectButton("拒绝", this), + label_status("状态: ", this) { ui->setupUi(this); + acceptButton.setVisible(false); + rejectButton.setVisible(false); + label_status.setVisible(false); + setButtonStyle(); + + auto name = data::UserControl::UserInfo::getUserNameById(userId); + if (name.has_value()) { + ui->label_name->setText(name.value()); + } else { + ui->label_name->setText("未设置名称的用户"); + } + ui->label_id->setText(QString::number(userId)); + ui->label_group->setText(data::UserControl::permission::getUserInWhichGroup(userId)); + + if (data::UserControl::check::getUserStatus(userId) == "Unchecked") { + addCheckButton(); + }else { + addStatusString(); + } + + connect(&acceptButton, &QPushButton::clicked, this, &CheckUserBlock::AcceptCheck); } CheckUserBlock::~CheckUserBlock() { delete ui; } + + void CheckUserBlock::addCheckButton() { + ui->StatusFrame->layout()->addWidget(&acceptButton); + ui->StatusFrame->layout()->addWidget(&rejectButton); + acceptButton.setVisible(true); + rejectButton.setVisible(true); + } + + void CheckUserBlock::addStatusString(QString status) { + ui->StatusFrame->layout()->addWidget(&label_status); + label_status.setText(status); + label_status.setVisible(true); + } + + void CheckUserBlock::addStatusString() { + auto status = data::UserControl::check::getUserStatus(userId); + ui->StatusFrame->layout()->addWidget(&label_status); + if (status == "Unchecked") { + label_status.setText("未审核"); + } else if (status == "Accepted") { + label_status.setText("已通过"); + } else if (status == "AllRight") { + label_status.setText("一切正常"); + } else { + label_status.setText("未知状态"); + } + label_status.setVisible(true); +} + + void CheckUserBlock::setButtonStyle() { + QString styleSheet1 = R"( + QPushButton { + background-color: #0078D4; + color: white; + border: none; + border-radius: 4px; + padding: 8px 16px; + font-weight: 600; + font-size: 10pt; + } + QPushButton:hover { /* 鼠标悬停时 */ + background-color: #005FA8; /* 比默认蓝色稍深一点 */ + } + + QPushButton:pressed { /* 按钮按下时 */ + background-color: #004C8C; /* 更深的蓝色 */ + padding-top: 9px; /* 模拟下沉效果 */ + padding-bottom: 7px; + } + + )"; + acceptButton.setStyleSheet(styleSheet1); + QString styleSheet2 = R"( + QPushButton { + background-color: white; + color: black; + border: none; + border-radius: 4px; + padding: 8px 16px; + font-weight: 600; + font-size: 10pt; + } + + QPushButton:hover { /* 鼠标悬停时 */ + background-color: #f0f0f0; /* 可以是更浅的颜色 */ + } + + QPushButton:pressed { /* 按钮按下时 */ + background-color: #e0e0e0; /* 可以是更深的颜色 */ + padding-top: 9px; /* 让按钮看起来稍微下沉 */ + padding-bottom: 7px; + } + )"; + rejectButton.setStyleSheet(styleSheet2); + + } + + void CheckUserBlock::AcceptCheck() { + if (data::UserControl::check::allowUserRegister(userId)) { + acceptButton.setVisible(false); + rejectButton.setVisible(false); + addStatusString("审批成功"); + } else { + acceptButton.setText("通过失败"); + } + } } // view::RegisterCenter diff --git a/view/RegisterCenter/checkuserblock.h b/view/RegisterCenter/checkuserblock.h index bcf7cc9..1c5f788 100644 --- a/view/RegisterCenter/checkuserblock.h +++ b/view/RegisterCenter/checkuserblock.h @@ -5,6 +5,7 @@ #ifndef CHECKUSERBLOCK_H #define CHECKUSERBLOCK_H +#include #include namespace view::RegisterCenter { @@ -16,16 +17,25 @@ class CheckUserBlock : public QWidget { Q_OBJECT public: - explicit CheckUserBlock(QWidget *parent = nullptr); + explicit CheckUserBlock(QWidget *parent = nullptr) = delete; + explicit CheckUserBlock(int userId,QWidget *parent = nullptr); ~CheckUserBlock() override; + void addCheckButton(); + void addStatusString(QString status); + void addStatusString(); + void setButtonStyle(); + +public slots: + void AcceptCheck(); private: Ui::CheckUserBlock *ui; - int m_currentPage; - int m_totalPages; - const int m_itemsPerPage = 10; + int userId; + QPushButton acceptButton, + rejectButton; + QLabel label_status; }; } // view::RegisterCenter diff --git a/view/RegisterCenter/checkuserblock.ui b/view/RegisterCenter/checkuserblock.ui index ab93399..85c17a8 100644 --- a/view/RegisterCenter/checkuserblock.ui +++ b/view/RegisterCenter/checkuserblock.ui @@ -15,7 +15,7 @@ - + 0 @@ -57,7 +57,7 @@ } - + @@ -74,7 +74,7 @@ - + 学工号 @@ -83,7 +83,7 @@ - + Microsoft YaHei UI @@ -99,6 +99,34 @@ + + + + + 150 + 16777215 + + + + QFrame { + /* 设置背景颜色 */ + background-color: transparent; + + /* 关键:设置圆角半径,这里设为 8px,你可以根据需要调整 */ + border-radius: 8px; + } + + + + + QFrame::Shape::StyledPanel + + + QFrame::Shadow::Raised + + + + From 6bc4764a029fc32631a91cd97f8d48933c8c3baa Mon Sep 17 00:00:00 2001 From: Gouzuang <87839812+Gouzuang@users.noreply.github.com> Date: Sun, 13 Jul 2025 11:21:54 +0800 Subject: [PATCH 3/3] =?UTF-8?q?[=E4=BC=98=E5=8C=96]=20=E8=B0=83=E6=95=B4Ch?= =?UTF-8?q?eckUserBlock=E7=B1=BB=E7=BB=93=E6=9E=84=E5=8F=8A=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=A0=BC=E5=BC=8F=EF=BC=8C=E4=BF=AE=E5=A4=8D=E7=BC=A9?= =?UTF-8?q?=E8=BF=9B=E9=97=AE=E9=A2=98=EF=BC=8C=E4=BC=98=E5=8C=96=E6=88=90?= =?UTF-8?q?=E5=91=98=E5=8F=98=E9=87=8F=E5=A3=B0=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.cpp | 2 +- module/data/data_UserControl.h | 3 ++- view/RegisterCenter/checkuserblock.cpp | 9 ++++----- view/RegisterCenter/checkuserblock.h | 26 +++++++++++++++----------- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/main.cpp b/main.cpp index f969482..cbb87a9 100644 --- a/main.cpp +++ b/main.cpp @@ -55,7 +55,7 @@ int main(int argc, char *argv[]) { // log(LogLevel::ERR) << "无法加载样式表文件: " << styleFile.fileName(); // } - view::RegisterCenter::CheckNewUser b; + view::login::loginPage b; b.show(); //splash.close(); diff --git a/module/data/data_UserControl.h b/module/data/data_UserControl.h index 1fadabb..554984a 100644 --- a/module/data/data_UserControl.h +++ b/module/data/data_UserControl.h @@ -29,7 +29,7 @@ namespace data::UserControl { int userId; int id_number; QString username; - QList> groups; + QList > groups; QString status; QDateTime created_at; }; @@ -289,6 +289,7 @@ namespace data::UserControl { bool allowUserRegister(int userId); bool banUser(int userId); bool unbanUser(int userId); + QString getUserStatus(int userId); } } diff --git a/view/RegisterCenter/checkuserblock.cpp b/view/RegisterCenter/checkuserblock.cpp index bbf3dd7..fe6eea6 100644 --- a/view/RegisterCenter/checkuserblock.cpp +++ b/view/RegisterCenter/checkuserblock.cpp @@ -11,7 +11,7 @@ namespace view::RegisterCenter { CheckUserBlock::CheckUserBlock(int userId, QWidget *parent): QWidget(parent), ui(new Ui::CheckUserBlock), userId(userId), acceptButton("接受", this), rejectButton("拒绝", this), - label_status("状态: ", this) { + label_status("状态: ", this) { ui->setupUi(this); acceptButton.setVisible(false); rejectButton.setVisible(false); @@ -29,7 +29,7 @@ namespace view::RegisterCenter { if (data::UserControl::check::getUserStatus(userId) == "Unchecked") { addCheckButton(); - }else { + } else { addStatusString(); } @@ -54,7 +54,7 @@ namespace view::RegisterCenter { } void CheckUserBlock::addStatusString() { - auto status = data::UserControl::check::getUserStatus(userId); + auto status = data::UserControl::check::getUserStatus(userId); ui->StatusFrame->layout()->addWidget(&label_status); if (status == "Unchecked") { label_status.setText("未审核"); @@ -66,7 +66,7 @@ namespace view::RegisterCenter { label_status.setText("未知状态"); } label_status.setVisible(true); -} + } void CheckUserBlock::setButtonStyle() { QString styleSheet1 = R"( @@ -113,7 +113,6 @@ namespace view::RegisterCenter { } )"; rejectButton.setStyleSheet(styleSheet2); - } void CheckUserBlock::AcceptCheck() { diff --git a/view/RegisterCenter/checkuserblock.h b/view/RegisterCenter/checkuserblock.h index 1c5f788..4ebb9f9 100644 --- a/view/RegisterCenter/checkuserblock.h +++ b/view/RegisterCenter/checkuserblock.h @@ -17,25 +17,29 @@ class CheckUserBlock : public QWidget { Q_OBJECT public: - explicit CheckUserBlock(QWidget *parent = nullptr) = delete; - explicit CheckUserBlock(int userId,QWidget *parent = nullptr); - ~CheckUserBlock() override; +explicit CheckUserBlock(QWidget *parent = nullptr) = delete; + +explicit CheckUserBlock(int userId, QWidget *parent = nullptr); + +~CheckUserBlock() override; void addCheckButton(); - void addStatusString(QString status); - void addStatusString(); - void setButtonStyle(); -public slots: - void AcceptCheck(); +void addStatusString(QString status); +void addStatusString(); + +void setButtonStyle(); + +public slots: +void AcceptCheck(); private: - Ui::CheckUserBlock *ui; +Ui::CheckUserBlock *ui; int userId; QPushButton acceptButton, - rejectButton; - QLabel label_status; + rejectButton; +QLabel label_status; }; } // view::RegisterCenter