QT:基于QT实现Boost搜索引擎客户端

文章目录

  • 写在前面
    • 关于服务器
    • 开源仓库和项目上线
    • 其他文档说明
  • 登录界面
    • 主体设计思路
    • 验证登录
    • 注册功能
  • 注册界面
  • 主体界面
  • main函数中绑定槽函数

写在前面

关于服务器

本项目使用的是一个仿mudou库one-thread-one-loop式并发服务器的组件,关于该组件的细节内容在下面的链接中:

仿mudou库one-thread-one-loop式并发服务器

自主实现Boost搜索引擎

开源仓库和项目上线

本项目已开源到下面链接下的仓库当中

search-engine-online

并且项目已经部署在了Linux服务器上,具体访问方式可以点击下面链接进行访问:

81.70.160.28:8081

其他文档说明

针对于日志的信息,我采用了之前写的一份利用可变参数实现日志的代码,具体链接如下

C++:可变参数实现日志系统

这是一篇使用QT框架来实现一个配套与Boost搜索引擎的客户端的制作文档

登录界面

主体设计思路

首先设计一个简单的登陆界面

并且给对应的按钮提供对应的槽函数,如果验证成功了,就直接跳转到一个主页面

验证登录

下面是对于验证登录的逻辑,由于是连接到数据库的,所以这里需要用到网络通信,一个大体的思路就是把账号和密码提取出来,然后通过网络传输过去,在后端进行分析,再返回来,这里直接使用QT框架现成的Http部分

void Login::on_pushButton_login_clicked()
{// 点击登录后先验证账号和密码// 把账号和密码提取出来const QString& username = ui->lineEdit_account->text();const QString& password = ui->lineEdit_passwd->text();sender(username, password);
}void Login::sender(const QString &username, const QString &password)
{// 1. 获取到输入框中的 URL, 构造 QUrl 对象QUrl url(serverurl);// 2. 构造 HTTP 请求对象,并设置请求头QNetworkRequest request(url);request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");// 创建 JSON 文档并填充数据QJsonObject jsonObject;jsonObject["username"] = username;jsonObject["password"] = password;// 将 JSON 文档转换为 QByteArrayQJsonDocument jsonDoc(jsonObject);QByteArray postData = jsonDoc.toJson();// 3. 发送 POST 请求(这次包含JSON数据主体)QNetworkReply* response = manager->post(request, postData);// 4. 通过信号槽来处理响应connect(response, &QNetworkReply::finished, this, [=]() {if (response->error() == QNetworkReply::NoError){// 响应正确QString html(response->readAll());qDebug() << "Response:" << html;// 验证正确后跳转到对应界面QMessageBox box(QMessageBox::Information, "提示", "登录成功", QMessageBox::Ok, this);int ret = box.exec();if(ret == QMessageBox::Ok){this->close();this->sig_mainwindow();}}else{// 响应出错QString error = response->errorString();qDebug() << "Error:" << error;qDebug() << "账号或密码错误";int ret = QMessageBox::information(this, "提示", "账号或密码输入错误, 是否重新登录", QMessageBox::Yes | QMessageBox::No);if(ret == QMessageBox::Yes)ui->lineEdit_passwd->clear();elsethis->close();}response->deleteLater();});
}

至于验证登录的逻辑,这里不显示,因为这是后端已经完成的部分

注册功能

void Login::on_pushButton_register_clicked()
{this->sig_register();
}

注册界面

这个界面也没什么好说的,和登录界面的逻辑基本一样,只是调用服务端的API即可

#include "register.h"
#include "ui_register.h"
#include <QMessageBox>
#include <QGridLayout>
#include <QString>
#include <QMessageBox>
#include <QJsonObject>
#include <QDebug>
#include <QJsonDocument>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>const QString& serverreq = "http://62.234.180.244:8081/register";Register::Register(QWidget *parent) :QDialog(parent),ui(new Ui::Register)
{ui->setupUi(this);// 设置一下标题和图标this->setWindowTitle("注册");this->setWindowIcon(QIcon(QPixmap(":/imag/register.png")));// 实例化对象manager = new QNetworkAccessManager(this);
}Register::~Register()
{delete ui;
}void Register::jump()
{this->show();
}void Register::on_pushButton_register_clicked()
{// 点击注册后先验证账号和密码// 把账号和密码提取出来const QString& username = ui->lineEdit_account->text();const QString& password = ui->lineEdit_passwd->text();sender(username, password);
}void Register::sender(const QString &username, const QString &password)
{// 1. 获取到输入框中的 URL, 构造 QUrl 对象QUrl url(serverreq);// 2. 构造 HTTP 请求对象,并设置请求头QNetworkRequest request(url);request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");// 创建 JSON 文档并填充数据QJsonObject jsonObject;jsonObject["username"] = username;jsonObject["password"] = password;// 将 JSON 文档转换为 QByteArrayQJsonDocument jsonDoc(jsonObject);QByteArray postData = jsonDoc.toJson();// 3. 发送 POST 请求(这次包含JSON数据主体)QNetworkReply* response = manager->post(request, postData);// 4. 通过信号槽来处理响应connect(response, &QNetworkReply::finished, this, [=]() {if (response->error() == QNetworkReply::NoError){// 响应正确QString html(response->readAll());qDebug() << "Response:" << html;// 验证正确后跳转到对应界面QMessageBox box(QMessageBox::Information, "提示", "注册成功", QMessageBox::Ok, this);int ret = box.exec();if(ret == QMessageBox::Ok){this->close();}}else{// 响应出错QString error = response->errorString();qDebug() << "Error:" << error;qDebug() << "用户名重复!";int ret = QMessageBox::information(this, "提示", "用户名重复!是否重新注册", QMessageBox::Yes | QMessageBox::No);if(ret == QMessageBox::Yes)ui->lineEdit_passwd->clear();elsethis->close();}response->deleteLater();});
}

主体界面

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QGridLayout>
#include <QString>
#include <QMessageBox>
#include <QJsonObject>
#include <QDebug>
#include <QJsonDocument>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QUrlQuery>
#include <QJsonArray>const QString& server_search = "http://62.234.180.244:8081/s";
const QString& server_hotwords = "http://62.234.180.244:8081/hotwords";MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 设置一下标题和图标this->setWindowTitle("查找");this->setWindowIcon(QIcon(QPixmap(":/imag/search.png")));// 实例化对象manager = new QNetworkAccessManager(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::jump()
{this->show();
}void MainWindow::on_pushButton_clicked()
{// 当点击搜索按钮时,要传递一个/s请求// 0. 获取到用户要搜索的关键字const QString& user_search = ui->lineEdit_search->text();// 1. 获取到输⼊框中的 URL, 构造 QUrl 对象QUrl url(server_search);// 2. 将用户搜索的关键字作为查询参数添加到URL中,构造 HTTP 请求对象QUrlQuery query;query.addQueryItem("word", user_search);url.setQuery(query);QNetworkRequest request(url);// 3. 发送 GET 请求QNetworkReply* response = manager->get(request);// 4. 通过信号槽来处理响应connect(response, &QNetworkReply::finished, this, [=](){if (response->error() == QNetworkReply::NoError){QString html(response->readAll());displaySearchResults(html);}else{ui->plainTextEdit->setPlainText(response->errorString());}response->deleteLater();});// 点击搜索的时候也把热词统计显示出来handle_hotwords();
}void MainWindow::on_pushButton_2_clicked()
{handle_hotwords();
}void MainWindow::handle_hotwords()
{// 当点击搜索按钮时,要传递一个/s请求// 1. 获取到输⼊框中的 URL, 构造 QUrl 对象QUrl url(server_hotwords);// 2. 将用户搜索的关键字作为查询参数添加到URL中,构造 HTTP 请求对象QNetworkRequest request(url);// 3. 发送 GET 请求QNetworkReply* response = manager->get(request);// 4. 通过信号槽来处理响应connect(response, &QNetworkReply::finished, this, [=](){if (response->error() == QNetworkReply::NoError){QString html(response->readAll());displayHotWords(html);}else{ui->plainTextEdit_2->setPlainText(response->errorString());}response->deleteLater();});
}void MainWindow::displaySearchResults(const QString &jsonData)
{QJsonDocument doc = QJsonDocument::fromJson(jsonData.toUtf8());if (!doc.isArray()){ui->plainTextEdit->setPlainText("解析结果错误,不是有效的JSON数组");return;}QStringList formattedResults;const QJsonArray results = doc.array();for (const QJsonValue &result : results){if (result.isObject()){const QJsonObject obj = result.toObject();QString title = obj["title"].toString();QString desc = obj["desc"].toString();QString url = obj["url"].toString();QString line = QString("%1\n%2\n%3\n").arg(title, desc, url);formattedResults.append(line);// formattedResults.append("\n");}}ui->plainTextEdit->setPlainText(formattedResults.join("\n"));
}void MainWindow::displayHotWords(const QString &jsonData)
{QJsonDocument doc = QJsonDocument::fromJson(jsonData.toUtf8());if (!doc.isObject()){ui->plainTextEdit_2->setPlainText("解析结果错误,不是有效的JSON对象");return;}QJsonObject jsonObj = doc.object();if (!jsonObj.contains("hotWords") || !jsonObj["hotWords"].isArray()){ui->plainTextEdit_2->setPlainText("未找到或'hotWords'不是数组");return;}const QJsonArray hotWordsArray = jsonObj["hotWords"].toArray();QStringList formattedHotWords;for (const QJsonValue &wordObj : hotWordsArray){if (wordObj.isObject()){QJsonObject word = wordObj.toObject();int count = word["count"].toInt();QString wordStr = word["word"].toString();QString line = QString("%1 :%2次\n").arg(wordStr, QString::number(count));formattedHotWords.append(line);}}// 添加分隔符或自定义样式后,设置到plainTextEdit中ui->plainTextEdit_2->setPlainText(formattedHotWords.join("\n"));
}

main函数中绑定槽函数

#include "mainwindow.h"
#include "login.h"
#include "register.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Login log;log.show();MainWindow mainwindow;Register registerPage; // 创建Register类的实例// 建立两个槽,一个跳转到mainwindow,一个跳转到registerQObject::connect(&log, &Login::sig_mainwindow, &mainwindow, &MainWindow::jump);QObject::connect(&log, &Login::sig_register, &registerPage, &Register::jump); // 修正接收对象为registerPage实例return a.exec();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/7319.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络4——网络层8 软件定义网络 SDN

文章目录 一、介绍1、简介2、原理3、案例1&#xff09;普通2&#xff09;负载均衡的例子3&#xff09;防火墙的例子 二、控制层面1、特征2、层次 一、介绍 1、简介 SDN的概念最初由斯坦福大学N.McKeown于2009年首先提出。当时还只是在学术界进行探讨的一种新的网络体系结构。…

Nvidia发布Llama3-ChatQA-1.5: 提升对话问答和表格推理能力,平均性能超越GPT-4

前言 近日&#xff0c;Nvidia推出了一款名为Llama3-ChatQA-1.5的对话问答模型。该模型在对话式问答和检索增强型生成等能力方面表现出色&#xff0c;在综合评测指标上甚至超越了当前业界顶尖的GPT-4模型。 技术特点 Llama3-ChatQA-1.5是基于Llama-3基础模型训练而成的。相比之…

JS本地储存基础(一)

本地存储分类-localStorage 语法&#xff1a;存储数据&#xff1a;(本来没有就是储存&#xff0c;本来有就是修改) localStorage.setltem(key,value) 获取数据&#xff1a; localStorage.getltem(key) 删除数据&#xff1a; localStorage.removeltem(key) 注意&#xf…

HTML 基本骨架(二)

基本骨架 <!DOCTYPE html> <!-- 声明文档类型为 HTML --> <html lang"en"> <!-- 指定文档语言为英语 --> <head><meta charset"UTF-8"> <!-- 设置字符编码为 UTF-8 --><meta name"viewport" cont…

东湖高新区2023年现代服务业政策奖励申报对象、申报方式

东湖高新区信息服务、科技服务、科创金融、新消费、商务服务、现代物流等行业的服务业企业开展2023年度现代服务业政策奖励申报工作,有关申报内容如下&#xff0c;东湖高新区的企业单位可以了解一下&#xff0c;有问题看名字找我。 一、申报对象 工商注册、税务关系及统计关系…

《QT实用小工具·五十八》模仿VSCode的可任意拖拽的Tab标签组

1、概述 源码放在文章末尾 该项目实现了模仿VSCode的可任意拖拽的Tab标签组&#xff0c;包含如下功能&#xff1a; 拖拽标签页至新窗口 拖拽标签页合并控件 无限嵌套的横纵分割布局&#xff08;类似Qt Creator的编辑框&#xff09; 获取当前使用的标签组、标签页 自动向上合并…

Elementui的el-footer标签使用报错

Elementui的el-footer标签使用报错 其余标签的使用没有报错信息 el-footer的报错信息 原因: ​ 警告信息表示 Vue 不识别 <el-footer> 解决方式: 在组件中进行引入和暴露

Hive数据模型

Hive数据模型 1. 表&#xff08;Table&#xff09;&#xff1a; 表是数据库中的基本组成单位&#xff0c;用于存储数据。它由一系列的行和列组成&#xff0c;每行代表一个记录&#xff0c;每列代表一种属性或字段。创建表时&#xff0c;你需要定义列的数据类型、约束和索引等信…

Linux:进程概念(二.查看进程、父进程与子进程、进程状态详解)

Linux&#xff1a;进程概念&#xff08;二.查看进程、父进程与子进程、进程状态详解&#xff09; 上次讲了一下:Linux&#xff1a;冯诺依曼体系结构、操作系统、初识进程 文章目录 1.查看进程1.1准备工作1.2 指令&#xff1a;ps—显示当前系统中运行的进程信息1.3查看进程属性…

偶然发现了Python的一个BUG。。。

一般情况下&#xff0c;dict(id1, **{id: 1})这句代码应该报TypeError。但如果在捕获了其他异常的情况下&#xff0c;再来执行这句代码&#xff0c;却是会报KeyError&#xff0c;如下图&#xff1a; Python3.10和Python3.9也能复现该情况&#xff0c;正当我摩拳踩掌&#xff0c…

C语言知识点补充——ASCLL码表

1、ASCLL码表 ASCII码表&#xff08;American Standard Code for Information Interchange&#xff09;是一种用于将字符编码为数字的标准。它定义了128个字符的编码方式&#xff0c;包括数字、字母、标点符号和控制字符等。每个字符都对应一个唯一的7位或8位二进制数 2、Ascl…

【Ping】Windows 网络延迟测试 ping 、telnet、tcping 工具

ping 命令 属于网络层的ICMP协议&#xff0c;只能检查 IP 的连通性或网络连接速度&#xff0c; 无法检测IP的端口状态。 telnet telnet命令&#xff0c;属于应用层的协议&#xff0c;用于远程登录&#xff0c;也可用于检测IP的端口状态。但是功能有限&#xff0c;只能检测一时…

如何使git提交的时候忽略一些特殊文件?

认识.gitignore文件 在生成远程仓库的时候我们会看到这样一个选项&#xff1a; 这个.gitignore文件有啥用呢&#xff1f; .gotignore文件是Git版本控制系统中的一个特殊文件。用来指定哪些文件或者目录不被Git追踪或者提交到版本库中。也就意味着&#xff0c;如果我们有一些文…

在spring中使用bytebuddy 对bean做Aop拦截

背景 拦截spring 中的某个bean拦截其方法的调用。在其前后做一些类似于aop的操作 拦截bean MyBeanDefinitionRegistryPostProcessor import lombok.extern.slf4j.Slf4j; import net.bytebuddy.ByteBuddy; import net.bytebuddy.asm.Advice; import org.springframework.bea…

Linux下网络编程-简易Epll服务器和客户端

Linux下网络编程-简易Epll服务器和客户端 简易Epll服务器: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #include <sys/epoll.h>#define B…

NIO BIO AIO详解

BIO: 同步阻塞I/O&#xff0c;是JDK1.4之前的传统IO模型。 线程发起IO请求后&#xff0c;一直阻塞&#xff0c;直到缓冲区数据就绪后&#xff0c;再进入下一步操作。 NIO:同步非阻塞IO&#xff0c;当线程发起IO请求后&#xff0c;不需要阻塞&#xff0c;会立即返回。用户线程不…

对视频实现人脸识别

惯例先上结果&#xff1a; 在c opencv Chapter8 - Face Detection中介绍了人脸图片的标记&#xff0c;而视频其实是每一帧图片所组成&#xff0c;因此也能实现对视频的人脸识别&#xff0c;由于模型的劣势&#xff0c;实现的效果一般。 重点介绍写出视频函数&#xff1a;out.o…

linux学习笔记——硬盘原理以及linux中的sector与block

在计算机硬盘中&#xff0c;最小的存储单位叫做扇区sector&#xff0c;0.5kb&#xff0c;多个连续扇区组合在一起形成了块block&#xff0c;最小的块包含8个扇区&#xff0c;4kb 我们可以在linux中印证 创建一个新的文件2.txt&#xff0c;查看文件大小为0k 在文件中添加字符后…

Gradle基础学习(七) 认识插件

Gradle构建在一个插件系统上&#xff0c;本身主要由基础设施组成&#xff0c;比如有一个先进的依赖解析引擎&#xff0c;而其他功能则来自插件。 插件是提供额外功能给Gradle构建系统的软件组件。 插件可以被应用到Gradle构建脚本中&#xff0c;以添加新的任务、配置或其他与构…

第八篇:深入探索操作系统架构:从基础到前沿

深入探索操作系统架构&#xff1a;从基础到前沿 1 引言 在当今这个高速发展的数字时代&#xff0c;操作系统无疑是计算机科学领域的基石之一。它不仅是计算机硬件与最终用户之间的桥梁&#xff0c;更是实现高效计算和资源管理的关键。操作系统的架构&#xff0c;即其内部结构和…