#include "mainwindow.h" #include #include #include #include #include #include #include #include "api/roomapi.h" #include "api/userapi.h" #include "appevent.h" #include "capturer/video/wgc/App.h" #include "network/websocketclient.h" #include "qboxlayout.h" #include "qlistwidget.h" #include "qobject.h" #include "ui/av_recorder.h" #include "views/loginwindow.h" #include "widgets/bubbletip.h" #include "widgets/chatView/chat1/chatview.h" #include "widgets/chatView/chatwindow.h" #include "widgets/framelessbase.h" #include "widgets/maskoverlay.h" #include "widgets/userprofilewidget.h" #include #include #include #include "util/qformatter.h" #include #include #include #include "AvPlayer2/PlayWidget.h" #include "MainPanel.h" #include // MainWidget 类已移除,相关实现迁移到 MainPanel.cpp/h MainWindow::MainWindow(QWidget *parent) : TMainWindow(parent) { setWindowTitle("test"); setCentralWidget(new QWidget(this)); // 创建主布局 layout = new QVBoxLayout(centralWidget()); layout->setContentsMargins(0, 0, 0, 0); // 创建堆叠部件 stackedWidget = new QStackedWidget(this); layout->addWidget(stackedWidget); // 创建登录页面 loginWidget = new LoginWidget(this); stackedWidget->addWidget(loginWidget); mainWidget = nullptr; connect(loginWidget, &LoginWidget::loginRequested, this, &MainWindow::onLoginSuccess); resize(1280, 600); // 显示登录页面 stackedWidget->setCurrentWidget(loginWidget); } MainWindow::~MainWindow() {} void MainWindow::createMainWindow() { if (mainWidget) { delete mainWidget; mainWidget = nullptr; } // 主窗口 mainWidget = new MainPanel(this); stackedWidget->addWidget(mainWidget); // 退出处理 connect(mainWidget, &MainPanel::logoutClicked, this, [this]() { AppEvent *appEvent = AppEvent::instance(); appEvent->setJwtToken(QString()); // 清理token appEvent->setRefreshTime(0); // 清理token刷新时间 appEvent->setRoles({}); // 清理角色 appEvent->setUserId({}); // 清理用户id stackedWidget->setCurrentWidget(loginWidget); }); } void MainWindow::onLoginSuccess(const QString &username, const QString &password) { // 准备登录参数 AuthApi::LoginParams loginParams; loginParams.username = username; loginParams.password = password; QFuture loginApiFuture = AuthApi::loginApi(loginParams); // 使用fromQFuture将QFuture转换为QPromise QtPromise::QPromise loginApiPromise = QtPromise::resolve(loginApiFuture); MaskOverlay::instance()->show(stackedWidget, 0, MaskOverlay::ActiveWindow); loginApiPromise .then([this](const HttpResponse &response) { qDebug() << response.code << response.data << response.message; if (response.code != 0) { BubbleTip::showTip(this, response.message, BubbleTip::Top, 3000); return; } QString token; if (response.data.isObject()) { QJsonObject dataObj = response.data.toObject(); qDebug() << dataObj; token = dataObj["token"].toString(); AppEvent::instance()->setJwtToken(token); authLogin(); // 获取登录信息 } if (!token.isEmpty()) { qDebug() << "登录成功,获取到的令牌:" << token; // 存储令牌 } }) .finally([]() { MaskOverlay::instance()->hide(); }); } void MainWindow::authLogin() { // 创建两个异步操作的Promise QFuture userInfoFuture = getUserInfoApi(); QFuture accessCodesFuture = AuthApi::getAccessCodesApi(); // 使用fromQFuture将QFuture转换为QPromise QtPromise::QPromise userInfoPromise = QtPromise::resolve(userInfoFuture); QtPromise::QPromise accessCodesPromise = QtPromise::resolve(accessCodesFuture); // 使用QtPromise::all等待所有Promise完成 QtPromise::all(QVector>{userInfoPromise, accessCodesPromise}) .then([this](const QVector &results) { // 处理用户信息 // 用户信息: 200 QJsonValue(object, QJsonObject({"id":"e52e6b47-f4d3-43a6-b481-570ffcc1c9db","role":[],"username":"admin"})) "success" // 访问代码: 203 QJsonValue(null) "Error transferring http://127.0.0.1:8888/api/auth/codes - server replied: Not Found" const HttpResponse &userInfo = results[0]; qDebug() << "用户信息:" << userInfo.code << userInfo.data << userInfo.message; UserInfo user = JsonMapper::fromJson(userInfo.data); // 处理访问代码 const HttpResponse &accessCodes = results[1]; qDebug() << "访问代码:" << accessCodes.code << accessCodes.data << accessCodes.message; // 处理成功的逻辑 if (userInfo.code == 0 && accessCodes.code == 0) { qDebug() << "所有请求成功完成"; // 这里可以添加后续处理逻辑 } qDebug() << "当前角色:" << user.roleName; qDebug() << "当前ID:" << user.id; AppEvent::instance()->setRoles(user.roleName); AppEvent::instance()->setUserId(user.id); AppEvent::instance()->setUserName(user.username); // 创建主界面部件 createMainWindow(); mainWidget->setRole(user.roleName); stackedWidget->addWidget(mainWidget); stackedWidget->setCurrentWidget(mainWidget); checkRoom(); }) .fail([this](const std::exception &e) { // 处理错误 AppEvent::instance()->setRoles({}); AppEvent::instance()->setUserId({}); qWarning() << "登录后处理失败:" << e.what(); BubbleTip::showTip(this, QString("请求失败: %1").arg(e.what()), BubbleTip::Top, 3000, BubbleTip::Type::Error); }); } void MainWindow::checkRoom() { // 创建两个异步操作的Promise RoomInfo roomInfo; QFuture getRoomListFuture = getRoomListApi(roomInfo); // 使用fromQFuture将QFuture转换为QPromise QtPromise::QPromise userInfoPromise = QtPromise::resolve(getRoomListFuture); // 使用QtPromise::all等待所有Promise完成 QtPromise::all(QVector>{userInfoPromise}) .then([this](const QVector &results) { const HttpResponse &getRoomList = results[0]; qDebug() << "访问房间:" << getRoomList.data << getRoomList.rawData << getRoomList.message; // JsonObject({"data":[{"createdAt":1752512296000,"createdId":null,"description":"","id":"019809df-75db-73db-adbb-2ca949a9329a","maxUsers":100,"name":"默认房间","ownerId":"0196e8ac-c737-7f93-ba6a-6562f2c8854d","status":1,"updatedAt":1752512296000}],"total":1}) RoomListData roomListData(getRoomList.data.toObject()); QList RoomInfos = roomListData.getRooms(); qDebug() << RoomInfos.size(); for (int var = 0; var < RoomInfos.size(); ++var) { const RoomInfo room = RoomInfos.at(var); if (room.name) { QListWidgetItem *item = new QListWidgetItem(room.name.value_or(""), mainWidget->roomListWidget()); item->setData(Qt::UserRole + 100, room.id.value_or("")); mainWidget->roomListWidget()->addItem(item); } } if (RoomInfos.size() > 0) { mainWidget->roomListWidget()->setCurrentRow(0); mainWidget->setPushRoomId(RoomInfos[0].id.value_or("")); // mainWidget->chatView->initWebsocket(RoomInfos[0].id.value()); // if (AvRecorder *avRecorder = qobject_cast(mainWidget->playerWidget)) { // SettingsPage::Param param; // param.liveUrl = "rtmp://192.168.3.76:1935/stream/V1"; // param.liveName = RoomInfos[0].id.value_or("").toStdString(); // avRecorder->setSettings(param); // } } }) .fail([this](const std::exception &e) { // 处理错误 qWarning() << "[异常]获取房间失败:" << e.what(); BubbleTip::showTip(this, QString("请求失败: %1").arg(e.what()), BubbleTip::Top, 3000, BubbleTip::Type::Error); }); }