对于想了解用Site语法搜索产品分类页面,第一位未显示的读者,本文将提供新的信息,我们将详细介绍在搜索引擎中site的作用,并且为您提供关于07-08Flutter仿京东商城项目商品分类页面布局:Fl
对于想了解用Site语法搜索产品分类页面,第一位未显示的读者,本文将提供新的信息,我们将详细介绍在搜索引擎中site的作用,并且为您提供关于07-08 Flutter仿京东商城项目 商品分类页面布局:Flutter仿京东商城项目 商品分类页面数据渲染、360反制百度 网址导航搜索框撤百度搜索产品、5. 分类页面、Android 仿京东、拼多多商品分类页的示例代码的有价值信息。
本文目录一览:- 用Site语法搜索产品分类页面,第一位未显示(在搜索引擎中site的作用)
- 07-08 Flutter仿京东商城项目 商品分类页面布局:Flutter仿京东商城项目 商品分类页面数据渲染
- 360反制百度 网址导航搜索框撤百度搜索产品
- 5. 分类页面
- Android 仿京东、拼多多商品分类页的示例代码
用Site语法搜索产品分类页面,第一位未显示(在搜索引擎中site的作用)
Ever 提问于 1年 之前
用site语法在谷歌中搜索一个正在优化的产品分类页面,结果第一页根本就没有发现该页。
请问是被惩罚了吗?
1 个回答
Zac 管理员 回答于 1年 之前
site:域名 指令搜索结果是网站所有被索引的页面(当然并不完全),排列顺序也比较随机。如果你在优化的页面本身权重就不高,在网站上的地位不高,不在第一页很正常。
如果site: 后面跟的是具体URL,却没有结果的话,说明页面就没被索引。是否惩罚不好说。需要先解决抓取、索引问题。
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反制百度 网址导航搜索框撤百度搜索产品
8月29日消息,腾讯科技今日获悉,360今日针对百度进行反制,将网址导航搜索框中百度产品全部撤掉。其中,新闻搜索由百度替换为360自家的新闻搜索,MP3由百度替换为搜狗,地图由百度替换为谷歌。
据 了解,在沉默数日后,百度昨日晚间终于大规模对360采取反制措施:用户通过360综合搜索访问百度服务时,强行跳转至百度首页。此次百度360搜索攻防 战牵涉百度新闻、贴吧、百科、贴吧、MP3等多个百度业务,不少占据百度整体流量超过10%,均对来自360综合搜索请求采取限制措施。
此外,百度还对360和搜狗浏览器进行了特殊处理。如百度对来自搜狗浏览器的访问,把搜索结果都做编码,无法直接抽取url。这一举措直接导致360股价开盘后大跌。
据悉,360也采取措施,用户使用360综合搜索时,点击来自百度服务搜索结果,会被直接带至“网页快照”页面。今日将网址导航搜索框中百度产品全部撤掉是360最近举措。今日下午4点360还将就搜索事情做出公开说明。
随着双方攻防加剧,一位搜索行业资深人士指出,这场仗继续打下去,将是两败俱伤打法,双方已直接刺刀见红,各种狠招可能无法避免,过滤广告和标记不安全结果是360强力后手。
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 仿京东、拼多多商品分类页的示例代码
最近接了一个项目,要仿照京东写一个商品分类页,但需要滑动右边子分类,左边的主分类也跟着变换,写了个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 仿京东、拼多多商品分类页的示例代码的相关知识,请在本站进行查询。
本文标签: