当前位置: 首页 > news >正文

Boost搜索引擎 网络库与前端(4)

文章目录

  • 前言
  • 一、引入网络库模块
    • 引入cpp-httplib
    • cpp-httplib测试
    • 正式编写http_server
  • 二、前端模块
  • 三、项目的可能拓展
  • 总结


前言

  终于到了最后一篇喽,嘻嘻!


一、引入网络库模块

引入cpp-httplib

  下载地址如下,我个人不喜欢新版本
  cpp-httplib 下载地址

  我们将cpp-httplib放到项目中的test目录下,并解压 unzip 好
在这里插入图片描述

  再建立软链接到我们的项目路径下

在这里插入图片描述

cpp-httplib测试

#include "cpp-httplib/httplib.h"    int main()    
{    // 创建一个Server对象,本质就是搭建服务端httplib::Server svr; // 这里注册用于处理 get 请求的函数,当收到对应的 get 请求时(请求hi时),程序会执行对应的函数(也就是lambda表达式)svr.Get("/hi", [](const httplib::Request& req, httplib::Response& rsp){ //设置 get "hi" 请求返回的内容   rsp.set_content("hello world!", "text/plain; charset=utf-8");                                                                                                            });   // 绑定端口(8080),启动监听(0.0.0.0表示监听任意端口)svr.listen("0.0.0.0", 8080);  return 0;    
}

  相应的,我们更新一下我们的 makefile

# 定义编译器
CXX = g++# 定义编译器选项
CXXFLAGS = -std=c++11 # 定义目标程序
PARSER = parser
DEBUG = debug
HTTP_SERVER = http_server# 定义链接库
PARSER_LIBS = -lboost_system -lboost_filesystem
DEBUG_LIBS = -ljsoncpp
HTTP_SERVER_LIBS = -ljsoncpp -lpthread# 默认目标
.PHONY: all
all: $(PARSER) $(DEBUG) $(HTTP_SERVER)# 编译parser 
$(PARSER): parser.cc$(CXX) $(CXXFLAGS) -o $@ $< $(PARSER_LIBS)# 编译debug 
$(DEBUG): debug.cc$(CXX) $(CXXFLAGS) -o $@ $< $(DEBUG_LIBS)# 编译http_server 
$(HTTP_SERVER): http_server.cc$(CXX) $(CXXFLAGS) -o $@ $< $(HTTP_SERVER_LIBS)# 清理生成的文件
.PHONY: clean
clean:rm -rf $(PARSER) $(DEBUG) $(HTTP_SERVER)

  编译后,我们直接开始运行这个 http_server

在这里插入图片描述

  访问这个端口后有如下效果

在这里插入图片描述

  问题在于,现在当我们访问服务器的时候,确实这个效果

在这里插入图片描述

  问题在于,像我们访问百度时,www.baidu.com ,百度会给一个首页,所以在我们的项目目录下呢,也需要一个首页,于是我们在本地目录下创建了一下这个 wwwroot 目录,在该目录下创建了一个 index.html 文件

在这里插入图片描述

正式编写http_server

  好了,测试结束,我们差不多大概也了解了 cpphttplib 的用法

#include "cpp-httplib/httplib.h"
#include "searcher.hpp"const std::string input = "data/raw_html/raw.txt";
const std::string root_path = "./wwwroot";int main()
{ns_searcher::Searcher search;search.InitSearcher(input);// 创建一个Server对象,本质就是搭建服务端httplib::Server svr;// 访问首页svr.set_base_dir(root_path.c_str());// 这里注册用于处理 get 请求的函数,当收到对应的get请求时(请求s时),程序会执行对应的函数(也就是lambda表达式)svr.Get("/s", [&search](const httplib::Request &req, httplib::Response &rsp){//has_param:这个函数用来检测用户的请求中是否有搜索关键字,参数中的word就是给用户关键字取的名字(类似word=split)    if(!req.has_param("word")){    rsp.set_content("必须要有搜索关键字!", "text/plain; charset=utf-8");    return;    }    // 获取用户输入的关键字std::string word = req.get_param_value("word");    std::cout << "用户在搜索:" << word << std::endl;    // 根据关键字,构建json串std::string json_string;    search.Search(word, &json_string);// 设置 get "s" 请求返回的内容,返回的是根据关键字,构建json串内容rsp.set_content(json_string, "application/json"); });std::cout << "服务器启动成功......" << std::endl;// 绑定端口(8080),启动监听(0.0.0.0表示监听任意端口)svr.listen("0.0.0.0", 8080);return 0;
}

  此时我直接开始 make 编译代码,先执行 parser 进行数据清洗,然后执行 http_server ,搭建服务,创建单例,构建索引,发生请求(根据用户输入的关键字,进行查找索引,构建 json 串),最后响应给我们用户

在这里插入图片描述

  索引建立成功,服务器也启动成功,这个时候进行浏览器访问 (8080/s)

在这里插入图片描述

  访问(8080/s?word=split),结果如下

在这里插入图片描述

  到这里差不多我们的后端部分也就完成了

二、前端模块

  其实我前端不怎么会,以下代码几乎都是参考的 DeepSeek,不得不说 AI 还是强大

  以下给出 DS大人 的前端代码

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"><script src="https://code.jquery.com/jquery-3.6.0.min.js"></script><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css"><title>Boost 智能搜索引擎</title><style>:root {--primary-color: #4e6ef2;--hover-color: #3b5bdb;--background: #f8f9fa;--text-dark: #2d3436;--text-light: #636e72;}* {margin: 0;padding: 0;box-sizing: border-box;font-family: 'Segoe UI', system-ui, sans-serif;}body {background: var(--background);min-height: 100vh;padding: 2rem 1rem;}.container {max-width: 800px;margin: 0 auto;animation: fadeIn 0.5s ease;}.search-box {display: flex;gap: 10px;margin-bottom: 2rem;box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);border-radius: 30px;background: white;padding: 5px;}.search-input {flex: 1;padding: 1rem 1.5rem;border: none;border-radius: 30px;font-size: 1.1rem;color: var(--text-dark);transition: all 0.3s ease;}.search-input:focus {outline: none;box-shadow: 0 0 0 3px rgba(78, 110, 242, 0.2);}.search-btn {padding: 0 2rem;border: none;border-radius: 30px;background: linear-gradient(135deg, var(--primary-color), var(--hover-color));color: white;font-size: 1rem;font-weight: 600;cursor: pointer;transition: all 0.3s ease;display: flex;align-items: center;gap: 8px;}.search-btn:hover {background: var(--hover-color);transform: translateY(-1px);}.result-item {background: white;border-radius: 12px;padding: 1.5rem;margin-bottom: 1rem;box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);transition: transform 0.2s ease;}.result-item:hover {transform: translateX(5px);}.result-title {color: var(--primary-color);font-size: 1.2rem;font-weight: 600;margin-bottom: 0.5rem;text-decoration: none;display: flex;align-items: center;gap: 8px;}.result-title:hover {text-decoration: underline;}.result-desc {color: var(--text-dark);line-height: 1.6;margin-bottom: 0.5rem;display: -webkit-box;-webkit-line-clamp: 3;-webkit-box-orient: vertical;overflow: hidden;}.result-url {color: var(--text-light);font-size: 0.9rem;font-family: monospace;}.loading {text-align: center;padding: 2rem;color: var(--text-light);}@keyframes fadeIn {from {opacity: 0;transform: translateY(20px);}to {opacity: 1;transform: translateY(0);}}@media (max-width: 768px) {.search-box {flex-direction: column;border-radius: 15px;}.search-btn {padding: 1rem;justify-content: center;}}</style>
</head><body><div class="container"><div class="search-box"><input type="text" class="search-input" placeholder="请输入搜索关键词..." autofocus><button class="search-btn" onclick="search()"><i class="fas fa-search"></i>搜索</button></div><div class="result-container"></div></div><script>// 增强功能$(document).ready(() => {// 回车键搜索$('.search-input').keypress(e => e.which === 13 && search())// 输入框交互$('.search-input').focus(function () {if (this.value === "请输入搜索关键词...") this.value = ""}).blur(function () {if (this.value === "") this.value = "请输入搜索关键词..."})})function search() {const query = $('.search-input').val().trim()if (!query) return// 显示加载状态$('.result-container').html(`<div class="loading"><i class="fas fa-spinner fa-spin"></i>正在搜索中...</div>`)$.ajax({url: `/s?word=${encodeURIComponent(query)}`,method: 'GET',success: buildResults,error: () => {$('.result-container').html(`<div class="result-item" style="color: #dc3545;"><i class="fas fa-exclamation-triangle"></i>请求失败,请稍后重试</div>`)}})}function buildResults(data) {const container = $('.result-container').empty()if (data.length === 0) {container.html(`<div class="result-item"><div style="color: var(--text-light); text-align: center;"><i class="fas fa-search-minus"></i>没有找到相关结果</div></div>`)return}data.forEach(item => {const elem = $(`<div class="result-item"><a href="${item.url}" class="result-title" target="_blank"><i class="fas fa-link"></i>${item.title}</a><p class="result-desc">${item.desc}</p><div class="result-url">${item.url}</div></div>`)container.append(elem)})}</script>
</body></html>

  再次编译运行后,我们来看看效果,不得不感概nb,这要是以我目前的前端水平,完全设计不出来

在这里插入图片描述

三、项目的可能拓展

  这个时候,发挥我们的脑袋,可以看看我们到底有什么可以拓展发挥的地方

  1. 建立整站搜索

  2. 不使用组件,而是自己设计一下对应的各种方案

  3. 在我们的搜索引擎中,添加竞价排名

  4. 热次统计,智能显示搜索关键词(字典树,优先级队列)

  5. 设置登陆注册,引入对 mysql 的使用

  等等都是可以考虑的地方


总结

  结束喽,其实我这个项目包括上一个都是比较简单的,怎么说呢,刚入门,害,加油吧!


文章转载自:

http://WlUpHVH1.wtcyz.cn
http://2Sl1voKW.wtcyz.cn
http://IlogP1UE.wtcyz.cn
http://YEVmBnZr.wtcyz.cn
http://zs9aIjYA.wtcyz.cn
http://AqY80odf.wtcyz.cn
http://wdMcUzbz.wtcyz.cn
http://xuzX4z2K.wtcyz.cn
http://gPXA7scK.wtcyz.cn
http://sxdjnms6.wtcyz.cn
http://oK8d2OUF.wtcyz.cn
http://tScqoH04.wtcyz.cn
http://Os0zBRDe.wtcyz.cn
http://09GSxo5h.wtcyz.cn
http://EKHzgVOb.wtcyz.cn
http://BLFefRKj.wtcyz.cn
http://vk4TPiqe.wtcyz.cn
http://nxbnSGKx.wtcyz.cn
http://SJfP7G3c.wtcyz.cn
http://lBThJCvo.wtcyz.cn
http://iZgRJbgh.wtcyz.cn
http://a4mz7jeQ.wtcyz.cn
http://8QRxz19J.wtcyz.cn
http://gqRm0xg8.wtcyz.cn
http://CFtGDwyi.wtcyz.cn
http://juTF4UMK.wtcyz.cn
http://A5IyUKBu.wtcyz.cn
http://3ht0Wpxs.wtcyz.cn
http://4eKBKiAY.wtcyz.cn
http://QPqb7rdV.wtcyz.cn
http://www.dtcms.com/a/368083.html

相关文章:

  • 服务器硬盘“Unconfigured Bad“状态解决方案
  • 警惕!你和ChatGPT的对话,可能正在制造分布式妄想
  • 中天互联:AI 重塑制造,解锁智能生产新效能​
  • 如何制造一个AI Agent:从“人工智障”到“人工智能”的奇幻漂流
  • 鼓励员工提出建议,激发参与感——制造企业软件应用升级的密钥
  • 2025世界职校技能大赛总决赛争夺赛汽车制造与维修赛道比赛资讯
  • LeetCode 240: 搜索二维矩阵 II - 算法详解(秒懂系列
  • [特殊字符] AI时代依然不可或缺:精通后端开发的10个GitHub宝藏仓库
  • 【MFC】对话框节点属性:Condition(条件)
  • 【MFC 小白日记】对话框编辑器里“原型图像”到底要不要勾?3 分钟看懂!
  • 【为YOLOv11Seg添加MFC界面】详细指南
  • VBA 中使用 ADODB 操作 SQLite 插入中文乱码问题
  • Python 实现 Markdown 与 Word 高保真互转(含批量转换)
  • 如何在 C# 中将文本转换为 Word 以及将 Word 转换为文本
  • 电商企业如何选择高性价比仓储系统?专业定制+独立部署,源码交付无忧
  • Mysql:由逗号分隔的id组成的varchar联表替换成对应文字
  • Windows环境下实现GitLab与Gitee仓库代码提交隔离
  • PXM的JAVA并发编程学习总结
  • Cursor Pair Programming:在前端项目里用 AI 快速迭代 UI 组件
  • java面试中经常会问到的集合问题有哪些(基础版)
  • 23种设计模式——桥接模式 (Bridge Pattern)详解
  • AI日报 - 2025年09月05日
  • 23ai数据库通过SQLcl生成AWR报告
  • 销量骤降、降价自救,新别克GL8能否成为上汽通用救星?
  • 如何解决 OutOfMemoryError 内存溢出 —— 原因、定位与解决方案
  • Kubernetes实战系列(4)
  • 2026第二届郑州台球展会,8月15-17日即将再次盛大举办
  • AM J BOT | 黄芪稳健骨架树构建
  • 【完整源码+数据集+部署教程】骰子点数识别图像实例分割系统源码和数据集:改进yolo11-DCNV2
  • vue3+arcgisAPI4示例:绘图工具动态修改样式导出GeoJSON(附源码下载)