#include "mainwindow.h" #include #include #include #include #include #include #include #include "api/userapi.h" #include "appevent.h" #include "capturer/video/wgc/App.h" #include "network/websocketclient.h" #include "qboxlayout.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 class MainWidget : public QWidget { public: explicit MainWidget(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()) : QWidget(parent, f) , userProfile(nullptr) , chatView(nullptr) { setupUI(); initConnect(); } ~MainWidget() { if (userProfile) { delete userProfile; userProfile = nullptr; } } void setupUI() { // 创建并显示 AvRecorder AvRecorder *avRecorder = new AvRecorder(this); // 确保 AvRecorder 不会阻止鼠标事件传递 avRecorder->setAttribute(Qt::WA_TransparentForMouseEvents, false); // 创建用户信息显示 userProfile = new UserProfileWidget(this); chatView = new ChatWindow(); chatView->setMinimumWidth(400); QWidget *widget = new QWidget; QVBoxLayout *vbox = new QVBoxLayout(widget); vbox->setContentsMargins(0, 0, 0, 0); vbox->addWidget(userProfile, 0); vbox->addWidget(chatView, 1); // chatView->setStyleSheet(" background-color: red"); // 创建水平分割器 QSplitter *splitter = new QSplitter(Qt::Horizontal, this); splitter->addWidget(avRecorder); splitter->addWidget(widget); // 设置初始大小比例为4:1 splitter->setStretchFactor(0, 70); splitter->setStretchFactor(1, 30); // QHBoxLayout *hLayout = new QHBoxLayout(); // hLayout->addWidget(avRecorder, 4); // 权重为4 // hLayout->addWidget(chatView, 1); // 权重为1 // hLayout->setContentsMargins(0, 0, 0, 0); // hLayout->setSpacing(0); QWidget *statusBar = avRecorder->statusBar(); //statusBar->setMaximumHeight(40); // 设置最大高度为20像素 // 创建垂直布局,用于放置水平布局和状态栏 QVBoxLayout *mainLayout = new QVBoxLayout(this); mainLayout->addWidget(splitter, 1); mainLayout->addWidget(statusBar, 0); mainLayout->setContentsMargins(0, 0, 0, 0); mainLayout->setSpacing(0); setLayout(mainLayout); } void initConnect() { connect(AppEvent::instance(), &AppEvent::connectionStateChanged, this, [this](bool connected) { if (userProfile) { userProfile->setStatus(connected ? "在线" : "离线"); } }); } UserProfileWidget *userProfile; ChatWindow *chatView; }; 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 = new MainWidget(this); stackedWidget->addWidget(mainWidget); connect(loginWidget, &LoginWidget::loginRequested, this, &MainWindow::onLoginSuccess); resize(1280, 600); // 显示登录页面 stackedWidget->setCurrentWidget(loginWidget); // 退出处理 connect(mainWidget->userProfile, &UserProfileWidget::logoutClicked, this, [this]() { AppEvent *appEvent = AppEvent::instance(); appEvent->setJwtToken(QString()); appEvent->setRefreshTime(0); if (mainWidget->userProfile) { stackedWidget->setCurrentWidget(loginWidget); } }); } MainWindow::~MainWindow() {} void MainWindow::onLoginSuccess(const QString &username, const QString &password) { // 准备登录参数 AuthApi::LoginParams loginParams; loginParams.username = username; loginParams.password = password; // 使用链式调用处理异步请求 // AsyncHelper::http(AuthApi::loginApi(loginParams)) // .withMask(stackedWidget) // .onSuccess([this](const HttpResponse &response) { // qDebug() << response.code << response.data << response.message; // if (response.code != 200) { // BubbleTip::showTip(this, response.message, BubbleTip::Top, 3000); // return; // } // QString token; // if (response.data.isObject()) { // QJsonObject dataObj = response.data.toObject(); // token = dataObj["accessToken"].toString(); // AppEvent::instance()->setJwtToken(token); // authLogin(); // } // if (!token.isEmpty()) { // qDebug() << "登录成功,获取到的令牌:" << token; // // 存储令牌 // } // }) // .onError( // [this](const QString &error) { BubbleTip::showTip(this, error, BubbleTip::Top, 2000); }) // .exec(); // 执行请求 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) { if (response.code != 200) { BubbleTip::showTip(this, response.message, BubbleTip::Top, 3000); return; } QString token; if (response.data.isObject()) { QJsonObject dataObj = response.data.toObject(); token = dataObj["accessToken"].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 == 200 && accessCodes.code == 200) { qDebug() << "所有请求成功完成"; // 这里可以添加后续处理逻辑 } // 创建主界面部件 mainWidget->userProfile->setUsername(user.username); mainWidget->chatView->initWebsocket(); stackedWidget->addWidget(mainWidget); stackedWidget->setCurrentWidget(mainWidget); }) .fail([this](const std::exception &e) { // 处理错误 qWarning() << "登录后处理失败:" << e.what(); BubbleTip::showTip(this, QString("请求失败: %1").arg(e.what()), BubbleTip::Top, 3000, BubbleTip::Type::Error); }); }