# yusou **Repository Path**: fireLh/yusou ## Basic Information - **Project Name**: yusou - **Description**: 一个集合搜索平台 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-04-28 - **Last Updated**: 2023-05-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # yusou 项目演示地址:https://www.bilibili.com/video/BV1dc411T7KG/?vd_source=c40a53f7346eeb69aad3dee1ac8a9eb4 ## 简介 为您提供一个聚合搜索平台,您可以在一个页面上搜索出来不同类型的内容(如:文章,人物,图片) ## 技术说明 ### 后端 - Spring Boot 2.7.2 - MyBatis + MyBatis Plus 数据访问 - Spring AOP 切面编程 - Spring Scheduler 定时任务 - MySQL 数据库 - Elasticsearch 搜索引擎 - Hutool 工具库 …… ### 前端 Vue ## 功能说明 ### 浏览👁 为了方便您理解,咱来先看看页面,以下页面即您打开网站所看到的
![文章](./images/article.png)

#### 文章 文章的话,我是爬的其它网站的内容,自己咋可能写这么多,至于咋爬的留给面试官问俺
![图片](./images/photo.png)

#### 图片 图片也算是利用了爬虫的技术了~,咋爬的您问我哈~
![用户](./images/user.png)
### 搜索🔍 接下来演示一下通过搜索出来的页面 ![搜索首页](./images/search.png)

![搜索图片](./images/photoBySearch.png)
用户页面我就不显示了,也没有叫Java的用户,至于单拎出来说他,是因为我用到了Elasticsearch技术来实现搜索的功能,我觉得它真的很强大!
## 亮点⭐ 你:一圈看下来,好像除了Elasticsearch也没有什么亮眼的技术呀! 我:表面上看是的,是没有什么亮眼的技术,但是在后端实现上我花了大的功夫!
1. 门面模式
既然是聚合搜索平台,那么前端得发送不同的请求来分别获取不同的Controller层的数据嘛?
用大拇指想一下,肯定是不可以的,那么我们就可以建立一个门面,使得前端只调用一个接口便可以实现该功能(门面模式)
![门面模式](./images/men.png)
就是通过一个接口搜索出来不同的内容,哇哦高大尚的感觉
2. 适配器模式
或许您会想,哈哈哈,那简单就是调用不同service层的服务即可呀,然后前端传来type,后端通过type在switch控制下来获取相关的数据即可呀! 确实可行,但是如果你要接入其它内容呢?而这些内容样式很多,比如说,视频,音乐,新闻……等,这些你都要一个一个的添加service层,然后加到switch嘛? 我觉得如果您这么做了,面试官看到,心道:原来还是个菜趴呀~
首先您这么做存在两个问题:
1. 类型过多,内容繁杂,没有统一的行为规范!
2. switch语句不够优雅!
解决方案:
1. 那么我们就得先规定统一的接口来规范每一个“类型”的行为;
2. 干掉switch,实现一个注册器,将用到的类型的service实例放到里面,用到什么取什么即可!
3. 注册器模式:即我上面提到的注册器啦~
4. Spring Scheduler 定时任务 既然使用Elasticsearch来获取数据,那么和Redis一样,肯定牵扯到了数据一致性问题,比如说我修改了数据库,但是我的Elasticsearch中的数据还是旧的,您忍心让咱可爱的用户看旧的数据嘛? 不忍心!ok,干他!
解决方法:开启定时任务,每隔1分钟查询一次,近5分钟内修改/添加过的数据,然后同步到Elasticsearch上去