当前位置: 首页 > news >正文

合肥企业网站建设工晋城建设局网站

合肥企业网站建设工,晋城建设局网站,广州智能模板建站,2024中核招聘网最新招聘公告目录 一、初始MQ 同步调用 异步调用 什么是MQ 执行下面的命令来运行MQ容器#xff1a; 如果冲突了#xff0c;可以先查询 RabbitMQ概述 常见消息模型 HelloWorld案例 二、SpringAMQP 引入依赖 Work Queue 消费预取限制 ​编辑 发布、订阅 发布订阅Fanout Ex…目录 一、初始MQ 同步调用 异步调用 什么是MQ 执行下面的命令来运行MQ容器 如果冲突了可以先查询 RabbitMQ概述  常见消息模型 HelloWorld案例 二、SpringAMQP 引入依赖 Work Queue  消费预取限制 ​编辑 发布、订阅 发布订阅Fanout Exchange 发布DirectExchange 发布订阅TopicExchange  消息转化器 MQ代码 三、什么是elasticsearch 正向索引 倒排索引 文档 索引 概念对比 架构  ​编辑 部署单点es 1.2.加载镜像 1.3.运行 命令解释 2.1.部署 分词器 2.2.DevTools kibana中提供了一个DevTools界面 3.安装IK分词器 3.1.在线安装ik插件较慢 3.2.离线安装ik插件推荐 1查看数据卷目录 2解压缩分词器安装包 3上传到es容器的插件数据卷中 4重启容器 5测试 3.3 扩展词词典 四、索引库操作  创建索引库 查看、删除索引库​编辑 修改索引库 新增文档​编辑 查看、删除文档​编辑 修改文档 RestClient操作索引库 索引库代码 RestClient操作文档 操作文档代码 DSL 查询文档 DSL  Query的分类​编辑 DSL Query基本语法 全文检索查询​编辑 精确查询​编辑 地理查询​编辑 相关性算分 Function Score Query​编辑 复合查询 Boolean Query 搜索结果处理​编辑 分页 深度分页问题 ​编辑高亮  RestClient查询文档 全文检索查询 精确查询 ​编辑 符合查询 排序和分页 高亮​编辑 初始MQ 同步调用 异步调用 什么是MQ 执行下面的命令来运行MQ容器 docker run \-e RABBITMQ_DEFAULT_USERitcast \-e RABBITMQ_DEFAULT_PASS123321 \--name mq \--hostname mq1 \-p 15672:15672 \-p 5672:5672 \-d \rabbitmq:3-management 如果冲突了可以先查询 RabbitMQ概述  常见消息模型 HelloWorld案例 SpringAMQP 引入依赖 Work Queue  消费预取限制 发布、订阅 发布订阅Fanout Exchange 发布DirectExchange 发布订阅TopicExchange  消息转化器 MQ代码 Component public class SpringRabbitListener {// RabbitListener(queues simple.queue) // public void listenSimpleQueue(String msg){ // System.out.println(消费者接收到simple.queue的消息:[msg]); // // }RabbitListener(queues simple.queue)public void listenWorkQueue1(String msg) throws InterruptedException {System.out.println(消费者1接收到simple.queue的消息:[msg] LocalTime.now());Thread.sleep(20);}RabbitListener(queues simple.queue)public void listenWorkQueue2(String msg) throws InterruptedException {System.err.println(消费者2接收到simple.queue的消息:[msg]LocalTime.now());Thread.sleep(200);}RabbitListener(queues fanout.queue1)public void listenFanoutQueue1(String msg){System.out.println(消费者接收到fanout.queue1的消息:[msg]);}RabbitListener(queues fanout.queue2)public void listenFanoutQueue2(String msg){System.out.println(消费者接收到fanout.queue2的消息:[msg]);}RabbitListener(bindings QueueBinding(value Queue(name direct.queue1),exchange Exchange(name itcast.direct,type ExchangeTypes.DIRECT),key {red,blue}))public void listenDirectQueue1(String msg){System.out.println(消费者接收到direct.queue1的消息:[msg]);}RabbitListener(bindings QueueBinding(value Queue(name direct.queue2),exchange Exchange(name itcast.direct,type ExchangeTypes.DIRECT),key {red,yellow}))public void listenDirectQueue2(String msg){System.out.println(消费者接收到direct.queue2的消息:[msg]);}RabbitListener(bindings QueueBinding(value Queue(name topic.queue1),exchange Exchange(name itcast.topic,type ExchangeTypes.TOPIC),key china.#))public void listenTopicQueue1(String msg){System.out.println(消费者接收到topic.queue1的消息:[msg]);}RabbitListener(bindings QueueBinding(value Queue(name topic.queue2),exchange Exchange(name itcast.topic,type ExchangeTypes.TOPIC),key #.news))public void listenTopicQueue2(String msg){System.out.println(消费者接收到topic.queue2的消息:[msg]);}RabbitListener(queues object.queue)public void listObjectQueue(MapString,Object msg){System.out.println(接收object.queue的消息msg);} }Configuration public class FanoutConfig {//声明FanoutExchange 交换机//itcast.fanoutBeanpublic FanoutExchange fanoutExchange(){return new FanoutExchange(itcast.fanout);}//声明一个队列fanout.queue1Beanpublic Queue fanoutQueue1(){return new Queue(fanout.queue1);}//绑定队列1和交换机Beanpublic Binding fanoutBinding1(Queue fanoutQueue1,FanoutExchange fanoutExchange){return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);}//fanout.queue2//声明一个队列fanout.queue1Beanpublic Queue fanoutQueue2(){return new Queue(fanout.queue2);}//绑定队列1和交换机Beanpublic Binding fanoutBinding2(Queue fanoutQueue2,FanoutExchange fanoutExchange){return BindingBuilder.bind(fanoutQueue2).to(fanoutExchange);}Beanpublic Queue objectQueue(){return new Queue(object.queue);}}SpringBootApplication public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}Beanpublic MessageConverter messageConverter(){return new Jackson2JsonMessageConverter();} }public class PublisherTest {Testpublic void testSendMessage() throws IOException, TimeoutException {// 1.建立连接ConnectionFactory factory new ConnectionFactory();// 1.1.设置连接参数分别是主机名、端口号、vhost、用户名、密码factory.setHost(虚拟机地址);factory.setPort(5672);factory.setVirtualHost(/);factory.setUsername(itcast);factory.setPassword(123321);// 1.2.建立连接Connection connection factory.newConnection();// 2.创建通道ChannelChannel channel connection.createChannel();// 3.创建队列String queueName simple.queue;channel.queueDeclare(queueName, false, false, false, null);// 4.发送消息String message hello, rabbitmq!;channel.basicPublish(, queueName, null, message.getBytes());System.out.println(发送消息成功【 message 】);// 5.关闭通道和连接channel.close();connection.close();} }RunWith(SpringRunner.class) SpringBootTest public class SpringAmqpTest {Autowiredprivate RabbitTemplate rabbitTemplate;Testpublic void testSendMessage2SimpleWueue(){String queueName simple.queue;String message hello,spring amqp!!!;rabbitTemplate.convertAndSend(queueName,message);}Testpublic void testSendMessage2WorkQueue() throws InterruptedException {String queueName simple.queue;String message hello,message__;for ( int i 1; i 50; i ) {rabbitTemplate.convertAndSend(queueName,messagei);Thread.sleep(20);}}Testpublic void testSendFanoutExchange(){//交换机名称String exchangeName itcast.fanout;//消息String message hello,every one !;//发送消息rabbitTemplate.convertAndSend(exchangeName,,message);}Testpublic void testSendDirectExchange(){//交换机名称String exchangeName itcast.direct;//消息String message hello,blue !;//发送消息rabbitTemplate.convertAndSend(exchangeName,red,message);}Testpublic void testSendTopicExchange(){//交换机名称String exchangeName itcast.topic;//消息String message 中国NO.1;//发送消息rabbitTemplate.convertAndSend(exchangeName,chi.weather,message);}Testpublic void testSendObjectExchange(){HashMapString, Object msg new HashMap();msg.put(name,留言2);msg.put(age,21);//发送消息rabbitTemplate.convertAndSend(object.queue,msg);}}什么是elasticsearch 正向索引 倒排索引 文档 索引 概念对比 架构  部署单点es 因为我们还需要部署kibana容器因此需要让es和kibana容器互联。这里先创建一个网络 docker network create es-net 1.2.加载镜像 这里我们采用elasticsearch的7.12.1版本的镜像这个镜像体积非常大接近1G。不建议大家自己pull。 课前资料提供了镜像的tar包 大家将其上传到虚拟机中然后运行命令加载即可 # 导入数据 docker load -i es.tar 同理还有kibana的tar包也需要这样做。 1.3.运行 运行docker命令部署单点es docker run -d \--name es \-e ES_JAVA_OPTS-Xms512m -Xmx512m \-e discovery.typesingle-node \-v es-data:/usr/share/elasticsearch/data \-v es-plugins:/usr/share/elasticsearch/plugins \--privileged \--network es-net \-p 9200:9200 \-p 9300:9300 \ elasticsearch:7.12.1 命令解释 -e cluster.namees-docker-cluster设置集群名称 -e http.host0.0.0.0监听的地址可以外网访问 -e ES_JAVA_OPTS-Xms512m -Xmx512m内存大小 -e discovery.typesingle-node非集群模式 -v es-data:/usr/share/elasticsearch/data挂载逻辑卷绑定es的数据目录 -v es-logs:/usr/share/elasticsearch/logs挂载逻辑卷绑定es的日志目录 -v es-plugins:/usr/share/elasticsearch/plugins挂载逻辑卷绑定es的插件目录 --privileged授予逻辑卷访问权 --network es-net 加入一个名为es-net的网络中 -p 9200:9200端口映射配置 在浏览器中输入http://192.168.150.101:9200 即可看到elasticsearch的响应结果 kibana可以给我们提供一个elasticsearch的可视化界面便于我们学习。 2.1.部署 运行docker命令部署kibana(版本一定要一样 docker run -d \ --name kibana \ -e ELASTICSEARCH_HOSTShttp://es:9200 \ --networkes-net \ -p 5601:5601 \ kibana:7.12.1 --network es-net 加入一个名为es-net的网络中与elasticsearch在同一个网络中 -e ELASTICSEARCH_HOSTShttp://es:9200设置elasticsearch的地址因为kibana已经与elasticsearch在一个网络因此可以用容器名直接访问elasticsearch -p 5601:5601端口映射配置 kibana启动一般比较慢需要多等待一会可以通过命令 docker logs -f kibana 查看运行日志当查看到下面的日志说明成功 分词器 2.2.DevTools kibana中提供了一个DevTools界面 这个界面中可以编写DSL来操作elasticsearch。并且对DSL语句有自动补全功能。 3.安装IK分词器 3.1.在线安装ik插件较慢 # 进入容器内部 docker exec -it elasticsearch /bin/bash# 在线下载并安装 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip#退出 exit #重启容器 docker restart elasticsearch 3.2.离线安装ik插件推荐 1查看数据卷目录 安装插件需要知道elasticsearch的plugins目录位置而我们用了数据卷挂载因此需要查看elasticsearch的数据卷目录通过下面命令查看: docker volume inspect es-plugins 显示结果 [{CreatedAt: 2022-05-06T10:06:3408:00,Driver: local,Labels: null,Mountpoint: /var/lib/docker/volumes/es-plugins/_data,Name: es-plugins,Options: null,Scope: local} ] 说明plugins目录被挂载到了/var/lib/docker/volumes/es-plugins/_data这个目录中。 2解压缩分词器安装包 下面我们需要把课前资料中的ik分词器解压缩重命名为ik 3上传到es容器的插件数据卷中 4重启容器 # 4、重启容器 docker restart es # 查看es日志 docker logs -f es 5测试 IK分词器包含两种模式 ik_smart最少切分 ik_max_word最细切分 GET /_analyze {analyzer: ik_max_word,text: 我爱学习java太棒了 } 结果 {tokens : [{token : 我,start_offset : 0,end_offset : 1,type : CN_CHAR,position : 0},{token : 爱学习,start_offset : 1,end_offset : 4,type : CN_WORD,position : 1},{token : 学习,start_offset : 2,end_offset : 4,type : CN_WORD,position : 2},{token : java,start_offset : 4,end_offset : 8,type : ENGLISH,position : 3},{token : 太棒了,start_offset : 8,end_offset : 11,type : CN_WORD,position : 4},{token : 太棒,start_offset : 8,end_offset : 10,type : CN_WORD,position : 5},{token : 了,start_offset : 10,end_offset : 11,type : CN_CHAR,position : 6}] }3.3 扩展词词典 随着互联网的发展“造词运动”也越发的频繁。出现了很多新的词语在原有的词汇列表中并不存在。比如“奥力给”“传智播客” 等。 所以我们的词汇也需要不断的更新IK分词器提供了扩展词汇的功能。 1打开IK分词器config目录 2在IKAnalyzer.cfg.xml配置文件内容添加 ?xml version1.0 encodingUTF-8? !DOCTYPE properties SYSTEM http://java.sun.com/dtd/properties.dtd propertiescommentIK Analyzer 扩展配置/comment!--用户可以在这里配置自己的扩展字典 *** 添加扩展词典--entry keyext_dictext.dic/entry /properties 索引库操作  创建索引库 #创建索引库 PUT /heihei {mappings: {properties: {info: {type: text,analyzer: ik_smart},email: {type: keyword,index: false},name: {type: object,properties: {firstName: {type: keyword},lastName: {type: keyword}}}}} }查看、删除索引库 修改索引库 新增文档 查看、删除文档 修改文档 RestClient操作索引库 #酒店的mapping PUT /hotel {mappings: {properties: {id:{type: keyword},name:{type: text,analyzer: ik_max_word},adress:{type: keyword,index: false},price:{type: integer},score:{type: integer},brand:{type: keyword},city:{type: keyword},starName:{type: keyword},business:{type: keyword},location:{type: geo_point},pic:{type: keyword,index: false}}} }索引库代码 public class HotelIndexTest {private RestHighLevelClient client;Testvoid testInit(){System.out.println(client);}Testvoid createHotelIndex() throws IOException {//1.创建Request对象CreateIndexRequest request new CreateIndexRequest(hotel);//2.准备请求的参数DSL语句request.source(MAPPTING_TEMPLATE, XContentType.JSON);//3.发送请求client.indices().create(request, RequestOptions.DEFAULT);}Testvoid deleteHotelIndex() throws IOException {//1.创建Request对象DeleteIndexRequest request new DeleteIndexRequest(hotel);//3.发送请求client.indices().delete(request, RequestOptions.DEFAULT);}Testvoid testExistHotelIndex() throws IOException {//1.创建Request对象GetIndexRequest request new GetIndexRequest(hotel);boolean exists client.indices().exists(request, RequestOptions.DEFAULT);//3.发送请求System.err.println(exists ? 索引库已经存在 : 索引库不存在);}BeforeEachvoid setUp(){this.client new RestHighLevelClient(RestClient.builder(HttpHost.create(http://虚拟机地址:es端口号)));}AfterEachvoid tearDown()throws IOException{this.client.close();} }RestClient操作文档 操作文档代码 SpringBootTest public class HotelDocumentTest {Autowiredprivate IHotelService hotelService;private RestHighLevelClient client;Testvoid testAddDcoument() throws IOException {//根据id查询酒店数据Hotel hotel hotelService.getById(36934L);//转化为文档类型HotelDoc hotelDoc new HotelDoc(hotel);//1.准备Request对象IndexRequest request new IndexRequest(hotel).id(hotel.getId().toString());//2.准备Json文件request.source(JSON.toJSONString(hotelDoc),XContentType.JSON);client.index(request,RequestOptions.DEFAULT);//3.发送请求}Testvoid testGetDocumentById() throws IOException {//1.准备RequestGetRequest request new GetRequest(hotel, 36934);//2.发送请求得到响应GetResponse response client.get(request, RequestOptions.DEFAULT);//3.解析响应结果String json response.getSourceAsString();HotelDoc hotelDoc JSON.parseObject(json, HotelDoc.class);System.out.println(hotelDoc);}Testvoid testRulkRequest() throws IOException {//批量查询酒店数据ListHotel hotels hotelService.list();//1.创建RequestBulkRequest request new BulkRequest();//2.准备参数添加多个新增的Requestfor ( Hotel hotel : hotels ) {//转换为文档类型HotelDocHotelDoc hotelDoc new HotelDoc(hotel);//2.准备参数添加多个新增的Requestrequest.add(new IndexRequest(hotel).id(hotel.getId().toString()).source(JSON.toJSONString(hotelDoc),XContentType.JSON));}//3.发送请求client.bulk(request,RequestOptions.DEFAULT);}Testvoid testUpdateDocumentById() throws IOException {//1.准备RequestUpdateRequest request new UpdateRequest(hotel, 36934);//2.准备请求参数request.doc(price,952,starName,五钻);//2.发送请求得到响应client.update(request, RequestOptions.DEFAULT);//3.解析响应结果}Testvoid testDeleteDocumentById() throws IOException {ListHotel list hotelService.list();//循环删除for ( Hotel hotel : list ) {//1.准备RequestDeleteRequest request new DeleteRequest(hotel, hotel.getId().toString());//2.发送请求得到响应client.delete(request, RequestOptions.DEFAULT);}//1.准备RequestDeleteRequest request new DeleteRequest(hotel, 36934);//2.发送请求得到响应client.delete(request, RequestOptions.DEFAULT);}BeforeEachvoid setUp(){this.client new RestHighLevelClient(RestClient.builder(HttpHost.create(http://虚机机地址:es端口)));}AfterEachvoid tearDown()throws IOException{this.client.close();} }DSL 查询文档 DSL  Query的分类 DSL Query基本语法 全文检索查询 GET /hotel/_doc/36934#查询所有 GET /hotel/_search {query: {match_all: {}} }#math查询 GET /hotel/_search {query: {match: {all: 外滩如家}} }#multi_math查询 GET /hotel/_search {query: {multi_match: {query: 外滩如家,fields: [brand,name,business]}} } 精确查询 #term查询 GET /hotel/_search {query: {term: {city: {value: 上海}}} }#range查询 几个e代表等于 GET /hotel/_search {query: {range: {price: {gte: 1000,lte: 3000}}} }地理查询 #distance查询 GET /hotel/_search {query: {geo_distance: {distance:3km,location:31.219306, 121.445427}} } 相关性算分 Function Score Query #function score 查询 GET /hotel/_search {query: {function_score: {query: {match: {all: 外滩}},functions: [{filter:{term:{brand:7天酒店}},weight:10}],boost_mode:sum}}}} }复合查询 Boolean Query GET /hotel/_search {query: {bool: {must: [{match: {name: 如家}}],must_not: [{range: {price: {gt: 400}}}],filter: [{geo_distance: {distance: 10km,location: {lat: 31.21,lon: 121.5}}}]}} } 搜索结果处理 排序 #sort排序 GET /hotel/_search {query: {match_all: {}},sort: [{score: desc},{price: asc }] }#找到121.612231.034周围的酒店距离升序排序 GET /hotel/_search {query: {match_all: {}},sort: [{_geo_distance: {location: {lat: 31.034,lon: 121.6122},order: asc,unit: km}}] }分页 深度分页问题 高亮  #分页查询 GET /hotel/_search {query: {match_all: {}},sort: [{price: asc }],from:10,size:10 }#高亮显示 默认情况ES搜索字段必须与高亮字段一致 GET /hotel/_search {query: {match: {all: 如家}},highlight: {fields: {name:{require_field_match: false}}} } RestClient查询文档 全文检索查询 精确查询  符合查询 排序和分页 ​​​​​​​高亮 ​​​​​​​ 觉得好的小伙伴记得一键三连哦 public class HotelIsearchTest {private RestHighLevelClient client;Testvoid testMatchAll() throws IOException {//1 准备RequestSearchRequest request new SearchRequest(hotel);//2.准备DSLrequest.source().query(QueryBuilders.matchAllQuery());//3.发送请求SearchResponse response client.search(request, RequestOptions.DEFAULT);//4解析响应handleRequest(response);}/*** 全文检索查询* throws IOException*/Testvoid testMatch() throws IOException {//1 准备RequestSearchRequest request new SearchRequest(hotel);//2.准备DSLrequest.source().query(QueryBuilders.matchQuery(all,如家));//3.发送请求SearchResponse response client.search(request, RequestOptions.DEFAULT);handleRequest(response);}/*** 精确查询、复合查询* throws IOException*/Testvoid testBool() throws IOException {//1 准备RequestSearchRequest request new SearchRequest(hotel);//2.准备DSL//2.1准备BooleanQueryBoolQueryBuilder boolQuery QueryBuilders.boolQuery();//2.2添加termboolQuery.must(QueryBuilders.termQuery(city,上海));//2.3添加rangeboolQuery.filter(QueryBuilders.rangeQuery(price).lte(250));request.source().query(boolQuery);//3.发送请求SearchResponse response client.search(request, RequestOptions.DEFAULT);handleRequest(response);}/*** 排序和分页* throws IOException*/Testvoid testPageAndSort() throws IOException {//页码、每页大小int page 2,size 5;//1 准备RequestSearchRequest request new SearchRequest(hotel);//2.准备DSL//2.1queryrequest.source().query(QueryBuilders.matchAllQuery());//2.2排序sortrequest.source().sort(price, SortOrder.ASC);//2.3分页from、sizerequest.source().from((page-1) * size).size(5);//3.发送请求SearchResponse response client.search(request, RequestOptions.DEFAULT);handleRequest(response);}/*** 高亮* throws IOException*/Testvoid testHighlight() throws IOException {//1 准备RequestSearchRequest request new SearchRequest(hotel);//2.准备DSL//2.1queryrequest.source().query(QueryBuilders.matchQuery(all,如家));//2.2高亮request.source().highlighter(new HighlightBuilder().field(name).requireFieldMatch(false));//3.发送请求SearchResponse response client.search(request, RequestOptions.DEFAULT);handleHighlight(response);}private void handleRequest(SearchResponse response) {//4解析响应SearchHits searchHits response.getHits();//4.1 获取总条数long total searchHits.getTotalHits().value;System.out.println(共搜索到 total 条数据);//4.2文档数组SearchHit[] hits searchHits.getHits();//4.3遍历for ( SearchHit hit : hits ) {//获取文档sourceString json hit.getSourceAsString();//反序列化HotelDoc hotelDoc JSON.parseObject(json, HotelDoc.class);System.out.println(hotelDoc hotelDoc);}System.out.println(response);}/*** 高亮结果分析* param response*/private void handleHighlight(SearchResponse response) {//4解析响应SearchHits searchHits response.getHits();//4.1 获取总条数long total searchHits.getTotalHits().value;System.out.println(共搜索到 total 条数据);//4.2文档数组SearchHit[] hits searchHits.getHits();//4.3遍历for ( SearchHit hit : hits ) {//获取文档sourceString json hit.getSourceAsString();//反序列化HotelDoc hotelDoc JSON.parseObject(json, HotelDoc.class);//获取高亮结果MapString, HighlightField highlightFields hit.getHighlightFields();if ( !CollectionUtils.isEmpty(highlightFields) ) {//根据字段名获取如果HighlightField highlightField highlightFields.get(name);if ( highlightField!null ) {//获取高亮的值String name highlightField.getFragments()[0].string();//覆盖非高亮结果hotelDoc.setName(name);}}System.out.println(hotelDoc hotelDoc);}System.out.println(response);}/*** 高亮结果解析*/BeforeEachvoid setUp(){this.client new RestHighLevelClient(RestClient.builder(HttpHost.create(http://虚拟机地址:es端口号)));}AfterEachvoid tearDown()throws IOException{this.client.close();} }
http://www.zqtcl.cn/news/307464/

相关文章:

  • 网站建设管理工作情况的通报网站开发vs设计报告
  • 嘉定网站网站建设公司官网制作
  • 做旅游广告在哪个网站做效果好财经网站建设
  • 网站样式下载网站地图定位用什么技术做
  • 自己做网站怎么做的百中搜优化软件
  • 南宁建站平台与网站建设相关的论文题目
  • 足球网站建设意义做股权众筹的网站
  • 北京网站建设设计一流的锦州网站建设
  • 专业手机移动网站建设什么网站可以做期刊封面
  • cms建站系统哪个好网站建设 柳州
  • 安徽省住房与城乡建设部网站八戒电影在线观看免费7
  • 江苏省建设考试网站准考证打印佛山网站建设锐艺a068
  • 展示型网站功能如何设计网站风格
  • wordpress图床网站网站什么时候做等保
  • 怎么创办网站浅谈博物馆网站建设的意义
  • 如何做擦边球网站网站seo规划
  • 建站知乎做网站销售工资
  • 仙居住房和城乡建设局网站用手机看网站源代码
  • 网架加工厂家seo关键词优化推广报价表
  • 开发新闻类网站门户网站搭建方案
  • 东莞网站搭建建站公司wordpress+链接跳转
  • 福州网站设计软件公司学校网站源码wordpress
  • 网站seo推广优化报价表广州哪个区封了
  • 网站第三方统计代码网页设计图片大小
  • 网上推广网站夸克搜索引擎
  • 什么是网站根目录做动态图片下载哪个网站好
  • 花钱让别人做的网站版权是谁的o2o网站建设如何
  • 电子商务网站建设策划书的流程wordpress原理
  • 微信公众号文章排版设计软媒win7优化大师
  • 长春建设局网站处长做箱包关注哪个网站