码迷,mamicode.com
首页 > 其他好文 > 详细

4.爱收藏——首页搜索功能实现

时间:2020-05-24 12:13:13      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:div   nbsp   ram   elastics   ted   sage   标示   收藏   代码   

一、需求

  1. 随着收藏的网站增多,查找网站功能必不可少。
  2. 需要在主页收藏的网站中搜索。
  3. 能够在网站名称、网站简介、网站标签中根据关键词搜索。
  4. 单独开启搜索页面。
  5. 用户输入的关键词,在命中的结果中突出显示。

二、概要设计

  1. 首页头部增加搜索框、搜索按钮。 
  2. 用户未输入关键词,点击搜索按钮,则提示用户输入关键词。
  3. 携带关键词跳转到搜索页面。
  4. 在搜索页面,给后端传递关键词。
  5. 根据关键词进行搜索。
  6. 前端拿到返回结果,标记关键词。

  流程图:

   技术图片

三、详细设计

3.1搜索功能

  搜索,有两个参数传递路径。

  (1)首页的搜索,关键词通过url传递,搜索页面在创建时,获取url参数,调用搜索方法。

  (2)搜索页面header的搜索,关键词通过$emit传递到父组件,再调用搜索方法。

  1、首页,菜单模块,未输入关键词,则弹出提示。代码如下:

        let keyword = this.searchForm.keyword.trim();
        if (keyword == "") {
          this.$message.warning("请输入关键词!");
          return;
        }

  2、点击搜索按钮,携带关键词,跳转到搜索页面。关键词使用url传递,query方式,则关键词在url上。代码如下:

        //url中传递参数
        this.$router.push({path: "/search", query: {keyword: keyword}});

  3、搜索页面,在页面创建之前,从url中获取关键词参数。代码如下:

    created() {
      //从url中获取参数
      let keyword = this.$route.query.keyword.trim();
    },

  4、搜索页面的header是单独的,header带有搜索框和搜索按钮。为了在搜索框中显示主页携带过来的关键词,搜索页面需要获取关键词并显示。代码如下:

    mounted() {
      //搜索框显示主页传递过来的关键词
      let keyword = this.$route.query.keyword;
      this.searchForm.keyword = keyword;
    }

  5、搜索页面header中搜索功能的实现。搜索页面展示搜索结果,搜索header提供搜索功能。搜索页面引入搜索header,搜索header是子组件,点击搜索header中的搜索按钮,就需要调用父组件中的方法。

    搜索header中调用父组件中的方法代码如下:

      search() {
        let keyword = this.searchForm.keyword.trim();
        if (keyword == "") {
          this.$message.warning("请输入关键词!");
          return;
        }

        //子组件调用父组件方法
        this.$emit(‘search‘, keyword);
      }

  需要调用父组件中的search方法。父组件在引用子组件时进行监听。代码如下:

<search-header @search="onSearch"></search-header>

  父组件需要实现onSearch方法,获取参数,并调用后端方法,代码如下:

      onSearch(keyword) {
        this.searchForm.keyword = keyword;
        this.$axios.get(Service.url.search, {
          params: this.searchForm
        }).then((res) => {
          if (res.status === 200) {
            let responseData = res.data;
            if (responseData.code === 0) {
              this.myDataList = responseData.data;
            } else {
              this.$message.error(responseData.msg);
            }
          } else {
            this.$message.error("系统内部错误");
          }
        }).catch(function (error) {
          console.error(error);
        });
      }

  6、后端搜索功能实现。目前数据量较小,网站数据存储在mysql中,使用mysql进行检索,按照name、remark、tag进行like匹配。后续计划使用ElasticSearch实现全文检索。

 3.2 关键词高亮

  返回结果需要标示出关键词。

   1、返回的结果,使用关键词去匹配,匹配成功,则将原关键词替换成带css样式的字符。代码如下:

      highlight(content) {
        if (content == null || content == "") {
          return;
        }

        let keyword = this.searchForm.keyword;
        // 匹配关键字正则
        let replaceReg = new RegExp(keyword, ‘g‘);
        // 高亮替换v-html值
        let replaceString = ‘<span style="color: red;">‘ + keyword + ‘</span>‘;
        // 开始替换
        return content.replace(replaceReg, replaceString);
      }

  2、html代码中调用高亮方法。代码如下:

<div class="remark" v-html="highlight(item.remark)"></div>

  

4.爱收藏——首页搜索功能实现

标签:div   nbsp   ram   elastics   ted   sage   标示   收藏   代码   

原文地址:https://www.cnblogs.com/leanfish/p/12941935.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!