模糊查询安卓端使用

news/2025/3/26 4:39:43/文章来源:https://www.cnblogs.com/qiixunlu/p/18788704

后端使用Springboot 前端通过无线网路接口与后端相连
以下是具体代码实现
后端:
PolicyController

点击查看代码
package com.example.demo.controller;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.entity.Policy;
import com.example.demo.service.PolicyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/policy")
public class PolicyController {@Autowiredprivate PolicyService policyService;@GetMapping("/search")public Page<Policy> search(@RequestParam(defaultValue = "") String keyword,@RequestParam(defaultValue = "1") Integer current,@RequestParam(defaultValue = "10") Integer size) {Page<Policy> page = new Page<>(current, size);LambdaQueryWrapper<Policy> wrapper = new LambdaQueryWrapper<>();// 模糊匹配名称、关键词或政策文本wrapper.like(Policy::getName, keyword).or().like(Policy::getKeyword, keyword).or().like(Policy::getText, keyword);return policyService.page(page, wrapper);}@GetMapping("/{id}")public Policy getById(@PathVariable Long id) {return policyService.getById(id);}
}
Policy
点击查看代码
package com.example.demo.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;import java.util.Date;@Data
public class Policy {@TableId(type = IdType.AUTO)private Long id;private String name;private String type;private String category;@TableField("`range`")private String range;private String document;private String form;private String organ;private Date viadata;private Date pubdata;private Date perdata;@TableField("`field`")private String field;private String theme;private String keyword;private String superior;private String precursor;private String succeed;private String state;private String text;private String pdf;private String redundancy;@TableField("`rank`")private String rank;private String policykey;private String newrank;@TableField("`year`")private String year;private String newkey;private String secondtheme;private Integer allsum;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getType() {return type;}public void setType(String type) {this.type = type;}public String getCategory() {return category;}public void setCategory(String category) {this.category = category;}public String getRange() {return range;}public void setRange(String range) {this.range = range;}public String getDocument() {return document;}public void setDocument(String document) {this.document = document;}public String getForm() {return form;}public void setForm(String form) {this.form = form;}public String getOrgan() {return organ;}public void setOrgan(String organ) {this.organ = organ;}public Date getViadata() {return viadata;}public void setViadata(Date viadata) {this.viadata = viadata;}public Date getPubdata() {return pubdata;}public void setPubdata(Date pubdata) {this.pubdata = pubdata;}public Date getPerdata() {return perdata;}public void setPerdata(Date perdata) {this.perdata = perdata;}public String getField() {return field;}public void setField(String field) {this.field = field;}public String getTheme() {return theme;}public void setTheme(String theme) {this.theme = theme;}public String getKeyword() {return keyword;}public void setKeyword(String keyword) {this.keyword = keyword;}public String getSuperior() {return superior;}public void setSuperior(String superior) {this.superior = superior;}public String getPrecursor() {return precursor;}public void setPrecursor(String precursor) {this.precursor = precursor;}public String getSucceed() {return succeed;}public void setSucceed(String succeed) {this.succeed = succeed;}public String getState() {return state;}public void setState(String state) {this.state = state;}public String getText() {return text;}public void setText(String text) {this.text = text;}public String getPdf() {return pdf;}public void setPdf(String pdf) {this.pdf = pdf;}public String getRedundancy() {return redundancy;}public void setRedundancy(String redundancy) {this.redundancy = redundancy;}public String getRank() {return rank;}public void setRank(String rank) {this.rank = rank;}public String getPolicykey() {return policykey;}public void setPolicykey(String policykey) {this.policykey = policykey;}public String getNewrank() {return newrank;}public void setNewrank(String newrank) {this.newrank = newrank;}public String getYear() {return year;}public void setYear(String year) {this.year = year;}public String getNewkey() {return newkey;}public void setNewkey(String newkey) {this.newkey = newkey;}public String getSecondtheme() {return secondtheme;}public void setSecondtheme(String secondtheme) {this.secondtheme = secondtheme;}public Integer getAllsum() {return allsum;}public void setAllsum(Integer allsum) {this.allsum = allsum;}
}
PolicyMapper
点击查看代码
package com.example.demo.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.Policy;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface PolicyMapper extends BaseMapper<Policy> {
}
PolicyServiceImpl
点击查看代码
package com.example.demo.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.Policy;
import com.example.demo.mapper.PolicyMapper;
import com.example.demo.service.PolicyService;
import org.springframework.stereotype.Service;@Service
public class PolicyServiceImpl extends ServiceImpl<PolicyMapper, Policy> implements PolicyService {
}
PolicyService
点击查看代码
package com.example.demo.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.Policy;public interface PolicyService extends IService<Policy> {
}
application.yml
点击查看代码
package com.example.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}

前端
Policy

点击查看代码
package com.qi.demo.entityimport java.util.Datedata class Policy(val id: Long,val name: String?,val type: String?,val category: String?,val range: String?,val document: String?,val form: String?,val organ: String?,val viadata: Date?,val pubdata: Date?,val perdata: Date?,val field: String?,val theme: String?,val keyword: String?,val text: String?,val pdf: String?
)
ServiceCreator
点击查看代码
package com.qi.demo.networkimport retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactoryobject ServiceCreator {private const val BASE_URL = "http://172.20.10.4:8090/"private val retrofit = Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(GsonConverterFactory.create()).build()fun <T> create(serviceClass: Class<T>): T = retrofit.create(serviceClass)inline fun <reified T> create(): T = create(T::class.java)
}
PolicyService.kt
点击查看代码
package com.qi.demo.serviceimport com.qi.demo.entity.Policy
import retrofit2.Call
import retrofit2.http.GET
import retrofit2.http.Path
import retrofit2.http.Queryinterface PolicyService {@GET("policy/search")fun search(@Query("keyword") keyword: String,@Query("current") current: Int = 1,@Query("size") size: Int = 10): Call<Page<Policy>>@GET("policy/{id}")fun getById(@Path("id") id: Long): Call<Policy>
}data class Page<T>(val records: List<T>,val total: Long,val size: Int,val current: Int
)
MainActivity
点击查看代码
package com.qi.demoimport android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.util.Log
import android.widget.EditText
import android.widget.ImageButton
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.qi.demo.entity.Policy
import com.qi.demo.network.ServiceCreator
import com.qi.demo.service.Page
import com.qi.demo.service.PolicyService
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Responseclass MainActivity : AppCompatActivity() {private lateinit var searchInput: EditTextprivate lateinit var searchButton: ImageButtonprivate lateinit var recyclerView: RecyclerViewprivate lateinit var adapter: PolicyAdapterprivate val policyService = ServiceCreator.create<PolicyService>()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)enableEdgeToEdge()setContentView(R.layout.activity_main)initViews()setupRecyclerView()setupSearchButton()}private fun initViews() {searchInput = findViewById(R.id.searchInput)searchButton = findViewById(R.id.searchButton)recyclerView = findViewById(R.id.recyclerView)}private fun setupRecyclerView() {adapter = PolicyAdapter { policy ->// 点击政策项时打开详情openPolicyDetail(policy.id)}recyclerView.layoutManager = LinearLayoutManager(this)recyclerView.adapter = adapter}private fun setupSearchButton() {searchButton.setOnClickListener {val keyword = searchInput.text.toString()searchPolicies(keyword)}}private fun searchPolicies(keyword: String) {policyService.search(keyword).enqueue(object : Callback<Page<Policy>> {override fun onResponse(call: Call<Page<Policy>>, response: Response<Page<Policy>>) {response.body()?.let { page ->adapter.submitList(page.records)}}override fun onFailure(call: Call<Page<Policy>>, t: Throwable) {Toast.makeText(this@MainActivity, "搜索失败:${t.message}", Toast.LENGTH_SHORT).show()Log.e("MainActivity", "搜索失败", t)}})}private fun openPolicyDetail(id: Long) {policyService.getById(id).enqueue(object : Callback<Policy> {override fun onResponse(call: Call<Policy>, response: Response<Policy>) {response.body()?.let { policy ->// 如果有PDF链接,打开PDFpolicy.pdf?.let { pdfUrl ->val intent = Intent(Intent.ACTION_VIEW, Uri.parse(pdfUrl))startActivity(intent)} ?: run {// 否则显示文本内容val intent = Intent(this@MainActivity, PolicyDetailActivity::class.java)intent.putExtra("policyText", policy.text)intent.putExtra("policyName", policy.name)startActivity(intent)}}}override fun onFailure(call: Call<Policy>, t: Throwable) {Toast.makeText(this@MainActivity, "获取详情失败:${t.message}", Toast.LENGTH_SHORT).show()Log.e("MainActivity", "获取详情失败", t)}})}
}
PolicyAdapter.kt
点击查看代码
package com.qi.demoimport android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.qi.demo.entity.Policyclass PolicyAdapter(private val onItemClick: (Policy) -> Unit) :ListAdapter<Policy, PolicyAdapter.ViewHolder>(PolicyDiffCallback()) {override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {val view = LayoutInflater.from(parent.context).inflate(R.layout.item_policy, parent, false)return ViewHolder(view, onItemClick)}override fun onBindViewHolder(holder: ViewHolder, position: Int) {holder.bind(getItem(position))}class ViewHolder(view: View, private val onItemClick: (Policy) -> Unit) :RecyclerView.ViewHolder(view) {private val nameText: TextView = view.findViewById(R.id.policyName)private val organText: TextView = view.findViewById(R.id.policyOrgan)private val dateText: TextView = view.findViewById(R.id.policyDate)fun bind(policy: Policy) {nameText.text = policy.nameorganText.text = policy.organdateText.text = policy.pubdata?.toString() ?: ""itemView.setOnClickListener { onItemClick(policy) }}}
}class PolicyDiffCallback : DiffUtil.ItemCallback<Policy>() {override fun areItemsTheSame(oldItem: Policy, newItem: Policy): Boolean {return oldItem.id == newItem.id}override fun areContentsTheSame(oldItem: Policy, newItem: Policy): Boolean {return oldItem == newItem}
}
PolicyDetailActivity
点击查看代码
package com.qi.demoimport android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivityclass PolicyDetailActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_policy_detail)val policyText = intent.getStringExtra("policyText") ?: ""val policyName = intent.getStringExtra("policyName") ?: ""findViewById<TextView>(R.id.policyTitle).text = policyNamefindViewById<TextView>(R.id.policyContent).text = policyText}
}
activity_main.xml
点击查看代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="16dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><EditTextandroid:id="@+id/searchInput"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:hint="请输入政策关键词"android:padding="12dp"android:background="@drawable/search_background"android:layout_marginEnd="8dp"/><ImageButtonandroid:id="@+id/searchButton"android:layout_width="48dp"android:layout_height="48dp"android:src="@drawable/ic_search"android:background="?attr/selectableItemBackgroundBorderless"android:contentDescription="搜索"/></LinearLayout><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:layout_marginTop="16dp"/></LinearLayout>
activity_policy_detail.xml
点击查看代码
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:padding="16dp"><TextViewandroid:id="@+id/policyTitle"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="20sp"android:textStyle="bold"android:textColor="@color/black"android:gravity="center"android:layout_marginBottom="16dp"/><TextViewandroid:id="@+id/policyContent"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="16sp"android:lineSpacingMultiplier="1.2"/></LinearLayout>
</ScrollView>
item_policy.xml
点击查看代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginHorizontal="8dp"android:layout_marginVertical="4dp"app:cardCornerRadius="8dp"app:cardElevation="2dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:padding="16dp"><TextViewandroid:id="@+id/policyName"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="16sp"android:textColor="@color/black"android:textStyle="bold"/><TextViewandroid:id="@+id/policyOrgan"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="8dp"android:textSize="14sp"/><TextViewandroid:id="@+id/policyDate"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="4dp"android:textSize="12sp"android:textColor="@android:color/darker_gray"/></LinearLayout></androidx.cardview.widget.CardView>

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

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

相关文章

河北省科级政策app 连接MySQL数据库

项目结构 在连接数据库的时候要把localhost改为自己电脑的IP地址 开放mysql数据库远程访问的权限 使用jdbc的方法把jar包导入项目中

【Guava工具类】StringsInts

String相关工具 Strings Guava 提供了一系列用于字符串处理的工具: 对字符串为null或空的处理nullToEmpty(@Nullable String string):如果非空,则返回给定的字符串;否则返回空字符串 public static String nullToEmpty(@Nullable String string) {//如果string为null则返回…

我开发的【巨大娘的玩耍♥】游戏正在众筹中,参与即可获得限量优惠回报

大家好,我开发的【巨大娘的玩耍♥】游戏正在众筹中,参与即可获得限量优惠回报 游戏目前正在爱发电上众筹,众筹总额达成5千元即可开发和发布正式版。众筹截止日期:2025年7月23日 支持者可获得 8折激活码、获得所有玩家可见的特殊成就、上感谢名单 等 限量 回报~ 点我查看具体…

用于遥控车的先进PCB

该定制板集成了大功率电机控制,无线通信和高效电源管理在RC汽车的世界里,精确控制和效率是至关重要的。为了推动性能的极限,我专门为RC汽车设计了一个先进的PCB。这种定制板集成了大功率电机控制,无线通信和高效的电源管理,使其成为爱好者和机器人爱好者的理想选择。 为了…

读DAMA数据管理知识体系指南29文件和内容管理活动

读DAMA数据管理知识体系指南29文件和内容管理活动1. 规划生命周期的管理 1.1. 从文件的创建或接收文件后的分发、存储、检索、归档和潜在的销毁 1.2. 规划包括开发分类/索引系统和分类法,以实现文件的存储和检索 1.3. 重要的是,生命周期规划中需要为档案建立具体的制度 1.4. …

c语言实验2

1 #include <stdio.h>2 #include <stdlib.h>3 #include <time.h>4 5 #define N 56 7 int main() {8 int number;9 int i; 10 11 srand(time(0)); // 以当前系统时间作为随机种子 12 for(i = 0; i < N; ++i) { 13 number = r…

使用 Browser-Use WebUI + DeepSeek 实现浏览器AI自动化全攻略

使用 Browser-Use WebUI + DeepSeek 实现浏览器AI自动化全攻略 环境准备 1. 安装 Python 环境版本要求:Python 3.11 或更高版本 验证安装:命令行执行 python --version 注意:安装时需勾选 "Add to PATH" 选项(Windows用户)2. 核心工具安装 # 安装 browser-use 框…

20234214 2024-2025-2 《Python程序设计》实验一报告

20234214 2024-2025-2 《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2342 姓名: 唐果儿 学号:20234214 实验教师:王志强 实验日期:2025年3月18日 必修/选修: 公选课 1.实验内容 (一)实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; …

WinForm 使用 Win32 API 实现的无边框窗口

WinForm 使用 Win32 API 实现的无边框窗口前言 时光荏苒,转眼已近是2025年了。不知不觉两年多没有研究代码了,在这期间 .NET 10 都快 RC 了,前几天刷手机看到张队公众号里有关于 .NET 9.0 AOT 发布的内容,所以写了这些代码来测试一下 AOT 编译的效果,并评估未来是否开发支…

C语言打卡学习第4天(2025.3.23)

今天只写了几道基础题,又看了下数组和冒泡排序,概念搞懂了但是写代码还是比较困难,准备明天把排序这类题好好看看。

一文速通Python并行计算:01 Python多线程编程-基本概念、切换流程、GIL锁机制和生产者与消费者模型

多线程允许程序同时执行多个任务,提升效率和响应性。线程分为新建、就绪、运行、阻塞和死亡五种状态。Python的GIL锁限制多线程并行执行,适合I/O密集型任务。生产者-消费者模型通过共享缓冲区和条件变量实现线程协作,解决数据共享问题。一文速通 Python 并行计算:01 Python…

Spring的三级缓存详解

目录 1、什么是三级缓存 2、三级缓存详解Bean实例化前属性赋值/注入前初始化后总结3、怎么解决的循环依赖 4、不用三级缓存不行吗 5、总结 一、什么是三级缓存 就是在Bean生成流程中保存Bean对象三种形态的三个Map集合,如下: