GVKun编程网logo

用Site语法搜索产品分类页面,第一位未显示(在搜索引擎中site的作用)

30

对于想了解用Site语法搜索产品分类页面,第一位未显示的读者,本文将提供新的信息,我们将详细介绍在搜索引擎中site的作用,并且为您提供关于07-08Flutter仿京东商城项目商品分类页面布局:Fl

对于想了解用Site语法搜索产品分类页面,第一位未显示的读者,本文将提供新的信息,我们将详细介绍在搜索引擎中site的作用,并且为您提供关于07-08 Flutter仿京东商城项目 商品分类页面布局:Flutter仿京东商城项目 商品分类页面数据渲染、360反制百度 网址导航搜索框撤百度搜索产品、5. 分类页面、Android 仿京东、拼多多商品分类页的示例代码的有价值信息。

本文目录一览:

用Site语法搜索产品分类页面,第一位未显示(在搜索引擎中site的作用)

用Site语法搜索产品分类页面,第一位未显示(在搜索引擎中site的作用)

Ever 提问于 1年 之前

用site语法在谷歌中搜索一个正在优化的产品分类页面,结果第一页根本就没有发现该页。

请问是被惩罚了吗?

1 个回答

Zac 管理员 回答于 1年 之前

site:域名 指令搜索结果是网站所有被索引的页面(当然并不完全),排列顺序也比较随机。如果你在优化的页面本身权重就不高,在网站上的地位不高,不在第一页很正常。

如果site: 后面跟的是具体URL,却没有结果的话,说明页面就没被索引。是否惩罚不好说。需要先解决抓取、索引问题。

07-08 Flutter仿京东商城项目 商品分类页面布局:Flutter仿京东商城项目 商品分类页面数据渲染

07-08 Flutter仿京东商城项目 商品分类页面布局:Flutter仿京东商城项目 商品分类页面数据渲染

Flutter实战(交流群:452892873)

本项目是一个实战项目,根据目录建文件,并复制从第一节到最新更新的文章,可以构成完整的一个请求后台数据的项目:

CateModel.dart

class CateModel {
  List<CateItemModel> result;

  CateModel({this.result});

  CateModel.fromJson(Map<String, dynamic> json) {
    if (json[''result''] != null) {
      result = new List<CateItemModel>();
      json[''result''].forEach((v) {
        result.add(new CateItemModel.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    if (this.result != null) {
      data[''result''] = this.result.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

class CateItemModel {
  String sId;
  String title;
  Object status;
  String pic;
  String pid;
  String sort;

  CateItemModel({this.sId, this.title, this.status, this.pic, this.pid, this.sort});

  CateItemModel.fromJson(Map<String, dynamic> json) {
    sId = json[''_id''];
    title = json[''title''];
    status = json[''status''];
    pic = json[''pic''];
    pid = json[''pid''];
    sort = json[''sort''];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data[''_id''] = this.sId;
    data[''title''] = this.title;
    data[''status''] = this.status;
    data[''pic''] = this.pic;
    data[''pid''] = this.pid;
    data[''sort''] = this.sort;
    return data;
  }
}

  Category.dart

import ''package:flutter/material.dart'';
import ''../../services/ScreenAdaper.dart'';
import ''../../config/Config.dart'';
import ''package:dio/dio.dart'';
import ''../../model/CateModel.dart'';

class CategoryPage extends StatefulWidget {
  CategoryPage({Key key}) : super(key: key);

  _CategoryPageState createState() => _CategoryPageState();
}

class _CategoryPageState extends State<CategoryPage> {
  int _selectIndex = 0;
  List _leftCateList = [];
  List _rightCateList = [];
  @override
  void initState() {
    super.initState();
    _getLeftCateData();
  }

  //左侧数据:
  _getLeftCateData() async {
    var api = ''${Config.domain}api/pcate'';
    var result = await Dio().get(api);
    var leftCateList = CateModel.fromJson(result.data);
    setState(() {
      this._leftCateList = leftCateList.result;
    });
    _getRightCateData(leftCateList.result[0].sId);
  }

  //右侧数据:
  _getRightCateData(pid) async {
    var api = ''${Config.domain}api/pcate?pid=${pid}'';
    var result = await Dio().get(api);
    var rightCateList = CateModel.fromJson(result.data);
    print(6666);
    setState(() {
      this._rightCateList = rightCateList.result;
    });
  }

  //左侧组件
  Widget _leftCateWidget(leftWidth) {
    if (this._leftCateList.length > 0) {
      return Container(
        width: leftWidth,
        height: double.infinity,
        // color: Colors.red,
        child: ListView.builder(
          itemCount: this._leftCateList.length,
          itemBuilder: (context, index) {
            return Column(
              children: <Widget>[
                InkWell(
                  onTap: () {
                    setState(() {
                      // setState(() {
                      _selectIndex = index;
                       this._getRightCateData(this._leftCateList[index].sId);
                    });
                    print(_selectIndex);
                  },
                  child: Container(
                    width: double.infinity,
                    height: ScreenAdaper.height(56),
                    padding: EdgeInsets.only(top: ScreenAdaper.height(24)),
                    child: Text("${this._leftCateList[index].title}",
                        textAlign: TextAlign.center),
                    color: _selectIndex == index
                        ? Color.fromRGBO(240, 246, 246, 0.9)
                        : Colors.white,
                  ),
                ),
                Divider(height: 1),
              ],
            );
          },
        ),
      );
    } else {
      return Container(
        width: leftWidth,
        height: double.infinity,
      );
    }
  }

  //右侧组件:
  Widget _rightCateWidget(rightItemWidth, rightItemHeigth) {
    if (this._rightCateList.length > 0) {
      return Expanded(
        flex: 1,
        child: Container(
          padding: EdgeInsets.all(10),
          height: double.infinity,
          color: Color.fromRGBO(240, 246, 246, 0.9),
          // color: Colors.blue,
          child: GridView.builder(
            gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                crossAxisCount: 3,
                childAspectRatio: rightItemWidth / rightItemHeigth,
                crossAxisSpacing: 10,
                mainAxisSpacing: 10),
            itemCount: this._rightCateList.length,
            itemBuilder: (context, index) {
              //处理图片:
              String pic=this._rightCateList[index].pic;
              pic=Config.domain+pic.replaceAll(''\\'',''/'');
              return Container(
                // padding: EdgeInsets.all(ScreenAdaper.width(20)),
                child: Column(
                  children: <Widget>[
                    AspectRatio(
                      aspectRatio: 1 / 1,
                      child: Image.network(
                          "${pic}",
                          fit: BoxFit.cover),
                    ),
                    Container(
                      height: ScreenAdaper.height(32),
                      child: Text("${this._rightCateList[index].title}"),
                    )
                  ],
                ),
              );
            },
          ),
        ),
      );
    } else {
      return Expanded(
          flex: 1,
          child: Container(
            padding: EdgeInsets.all(10),
            height: double.infinity,
            color: Color.fromRGBO(240, 246, 246, 0.9),
            child: Text(''加载中...''),
          ));
    }
  }

  Widget build(BuildContext context) {
    ScreenAdaper.init(context);

    //计算右侧GridView宽高比:
    var leftWidth = ScreenAdaper.getScreenWidth() / 4;
    //右侧宽高=总宽度-左侧宽度-Gridview外层元素左右的Padding值-GridView中间的间距
    var rightItemWidth =
        (ScreenAdaper.getScreenWidth() - leftWidth - 20 - 20) / 3;
    rightItemWidth = ScreenAdaper.width(rightItemWidth);
    var rightItemHeigth = rightItemWidth + ScreenAdaper.height(32);

    return Row(
      children: <Widget>[
        _leftCateWidget(leftWidth),
        _rightCateWidget(rightItemWidth, rightItemHeigth)
      ],
    );
  }
}

 

360反制百度 网址导航搜索框撤百度搜索产品

360反制百度 网址导航搜索框撤百度搜索产品

[导读]360也采取措施,用户使用360综合搜索时,点击来自百度服务搜索结果,会被直接带至“网页快照”页面。今日将网址导航搜索框中百度产品全部撤掉是360最近举措。

360反制百度 网址导航搜索框撤百度搜索产品

360反制百度 网址导航搜索框撤百度搜索产品

8月29日消息,腾讯科技今日获悉,360今日针对百度进行反制,将网址导航搜索框中百度产品全部撤掉。其中,新闻搜索由百度替换为360自家的新闻搜索,MP3由百度替换为搜狗,地图由百度替换为谷歌

据 了解,在沉默数日后,百度昨日晚间终于大规模对360采取反制措施:用户通过360综合搜索访问百度服务时,强行跳转至百度首页。此次百度360搜索攻防 战牵涉百度新闻、贴吧、百科、贴吧、MP3等多个百度业务,不少占据百度整体流量超过10%,均对来自360综合搜索请求采取限制措施。

此外,百度还对360和搜狗浏览器进行了特殊处理。如百度对来自搜狗浏览器的访问,把搜索结果都做编码,无法直接抽取url。这一举措直接导致360股价开盘后大跌。

据悉,360也采取措施,用户使用360综合搜索时,点击来自百度服务搜索结果,会被直接带至“网页快照”页面。今日将网址导航搜索框中百度产品全部撤掉是360最近举措。今日下午4点360还将就搜索事情做出公开说明。

随着双方攻防加剧,一位搜索行业资深人士指出,这场仗继续打下去,将是两败俱伤打法,双方已直接刺刀见红,各种狠招可能无法避免,过滤广告和标记不安全结果是360强力后手。

5. 分类页面

5. 分类页面

5.1 效果

 

5.2  业务逻辑

1. 加载分类页面数据

  根据接口,获取分类页面数据,要理清楚各层级的关系。

 1 /*category/index.js*/
 2 
 3 /**
 4      *获取分类页面数据 
 5      */
 6     getCates(){
 7         requset({
 8             url:'https://api-hmugo-web.itheima.net/api/public/v1/categories'
 9         })
10             .then(result => {
11                 this.Cates = result.data.message;
12 
13                 //构造左侧的大菜单数据
14                 let leftMenuList = this.Cates.map(v=>v.cat_name);
15                 // 构建右侧的上平数据
16                 let rightContent = this.Cates[0].children;
17                 this.setData({
18                     leftMenuList,
19                     rightContent
20                 })
21             })
22     }

2. 点击左侧菜单,右侧数据动态渲染,顶部加入自定义的搜索组件。

(1)先确定搜索栏和左侧菜单栏,右侧商品数据的大小和位置。

   左侧菜单和右侧商品数据都采用 scroll-view 组件来实现。左侧占据伸缩盒子的2份,右侧占据5份。先循环读取某一类家电,再读取这类家电下的具体商品。

8行:加一个判断,如果被选中,则添加激活选中效果,即添加.active 这个类

 1 <!--pages/category/index.wxml-->
 2 <view>
 3     <SearchInput></SearchInput>
 4     <view>
 5         <!-- 左侧菜单 -->
 6         <scroll-view scroll-y="{{true}}">
 7            <view
 89            wx:for="{{leftMenuList}}"
10            wx:key="*this"
11            >
12             {{item}}
13            </view>
14         </scroll-view>
15         
16         <!-- 右侧商品内容 -->
17         <scroll-view scroll-y="{{true}}">
18             <!-- 循环读取 -->
19             <view20             wx:for="{{rightContent}}"
21             wx:for-index="index1"
22             wx:for-item="item1"
23             >
24                 <!-- 商品标题 -->
25                 <view> 
26                     <text>/</text>
27                     <text> {{item1.cat_name}}</text>
28                     <text>/</text>
29                 </view>
30                 <!-- 商品列表 -->
31                 <view>
32                     <!-- 循环读取 -->
33                     <navigator
34                     wx:for="{{item1.children}}"
35                     wx:for-index="index2"
36                     wx:for-item="item2"
37                     wx:key="cat_id"
38                     >
39                         <!-- 商品图片 -->
40                         <image src="{{item2.cat_icon}}" mode="widthFix"></image>
41                         <!-- 商品名字 -->
42                         <view>{{item2.cat_name}}</view>
43                     </navigator>
44                 </view>
45             </view>
46         </scroll-view>
47     </view>
48 </view>
13行:容器的高度 = 页面高度 - 搜索组件高度 ~可以让其不被编译
29行:激活选中效果
55行:换行效果 分成三等分,如果商品数超过3份,会换行
62行:text-center 可以是图片和文字居中
 1 /* pages/category/index.wxss */
 2 page{
 3     height: 100%;
 4 }
 5 .cates{
 6     /*继承page的高*/
 7     height: 100%;
 8     .cates_container{
 9         /*容器的高度 = 页面高度 - 搜索组件高度*/
10         /*less中,使用calc的时候要注意
11             ~'内容' 内容会原样输出,不会被less编译 
12         */
13         height: ~'calc( 100vh - 100rpx )';
14         /*伸缩盒子*/
15         display: flex;
16 
17         .left_menu{
18             /*伸缩盒子的 子项 默认高度100%  flex*/
19             flex: 2;
20             .menu_item{
21                 height: 80rpx;
22                 display: flex;
23                 /*水平居中*/
24                 justify-content: center;
25                 /*垂直居中*/
26                 align-items: center;
27                 font-size: 30rpx;
28             }
29             .active{
30                 color: var(--themeColor);
31                 border-left: 5px solid currentColor;
32             }
33         }
34         .right_content{
35             /*伸缩盒子的 子项 默认高度100%  flex*/
36             flex: 5;
37             
38             .goods_group{
39                 /*商品大类名称*/
40                 .goods_title{
41                     height: 80rpx;
42                     display: flex;
43                     /*水平,垂直居中*/
44                     justify-content: center;
45                     align-items: center;
46                     font-size: 30rpx;
47                     /*斜杆*/
48                     .delimiter{
49                         color: #ccc;
50                         padding: 0 10rpx;
51                     }
52                     .title{
53                     }
54                 }
55                 /*商品列表*/
56                 .goods_list{
57                     display: flex;
58                     /*换行效果 分成三等分,如果商品数超过3份,会换行*/
59                     flex-wrap: wrap;
60                     /*水平,垂直居中*/
61                     
62                     navigator{
63                         /*分成3等份*/
64                         width: 33.3%;
65                         /*文本居中*/
66                         text-align: center;
67                         image{
68                             width: 50%;
69                         }
70                         .good_name{}
71                     } 
72                 }
73             }
74         }
75     }
76 }

 3. 点击菜单切换不同的商品内容

  添加点击事件 handleItemTap,要把当前的index传值给 data-index,方便在js代码中使用当前的index

 

 4.使用缓存技术(商品信息数据量大,使用缓存技术)

  在js代码的onLoad事件中,添加缓存技术。

  51行: this.Cates = Cates.data; 要注意

  77行:要把请求到的数据存储到本地中

 1 /* 
 2 0 web和小程序两者本地存储的区别
 3     1 代码不一样:
 4         web:   localStorage.setItem('key','value') localStorage.getItem('key')
 5         小程序:wx-setStorageSync('key','value')  wx-getStorageSync('key')  
 6     2 存的时候有没有做类型转换
 7         web: 不管你存入的是什么数据,最终都会调用toString()方法,把数据变为字符串,再存入进去
 8         小程序:不存在类型转换,存什么类型的数据数据,获取到的就是什么类型的数据
 9 1 先判断本地存储中有没有旧的数据
10     本地存储数据格式{time.Date.Now(),data:[...]}
11 2 没有旧数据 直接发送请求 
12 3 有旧的数据 同时旧的数据没有过期 直接使用本地的数据即可
13     */

 

5. 设置每次点击左侧菜单项时,右侧商品的滚动条都在顶部

  在scroll-view标签中添加一个属性,scroll-top="{{scrollTop}}",这里不能直接写死(scroll-top="0"),而是通过添加一个变量来实现,这个变量在js代码的data中。

  同时在点击事件触发时,更新这个变量

 6. 优化接口代码-提取公共路径

  在request.js代码中添加如下代码,同时修改其他需要请求数据的页面的js代码,修改其url

 

 7. ⼩程序中⽀持es7的async语法

  es7的 async   号称是解决回调的最终⽅案   1. 在⼩程序的开发⼯具中,勾选 es6转es5语法   2. 下载 facebook的regenerator库中的 regenerator/packages/regenerator-runtime/runtime.js   3. 在⼩程序⽬录下新建⽂件夹 lib/runtime/runtime.js   ,将代码拷⻉进去   4. 在每⼀个需要使⽤async语法的⻚⾯js⽂件中,都引⼊(不能全局引⼊)     import regeneratorRuntime from '../../lib/runtime/runtime';

Android 仿京东、拼多多商品分类页的示例代码

Android 仿京东、拼多多商品分类页的示例代码

最近接了一个项目,要仿照京东写一个商品分类页,但需要滑动右边子分类,左边的主分类也跟着变换,写了个demo,需要的同学可以自取。

先放一个写完之后的样子:

写这个需求的思路也很清晰,首先左边肯定是一个listView,右边也是一个listView,这两个listView要达到一个联动的效果。右边的listView再嵌套一个GridView即可。如下图所示。

所以,我们需要的数据结构也就确定了,应该是数组套数组,也就说护肤大分类下又有子分类商品,类似于这个样子:


ok,数据和UI结构确定了,就可以编写代码了

1、先确定主体结构,即两个listView

先不用管上面那个Hello World,那块儿只是想做一个吸顶的效果

2、将左侧数据和右侧数据分别渲染

2.1渲染左侧数据,即:

menuAdapter = new MenuAdapter(this,menuList);
lv_menu.setAdapter(menuAdapter);

很简单就不赘述了,底部会附上完整代码链接

2.2渲染右侧数据

 homeAdapter = new HomeAdapter(this,homeList);
 lv_home.setAdapter(homeAdapter);

在HomeAdapter还需要在嵌套gridView,如下:

 @Override
  public View getView(int position,View convertView,ViewGroup parent) {
    CategoryBean.DataBean dataBean = foodDatas.get(position);
    List<CategoryBean.DataBean.DataListBean> dataList = dataBean.getDataList();
    ViewHold viewHold = null;
    if (convertView == null) {
      convertView = View.inflate(context,R.layout.item_home,null);
      viewHold = new ViewHold();
      viewHold.gridView = (GridViewForScrollView) convertView.findViewById(R.id.gridView);
      viewHold.blank = (TextView) convertView.findViewById(R.id.blank);
      convertView.setTag(viewHold);
    } else {
      viewHold = (ViewHold) convertView.getTag();
    }
    HomeItemAdapter adapter = new HomeItemAdapter(context,dataList);
    viewHold.blank.setText(dataBean.getModuleTitle());
    viewHold.gridView.setAdapter(adapter);
    return convertView;
  }

  private static class ViewHold {
    private GridViewForScrollView gridView;
    private TextView blank;
  }

这里需要说明两点,第一:由于listView嵌套gridView会有众所周知的问题,计算高度,所以这边需要重新测量高度,也就重写了gridView;第二:代码中的textView是每个子标题中主标题的名字,也就是需要吸在顶部的。

以上,就将数据已经可以渲染完成了,现在就是联动的问题

3、让两部分数据动起来

3.1 主数据联动子数据

只需要调用主数据的onItemClick()方法,右侧数据在复写方法中调用setSelection()方法即可

 lv_menu.setonItemClickListener(new AdapterView.OnItemClickListener() {
      @Override
      public void onItemClick(AdapterView<?> parent,View view,int position,long id) {
        menuAdapter.setSelectItem(position);
        menuAdapter.notifyDataSetInvalidated();
        tv_title.setText(menuList.get(position));
        lv_home.setSelection(showTitle.get(position));
      }
    });

3.2 子数据联动主数据

在onScroll中处理数据即可,在将主数据的adapter更新一下即可。如代码所示

lv_home.setonScrollListener(new AbsListView.OnScrollListener() {
      private int scrollState;

      @Override
      public void onScrollStateChanged(AbsListView view,int scrollState) {
        this.scrollState = scrollState;
      }

      @Override
      public void onScroll(AbsListView view,int firstVisibleItem,int visibleItemCount,int totalItemCount) {
        if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
          return;
        }
        int current = showTitle.indexOf(firstVisibleItem);
        if (currentItem != current && current >= 0) {
          currentItem = current;
          tv_title.setText(menuList.get(currentItem));
          menuAdapter.setSelectItem(currentItem);
          menuAdapter.notifyDataSetInvalidated();
        }
      }
    });


4、吸顶效果

这边有几种方法都可以实现类似的效果,我这边是上面一直有一条,我再将子数据都加一个type,当type不同时,更换上面那一条的问题即可。

最后,附上git链接直达链接

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

今天的关于用Site语法搜索产品分类页面,第一位未显示在搜索引擎中site的作用的分享已经结束,谢谢您的关注,如果想了解更多关于07-08 Flutter仿京东商城项目 商品分类页面布局:Flutter仿京东商城项目 商品分类页面数据渲染、360反制百度 网址导航搜索框撤百度搜索产品、5. 分类页面、Android 仿京东、拼多多商品分类页的示例代码的相关知识,请在本站进行查询。

本文标签: