《仿盒马》app开发技术分享-- 商品搜索页(顶部搜索bar热门搜索)(端云一体)

开发准备

随着开发功能的逐渐深入,我们的应用逐渐趋于完善,现在我们需要继续在首页给没有使用按钮以及组件添加对应的功能,这一节我们要实现的功能是商品搜索页面,这个页面我们从上到下开始实现功能,首先就是一个搜索的bar,然后是一个系统推荐的热门搜索列表。

功能分析

要实现顶部的搜索bar其实还是非常简单的,我们只需要使用对应的row布局去填充对应的组件,然后根据输入状态来实现对应组建的展示和隐藏即可,热门搜索列表我们需要在云端新建对应的表,填充数据后,进行云数据库数据的请求

代码实现

首先我们先创建对应的表

{"objectTypeName": "search_hot_txt","fields": [{"fieldName": "id", "fieldType": "Integer", "notNull": true, "belongPrimaryKey": true},{"fieldName": "txt", "fieldType": "String" }],"indexes": [{"indexName": "field1Index", "indexList": [{"fieldName":"id","sortType":"ASC"}]}],"permissions": [{"role": "World", "rights": ["Read"]},{"role": "Authenticated", "rights": ["Read", "Upsert"]},{"role": "Creator", "rights": ["Read", "Upsert", "Delete"]},{"role": "Administrator", "rights": ["Read", "Upsert", "Delete"]}]
}

对应的实体类


class SearchHotTxt {id: number;txt: string;constructor() {}getFieldTypeMap():  Map<string, string> {let fieldTypeMap = new Map<string, string>();fieldTypeMap.set('id', 'Integer');fieldTypeMap.set('txt', 'String');return fieldTypeMap;}getClassName(): string {return 'search_hot_txt';}getPrimaryKeyList(): string[] {let primaryKeyList: string[] = [];primaryKeyList.push('id');return primaryKeyList;}getIndexList(): string[] {let indexList: string[] = [];indexList.push('id');return indexList;}getEncryptedFieldList(): string[] {let encryptedFieldList: string[] = [];return encryptedFieldList;}setId(id: number): void {this.id = id;}getId(): number  {return this.id;}setTxt(txt: string): void {this.txt = txt;}getTxt(): string  {return this.txt;}static parseFrom(inputObject: any): SearchHotTxt {let result = new SearchHotTxt();if (!inputObject) {return result;}if (inputObject.id) {result.id = inputObject.id;}if (inputObject.txt) {result.txt = inputObject.txt;}return result;}
}export { SearchHotTxt };

对应的db类

import { cloudDatabase } from '@kit.CloudFoundationKit';class search_hot_txt extends cloudDatabase.DatabaseObject {public id: number;public txt: string;public naturalbase_ClassName(): string {return 'search_hot_txt';}
}export { search_hot_txt };

之后我们创建对应的商品搜索页面,在页面中实现一个bar

//先创建好对应的变量
@State text: string = ''controller: TextInputController = new TextInputController()@State searchTxt:SearchHotTxt[]=[]@State flag:boolean=false@State isSearch:boolean=false@State columns: number = 2

实现布局

 Row(){Image($r('app.media.left_back')).height(20).width(20).onClick(()=>{router.back()})TextInput({ text: this.text, placeholder: '输入商品名搜索', controller: this.controller }).placeholderColor(Color.White).placeholderFont({ size: 16, weight: 400 }).caretColor(Color.White).width(200).fontSize(16).fontColor(Color.White).onChange((value: string) => {this.text = valueif (value.length==0) {this.isSearch=false}})Text("搜索").border({width:1,radius:10,color:Color.White}).fontSize(14).fontColor("#ffffff").padding({left:13,right:13,top:5,bottom:5}).borderRadius(10).onClick(async ()=>{if (this.text.trim()==''&&this.text.length==0) {this.isSearch=falseshowToast("搜索内容不能为空")}else {this.isSearch=true}})}.justifyContent(FlexAlign.SpaceBetween).width('100%').padding({top:10,bottom:10,left:15,right:15}).expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP]).backgroundColor("#ff0000")

从云数据库查询出对应的数据

 async aboutToAppear(): Promise<void> {const history = await StorageUtils.getAll("history_list")if (history!=''&&history!=undefined) {this.searchHistoryList=JSON.parse(history)}let condition = new cloudDatabase.DatabaseQuery(search_hot_txt);let listData = await databaseZone.query(condition);let json = JSON.stringify(listData)let data1:SearchHotTxt[]= JSON.parse(json)this.searchTxt=data1this.flag=true}

展示搜索列表

 Text("热门搜索").width('100%').fontSize(16).fontColor("#000000").fontWeight(FontWeight.Bold).padding({left:15,top:15}) Flex({wrap:FlexWrap.Wrap}){ForEach(this.searchTxt,(item:SearchHotTxt,index:number)=>{Text(item.txt).backgroundColor("#ffe7e5e5").fontColor("#000000").fontWeight(FontWeight.Bold).fontSize(16).padding(10).margin({top:10,left:10}).borderRadius(5).onClick(()=>{this.text=item.txt})})}

我们执行一下代码看看效果
在这里插入图片描述

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

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

相关文章

spring-ai入门

spring-ai入门 1、前语 hi&#xff0c;我是阿昌&#xff0c;今天记录针对目前当下ai火热的背景下&#xff0c;ai的主流使用语言为python&#xff0c;但市面上很大部分的项目是java开发的的背景下&#xff0c;那java就不能涉及ai领域的开发了嘛&#xff1f;有句调侃的话说的好…

复习——C++

1、scanf和scanf_s区别 2、取地址&#xff0c;输出 char ba; char* p&b; cout<<*p; cout<<p; p(char*)"abc"; cout<<*p; cout<<p; cout<<(void*)p; 取地址&#xff0c;把b的地址给p 输出*p&#xff0c;是输出p的空间内的值…

《TCP/IP 详解 卷1:协议》第5章:Internet协议

IPv4和IPv6头部 IP是TCP/IP协议族中的核心协议。所有TCP、UDP、ICMP和IGMP 数据都通过IP数据报传输。IP提供了一种尽力而为、无连接的数据报交付服务。 IP头部字段 IPv4 头部通常为 20 字节&#xff08;无选项时&#xff09;&#xff0c;而 IPv6 头部固定为 40 字节。IPv6 不…

树莓派系列教程第九弹:Cpolar内网穿透搭建NAS

在数字时代&#xff0c;数据存储与共享的需求无处不在。无论是家庭用户想要搭建一个便捷的私人云盘&#xff0c;还是小型团队需要一个高效的数据共享中心&#xff0c;NAS&#xff08;网络附加存储&#xff09;无疑是最佳选择之一。然而&#xff0c;传统的NAS搭建往往需要复杂的…

React 组件异常捕获机制详解

1. 错误边界&#xff08;Error Boundaries&#xff09;基础 在React应用开发中&#xff0c;组件异常的有效捕获对于保证应用稳定性至关重要。React提供了一种称为"错误边界"的机制&#xff0c;专门用于捕获和处理组件树中的JavaScript错误。 错误边界是React的一种…

python3GUI--车牌、车牌颜色识别可视化系统 By:PyQt5(详细介绍)

文章目录 一&#xff0e;前言二&#xff0e;效果预览1.实时识别2.ROI3.数据导出 三.相关技术与实现1.目标识别与检测2.可视化展示3.如何设置推流环境4.如何实现的车牌和颜色识别5.项目结构 四&#xff0e;总结 本系统支持黄牌、蓝牌、绿牌、黑牌、白牌&#xff0c;支持双层车牌…

python做题日记(12)

第二十七题 LeetCode第27题要求原地移除数组中所有等于给定值val的元素&#xff0c;并返回移除后数组的新长度。不能使用额外的数组空间&#xff0c;必须在原数组上修改&#xff0c;且元素的顺序可以改变。对于这道题的解法在之前的题目中也使用过&#xff0c;可以使用双指针法…

2025年计算机科学与网络安全国际会议(CSNS 2025)

第二届计算机科学与网络安全国际会议&#xff08;CSNS 2025&#xff09;将在兰州举办&#xff0c;这是一场聚焦于计算机科学领域最新进展及网络安全前沿技术的国际性学术交流盛会。该会议旨在为来自全球各地的研究学者、工程师以及相关行业专业人士提供一个高水平的交流平台&am…

知识拓展卡————————关于Access、Trunk、Hybrid端口

目录 什么是Trunk List、VLAN ID、PVID&#xff1a; VLAN ID&#xff08;Virtual Local Area Network Identifier&#xff09;&#xff1a; Trunk List&#xff08;Trunk列表&#xff09;&#xff1a; PVID&#xff08;Prot VLAN ID&#xff09;: 关于Native VLAN &#x…

Cursor 工具项目构建指南: Web Vue-Element UI 环境下的 Prompt Rules 约束(new Vue 方式)

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 Cursor 工具项目构建指南: Web Vue-Element UI 环境下的 Prompt Rules 约束前言项目简…

hadoop集群启动没有datanode解决

问题 多次初始化会出现此问题&#xff0c;根本原因是ClusterID不一样 解决 首先停止集群 stop-all.sh然后到/hadoop/logs中找到hadoop-root-datanode-hadoopxxx.log文件 cat一下这个文件&#xff0c;找到ClusterID 复制 然后到 可能文件会不太一样&#xff0c;可能直接是…

ann算法的种类有哪些,之间的区别,各自的适用场景

ANN&#xff08;近似最近邻&#xff09;算法主要分为三类技术路线&#xff1a;基于树的方法、哈希方法和图方法&#xff0c;它们在原理、性能及适用场景上有显著差异&#xff1a; 1. 基于树的方法 核心原理&#xff1a;递归划分数据空间形成树状结构&#xff08;如二叉树或多叉…

云服务器部署Gin+gorm 项目 demo

更多个人笔记见&#xff1a; &#xff08;注意点击“继续”&#xff0c;而不是“发现新项目”&#xff09; github个人笔记仓库 https://github.com/ZHLOVEYY/IT_note gitee 个人笔记仓库 https://gitee.com/harryhack/it_note 个人学习&#xff0c;学习过程中还会不断补充&…

【学习笔记】TCP 与 UDP

TCP&#xff08;Transmission Control Protocol&#xff09;与UDP&#xff08;User Datagram Protocol&#xff09;是 网络通讯 中最基础也最常用的两种 传输层 协议。 文章目录 1. 简介2. OSI 与 TCP/IP 模型中的定位3. 协议原理与关键机制3.1 UDP3.2 TCP 5. 实践&#xff1a;…

HikariCP 可观测性最佳实践

HikariCP 介绍 HikariCP 是一个高性能、轻量级的 JDBC 连接池&#xff0c;由 Brett Wooldridge 开发。它以“光”命名&#xff0c;象征快速高效。它支持多种数据库&#xff0c;配置简单&#xff0c;通过字节码优化和智能管理&#xff0c;实现低延迟和高并发处理。它还具备自动…

Java SpringBoot 调用大模型 AI 构建智能应用实战指南

一、基础知识 &#xff08;一&#xff09;Java基础 Java是一种广泛使用的高级编程语言&#xff0c;具有简单、面向对象、分布式、解释型、健壮、安全、架构中立、可移植、高性能、多线程和动态等特点。在构建基于Spring Boot的AI应用之前&#xff0c;您需要具备扎实的Java基础…

电路图识图基础知识-降压启动(十五)

降压启动电动机控制电路 降压启动&#xff0c;是指启动时降低加在电动机定子绕组上的电压&#xff0c;待电动机启动起来后再将电压 恢复到额定值&#xff0c;使之运行在额定电压下。降压启动可以减小启动电流&#xff0c;从而减小线路电压降。 传统的降压启动包括定子串电阻或…

2025年大模型平台落地实践研究报告|附75页PDF文件下载

本报告旨在为各行业企业在建设落地大模型平台的过程中&#xff0c;提供有效的参考和指引&#xff0c;助力大模型更高效更有价值地规模化落地。本报告系统性梳理了大模型平台的发展背景、历程和现状&#xff0c;结合大模型平台的特点提出了具体的落地策略与路径&#xff0c;同时…

Docker慢慢学

1、Docker DeskTop 2、N8N下载 3、Kafka docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID1 -e KAFKA_ZOOKEEPER_CONNECTzookeeper:2181 -e KAFKA_ADVERTISED_LISTENERSPLAINTEXT://localhost:9092 -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR1 con…

Java 中创建线程主要有三种方式

在 Java 中&#xff0c;创建线程主要有三种方式&#xff0c;每种方式各有特点和适用场景。以下是详细说明和代码示例&#xff1a; 1. 继承 Thread 类 原理&#xff1a;自定义类继承 Thread 并重写 run() 方法&#xff0c;通过调用 start() 启动新线程。 特点&#xff1a;简单直…