From ebc49d1ac69acaee2647d03bd7f2101c8f030652 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BA=AA=E7=94=B0=E9=87=8E?= Date: Thu, 30 Apr 2026 22:45:57 +0800 Subject: [PATCH] =?UTF-8?q?PC=20=E7=AB=AF=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 58 + CMakeLists.txt | 124 ++ README.md | 422 ++++ android/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 9022 bytes android/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 4737 bytes android/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 14035 bytes android/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 27543 bytes android/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 44797 bytes assets/favicon-128x128.png | Bin 0 -> 19939 bytes assets/favicon-16x16.png | Bin 0 -> 627 bytes assets/favicon-192x192.png | Bin 0 -> 40269 bytes assets/favicon-256x256.png | Bin 0 -> 69006 bytes assets/favicon-32x32.png | Bin 0 -> 1887 bytes assets/favicon-48x48.png | Bin 0 -> 3774 bytes assets/favicon-64x64.png | Bin 0 -> 6105 bytes assets/favicon.ico | Bin 0 -> 101440 bytes cmake/app_icon.rc.in | 1 + cmake/rewrite_qt.desktop.in | 7 + main.cpp | 46 + qml/Main.qml | 2311 ++++++++++++++++++++ src/ApiClient.cpp | 494 +++++ src/ApiClient.h | 71 + src/AppController.cpp | 734 +++++++ src/AppController.h | 151 ++ src/AttendanceTypes.h | 59 + src/CryptoUtils.cpp | 48 + src/CryptoUtils.h | 12 + src/FaceListModel.cpp | 85 + src/FaceListModel.h | 47 + src/MappingListModel.cpp | 132 ++ src/MappingListModel.h | 48 + src/RecordListModel.cpp | 59 + src/RecordListModel.h | 53 + src/StatisticsListModel.cpp | 53 + src/StatisticsListModel.h | 48 + src/TimeSlotListModel.cpp | 146 ++ src/TimeSlotListModel.h | 48 + src/crypto/tiny_aes.hpp | 217 ++ 38 files changed, 5474 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 README.md create mode 100644 android/res/mipmap-hdpi/ic_launcher.png create mode 100644 android/res/mipmap-mdpi/ic_launcher.png create mode 100644 android/res/mipmap-xhdpi/ic_launcher.png create mode 100644 android/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 android/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 assets/favicon-128x128.png create mode 100644 assets/favicon-16x16.png create mode 100644 assets/favicon-192x192.png create mode 100644 assets/favicon-256x256.png create mode 100644 assets/favicon-32x32.png create mode 100644 assets/favicon-48x48.png create mode 100644 assets/favicon-64x64.png create mode 100644 assets/favicon.ico create mode 100644 cmake/app_icon.rc.in create mode 100644 cmake/rewrite_qt.desktop.in create mode 100644 main.cpp create mode 100644 qml/Main.qml create mode 100644 src/ApiClient.cpp create mode 100644 src/ApiClient.h create mode 100644 src/AppController.cpp create mode 100644 src/AppController.h create mode 100644 src/AttendanceTypes.h create mode 100644 src/CryptoUtils.cpp create mode 100644 src/CryptoUtils.h create mode 100644 src/FaceListModel.cpp create mode 100644 src/FaceListModel.h create mode 100644 src/MappingListModel.cpp create mode 100644 src/MappingListModel.h create mode 100644 src/RecordListModel.cpp create mode 100644 src/RecordListModel.h create mode 100644 src/StatisticsListModel.cpp create mode 100644 src/StatisticsListModel.h create mode 100644 src/TimeSlotListModel.cpp create mode 100644 src/TimeSlotListModel.h create mode 100644 src/crypto/tiny_aes.hpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e741630 --- /dev/null +++ b/.gitignore @@ -0,0 +1,58 @@ +# Build directories +build/ +build-*/ +cmake-build-*/ +out/ + +# CMake generated files +CMakeCache.txt +CMakeFiles/ +cmake_install.cmake +install_manifest.txt +compile_commands.json +CTestTestfile.cmake +DartConfiguration.tcl + +# Qt Creator local settings +.qtcreator/ +*.user +*.user.* + +# Qt generated artifacts +*_autogen/ +*.qmlc +*.jsc +qrc_*.cpp +moc_*.cpp +moc_*.h +ui_*.h + +# Compiled binaries and libraries +*.exe +*.dll +*.so +*.dylib +*.a +*.lib +*.o +*.obj +*.pdb +*.ilk + +# Android build outputs +android-build/ +*.apk +*.aab + +# Logs and temporary files +*.log +*.tmp +*.temp +*.bak +*.swp +*~ + +# OS files +.DS_Store +Thumbs.db +desktop.ini diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..af3d713 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,124 @@ +cmake_minimum_required(VERSION 3.16) + +project(rewrite_qt VERSION 1.0.0 LANGUAGES CXX) + +set(QT_QML_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/qml") +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTOMOC_COMPILER_PREDEFINES OFF) +set(CMAKE_AUTORCC ON) + +file(TO_CMAKE_PATH "$ENV{LOCALAPPDATA}" REWRITE_QT_LOCALAPPDATA) +if(REWRITE_QT_LOCALAPPDATA) + set(REWRITE_QT_AUTOGEN_DIR "${REWRITE_QT_LOCALAPPDATA}/rewrite_qt_autogen") +else() + set(REWRITE_QT_AUTOGEN_DIR "${CMAKE_BINARY_DIR}/autogen_ascii") +endif() +file(MAKE_DIRECTORY "${REWRITE_QT_AUTOGEN_DIR}") + +find_package(Qt6 6.2 REQUIRED COMPONENTS Core Gui Qml Quick QuickControls2 Network) + +qt_standard_project_setup() + +set(REWRITE_QT_APP_ICON "${CMAKE_CURRENT_SOURCE_DIR}/assets/favicon.ico") +set(REWRITE_QT_ICON_RESOURCES + assets/favicon.ico + assets/favicon-256x256.png + assets/favicon-192x192.png + assets/favicon-128x128.png + assets/favicon-64x64.png + assets/favicon-48x48.png + assets/favicon-32x32.png + assets/favicon-16x16.png +) + +qt_add_executable(apprewrite_qt + main.cpp + src/AppController.cpp + src/ApiClient.cpp + src/CryptoUtils.cpp + src/RecordListModel.cpp + src/StatisticsListModel.cpp + src/TimeSlotListModel.cpp + src/MappingListModel.cpp + src/FaceListModel.cpp +) + +if(WIN32 AND EXISTS "${REWRITE_QT_APP_ICON}") + set(REWRITE_QT_WIN32_ICON_RC "${CMAKE_CURRENT_BINARY_DIR}/app_icon.rc") + configure_file(cmake/app_icon.rc.in "${REWRITE_QT_WIN32_ICON_RC}" @ONLY) + target_sources(apprewrite_qt PRIVATE "${REWRITE_QT_WIN32_ICON_RC}") +endif() + +if(ANDROID) + set_target_properties(apprewrite_qt PROPERTIES + QT_ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android" + QT_ANDROID_APP_ICON "@mipmap/ic_launcher" + ) +endif() + +target_include_directories(apprewrite_qt PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src +) + +set(REWRITE_QT_RESOURCE_FILES + qml/Main.qml +) + +foreach(REWRITE_QT_ICON_RESOURCE IN LISTS REWRITE_QT_ICON_RESOURCES) + if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${REWRITE_QT_ICON_RESOURCE}") + list(APPEND REWRITE_QT_RESOURCE_FILES "${REWRITE_QT_ICON_RESOURCE}") + endif() +endforeach() + +qt_add_resources(apprewrite_qt "qml_resources" + PREFIX "/" + FILES + ${REWRITE_QT_RESOURCE_FILES} +) + +target_link_libraries(apprewrite_qt + PRIVATE + Qt6::Core + Qt6::Gui + Qt6::Qml + Qt6::Quick + Qt6::QuickControls2 + Qt6::Network +) + +set_target_properties(apprewrite_qt PROPERTIES + AUTOGEN_BUILD_DIR "${REWRITE_QT_AUTOGEN_DIR}" + QT_QML_MODULE_NO_IMPORT_SCAN TRUE + MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} + MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} + MACOSX_BUNDLE TRUE + WIN32_EXECUTABLE TRUE +) + +include(GNUInstallDirs) + +if(UNIX AND NOT APPLE AND NOT ANDROID) + set(REWRITE_QT_DESKTOP_FILE "${CMAKE_CURRENT_BINARY_DIR}/rewrite_qt.desktop") + configure_file(cmake/rewrite_qt.desktop.in "${REWRITE_QT_DESKTOP_FILE}" @ONLY) + install(FILES "${REWRITE_QT_DESKTOP_FILE}" + DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications" + ) + + foreach(REWRITE_QT_ICON_SIZE IN ITEMS 16 32 48 64 128 192 256) + set(REWRITE_QT_LINUX_ICON "${CMAKE_CURRENT_SOURCE_DIR}/assets/favicon-${REWRITE_QT_ICON_SIZE}x${REWRITE_QT_ICON_SIZE}.png") + if(EXISTS "${REWRITE_QT_LINUX_ICON}") + install(FILES "${REWRITE_QT_LINUX_ICON}" + DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/${REWRITE_QT_ICON_SIZE}x${REWRITE_QT_ICON_SIZE}/apps" + RENAME rewrite_qt.png + ) + endif() + endforeach() +endif() + +install(TARGETS apprewrite_qt + BUNDLE DESTINATION . + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} +) diff --git a/README.md b/README.md new file mode 100644 index 0000000..fb05b70 --- /dev/null +++ b/README.md @@ -0,0 +1,422 @@ +# 人脸识别考勤系统 Qt 客户端说明文档 + +## 1. 项目简介 + +本项目是基于 Qt 6 Quick/QML 开发的人脸识别考勤系统客户端,用于连接考勤服务端,完成考勤记录查看、筛选导出、统计分析、签到时段配置、学生和班级名称映射、人脸照片映射管理等功能。 + +程序入口为 `main.cpp`。启动后创建 `QGuiApplication` 和 `AppController`,并将 `AppController` 通过 QML 上下文属性 `appController` 暴露给 `qml/Main.qml`。界面由 QML 实现,业务逻辑、网络请求、数据模型、配置保存和 CSV 导出由 C++ 实现。 + +默认服务端地址: + +```text +http://27.106.113.205:8082 +``` + +## 2. 技术栈 + +- 语言:C++17、QML +- 框架:Qt 6.2 或更高版本 +- Qt 模块:Core、Gui、Qml、Quick、QuickControls2、Network +- 构建系统:CMake 3.16 或更高版本 +- 加密处理:AES-128-CBC,相关代码位于 `src/CryptoUtils.cpp` + +## 3. 当前目录结构 + +```text +rewrite_qt/ +├── CMakeLists.txt +├── README.md +├── main.cpp +├── android/ +│ └── res/ +│ ├── mipmap-mdpi/ic_launcher.png +│ ├── mipmap-hdpi/ic_launcher.png +│ ├── mipmap-xhdpi/ic_launcher.png +│ ├── mipmap-xxhdpi/ic_launcher.png +│ └── mipmap-xxxhdpi/ic_launcher.png +├── assets/ +│ ├── favicon.ico +│ ├── favicon-16x16.png +│ ├── favicon-32x32.png +│ ├── favicon-48x48.png +│ ├── favicon-64x64.png +│ ├── favicon-128x128.png +│ ├── favicon-192x192.png +│ └── favicon-256x256.png +├── cmake/ +│ ├── app_icon.rc.in +│ └── rewrite_qt.desktop.in +├── qml/ +│ └── Main.qml +└── src/ + ├── ApiClient.h/.cpp + ├── AppController.h/.cpp + ├── AttendanceTypes.h + ├── CryptoUtils.h/.cpp + ├── FaceListModel.h/.cpp + ├── MappingListModel.h/.cpp + ├── RecordListModel.h/.cpp + ├── StatisticsListModel.h/.cpp + ├── TimeSlotListModel.h/.cpp + └── crypto/tiny_aes.hpp +``` + +## 4. 构建与运行 + +### 4.1 环境要求 + +需要安装: + +- Qt 6.2+ +- CMake 3.16+ +- 支持 C++17 的编译器,例如 MSVC、MinGW、Clang 或 GCC + +Android 构建还需要配置 Qt for Android、Android SDK、Android NDK 和 JDK。 + +### 4.2 使用 Qt Creator + +1. 打开项目根目录下的 `CMakeLists.txt`。 +2. 选择合适的 Qt Kit,例如 Desktop Qt 6.x 或 Android Qt 6.x。 +3. 重新配置 CMake。 +4. 构建并运行目标 `apprewrite_qt`。 + +### 4.3 使用命令行 + +Windows 示例: + +```powershell +cmake -S . -B build -DCMAKE_PREFIX_PATH=D:/Qt/6.10.0/mingw_64 +cmake --build build +``` + +Linux 示例: + +```bash +cmake -S . -B build -DCMAKE_PREFIX_PATH=/path/to/Qt/6.x/gcc_64 +cmake --build build +``` + +安装到系统路径: + +```bash +cmake --install build +``` + +## 5. 多平台图标配置 + +项目已经配置为多平台使用同一套应用图标。 + +### 5.1 Windows + +Windows exe 图标使用: + +```text +assets/favicon.ico +``` + +CMake 会在 Windows 构建时根据 `cmake/app_icon.rc.in` 生成资源文件,并把图标嵌入到可执行文件中。 + +### 5.2 桌面运行时图标 + +`main.cpp` 会设置应用窗口图标: + +```cpp +QIcon appIcon(QStringLiteral(":/assets/favicon.ico")); +``` + +同时会加入多尺寸 PNG 作为回退资源: + +```text +assets/favicon-256x256.png +assets/favicon-192x192.png +assets/favicon-128x128.png +assets/favicon-64x64.png +assets/favicon-48x48.png +assets/favicon-32x32.png +assets/favicon-16x16.png +``` + +这些图标文件会被加入 Qt 资源系统,路径前缀为 `:/assets/...`。 + +### 5.3 Linux + +Linux 安装时会生成 `.desktop` 文件: + +```text +cmake/rewrite_qt.desktop.in +``` + +并把不同尺寸的 PNG 安装到: + +```text +share/icons/hicolor/{size}x{size}/apps/rewrite_qt.png +``` + +`.desktop` 文件中使用的图标名为: + +```text +rewrite_qt +``` + +### 5.4 Android + +Android 启动器图标位于: + +```text +android/res/mipmap-mdpi/ic_launcher.png +android/res/mipmap-hdpi/ic_launcher.png +android/res/mipmap-xhdpi/ic_launcher.png +android/res/mipmap-xxhdpi/ic_launcher.png +android/res/mipmap-xxxhdpi/ic_launcher.png +``` + +对应尺寸: + +| 目录 | 尺寸 | +| --- | --- | +| `mipmap-mdpi` | 48x48 | +| `mipmap-hdpi` | 72x72 | +| `mipmap-xhdpi` | 96x96 | +| `mipmap-xxhdpi` | 144x144 | +| `mipmap-xxxhdpi` | 192x192 | + +CMake 中 Android 相关配置: + +```cmake +QT_ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android" +QT_ANDROID_APP_ICON "@mipmap/ic_launcher" +``` + +`QT_ANDROID_APP_ICON` 需要 Qt 6.9 或更高版本。当前 Qt 6.10 可正常使用。 + +## 6. 功能说明 + +### 6.1 考勤记录 + +考勤记录页支持: + +- 查看总记录数、今日记录数、已加载记录数和当前筛选结果数。 +- 按班级、学号、姓名关键字筛选。 +- 按今天、最近 7 天、最近 30 天或指定日期范围筛选。 +- 导出当前筛选结果为 CSV。 +- 清空服务端全部考勤记录。 + +导出的记录 CSV 字段: + +```text +签到时间,班级编号,班级名称,学号,姓名,置信度,状态 +``` + +### 6.2 统计分析 + +统计页基于已加载记录在本地计算,支持: + +- 今天、最近 7 天、最近 30 天、本月等快捷范围。 +- 自定义统计日期范围。 +- 按学生汇总签到次数、今日签到次数、最后签到时间和平均置信度。 +- 导出统计结果为 CSV。 + +导出的统计 CSV 字段: + +```text +学号,姓名,总签到次数,今日签到,最后签到时间,平均置信度 +``` + +### 6.3 配置中心 + +配置中心包含: + +- 服务端地址配置和连接测试。 +- 签到时段新增、编辑、删除、启用和禁用。 +- 学号到姓名的映射。 +- 班级编号到班级名称的映射。 + +默认签到时段: + +| 名称 | 开始时间 | 结束时间 | 默认状态 | +| --- | --- | --- | --- | +| 上午签到 | 08:00 | 09:30 | 启用 | +| 中午签退 | 12:00 | 13:00 | 启用 | +| 下午签到 | 14:00 | 15:00 | 启用 | +| 晚上签退 | 17:00 | 18:30 | 启用 | + +### 6.4 人脸管理 + +人脸管理页支持: + +- 从服务端同步人脸照片 ID。 +- 从服务端同步所有学生 ID。 +- 展示人脸照片和绑定状态。 +- 为人脸 ID 绑定真实学号。 +- 保存人脸 ID 与学号映射。 +- 删除指定人脸信息,可选择同时删除该学生的考勤记录。 + +照片访问地址格式: + +```text +{serverUrl}/api/face_photo/{id}?ts={timestamp} +``` + +`ts` 参数用于避免缓存导致照片不刷新。 + +## 7. 核心模块 + +| 文件 | 说明 | +| --- | --- | +| `main.cpp` | 初始化应用、设置应用信息和图标、加载 QML | +| `qml/Main.qml` | 主界面和用户交互 | +| `src/AppController.*` | 应用业务中枢,连接 QML、模型和网络客户端 | +| `src/ApiClient.*` | HTTP API 客户端 | +| `src/*ListModel.*` | 暴露给 QML 的列表模型 | +| `src/AttendanceTypes.h` | 业务数据结构 | +| `src/CryptoUtils.*` | AES-128-CBC 解密工具 | +| `src/crypto/tiny_aes.hpp` | AES 底层实现 | + +## 8. 服务端 API + +客户端会把服务端地址与 `/api` 前缀拼接后访问接口。 + +| 方法 | 路径 | 用途 | +| --- | --- | --- | +| `GET` | `/api/records?limit={limit}&offset={offset}` | 获取考勤记录 | +| `GET` | `/api/statistics` | 获取总数、今日数和服务端时间 | +| `POST` | `/api/clear` | 清空全部记录 | +| `DELETE` | `/api/record?timestamp={timestamp}&student_id={studentId}` | 删除单条记录 | +| `GET` | `/api/timeslots` | 获取签到时段 | +| `POST` | `/api/timeslots` | 保存签到时段 | +| `GET` | `/api/mapping_config` | 获取学生和班级映射 | +| `POST` | `/api/mapping_config` | 保存学生和班级映射 | +| `GET` | `/api/face_id_mapping` | 获取人脸 ID 到学号映射 | +| `POST` | `/api/face_id_mapping` | 保存人脸 ID 到学号映射 | +| `GET` | `/api/face_photos` | 获取照片 ID 列表 | +| `GET` | `/api/all_student_ids` | 获取所有学生 ID | +| `GET` | `/api/face_photo/{id}` | 获取人脸照片 | +| `DELETE` | `/api/face/{studentId}` | 删除人脸信息 | +| `DELETE` | `/api/face/{studentId}?delete_records=true` | 删除人脸信息并删除相关考勤记录 | +| `GET` | `/api/health` | 健康检查 | + +### 8.1 考勤记录格式 + +`/api/records` 解密后应返回 JSON 数组。单条记录示例: + +```json +{ + "timestamp": "2026-04-24 08:10:23", + "student_id": "20240001", + "name": "张三", + "confidence": 0.9821, + "status": "success", + "class_id": "1" +} +``` + +### 8.2 统计数据格式 + +```json +{ + "total": 120, + "today": 8, + "server_time": "2026-04-24 10:30:00" +} +``` + +### 8.3 签到时段格式 + +```json +{ + "time_slots": [ + { + "name": "上午签到", + "start_time": "08:00", + "end_time": "09:30", + "enabled": true + } + ] +} +``` + +### 8.4 映射配置格式 + +```json +{ + "student_name_map": { + "20240001": "张三" + }, + "class_name_map": { + "1": "软件工程一班" + } +} +``` + +### 8.5 人脸映射格式 + +```json +{ + "mappings": { + "face_001": "20240001" + } +} +``` + +## 9. 本地配置 + +应用会保存以下本地状态: + +- 服务端地址:`QSettings`,键名为 `server/url`。 +- 映射配置:`QStandardPaths::AppDataLocation/mapping_config.json`。 +- 签到时段配置:`QStandardPaths::AppDataLocation/timeslot_config.json`。 + +应用信息: + +```text +ApplicationName: 人脸识别考勤系统 +ApplicationVersion: 3.0.0 +OrganizationName: STM32 Face Recognition +``` + +## 10. 加密响应 + +`/api/records` 和 `/api/statistics` 请求会带上: + +```text +X-Encrypted-Response: true +``` + +客户端期望服务端返回 Base64 编码的 AES-128-CBC 密文。 + +解密参数位于 `src/CryptoUtils.cpp`: + +- 算法:AES-128-CBC +- Padding:PKCS#7 +- Key:`2b 7e 15 16 28 ae d2 a6 ab f7 15 88 09 cf 4f 3c` +- IV:`00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f` + +## 11. 常见问题 + +### 11.1 修改图标后没有变化 + +先重新运行 CMake 配置,再重新构建。Windows 资源管理器可能缓存 exe 图标,可以尝试换构建目录、改输出文件名或重启资源管理器。 + +### 11.2 启动后没有数据 + +检查服务端地址是否正确,并在配置中心点击连接测试。如果服务端不可达,状态栏会显示错误信息。 + +### 11.3 姓名或班级显示不正确 + +在配置中心维护学生姓名映射和班级名称映射,然后保存。保存后记录列表和统计结果会重新计算。 + +### 11.4 人脸照片不显示 + +检查 `/api/face_photos` 是否返回照片 ID,并确认 `/api/face_photo/{id}` 可以访问。 + +### 11.5 Android 图标不生效 + +确认使用 Qt 6.9 或更高版本,并重新配置 Android Kit。图标资源位于 `android/res/mipmap-*`,CMake 使用 `QT_ANDROID_APP_ICON "@mipmap/ic_launcher"` 指定启动图标。 + +## 12. 维护建议 + +- 构建目录已从项目中清理,后续重新构建时由 Qt Creator 或 CMake 自动生成。 +- 如果服务端记录量超过 1000 条,需要扩展分页加载逻辑。 +- 如果服务端加密参数变化,需要同步修改 `src/CryptoUtils.cpp`。 +- 如果要发布桌面版本,建议使用 Qt 部署工具收集运行时依赖。 +- 如果要发布 Android 版本,建议补充签名配置和 release 构建流程。 diff --git a/android/res/mipmap-hdpi/ic_launcher.png b/android/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..cb9bd6ef2559cc3c431c75ac2b226807870b7e09 GIT binary patch literal 9022 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 FV1ldqlrI1P literal 0 HcmV?d00001 diff --git a/android/res/mipmap-xxhdpi/ic_launcher.png b/android/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..b3651fb3f242bde79eda867731fb9dd60db25f01 GIT binary patch literal 27543 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%0D7|V<@pQ+S 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 literal 0 HcmV?d00001 diff --git a/assets/favicon-128x128.png b/assets/favicon-128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..808a71a636cbd3293aa57d212e25b39c71690085 GIT binary patch literal 19939 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%0AaB+V^ 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
  • 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 literal 0 HcmV?d00001 diff --git a/assets/favicon-32x32.png b/assets/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..59d5a42323dc81f74ba69bad202dc5c033c50e96 GIT binary patch literal 1887 zcmV-l2cYRF&ow7GCb5alrIa*jjMb=(Hq=%_L7|H2L#RmJ3W~2mp;mn=qEHlk zu^2&+Vg-FD+Qv(SHhnR*v8L6u&CRB{G_fJ)oP92P@3rO}KFqcD+Gi(%3+7&X&NbJ# z{No>EjwO668s#O$y;`X*yY(JXFiXoe@SYSuR_qm7`MliZMXi!5h2RxRlJulRD%*r= zvsAZX2UZwT?uiDPlz9|TOFInETYE0WM24S{Vg0X z;VaU@BgxKT@`}NG+mjTwI9Y3<_D|EX|!2dLp=h$Wv{Tfp|7N^uj>Ko8eUwvvcFg`|JGp z?-`e`8nl268g+PJv*W>yj_)4p(L>OZxP6`&B0?0|g7eNE25h;f=fE*@?7xDzH7c9yk1W9B+>r!F& zXuPS2-&E5DaK?@`o|#eM>n|@e=9TLmgJ{gOgrA=3@bvvH{y7(T^*<^0x2hE@4kZJn zfIYzy55k(LibiXJv!FcHQI-lQI=g?mla0*LB=^Lplit&R_jPu)bUH)>h zhdIHiU}i{>erBLz1>w`0mLw4kh>xfaAmI}Vk8G(i+JYnJ7CFC=vvZBmaDnga9_8`f zErguiYaRc%(c|caB__s<{ab372Gpf=D^X5Ftkx7?!c#mf{)>ws$*8-h9Sb3Yy78-j zFLLnC7L!dle0HA0XWHC0F6`gb%*&S*QZNJhE-F!G|a7OxKn9+<5WY5|`RN z0M?J!**i1Bs+!WyA}8m%yfN3K;WSmyLaAUywW+{XGzZC3dPpK;S+SgpWHD#gwC8Jg zjB#nX!>jX4EX9mN+oyPN!w8?-IKnr#Pmz;zVs43ZOUpcV$0%DSgl_EO`rN8UsY5j2 zMPqgF7k+EP168n)vv=(Tzql~ViEE3{@VpWtzkhF@AKkN#PB0Fgyh0W%oyVOFZM1lF z%M4GQx=zQs)HL}%prVg~$Hjhys;+bt9%KUQ1pRcu<&yCCi zlcSz)$XPu;!4Id7aPRE1JbKpw9=^Dj^X&y{PKlH?Ch0H??H|R(FpZcR>Ws{CKC-I8 znZ*w6FVBdyG#_EpwJaTzCMph?cQqe3a?wI=iNN z5Vzv;4%~R1%k_hxJxswY7ST>*6f>mp{E3S5yK{cyVlN`Bnne**g8qQPo zA%FDl(RYst6$#N4rIc5p|xrb2ohxTE8=<>IcN= zTP6eFgDqE<&8okTW<^6>NtVRuehvwqXhtLqrI;mM#mpmlztNY%vVw-7DaK`&Yz2g9 zS<_@7wTI1N#piI@^b;mzv=HA_X``$kPc+WQ2;DAGI1XzU7V3LNARzOOEfRaQsqK#S=C8ScSs)8g^ zDpjg_@nrOLnro_PNd#Xt$2n%W~kgg^O77MECcP?z7N}`jrw+sPHV&in1 z!OzxeC1mOuilp8a7NyfNBg#bSca+saP@QT_Z8N>Ih89i&Sg%J|K;jje zbn-L4bpjJ`oh*1_P1EpeWP^&ZQV?*ilVeRXD7AbVo??T>9k4+&7w)NtYDfYTaW#au z2o*xaa8t@QD@(p77`M_ksrbfkB#`4qI_CP}d4&nB54{ zolicfr`n+%mbPaeUA`8p1^gr4zixioU%GYpS>!=6dkq-G&(}99dR= z@QNbF=L8Wjq9j9b8uCSml^?mpu-G>YOXd3qm0<}c1A}@8pMqXn2 z^Io9?C*hx7tQn0U>p|_{ulChpfa4$U=&*eOetJ^9^35WW0P`08{HhG1U>r#J81*0V zcO!};c_xm`K&6lkgx&!1zK4aY9bdX3Y>v-?E@aQk+y#E5fz|1Py zoYI|B?2J-5C9{AiVm%U66qC{DAyKbH55$p$@H6SCMo}rYFv9!A zH*W57W~|)uoiXDPZ8mllS8TWZ&4)XD_R%qWU#-ddh6<<+yuPZ8oj0C_c{ETIW2Fg@ zlUZ3qDE_0B2`&~xhcVveYA2zs?I9?}2(^Pupd2c{^}d|T7Y)Dh&=@-qtO)_i2xaYX zOUl(3W&H6kboj<|6@T&LlB_4xb;!&yj7|j~YrK!OnURTHWiSpg4y;3rcUU!!b=?|k z9BR~uQ{&qaZ>3uOwpQxs&nY+WuzY^+80M5(92JT)j`3>6u0`QbZ|$(}P|0=QS>ujN zEISsVsvO2D6%iJS1bsYY94ZcD97x?lJirW5j9B$b2CQKfV;svB6beQh;1F?P0*_NM zUa;1Vcb_X9UaC29vSeYPZ0IYF3Pa8HKV$gH2ReM{9U0f|Gz?D^{P)p{J=^>i8RPsM z#w#Beg4CW?8yft31E&iNd7$z0z<&&ilZfGl#I*b;G^GNW(7EZU??0MJsbK~%CG&$Dt~_CEc2Og*W*L5il#=I zi1iJ5LXBb!I2D>>S?FO}TqWVuI4{^LSO-}W!i;anDo&JM*KyAkUH;|OF<<)ekmb_x zuFZy{YmTFB~CgT}4CqL=qk1Ji#Y?WU9f`iJt2H z1KY;bh(nQ7S>GP97yB9GsH>WHZ?$xc<5wO$#j|H?q~rL5t7h1}D2Q=XRmGKCEcaaA z#pKGPM+$C#@Dz(ZVb`Leu4+s+X}m@s>kTE=C)9~tWgTK8gp#l%qD`<&Z;?kxcwhuf zuDrZdan4+y4_?}3--(I>`09aGj;z(#j)H>&X9~V{u!fGKpTjk~dki|lk>wJTff#8B z@8lIIOoObDCy*BP=4;2aVVQ0BHtsh*(2A{{S1iwkvT(fboSZ-Txq0q;c9p+>aSdn1 z^94zKC^wkG@tMo}+;LH#&;Hk0_8+gvJ3?6~k{f^EaxHyomZ6@0NAxEif)Qz9g0%4$ zQ~U4MHBb`ca9Xo{Al!aYm#VJm_29|FYkcnMC4PQej?;>nj^o}v18&;U;r5GreE!N= zI;O@M$NRVBd}{A$_P<%sn}N#J+;MS_&3$m{^Fljk)X9OZ5u5xD`NDXdB?E%uaUnkL zw+TjZY@IXQc0m{LiLNtm*mrEijzPw*b8^quHifZNFH;NoGSfbhvQ^XqvHHw zMwMYz^X2Ex^37{D@`=Y!@Yqk6ctQL-rH7xWDU%7H488DL@{_V9jzWTxvosJ3TL&c*85+lYPVr zyOaIh%Q~@S)JKCP08Jl+M4&7koB9?93@gXl*h|hc&!Nl0O=S1H>rdxp>34jlW9V5A z&r?H3mYF8{M6`!9TOb7CGJfcvfd+I z44g6vu}q}3lr#sI&_#73l*e`rUHCXXI91e)oifM_>vPKsXA8dk!by%76{xb% z&A5B_CU&pyuu?jfsu}}qnOVmh!;0VBe+*-Mm07h_vfaQodBrC_z(7W%$!S-Kktqsn zhZ+$^IL&W{K512#J(eRt?>2tY~|aBm$>tPPI7du zY->=!_pd#lJ&QT}PK@Z~8AV#3(j*s75Wd#nnNJLDxuYqI0-`=lrX!6AP;=9^IsW$W z5>Ax4uAvS+PP>}>4!p^}Gi!Y7>a7$``OGt~^YpPHrfcct9`~6Tme&ftb$E#zwr$~w zH;%9>1-;BWe)PKtABnh6O7SX?i47$Y37w{BwI3+W;tF8>T*ig{oX1bDko62Db+gHt zfw@7>Q?H-liSq^=8J0YKY?;Aam%_Qg@P$HaY`4SCf#t6C&vWT}GVVWdE|0u%if(Rj z8iGkszJ*OhOE74J5b234If40H;D6f;s=DO*b7ncTR&aVWrjvmtnOntC;V`*yd|Yy> zsxi4x6DYbU#?*`z?z^dEU);8VqAJLZ;$x;iIC;v0FP_DM zw9#-To-U~vf6PpenrdiL_>EiUc;w9`vK*}SB@t^wc~E@XcSh+L@g%IF;7V?lN=tTb z+`y-^hZ!H+kHa#2=e@A>40kUaM6*6h6%=l%1>y}Pk@`qe7t(fRfp5g)qJ|Tj5oPRZ zHqT{j>SR3h#%U^7vpgCzEXEAWg0-roLdnBIVgW!bWJVcl&1zLrjtdGDxAHRP{7=%o z`rBkWrat-u7Ho;h3@#cj_@*{!&;Y4W7m|3Si|5Ydr9>NhJRa+!ou8jc28ox8D6-%XK`)rr1H_UV4OvbkUfZpI{c>W%$(d(3l z|AEfdJ^ZlVi7QWHbK^ZL1{8rHh0}ZAeb!7b0!!4PncQFf2>% z-+ck=IvFpmj_62QLh$_QuaCURty?zmp-t;JTUMyThEC1{hmZ5paKy*YU7%E75EE6l z4>t0y`7RrBxaNr$`N`Qc%;b5fi^hYXH>9R&hPOh}efVi@$|PY`s)^+T;*3D;9D~eq z#kxMZNFvM&b_!3OS>^27h^scOfQu|33FLvGX+(s8bRYeZCb&rq8m*tUDYb)Y@(o?2hX8b}=RhlU9fx3y zFk^&~Q~zQ_rsfLE>Bf3w^V+_Z+l5r7 zDeZ)@Qv;`6GZ!Qh()Md4HZC*n8KjjA5_*TTqe*gdg07*qoM6N<$f(Kk)fdBvi literal 0 HcmV?d00001 diff --git a/assets/favicon-64x64.png b/assets/favicon-64x64.png new file mode 100644 index 0000000000000000000000000000000000000000..e979620f6a4b0008399b95e7de73634cd1b8aadb GIT binary patch literal 6105 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

    P6KsAd%k|K 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 z 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 literal 0 HcmV?d00001 diff --git a/cmake/app_icon.rc.in b/cmake/app_icon.rc.in new file mode 100644 index 0000000..b754112 --- /dev/null +++ b/cmake/app_icon.rc.in @@ -0,0 +1 @@ +IDI_ICON1 ICON "@REWRITE_QT_APP_ICON@" diff --git a/cmake/rewrite_qt.desktop.in b/cmake/rewrite_qt.desktop.in new file mode 100644 index 0000000..8c2ec1c --- /dev/null +++ b/cmake/rewrite_qt.desktop.in @@ -0,0 +1,7 @@ +[Desktop Entry] +Type=Application +Name=Face Attendance +Exec=apprewrite_qt +Icon=rewrite_qt +Terminal=false +Categories=Utility; diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..1ff8188 --- /dev/null +++ b/main.cpp @@ -0,0 +1,46 @@ +#include +#include +#include +#include +#include + +#include "src/AppController.h" + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + QIcon appIcon(QStringLiteral(":/assets/favicon.ico")); + appIcon.addFile(QStringLiteral(":/assets/favicon-256x256.png")); + appIcon.addFile(QStringLiteral(":/assets/favicon-192x192.png")); + appIcon.addFile(QStringLiteral(":/assets/favicon-128x128.png")); + appIcon.addFile(QStringLiteral(":/assets/favicon-64x64.png")); + appIcon.addFile(QStringLiteral(":/assets/favicon-48x48.png")); + appIcon.addFile(QStringLiteral(":/assets/favicon-32x32.png")); + appIcon.addFile(QStringLiteral(":/assets/favicon-16x16.png")); + app.setWindowIcon(appIcon); + + QCoreApplication::setApplicationName("人脸识别考勤系统"); + QCoreApplication::setApplicationVersion("3.0.0"); + QCoreApplication::setOrganizationName("STM32 Face Recognition"); + QQuickStyle::setStyle("Basic"); + + AppController controller; + + QQmlApplicationEngine engine; + engine.rootContext()->setContextProperty("appController", &controller); + + const QUrl url(QStringLiteral("qrc:/qml/Main.qml")); + QObject::connect( + &engine, + &QQmlApplicationEngine::objectCreated, + &app, + [url](QObject *obj, const QUrl &objUrl) { + if (!obj && url == objUrl) { + QCoreApplication::exit(-1); + } + }, + Qt::QueuedConnection); + + engine.load(url); + return app.exec(); +} diff --git a/qml/Main.qml b/qml/Main.qml new file mode 100644 index 0000000..86b8a78 --- /dev/null +++ b/qml/Main.qml @@ -0,0 +1,2311 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts +import QtQuick.Dialogs + +ApplicationWindow { + id: window + width: 1560 + height: 920 + minimumWidth: 900 + minimumHeight: 620 + visible: true + title: "人脸识别考勤系统 - QML 管理端" + color: "#f6f7f9" + + readonly property color ink900: "#182230" + readonly property color ink700: "#475467" + readonly property color ink500: "#667085" + readonly property color lineColor: "#d8dde5" + readonly property color shellColor: "#f6f7f9" + readonly property color panelColor: "#f9fafb" + readonly property color panelStrong: "#ffffff" + readonly property color accentColor: "#b6543a" + readonly property color accentDeep: "#8e3f29" + readonly property color accentSoft: "#f4d6c8" + readonly property color tealColor: "#1f6f78" + readonly property color tealSoft: "#d7ecec" + readonly property color goldColor: "#aa7a1f" + readonly property color goldSoft: "#f5e8c6" + readonly property color successColor: "#1f7a4d" + readonly property color dangerColor: "#b9382f" + + property string statisticsPreset: "最近30天" + property int editingTimeSlotIndex: -1 + property string pendingDeleteFaceId: "" + property string toastMessage: "" + property bool toastVisible: false + property bool resizingWindow: false + property int currentPageIndex: 0 + property bool timeSlotsExpanded: false + property bool mappingsExpanded: false + readonly property bool compactLayout: width < 1460 + readonly property bool denseLayout: width < 1380 + readonly property bool narrowLayout: width < 1280 + readonly property bool slimLayout: width < 1040 + readonly property int sidebarWidth: slimLayout ? 0 : (compactLayout ? 212 : 240) + + font.family: "Microsoft YaHei UI" + + onWidthChanged: { + resizingWindow = true + resizeSettledTimer.restart() + } + + onHeightChanged: { + resizingWindow = true + resizeSettledTimer.restart() + } + + function switchPage(index) { + currentPageIndex = Math.max(0, Math.min(4, index)) + } + + Timer { + id: resizeSettledTimer + interval: 160 + repeat: false + onTriggered: resizingWindow = false + } + + component AppCard: Rectangle { + radius: 8 + color: panelStrong + border.color: lineColor + } + + component AppTextField: TextField { + id: control + implicitHeight: 42 + leftPadding: 14 + rightPadding: 14 + topPadding: 10 + bottomPadding: 10 + color: ink900 + selectedTextColor: "#ffffff" + selectionColor: accentColor + placeholderTextColor: "#98a2b3" + + background: Rectangle { + radius: 8 + color: "#ffffff" + border.width: control.activeFocus ? 2 : 1 + border.color: control.activeFocus ? accentColor : "#d6cec4" + } + } + + component AppComboBox: ComboBox { + id: control + implicitHeight: 42 + leftPadding: 14 + rightPadding: 32 + font.pixelSize: 13 + + delegate: ItemDelegate { + width: ListView.view.width + text: modelData + highlighted: control.highlightedIndex === index + } + + contentItem: Text { + leftPadding: 0 + rightPadding: 0 + text: control.displayText + font: control.font + color: ink900 + verticalAlignment: Text.AlignVCenter + elide: Text.ElideRight + } + + indicator: Label { + x: control.width - width - 12 + y: (control.height - height) / 2 + text: "⌄" + color: ink500 + font.pixelSize: 16 + } + + background: Rectangle { + radius: 8 + color: "#ffffff" + border.width: control.activeFocus ? 2 : 1 + border.color: control.activeFocus ? accentColor : "#d6cec4" + } + + popup: Popup { + y: control.height + 6 + width: control.width + padding: 6 + + background: Rectangle { + radius: 8 + color: "#ffffff" + border.color: lineColor + } + + contentItem: ListView { + implicitHeight: contentHeight + model: control.popup.visible ? control.delegateModel : null + currentIndex: control.highlightedIndex + clip: true + } + } + } + + component PrimaryButton: Button { + id: control + property color fillColor: accentColor + property color labelColor: "#fff7f2" + hoverEnabled: true + implicitHeight: 42 + implicitWidth: 112 + + background: Rectangle { + radius: 8 + color: control.down ? Qt.darker(control.fillColor, 1.12) + : control.hovered ? Qt.lighter(control.fillColor, 1.06) + : control.fillColor + } + + contentItem: Label { + text: control.text + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + color: control.labelColor + font.pixelSize: 13 + font.bold: true + } + } + + component SecondaryButton: Button { + id: control + property color fillColor: "#ffffff" + property color strokeColor: "#d6cec4" + property color labelColor: ink900 + hoverEnabled: true + implicitHeight: 42 + implicitWidth: 96 + + background: Rectangle { + radius: 8 + color: control.down ? "#efe6db" + : control.hovered ? "#f7f1ea" + : control.fillColor + border.color: control.hovered ? accentSoft : control.strokeColor + } + + contentItem: Label { + text: control.text + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + color: control.labelColor + font.pixelSize: 13 + font.bold: true + } + } + + component DangerButton: PrimaryButton { + fillColor: dangerColor + labelColor: "#fff5f4" + } + + component AppCheckBox: CheckBox { + id: control + spacing: 10 + indicator: Rectangle { + implicitWidth: 20 + implicitHeight: 20 + radius: 6 + color: control.checked ? accentColor : "#ffffff" + border.width: 1 + border.color: control.checked ? accentColor : "#cfc6bc" + + Rectangle { + anchors.centerIn: parent + width: 8 + height: 8 + radius: 4 + color: "#fff7f2" + visible: control.checked + } + } + + contentItem: Text { + text: control.text + color: ink700 + font: control.font + verticalAlignment: Text.AlignVCenter + leftPadding: control.indicator.width + control.spacing + } + } + + component AppScrollBar: ScrollBar { + id: control + implicitWidth: 12 + policy: ScrollBar.AsNeeded + + contentItem: Rectangle { + implicitWidth: 8 + radius: 4 + color: control.pressed ? accentColor : "#cfbeb1" + opacity: control.active ? 0.9 : 0.55 + } + + background: Item {} + } + + component EmptyState: Item { + property string title: "" + property string description: "" + property string badgeText: "" + property color accent: accentColor + + implicitWidth: 320 + implicitHeight: 220 + z: 20 + + Rectangle { + anchors.centerIn: parent + width: Math.min(parent.width, 320) + height: 200 + radius: 8 + color: "#fffaf4" + border.color: "#e7ddd2" + + Column { + anchors.centerIn: parent + spacing: 12 + width: parent.width - 40 + + Rectangle { + width: 64 + height: 64 + radius: 8 + color: Qt.tint("#ffffff", Qt.rgba(accent.r, accent.g, accent.b, 0.16)) + anchors.horizontalCenter: parent.horizontalCenter + + Label { + anchors.centerIn: parent + text: badgeText + color: accent + font.pixelSize: 22 + font.bold: true + } + } + + Label { + width: parent.width + text: title + horizontalAlignment: Text.AlignHCenter + wrapMode: Text.WordWrap + color: ink900 + font.pixelSize: 20 + font.bold: true + } + + Label { + width: parent.width + text: description + horizontalAlignment: Text.AlignHCenter + wrapMode: Text.WordWrap + color: ink500 + font.pixelSize: 13 + } + } + } + } + + component InfoChip: Rectangle { + property string textValue: "" + property color tintColor: accentColor + + implicitHeight: 30 + implicitWidth: chipLabel.implicitWidth + 18 + radius: 15 + color: Qt.tint("#ffffff", Qt.rgba(tintColor.r, tintColor.g, tintColor.b, 0.16)) + border.color: Qt.tint("#ffffff", Qt.rgba(tintColor.r, tintColor.g, tintColor.b, 0.34)) + + Label { + id: chipLabel + anchors.centerIn: parent + text: parent.textValue + color: parent.tintColor + font.pixelSize: 11 + font.bold: true + } + } + + component SectionHeader: Item { + id: sectionHeader + property string title: "" + property string description: "" + property color accent: accentColor + + implicitHeight: descriptionLabel.visible ? 52 : 32 + implicitWidth: 300 + + RowLayout { + anchors.fill: parent + spacing: 12 + + Rectangle { + Layout.preferredWidth: 6 + Layout.fillHeight: true + radius: 3 + color: sectionHeader.accent + } + + ColumnLayout { + Layout.fillWidth: true + spacing: 2 + + Label { + Layout.fillWidth: true + text: sectionHeader.title + font.pixelSize: 22 + font.bold: true + color: ink900 + wrapMode: Text.WordWrap + } + + Label { + id: descriptionLabel + Layout.fillWidth: true + visible: text.length > 0 + text: sectionHeader.description + color: ink500 + font.pixelSize: 12 + wrapMode: Text.WordWrap + } + } + } + } + + component SegmentTabButton: TabButton { + id: control + implicitHeight: 40 + padding: 0 + + background: Rectangle { + radius: 8 + color: control.checked ? tealColor : "#ffffff" + border.width: 1 + border.color: control.checked ? tealColor : "#d6cec4" + } + + contentItem: Label { + text: control.text + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + color: control.checked ? "#f6fbfb" : ink700 + font.pixelSize: 13 + font.bold: true + elide: Text.ElideRight + } + } + + function applyRecordFilters() { + appController.applyFilters( + classFilter.currentText, + studentFilter.currentText, + nameFilter.text, + dateFilter.currentIndex, + specificDateField.text) + } + + function applyStatisticsPreset() { + const today = new Date() + let start = new Date(today) + let end = new Date(today) + + if (statisticsPreset === "今天") { + start = new Date(today) + } else if (statisticsPreset === "最近7天") { + start.setDate(start.getDate() - 7) + } else if (statisticsPreset === "最近30天") { + start.setDate(start.getDate() - 30) + } else if (statisticsPreset === "本月") { + start = new Date(today.getFullYear(), today.getMonth(), 1) + } + + statsStartField.text = Qt.formatDate(start, "yyyy-MM-dd") + statsEndField.text = Qt.formatDate(end, "yyyy-MM-dd") + appController.updateStatisticsRange(statsStartField.text, statsEndField.text) + } + + function openTimeSlotDialog(index) { + editingTimeSlotIndex = index + if (index >= 0) { + const item = appController.timeSlotModel.get(index) + timeSlotNameField.text = item.name + timeSlotStartField.text = item.startTime + timeSlotEndField.text = item.endTime + timeSlotEnabledBox.checked = item.enabled + timeSlotDialog.title = "编辑时间段" + } else { + timeSlotNameField.text = "" + timeSlotStartField.text = "08:00" + timeSlotEndField.text = "09:30" + timeSlotEnabledBox.checked = true + timeSlotDialog.title = "新增时间段" + } + timeSlotDialog.open() + } + + function saveTimeSlotDialog() { + if (editingTimeSlotIndex >= 0) { + appController.timeSlotModel.updateTimeSlot( + editingTimeSlotIndex, + timeSlotNameField.text, + timeSlotStartField.text, + timeSlotEndField.text, + timeSlotEnabledBox.checked) + } else { + appController.timeSlotModel.addTimeSlot( + timeSlotNameField.text, + timeSlotStartField.text, + timeSlotEndField.text, + timeSlotEnabledBox.checked) + } + appController.saveTimeSlots() + } + + Component.onCompleted: { + applyRecordFilters() + applyStatisticsPreset() + } + + Connections { + target: appController + + function onStatusMessageChanged() { + if (!appController.statusMessage || appController.statusMessage.length === 0) { + return + } + toastMessage = appController.statusMessage + toastVisible = true + toastTimer.restart() + } + } + + Timer { + id: toastTimer + interval: 2600 + repeat: false + onTriggered: toastVisible = false + } + + background: Rectangle { + color: shellColor + } + + FileDialog { + id: recordExportDialog + fileMode: FileDialog.SaveFile + nameFilters: ["CSV 文件 (*.csv)"] + currentFile: "attendance_export.csv" + onAccepted: appController.exportFilteredRecords(selectedFile) + } + + FileDialog { + id: statisticsExportDialog + fileMode: FileDialog.SaveFile + nameFilters: ["CSV 文件 (*.csv)"] + currentFile: "attendance_statistics.csv" + onAccepted: appController.exportStatistics(selectedFile) + } + + Dialog { + id: clearDialog + title: "确认清空" + modal: true + anchors.centerIn: Overlay.overlay + width: 440 + standardButtons: Dialog.Yes | Dialog.No + + background: Rectangle { + radius: 20 + color: panelStrong + border.color: lineColor + } + + enter: Transition { + ParallelAnimation { + NumberAnimation { property: "opacity"; from: 0; to: 1; duration: 150 } + NumberAnimation { property: "scale"; from: 0.96; to: 1.0; duration: 180; easing.type: Easing.OutCubic } + } + } + + exit: Transition { + ParallelAnimation { + NumberAnimation { property: "opacity"; from: 1; to: 0; duration: 120 } + NumberAnimation { property: "scale"; from: 1.0; to: 0.98; duration: 120 } + } + } + + contentItem: ColumnLayout { + spacing: 14 + + Label { + text: "确定要清空服务器上的所有签到记录吗?" + font.pixelSize: 20 + font.bold: true + color: ink900 + } + + Label { + text: "该操作不可恢复,建议先导出数据备份。" + wrapMode: Text.WordWrap + color: ink700 + } + } + + onAccepted: appController.clearAllRecords() + } + + Dialog { + id: timeSlotDialog + modal: true + anchors.centerIn: Overlay.overlay + width: 420 + standardButtons: Dialog.Save | Dialog.Cancel + + background: Rectangle { + radius: 20 + color: panelStrong + border.color: lineColor + } + + enter: Transition { + ParallelAnimation { + NumberAnimation { property: "opacity"; from: 0; to: 1; duration: 150 } + NumberAnimation { property: "scale"; from: 0.96; to: 1.0; duration: 180; easing.type: Easing.OutCubic } + } + } + + exit: Transition { + ParallelAnimation { + NumberAnimation { property: "opacity"; from: 1; to: 0; duration: 120 } + NumberAnimation { property: "scale"; from: 1.0; to: 0.98; duration: 120 } + } + } + + contentItem: ColumnLayout { + spacing: 12 + + AppTextField { + id: timeSlotNameField + Layout.fillWidth: true + placeholderText: "时段名称" + } + + AppTextField { + id: timeSlotStartField + Layout.fillWidth: true + placeholderText: "开始时间,例如 08:00" + } + + AppTextField { + id: timeSlotEndField + Layout.fillWidth: true + placeholderText: "结束时间,例如 09:30" + } + + AppCheckBox { + id: timeSlotEnabledBox + text: "启用此时段" + } + } + + onAccepted: saveTimeSlotDialog() + } + + Dialog { + id: deleteFaceDialog + modal: true + anchors.centerIn: Overlay.overlay + width: 430 + title: "删除人脸信息" + standardButtons: Dialog.Yes | Dialog.No + + background: Rectangle { + radius: 20 + color: panelStrong + border.color: lineColor + } + + enter: Transition { + ParallelAnimation { + NumberAnimation { property: "opacity"; from: 0; to: 1; duration: 150 } + NumberAnimation { property: "scale"; from: 0.96; to: 1.0; duration: 180; easing.type: Easing.OutCubic } + } + } + + exit: Transition { + ParallelAnimation { + NumberAnimation { property: "opacity"; from: 1; to: 0; duration: 120 } + NumberAnimation { property: "scale"; from: 1.0; to: 0.98; duration: 120 } + } + } + + contentItem: ColumnLayout { + spacing: 12 + + Label { + text: "确定删除 ID 为 " + pendingDeleteFaceId + " 的人脸信息吗?" + wrapMode: Text.WordWrap + font.pixelSize: 18 + font.bold: true + color: ink900 + } + + AppCheckBox { + id: deleteFaceRecordsCheck + text: "同时删除该学生的所有考勤记录" + checked: false + } + } + + onAccepted: appController.deleteFace(pendingDeleteFaceId, deleteFaceRecordsCheck.checked) + } + + Rectangle { + anchors.fill: parent + anchors.margins: slimLayout ? 8 : 16 + radius: 12 + color: "#ffffff" + border.color: "#dbd6ce" + + RowLayout { + anchors.fill: parent + anchors.margins: slimLayout ? 10 : 16 + spacing: slimLayout ? 0 : 16 + + Rectangle { + visible: !slimLayout + Layout.preferredWidth: visible ? sidebarWidth : 0 + Layout.maximumWidth: visible ? sidebarWidth : 0 + Layout.fillHeight: true + radius: 12 + color: "#15323d" + + ColumnLayout { + anchors.fill: parent + anchors.margins: 18 + spacing: 16 + + Rectangle { + Layout.fillWidth: true + Layout.preferredHeight: compactLayout ? 74 : 86 + radius: 8 + color: "#214654" + + Label { + anchors.centerIn: parent + text: "管理端" + font.pixelSize: compactLayout ? 24 : 28 + font.bold: true + color: "#ffffff" + } + } + + ColumnLayout { + Layout.fillWidth: true + spacing: 8 + + Repeater { + model: [ + { title: "考勤记录", hint: "查看筛选与导出", icon: "01" }, + { title: "统计分析", hint: "按时间统计趋势", icon: "02" }, + { title: "配置中心", hint: "时间段与映射设置", icon: "03" }, + { title: "人脸管理", hint: "照片与学号绑定", icon: "04" }, + { title: "关于", hint: "系统说明", icon: "05" } + ] + + delegate: Rectangle { + id: navButton + required property var modelData + required property int index + readonly property bool selected: window.currentPageIndex === navButton.index + Layout.fillWidth: true + Layout.preferredHeight: 74 + radius: 8 + color: selected ? "#eef7f7" + : navMouse.containsMouse ? "#214957" + : "#173743" + border.width: 1 + border.color: selected ? "#9fd4d7" + : navMouse.containsMouse ? "#3b6470" + : "#254a55" + + Behavior on color { enabled: !resizingWindow; ColorAnimation { duration: 120 } } + Behavior on border.color { enabled: !resizingWindow; ColorAnimation { duration: 120 } } + + Rectangle { + anchors.right: parent.right + anchors.rightMargin: 6 + anchors.verticalCenter: parent.verticalCenter + width: 4 + height: navButton.selected ? 42 : 0 + radius: 2 + color: tealColor + opacity: navButton.selected ? 1 : 0 + + Behavior on height { enabled: !resizingWindow; NumberAnimation { duration: 150 } } + Behavior on opacity { enabled: !resizingWindow; NumberAnimation { duration: 120 } } + } + + RowLayout { + anchors.fill: parent + anchors.leftMargin: 16 + anchors.rightMargin: 24 + spacing: compactLayout ? 10 : 12 + + Rectangle { + Layout.preferredWidth: 38 + Layout.preferredHeight: 38 + radius: 8 + color: navButton.selected ? tealSoft : "#2a515d" + + Label { + anchors.centerIn: parent + text: modelData.icon + color: navButton.selected ? tealColor : "#d6e4e9" + font.bold: true + } + } + + ColumnLayout { + Layout.fillWidth: true + spacing: 2 + + Label { + Layout.fillWidth: true + text: modelData.title + color: navButton.selected ? ink900 : "#f4fbff" + font.pixelSize: compactLayout ? 14 : 15 + font.bold: true + horizontalAlignment: Text.AlignLeft + } + + Label { + Layout.fillWidth: true + text: modelData.hint + visible: !denseLayout + color: navButton.selected ? ink500 : "#adc4cc" + font.pixelSize: compactLayout ? 10 : 11 + horizontalAlignment: Text.AlignLeft + } + } + } + + MouseArea { + id: navMouse + anchors.fill: parent + z: 20 + cursorShape: Qt.PointingHandCursor + hoverEnabled: true + preventStealing: true + onPressed: window.switchPage(navButton.index) + onClicked: window.switchPage(navButton.index) + } + } + } + } + + Item { Layout.fillHeight: true } + + PrimaryButton { + Layout.fillWidth: true + text: "刷新全部数据" + onClicked: appController.refreshAll() + } + } + } + + Rectangle { + Layout.fillWidth: true + Layout.fillHeight: true + radius: 26 + color: "transparent" + + ColumnLayout { + anchors.fill: parent + spacing: 16 + + Rectangle { + Layout.fillWidth: true + Layout.preferredHeight: slimLayout ? 96 : 142 + radius: 8 + color: panelStrong + border.color: lineColor + clip: true + + RowLayout { + anchors.fill: parent + anchors.margins: slimLayout ? 14 : 20 + spacing: 18 + + ColumnLayout { + Layout.fillWidth: true + Layout.alignment: Qt.AlignVCenter + spacing: 6 + + Label { + text: ["考勤记录总览", "统计分析面板", "配置与同步中心", "人脸资料管理", "关于"][window.currentPageIndex] + font.pixelSize: slimLayout ? 20 : (compactLayout ? 24 : 28) + font.bold: true + color: ink900 + } + + Label { + visible: !slimLayout + text: ["筛选记录、导出数据并快速查看考勤状态。", + "按时间区间查看签到情况,导出统计报表。", + "集中管理时间段、映射配置和连接信息。", + "同步照片、调整学号映射并执行删除操作。", + "了解系统用途、功能范围和运行信息。"][window.currentPageIndex] + color: ink500 + font.pixelSize: compactLayout ? 12 : 13 + } + + Flow { + visible: !slimLayout + Layout.fillWidth: true + spacing: 8 + + InfoChip { + textValue: ["实时筛选", "区间统计", "配置同步", "人脸映射", "系统说明"][window.currentPageIndex] + tintColor: [accentColor, goldColor, tealColor, accentColor, tealColor][window.currentPageIndex] + } + + InfoChip { + textValue: compactLayout ? "紧凑布局" : "桌面布局" + tintColor: tealColor + } + } + } + + Flow { + Layout.alignment: Qt.AlignRight | Qt.AlignVCenter + Layout.preferredWidth: implicitWidth + spacing: compactLayout ? 8 : 10 + + PrimaryButton { + visible: window.currentPageIndex === 0 + text: "导出当前结果" + onClicked: recordExportDialog.open() + } + + SecondaryButton { + visible: window.currentPageIndex === 1 + text: "导出统计报表" + onClicked: statisticsExportDialog.open() + } + + SecondaryButton { + visible: window.currentPageIndex === 2 + text: "测试连接" + onClicked: appController.testConnection() + } + + SecondaryButton { + visible: window.currentPageIndex === 3 + text: "刷新人脸库" + onClicked: appController.refreshFaces() + } + } + } + } + + TabBar { + id: navigationBar + visible: slimLayout + Layout.fillWidth: true + Layout.preferredHeight: visible ? implicitHeight : 0 + currentIndex: window.currentPageIndex + onCurrentIndexChanged: window.switchPage(currentIndex) + + TabButton { text: "考勤记录" } + TabButton { text: "统计分析" } + TabButton { text: "配置中心" } + TabButton { text: "人脸管理" } + TabButton { text: "关于" } + } + + StackLayout { + id: pageLayout + Layout.fillWidth: true + Layout.fillHeight: true + currentIndex: window.currentPageIndex + + Item { + Layout.fillWidth: true + Layout.fillHeight: true + visible: StackLayout.isCurrentItem + opacity: StackLayout.isCurrentItem ? 1 : 0 + scale: resizingWindow || StackLayout.isCurrentItem ? 1 : 0.985 + Behavior on opacity { enabled: !resizingWindow; NumberAnimation { duration: 140 } } + Behavior on scale { enabled: !resizingWindow; NumberAnimation { duration: 180; easing.type: Easing.OutCubic } } + + ColumnLayout { + anchors.fill: parent + spacing: 14 + + GridLayout { + Layout.fillWidth: true + columns: slimLayout ? 3 : (compactLayout ? 1 : 3) + rowSpacing: 10 + columnSpacing: compactLayout ? 10 : 14 + + Rectangle { + Layout.fillWidth: true + Layout.preferredHeight: 82 + radius: 8 + color: panelStrong + border.color: lineColor + clip: true + + Column { + anchors.fill: parent + anchors.topMargin: slimLayout ? 12 : 18 + anchors.bottomMargin: slimLayout ? 12 : 18 + anchors.leftMargin: slimLayout ? 34 : 44 + anchors.rightMargin: slimLayout ? 12 : 18 + spacing: 6 + Label { text: "总记录数"; color: ink500 } + Label { + text: appController.totalRecords + font.pixelSize: slimLayout ? 22 : (compactLayout ? 30 : 34) + font.bold: true + color: ink900 + } + } + + Rectangle { + anchors.left: parent.left + anchors.leftMargin: slimLayout ? 12 : 18 + anchors.verticalCenter: parent.verticalCenter + width: 6 + height: Math.min(parent.height - 18, 64) + radius: 3 + color: accentColor + } + } + + Rectangle { + Layout.fillWidth: true + Layout.preferredHeight: 82 + radius: 8 + color: panelStrong + border.color: lineColor + clip: true + + Column { + anchors.fill: parent + anchors.topMargin: slimLayout ? 12 : 18 + anchors.bottomMargin: slimLayout ? 12 : 18 + anchors.leftMargin: slimLayout ? 34 : 44 + anchors.rightMargin: slimLayout ? 12 : 18 + spacing: 6 + Label { text: "今日签到"; color: ink500 } + Label { + text: appController.todayRecords + font.pixelSize: slimLayout ? 22 : (compactLayout ? 30 : 34) + font.bold: true + color: tealColor + } + } + + Rectangle { + anchors.left: parent.left + anchors.leftMargin: slimLayout ? 12 : 18 + anchors.verticalCenter: parent.verticalCenter + width: 6 + height: Math.min(parent.height - 18, 64) + radius: 3 + color: tealColor + } + } + + Rectangle { + Layout.fillWidth: true + Layout.preferredHeight: 82 + radius: 8 + color: panelStrong + border.color: lineColor + clip: true + + Column { + anchors.fill: parent + anchors.topMargin: slimLayout ? 12 : 18 + anchors.bottomMargin: slimLayout ? 12 : 18 + anchors.leftMargin: slimLayout ? 34 : 44 + anchors.rightMargin: slimLayout ? 12 : 18 + spacing: 6 + Label { text: "筛选结果"; color: ink500 } + Label { + text: appController.filteredCount + " / " + appController.loadedRecords + font.pixelSize: slimLayout ? 20 : (compactLayout ? 26 : 30) + font.bold: true + color: goldColor + } + } + + Rectangle { + anchors.left: parent.left + anchors.leftMargin: slimLayout ? 12 : 18 + anchors.verticalCenter: parent.verticalCenter + width: 6 + height: Math.min(parent.height - 18, 64) + radius: 3 + color: goldColor + } + } + } + + Rectangle { + Layout.fillWidth: true + radius: 8 + color: panelStrong + border.color: lineColor + Layout.preferredHeight: slimLayout ? 174 : 92 + clip: true + + GridLayout { + anchors.fill: parent + anchors.margins: slimLayout ? 12 : 14 + columns: slimLayout ? 2 : (dateFilter.currentIndex === 4 ? 6 : 5) + columnSpacing: 12 + rowSpacing: 12 + + Column { + Layout.preferredWidth: 150 + width: 150 + spacing: 6 + Label { text: "班级"; color: ink700; font.bold: true; font.pixelSize: 12 } + AppComboBox { + id: classFilter + width: parent.width + model: appController.classOptions + onCurrentTextChanged: applyRecordFilters() + } + } + + Column { + Layout.preferredWidth: 160 + width: 160 + spacing: 6 + Label { text: "学号"; color: ink700; font.bold: true; font.pixelSize: 12 } + AppComboBox { + id: studentFilter + width: parent.width + model: appController.studentOptions + onCurrentTextChanged: applyRecordFilters() + } + } + + Column { + Layout.preferredWidth: 190 + width: 190 + spacing: 6 + Label { text: "姓名"; color: ink700; font.bold: true; font.pixelSize: 12 } + AppTextField { + id: nameFilter + width: parent.width + placeholderText: "输入姓名关键字" + onTextChanged: applyRecordFilters() + } + } + + Column { + Layout.preferredWidth: 160 + width: 160 + spacing: 6 + Label { text: "日期"; color: ink700; font.bold: true; font.pixelSize: 12 } + AppComboBox { + id: dateFilter + width: parent.width + model: ["全部时间", "今天", "最近7天", "最近30天", "指定日期"] + currentIndex: 0 + onCurrentIndexChanged: applyRecordFilters() + } + } + + Column { + Layout.preferredWidth: 150 + width: dateFilter.currentIndex === 4 ? 150 : 0 + height: dateFilter.currentIndex === 4 ? implicitHeight : 0 + visible: dateFilter.currentIndex === 4 + spacing: 6 + Label { text: "指定日期"; color: ink700; font.bold: true; font.pixelSize: 12 } + AppTextField { + id: specificDateField + width: parent.width + text: Qt.formatDate(new Date(), "yyyy-MM-dd") + placeholderText: "yyyy-MM-dd" + onTextChanged: if (visible) applyRecordFilters() + } + } + + Row { + Layout.alignment: Qt.AlignBottom + height: 42 + spacing: 8 + + SecondaryButton { + text: "刷新" + onClicked: appController.refreshRecords() + } + + PrimaryButton { + text: "导出" + fillColor: tealColor + onClicked: recordExportDialog.open() + } + + DangerButton { + text: "清空记录" + onClicked: clearDialog.open() + } + } + } + } + + Rectangle { + id: recordTableCard + Layout.fillWidth: true + Layout.fillHeight: true + Layout.minimumHeight: slimLayout ? 220 : 0 + radius: 8 + color: panelStrong + border.color: lineColor + property real timeColWidth: Math.max(168, Math.min(220, width * 0.21)) + property real classColWidth: Math.max(88, Math.min(124, width * 0.11)) + property real studentColWidth: Math.max(86, Math.min(116, width * 0.10)) + property real nameColWidth: Math.max(118, Math.min(158, width * 0.14)) + property real confidenceColWidth: Math.max(96, Math.min(126, width * 0.11)) + property real statusColWidth: Math.max(84, Math.min(102, width * 0.09)) + property bool showClassColumn: !denseLayout + property bool showConfidenceColumn: !narrowLayout + + ColumnLayout { + anchors.fill: parent + anchors.margins: 16 + spacing: 8 + + Rectangle { + Layout.fillWidth: true + Layout.preferredHeight: 40 + radius: 8 + color: "#eef2f6" + + RowLayout { + anchors.fill: parent + anchors.leftMargin: 16 + anchors.rightMargin: 16 + spacing: 12 + + Label { text: "签到时间"; Layout.preferredWidth: recordTableCard.timeColWidth; font.bold: true; color: ink900 } + Label { + text: "班级" + visible: recordTableCard.showClassColumn + Layout.preferredWidth: recordTableCard.classColWidth + font.bold: true + color: ink900 + } + Label { text: "学号"; Layout.preferredWidth: recordTableCard.studentColWidth; font.bold: true; color: ink900 } + Label { text: "姓名"; Layout.preferredWidth: recordTableCard.nameColWidth; font.bold: true; color: ink900 } + Label { + text: "置信度" + visible: recordTableCard.showConfidenceColumn + Layout.preferredWidth: recordTableCard.confidenceColWidth + font.bold: true + color: ink900 + } + Label { text: "状态"; Layout.preferredWidth: recordTableCard.statusColWidth; font.bold: true; color: ink900 } + Item { Layout.fillWidth: true } + } + } + + Item { + Layout.fillWidth: true + Layout.fillHeight: true + + ListView { + id: recordListView + anchors.fill: parent + clip: true + spacing: 4 + model: appController.recordModel + + delegate: Rectangle { + width: ListView.view.width + height: 44 + property bool hovered: recordHoverHandler.hovered + radius: 8 + color: hovered ? "#f6f9fc" : (index % 2 === 0 ? "#ffffff" : "#fafbfc") + border.color: hovered ? "#cbd5e1" : "#edf0f3" + + Behavior on color { enabled: !resizingWindow; ColorAnimation { duration: 120 } } + Behavior on border.color { enabled: !resizingWindow; ColorAnimation { duration: 120 } } + + HoverHandler { id: recordHoverHandler } + + RowLayout { + anchors.fill: parent + anchors.leftMargin: 16 + anchors.rightMargin: 16 + spacing: 12 + + Label { text: model.timestamp; Layout.preferredWidth: recordTableCard.timeColWidth; color: ink900; elide: Text.ElideRight } + Label { + text: model.className + visible: recordTableCard.showClassColumn + Layout.preferredWidth: recordTableCard.classColWidth + color: ink700 + } + Label { text: model.studentId; Layout.preferredWidth: recordTableCard.studentColWidth; color: ink700; elide: Text.ElideRight } + Label { text: model.name; Layout.preferredWidth: recordTableCard.nameColWidth; color: ink900; font.bold: true; elide: Text.ElideRight } + Label { + text: model.confidenceText + visible: recordTableCard.showConfidenceColumn + Layout.preferredWidth: recordTableCard.confidenceColWidth + color: ink700 + } + Rectangle { + Layout.preferredWidth: recordTableCard.statusColWidth + Layout.preferredHeight: 26 + radius: 8 + color: model.success ? "#dbeedb" : "#f6d9d4" + + Label { + anchors.centerIn: parent + text: model.statusText + color: model.success ? successColor : dangerColor + font.bold: true + } + } + Item { Layout.fillWidth: true } + } + } + + ScrollBar.vertical: AppScrollBar {} + } + + EmptyState { + anchors.centerIn: parent + visible: recordListView.count === 0 + title: "没有匹配记录" + description: "试着放宽筛选条件,或者先点击顶部按钮刷新最新数据。" + badgeText: "00" + accent: accentColor + } + } + } + } + } + } + + Item { + Layout.fillWidth: true + Layout.fillHeight: true + visible: StackLayout.isCurrentItem + opacity: StackLayout.isCurrentItem ? 1 : 0 + scale: resizingWindow || StackLayout.isCurrentItem ? 1 : 0.985 + Behavior on opacity { enabled: !resizingWindow; NumberAnimation { duration: 140 } } + Behavior on scale { enabled: !resizingWindow; NumberAnimation { duration: 180; easing.type: Easing.OutCubic } } + + ColumnLayout { + anchors.fill: parent + spacing: 14 + + Rectangle { + Layout.fillWidth: true + radius: 8 + color: panelStrong + border.color: lineColor + Layout.preferredHeight: slimLayout ? 150 : 78 + clip: true + + GridLayout { + id: statisticsFilterGrid + anchors.fill: parent + anchors.margins: slimLayout ? 12 : 18 + columns: slimLayout ? 2 : 5 + rowSpacing: 10 + columnSpacing: 12 + + AppComboBox { + id: quickStatisticsFilter + Layout.preferredWidth: 150 + model: ["今天", "最近7天", "最近30天", "本月"] + currentIndex: 2 + onCurrentTextChanged: { + statisticsPreset = currentText + applyStatisticsPreset() + } + } + + AppTextField { + id: statsStartField + Layout.preferredWidth: 150 + placeholderText: "开始日期" + onEditingFinished: appController.updateStatisticsRange(text, statsEndField.text) + } + + AppTextField { + id: statsEndField + Layout.preferredWidth: 150 + placeholderText: "结束日期" + onEditingFinished: appController.updateStatisticsRange(statsStartField.text, text) + } + + SecondaryButton { + text: "刷新统计" + onClicked: appController.updateStatisticsRange(statsStartField.text, statsEndField.text) + } + + PrimaryButton { + text: "导出统计报表" + onClicked: statisticsExportDialog.open() + } + } + } + + GridLayout { + Layout.fillWidth: true + columns: slimLayout ? 3 : (compactLayout ? 1 : 3) + rowSpacing: 10 + columnSpacing: 14 + + Rectangle { + Layout.fillWidth: true + Layout.preferredHeight: slimLayout ? 74 : 100 + radius: 8 + color: panelStrong + border.color: lineColor + clip: true + + Column { + anchors.fill: parent + anchors.topMargin: slimLayout ? 12 : 18 + anchors.bottomMargin: slimLayout ? 12 : 18 + anchors.leftMargin: slimLayout ? 34 : 44 + anchors.rightMargin: slimLayout ? 12 : 18 + spacing: 6 + Label { text: "统计学生数"; color: ink500 } + Label { text: appController.statisticsStudentCount; font.pixelSize: slimLayout ? 22 : (compactLayout ? 28 : 32); font.bold: true; color: ink900 } + } + + Rectangle { + anchors.left: parent.left + anchors.leftMargin: slimLayout ? 12 : 18 + anchors.verticalCenter: parent.verticalCenter + width: 6 + height: Math.min(parent.height - 28, 64) + radius: 3 + color: accentColor + } + } + + Rectangle { + Layout.fillWidth: true + Layout.preferredHeight: slimLayout ? 74 : 100 + radius: 8 + color: panelStrong + border.color: lineColor + clip: true + + Column { + anchors.fill: parent + anchors.topMargin: slimLayout ? 12 : 18 + anchors.bottomMargin: slimLayout ? 12 : 18 + anchors.leftMargin: slimLayout ? 34 : 44 + anchors.rightMargin: slimLayout ? 12 : 18 + spacing: 6 + Label { text: "统计记录数"; color: ink500 } + Label { text: appController.statisticsRecordCount; font.pixelSize: slimLayout ? 22 : (compactLayout ? 28 : 32); font.bold: true; color: tealColor } + } + + Rectangle { + anchors.left: parent.left + anchors.leftMargin: slimLayout ? 12 : 18 + anchors.verticalCenter: parent.verticalCenter + width: 6 + height: Math.min(parent.height - 28, 64) + radius: 3 + color: tealColor + } + } + + Rectangle { + Layout.fillWidth: true + Layout.preferredHeight: slimLayout ? 74 : 100 + radius: 8 + color: panelStrong + border.color: lineColor + clip: true + + Column { + anchors.fill: parent + anchors.topMargin: slimLayout ? 12 : 18 + anchors.bottomMargin: slimLayout ? 12 : 18 + anchors.leftMargin: slimLayout ? 34 : 44 + anchors.rightMargin: slimLayout ? 12 : 18 + spacing: 6 + Label { text: "统计范围"; color: ink500 } + Label { + text: appController.statisticsRangeText + font.pixelSize: slimLayout ? 14 : (compactLayout ? 18 : 20) + font.bold: true + color: goldColor + } + } + + Rectangle { + anchors.left: parent.left + anchors.leftMargin: slimLayout ? 12 : 18 + anchors.verticalCenter: parent.verticalCenter + width: 6 + height: Math.min(parent.height - 28, 64) + radius: 3 + color: goldColor + } + } + } + + Rectangle { + id: statisticsTableCard + Layout.fillWidth: true + Layout.fillHeight: true + Layout.minimumHeight: slimLayout ? 220 : 0 + radius: 8 + color: panelStrong + border.color: lineColor + property real studentColWidth: Math.max(90, Math.min(128, width * 0.12)) + property real nameColWidth: Math.max(128, Math.min(188, width * 0.17)) + property real totalColWidth: Math.max(96, Math.min(124, width * 0.12)) + property real todayColWidth: Math.max(92, Math.min(110, width * 0.10)) + property real lastColWidth: Math.max(180, Math.min(240, width * 0.20)) + property real avgColWidth: Math.max(98, Math.min(126, width * 0.11)) + property bool showTodayColumn: !denseLayout + property bool showLastColumn: !narrowLayout + + ColumnLayout { + anchors.fill: parent + anchors.margins: 16 + spacing: 8 + + Rectangle { + Layout.fillWidth: true + Layout.preferredHeight: 40 + radius: 8 + color: "#eef2f6" + + RowLayout { + anchors.fill: parent + anchors.leftMargin: 16 + anchors.rightMargin: 16 + spacing: 12 + + Label { text: "学号"; Layout.preferredWidth: statisticsTableCard.studentColWidth; font.bold: true } + Label { text: "姓名"; Layout.preferredWidth: statisticsTableCard.nameColWidth; font.bold: true } + Label { text: "总签到次数"; Layout.preferredWidth: statisticsTableCard.totalColWidth; font.bold: true } + Label { + text: "今日签到" + visible: statisticsTableCard.showTodayColumn + Layout.preferredWidth: statisticsTableCard.todayColWidth + font.bold: true + } + Label { + text: "最后签到时间" + visible: statisticsTableCard.showLastColumn + Layout.preferredWidth: statisticsTableCard.lastColWidth + font.bold: true + } + Label { text: "平均置信度"; Layout.preferredWidth: statisticsTableCard.avgColWidth; font.bold: true } + Item { Layout.fillWidth: true } + } + } + + Item { + Layout.fillWidth: true + Layout.fillHeight: true + + ListView { + id: statisticsListView + anchors.fill: parent + clip: true + spacing: 8 + model: appController.statisticsModel + + delegate: Rectangle { + width: ListView.view.width + height: 52 + property bool hovered: statisticsHoverHandler.hovered + radius: 16 + color: hovered ? "#f7f5e8" : (index % 2 === 0 ? "#ffffff" : "#f8f3ec") + border.color: hovered ? "#e4d6aa" : (index % 2 === 0 ? "#ece4da" : "#e7ded3") + + Behavior on color { enabled: !resizingWindow; ColorAnimation { duration: 120 } } + Behavior on border.color { enabled: !resizingWindow; ColorAnimation { duration: 120 } } + + HoverHandler { id: statisticsHoverHandler } + + RowLayout { + anchors.fill: parent + anchors.leftMargin: 16 + anchors.rightMargin: 16 + spacing: 12 + + Label { text: model.studentId; Layout.preferredWidth: statisticsTableCard.studentColWidth; color: ink700 } + Label { text: model.name; Layout.preferredWidth: statisticsTableCard.nameColWidth; color: ink900; font.bold: true } + Label { text: model.totalCount; Layout.preferredWidth: statisticsTableCard.totalColWidth; color: ink700 } + Label { + text: model.todayCount + visible: statisticsTableCard.showTodayColumn + Layout.preferredWidth: statisticsTableCard.todayColWidth + color: ink700 + } + Label { + text: model.lastCheckIn + visible: statisticsTableCard.showLastColumn + Layout.preferredWidth: statisticsTableCard.lastColWidth + color: ink700 + } + Label { text: model.averageConfidenceText; Layout.preferredWidth: statisticsTableCard.avgColWidth; color: tealColor; font.bold: true } + Item { Layout.fillWidth: true } + } + } + + ScrollBar.vertical: AppScrollBar {} + } + + EmptyState { + anchors.centerIn: parent + visible: statisticsListView.count === 0 + title: "统计范围内没有数据" + description: "可以切换时间范围,或者先返回记录页检查同步是否正常。" + badgeText: "Σ" + accent: goldColor + } + } + } + } + } + } + + Item { + Layout.fillWidth: true + Layout.fillHeight: true + visible: StackLayout.isCurrentItem + opacity: StackLayout.isCurrentItem ? 1 : 0 + scale: resizingWindow || StackLayout.isCurrentItem ? 1 : 0.985 + Behavior on opacity { enabled: !resizingWindow; NumberAnimation { duration: 140 } } + Behavior on scale { enabled: !resizingWindow; NumberAnimation { duration: 180; easing.type: Easing.OutCubic } } + + ScrollView { + id: configScrollView + anchors.fill: parent + clip: true + contentWidth: availableWidth + contentHeight: configContentLayout.implicitHeight + + ColumnLayout { + id: configContentLayout + width: configScrollView.availableWidth + spacing: 14 + + Rectangle { + Layout.fillWidth: true + radius: 8 + color: panelStrong + border.color: lineColor + Layout.preferredHeight: slimLayout ? 174 : 88 + clip: true + + GridLayout { + id: serverConfigGrid + anchors.fill: parent + anchors.margins: slimLayout ? 12 : 18 + columns: slimLayout ? 1 : 4 + rowSpacing: 12 + columnSpacing: 12 + + Label { + Layout.alignment: Qt.AlignVCenter + text: "服务器地址" + font.bold: true + color: ink700 + } + AppTextField { + id: serverUrlField + Layout.fillWidth: true + Layout.preferredWidth: slimLayout ? 0 : 520 + text: appController.serverUrl + placeholderText: "http://IP:端口" + } + + SecondaryButton { + text: "保存地址" + onClicked: appController.serverUrl = serverUrlField.text + } + + PrimaryButton { + text: "测试连接" + fillColor: tealColor + onClicked: appController.testConnection() + } + } + } + + Rectangle { + Layout.fillWidth: true + radius: 8 + color: panelStrong + border.color: lineColor + Layout.preferredHeight: timeSlotsExpanded + ? 18 + 64 + 12 + 42 + 12 + Math.max(52, timeSlotListView.contentHeight) + 18 + : 100 + clip: true + + ColumnLayout { + anchors.fill: parent + anchors.margins: 18 + spacing: 12 + + RowLayout { + Layout.fillWidth: true + Layout.preferredHeight: 64 + spacing: 12 + + SectionHeader { + Layout.fillWidth: true + title: "时间段配置" + description: "维护签到与签退时段,并同步到服务端。" + accent: accentColor + } + Row { + Layout.alignment: Qt.AlignRight | Qt.AlignVCenter + spacing: 8 + + SecondaryButton { + text: timeSlotsExpanded ? "收起" : "展开" + onClicked: timeSlotsExpanded = !timeSlotsExpanded + } + SecondaryButton { + visible: timeSlotsExpanded + text: "新增时段" + onClicked: openTimeSlotDialog(-1) + } + SecondaryButton { + visible: timeSlotsExpanded + text: "恢复默认" + onClicked: { appController.timeSlotModel.resetToDefault(); appController.saveTimeSlots() } + } + SecondaryButton { + visible: timeSlotsExpanded + text: "从服务器同步" + onClicked: appController.reloadTimeSlotsFromServer() + } + PrimaryButton { + visible: timeSlotsExpanded + text: "保存时间段" + onClicked: appController.saveTimeSlots() + } + } + } + + Rectangle { + visible: timeSlotsExpanded + Layout.fillWidth: true + Layout.preferredHeight: visible ? 42 : 0 + radius: 8 + color: "#efe7dd" + + RowLayout { + anchors.fill: parent + anchors.leftMargin: 16 + anchors.rightMargin: 16 + Label { text: "名称"; Layout.preferredWidth: 220; font.bold: true } + Label { text: "开始"; Layout.preferredWidth: 120; font.bold: true } + Label { text: "结束"; Layout.preferredWidth: 120; font.bold: true } + Label { text: "状态"; Layout.preferredWidth: 100; font.bold: true } + Item { Layout.fillWidth: true } + } + } + + ListView { + id: timeSlotListView + visible: timeSlotsExpanded + Layout.fillWidth: true + Layout.preferredHeight: visible ? contentHeight : 0 + clip: false + interactive: false + spacing: 8 + model: appController.timeSlotModel + + delegate: Rectangle { + width: ListView.view.width + height: 52 + property bool hovered: timeSlotHoverHandler.hovered + radius: 16 + color: hovered ? "#f9f1ea" : (index % 2 === 0 ? "#ffffff" : "#f8f3ec") + border.color: hovered ? "#e5cfc1" : (index % 2 === 0 ? "#ece4da" : "#e7ded3") + + Behavior on color { enabled: !resizingWindow; ColorAnimation { duration: 120 } } + Behavior on border.color { enabled: !resizingWindow; ColorAnimation { duration: 120 } } + + HoverHandler { id: timeSlotHoverHandler } + + RowLayout { + anchors.fill: parent + anchors.leftMargin: 16 + anchors.rightMargin: 16 + spacing: 12 + + Label { text: model.name; Layout.preferredWidth: 220 } + Label { text: model.startTime; Layout.preferredWidth: 120 } + Label { text: model.endTime; Layout.preferredWidth: 120 } + Label { + text: model.enabled ? "启用" : "禁用" + Layout.preferredWidth: 100 + color: model.enabled ? successColor : goldColor + font.bold: true + } + Item { Layout.fillWidth: true } + SecondaryButton { text: "编辑"; onClicked: openTimeSlotDialog(index) } + SecondaryButton { text: "删除"; onClicked: { appController.timeSlotModel.removeTimeSlot(index); appController.saveTimeSlots() } } + } + } + } + } + } + + Rectangle { + Layout.fillWidth: true + radius: 8 + color: panelStrong + border.color: lineColor + Layout.preferredHeight: mappingsExpanded + ? 18 + 64 + 12 + mappingTabs.implicitHeight + 12 + + Math.max(64, mappingTabs.currentIndex === 0 ? studentMappingListView.contentHeight + : classMappingListView.contentHeight) + 18 + : 100 + clip: true + + ColumnLayout { + anchors.fill: parent + anchors.margins: 18 + spacing: 12 + + RowLayout { + Layout.fillWidth: true + Layout.preferredHeight: 64 + spacing: 12 + SectionHeader { + Layout.fillWidth: true + title: "名称映射配置" + description: "让学号和班级编号显示为更清晰的真实名称。" + accent: tealColor + } + Row { + Layout.alignment: Qt.AlignRight | Qt.AlignVCenter + spacing: 8 + + SecondaryButton { + text: mappingsExpanded ? "收起" : "展开" + onClicked: mappingsExpanded = !mappingsExpanded + } + SecondaryButton { + visible: mappingsExpanded + text: "从服务器加载" + onClicked: appController.loadMappingsFromServer() + } + PrimaryButton { + visible: mappingsExpanded + text: "保存映射" + fillColor: tealColor + onClicked: appController.saveMappings() + } + } + } + + TabBar { + id: mappingTabs + visible: mappingsExpanded + Layout.fillWidth: true + Layout.preferredHeight: visible ? 42 : 0 + spacing: 8 + padding: 0 + background: Rectangle { + color: "transparent" + } + + SegmentTabButton { + width: (mappingTabs.width - mappingTabs.spacing) / 2 + text: "学号 → 姓名" + } + SegmentTabButton { + width: (mappingTabs.width - mappingTabs.spacing) / 2 + text: "班级编号 → 名称" + } + } + + StackLayout { + visible: mappingsExpanded + Layout.fillWidth: true + Layout.preferredHeight: visible ? (mappingTabs.currentIndex === 0 ? studentMappingListView.contentHeight + : classMappingListView.contentHeight) : 0 + currentIndex: mappingTabs.currentIndex + + Rectangle { + color: "transparent" + + ListView { + id: studentMappingListView + anchors.fill: parent + clip: false + interactive: false + spacing: 8 + model: appController.studentMappingModel + + header: RowLayout { + width: ListView.view.width + spacing: 12 + + SecondaryButton { + text: "新增映射" + onClicked: appController.studentMappingModel.addEntry("", "") + } + + Item { Layout.fillWidth: true } + } + + delegate: Rectangle { + width: ListView.view.width + height: 56 + property bool hovered: studentMappingHoverHandler.hovered + radius: 16 + color: hovered ? "#f9f0ea" : (index % 2 === 0 ? "#ffffff" : "#f8f3ec") + border.color: hovered ? "#e5cfc1" : (index % 2 === 0 ? "#ece4da" : "#e7ded3") + + Behavior on color { enabled: !resizingWindow; ColorAnimation { duration: 120 } } + Behavior on border.color { enabled: !resizingWindow; ColorAnimation { duration: 120 } } + + HoverHandler { id: studentMappingHoverHandler } + + RowLayout { + anchors.fill: parent + anchors.leftMargin: 12 + anchors.rightMargin: 12 + spacing: 12 + + AppTextField { + id: studentKeyField + Layout.preferredWidth: 220 + text: model.entryKey + placeholderText: "学号" + onEditingFinished: appController.studentMappingModel.updateEntry(index, text, studentValueField.text) + } + + AppTextField { + id: studentValueField + Layout.preferredWidth: 240 + text: model.entryValue + placeholderText: "真实姓名" + onEditingFinished: appController.studentMappingModel.updateEntry(index, studentKeyField.text, text) + } + + Item { Layout.fillWidth: true } + SecondaryButton { text: "删除"; onClicked: appController.studentMappingModel.removeEntry(index) } + } + } + } + } + + Rectangle { + color: "transparent" + + ListView { + id: classMappingListView + anchors.fill: parent + clip: false + interactive: false + spacing: 8 + model: appController.classMappingModel + + header: RowLayout { + width: ListView.view.width + spacing: 12 + + SecondaryButton { + text: "新增映射" + onClicked: appController.classMappingModel.addEntry("", "") + } + + Item { Layout.fillWidth: true } + } + + delegate: Rectangle { + width: ListView.view.width + height: 56 + property bool hovered: classMappingHoverHandler.hovered + radius: 16 + color: hovered ? "#eef5f4" : (index % 2 === 0 ? "#ffffff" : "#f8f3ec") + border.color: hovered ? "#c7dddd" : (index % 2 === 0 ? "#ece4da" : "#e7ded3") + + Behavior on color { enabled: !resizingWindow; ColorAnimation { duration: 120 } } + Behavior on border.color { enabled: !resizingWindow; ColorAnimation { duration: 120 } } + + HoverHandler { id: classMappingHoverHandler } + + RowLayout { + anchors.fill: parent + anchors.leftMargin: 12 + anchors.rightMargin: 12 + spacing: 12 + + AppTextField { + id: classKeyField + Layout.preferredWidth: 220 + text: model.entryKey + placeholderText: "班级编号" + onEditingFinished: appController.classMappingModel.updateEntry(index, text, classValueField.text) + } + + AppTextField { + id: classValueField + Layout.preferredWidth: 260 + text: model.entryValue + placeholderText: "班级名称" + onEditingFinished: appController.classMappingModel.updateEntry(index, classKeyField.text, text) + } + + Item { Layout.fillWidth: true } + SecondaryButton { text: "删除"; onClicked: appController.classMappingModel.removeEntry(index) } + } + } + } + } + } + } + } + + Item { + Layout.fillWidth: true + Layout.preferredHeight: 14 + } + } + } + } + + Item { + Layout.fillWidth: true + Layout.fillHeight: true + visible: StackLayout.isCurrentItem + opacity: StackLayout.isCurrentItem ? 1 : 0 + scale: resizingWindow || StackLayout.isCurrentItem ? 1 : 0.985 + Behavior on opacity { enabled: !resizingWindow; NumberAnimation { duration: 140 } } + Behavior on scale { enabled: !resizingWindow; NumberAnimation { duration: 180; easing.type: Easing.OutCubic } } + + ColumnLayout { + anchors.fill: parent + spacing: 14 + + Rectangle { + Layout.fillWidth: true + radius: 8 + color: panelStrong + border.color: lineColor + Layout.preferredHeight: slimLayout ? 132 : 88 + clip: true + + RowLayout { + anchors.fill: parent + anchors.margins: slimLayout ? 12 : 18 + spacing: 12 + + SectionHeader { + Layout.fillWidth: true + title: "K210 人脸照片与学号映射" + description: "同步照片状态,维护人脸与真实学号的对应关系。" + accent: goldColor + } + + Row { + Layout.alignment: Qt.AlignRight | Qt.AlignVCenter + spacing: 8 + + SecondaryButton { text: "刷新"; onClicked: appController.refreshFaces() } + PrimaryButton { + text: "保存映射" + onClicked: appController.saveFaceMappings() + } + } + } + } + + Rectangle { + Layout.fillWidth: true + Layout.fillHeight: true + radius: 8 + color: panelStrong + border.color: lineColor + + GridView { + id: faceGridView + anchors.fill: parent + anchors.margins: 16 + clip: true + property int cardColumns: Math.max(1, Math.floor(width / (compactLayout ? 236 : 260))) + cellWidth: Math.max(240, Math.floor(width / cardColumns)) + cellHeight: 332 + model: appController.faceModel + + delegate: Rectangle { + width: Math.min(244, GridView.view.cellWidth - 18) + height: 308 + property bool hovered: faceHoverHandler.hovered + radius: 8 + color: hovered ? "#fff6ef" : "#ffffff" + border.color: hovered ? "#e6c8b8" : "#e8ddd0" + + Behavior on color { enabled: !resizingWindow; ColorAnimation { duration: 140 } } + Behavior on border.color { enabled: !resizingWindow; ColorAnimation { duration: 140 } } + + HoverHandler { id: faceHoverHandler } + + ColumnLayout { + anchors.fill: parent + anchors.margins: 14 + spacing: 10 + + Rectangle { + Layout.alignment: Qt.AlignHCenter + Layout.fillWidth: true + Layout.preferredHeight: compactLayout ? 152 : 168 + radius: 16 + color: model.hasPhoto ? "#eef3f5" : goldSoft + border.color: model.hasPhoto ? "#dbe4ea" : "#eadbb0" + + Image { + anchors.fill: parent + anchors.margins: 8 + fillMode: Image.PreserveAspectFit + source: model.photoUrl + visible: model.hasPhoto + } + + Label { + anchors.centerIn: parent + visible: !model.hasPhoto + text: "无照片" + color: goldColor + font.bold: true + } + } + + Label { + text: "ID: " + model.faceId + color: ink900 + font.pixelSize: compactLayout ? 15 : 16 + font.bold: true + } + + AppTextField { + Layout.fillWidth: true + text: model.studentId + placeholderText: narrowLayout ? "学号" : "输入真实学号" + onEditingFinished: appController.faceModel.updateStudentId(index, text) + } + + Rectangle { + Layout.fillWidth: true + Layout.preferredHeight: 34 + radius: 12 + color: model.hasPhoto ? "#e6f4ec" : "#f9ebcf" + + Label { + anchors.centerIn: parent + text: model.hasPhoto ? "照片已同步" : "仅检测到记录,无照片" + color: model.hasPhoto ? successColor : goldColor + font.pixelSize: narrowLayout ? 11 : 12 + font.bold: true + } + } + + Item { Layout.fillHeight: true } + + DangerButton { + Layout.fillWidth: true + text: "删除该人脸" + onClicked: { + pendingDeleteFaceId = model.faceId + deleteFaceRecordsCheck.checked = false + deleteFaceDialog.open() + } + } + } + } + + ScrollBar.vertical: AppScrollBar {} + } + + EmptyState { + anchors.centerIn: parent + visible: faceGridView.count === 0 + title: "还没有可管理的人脸数据" + description: "等 K210 上传照片或服务端同步学号后,这里会自动显示对应卡片。" + badgeText: "人" + accent: tealColor + } + } + } + } + + Item { + Layout.fillWidth: true + Layout.fillHeight: true + visible: StackLayout.isCurrentItem + opacity: StackLayout.isCurrentItem ? 1 : 0 + scale: resizingWindow || StackLayout.isCurrentItem ? 1 : 0.985 + Behavior on opacity { enabled: !resizingWindow; NumberAnimation { duration: 140 } } + Behavior on scale { enabled: !resizingWindow; NumberAnimation { duration: 180; easing.type: Easing.OutCubic } } + + Rectangle { + anchors.fill: parent + radius: 8 + color: panelStrong + border.color: lineColor + + ColumnLayout { + anchors.fill: parent + anchors.margins: 24 + spacing: 18 + + SectionHeader { + Layout.fillWidth: true + title: "人脸识别考勤系统管理端" + description: "用于连接考勤服务端,集中查看签到记录、统计考勤情况、维护签到时段、管理名称映射与人脸照片绑定。" + accent: tealColor + } + + Rectangle { + Layout.fillWidth: true + Layout.preferredHeight: 1 + color: lineColor + } + + Label { + Layout.fillWidth: true + text: "本客户端基于 Qt Quick/QML 构建,面向人脸识别考勤场景。它把记录查询、统计导出、服务连接配置、时间段配置、学生与班级名称映射、人脸资料管理整合在一个窗口中,减少多窗口切换。" + wrapMode: Text.WordWrap + color: ink700 + font.pixelSize: 14 + lineHeight: 1.25 + } + + Label { + Layout.fillWidth: true + text: "数据通过服务端 API 同步;记录和统计结果可导出为 CSV,配置项可保存后同步到服务端。" + wrapMode: Text.WordWrap + color: ink700 + font.pixelSize: 14 + lineHeight: 1.25 + } + + Item { Layout.fillHeight: true } + + Rectangle { + Layout.fillWidth: true + Layout.preferredHeight: 92 + radius: 8 + color: "#f8fafb" + border.color: lineColor + + ColumnLayout { + anchors.fill: parent + anchors.margins: 16 + spacing: 8 + + Label { + Layout.fillWidth: true + text: "毕业设计说明" + color: ink900 + font.pixelSize: 16 + font.bold: true + } + + Label { + Layout.fillWidth: true + text: "本系统为纪田野的个人毕业设计作品,仅用于毕业设计展示、学习研究与系统功能验证。" + wrapMode: Text.WordWrap + color: ink700 + font.pixelSize: 13 + } + + Label { + Layout.fillWidth: true + text: "Copyright © 2026 纪田野。保留所有权利。" + wrapMode: Text.WordWrap + color: ink500 + font.pixelSize: 12 + } + } + } + } + } + } + } + + Item { + Layout.fillWidth: true + Layout.preferredHeight: 0 + } + } + } + } + } + + Rectangle { + width: Math.min(420, Math.max(220, toastLabel.implicitWidth + 44)) + height: 52 + radius: 16 + color: "#16323d" + border.color: "#264754" + anchors.right: parent.right + anchors.bottom: parent.bottom + anchors.rightMargin: 30 + anchors.bottomMargin: 28 + opacity: toastVisible ? 0.98 : 0 + visible: opacity > 0 + y: toastVisible ? parent.height - height - 28 : parent.height - height - 10 + + Behavior on opacity { enabled: !resizingWindow; NumberAnimation { duration: 180 } } + Behavior on y { enabled: !resizingWindow; NumberAnimation { duration: 180; easing.type: Easing.OutCubic } } + + RowLayout { + anchors.fill: parent + anchors.leftMargin: 16 + anchors.rightMargin: 16 + spacing: 10 + + Rectangle { + Layout.preferredWidth: 10 + Layout.preferredHeight: 10 + radius: 5 + color: accentColor + } + + Label { + id: toastLabel + text: toastMessage + color: "#f8fafc" + elide: Label.ElideRight + Layout.fillWidth: true + } + } + } +} diff --git a/src/ApiClient.cpp b/src/ApiClient.cpp new file mode 100644 index 0000000..b3380b5 --- /dev/null +++ b/src/ApiClient.cpp @@ -0,0 +1,494 @@ +#include "ApiClient.h" + +#include +#include +#include +#include +#include +#include + +#include "CryptoUtils.h" + +namespace { +constexpr int NetworkTimeoutMs = 5000; +} + +ApiClient::ApiClient(QObject *parent) + : QObject(parent) + , m_serverUrl("http://27.106.113.205:8082") +{ +} + +void ApiClient::setServerUrl(const QString &url) +{ + const QString trimmed = url.trimmed(); + if (!trimmed.isEmpty()) { + m_serverUrl = trimmed; + } +} + +QString ApiClient::serverUrl() const +{ + return m_serverUrl; +} + +QString ApiClient::buildUrl(const QString &endpoint, const QMap ¶ms) const +{ + QString url = m_serverUrl + "/api" + endpoint; + if (!params.isEmpty()) { + QUrlQuery query; + for (auto it = params.begin(); it != params.end(); ++it) { + query.addQueryItem(it.key(), it.value()); + } + url += "?" + query.toString(QUrl::FullyEncoded); + } + return url; +} + +QNetworkRequest ApiClient::createRequest(const QString &url, bool encryptedResponse) const +{ + QNetworkRequest request{QUrl(url)}; + if (encryptedResponse) { + request.setRawHeader("X-Encrypted-Response", "true"); + } + request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); + request.setTransferTimeout(NetworkTimeoutMs); + return request; +} + +QByteArray ApiClient::maybeDecrypt(const QByteArray &data, bool encrypted) const +{ + if (!encrypted) { + return data; + } + return CryptoUtils::decryptAes128CbcBase64(data); +} + +bool ApiClient::isConnectionError(QNetworkReply::NetworkError error) const +{ + switch (error) { + case QNetworkReply::ConnectionRefusedError: + case QNetworkReply::RemoteHostClosedError: + case QNetworkReply::HostNotFoundError: + case QNetworkReply::TimeoutError: + case QNetworkReply::OperationCanceledError: + case QNetworkReply::SslHandshakeFailedError: + case QNetworkReply::TemporaryNetworkFailureError: + case QNetworkReply::NetworkSessionFailedError: + case QNetworkReply::BackgroundRequestNotAllowedError: + case QNetworkReply::TooManyRedirectsError: + case QNetworkReply::InsecureRedirectError: + case QNetworkReply::UnknownNetworkError: + case QNetworkReply::UnknownProxyError: + case QNetworkReply::UnknownContentError: + case QNetworkReply::ProtocolFailure: + case QNetworkReply::UnknownServerError: + return true; + default: + return false; + } +} + +void ApiClient::emitNetworkError(const QString &prefix, QNetworkReply *reply) +{ + const QString message = QStringLiteral("%1: %2").arg(prefix, reply->errorString()); + emit networkError(message); + if (isConnectionError(reply->error())) { + emit connectionUnavailable(message); + } +} + +QVector ApiClient::parseRecords(const QByteArray &data) const +{ + QVector records; + const QJsonDocument doc = QJsonDocument::fromJson(data); + if (!doc.isArray()) { + return records; + } + + const QJsonArray array = doc.array(); + records.reserve(array.size()); + for (const QJsonValue &value : array) { + const QJsonObject object = value.toObject(); + AttendanceRecord record; + record.timestamp = object.value("timestamp").toString().trimmed(); + record.studentId = object.value("student_id").toString().trimmed(); + record.originalName = object.value("name").toString().trimmed(); + record.confidence = object.value("confidence").toDouble(); + const QJsonValue statusValue = object.value("status"); + if (statusValue.isBool()) { + record.status = statusValue.toBool() ? QStringLiteral("success") : QStringLiteral("failed"); + } else if (statusValue.isDouble()) { + record.status = QString::number(statusValue.toInt()); + } else { + record.status = statusValue.toString().trimmed(); + } + record.classId = object.value("class_id").toString().trimmed(); + if (record.classId.isEmpty()) { + record.classId = "0"; + } + if (!record.timestamp.startsWith("0000-") && !record.timestamp.isEmpty() && !record.studentId.isEmpty()) { + records.push_back(record); + } + } + return records; +} + +void ApiClient::fetchRecords(int limit, int offset) +{ + const QString url = buildUrl("/records", { + {"limit", QString::number(limit)}, + {"offset", QString::number(offset)} + }); + QNetworkReply *reply = m_networkManager.get(createRequest(url, true)); + connect(reply, &QNetworkReply::finished, this, [this, reply]() { + const QByteArray rawData = reply->readAll(); + if (reply->error() != QNetworkReply::NoError) { + emitNetworkError(QStringLiteral("加载记录失败"), reply); + reply->deleteLater(); + return; + } + + const QByteArray data = maybeDecrypt(rawData, true); + if (data.isEmpty()) { + emit networkError("记录数据解密失败"); + reply->deleteLater(); + return; + } + + emit recordsFetched(parseRecords(data)); + reply->deleteLater(); + }); +} + +void ApiClient::fetchStatistics() +{ + const QString url = buildUrl("/statistics"); + QNetworkReply *reply = m_networkManager.get(createRequest(url, true)); + connect(reply, &QNetworkReply::finished, this, [this, reply]() { + const QByteArray rawData = reply->readAll(); + if (reply->error() != QNetworkReply::NoError) { + emitNetworkError(QStringLiteral("加载统计失败"), reply); + reply->deleteLater(); + return; + } + + const QByteArray data = maybeDecrypt(rawData, true); + if (data.isEmpty()) { + emit networkError("统计数据解密失败"); + reply->deleteLater(); + return; + } + + const QJsonDocument doc = QJsonDocument::fromJson(data); + const QJsonObject object = doc.object(); + emit statisticsFetched(object.value("total").toInt(), + object.value("today").toInt(), + object.value("server_time").toString()); + reply->deleteLater(); + }); +} + +void ApiClient::clearAllRecords() +{ + QNetworkReply *reply = m_networkManager.post(createRequest(buildUrl("/clear")), QByteArray()); + connect(reply, &QNetworkReply::finished, this, [this, reply]() { + const QByteArray data = reply->readAll(); + if (reply->error() != QNetworkReply::NoError) { + if (isConnectionError(reply->error())) { + emit connectionUnavailable(QStringLiteral("清空失败: %1").arg(reply->errorString())); + } + emit recordsCleared(false, reply->errorString()); + reply->deleteLater(); + return; + } + + const QJsonObject object = QJsonDocument::fromJson(data).object(); + emit recordsCleared(object.value("success").toBool(), object.value("message").toString()); + reply->deleteLater(); + }); +} + +void ApiClient::deleteRecord(const QString ×tamp, const QString &studentId) +{ + QNetworkReply *reply = m_networkManager.deleteResource(createRequest(buildUrl("/record", { + {"timestamp", timestamp}, + {"student_id", studentId} + }))); + connect(reply, &QNetworkReply::finished, this, [this, reply]() { + const QByteArray data = reply->readAll(); + if (reply->error() != QNetworkReply::NoError) { + if (isConnectionError(reply->error())) { + emit connectionUnavailable(QStringLiteral("记录删除失败: %1").arg(reply->errorString())); + } + emit recordDeleted(false, reply->errorString()); + reply->deleteLater(); + return; + } + + const QJsonObject object = QJsonDocument::fromJson(data).object(); + emit recordDeleted(object.value("success").toBool(), object.value("message").toString()); + reply->deleteLater(); + }); +} + +void ApiClient::fetchTimeSlots() +{ + QNetworkReply *reply = m_networkManager.get(createRequest(buildUrl("/timeslots"))); + connect(reply, &QNetworkReply::finished, this, [this, reply]() { + const QByteArray data = reply->readAll(); + if (reply->error() != QNetworkReply::NoError) { + emitNetworkError(QStringLiteral("加载时间段失败"), reply); + reply->deleteLater(); + return; + } + + QVector timeSlots; + const QJsonObject root = QJsonDocument::fromJson(data).object(); + const QJsonArray array = root.value("time_slots").toArray(); + for (const QJsonValue &value : array) { + const QJsonObject object = value.toObject(); + timeSlots.push_back({ + object.value("name").toString(), + QTime::fromString(object.value("start_time").toString(), "HH:mm"), + QTime::fromString(object.value("end_time").toString(), "HH:mm"), + object.value("enabled").toBool(true) + }); + } + emit timeSlotsFetched(timeSlots); + reply->deleteLater(); + }); +} + +void ApiClient::uploadTimeSlots(const QVector &timeSlots) +{ + QJsonArray array; + for (const TimeSlot &slot : timeSlots) { + QJsonObject object; + object["name"] = slot.name; + object["start_time"] = slot.startTime.toString("HH:mm"); + object["end_time"] = slot.endTime.toString("HH:mm"); + object["enabled"] = slot.enabled; + array.append(object); + } + + QJsonObject payload; + payload["time_slots"] = array; + QNetworkReply *reply = m_networkManager.post(createRequest(buildUrl("/timeslots")), + QJsonDocument(payload).toJson(QJsonDocument::Compact)); + connect(reply, &QNetworkReply::finished, this, [this, reply]() { + const QByteArray data = reply->readAll(); + if (reply->error() != QNetworkReply::NoError) { + if (isConnectionError(reply->error())) { + emit connectionUnavailable(QStringLiteral("时间段同步失败: %1").arg(reply->errorString())); + } + emit timeSlotsUploaded(false, reply->errorString()); + reply->deleteLater(); + return; + } + const QJsonObject object = QJsonDocument::fromJson(data).object(); + emit timeSlotsUploaded(object.value("success").toBool(), object.value("message").toString()); + reply->deleteLater(); + }); +} + +void ApiClient::fetchMappingConfig() +{ + QNetworkReply *reply = m_networkManager.get(createRequest(buildUrl("/mapping_config"))); + connect(reply, &QNetworkReply::finished, this, [this, reply]() { + const QByteArray data = reply->readAll(); + if (reply->error() != QNetworkReply::NoError) { + emitNetworkError(QStringLiteral("加载映射配置失败"), reply); + reply->deleteLater(); + return; + } + + const QJsonObject root = QJsonDocument::fromJson(data).object(); + QMap studentMap; + QMap classMap; + + const QJsonObject studentObject = root.value("student_name_map").toObject(); + for (auto it = studentObject.begin(); it != studentObject.end(); ++it) { + studentMap[it.key()] = it.value().toString(); + } + + const QJsonObject classObject = root.value("class_name_map").toObject(); + for (auto it = classObject.begin(); it != classObject.end(); ++it) { + classMap[it.key()] = it.value().toString(); + } + + emit mappingConfigFetched(studentMap, classMap); + reply->deleteLater(); + }); +} + +void ApiClient::uploadMappingConfig(const QMap &studentNameMap, + const QMap &classNameMap) +{ + QJsonObject studentObject; + for (auto it = studentNameMap.begin(); it != studentNameMap.end(); ++it) { + studentObject[it.key()] = it.value(); + } + + QJsonObject classObject; + for (auto it = classNameMap.begin(); it != classNameMap.end(); ++it) { + classObject[it.key()] = it.value(); + } + + QJsonObject payload; + payload["student_name_map"] = studentObject; + payload["class_name_map"] = classObject; + + QNetworkReply *reply = m_networkManager.post(createRequest(buildUrl("/mapping_config")), + QJsonDocument(payload).toJson(QJsonDocument::Compact)); + connect(reply, &QNetworkReply::finished, this, [this, reply]() { + const QByteArray data = reply->readAll(); + if (reply->error() != QNetworkReply::NoError) { + if (isConnectionError(reply->error())) { + emit connectionUnavailable(QStringLiteral("映射保存失败: %1").arg(reply->errorString())); + } + emit mappingConfigUploaded(false, reply->errorString()); + reply->deleteLater(); + return; + } + const QJsonObject object = QJsonDocument::fromJson(data).object(); + emit mappingConfigUploaded(object.value("success").toBool(), object.value("message").toString()); + reply->deleteLater(); + }); +} + +void ApiClient::fetchFaceIdMapping() +{ + QNetworkReply *reply = m_networkManager.get(createRequest(buildUrl("/face_id_mapping"))); + connect(reply, &QNetworkReply::finished, this, [this, reply]() { + const QByteArray data = reply->readAll(); + if (reply->error() != QNetworkReply::NoError) { + emitNetworkError(QStringLiteral("加载人脸映射失败"), reply); + reply->deleteLater(); + return; + } + + const QJsonObject mappings = QJsonDocument::fromJson(data).object().value("mappings").toObject(); + QMap mapping; + for (auto it = mappings.begin(); it != mappings.end(); ++it) { + mapping[it.key()] = it.value().toString(); + } + emit faceIdMappingFetched(mapping); + reply->deleteLater(); + }); +} + +void ApiClient::uploadFaceIdMapping(const QMap &mapping) +{ + QJsonObject mappings; + for (auto it = mapping.begin(); it != mapping.end(); ++it) { + if (!it.value().trimmed().isEmpty()) { + mappings[it.key()] = it.value(); + } + } + + QJsonObject payload; + payload["mappings"] = mappings; + QNetworkReply *reply = m_networkManager.post(createRequest(buildUrl("/face_id_mapping")), + QJsonDocument(payload).toJson(QJsonDocument::Compact)); + connect(reply, &QNetworkReply::finished, this, [this, reply]() { + const QByteArray data = reply->readAll(); + if (reply->error() != QNetworkReply::NoError) { + if (isConnectionError(reply->error())) { + emit connectionUnavailable(QStringLiteral("人脸映射保存失败: %1").arg(reply->errorString())); + } + emit faceIdMappingUploaded(false, reply->errorString()); + reply->deleteLater(); + return; + } + const QJsonObject object = QJsonDocument::fromJson(data).object(); + emit faceIdMappingUploaded(object.value("success").toBool(), object.value("message").toString()); + reply->deleteLater(); + }); +} + +void ApiClient::fetchFacePhotos() +{ + QNetworkReply *reply = m_networkManager.get(createRequest(buildUrl("/face_photos"))); + connect(reply, &QNetworkReply::finished, this, [this, reply]() { + const QByteArray data = reply->readAll(); + if (reply->error() != QNetworkReply::NoError) { + emitNetworkError(QStringLiteral("加载照片列表失败"), reply); + reply->deleteLater(); + return; + } + + QStringList ids; + const QJsonArray photos = QJsonDocument::fromJson(data).object().value("photos").toArray(); + for (const QJsonValue &value : photos) { + ids.push_back(value.toObject().value("id").toString()); + } + emit facePhotosFetched(ids); + reply->deleteLater(); + }); +} + +void ApiClient::fetchAllStudentIds() +{ + QNetworkReply *reply = m_networkManager.get(createRequest(buildUrl("/all_student_ids"))); + connect(reply, &QNetworkReply::finished, this, [this, reply]() { + const QByteArray data = reply->readAll(); + if (reply->error() != QNetworkReply::NoError) { + emitNetworkError(QStringLiteral("加载学生ID失败"), reply); + reply->deleteLater(); + return; + } + + QStringList ids; + const QJsonArray array = QJsonDocument::fromJson(data).object().value("student_ids").toArray(); + for (const QJsonValue &value : array) { + ids.push_back(value.toString()); + } + emit allStudentIdsFetched(ids); + reply->deleteLater(); + }); +} + +void ApiClient::deleteFace(const QString &studentId, bool deleteRecords) +{ + QString url = m_serverUrl + "/api/face/" + studentId; + if (deleteRecords) { + url += "?delete_records=true"; + } + QNetworkReply *reply = m_networkManager.deleteResource(createRequest(url)); + connect(reply, &QNetworkReply::finished, this, [this, reply, studentId]() { + const QByteArray data = reply->readAll(); + if (reply->error() != QNetworkReply::NoError) { + if (isConnectionError(reply->error())) { + emit connectionUnavailable(QStringLiteral("删除失败: %1").arg(reply->errorString())); + } + emit faceDeleted(false, studentId, 0, reply->errorString()); + reply->deleteLater(); + return; + } + + const QJsonObject object = QJsonDocument::fromJson(data).object(); + emit faceDeleted(object.value("success").toBool(), + studentId, + object.value("records_deleted").toInt(), + object.value("message").toString()); + reply->deleteLater(); + }); +} + +void ApiClient::checkHealth() +{ + QNetworkReply *reply = m_networkManager.get(createRequest(buildUrl("/health"))); + connect(reply, &QNetworkReply::finished, this, [this, reply]() { + const QByteArray data = reply->readAll(); + if (reply->error() != QNetworkReply::NoError) { + emit healthChecked(false, reply->errorString()); + reply->deleteLater(); + return; + } + const QJsonObject object = QJsonDocument::fromJson(data).object(); + const bool healthy = object.value("status").toString() == "healthy"; + emit healthChecked(healthy, healthy ? QStringLiteral("连接成功") : QStringLiteral("服务器无响应")); + reply->deleteLater(); + }); +} diff --git a/src/ApiClient.h b/src/ApiClient.h new file mode 100644 index 0000000..6d0a2f7 --- /dev/null +++ b/src/ApiClient.h @@ -0,0 +1,71 @@ +#ifndef API_CLIENT_H +#define API_CLIENT_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include "AttendanceTypes.h" + +class ApiClient : public QObject +{ + Q_OBJECT + +public: + explicit ApiClient(QObject *parent = nullptr); + + void setServerUrl(const QString &url); + QString serverUrl() const; + + void fetchRecords(int limit = 1000, int offset = 0); + void fetchStatistics(); + void clearAllRecords(); + void deleteRecord(const QString ×tamp, const QString &studentId); + void fetchTimeSlots(); + void uploadTimeSlots(const QVector &timeSlots); + void fetchMappingConfig(); + void uploadMappingConfig(const QMap &studentNameMap, + const QMap &classNameMap); + void fetchFaceIdMapping(); + void uploadFaceIdMapping(const QMap &mapping); + void fetchFacePhotos(); + void fetchAllStudentIds(); + void deleteFace(const QString &studentId, bool deleteRecords); + void checkHealth(); + +signals: + void recordsFetched(const QVector &records); + void statisticsFetched(int total, int today, const QString &serverTime); + void recordsCleared(bool success, const QString &message); + void recordDeleted(bool success, const QString &message); + void timeSlotsFetched(const QVector &timeSlots); + void timeSlotsUploaded(bool success, const QString &message); + void mappingConfigFetched(const QMap &studentNameMap, + const QMap &classNameMap); + void mappingConfigUploaded(bool success, const QString &message); + void faceIdMappingFetched(const QMap &mapping); + void faceIdMappingUploaded(bool success, const QString &message); + void facePhotosFetched(const QStringList &photoIds); + void allStudentIdsFetched(const QStringList &studentIds); + void faceDeleted(bool success, const QString &studentId, int recordsDeleted, const QString &message); + void healthChecked(bool healthy, const QString &message); + void connectionUnavailable(const QString &message); + void networkError(const QString &message); + +private: + QString buildUrl(const QString &endpoint, const QMap ¶ms = {}) const; + QNetworkRequest createRequest(const QString &url, bool encryptedResponse = false) const; + QVector parseRecords(const QByteArray &data) const; + QByteArray maybeDecrypt(const QByteArray &data, bool encrypted) const; + void emitNetworkError(const QString &prefix, QNetworkReply *reply); + bool isConnectionError(QNetworkReply::NetworkError error) const; + + QNetworkAccessManager m_networkManager; + QString m_serverUrl; +}; + +#endif diff --git a/src/AppController.cpp b/src/AppController.cpp new file mode 100644 index 0000000..7bf84d6 --- /dev/null +++ b/src/AppController.cpp @@ -0,0 +1,734 @@ +#include "AppController.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { +constexpr int ReconnectIntervalMs = 5000; + +QDate parseDate(const QString &value, const QDate &fallback) +{ + const QDate date = QDate::fromString(value, Qt::ISODate); + return date.isValid() ? date : fallback; +} + +bool isSuccessStatus(const QString &status) +{ + const QString normalized = status.trimmed().toLower(); + return normalized == "success" + || normalized == "succeeded" + || normalized == "ok" + || normalized == "pass" + || normalized == "passed" + || normalized == "present" + || normalized == "recognized" + || normalized == "verified" + || normalized == "valid" + || normalized == "200" + || normalized == "true" + || normalized == "1" + || normalized == QStringLiteral("成功") + || normalized == QStringLiteral("签到成功") + || normalized == QStringLiteral("正常"); +} +} + +AppController::AppController(QObject *parent) + : QObject(parent) +{ + loadLocalState(); + m_apiClient.setServerUrl(m_serverUrl); + m_reconnectTimer.setSingleShot(true); + + connect(&m_reconnectTimer, &QTimer::timeout, this, [this]() { + runReconnectCheck(); + }); + + connect(&m_apiClient, &ApiClient::recordsFetched, this, [this](const QVector &records) { + m_allRecords = records; + updateFilterOptions(); + rebuildFilteredRecords(); + rebuildStatistics(); + setStatusMessage(QStringLiteral("已加载 %1 条记录").arg(records.size())); + emit summaryChanged(); + }); + + connect(&m_apiClient, &ApiClient::statisticsFetched, this, [this](int total, int today, const QString &) { + m_totalRecords = total; + m_todayRecords = today; + emit summaryChanged(); + }); + + connect(&m_apiClient, &ApiClient::recordsCleared, this, [this](bool success, const QString &message) { + setStatusMessage(success ? QStringLiteral("已清空全部记录") : QStringLiteral("清空失败: %1").arg(message)); + if (success) { + refreshAll(); + } + }); + + connect(&m_apiClient, &ApiClient::recordDeleted, this, [this](bool success, const QString &message) { + setStatusMessage(success ? QStringLiteral("记录删除成功") : QStringLiteral("记录删除失败: %1").arg(message)); + if (success) { + refreshRecords(); + } + }); + + connect(&m_apiClient, &ApiClient::timeSlotsFetched, this, [this](const QVector &timeSlots) { + if (!timeSlots.isEmpty()) { + m_timeSlotModel.setTimeSlots(timeSlots); + saveTimeSlotsToLocal(); + setStatusMessage(QStringLiteral("已从服务器同步时间段")); + } + }); + + connect(&m_apiClient, &ApiClient::timeSlotsUploaded, this, [this](bool success, const QString &message) { + setStatusMessage(success ? QStringLiteral("时间段已保存并同步") : QStringLiteral("时间段同步失败: %1").arg(message)); + }); + + connect(&m_apiClient, &ApiClient::mappingConfigFetched, this, + [this](const QMap &studentNameMap, const QMap &classNameMap) { + m_studentMappingModel.setMap(studentNameMap); + m_classMappingModel.setMap(classNameMap); + saveMappingsToLocal(); + rebuildFilteredRecords(); + rebuildStatistics(); + setStatusMessage("映射配置已同步"); + }); + + connect(&m_apiClient, &ApiClient::mappingConfigUploaded, this, [this](bool success, const QString &message) { + setStatusMessage(success ? QStringLiteral("映射配置已保存") : QStringLiteral("映射保存失败: %1").arg(message)); + }); + + connect(&m_apiClient, &ApiClient::faceIdMappingFetched, this, [this](const QMap &mapping) { + m_faceIdMapping = mapping; + mergeFaceItems(); + }); + + connect(&m_apiClient, &ApiClient::faceIdMappingUploaded, this, [this](bool success, const QString &message) { + setStatusMessage(success ? QStringLiteral("人脸映射已保存") : QStringLiteral("人脸映射保存失败: %1").arg(message)); + }); + + connect(&m_apiClient, &ApiClient::facePhotosFetched, this, [this](const QStringList &photoIds) { + m_facePhotoIds = photoIds; + mergeFaceItems(); + }); + + connect(&m_apiClient, &ApiClient::allStudentIdsFetched, this, [this](const QStringList &studentIds) { + m_allStudentIds = studentIds; + mergeFaceItems(); + }); + + connect(&m_apiClient, &ApiClient::faceDeleted, this, [this](bool success, const QString &studentId, int recordsDeleted, const QString &message) { + if (success) { + setStatusMessage(recordsDeleted > 0 + ? QStringLiteral("已删除 %1,并清除 %2 条记录").arg(studentId).arg(recordsDeleted) + : QStringLiteral("已删除 %1").arg(studentId)); + refreshFaces(); + refreshRecords(); + } else { + setStatusMessage(QStringLiteral("删除失败: %1").arg(message)); + } + }); + + connect(&m_apiClient, &ApiClient::healthChecked, this, [this](bool healthy, const QString &message) { + const bool wasReconnecting = m_reconnecting; + m_reconnectCheckInFlight = false; + if (healthy) { + stopReconnect(); + setStatusMessage(wasReconnecting ? QStringLiteral("服务器已恢复连接,正在同步数据") : QStringLiteral("服务器连接正常")); + if (wasReconnecting) { + refreshAll(); + refreshFaces(); + } + } else { + startReconnect(message); + } + }); + + connect(&m_apiClient, &ApiClient::networkError, this, [this](const QString &message) { + setStatusMessage(message); + }); + + connect(&m_apiClient, &ApiClient::connectionUnavailable, this, [this](const QString &message) { + startReconnect(message); + }); + + m_reconnecting = true; + emit reconnectStateChanged(); + runReconnectCheck(); +} + +RecordListModel *AppController::recordModel() { return &m_recordModel; } +StatisticsListModel *AppController::statisticsModel() { return &m_statisticsModel; } +TimeSlotListModel *AppController::timeSlotModel() { return &m_timeSlotModel; } +MappingListModel *AppController::studentMappingModel() { return &m_studentMappingModel; } +MappingListModel *AppController::classMappingModel() { return &m_classMappingModel; } +FaceListModel *AppController::faceModel() { return &m_faceModel; } + +QStringList AppController::classOptions() const { return m_classOptions; } +QStringList AppController::studentOptions() const { return m_studentOptions; } +QString AppController::serverUrl() const { return m_serverUrl; } +QString AppController::statusMessage() const { return m_statusMessage; } +bool AppController::reconnecting() const { return m_reconnecting; } +int AppController::reconnectAttempt() const { return m_reconnectAttempt; } +int AppController::totalRecords() const { return m_totalRecords; } +int AppController::todayRecords() const { return m_todayRecords; } +int AppController::filteredCount() const { return m_filteredRecords.size(); } +int AppController::loadedRecords() const { return m_allRecords.size(); } +int AppController::statisticsStudentCount() const { return m_statisticsStudentCount; } +int AppController::statisticsRecordCount() const { return m_statisticsRecordCount; } + +QString AppController::statisticsRangeText() const +{ + return QString("%1 至 %2") + .arg(m_statisticsStartDate.toString("yyyy-MM-dd")) + .arg(m_statisticsEndDate.toString("yyyy-MM-dd")); +} + +void AppController::setServerUrl(const QString &url) +{ + const QString trimmed = url.trimmed(); + if (trimmed.isEmpty() || trimmed == m_serverUrl) { + return; + } + + m_serverUrl = trimmed; + m_apiClient.setServerUrl(trimmed); + saveServerUrl(); + emit serverUrlChanged(); + stopReconnect(); + setStatusMessage("服务器地址已更新,正在检查连接"); + m_reconnecting = true; + emit reconnectStateChanged(); + runReconnectCheck(); +} + +void AppController::refreshAll() +{ + refreshRecords(); + m_apiClient.fetchStatistics(); + m_apiClient.fetchTimeSlots(); + m_apiClient.fetchMappingConfig(); +} + +void AppController::refreshRecords() +{ + m_apiClient.fetchRecords(1000, 0); +} + +void AppController::applyFilters(const QString &classId, + const QString &studentId, + const QString &nameFilter, + int dateFilterIndex, + const QString &specificDate) +{ + m_selectedClassId = classId.isEmpty() ? QStringLiteral("全部") : classId; + m_selectedStudentId = studentId.isEmpty() ? QStringLiteral("全部") : studentId; + m_nameFilter = nameFilter.trimmed(); + m_dateFilterIndex = dateFilterIndex; + m_specificDate = parseDate(specificDate, QDate::currentDate()); + rebuildFilteredRecords(); +} + +void AppController::updateStatisticsRange(const QString &startDate, const QString &endDate) +{ + m_statisticsStartDate = parseDate(startDate, QDate::currentDate().addDays(-30)); + m_statisticsEndDate = parseDate(endDate, QDate::currentDate()); + rebuildStatistics(); +} + +bool AppController::exportFilteredRecords(const QString &fileUrl) +{ + const QString filePath = QUrl(fileUrl).toLocalFile(); + if (filePath.isEmpty()) { + setStatusMessage("导出路径无效"); + return false; + } + + QFile file(filePath); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + setStatusMessage("无法创建导出文件"); + return false; + } + + QTextStream out(&file); + out.setEncoding(QStringConverter::Utf8); + out << "# 考勤记录导出\n"; + out << "# 导出时间: " << QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss") << "\n"; + out << "# 记录总数: " << m_filteredRecords.size() << "\n"; + out << "签到时间,班级编号,班级名称,学号,姓名,置信度,状态\n"; + + for (const AttendanceRecord &record : m_filteredRecords) { + out << record.timestamp << "," + << record.classId << "," + << mappedClassName(record) << "," + << record.studentId << "," + << (mappedStudentName(record).isEmpty() ? record.originalName : mappedStudentName(record)) << "," + << QString::number(record.confidence, 'f', 4) << "," + << record.status << "\n"; + } + + setStatusMessage(QStringLiteral("已导出 %1 条记录").arg(m_filteredRecords.size())); + return true; +} + +bool AppController::exportStatistics(const QString &fileUrl) +{ + const QString filePath = QUrl(fileUrl).toLocalFile(); + if (filePath.isEmpty()) { + setStatusMessage("统计导出路径无效"); + return false; + } + + QFile file(filePath); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + setStatusMessage("无法创建统计文件"); + return false; + } + + QTextStream out(&file); + out.setEncoding(QStringConverter::Utf8); + out << "考勤统计报表," << statisticsRangeText() << "\n"; + out << "学号,姓名,总签到次数,今日签到,最后签到时间,平均置信度\n"; + + for (int row = 0; row < m_statisticsModel.rowCount(); ++row) { + const QModelIndex index = m_statisticsModel.index(row); + out << m_statisticsModel.data(index, StatisticsListModel::StudentIdRole).toString() << "," + << m_statisticsModel.data(index, StatisticsListModel::NameRole).toString() << "," + << m_statisticsModel.data(index, StatisticsListModel::TotalCountRole).toInt() << "," + << m_statisticsModel.data(index, StatisticsListModel::TodayCountRole).toInt() << "," + << m_statisticsModel.data(index, StatisticsListModel::LastCheckInRole).toString() << "," + << QString::number(m_statisticsModel.data(index, StatisticsListModel::AverageConfidenceRole).toDouble(), 'f', 4) << "\n"; + } + + setStatusMessage("统计报表已导出"); + return true; +} + +void AppController::clearAllRecords() +{ + m_apiClient.clearAllRecords(); +} + +void AppController::saveTimeSlots() +{ + saveTimeSlotsToLocal(); + m_apiClient.uploadTimeSlots(m_timeSlotModel.timeSlots()); +} + +void AppController::reloadTimeSlotsFromServer() +{ + m_apiClient.fetchTimeSlots(); +} + +void AppController::loadMappingsFromServer() +{ + m_apiClient.fetchMappingConfig(); +} + +void AppController::saveMappings() +{ + saveMappingsToLocal(); + m_apiClient.uploadMappingConfig(m_studentMappingModel.toMap(), m_classMappingModel.toMap()); + rebuildFilteredRecords(); + rebuildStatistics(); +} + +void AppController::refreshFaces() +{ + m_apiClient.fetchFaceIdMapping(); + m_apiClient.fetchFacePhotos(); + m_apiClient.fetchAllStudentIds(); +} + +void AppController::saveFaceMappings() +{ + QMap mapping; + const QVector items = m_faceModel.items(); + for (const FaceListModel::Item &item : items) { + if (!item.studentId.trimmed().isEmpty()) { + mapping[item.faceId] = item.studentId.trimmed(); + } + } + m_faceIdMapping = mapping; + m_apiClient.uploadFaceIdMapping(mapping); +} + +void AppController::deleteFace(const QString &studentId, bool deleteRecords) +{ + m_apiClient.deleteFace(studentId, deleteRecords); +} + +void AppController::testConnection() +{ + setStatusMessage("正在检查服务器连接"); + m_apiClient.checkHealth(); +} + +void AppController::loadLocalState() +{ + QSettings settings; + m_serverUrl = settings.value("server/url", "http://27.106.113.205:8082").toString(); + loadMappingsFromLocal(); + loadTimeSlotsFromLocal(); +} + +void AppController::saveServerUrl() +{ + QSettings settings; + settings.setValue("server/url", m_serverUrl); +} + +void AppController::saveMappingsToLocal() +{ + const QString path = localSettingsPath("mapping_config.json"); + QFile file(path); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + return; + } + + QJsonObject root; + QJsonObject studentObject; + const QMap studentMap = m_studentMappingModel.toMap(); + for (auto it = studentMap.begin(); it != studentMap.end(); ++it) { + studentObject[it.key()] = it.value(); + } + + QJsonObject classObject; + const QMap classMap = m_classMappingModel.toMap(); + for (auto it = classMap.begin(); it != classMap.end(); ++it) { + classObject[it.key()] = it.value(); + } + + root["student_name_map"] = studentObject; + root["class_name_map"] = classObject; + file.write(QJsonDocument(root).toJson(QJsonDocument::Indented)); +} + +void AppController::loadMappingsFromLocal() +{ + QFile file(localSettingsPath("mapping_config.json")); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + m_studentMappingModel.clear(); + m_classMappingModel.clear(); + return; + } + + const QJsonObject root = QJsonDocument::fromJson(file.readAll()).object(); + QMap studentMap; + const QJsonObject studentObject = root.value("student_name_map").toObject(); + for (auto it = studentObject.begin(); it != studentObject.end(); ++it) { + studentMap[it.key()] = it.value().toString(); + } + + QMap classMap; + const QJsonObject classObject = root.value("class_name_map").toObject(); + for (auto it = classObject.begin(); it != classObject.end(); ++it) { + classMap[it.key()] = it.value().toString(); + } + + m_studentMappingModel.setMap(studentMap); + m_classMappingModel.setMap(classMap); +} + +void AppController::saveTimeSlotsToLocal() +{ + QFile file(localSettingsPath("timeslot_config.json")); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + return; + } + + QJsonArray array; + for (const TimeSlot &slot : m_timeSlotModel.timeSlots()) { + QJsonObject object; + object["name"] = slot.name; + object["start_time"] = slot.startTime.toString("HH:mm"); + object["end_time"] = slot.endTime.toString("HH:mm"); + object["enabled"] = slot.enabled; + array.append(object); + } + + QJsonObject root; + root["time_slots"] = array; + file.write(QJsonDocument(root).toJson(QJsonDocument::Indented)); +} + +void AppController::loadTimeSlotsFromLocal() +{ + QFile file(localSettingsPath("timeslot_config.json")); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + m_timeSlotModel.setTimeSlots(defaultTimeSlots()); + return; + } + + QVector timeSlots; + const QJsonArray array = QJsonDocument::fromJson(file.readAll()).object().value("time_slots").toArray(); + for (const QJsonValue &value : array) { + const QJsonObject object = value.toObject(); + timeSlots.push_back({ + object.value("name").toString(), + QTime::fromString(object.value("start_time").toString(), "HH:mm"), + QTime::fromString(object.value("end_time").toString(), "HH:mm"), + object.value("enabled").toBool(true) + }); + } + + m_timeSlotModel.setTimeSlots(timeSlots.isEmpty() ? defaultTimeSlots() : timeSlots); +} + +QString AppController::localSettingsPath(const QString &fileName) const +{ + const QString dirPath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); + QDir().mkpath(dirPath); + return dirPath + "/" + fileName; +} + +void AppController::updateFilterOptions() +{ + QSet classIds; + QSet studentIds; + + for (const AttendanceRecord &record : m_allRecords) { + classIds.insert(record.classId); + studentIds.insert(record.studentId); + } + + m_classOptions = {"全部"}; + QStringList classValues = classIds.values(); + std::sort(classValues.begin(), classValues.end()); + m_classOptions.append(classValues); + + m_studentOptions = {"全部"}; + QStringList studentValues = studentIds.values(); + std::sort(studentValues.begin(), studentValues.end()); + m_studentOptions.append(studentValues); + + emit filtersChanged(); +} + +void AppController::rebuildFilteredRecords() +{ + QVector items; + m_filteredRecords.clear(); + const QDate today = QDate::currentDate(); + + for (const AttendanceRecord &record : m_allRecords) { + if (m_selectedClassId != "全部" && record.classId != m_selectedClassId) { + continue; + } + + if (m_selectedStudentId != "全部" && record.studentId != m_selectedStudentId) { + continue; + } + + const QString displayName = mappedStudentName(record); + const QString candidateName = displayName.isEmpty() ? record.originalName : displayName; + if (!m_nameFilter.isEmpty() && !candidateName.contains(m_nameFilter, Qt::CaseInsensitive)) { + continue; + } + + const QDate recordDate = record.dateTime().date(); + if (m_dateFilterIndex == 1 && recordDate != today) { + continue; + } + if (m_dateFilterIndex == 2 && recordDate.daysTo(today) > 7) { + continue; + } + if (m_dateFilterIndex == 3 && recordDate.daysTo(today) > 30) { + continue; + } + if (m_dateFilterIndex == 4 && recordDate != m_specificDate) { + continue; + } + + m_filteredRecords.push_back(record); + } + + std::sort(m_filteredRecords.begin(), m_filteredRecords.end(), [](const AttendanceRecord &left, const AttendanceRecord &right) { + return left.timestamp > right.timestamp; + }); + + items.reserve(m_filteredRecords.size()); + for (const AttendanceRecord &record : m_filteredRecords) { + items.push_back({ + record.timestamp, + record.classId, + mappedClassName(record), + record.studentId, + mappedStudentName(record).isEmpty() ? record.originalName : mappedStudentName(record), + record.confidence, + record.status, + isSuccessStatus(record.status) + }); + } + + m_recordModel.setItems(items); + emit summaryChanged(); +} + +void AppController::rebuildStatistics() +{ + QMap statisticsMap; + const QDate today = QDate::currentDate(); + + for (const AttendanceRecord &record : m_allRecords) { + const QDate date = record.dateTime().date(); + if (date < m_statisticsStartDate || date > m_statisticsEndDate) { + continue; + } + + StudentStatistics &stats = statisticsMap[record.studentId]; + stats.studentId = record.studentId; + stats.name = mappedStudentName(record).isEmpty() ? record.originalName : mappedStudentName(record); + stats.totalCount += 1; + stats.averageConfidence += record.confidence; + if (date == today) { + stats.todayCount += 1; + } + if (!stats.lastCheckIn.isValid() || record.dateTime() > stats.lastCheckIn) { + stats.lastCheckIn = record.dateTime(); + } + } + + QVector items; + items.reserve(statisticsMap.size()); + m_statisticsStudentCount = statisticsMap.size(); + m_statisticsRecordCount = 0; + + for (auto it = statisticsMap.begin(); it != statisticsMap.end(); ++it) { + StudentStatistics stats = it.value(); + m_statisticsRecordCount += stats.totalCount; + if (stats.totalCount > 0) { + stats.averageConfidence /= static_cast(stats.totalCount); + } + items.push_back({ + stats.studentId, + stats.name, + stats.totalCount, + stats.todayCount, + stats.lastCheckIn.isValid() ? stats.lastCheckIn.toString("yyyy-MM-dd HH:mm:ss") : QStringLiteral("无"), + stats.averageConfidence + }); + } + + std::sort(items.begin(), items.end(), [](const StatisticsListModel::Item &left, const StatisticsListModel::Item &right) { + return left.studentId < right.studentId; + }); + + m_statisticsModel.setItems(items); + emit statisticsChanged(); +} + +QString AppController::mappedStudentName(const AttendanceRecord &record) const +{ + return m_studentMappingModel.toMap().value(record.studentId); +} + +QString AppController::mappedClassName(const AttendanceRecord &record) const +{ + return m_classMappingModel.toMap().value(record.classId, record.classId); +} + +void AppController::mergeFaceItems() +{ + QSet allIds; + for (const QString &id : m_facePhotoIds) { + allIds.insert(id); + } + for (const QString &id : m_allStudentIds) { + allIds.insert(id); + } + + QStringList sortedIds = allIds.values(); + std::sort(sortedIds.begin(), sortedIds.end()); + + QVector items; + items.reserve(sortedIds.size()); + for (const QString &id : sortedIds) { + const bool hasPhoto = m_facePhotoIds.contains(id); + const QString photoUrl = hasPhoto + ? QString("%1/api/face_photo/%2?ts=%3").arg(m_serverUrl, id, QString::number(QDateTime::currentMSecsSinceEpoch())) + : QString(); + items.push_back({ + id, + m_faceIdMapping.value(id, id), + hasPhoto, + photoUrl + }); + } + + m_faceModel.setItems(items); +} + +void AppController::setStatusMessage(const QString &message) +{ + if (message == m_statusMessage) { + return; + } + m_statusMessage = message; + emit statusMessageChanged(); +} + +void AppController::startReconnect(const QString &reason) +{ + if (!m_reconnecting) { + m_reconnecting = true; + m_reconnectAttempt = 0; + emit reconnectStateChanged(); + } + + const QString detail = reason.trimmed(); + if (m_reconnectCheckInFlight || m_reconnectTimer.isActive()) { + setStatusMessage(detail.isEmpty() + ? QStringLiteral("服务器连接失败,正在等待自动重连") + : QStringLiteral("服务器连接失败,正在等待自动重连: %1").arg(detail)); + return; + } + + setStatusMessage(detail.isEmpty() + ? QStringLiteral("服务器连接失败,%1 秒后自动重连").arg(ReconnectIntervalMs / 1000) + : QStringLiteral("服务器连接失败,%1 秒后自动重连: %2").arg(ReconnectIntervalMs / 1000).arg(detail)); + scheduleReconnect(); +} + +void AppController::stopReconnect() +{ + m_reconnectTimer.stop(); + m_reconnectCheckInFlight = false; + if (!m_reconnecting && m_reconnectAttempt == 0) { + return; + } + + m_reconnecting = false; + m_reconnectAttempt = 0; + emit reconnectStateChanged(); +} + +void AppController::scheduleReconnect() +{ + m_reconnectTimer.start(ReconnectIntervalMs); +} + +void AppController::runReconnectCheck() +{ + if (!m_reconnecting || m_reconnectCheckInFlight) { + return; + } + + m_reconnectCheckInFlight = true; + ++m_reconnectAttempt; + emit reconnectStateChanged(); + setStatusMessage(QStringLiteral("正在重连服务器,第 %1 次").arg(m_reconnectAttempt)); + m_apiClient.checkHealth(); +} diff --git a/src/AppController.h b/src/AppController.h new file mode 100644 index 0000000..d9f6b5a --- /dev/null +++ b/src/AppController.h @@ -0,0 +1,151 @@ +#ifndef APP_CONTROLLER_H +#define APP_CONTROLLER_H + +#include +#include +#include +#include +#include +#include +#include "ApiClient.h" +#include "FaceListModel.h" +#include "MappingListModel.h" +#include "RecordListModel.h" +#include "StatisticsListModel.h" +#include "TimeSlotListModel.h" + +class AppController : public QObject +{ + Q_OBJECT + Q_PROPERTY(RecordListModel* recordModel READ recordModel CONSTANT) + Q_PROPERTY(StatisticsListModel* statisticsModel READ statisticsModel CONSTANT) + Q_PROPERTY(TimeSlotListModel* timeSlotModel READ timeSlotModel CONSTANT) + Q_PROPERTY(MappingListModel* studentMappingModel READ studentMappingModel CONSTANT) + Q_PROPERTY(MappingListModel* classMappingModel READ classMappingModel CONSTANT) + Q_PROPERTY(FaceListModel* faceModel READ faceModel CONSTANT) + Q_PROPERTY(QStringList classOptions READ classOptions NOTIFY filtersChanged) + Q_PROPERTY(QStringList studentOptions READ studentOptions NOTIFY filtersChanged) + Q_PROPERTY(QString serverUrl READ serverUrl WRITE setServerUrl NOTIFY serverUrlChanged) + Q_PROPERTY(QString statusMessage READ statusMessage NOTIFY statusMessageChanged) + Q_PROPERTY(bool reconnecting READ reconnecting NOTIFY reconnectStateChanged) + Q_PROPERTY(int reconnectAttempt READ reconnectAttempt NOTIFY reconnectStateChanged) + Q_PROPERTY(int totalRecords READ totalRecords NOTIFY summaryChanged) + Q_PROPERTY(int todayRecords READ todayRecords NOTIFY summaryChanged) + Q_PROPERTY(int filteredCount READ filteredCount NOTIFY summaryChanged) + Q_PROPERTY(int loadedRecords READ loadedRecords NOTIFY summaryChanged) + Q_PROPERTY(int statisticsStudentCount READ statisticsStudentCount NOTIFY statisticsChanged) + Q_PROPERTY(int statisticsRecordCount READ statisticsRecordCount NOTIFY statisticsChanged) + Q_PROPERTY(QString statisticsRangeText READ statisticsRangeText NOTIFY statisticsChanged) + +public: + explicit AppController(QObject *parent = nullptr); + + RecordListModel *recordModel(); + StatisticsListModel *statisticsModel(); + TimeSlotListModel *timeSlotModel(); + MappingListModel *studentMappingModel(); + MappingListModel *classMappingModel(); + FaceListModel *faceModel(); + + QStringList classOptions() const; + QStringList studentOptions() const; + QString serverUrl() const; + QString statusMessage() const; + bool reconnecting() const; + int reconnectAttempt() const; + int totalRecords() const; + int todayRecords() const; + int filteredCount() const; + int loadedRecords() const; + int statisticsStudentCount() const; + int statisticsRecordCount() const; + QString statisticsRangeText() const; + + void setServerUrl(const QString &url); + + Q_INVOKABLE void refreshAll(); + Q_INVOKABLE void refreshRecords(); + Q_INVOKABLE void applyFilters(const QString &classId, + const QString &studentId, + const QString &nameFilter, + int dateFilterIndex, + const QString &specificDate); + Q_INVOKABLE void updateStatisticsRange(const QString &startDate, const QString &endDate); + Q_INVOKABLE bool exportFilteredRecords(const QString &fileUrl); + Q_INVOKABLE bool exportStatistics(const QString &fileUrl); + Q_INVOKABLE void clearAllRecords(); + Q_INVOKABLE void saveTimeSlots(); + Q_INVOKABLE void reloadTimeSlotsFromServer(); + Q_INVOKABLE void loadMappingsFromServer(); + Q_INVOKABLE void saveMappings(); + Q_INVOKABLE void refreshFaces(); + Q_INVOKABLE void saveFaceMappings(); + Q_INVOKABLE void deleteFace(const QString &studentId, bool deleteRecords); + Q_INVOKABLE void testConnection(); + +signals: + void filtersChanged(); + void serverUrlChanged(); + void statusMessageChanged(); + void reconnectStateChanged(); + void summaryChanged(); + void statisticsChanged(); + +private: + void loadLocalState(); + void saveServerUrl(); + void saveMappingsToLocal(); + void loadMappingsFromLocal(); + void saveTimeSlotsToLocal(); + void loadTimeSlotsFromLocal(); + QString localSettingsPath(const QString &fileName) const; + void updateFilterOptions(); + void rebuildFilteredRecords(); + void rebuildStatistics(); + QString mappedStudentName(const AttendanceRecord &record) const; + QString mappedClassName(const AttendanceRecord &record) const; + void mergeFaceItems(); + void setStatusMessage(const QString &message); + void startReconnect(const QString &reason); + void stopReconnect(); + void scheduleReconnect(); + void runReconnectCheck(); + + ApiClient m_apiClient; + QTimer m_reconnectTimer; + RecordListModel m_recordModel; + StatisticsListModel m_statisticsModel; + TimeSlotListModel m_timeSlotModel; + MappingListModel m_studentMappingModel; + MappingListModel m_classMappingModel; + FaceListModel m_faceModel; + + QVector m_allRecords; + QVector m_filteredRecords; + QStringList m_classOptions; + QStringList m_studentOptions; + QString m_serverUrl; + QString m_statusMessage; + bool m_reconnecting = false; + bool m_reconnectCheckInFlight = false; + int m_reconnectAttempt = 0; + int m_totalRecords = 0; + int m_todayRecords = 0; + + QString m_selectedClassId = "全部"; + QString m_selectedStudentId = "全部"; + QString m_nameFilter; + int m_dateFilterIndex = 1; + QDate m_specificDate = QDate::currentDate(); + + QDate m_statisticsStartDate = QDate::currentDate().addDays(-30); + QDate m_statisticsEndDate = QDate::currentDate(); + int m_statisticsStudentCount = 0; + int m_statisticsRecordCount = 0; + + QMap m_faceIdMapping; + QStringList m_facePhotoIds; + QStringList m_allStudentIds; +}; + +#endif diff --git a/src/AttendanceTypes.h b/src/AttendanceTypes.h new file mode 100644 index 0000000..b58ffae --- /dev/null +++ b/src/AttendanceTypes.h @@ -0,0 +1,59 @@ +#ifndef ATTENDANCE_TYPES_H +#define ATTENDANCE_TYPES_H + +#include +#include +#include +#include +#include + +struct AttendanceRecord +{ + QString timestamp; + QString studentId; + QString originalName; + double confidence = 0.0; + QString status; + QString classId = "0"; + + QDateTime dateTime() const + { + return QDateTime::fromString(timestamp, "yyyy-MM-dd HH:mm:ss"); + } +}; + +struct StudentStatistics +{ + QString studentId; + QString name; + int totalCount = 0; + int todayCount = 0; + QDateTime lastCheckIn; + double averageConfidence = 0.0; +}; + +struct TimeSlot +{ + QString name; + QTime startTime; + QTime endTime; + bool enabled = true; +}; + +inline QVector defaultTimeSlots() +{ + return { + {"上午签到", QTime(8, 0), QTime(9, 30), true}, + {"中午签退", QTime(12, 0), QTime(13, 0), true}, + {"下午签到", QTime(14, 0), QTime(15, 0), true}, + {"晚上签退", QTime(17, 0), QTime(18, 30), true} + }; +} + +Q_DECLARE_METATYPE(AttendanceRecord) +Q_DECLARE_METATYPE(StudentStatistics) +Q_DECLARE_METATYPE(TimeSlot) +Q_DECLARE_METATYPE(QVector) +Q_DECLARE_METATYPE(QVector) + +#endif diff --git a/src/CryptoUtils.cpp b/src/CryptoUtils.cpp new file mode 100644 index 0000000..fcad252 --- /dev/null +++ b/src/CryptoUtils.cpp @@ -0,0 +1,48 @@ +#include "CryptoUtils.h" +#include "crypto/tiny_aes.hpp" + +namespace { +QByteArray removePkcs7Padding(const QByteArray &data) +{ + if (data.isEmpty()) { + return {}; + } + + const int padding = static_cast(data.back()); + if (padding < 1 || padding > AES_BLOCKLEN || padding > data.size()) { + return data; + } + + for (int i = data.size() - padding; i < data.size(); ++i) { + if (static_cast(data.at(i)) != padding) { + return data; + } + } + + return data.left(data.size() - padding); +} +} + +QByteArray CryptoUtils::decryptAes128CbcBase64(const QByteArray &encryptedBase64) +{ + static const uint8_t key[AES_KEYLEN] = { + 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, + 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c + }; + + static const uint8_t iv[AES_BLOCKLEN] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f + }; + + const QByteArray encrypted = QByteArray::fromBase64(encryptedBase64); + if (encrypted.isEmpty() || (encrypted.size() % AES_BLOCKLEN) != 0) { + return {}; + } + + QByteArray buffer = encrypted; + AES_ctx ctx; + AES_init_ctx_iv(&ctx, key, iv); + AES_CBC_decrypt_buffer(&ctx, reinterpret_cast(buffer.data()), static_cast(buffer.size())); + return removePkcs7Padding(buffer); +} diff --git a/src/CryptoUtils.h b/src/CryptoUtils.h new file mode 100644 index 0000000..3763751 --- /dev/null +++ b/src/CryptoUtils.h @@ -0,0 +1,12 @@ +#ifndef CRYPTO_UTILS_H +#define CRYPTO_UTILS_H + +#include + +class CryptoUtils +{ +public: + static QByteArray decryptAes128CbcBase64(const QByteArray &encryptedBase64); +}; + +#endif diff --git a/src/FaceListModel.cpp b/src/FaceListModel.cpp new file mode 100644 index 0000000..91d7ab1 --- /dev/null +++ b/src/FaceListModel.cpp @@ -0,0 +1,85 @@ +#include "FaceListModel.h" + +FaceListModel::FaceListModel(QObject *parent) + : QAbstractListModel(parent) +{ +} + +int FaceListModel::rowCount(const QModelIndex &parent) const +{ + if (parent.isValid()) { + return 0; + } + return m_items.size(); +} + +QVariant FaceListModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid() || index.row() < 0 || index.row() >= m_items.size()) { + return {}; + } + + const Item &item = m_items.at(index.row()); + switch (role) { + case FaceIdRole: return item.faceId; + case StudentIdRole: return item.studentId; + case HasPhotoRole: return item.hasPhoto; + case PhotoUrlRole: return item.photoUrl; + default: return {}; + } +} + +bool FaceListModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + if (!index.isValid() || index.row() < 0 || index.row() >= m_items.size()) { + return false; + } + + if (role == StudentIdRole) { + m_items[index.row()].studentId = value.toString().trimmed(); + emit dataChanged(index, index, {role}); + return true; + } + + return false; +} + +Qt::ItemFlags FaceListModel::flags(const QModelIndex &index) const +{ + if (!index.isValid()) { + return Qt::NoItemFlags; + } + return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable; +} + +QHash FaceListModel::roleNames() const +{ + return { + {FaceIdRole, "faceId"}, + {StudentIdRole, "studentId"}, + {HasPhotoRole, "hasPhoto"}, + {PhotoUrlRole, "photoUrl"} + }; +} + +void FaceListModel::setItems(const QVector &items) +{ + beginResetModel(); + m_items = items; + endResetModel(); +} + +QVector FaceListModel::items() const +{ + return m_items; +} + +void FaceListModel::updateStudentId(int index, const QString &studentId) +{ + if (index < 0 || index >= m_items.size()) { + return; + } + + m_items[index].studentId = studentId.trimmed(); + emit dataChanged(this->index(index), this->index(index), {StudentIdRole}); +} diff --git a/src/FaceListModel.h b/src/FaceListModel.h new file mode 100644 index 0000000..f6d3b7e --- /dev/null +++ b/src/FaceListModel.h @@ -0,0 +1,47 @@ +#ifndef FACE_LIST_MODEL_H +#define FACE_LIST_MODEL_H + +#include +#include +#include +#include +#include +#include +#include + +class FaceListModel : public QAbstractListModel +{ + Q_OBJECT + +public: + enum Roles { + FaceIdRole = Qt::UserRole + 1, + StudentIdRole, + HasPhotoRole, + PhotoUrlRole + }; + + explicit FaceListModel(QObject *parent = nullptr); + + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + bool setData(const QModelIndex &index, const QVariant &value, int role) override; + Qt::ItemFlags flags(const QModelIndex &index) const override; + QHash roleNames() const override; + + struct Item { + QString faceId; + QString studentId; + bool hasPhoto = false; + QString photoUrl; + }; + + void setItems(const QVector &items); + QVector items() const; + Q_INVOKABLE void updateStudentId(int index, const QString &studentId); + +private: + QVector m_items; +}; + +#endif diff --git a/src/MappingListModel.cpp b/src/MappingListModel.cpp new file mode 100644 index 0000000..1ff47f6 --- /dev/null +++ b/src/MappingListModel.cpp @@ -0,0 +1,132 @@ +#include "MappingListModel.h" +#include + +MappingListModel::MappingListModel(QObject *parent) + : QAbstractListModel(parent) +{ +} + +int MappingListModel::rowCount(const QModelIndex &parent) const +{ + if (parent.isValid()) { + return 0; + } + return m_items.size(); +} + +QVariant MappingListModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid() || index.row() < 0 || index.row() >= m_items.size()) { + return {}; + } + + const Item &item = m_items.at(index.row()); + switch (role) { + case KeyRole: return item.key; + case ValueRole: return item.value; + default: return {}; + } +} + +bool MappingListModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + if (!index.isValid() || index.row() < 0 || index.row() >= m_items.size()) { + return false; + } + + Item &item = m_items[index.row()]; + switch (role) { + case KeyRole: item.key = value.toString().trimmed(); break; + case ValueRole: item.value = value.toString().trimmed(); break; + default: return false; + } + + emit dataChanged(index, index, {role}); + return true; +} + +Qt::ItemFlags MappingListModel::flags(const QModelIndex &index) const +{ + if (!index.isValid()) { + return Qt::NoItemFlags; + } + return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable; +} + +QHash MappingListModel::roleNames() const +{ + return { + {KeyRole, "entryKey"}, + {ValueRole, "entryValue"} + }; +} + +void MappingListModel::setMap(const QMap &map) +{ + QVector items; + items.reserve(map.size()); + for (auto it = map.begin(); it != map.end(); ++it) { + items.push_back({it.key(), it.value()}); + } + + std::sort(items.begin(), items.end(), [](const Item &left, const Item &right) { + bool leftNumeric = false; + bool rightNumeric = false; + int leftValue = left.key.toInt(&leftNumeric); + int rightValue = right.key.toInt(&rightNumeric); + if (leftNumeric && rightNumeric) { + return leftValue < rightValue; + } + return left.key < right.key; + }); + + beginResetModel(); + m_items = items; + endResetModel(); +} + +QMap MappingListModel::toMap() const +{ + QMap map; + for (const Item &item : m_items) { + if (!item.key.trimmed().isEmpty()) { + map[item.key.trimmed()] = item.value.trimmed(); + } + } + return map; +} + +void MappingListModel::addEntry(const QString &key, const QString &value) +{ + beginInsertRows(QModelIndex(), m_items.size(), m_items.size()); + m_items.push_back({key.trimmed(), value.trimmed()}); + endInsertRows(); +} + +void MappingListModel::updateEntry(int index, const QString &key, const QString &value) +{ + if (index < 0 || index >= m_items.size()) { + return; + } + + m_items[index] = {key.trimmed(), value.trimmed()}; + emit dataChanged(this->index(index), this->index(index)); +} + +void MappingListModel::removeEntry(int index) +{ + if (index < 0 || index >= m_items.size()) { + return; + } + + beginRemoveRows(QModelIndex(), index, index); + m_items.removeAt(index); + endRemoveRows(); +} + +void MappingListModel::clear() +{ + beginResetModel(); + m_items.clear(); + endResetModel(); +} diff --git a/src/MappingListModel.h b/src/MappingListModel.h new file mode 100644 index 0000000..2a4a5c7 --- /dev/null +++ b/src/MappingListModel.h @@ -0,0 +1,48 @@ +#ifndef MAPPING_LIST_MODEL_H +#define MAPPING_LIST_MODEL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class MappingListModel : public QAbstractListModel +{ + Q_OBJECT + +public: + enum Roles { + KeyRole = Qt::UserRole + 1, + ValueRole + }; + + explicit MappingListModel(QObject *parent = nullptr); + + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + bool setData(const QModelIndex &index, const QVariant &value, int role) override; + Qt::ItemFlags flags(const QModelIndex &index) const override; + QHash roleNames() const override; + + void setMap(const QMap &map); + QMap toMap() const; + + Q_INVOKABLE void addEntry(const QString &key, const QString &value); + Q_INVOKABLE void updateEntry(int index, const QString &key, const QString &value); + Q_INVOKABLE void removeEntry(int index); + Q_INVOKABLE void clear(); + +private: + struct Item { + QString key; + QString value; + }; + + QVector m_items; +}; + +#endif diff --git a/src/RecordListModel.cpp b/src/RecordListModel.cpp new file mode 100644 index 0000000..3850932 --- /dev/null +++ b/src/RecordListModel.cpp @@ -0,0 +1,59 @@ +#include "RecordListModel.h" + +RecordListModel::RecordListModel(QObject *parent) + : QAbstractListModel(parent) +{ +} + +int RecordListModel::rowCount(const QModelIndex &parent) const +{ + if (parent.isValid()) { + return 0; + } + return m_items.size(); +} + +QVariant RecordListModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid() || index.row() < 0 || index.row() >= m_items.size()) { + return {}; + } + + const Item &item = m_items.at(index.row()); + switch (role) { + case TimestampRole: return item.timestamp; + case ClassIdRole: return item.classId; + case ClassNameRole: return item.className; + case StudentIdRole: return item.studentId; + case NameRole: return item.name; + case ConfidenceRole: return item.confidence; + case ConfidenceTextRole: return QString::number(item.confidence * 100.0, 'f', 2) + "%"; + case StatusRole: return item.status; + case StatusTextRole: return item.success ? QStringLiteral("成功") : QStringLiteral("失败"); + case SuccessRole: return item.success; + default: return {}; + } +} + +QHash RecordListModel::roleNames() const +{ + return { + {TimestampRole, "timestamp"}, + {ClassIdRole, "classId"}, + {ClassNameRole, "className"}, + {StudentIdRole, "studentId"}, + {NameRole, "name"}, + {ConfidenceRole, "confidence"}, + {ConfidenceTextRole, "confidenceText"}, + {StatusRole, "status"}, + {StatusTextRole, "statusText"}, + {SuccessRole, "success"} + }; +} + +void RecordListModel::setItems(const QVector &items) +{ + beginResetModel(); + m_items = items; + endResetModel(); +} diff --git a/src/RecordListModel.h b/src/RecordListModel.h new file mode 100644 index 0000000..d367d5b --- /dev/null +++ b/src/RecordListModel.h @@ -0,0 +1,53 @@ +#ifndef RECORD_LIST_MODEL_H +#define RECORD_LIST_MODEL_H + +#include +#include +#include +#include +#include +#include +#include + +class RecordListModel : public QAbstractListModel +{ + Q_OBJECT + +public: + enum Roles { + TimestampRole = Qt::UserRole + 1, + ClassIdRole, + ClassNameRole, + StudentIdRole, + NameRole, + ConfidenceRole, + ConfidenceTextRole, + StatusRole, + StatusTextRole, + SuccessRole + }; + + explicit RecordListModel(QObject *parent = nullptr); + + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + QHash roleNames() const override; + + struct Item { + QString timestamp; + QString classId; + QString className; + QString studentId; + QString name; + double confidence = 0.0; + QString status; + bool success = false; + }; + + void setItems(const QVector &items); + +private: + QVector m_items; +}; + +#endif diff --git a/src/StatisticsListModel.cpp b/src/StatisticsListModel.cpp new file mode 100644 index 0000000..bd10986 --- /dev/null +++ b/src/StatisticsListModel.cpp @@ -0,0 +1,53 @@ +#include "StatisticsListModel.h" + +StatisticsListModel::StatisticsListModel(QObject *parent) + : QAbstractListModel(parent) +{ +} + +int StatisticsListModel::rowCount(const QModelIndex &parent) const +{ + if (parent.isValid()) { + return 0; + } + return m_items.size(); +} + +QVariant StatisticsListModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid() || index.row() < 0 || index.row() >= m_items.size()) { + return {}; + } + + const Item &item = m_items.at(index.row()); + switch (role) { + case StudentIdRole: return item.studentId; + case NameRole: return item.name; + case TotalCountRole: return item.totalCount; + case TodayCountRole: return item.todayCount; + case LastCheckInRole: return item.lastCheckIn; + case AverageConfidenceRole: return item.averageConfidence; + case AverageConfidenceTextRole: return QString::number(item.averageConfidence * 100.0, 'f', 2) + "%"; + default: return {}; + } +} + +QHash StatisticsListModel::roleNames() const +{ + return { + {StudentIdRole, "studentId"}, + {NameRole, "name"}, + {TotalCountRole, "totalCount"}, + {TodayCountRole, "todayCount"}, + {LastCheckInRole, "lastCheckIn"}, + {AverageConfidenceRole, "averageConfidence"}, + {AverageConfidenceTextRole, "averageConfidenceText"} + }; +} + +void StatisticsListModel::setItems(const QVector &items) +{ + beginResetModel(); + m_items = items; + endResetModel(); +} diff --git a/src/StatisticsListModel.h b/src/StatisticsListModel.h new file mode 100644 index 0000000..0fff392 --- /dev/null +++ b/src/StatisticsListModel.h @@ -0,0 +1,48 @@ +#ifndef STATISTICS_LIST_MODEL_H +#define STATISTICS_LIST_MODEL_H + +#include +#include +#include +#include +#include +#include +#include + +class StatisticsListModel : public QAbstractListModel +{ + Q_OBJECT + +public: + enum Roles { + StudentIdRole = Qt::UserRole + 1, + NameRole, + TotalCountRole, + TodayCountRole, + LastCheckInRole, + AverageConfidenceRole, + AverageConfidenceTextRole + }; + + explicit StatisticsListModel(QObject *parent = nullptr); + + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + QHash roleNames() const override; + + struct Item { + QString studentId; + QString name; + int totalCount = 0; + int todayCount = 0; + QString lastCheckIn; + double averageConfidence = 0.0; + }; + + void setItems(const QVector &items); + +private: + QVector m_items; +}; + +#endif diff --git a/src/TimeSlotListModel.cpp b/src/TimeSlotListModel.cpp new file mode 100644 index 0000000..98e7919 --- /dev/null +++ b/src/TimeSlotListModel.cpp @@ -0,0 +1,146 @@ +#include "TimeSlotListModel.h" +#include + +TimeSlotListModel::TimeSlotListModel(QObject *parent) + : QAbstractListModel(parent) +{ +} + +int TimeSlotListModel::rowCount(const QModelIndex &parent) const +{ + if (parent.isValid()) { + return 0; + } + return m_timeSlots.size(); +} + +QVariant TimeSlotListModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid() || index.row() < 0 || index.row() >= m_timeSlots.size()) { + return {}; + } + + const TimeSlot &slot = m_timeSlots.at(index.row()); + switch (role) { + case NameRole: return slot.name; + case StartTimeRole: return slot.startTime.toString("HH:mm"); + case EndTimeRole: return slot.endTime.toString("HH:mm"); + case EnabledRole: return slot.enabled; + default: return {}; + } +} + +bool TimeSlotListModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + if (!index.isValid() || index.row() < 0 || index.row() >= m_timeSlots.size()) { + return false; + } + + TimeSlot &slot = m_timeSlots[index.row()]; + switch (role) { + case NameRole: slot.name = value.toString(); break; + case StartTimeRole: slot.startTime = QTime::fromString(value.toString(), "HH:mm"); break; + case EndTimeRole: slot.endTime = QTime::fromString(value.toString(), "HH:mm"); break; + case EnabledRole: slot.enabled = value.toBool(); break; + default: return false; + } + + emit dataChanged(index, index, {role}); + return true; +} + +Qt::ItemFlags TimeSlotListModel::flags(const QModelIndex &index) const +{ + if (!index.isValid()) { + return Qt::NoItemFlags; + } + return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable; +} + +QHash TimeSlotListModel::roleNames() const +{ + return { + {NameRole, "name"}, + {StartTimeRole, "startTime"}, + {EndTimeRole, "endTime"}, + {EnabledRole, "enabled"} + }; +} + +void TimeSlotListModel::setTimeSlots(const QVector &timeSlots) +{ + beginResetModel(); + m_timeSlots = timeSlots; + endResetModel(); +} + +QVector TimeSlotListModel::timeSlots() const +{ + return m_timeSlots; +} + +QJsonArray TimeSlotListModel::toJsonArray() const +{ + QJsonArray array; + for (const TimeSlot &slot : m_timeSlots) { + QJsonObject object; + object["name"] = slot.name; + object["start_time"] = slot.startTime.toString("HH:mm"); + object["end_time"] = slot.endTime.toString("HH:mm"); + object["enabled"] = slot.enabled; + array.append(object); + } + return array; +} + +QVariantMap TimeSlotListModel::get(int index) const +{ + if (index < 0 || index >= m_timeSlots.size()) { + return {}; + } + + const TimeSlot &slot = m_timeSlots.at(index); + return { + {"name", slot.name}, + {"startTime", slot.startTime.toString("HH:mm")}, + {"endTime", slot.endTime.toString("HH:mm")}, + {"enabled", slot.enabled} + }; +} + +void TimeSlotListModel::addTimeSlot(const QString &name, const QString &startTime, const QString &endTime, bool enabled) +{ + beginInsertRows(QModelIndex(), m_timeSlots.size(), m_timeSlots.size()); + m_timeSlots.push_back({name.trimmed(), QTime::fromString(startTime, "HH:mm"), QTime::fromString(endTime, "HH:mm"), enabled}); + endInsertRows(); +} + +void TimeSlotListModel::updateTimeSlot(int index, const QString &name, const QString &startTime, const QString &endTime, bool enabled) +{ + if (index < 0 || index >= m_timeSlots.size()) { + return; + } + + TimeSlot &slot = m_timeSlots[index]; + slot.name = name.trimmed(); + slot.startTime = QTime::fromString(startTime, "HH:mm"); + slot.endTime = QTime::fromString(endTime, "HH:mm"); + slot.enabled = enabled; + emit dataChanged(this->index(index), this->index(index)); +} + +void TimeSlotListModel::removeTimeSlot(int index) +{ + if (index < 0 || index >= m_timeSlots.size()) { + return; + } + + beginRemoveRows(QModelIndex(), index, index); + m_timeSlots.removeAt(index); + endRemoveRows(); +} + +void TimeSlotListModel::resetToDefault() +{ + setTimeSlots(defaultTimeSlots()); +} diff --git a/src/TimeSlotListModel.h b/src/TimeSlotListModel.h new file mode 100644 index 0000000..1c5e07e --- /dev/null +++ b/src/TimeSlotListModel.h @@ -0,0 +1,48 @@ +#ifndef TIMESLOT_LIST_MODEL_H +#define TIMESLOT_LIST_MODEL_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include "AttendanceTypes.h" + +class TimeSlotListModel : public QAbstractListModel +{ + Q_OBJECT + +public: + enum Roles { + NameRole = Qt::UserRole + 1, + StartTimeRole, + EndTimeRole, + EnabledRole + }; + + explicit TimeSlotListModel(QObject *parent = nullptr); + + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + bool setData(const QModelIndex &index, const QVariant &value, int role) override; + Qt::ItemFlags flags(const QModelIndex &index) const override; + QHash roleNames() const override; + + void setTimeSlots(const QVector &timeSlots); + QVector timeSlots() const; + QJsonArray toJsonArray() const; + + Q_INVOKABLE QVariantMap get(int index) const; + Q_INVOKABLE void addTimeSlot(const QString &name, const QString &startTime, const QString &endTime, bool enabled); + Q_INVOKABLE void updateTimeSlot(int index, const QString &name, const QString &startTime, const QString &endTime, bool enabled); + Q_INVOKABLE void removeTimeSlot(int index); + Q_INVOKABLE void resetToDefault(); + +private: + QVector m_timeSlots; +}; + +#endif diff --git a/src/crypto/tiny_aes.hpp b/src/crypto/tiny_aes.hpp new file mode 100644 index 0000000..10a432d --- /dev/null +++ b/src/crypto/tiny_aes.hpp @@ -0,0 +1,217 @@ +/* + * Tiny AES128 C++ 移植版本 + * 与STM32端使用相同的AES实现,保证兼容性 + */ + +#ifndef _TINY_AES_HPP_ +#define _TINY_AES_HPP_ + +#include +#include + +#define AES_BLOCKLEN 16 +#define AES_KEYLEN 16 +#define AES_keyExpSize 176 + +struct AES_ctx +{ + uint8_t RoundKey[AES_keyExpSize]; +}; + +static const uint8_t sbox[256] = { + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 +}; + +static const uint8_t rsbox[256] = { + 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, + 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, + 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, + 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, + 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, + 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, + 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, + 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, + 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, + 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, + 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, + 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, + 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, + 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, + 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d +}; + +static const uint8_t Rcon[11] = { + 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36 +}; + +#define getSBoxValue(num) (sbox[(num)]) +#define getSBoxInvert(num) (rsbox[(num)]) + +inline void KeyExpansion(uint8_t *RoundKey, const uint8_t *Key) +{ + unsigned i, j, k; + uint8_t tempa[4]; + for (i = 0; i < 4; ++i) { + RoundKey[(i * 4) + 0] = Key[(i * 4) + 0]; + RoundKey[(i * 4) + 1] = Key[(i * 4) + 1]; + RoundKey[(i * 4) + 2] = Key[(i * 4) + 2]; + RoundKey[(i * 4) + 3] = Key[(i * 4) + 3]; + } + + for (i = 4; i < 44; ++i) { + k = (i - 1) * 4; + tempa[0] = RoundKey[k + 0]; + tempa[1] = RoundKey[k + 1]; + tempa[2] = RoundKey[k + 2]; + tempa[3] = RoundKey[k + 3]; + + if (i % 4 == 0) { + const uint8_t u8tmp = tempa[0]; + tempa[0] = tempa[1]; + tempa[1] = tempa[2]; + tempa[2] = tempa[3]; + tempa[3] = u8tmp; + + tempa[0] = getSBoxValue(tempa[0]); + tempa[1] = getSBoxValue(tempa[1]); + tempa[2] = getSBoxValue(tempa[2]); + tempa[3] = getSBoxValue(tempa[3]); + tempa[0] ^= Rcon[i / 4]; + } + + j = i * 4; + k = (i - 4) * 4; + RoundKey[j + 0] = RoundKey[k + 0] ^ tempa[0]; + RoundKey[j + 1] = RoundKey[k + 1] ^ tempa[1]; + RoundKey[j + 2] = RoundKey[k + 2] ^ tempa[2]; + RoundKey[j + 3] = RoundKey[k + 3] ^ tempa[3]; + } +} + +static void AddRoundKey(uint8_t round, uint8_t *state, const uint8_t *RoundKey) +{ + uint8_t i, j; + for (i = 0; i < 4; ++i) { + for (j = 0; j < 4; ++j) { + state[i * 4 + j] ^= RoundKey[(round * 16) + (i * 4 + j)]; + } + } +} + +static void InvSubBytes(uint8_t *state) +{ + for (uint8_t i = 0; i < 16; ++i) { + state[i] = getSBoxInvert(state[i]); + } +} + +static void InvShiftRows(uint8_t *state) +{ + uint8_t temp; + temp = state[13]; + state[13] = state[9]; + state[9] = state[5]; + state[5] = state[1]; + state[1] = temp; + + temp = state[2]; + state[2] = state[10]; + state[10] = temp; + temp = state[6]; + state[6] = state[14]; + state[14] = temp; + + temp = state[3]; + state[3] = state[7]; + state[7] = state[11]; + state[11] = state[15]; + state[15] = temp; +} + +static uint8_t xtime(uint8_t x) +{ + return ((x << 1) ^ (((x >> 7) & 1U) * 0x1bU)); +} + +static uint8_t Multiply(uint8_t x, uint8_t y) +{ + return (((y & 1U) * x) ^ + (((y >> 1U) & 1U) * xtime(x)) ^ + (((y >> 2U) & 1U) * xtime(xtime(x))) ^ + (((y >> 3U) & 1U) * xtime(xtime(xtime(x)))) ^ + (((y >> 4U) & 1U) * xtime(xtime(xtime(xtime(x)))))); +} + +static void InvMixColumns(uint8_t *state) +{ + int i; + uint8_t a, b, c, d; + for (i = 0; i < 4; ++i) { + a = state[i * 4 + 0]; + b = state[i * 4 + 1]; + c = state[i * 4 + 2]; + d = state[i * 4 + 3]; + + state[i * 4 + 0] = Multiply(a, 0x0eU) ^ Multiply(b, 0x0bU) ^ Multiply(c, 0x0dU) ^ Multiply(d, 0x09U); + state[i * 4 + 1] = Multiply(a, 0x09U) ^ Multiply(b, 0x0eU) ^ Multiply(c, 0x0bU) ^ Multiply(d, 0x0dU); + state[i * 4 + 2] = Multiply(a, 0x0dU) ^ Multiply(b, 0x09U) ^ Multiply(c, 0x0eU) ^ Multiply(d, 0x0bU); + state[i * 4 + 3] = Multiply(a, 0x0bU) ^ Multiply(b, 0x0dU) ^ Multiply(c, 0x09U) ^ Multiply(d, 0x0eU); + } +} + +inline void InvCipher(uint8_t *state, const uint8_t *RoundKey) +{ + uint8_t round = 0; + AddRoundKey(10, state, RoundKey); + + for (round = 9; ; --round) { + InvShiftRows(state); + InvSubBytes(state); + AddRoundKey(round, state, RoundKey); + if (round == 0) { + break; + } + InvMixColumns(state); + } +} + +inline void AES_init_ctx_iv(struct AES_ctx *ctx, const uint8_t *key, const uint8_t *iv) +{ + KeyExpansion(ctx->RoundKey, key); + memcpy(ctx->RoundKey + AES_keyExpSize - AES_BLOCKLEN, iv, AES_BLOCKLEN); +} + +inline void AES_CBC_decrypt_buffer(struct AES_ctx *ctx, uint8_t *buf, size_t length) +{ + size_t i; + uint8_t storeNextIv[AES_BLOCKLEN]; + uint8_t *Iv = ctx->RoundKey + AES_keyExpSize - AES_BLOCKLEN; + + for (i = 0; i < length; i += AES_BLOCKLEN) { + memcpy(storeNextIv, buf + i, AES_BLOCKLEN); + InvCipher(buf + i, ctx->RoundKey); + + for (uint8_t j = 0; j < AES_BLOCKLEN; ++j) { + buf[i + j] ^= Iv[j]; + } + memcpy(Iv, storeNextIv, AES_BLOCKLEN); + } +} + +#endif