韵搜坊 -- 聚合接口开发


image.png

目前问题以及解决思路

  1. 请求数量过多,可能会受到浏览器的限制->用一个接口请求完所有的数据
{
 user = userService.query
 post = postService.query
 picture = pictureService.query
 return user + post + picture
}
  1. 请求不同的接口的参数可能不一致,增加前后端沟通成本->用一个参数把所有的参数统一,前端每次传固定的参数,后端对参数进行转换
{
 统一传 searchText
 后端把 searchText 转换为 userName => queryUser
}

  1. 前端写调用多个接口的代码,重复代码->用一个接口,不同参数来区分不同的数据源
{
 前端传 type 调用后端同一个接口, 后端根据 type 调用不同的 service 查询
 type = user => userService.query
}

后端

将分页查询用户的方法提取出来

将分页查询文章的方法提取出来

实现聚合搜索controller

@RestController
@RequestMapping("/search")
@Slf4j
public class SearchController {
    @Resource
    private PictureService pictureService;
    @Resource
    private UserService userService;
    @Resource
    private PostService postService;
    /**
 * 图片搜索
 *
 */
    @PostMapping("/all")
    public BaseResponse<SearchVO> searchAll(@RequestBody SearchRequest
                                            searchRequest,HttpServletRequest request) {
String searchText = searchRequest.getSearchText();
 //图片
 Page<Picture> picturePage =
pictureService.searchPicture(searchText, 1, 10);
 //用户
 UserQueryRequest userQueryRequest = new UserQueryRequest();
 userQueryRequest.setUserName(searchText);
 Page<UserVO> userVOPage =
userService.listUserVOByPage(userQueryRequest);
 //文章
 PostQueryRequest postQueryRequest = new PostQueryRequest();
 postQueryRequest.setSearchText(searchText);
 Page<PostVO> postVOPage =
postService.listPostVOByPage(postQueryRequest,request);
 //聚合
 SearchVO searchVO = new SearchVO();
 searchVO.setUserList(userVOPage.getRecords());
 searchVO.setPostList(postVOPage.getRecords());
 searchVO.setPictureList(picturePage.getRecords());
 return ResultUtils.success(searchVO);
 }
}

修改为并发查询(线程池)

@PostMapping("/all")
public BaseResponse<SearchVO> searchAll(@RequestBody SearchRequest
searchRequest, HttpServletRequest request) {
 String searchText = searchRequest.getSearchText();
//用户
 CompletableFuture<Page<UserVO>> userTask =
CompletableFuture.supplyAsync(() -> {
 UserQueryRequest userQueryRequest = new UserQueryRequest();
 userQueryRequest.setUserName(searchText);
 Page<UserVO> userVOPage =
userService.listUserVOByPage(userQueryRequest);
 return userVOPage;
 });
 //文章
 CompletableFuture<Page<PostVO>> postTask =
CompletableFuture.supplyAsync(() -> {
 PostQueryRequest postQueryRequest = new PostQueryRequest();
 postQueryRequest.setSearchText(searchText);
 Page<PostVO> postVOPage =
postService.listPostVOByPage(postQueryRequest, request);
 return postVOPage;
 });
 //图片
 CompletableFuture<Page<Picture>> pictureTask =
CompletableFuture.supplyAsync(() -> {
 Page<Picture> picturePage =
pictureService.searchPicture(searchText, 1, 10);
 return picturePage;
 });
 //聚合
 CompletableFuture.allOf(userTask, postTask, pictureTask).join();
 try {
 Page<UserVO> userVOPage = userTask.get();
 Page<PostVO> postVOPage = postTask.get();
 Page<Picture> picturePage = pictureTask.get();
 SearchVO searchVO = new SearchVO();
 searchVO.setUserList(userVOPage.getRecords());
 searchVO.setPostList(postVOPage.getRecords());
 searchVO.setPictureList(picturePage.getRecords());
 return ResultUtils.success(searchVO);
 } catch (Exception e) {
 log.error("查询异常", e);
 throw new BusinessException(ErrorCode.SYSTEM_ERROR, "查询异常");
 }
}

并发前
image.png
并发后
image.png
wtf,还慢了,并发不一定快,短板效应,要以实际测试为准

前端

IndexPage完成代码

//旧
const loadDataOld = (params: any) => {
  const pictureQuery = {
    ...params,
    searchText: params.text,
  };
  myAxios.post("/picture/search/page/vo",pictureQuery).then((res: any) => {
  pictureList.value = res.records;
});
  const postQuery = {
    ...params,
    searchText: params.text,
  };
  myAxios.post("/post/list/page/vo", postQuery).then((res: any) => {
  postList.value = res.records;
});
const userQuery = {
  ...params,
  userName: params.text,
}
myAxios.post("/user/list/page/vo", userQuery).then((res: any) => {
  userList.value = res.records;
});
};

//新
const loadData = (params: any) => {
  const query = {
    ...params,
    searchText: params.text,
  };
  myAxios.post("/search/all",query).then((res: any) => {
  userList.value = res.userList;
  pictureList.value = res.pictureList;
  postList.value = res.postList;
});
};

怎么样,变化大吧,前端代码是不是显得很整洁

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值