精华内容
下载资源
问答
  • 用compass快速给你的网站添加搜索功能 如果你的网站架构采用的是spring+hibernate。用现在比较流行的开源搜索引擎框架compass可以快速的给你的网站添加强大的搜索功能。从几十万条数据中,只需几毫秒的时间就可以...

    用compass快速给你的网站添加搜索功能

           如果你的网站架构采用的是spring+hibernate。用现在比较流行的开源搜索引擎框架compass可以快速的给你的网站添加强大的搜索功能。从几十万条数据中,只需几毫秒的时间就可以搜索出你想要的数据。
           我现在只讲快速的把搜索功能构建到你的系统中。至于配置的细节,可能点到为止。望能够原谅。让我们开始吧。
          第一步:为你要搜索的表建立索引。我们不是通过关系数据库中的表直接建立索引的。而是借助于已通过hibernate这个中间桥梁而间接的给库表建立索引。我们知道hibernate主要完成对象到库表的映射。而我们是在对象的基础上建立索引的。假如我们的库表有一个叫video(影视表)的表。有字段,id(主键,唯一编号,递增),c_name(中文名),e_name(英文名),alias(别名),genre(类型),director(导演),create_time,update_time....这个表应该对应一个对象,也就是我们常说的pojo.
    Video.java
    package com.jack.video
    public class Video{
     private Integer id;
     private String CName;
     private String EName;
     private String alias;
     private String genre;
     pivate String director;
     private Date createTime;
     private Date updateTime;
     
     public Video(){}
      public Integer getId() {
      return this.id;
     }
     public void setId(Integer id) {
      this.id = id;
     }
     public String getCName() {
      return this.CName;
     }
     public void setCName(String CName) {
      this.CName = CName;
     }
     public String getEName() {
      return this.EName;
     }
     public void setEName(String EName) {
      this.EName = EName;
     }
     public String getAlias() {
      return this.alias;
     }
     public void setAlias(String alias) {
      this.alias = alias;
     }
     public String getGenre() {
      return this.genre
     }
     public void setGenre(String genre) {
      this.genre= genre;
     }
     
     public String getDirector() {
      return this.director;
     }
     public void setDirector(String director) {
      this.director = director;
     }
     
     public Date getCreateTime() {
      return this.ceateTime;
     }
     public void setCreateTime(Date ceateTime) {
      this.ceateTime = ceateTime;
     }
    public Date getUpdateTime() {
      return this.updateTime;
     }
     public void setUpdateTime(Date updateTime) {
      this.updateTime = updateTime;
     }
    }
       上面这个简单的pojo没什么可讲的,大家一看就很熟悉了。
        接下来我们要针对这个pojo建立索引,也就是建立一个cpm文件。具体配置如下:
    Video.cpm.xml
    <!DOCTYPE compass-core-mapping PUBLIC
            "-//Compass/Compass Core Mapping DTD 1.0//EN"
            "
    http://www.opensymphony.com/compass/dtd/compass-core-mapping.dtd ">
    <compass-core-mapping package="com.jack.video"
    <class name="Video" alias="video"
    index="video-index">
      <id name="id" />
      <property name="CName">
       <meta-data index="tokenized">CName</meta-data>
      </property>
      <property name="EName">
       <meta-data index="tokenized">EName</meta-data>
      </property>
      <property name="alias">
       <meta-data index="tokenized">alias</meta-data>
      </property>
      <property name="genre">
       <meta-data index="un_tokenized">genre</meta-data>
      </property>
        <property name="director">
       <meta-data index="tokenized">director</meta-data>
      </property>
      <property name="createTime">
       <meta-data index="no">trueCreateTime</meta-data>
      </property>
      <property name="updateTime">
       <meta-data index="no">updateTime</meta-data>
      </property>
     </class>
    </compass-core-mapping>
       简单的配置文件讲解一下,这个文件的package属性是指导pojo(Video.java)所在的包。<class name="Video" alias="video"
    index="video-index"> .name就是类名了。alias就是给这个类在起一个别名。index是指生成索引所在的文件夹的名字。后面你就会明白的。
     <property name="CName">
       <meta-data index="tokenized">CName</meta-data>
      </property>
      这个标签中的name就是Video.java中的那些属性名。<meta-data index="tokenized">这个属性指明了,该字段索引的策略,index有三个值,默认是tokenized表示先分词在索引,no表示既不分词也不索引,un_tokenized表示不分词但索引。其中还有一个属性store表示是否存储,它有两个值, yes/no.默认就是yes.表示对该字段存储。这是常用到的两个属性,其他还有很多,但是不是常用的。这两个就够了。至于其他的属性我们一般不再这里配置,一般在另外一个配置文件中统一配置。每个cpm文件都可以用到的。
     第二步:配置compass文件。
    <!-- compass主配置 -->
     <bean id="compass" class="org.compass.spring.LocalCompassBean">
      <property name="compassSettings">
       <props>
        <prop key="compass.engine.connection">E:/video</prop>
        <prop key="compass.transaction.factory">
         org.compass.spring.transaction.SpringSyncTransactionFactory
        </prop>
      <prop key="compass.engine.analyzer.MMAnalyzer.CustomAnalyzer">  jeasy.analysis.MMAnalyzer  </prop>
        <prop
         key="compass.engine.highlighter.default.formatter.simple.pre">
         <![CDATA[<font color="red"><b>]]>
        </prop>
        <prop
         key="compass.engine.highlighter.default.formatter.simple.post">
         <![CDATA[</b></font>]]>
        </prop>
       </props>
      </property>
      <property name="transactionManager">
       <ref local="transactionManager" />
      </property>
      <property name="resourceLocations">
       <list>
        <value>
         classpath:com/jack/video/Video.cpm.xml
        </value>
       </list>
      </property>
     </bean>
     <!-- 同步更新索引 -->
     <bean id="hibernateGps"
      class="org.compass.gps.impl.SingleCompassGps" init-method="start"
      destroy-method="stop">
      <property name="compass">
       <ref bean="compass" />
      </property>
      <property name="gpsDevices">
       <list>
        <bean
         class="org.compass.spring.device.SpringSyncTransactionGpsDeviceWrapper">
         <property name="gpsDevice" ref="hibernateGpsDevice" />
        </bean>
       </list>
      </property>
     </bean>
     <!--hibernate驱动 链接compass和hibernate -->
     <bean id="hibernateGpsDevice"
      class="org.compass.spring.device.hibernate.dep.SpringHibernate3GpsDevice">
      <property name="name">
       <value>hibernateDevice</value>
      </property>
      <property name="sessionFactory">
       <ref local="sessionFactory" />
      </property>
     </bean>
      在这里我并没有配置compass.cfg.xml这个文件。我把它里面该配置的都统一配置到了上面那个文件里了。
    展开全文
  • 个人博客网站添加文章搜索功能

    千次阅读 2019-03-04 22:08:31
    现在很多网站页面里都有搜索模块,包括在线搜索、站内搜索等等,尤其是博客类网站,文章搜索功能就显得比较重要,现在以个人博客网站为例,详细介绍如何给页面添加搜索功能模块,至于如何搭建个人博客网站,可以参考...

    文章转自个人博客:https://knightyun.github.io/2019/03/04/articles-search,转载请申明


    现在很多网站页面里都有搜索模块,包括在线搜索、站内搜索等等,尤其是博客类网站,文章搜索功能就显得比较重要,现在以个人博客网站为例,详细介绍如何给页面添加搜索功能模块,至于如何搭建个人博客网站,可以参考这篇文章:https://knightyun.github.io/2018/04/01/github-pages-blog

    功能分析

    为网页添加搜索模块的第三方网站有不少,实现效果也都不错,既然人家都能通过代码实现此功能,与其过度依赖第三方,何不自己研究一下原理自己实现呢*_*;

    网页内搜索功能无非就是在文本输入框内输入一串想要搜索的关键字符串,点击搜索按钮后查找匹配出站内所有文章的匹配结果进行输出,再附上一个文章的链接;针对这个功能,作者本人第一时间想到的则是前端领域里的 Ajax,利用 XMLHttpRequest() 实现数据的交互,不清楚的可以自行百度快速补习,然后一般博客类网站都有 RSS 订阅功能及其数据页面,不清楚的也可以迅速百度了解一下,其实就是站内某个目录内存在一个叫 feed.xml 或者类似名字的页面,XML格式的,早期用于实现新闻内容订阅的,现在用的也比较广泛,里面存储的就是文章相关的一些数据,因此我们就可以获取这个文件里面的所有内容然后实现搜索匹配;

    如果像我一样用 Gihub Pages 搭建的个人博客网站的话,无论用的 jekyll 或者 hexo,一般这个 feed.xml 文件就位于 根目录 下,并且该文件同时记录着某一篇文章所对应的 标题、页面链接、文章内容 等内容,这三个部分后面将用到,xml 内容大致如下:
    rss

    当然有其他更好的实现方法可以自行参考或者在文末评论,那么接下来便通过这个方法来一步步实现搜素功能;

    功能实现

    先预览一下页面最终的实现效果:
    search-box

    或者在这里:https://knightyun.github.io/ 预览我的博客的搜索模块的最终实现;

    HTML部分

    即页面样式,组成很简单,即一个文本输入框<input>和一个搜索图标,这里图标可以自行搜索下载一个,或者像下面一样使用在线图标,全部代码如下:

    先在<header></header>内部添加以下代码,使用在线图标:

    <link href="https://fonts.googleapis.com/icon?family=Material+Icons"
          rel="stylesheet">
    

    然后在网页内需要添加搜索栏的合适位置添加以下代码,一般放在顶部导航栏:

    <div class="search">
        <i class="material-icons search-icon search-start">search</i>
        <input type="text" class="search-input" placeholder="Searching..." />
        <i class="material-icons search-icon search-clear">clear</i>
    	<div class="search-results"></div>
    </div>
    

    上面的clear是一个清除输入框内容的图标,search-results是用于输出匹配到的结果的板块;

    CSS部分

    然后来看一下CSS样式代码,仅供参考:

    .search {
        position: relative;
        height: 30px;
        text-align: right;
        line-height: 30px;
        padding-right: 10px;
    }
    
    .search .search-icon {
        float: right;
        height: 100%;
        margin: 0 10px;
        line-height: 30px;
        cursor: pointer;
        user-select: none;
    }
    
    .search .search-input {
        float: right;
        width: 30%;
        height: 30px;
        line-height: 30px;
        margin: 0;
        border: 2px solid #ddd;
        border-radius: 10px;
        box-sizing: border-box;
    }
    
    .search .search-clear {
        display: none;
    }
    
    .search .search-results {
        display: block;
        z-index: 1000;
        position: absolute;
        top: 30px;
        right: 50px;
        width: 50%;
        max-height: 400px;
        overflow: auto;
        text-align: left;
        border-radius: 5px;
        background: #ccc;
        box-shadow: 0 .3rem .5rem #333;
    }
    
    .search .search-results .result-item {
        background: aqua;
        color: #000;
        margin: 5px;
        padding: 3px;
        border-radius: 3px;
        cursor: pointer;
    }
    

    样式可以自行随意调整,最终感觉好看就OK;

    JavaScript部分

    接下来就是重头戏了,也是实现搜索功能的核心部分,搜索逻辑的实现;

    再来大致分析一下逻辑,和实现的思路:

    1. 利用XMLHttpRequest()获取站内feed.xml内的所有数据,保存到一个XML DOM对象中;
    2. 将XML对象中的文章标题、链接、内容、索引等通过getElementsByTagName()等方法获取并保存到对应数组变量中;
    3. 用户在输入框输入查找内容,提交后内容保存到一个字符串类型变量中;
    4. 遍历保存文章内容的数组,通过.search()等方法和输入值进行匹配;
    5. 匹配成功后得到所有匹配成功的数组元素的索引值,该索引值也是该内容的标题、链接数组对应的索引值;
    6. 将最终搜集的文章标题、链接,以及匹配到的内容片段摘取输出到页面;

    这里附上最终的 js 实现代码与注释:

    // 获取搜索框、搜索按钮、清空搜索、结果输出对应的元素
    var searchBtn = document.querySelector('.search-start');
    var searchClear = document.querySelector('.search-clear');
    var searchInput = document.querySelector('.search-input');
    var searchResults = document.querySelector('.search-results');
    
    // 申明保存文章的标题、链接、内容的数组变量
    var searchValue = '',
        arrItems = [],
        arrContents = [],
        arrLinks = [],
        arrTitles = [],
        arrResults = [],
        indexItem = [],
        itemLength = 0;
    var tmpDiv = document.createElement('div');
    tmpDiv.className = 'result-item';
    
    // ajax 的兼容写法
    var xhr = new XMLHttpRequest() || new ActiveXObject('Microsoft.XMLHTTP');
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
            xml = xhr.responseXML;
            arrItems = xml.getElementsByTagName('item');
            itemLength = arrItems.length;
            
            // 遍历并保存所有文章对应的标题、链接、内容到对应的数组中
            // 同时过滤掉 HTML 标签
            for (i = 0; i < itemLength; i++) {
                arrContents[i] = arrItems[i].getElementsByTagName('description')[0].
                    childNodes[0].nodeValue.replace(/<.*?>/g, '');
                arrLinks[i] = arrItems[i].getElementsByTagName('link')[0].
                    childNodes[0].nodeValue.replace(/<.*?>/g, '');
                arrTitles[i] = arrItems[i].getElementsByTagName('title')[0].
                    childNodes[0].nodeValue.replace(/<.*?>/g, '');
            }
        }
    }
    
    // 开始获取根目录下 feed.xml 文件内的数据
    xhr.open('get', '/feed.xml', true);
    xhr.send();
    
    searchBtn.onclick = searchConfirm;
    
    // 清空按钮点击函数
    searchClear.onclick = function(){
        searchInput.value = '';
        searchResults.style.display = 'none';
        searchClear.style.display = 'none';
    }
    
    // 输入框内容变化后就开始匹配,可以不用点按钮
    // 经测试,onkeydown, onchange 等方法效果不太理想,
    // 存在输入延迟等问题,最后发现触发 input 事件最理想,
    // 并且可以处理中文输入法拼写的变化
    searchInput.oninput = function () {
        setTimeout(searchConfirm, 0);
    }
    searchInput.onfocus = function () {
        searchResults.style.display = 'block';
    }
    
    function searchConfirm() {
        if (searchInput.value == '') {
            searchResults.style.display = 'none';
            searchClear.style.display = 'none';
        } else if (searchInput.value.search(/^\s+$/) >= 0) {
            // 检测输入值全是空白的情况
            searchInit();
            var itemDiv = tmpDiv.cloneNode(true);
            itemDiv.innerText = '请输入有效内容...';
            searchResults.appendChild(itemDiv);
        } else {
            // 合法输入值的情况
            searchInit();
            searchValue = searchInput.value;
            // 在标题、内容中查找
            searchMatching(arrTitles, arrContents, searchValue);
        }
    }
    
    // 每次搜索完成后的初始化
    function searchInit() {
        arrResults = [];
        indexItem = [];
        searchResults.innerHTML = '';
        searchResults.style.display = 'block';
        searchClear.style.display = 'block';
    }
    
    function searchMatching(arr1, arr2, input) {
        // 忽略输入大小写
        input = new RegExp(input, 'i');
        // 在所有文章标题、内容中匹配查询值
        for (i = 0; i < itemLength; i++) {
            if (arr1[i].search(input) !== -1 || arr2[i].search(input) !== -1) {
                // 优先搜索标题
                if (arr1[i].search(input) !== -1) {
                    var arr = arr1;
                } else {
                    var arr = arr2;
                }
                indexItem.push(i);  // 保存匹配值的索引
                var indexContent = arr[i].search(input);
                // 此时 input 为 RegExp 格式 /input/i,转换为原 input 字符串长度
                var l = input.toString().length - 3;
                var step = 10;
                
                // 将匹配到内容的地方进行黄色标记,并包括周围一定数量的文本
                arrResults.push(arr[i].slice(indexContent - step, indexContent) +
                    '<mark>' + arr[i].slice(indexContent, indexContent + l) + '</mark>' +
                    arr[i].slice(indexContent + l, indexContent + l + step));
            }
        }
    
        // 输出总共匹配到的数目
        var totalDiv = tmpDiv.cloneNode(true);
        totalDiv.innerHTML = '总匹配:<b>' + indexItem.length + '</b> 项';
        searchResults.appendChild(totalDiv);
    
        // 未匹配到内容的情况
        if (indexItem.length == 0) {
            var itemDiv = tmpDiv.cloneNode(true);
            itemDiv.innerText = '未匹配到内容...';
            searchResults.appendChild(itemDiv);
        }
    
        // 将所有匹配内容进行组合
        for (i = 0; i < arrResults.length; i++) {
            var itemDiv = tmpDiv.cloneNode(true);
            itemDiv.innerHTML = '<b>《' + arrTitles[indexItem[i]] +
                '》</b><hr />' + arrResults[i];
            itemDiv.setAttribute('onclick', 'changeHref(arrLinks[indexItem[' + i + ']])');
            searchResults.appendChild(itemDiv);
        }
    }
    
    function changeHref(href) {
    
        // 在当前页面点开链接的情况
        location.href = href;
    
        // 在新标签页面打开链接的代码,与上面二者只能取一个,自行决定
        // window.open(href);
    }
    

    可以把上面的代码保存到search-box.js这样的 js 文件中,然后引入到 html 页面里;

    看一下最终效果:
    final

    或者来我的主页查看:https://knightyun.github.io/


    技术文章推送
    手机、电脑实用软件分享
    展开全文
  • dede如何添加搜索功能代码如下         将以上代码放到对于的网站模板中即可, 一般讲织梦dedecms的搜索代码放置于顶部模板中, 方便全站调用。 添加好之后...
    dede如何添加搜索功能代码如下
    

    <form action="/plus/search.php" name="formsearch">
     <input type="hidden" name="kwtype" value="0" />
     <input type="text" name="q" value="请输入关键词 如:公司网站" class="s_w" οnblur="if (this.value ==''){this.value=this.defaultValue}" οnclick="if(this.value=='请输入关键词 如:公司网站')this.value=''"/>
     <input type="submit" name="submit" value="提 交" class='an' style="border:0"/>
     </form>

    将以上代码放到对于的网站模板中即可, 一般讲织梦dedecms的搜索代码放置于顶部模板中, 方便全站调用。

    添加好之后可以针对网站风格调整css样式和网站布局, 具体的看个人喜好和网站的主题。 对于的搜索网站结果列表页模板是   search.htm   默认的实在templets/default 模板中。

    如果属于新建dede搜索结果, 不用默认的模板, dede如何添加搜索功能方法如下

    新建一个search.htm模板,并把它放入我们的自定义模板文件夹里,(用于展示搜索结果)然后就是代码的调用了。在你想要显示搜索结果的地方,加入调用标签即可。

    列表调用标签为:   

    {dede:list perpage='4'}{/dede:list}

    底层调用字段和首页、列表页调用字段一样。

    展开全文
  • 织梦添加搜索功能

    千次阅读 2018-01-11 16:35:48
    dede如何添加搜索功能代码如下     将以上代码放到对于的网站模板中即可, 一般讲织梦dedecms的搜索代码放置于顶部模板中, 方便全站调用。 添加好之后可以针对网站风格调整css样式和网站布局, ...

    dede如何添加搜索功能代码如下

    <form action="plus/search.php" name="formsearch">
    <input type="hidden" name="kwtype" value="0" />
            <input type="text" name="q" value="请输入关键词 如:公司网站" class="s_w" οnblur="if (this.value ==''){this.value=this.defaultValue}" οnclick="if(this.value=='请输入关键词 如:公司网站')this.value=''"/>
            <input type="submit" name="submit" value="提 交" class='an' style="border:0"/>
    </form>

    将以上代码放到对于的网站模板中即可, 一般讲织梦dedecms的搜索代码放置于顶部模板中, 方便全站调用。

    添加好之后可以针对网站风格调整css样式和网站布局, 具体的看个人喜好和网站的主题。 对于的搜索网站结果列表页模板是   search.htm   默认的实在templets/default 模板中。

    如果属于新建dede搜索结果, 不用默认的模板, dede如何添加搜索功能方法如下

    新建一个search.htm模板,并把它放入我们的自定义模板文件夹里,(用于展示搜索结果)然后就是代码的调用了。在你想要显示搜索结果的地方,加入调用标签即可。

    列表调用标签为:   

    {dede:list perpage='4'}{/dede:list}

    底层调用字段和首页、列表页调用字段一样。

    展开全文
  • hexo博客添加搜索功能

    千次阅读 热门讨论 2018-04-21 16:09:14
    hexo博客添加搜索功能 前言 当博文慢慢变多的时候,标签和分类已经不能提供太大的作用,无法准确的定位到自己想要看的博客上去,所以添加一个本站内搜索功能是很有必要的。 安装插件 直接在自己的博客文件夹下...
  • 当你的网站文章内容变多时,搜索的需求会逐渐显现,mysql的like功能无论从性能还是效果上都是一个山寨的实现,本节帮你集成elasticSearch实现专业的搜索功能 请尊重原创,转载请注明来源网站www.shareditor.com以及...
  • dede如何添加搜索功能, 让网…

    千次阅读 2016-01-21 13:16:48
    dede如何添加搜索功能, 让网站支持搜索加技术QQ:1547479934 dede如何添加搜索功能代码如下         将以上代码放到对于的网站模板中即可, 一般讲织梦dedecms的搜索代码...
  • Hexo Next 主题中添加本地搜索功能

    千次阅读 2019-02-27 13:25:07
    在 next 主题侧边列表有一个 搜索 菜单,但是点击之后页面会处于卡死状态,后台显示是 404,需要添加搜索插件才可以。 1、安装本地搜索插件 hexo-generator-search # 安装插件,用于生成博客索引数据(在博客根目录...
  • 这节课,我们来研究如何添加搜索框。 在cms主题中,因为它的内容非常多,很多用户需要用到搜索的功能,那么我们在之前的课程中,也预留了位置。 在header.php中,用来制作搜索框。 首先打开header.php,我们先把它...
  • 给自己的网站加一个搜索功能很简单,代码如下: 欢迎访问我的博客:http://67566894.iteye.com/ Java代码  "http://www.google.com/search" method="get">   "ie" value="UTF-8" type="hi
  • 使用添加功能向导可以添加以下功能功能 描述 .NET Framework 3.5.1 .NET Framework 3.5.1 是在 .NET Framework 3.0 中添加功能上以增量方式(例如对 Windows Workflow Foundation (WF)、Windows ...
  • 右击解决方案-->添加-->新项目-->搜索框中输入 ASP.NET Web 应用程序(.NET Framework),然后选择-->在选择Web窗体。这就OK了,前提是组件你安装的有。
  • 该博客最开始采用的模板是并不包括搜索功能的,在主页只有主页、归档和分类三个部分。最后博主自己添加了搜索框,不过其实不太想让大家使用这个功能,因此将搜索框隐藏了,只有再点击搜索时,才会显现出来。但是这个...
  • phpcms搜索功能实现

    千次阅读 2018-04-27 17:53:49
    最近在做一个门户网站,用到了phpcms的搜索功能,之前一直想要实现这方面功能,但苦于静不下来心研究phpcms的实现原理,今天通过这个博客记录下我分析的过程,网上的资料相对比较零散,看的总是云里雾里的,这里做一...
  • 为网页添加留言功能

    千次阅读 2018-05-29 09:50:36
    在网页添加一个留言板功能主要分为以下几个流程: 引入LeanCloud 获取留言内容(网页中写入的留言内容) 保存留言内容到后台服务器 创建历史留言,获取到服务器保存的所有留言内容,读取并写入网页中 封装代码 MVC ...
  • 手机软键盘实现搜索功能 最近一个移动端的项目需要实现点击手机软键盘的搜索键实现点击页面搜索按钮相同的功能,虽然功能挺小但是度娘了不短的时间才达到需求,下边我就大概的说一下实现思路希望对大家有所帮助 ...
  • 为Jekyll博客添加功能

    千次阅读 2018-07-31 00:09:47
    为博客添加各种功能 效果见:ds19991999的博客 1.关于Jekyll本身插件的安装 一共三种方式: * 在根目录下新建_plugins文件夹, 然后把对应的*.rb插件文件放进去就行了; * 在_config.yml文件中增加一个gems...
  • Hexo NexT 添加功能

    千次阅读 2017-08-14 00:00:44
    接上文先从我怎么搭建这个博客开始吧之前搭建完只有基础功能,十分简单,但Hexo功能非常强大,可以给博客增加不少实用的功能。Next主题就是我的博客目前使用的,http://theme-next.iissnan.com/ ,可以很方便地使用...
  • 量子恒道统计是一套免费的网站流量统计分析系统。致力于为所有个人站长、...量子恒道统计通过对大量数据进行统计分析,深度分析搜索引擎蜘蛛抓取规律、发现用户访问网站的规律,并结合网络营销策略,提供运营、广告投放

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 171,960
精华内容 68,784
关键字:

网站添加搜索功能