韻搜坊 -- 前后端聯調實現搜索圖片

文章目錄

  • 后端
    • 新建圖片類型Picture
    • 創建圖片接口類PictureController
    • 新建PictureQueryRequest
    • 創建Service類
    • 創建實現類PictureServiceImpl
  • 前端
    • 添加接口獲取后端數據
    • 修改picture頁面內容
    • 添加文章,圖片的搜索功能
    • 修改查詢參數的獲取,實現查詢用戶功能
  • 存在的問題
  • 幾種不同的業務場景

后端

新建圖片類型Picture

@Data
public class Picture implements Serializable {private String title;private String url;private static final long serialVersionUID = 1L;
}

創建圖片接口類PictureController

@RestController
@RequestMapping("/picture")
@Slf4j
@CrossOrigin(originPatterns = {"http://localhost:8081"}, allowCredentials = "true", allowedHeaders = {"*"})
public class PictureController {@Resourceprivate PictureService pictureService;/*** 分頁搜索(從 ES 查詢,封裝類)** @param pictureQueryRequest* @param request* @return*/@PostMapping("/search/page/vo")public BaseResponse<Page<Picture>> searchPictureByPage(@RequestBody PictureQueryRequest pictureQueryRequest,HttpServletRequest request) {long size = pictureQueryRequest.getPageSize();long current = pictureQueryRequest.getCurrent();// 限制爬蟲ThrowUtils.throwIf(size > 20, ErrorCode.PARAMS_ERROR);String searchText = pictureQueryRequest.getSearchText();Page<Picture> picturePage = pictureService.searchPicture(searchText,current,size);return ResultUtils.success(picturePage);}}

新建PictureQueryRequest

@Data
public class PictureQueryRequest extends PageRequest implements
Serializable {private String SearchText;private static final long serialVersionUID = 1L;
}

創建Service類

@Service
public interface PictureService {Page<Picture> searchPicture(String searchText, long pageNum, long pageSize);
}

創建實現類PictureServiceImpl

@Service
@Slf4j
public class PictureServiceImpl implements PictureService {@Overridepublic Page<Picture> searchPicture(String searchText, long pageNum, long pageSize) {long current = (pageNum - 1) * pageSize;String url = String.format("https://cn.bing.com/images/search?q=%s&first=%s",searchText,current);Document doc = null;try {doc = Jsoup.connect(url).get();} catch (IOException e) {throw new BusinessException(ErrorCode.PARAMS_ERROR, "數據抓取失敗");}Elements elements = doc.select(".iuscp.isv"); //數組,每個元素是每一張圖片List<Picture> pictures = new ArrayList<>();for (Element element : elements) {//取圖片地址murlString m = element.select(".iusc").attr("m");Map<String, Object> map = JSONUtil.toBean(m, Map.class);String murl = (String) map.get("murl");//取標題String title = element.select(".inflnk").attr("aria-label");Picture picture = new Picture();picture.setTitle(title);picture.setUrl(murl);pictures.add(picture);if (pictures.size() >= pageSize)break;}Page<Picture> picturePage = new Page<>(pageNum,pageSize);picturePage.setRecords(pictures);return  picturePage;}}

前端

添加接口獲取后端數據

坐標:src/pages/InderxPage.vue

<template><div class="index-page"><a-tabs v-model:activeKey="activeKey" @change="onTabchange"><a-tab-pane key="picture" tab="圖片" force-render><PictureList :picture-list="pictureList" /></a-tab-pane></a-tabs></div>
</template>
<script setup lang="ts">const pictureList = ref([]);myAxios.post("/picture/list/page/vo", {}).then((res: any) => {pictureList.value = res.records;});
</script>

修改picture頁面內容

坐標:src/components/PictureList.vue

<template><!-- 獲取每一張圖片的pictureList --><a-list item-layout="horizontal" :data-source="props.pictureList":grid="{ gutter: 16, xs: 1, sm: 2, md: 4, lg: 4, xl: 6, xxl: 3 }"><template #renderItem="{ item }"><a-list-item><a-card hoverable><template #cover><img alt="example" :src="item.url" /></template><a-card-meta :title="item.title" /></a-card></a-list-item></template></a-list>
</template>
<script setup lang="ts">import { withDefaults, defineProps } from "vue";// 接口和默認值interface Props {pictureList: any[];}const props = withDefaults(defineProps<Props>(), {pictureList: () => [],});
</script>
<style scoped>.image-list {display: flex;flex-wrap: wrap;}
</style>

添加文章,圖片的搜索功能

坐標:src/pages/InderxPage.vue

<script setup lang="ts">
/*** 加載數據* @param params*/
const loadData = (params: any) => {const query = {...params,searchText: params.text,};myAxios.post("/post/list/page/vo", query).then((res: any) => {postList.value = res.records;});myAxios.post("/user/list/page/vo", query).then((res: any) => {userList.value = res.records;});myAxios.post("/picture/list/page/vo", query).then((res: any) => {pictureList.value = res.records;});
};
const searchParams = ref(initSearchParams);
// 首次請求
loadData(initSearchParams);
const onSearch = (value: string) => {console.log(value);router.push({query: searchParams.value,});// 根據條件查詢loadData(searchParams.value);
};
</script>

修改查詢參數的獲取,實現查詢用戶功能

因為用戶只能根據用戶名來查
坐標:src/pages/InderxPage.vue

<script setup lang="ts">
/*** 加載數據* @param params*/
const loadData = (params: any) => { const postQuery = {...params,searchText: params.text,};myAxios.post("/post/list/page/vo", postQuery).then((res: any) => {postList.value = res.records;});const pictureQuery = {...params,searchText: params.text,};myAxios.post("/picture/list/page/vo", pictureQuery).then((res: any) =>
{pictureList.value = res.records;});const userQuery = {...params,userName: params.text,};myAxios.post("/user/list/page/vo", userQuery).then((res: any) => {userList.value = res.records;});
};
</script> 

存在的問題

  1. 請求數量過多,可能會受到瀏覽器的限制
  2. 請求不同的接口的參數可能不一致,增加前后端溝通成本
  3. 前端寫調用多個接口的代碼,重復代碼

幾種不同的業務場景

(目前在加載頁面時,分別調用接口獲取文章,圖片,用戶數據)

  1. 用戶點擊某個tab時,只調用這個tab的接口
  2. 針對聚合內容的網頁,一個請求搞定
  3. 有可能要查詢每個模塊數據的總數,反饋給用戶

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

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

相關文章

這10款安卓APP,簡直好用到爆!

AI視頻生成&#xff1a;小說文案智能分鏡智能識別角色和場景批量Ai繪圖自動配音添加音樂一鍵合成視頻http://AI視頻生成&#xff1a;小說文案智能分鏡智能識別角色和場景批量Ai繪圖自動配音添加音樂一鍵合成視頻 1.追書——追書神器 追書神器是小說追新大神&#xff0c;全網實…

基于RequestResponseBodyMethodProcessor的Trim功能裝飾者模式實現

文章目錄 前言一、實現1.1 Trim1.2 TrimRequestResponseBodyMethodProcessorDecorator1.3 Configuration 二、測試2.1 測試用例2.2 測試結果2.2.1 Test no.12.2.2 Test no.22.2.3 Test no.32.2.4 Test no.4 前言 公司內部系統老是有人填表單復制粘貼老是整出前后空格來. 前端…

摸魚大數據——大數據導論

大數據導論 1、概念 大數據時代: 萬物皆數據 ? 數據概念: 人類的行為及產生的事件的一種記錄稱之為數據 ? 數據價值: 對數據的內容進行深入分析&#xff0c;可以更好的幫助了解事和物在現實世界的運行規律 2、大數據誕生 大數據的誕生: 跟隨著互聯網的發展的,當全球互聯…

K8S認證 | CKA題庫 + 答案 | 查看Pod CPU資源使用量

2、查看集群中運行Pod CPU資源使用量 您必須在以下Cluster/Node上完成此考題&#xff1a; Cluster Master node Worker node k8s …

【信息系統項目管理師知識點速記】采購管理:實施采購

實施采購過程是項目管理中一個關鍵環節,旨在通過一系列步驟確保項目所需的貨物、服務或成果能夠從合適的供應商處獲得,并以合同形式確立雙方的權利與義務。這一過程不僅關乎選擇最合適的賣方,還包括了風險管理、成本控制、溝通規劃等多個方面的考量。 輸入概述 項目管理計劃…

從零開始精通RTSP之加密

概述 原始的RTSP通信默認使用的是明文傳輸&#xff0c;這也就意味著&#xff0c;在網絡上的任何節點都能輕易地查看或修改傳輸的內容。這在涉及隱私或版權保護的場景下&#xff0c;是完全不可接受的。因此&#xff0c;加密顯得尤為重要。加密的目的主要有三點&#xff1a;一是進…

擰緊設備或工具的選型原則、常見類型和選型關鍵因素有哪些?

智能扭矩系統-智能擰緊系統-扭矩自動控制系統-SunTorque 在工業生產領域&#xff0c;擰緊控制是一項至關重要的工藝環節。它涉及螺栓、螺母等緊固件的裝配過程&#xff0c;直接關系到產品的質量和性能。因此&#xff0c;選擇合適的擰緊設備或工具對于確保擰緊過程的準確性和穩…

[牛客網]——C語言刷題day4

答案&#xff1a;B 解析&#xff1a; a是數組首元素的地址,a1的步長是int&#xff0c;所以是2 &a是數組的首地址&#xff0c;&a1步長是int[5] ptr是int類型的指針&#xff0c;指向a數組的尾后位置&#xff0c;ptr-1的步長是int,所以是a數組的最后一個元素5 答案&am…

如何使用ffmpeg 實現10種特效

相關特效的名字 特效id 特效名 1 向上移動 2 向左移動 3 向下移動 4 顫抖 5 搖擺 6 雨刷 7 彈入 8 彈簧 9 輕微跳動 10 跳動 特效展示(同時匯總相關命令) pad背景顯示 pad背景透明 相關命令(一會再講這些命令&#xff0c;先往下看) # 合成特效語音 ffmpeg -y -loglevel erro…

Element Plus/vue3 無限級導航實現

在使用element plus 時&#xff0c;最初要使用的就是導航組件了&#xff0c;官網上看到的也就是寫死的一級/二級導航&#xff0c;那么如何設計一個無限級且動態的導航呢&#xff1f;毋庸置疑&#xff0c;遞歸。廢話不多說&#xff0c;直接看代碼和效果&#xff1a; 代碼&#x…

Jmeter:錄制腳本(操作文檔)

新建線程組 打開jmeter&#xff0c;右鍵測試計劃–>添加–>Threads(Users)–>點擊"線程組" 添加錄制控制器 右鍵線程組–>添加–>邏輯控制器–>點擊"錄制控制器" 添加HTTP代理服務器 右鍵工作臺–>添加–>非測試元件–>…

YOLOv5改進 | Neck | 添加雙向特征金字塔BiFPN【小白輕松上手 | 論文必備】

&#x1f680;&#x1f680;&#x1f680;本專欄所有的改進均可成功執行&#x1f680;&#x1f680;&#x1f680; 盡管Ultralytics 推出了最新版本的 YOLOv8 模型。但YOLOv5作為一個anchor base的目標檢測的算法&#xff0c;YOLOv5可能比YOLOv8的效果更好。但是針對不同的數據…

CDN都有哪些優勢?

內容分發網絡是一個經策略性部署的整體系統&#xff0c;其中包含了分布式存儲、負載均衡、網絡請求的重定向和內容管理四個要求&#xff0c;CDN的主要核心則是內容管理和全局的網絡流量管理&#xff0c;CDN可以確保內容會以一種非常高效的方式為用戶的請求提供服務。 接下來就讓…

Linux 第三十五章

&#x1f436;博主主頁&#xff1a;??. 一懷明月? ???&#x1f525;專欄系列&#xff1a;線性代數&#xff0c;C初學者入門訓練&#xff0c;題解C&#xff0c;C的使用文章&#xff0c;「初學」C&#xff0c;linux &#x1f525;座右銘&#xff1a;“不要等到什么都沒有了…

Kubernetes安裝calico網絡插件失敗

今天啥也沒干成&#xff0c;不想排版了。 接著昨天搭建k8s集群&#xff0c;安裝calico插件&#xff0c;虛擬機一直卡。 # 在 master 節點上執行 # 下載 calico 配置文件&#xff0c;可能會網絡超時 curl https://docs.tigera.io/archive/v3.25/manifests/calico.yaml -O # 修…

[svelte] 怎么引入fortawesome的icon樣式

首先在項目的終端下執行以下命令 npm install fortawesome/fontawesome-free # 或者 yarn add fortawesome/fontawesome-free這樣子可以把fontawsome的圖標給下載到項目的對應文件中 一般都是在node_modules中 在fontawsome/fontawesome-free中就可以看到很多文件夾了 …

unapp寫微信小程序封裝水印相機組件怎么實現?

<template><view><!-- <cu-custom bgColor"bg-gradual-blue" :isBack"true"><block slot"backText">返回</block><block slot"content">編輯資料</block></cu-custom> --><…

Docker學習(10)搭建kubernetes集群

搭建kubernetes集群 1、官方部署方式&#xff1a; Minikube工具安裝 Minikube是一種能夠在計算機或者虛擬機(VM)內輕松運行單節點Kubernetes 集群的工具&#xff0c;可實現一鍵部署。這種方式安裝的系統在企業中大多被當作測試系統使用。 使用yum安裝 通過直接使用 epel-r…

三步在 vite 中配置 tailwindcss

前言 tailwindcss 是一個原子化的 css 工具&#xff0c;可以讓你免于寫 css&#xff0c;只寫 html 即可原理&#xff1a;利用你寫的 html 的 class 名稱來生成 css 樣式&#xff0c;理解為一個 postcss 插件或 loader 第一步&#xff1a;安裝 tailwindcss npm i -D tailwind…

圖片恢復的實用指南,為你拯救遺失的記憶!

隨著科技的日新月異&#xff0c;我們的生活已被照片填滿。它們記錄著我們的喜怒哀樂&#xff0c;見證著每一個重要的時刻。但我們往往會因為各種原因將手機圖片遺失&#xff0c;有什么方法可以恢復呢&#xff1f;本文將提供一份實用的圖片恢復指南&#xff0c;幫助你找回那些遺…