10.5.1 获取列表页数据
我们先来完成点击排行里的项目所跳转的排行列表。
首先我们还是先编写一下网络请求的函数。
function getTopListInfo(id,callback){
var data = {
g_tk: 5381,
uin: 0,
format: 'json',
inCharset: 'utf-8',
outCharset: 'utf-8',
notice: 0,
platform: 'h5',
needNewCode: 1,
tpl: 3,
page: 'detail',
type: 'top',
topid: id,
_: Date.now()
};
wx.request({
url: 'http://c.y.qq.com/v8/fcg-bin/fcg_v8_toplist_cp.fcg',
data: data,
header: {
'Content-Type': 'application/json'
},
success: function (res) {
if (res.statusCode == 200) {
callback(res.data);
} else {
}
}
});
}
module.exports = {
...
getTopListInfo:getTopListInfo
}
返回的JSON格式数据为:
{
"color": 14729248,
"comment_num": 1859,
"cur_song_num": 100,
"date": "2017_6",
"song_begin": 0,
"songlist": [
{
"Franking_value": "1",
"cur_count": "1",
"data": {
"albumdesc": "",
"albumid": 1829744,
"albummid": "003GpN3b2UiNx0",
"albumname": "Run Up",
"alertid": 100002,
"belongCD": 1,
"cdIdx": 0,
"interval": 203,
"isonly": 1,
"label": "0",
"msgid": 14,
"pay": {
"payalbum": 0,
"payalbumprice": 0,
"paydownload": 1,
"payinfo": 1,
"payplay": 0,
"paytrackmouth": 1,
"paytrackprice": 200,
"timefree": 0
},
"preview": {
"trybegin": 0,
"tryend": 0,
"trysize": 0
},
"rate": 7,
"singer": [
{
"id": 38150,
"mid": "001J99OK2689F4",
"name": "Major Lazer"
},
{
"id": 177284,
"mid": "002R2h8l05rVWb",
"name": "PARTYNEXTDOOR"
},
{
"id": 20710,
"mid": "003kJN1r16tgOt",
"name": "Nicki Minaj"
}
],
"size128": 3251944,
"size320": 8129528,
"size5_1": 0,
"sizeape": 0,
"sizeflac": 0,
"sizeogg": 4972861,
"songid": 200556634,
"songmid": "003kPDEH3fSvh8",
"songname": "Run Up",
"songorig": "Run Up",
"songtype": 0,
"strMediaMid": "00191A2Z3qTVEr",
"stream": 0,
"switch": 636675,
"type": 0,
"vid": ""
},
"in_count": "2",
"mb": "",
"old_count": "1",
"singer2": {
"Fgenre": "0",
"Fsinger_id": "177284",
"Fsinger_mid": "002R2h8l05rVWb",
"Fsinger_name": "PARTYNEXTDOOR",
"Ftype": "0"
},
"singer3": {
"Fgenre": "0",
"Fsinger_id": "20710",
"Fsinger_mid": "003kJN1r16tgOt",
"Fsinger_name": "Nicki Minaj",
"Ftype": "1"
},
"vid": {
"Fmv_id": "",
"Fstatus": "",
"Fvid": ""
}
},
...
"topinfo": {
"ListName": "巅峰榜·欧美",
"MacDetailPicUrl": "http://y.gtimg.cn/music/common//upload/iphone_order_channel/20140519104205.jpg",
"MacListPicUrl": "http://y.gtimg.cn/music/common//upload/iphone_order_channel/20140519104155.jpg",
"UpdateType": "1",
"albuminfo": "QQ音乐巅峰榜·欧美专辑根据用户收听行为自动生成,集结当下最流行的欧美新碟!:更新时间:每周五|统计周期:一周(上周五至本周四)|统计对象:一年内发行的欧美专辑|排名数量:100张|统计算法:根据专辑内所有歌曲在一周内的有效播放次数总和,由高到低取前100名|有效播放次数:登录用户完整播放一首歌曲,记为一次有效播放;同一用户收听同一首歌曲,每天最多记录20次有效播放",
"headPic_v12": "http://y.gtimg.cn/music/common//upload/iphone_order_channel/20160224140905.jpg",
"info": "QQ音乐巅峰榜·欧美根据用户收听行为自动生成,集结当下最流行的欧美新歌!<br><br>更新时间:每周四22点<br>统计周期:一周(上周四至本周三)<br>统计对象:三个月内发行的欧美歌曲<br>统计数量:100首<br>统计算法:根据歌曲在一周内的有效播放次数,由高到低取前100名(同一歌手最多允许5首歌曲同时上榜)<br>有效播放次数:登录用户完整播放一首歌曲,记为一次有效播放;同一用户收听同一首歌曲,每天记录为1次有效播放。",
"listennum": 9800000,
"pic": "http://y.gtimg.cn/music/common//upload/iphone_order_channel/20141110194323.jpg",
"picDetail": "http://y.gtimg.cn/music/common//upload/iphone_order_channel/20140519104128.jpg",
"pic_album": "http://imgcache.qq.com/music/photo_new/T002R300x300M000003GpN3b2UiNx0.jpg",
"pic_h5": "http://y.gtimg.cn/music/common//upload/iphone_order_channel/20140519104015.jpg",
"pic_v11": "http://y.gtimg.cn/music/common//upload/iphone_order_channel/20141110194323.jpg",
"pic_v12": "http://y.gtimg.cn/music/common/upload/iphone_order_channel/toplist_3_300_200556634.jpg",
"topID": "3",
"type": "0"
},
"total_song_num": 100,
"update_time": "2017-02-09"
}
请求网络时用到的参数ID是我们在排行页面点击的item的id,在上一节了我们已经通过点击事件将它保存在全局变量里了。
在编写布局文件之前我们先来看一下我们最后完成后的样子,如图10-8
图10-8 分类列表样图
可以看到这个页面主要由两部分组成,上半部分为榜单的图片以及名字等信息,下半部分是歌曲列表。
我们先从歌曲列表开始,列表的每一项由序号,歌曲名称,演唱者(多名演唱者以“|”分隔)以及专辑名称组成,所以我们的布局文件为:
<view class="song-list" >
<view class="song-item" wx:for="{{songList}}" wx:key="unique" data-data="{{item.data}}" data-index="{{index}}" bindtap="musicItemTap">
<text class="song-index">{{index+1}}</text>
<text class="song-item-title">{{item.name}}</text>
<view class="song-item-text">
<block wx:for="{{item.singer}}" wx:key="unique">
<block wx:if="{{index!=0}}">|</block>
{{item.name}}
</block>
·{{item.album.name}}
</view>
</view>
</view>
格式文件为:
.song-list {
padding-left: 100rpx;
background: #000000;
}
.song-item {
position: relative;
padding: 20rpx 20rpx 20rpx 0;
border-bottom: 2rpx solid rgba(255,255,255, 0.5);
}
.song-index {
position: absolute;
left: -80rpx;
width: 80rpx;
color: #fff;
font-size: 40rpx;
text-align: center;
line-height: 100rpx;
}
.song-item-title {
height: 60rpx;
line-height: 60rpx;
font-size: 32rpx;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
color: #fff;
}
.song-item-text {
font-size: 28rpx;
color: rgba(255,255,255, .75); //表示颜色
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
这部分应该比较熟悉了,需要注意的就是多个歌手的书写形式,除了第一个歌手外,其他都在前面加上“|”就是我们要的形式了。
接下来我们完成上半部分,这部分的布局代码很简单:
<view class="list-top">
<view class="top-info">
<view class="top-info-inner">
<view class="top-info-text">
<view class="top-info-title">{{topinfo.ListName}}</view>
<view class="top-info-time">
<text>{{update_time}} 更新</text>
</view>
</view>
<view class="top-play" bindtap="mainTopTap"></view>
</view>
</view>
<image class="top-img" mode="aspectFit" src="{{topinfo.pic_album}}"></image>
<view class="top-back"></view>
</view>
我们在tl-top-info-inner完成了文字部分与右边的播放按钮,又在这部分之后加载了图片,这样大体的布局就完成了。但是这样做会产生一个问题:我们设置文字为白色,如果加载的图片也为白色背景,那么文字就会变的很难看清了。