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://www.pswp.cn/bicheng/95904.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95904.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95904.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Flink反壓問題

背景在使用flink的過程中&#xff0c;多次遇到過反壓&#xff08;backpressure&#xff09;的問題&#xff0c;這通常是因為數據處理的速率超過了數據源或下游系統的處理能力導致。反壓的底層剖析網絡流控一個重要的概念是網絡流控&#xff0c;如上圖&#xff0c;不同的Consume…

Day5-中間件與請求處理

昨天搞定了異步優化&#xff0c;今天來解決一些實際問題。Day4的API雖然性能不錯&#xff0c;但還缺少一些企業級應用必備的功能。 現在的問題 前端無法訪問API&#xff08;跨域問題&#xff09;沒有請求日志&#xff0c;出問題難以排查錯誤信息格式不統一缺少統一的請求處理機…

【LeetCode熱題100道筆記】反轉鏈表

題目描述 給你單鏈表的頭節點 head &#xff0c;請你反轉鏈表&#xff0c;并返回反轉后的鏈表。 示例 1&#xff1a;輸入&#xff1a;head [1,2,3,4,5] 輸出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a;輸入&#xff1a;head [1,2] 輸出&#xff1a;[2,1] 示例 3&#xff1a;…

Oracle:select top 5

在Oracle數據庫中實現SELECT TOP 5功能需采用特定語法&#xff0c;因其原生不支持TOP關鍵字。以下是兩種主流實現方式&#xff1a;?ROWNUM結合子查詢?先通過子查詢排序數據&#xff0c;再在外層用ROWNUM限制行數&#xff1a;SELECT * FROM ( SELECT * FROM 表名 ORDER BY 排序…

Kubernetes(k8s) 增量更新 po

文章目錄前言k8s 增量更新 po1. 導出要新建po 的控制器配置2. 配置詳解3. 重新生效前言 如果您覺得有用的話&#xff0c;記得給博主點個贊&#xff0c;評論&#xff0c;收藏一鍵三連啊&#xff0c;寫作不易啊^ _ ^。 ??而且聽說點贊的人每天的運氣都不會太差&#xff0c;實在…

基于stm32的車輛安全駕駛預警系統

若該文為原創文章&#xff0c;轉載請注明原文出處。一、 項目背景與引言(一) 研究背景及意義道路交通安全是全球性的重大公共安全問題。據統計&#xff0c;絕大多數交通事故源于駕駛員的危險狀態&#xff08;疲勞、分心、健康突發狀況&#xff09;和危險駕駛行為&#xff08;超…

React學習教程,從入門到精通, React 新創建組件語法知識點及案例代碼(11)

React 新創建組件語法知識點及案例代碼 React 是由 Facebook 開發的一個用于構建用戶界面的 JavaScript 庫。隨著 React 的不斷發展&#xff0c;創建組件的方式也在不斷演進。本文將詳細介紹 React 中創建組件的最新語法&#xff0c;包括函數組件&#xff08;Functional Compo…

SQL Server全鏈路安全防護

SQL Server 的安全性是一個多層次、綜合性的體系&#xff0c;旨在保護數據免受未授權訪問、篡改和泄露。其核心安全機制可概括為以下幾個方面&#xff1a;1. 身份驗證&#xff08;Authentication&#xff09; Windows 身份驗證&#xff1a; 使用 Windows 賬戶&#xff08;域/本…

如何利用Web3提升企業競爭力

在這個信息爆炸的時代&#xff0c;Web3技術以其獨特的去中心化、透明性和用戶主權特性&#xff0c;成為企業提升競爭力的新戰場。本文將深入探討企業如何把握Web3的浪潮&#xff0c;實現業務的飛躍。 1. 把握Web3的核心價值 Web3的核心在于去中心化、透明性和用戶主權。這種模式…

HOW - 在瀏覽器下載一個 Excel 表格文件

文章目錄一、技術方案二、前端具體實現代碼分析轉換邏輯注意事項一、技術方案 后臺返回 base64 數據 {code: 0,data: "base64;...", }前端進行數據格式轉化并下載成 Excel 文件 這篇文章主要介紹第二個步驟的實現。 二、前端具體實現 代碼 src/utils/transform…

【Android】Room數據庫的使用

三三要成為安卓糕手 引入 Room是一個抽象層&#xff0c;對SQLite進行了封裝&#xff0c;簡化了SQLite數據庫的操作&#xff0c;讓開發者能以更加對象化的方式進行數據庫操作&#xff1b;Room解決了SQLite操作繁瑣&#xff0c;容易產生錯誤的問題&#xff0c;讓開發者能以更加對…

Next.js 介紹:為什么選擇它來構建你的下一個 Web 應用?

Next.js 介紹&#xff1a;為什么選擇它來構建你的下一個 Web 應用&#xff1f; 作者&#xff1a;碼力無邊你好&#xff0c;歡迎來到我們的 Next.js 專欄&#xff01;在接下來的 30 篇文章中&#xff0c;我們將一起踏上一段從入門到精通的旅程&#xff0c;深入探索這個強大而優雅…

開發環境 之 編輯器、編譯器、IDE梳理

小生第一次學習編程時&#xff0c;懵懵搞不懂編輯器、編譯器、IDE區別&#xff0c;雖然這對前期學習編程語言語法的影響不是很大&#xff0c;但是現在梳理一下&#xff0c;總歸心里踏實些。 一、概念及區別 IDE是前面幾者的集成&#xff0c;前面幾個分別是IDE的子集。對比維度編…

高級RAG策略學習(六)——Contextual Chunk Headers(CCH)技術

Contextual Chunk Headers&#xff08;CCH&#xff09;技術深度解析 第一部分&#xff1a;理論基礎與核心原理 一、核心定義&#xff1a;給 “文本塊” 加 “上下文標簽” Contextual Chunk Headers&#xff08;上下文塊標題&#xff0c;簡稱 CCH&#xff09;本質是為文檔拆分后…

人形機器人控制系統核心芯片從SoC到ASIC的進化路徑

目錄&#xff1a; 0 前言 1 人形機器人控制系統核心芯片選擇ASIC而非SoC的理由 1.1 SoC的架構特征 1.2 ASIC的架構特征 1.3 SoC的優勢&#xff08;繼承軟件生態&#xff09; 1.4 ASIC的優勢&#xff08;硬件底層算法就是應用層算法&#xff09; 1.5 人形機器人控制系統核…

linux thread 線程一

thread線程是linux的重要概念。線程不能獨立存在&#xff0c;必須在進程中存在。一個進程必須有一個線程&#xff0c;如果進程中沒有創建新線程&#xff0c;進程啟動后本身就有一個線程。使用getpid、getppid獲取進程的進程ID和父進程ID。使用pthread_self獲取到當前線程的ID。…

Arduino Nano33 BLESense Rev2【室內空氣質量檢測語音識別藍牙調光臺燈】

一、硬件介紹 1、產品特點 Arduino Nano 33 BLE Rev2&#xff0c;利用了nRF52840微控制器的先進功能。這款32位Arm Cortex-M4 CPU 64 MHz與MicroPython的兼容性增強了板子的靈活性&#xff0c;該開發板的突出特點是其藍牙低功耗&#xff08;BLE&#xff09;功能&#xff0c;使…

【問題解決】mac筆記本遇到鼠標無法點擊鍵盤可響應處理辦法?(Command+Option+P+R)

背景 如題。鼠標無法點擊&#xff0c;但可以移動。觸控板能夠波動&#xff0c;鼠標翻頁能夠work&#xff0c;但是點擊后無法響應。 根因 電腦緩存問題 解決辦法 重置PRAM&#xff1a; 確保電腦關機狀態&#xff08;可以先sudo shutdown -t now)&#xff08;一定要確保&#xff…

23ai數據庫通過SQLcl生成AWR報告

?1. 查看現有快照SQL> awr list snap;SNAP_ID DBID BEGIN_INTERVAL_TIME END_INTERVAL_TIME FLUSH_LEVEL __________ _____________ __________________________________ __________________________________ ______________793 …

基于Django+Vue3+YOLO的智能氣象檢測系統

基于DjangoVue3YOLO的智能氣象檢測系統 項目簡介 本項目是一個集成了人工智能深度學習技術的現代化氣象檢測系統&#xff0c;采用前后端分離架構&#xff0c;結合YOLO目標檢測算法&#xff0c;實現了對氣象現象的智能識別與分析。系統提供了完整的用戶管理、實時檢測、歷史記錄…