「Mac暢玩AIGC與多模態41」開發篇36 - 用 ArkTS 構建聚合搜索前端頁面

一、概述

本篇基于上一節 Python 實現的雙通道搜索服務(聚合 SearxNG + 本地知識庫),構建一個完整的 HarmonyOS ArkTS 前端頁面。用戶可在輸入框中輸入關鍵詞,實時查詢本地服務 http://localhost:5001/search?q=...,返回結果自動渲染在頁面中,支持中文和英文關鍵詞的綜合查詢體驗。

二、目標說明

  • 使用 ArkTS 開發搜索界面組件
  • 輸入關鍵詞并發起 HTTP 請求
  • 支持異步加載并實時顯示搜索結果
  • 解析標準結構體 { results: [{ title, content, url }] } 并渲染結果列表

三、目錄結構

SearchApp/
├── src/main/ets/
│   ├── pages/
│   │   └── Index.ets                # 主頁面:包含輸入框、按鈕和結果列表
│   ├── components/
│   │   └── SearchDisplay.ets        # 每條搜索結果的顯示組件
│   ├── services/
│   │   └── SearchService.ets        # 封裝 HTTP 調用和 JSON 解析
│   ├── utils/
│   │   └── HttpClient.ets           # 通用的 httpRequestText 實現
│   ├── types/
│   │   └── SearchTypes.ets          # SearchResponse 和 SearchResultList 類型定義
│   └── configs/
│       └── Config.ets               # 搜索 API URL 配置項

四、關鍵代碼實現

1. 配置文件(Config.ets)

export const config = {searchApiUrl: "http://192.168.1.103:5001/search"
}

2. 類型定義(SearchTypes.ets)

// src/main/ets/types/SearchTypes.ets/*** 單條搜索結果*/
export interface SearchResponse {title: stringcontent: stringurl: string
}/*** 后端返回的結果結構*/
export interface SearchResultList {results: SearchResponse[]
}

3. 搜索服務(SearchService.ets)

// src/main/ets/services/SearchService.etsimport { httpRequestText } from '../utils/HttpClient'
import { http } from '@kit.NetworkKit'
import { SearchResponse, SearchResultList } from '../types/SearchTypes'export class SearchService {private apiUrl: stringconstructor(apiUrl: string) {this.apiUrl = apiUrl}public async search(query: string,onItem?: (item: SearchResponse) => void): Promise<SearchResponse[]> {const url: string = `${this.apiUrl}?q=${encodeURIComponent(query)}`let buffer: string = ''try {await httpRequestText(url,http.RequestMethod.GET,'',60000,(chunk: string) => {buffer += chunk})} catch {console.error('SearchService 網絡請求失敗')throw new Error('Search 請求失敗')}let list: SearchResponse[]try {// 使用已定義的接口類型,而非內聯對象字面量const parsed = JSON.parse(buffer) as SearchResultListlist = parsed.results} catch {console.error('SearchService JSON 解析失敗,buffer=', buffer)throw new Error('返回數據格式錯誤')}list.forEach((item: SearchResponse) => {if (onItem) {onItem(item)}})return list}
}

4. 單條結果展示組件(SearchDisplay.ets)

// src/main/ets/components/SearchDisplay.etsimport { SearchResponse } from '../types/SearchTypes';@Component
export struct SearchDisplay {private item!: SearchResponse;build() {Column() {Text(this.item.title).fontSize(18).fontWeight('bold').margin({ bottom: 4 });Text(this.item.content).fontSize(14).margin({ bottom: 4 });Text(this.item.url).fontSize(12).fontColor('#888');    // 使用 fontColor 設置文本顏色}.padding(10).backgroundColor('#F5F5F5').margin({ bottom: 10 });}
}

5. 主頁面實現(Index.ets)

// src/main/ets/pages/Index.etsimport { SearchDisplay } from '../components/SearchDisplay'
import { config } from '../configs/Config'
import { SearchService } from '../services/SearchService'
import { SearchResponse } from '../types/SearchTypes'@Entry
@Component
export struct Index {@State query: string = 'HarmonyOS'@State results: SearchResponse[] = []public async fetchData(): Promise<void> {this.results = []try {const res: SearchResponse[] = await new SearchService(config.searchApiUrl).search(this.query)this.results = res} catch {console.error('搜索失敗')}}public build(): void {Column() {TextInput({ text: this.query, placeholder: '輸入搜索關鍵詞,如 ChatGPT' }).onChange((value: string): void => {this.query = value}).width('match_parent').height(50).width(300).margin({ bottom: 12 })Button('搜索').width('match_parent').height(50).onClick((): void => {this.fetchData()}).margin({ bottom: 20 })ForEach(this.results, (item: SearchResponse): void => {SearchDisplay({ item })})}.padding({ left: 20, right: 20, top: 20 })}
}

五、運行效果示例

如圖所示,輸入 “HarmonyOS” 或 “ChatGPT” 后,前端立即展示聚合搜索結果:

在這里插入圖片描述

在這里插入圖片描述

六、總結

本篇在第40篇的 Python 搜索服務基礎上,構建了 HarmonyOS 的前端頁面。整個流程完整覆蓋:

  • 構建 TextInput、按鈕、結果展示組件
  • 使用 HttpClient.ets 封裝請求
  • 實現 JSON 結構的嚴格類型解析與響應式渲染

通過該示例,開發人員可以快速將本地服務能力集成進 HarmonyOS App,用于搭建多模態查詢工具、Dify Agent 插件原型或獨立智能體前端。下一步可考慮引入分頁、加載動畫或語音輸入等多模態交互能力。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83564.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83564.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83564.shtml

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

相關文章

開源鴻蒙北向源碼開發: 5.0kit化相關sdk編譯

5.0kit化可以在編譯系統sdk時添加,將你的kit文件加入編譯使得最終生成的sdk包含kits文件 修改編譯腳本 修改build倉里面的構建腳本文件,添加kits目錄腳本命令 社區的build腳本已經有kits編譯功能了,只需要把你的kits目錄新增的kit拷貝到社區倉interface倉了,和社區的都一起編…

題單:漢諾塔問題

題目描述 如下圖所示&#xff0c;設有 nn 個大小不等的中空圓盤&#xff0c;按照從小到大的順序疊套在立柱 A 上&#xff0c;另有兩根立柱 B 和 C 。 現在要求把全部圓盤從 A 柱&#xff08;稱為源柱&#xff09;移到 C 柱&#xff08;稱為目標柱&#xff09;&#xff0c;移動…

(面試)TCP、UDP協議

TCP&#xff08;傳輸控制協議&#xff09;和UDP&#xff08;用戶數據報協議&#xff09;是互聯網核心的傳輸層協議&#xff0c;負責應用程序之間的數據傳輸。它們在設計目標、特性和適用場景上有顯著差異&#xff1a; TCP&#xff1a;面向連接&#xff0c;可靠的&#xff0c;速…

uni-app小程序登錄后…

前情 最近新接了一個全新項目&#xff0c;是類似商城的小程序項目&#xff0c;我負責從0開始搭建小程序&#xff0c;我選用的技術棧是uni-app技術棧&#xff0c;其中就有一個用戶登錄功能&#xff0c;小程序部分頁面是需要登錄才可以查看的&#xff0c;對于未登錄的用戶需要引…

通識:計算機網絡基礎知識

目錄 計算機網絡的基本組成 計算機網絡的主要分類 計算機網絡的功能 計算機網絡的關鍵技術 IP地址簡介 IP地址的版本 IP地址的分類 公有與私有IP地址 ?編輯 子網掩碼 計算機網絡基礎 IPv4與IPv6對比分析 IP地址分類簡化版 公有與私有IP地址 計算機網絡是指將地理…

三層固定實體架構:高效實現圖上的檢索增強生成(RAG)

知識圖譜正在成為跨各個領域組織和檢索信息的強大工具。它們越來越多地與機器學習和自然語言處理技術相結合,以增強信息檢索和推理能力。在本文中,我介紹了一種用于構建知識圖譜的三層架構,結合了固定本體實體、文檔片段和提取的命名實體。通過利用嵌入和余弦相似度,這種方…

ArcGIS Pro地塊圖斑順序編號(手繪線順序快速編號)-004

ArcGIS全系列實戰視頻教程——9個單一課程組合系列直播回放_arcgis初學者使用視頻-CSDN博客 4大遙感軟件&#xff01;遙感影像解譯&#xff01;ArcGISENVIErdaseCognition_遙感解譯軟件-CSDN博客 今天介紹一下在ArcGIS Pro地塊圖斑順序編號&#xff08;手繪線順序快速編號&am…

Vue百日學習計劃Day21-23天詳細計劃-Gemini版

總目標: 在 Day 21-23 完成 Vue.js 的介紹學習、環境搭建&#xff0c;并成功運行第一個 Vue 3 項目&#xff0c;理解其基本結構。 Day 21: Vue.js 介紹與概念理解 (~3 小時) 本日目標: 理解 Vue.js 是什么、漸進式框架的概念以及選擇 Vue 的原因。初步了解 Vite 是什么及其作用…

uniapp-商城-60-后臺 新增商品(屬性的選中和頁面顯示,數組join 的使用)

前面添加了屬性&#xff0c;添加屬性的子級項目。也分析了如何回顯&#xff0c;但是在添加新的商品的時&#xff0c;我們也同樣需要進行選擇&#xff0c;還要能正常的顯示在界面上。下面對頁面的顯示進行分析。 1、界面情況回顧 屬性顯示其實是個一嵌套的數據顯示。 2、選中的…

Vue框架

Vue 概況&#xff1a; Vue是一款用于構建用戶界面的漸進式的JavaScript框架。&#xff08;官方;https:://cn.vuejs.org/) 框架:就是一套完整的項目解決方案&#xff0c;用于快速構建項目。 優點:大大提升前端項目的開發效率。 缺點:需要理解記憶框架的使用規則。&#xff…

解讀RTOS 第七篇 · 驅動框架與中間件集成

1. 引言 在面向生產環境的 RTOS 系統中,硬件驅動框架與中間件層是連接底層外設與上層應用的橋梁。一個模塊化、可擴展的驅動框架能夠簡化外設管理,提升代碼可維護性;而豐富的中間件生態則為網絡通信、文件系統、圖形界面、安全加密等功能提供開箱即用的支持。本章將從驅動模…

JavaScript防抖與節流全解析

文章目錄 前言:為什么需要防抖和節流基本概念與區別防抖(Debounce)節流(Throttle)關鍵區別防抖(Debounce)詳解1. 基本防抖函數實現2. 防抖函數的使用3. 防抖函數的工作流程4. 防抖函數進階 - 立即執行選項節流(Throttle)詳解1. 基本節流函數實現時間戳法(第一次會立即執行)定…

JavaScript入門【3】面向對象

1.對象: 1.概述: 在js中除了5中基本類型之外,剩下得都是對象Object類型(引用類型),他們的頂級父類是Object;2.形式: 在js中,對象類型的格式為key-value形式,key表示屬性,value表示屬性的值3.創建對象的方式: 方式1:通過new關鍵字創建(不常用) let person new Object();// 添…

oracle主備切換參考

主備正常切換操作參考&#xff1a;RAC兩節點->單機 &#xff08;rac和單機的操作區別&#xff1a;就是關閉其它節點&#xff0c;剩一個節點操作即可&#xff09; 1.主庫準備 檢查狀態 SQL> select inst_id,database_role,OPEN_MODE from gv$database; INST_ID DATA…

端到端自動駕駛系統實戰指南:從Comma.ai架構到PyTorch部署

引言&#xff1a;端到端自動駕駛的技術革命 在自動駕駛技術演進歷程中&#xff0c;端到端&#xff08;End-to-End&#xff09;架構正引領新一輪技術革命。不同于傳統分模塊處理感知、規劃、控制的方案&#xff0c;端到端系統通過深度神經網絡直接建立傳感器原始數據到車輛控制…

使用 Kotlin 和 Jetpack Compose 開發 Wear OS 應用的完整指南

環境配置與項目搭建 1. Gradle 依賴配置 // build.gradle (Module) android {buildFeatures {compose true}composeOptions {kotlinCompilerExtensionVersion "1.5.3"} }dependencies {def wear_compose_version "1.2.0"implementation "androidx.…

應用層協議簡介:以 HTTP 和 MQTT 為例

文章目錄 應用層協議簡介&#xff1a;什么是應用層協議&#xff1f;為什么需要應用層協議&#xff1f;什么是應用層協議&#xff1f;為什么需要應用層協議&#xff1f; HTTP 協議詳解HTTP 協議特點HTTP 工作的基本原理HTTP 請求與響應示例為什么 Web 應用基于 HTTP 請求&#x…

Kafka快速安裝與使用

引言 這篇文章是一篇Ubuntu(Linux)環境下的Kafka安裝與使用教程&#xff0c;通過本文&#xff0c;你可以非常快速搭建一個kafka的小單元進行日常開發與調測。 安裝步驟 下載與解壓安裝 首先我們需要下載一下Kafka&#xff0c;這里筆者采用wget指令&#xff1a; wget https:…

PD 分離推理的加速大招,百度智能云網絡基礎設施和通信組件的優化實踐

為了適應 PD 分離式推理部署架構&#xff0c;百度智能云從物理網絡層面的「4us 端到端低時延」HPN 集群建設&#xff0c;到網絡流量層面的設備配置和管理&#xff0c;再到通信組件和算子層面的優化&#xff0c;顯著提升了上層推理服務的整體性能。 百度智能云在大規模 PD 分離…

flutter Stream 有哪兩種訂閱模式。

Flutter 中的 Stream 有兩種訂閱模式&#xff1a; ?單訂閱模式 (Single Subscription)?? 只能有一個訂閱者&#xff08;listen 只能調用一次&#xff09;&#xff0c;后續調用會拋出異常。數據僅在訂閱后開始傳遞&#xff0c;適用于點對點通信場景&#xff08;如文件讀取流…