筆記內(nèi)容:第四個頁面:制作電影資訊頁面
筆記日期:2018-01-18
崇信ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
之前的文章列表頁面還有一個小功能沒有實現(xiàn),就是點擊點擊輪播圖就能跳轉(zhuǎn)到相應的文章詳情頁面,這個和點擊文章列表跳轉(zhuǎn)到文章詳情頁面的實現(xiàn)方式是一樣的。
post.wxml修改輪播圖代碼如下:
post.js文件增加如下代碼:
onSwiperTap:function(event){
// target和currentTarget的區(qū)別在于,前者代表的是當前點擊的組件,后者代表的是事件捕獲的組件
// 在這段代碼里,target代表image組件,currentTarget代表swiper組件
var postId = event.target.dataset.postid;
wx.navigateTo({
url: 'post-detail/post-detail?id=' + postId,
});
},
現(xiàn)在我們就可以開始編寫電影資訊頁面了,為此我們需要給我們的小程序加入一個tab選項卡,這樣才能夠方便的切換到不同的主題頁面上。像這個tab選項卡這種常用的組件,微信已經(jīng)提供了現(xiàn)成的,無需我們自己去實現(xiàn)。
如果小程序是一個多 tab 應用(客戶端窗口的底部或頂部有 tab 欄可以切換頁面),可以通過 tabBar 配置項指定 tab 欄的表現(xiàn),以及 tab 切換時顯示的對應頁面。
官方的說明文檔如下:
https://mp.weixin.qq.com/debug/wxadoc/dev/framework/config.html
注:tabBar 中的 list 屬性是一個數(shù)組,只能配置最少2個、最多5個 tab,tab 按數(shù)組的順序排序。
首先我們需要構(gòu)建電影資訊頁面的目錄、文件,在pages目錄下創(chuàng)建movies目錄并在該目錄下創(chuàng)建相應的文件:
在app.json里配置movies頁面以及tabBar:
{
"pages": [
"pages/welcome/welcome",
"pages/posts/post",
"pages/posts/post-detail/post-detail",
"pages/movies/movies" // 配置movies頁面
],
"window": {
"navigationBarBackgroundColor": "#405f80"
},
"tabBar": {
"list": [
{
"pagePath": "pages/posts/post", // 跳轉(zhuǎn)的頁面
"text": "閱讀" // 選項卡的文本內(nèi)容
},
{
"pagePath": "pages/movies/movies",
"text": "電影"
}
]
}
}
配置完app.json后還需要修改welcome.js代碼中的跳轉(zhuǎn)方法,需要將原本的redirectTo方法修改成switchTab方法來實現(xiàn)頁面的跳轉(zhuǎn)。switchTab方法用于跳轉(zhuǎn)到有 tabBar 選項卡的頁面,并關閉其他所有非 tabBar 頁面。修改代碼如下:
Page({
onTap:function(){
wx.switchTab({
url: "../posts/post",
});
},
})
官方文檔如下:
https://mp.weixin.qq.com/debug/wxadoc/dev/api/ui-navigate.html#wxswitchtabobject
完成以上修改后,編譯運行效果如下:
注:選項卡的順序是與list里的元素順序一致的。
雖然我們已經(jīng)完成了簡單的選項卡效果,可是默認的樣式實在不忍直視,所以我們還得完善這個tab選項卡。其實也很簡單,加上兩張圖片就好了:
"tabBar": {
"borderStyle":"white",
"list": [
{
"pagePath": "pages/posts/post",
"text": "閱讀",
"iconPath":"images/tab/yuedu.png", // 沒被選中時顯示的圖片
"selectedIconPath":"images/tab/yuedu_hl.png" // 被選中時顯示的圖片
},
{
"pagePath": "pages/movies/movies",
"text": "電影",
"iconPath": "images/tab/dianying.png",
"selectedIconPath": "images/tab/dianying_hl.png"
}
]
}
完成效果:
tabBar里還有一個position屬性,該屬性可以設置選項卡居頂部或居底部,例如我要選項卡居頂部,就可以在app.json文件中加上這一句配置:
"position":"top",
完成效果:
我們需要做一個這樣的電影資訊頁面:
根據(jù)分析效果圖,可以看到頁面的布局是一排一排重復的的,每一排里都有三個電影,所以這樣的重復性的布局以及樣式我們可以做成一個template進行復用:
當點擊 “更多” 時進入的頁面效果圖如下:
從效果圖,可以看到圖片、電影名稱以及評分都是和電影資訊頁面上的布局以及樣式是重復的,所以我們還需要把這部分做成第二個template進行復用:
再來看一張效果圖:
這是電影的詳情頁面,這里也用到了一個評分樣式,這個樣式也是重復的,所以我們還需要把這個樣式做成第三個template進行復用。
先創(chuàng)建好各個template的目錄結(jié)構(gòu):
我這里是先實現(xiàn)評分樣式的template:
stars-template.wxml內(nèi)容如下:
8.9
stars-template.wxss內(nèi)容如下:
.stars-container{
display: flex;
flex-direction: row;
}
.stars{
display: flex;
flex-direction: row;
height: 17rpx;
margin-right: 24rpx;
margin-top: 6rpx;
}
.stars image{
padding-left: 3rpx;
height: 17rpx;
width: 17rpx;
}
.star-score{
color: #1f3463
}
然后就是電影列表的template了,movie-template.wxml內(nèi)容如下:
你的名字.
movie-template.wxss內(nèi)容如下:
@import "../stars/stars-template.wxss";
.movie-container{
display: flex;
flex-direction: column;
padding: 0 22rpx;
}
.movie-img{
width: 200rpx;
height: 270rpx;
padding-bottom: 20rpx;
}
.movie-title{
margin-bottom: 16rpx;
font-size: 24rpx;
}
接著就是完成movie-list的template,movie-list-template.wxml內(nèi)容如下:
正在熱映
更多
movie-list-template.wxss內(nèi)容如下:
@import "../movie/movie-template.wxss";
.movie-list-container{
background-color: #fff;
display: flex;
flex-direction: column;
}
.inner-container{
margin: 0 auto 20rpx;
}
.movie-head{
padding: 30rpx 20rpx 22rpx;
/*
這種方式也能實現(xiàn)float: right;的效果
display: flex;
flex-direction: row;
justify-content: space-between;
*/
}
.slogan{
font-size: 24rpx;
}
.more{
float: right;
}
.more-text{
vertical-align: middle;
margin-right: 10rpx;
color: #1f4ba5;
}
.more-img{
width: 9rpx;
height: 16rpx;
vertical-align: middle;
}
.movies-container{
display: flex;
flex-direction: row;
}
運行效果:
RESTful是一種軟件架構(gòu)風格、設計風格,而不是標準,只是提供了一組設計原則和約束條件。它主要用于客戶端和服務器交互類的軟件?;谶@個風格設計的軟件可以更簡潔,更有層次,更易于實現(xiàn)緩存等機制。
可重新表達的狀態(tài)遷移(REST,英文:Representational State Transfer)是Roy Thomas Fielding博士于2000年在他的博士論文中提出來的一種萬維網(wǎng)軟件架構(gòu)風格,目的是便于不同軟件/程序在網(wǎng)絡(例如互聯(lián)網(wǎng))中互相傳遞信息。
目前在三種主流的Web服務實現(xiàn)方案中,因為REST模式與復雜的SOAP和XML-RPC相比更加簡潔,越來越多的web服務開始采用REST風格設計和實現(xiàn)。
需要注意的是,具象狀態(tài)傳輸是設計風格而不是標準。REST通常基于使用HTTP,URI,和XML以及HTML這些現(xiàn)有的廣泛流行的協(xié)議和標準。
所以RESTful API就像是一個URL,只不過返回的數(shù)據(jù)不一定是HTML而已,一般都是用于返回JSON數(shù)據(jù)。
這一節(jié)我們需要調(diào)用豆瓣API來填充我們小程序的頁面,豆瓣API文檔地址如下:
https://developers.douban.com/wiki/?title=guide
微信小程序關于網(wǎng)絡請求的API文檔地址:
https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-network.html
但是要注意:由于不明原因,現(xiàn)在豆瓣的API已經(jīng)屏蔽微信小程序的調(diào)用請求了,我這里都是使用自己的服務器代理來實現(xiàn)調(diào)用的。
因為我個人的服務器地址不便于透露,所以我這里的示例代碼依舊是使用豆瓣的地址,畢竟說不定哪天就不屏蔽了呢233。
先把API地址存儲到一個全局變量里,方便調(diào)用,之后就只需要加上url的后綴即可,編輯app.js內(nèi)容如下:
App({
globalData:{
g_isPlayingMusic:false,
g_currentMusicPostId:"",
g_beforeMusicPostId: "",
doubanBase:'https://api.douban.com' # API地址
},
});
我們還需要完善一下頁面的樣式,讓每個模板之間都有一個就間隔,編輯movies.wxml內(nèi)容如下:
然后編輯movies.wxss內(nèi)容如下:
@import "movie-list/movie-list-template.wxss";
.container{
background-color: #f2f2f2;
}
.container view{
margin-bottom: 30rpx;
}
最后編寫獲取數(shù)據(jù)的邏輯代碼,將獲取到的數(shù)據(jù)先在控制臺輸出,編輯movies.js內(nèi)容如下:
var app = getApp();
Page({
onLoad: function (event) {
// start=0&count=3 表示只拿取三條數(shù)據(jù)
var inTheatersUrl = app.globalData.doubanBase + '/v2/movie/in_theaters?start=0&count=3';
var comingSoonUrl = app.globalData.doubanBase + '/v2/movie/coming_soon?start=0&count=3';
var top250Url = app.globalData.doubanBase + '/v2/movie/top250?start=0&count=3';
this.getMovieListData(inTheatersUrl);
this.getMovieListData(comingSoonUrl);
this.getMovieListData(top250Url);
},
// 請求API的數(shù)據(jù)
getMovieListData: function (url) {
// 通過reques來發(fā)送請求
wx.request({
url: url,
method: 'GET',
header: {
"Content-Type": "application/json"
},
success: function (res) {
console.log(res)
},
fail:function(){
console.log("API請求失??!請檢查網(wǎng)絡!")
}
});
}
})
控制臺輸出結(jié)果如下:
可以看到已經(jīng)成功獲取數(shù)據(jù)了,接下來就是把這些數(shù)據(jù)綁定到頁面上即可。
編輯movies.js內(nèi)容如下:
var app = getApp();
Page({
data: {
// 需要有一個初始值
inTheaters: {},
comingSoon: {},
top250: {}
},
onLoad: function (event) {
var inTheatersUrl = app.globalData.doubanBase + '/v2/movie/in_theaters?start=0&count=3';
var comingSoonUrl = app.globalData.doubanBase + '/v2/movie/coming_soon?start=0&count=3';
var top250Url = app.globalData.doubanBase + '/v2/movie/top250?start=0&count=3';
this.getMovieListData(inTheatersUrl, "inTheaters");
this.getMovieListData(comingSoonUrl, "comingSoon");
this.getMovieListData(top250Url, "top250");
},
// 請求API的數(shù)據(jù)
getMovieListData: function (url, settedkey) {
var that = this;
// 通過reques來發(fā)送請求
wx.request({
url: url,
method: 'GET',
header: {
"Content-Type": "application/json"
},
success: function (res) {
that.processDoubanData(res.data, settedkey);
},
fail: function () {
console.log("API請求失?。≌垯z查網(wǎng)絡!")
}
});
},
// 處理API返回的數(shù)據(jù)
processDoubanData: function (moviesDouban, settedkey) {
// 存儲處理完的數(shù)據(jù)
var movies = [];
for (var idx in moviesDouban.subjects) {
var subject = moviesDouban.subjects[idx];
var title = subject.title;
// 處理標題過長
if (title.length >= 6) {
title = title.substring(0, 6) + "...";
}
var temp = {
title: title,
average: subject.rating.average,
coverageUrl: subject.images.large,
movieId: subject.id
};
movies.push(temp);
}
// 動態(tài)賦值
var readyData = {};
readyData[settedkey] = {
movies: movies
};
this.setData(readyData);
},
})
編輯movies.wxml內(nèi)容如下:
然后就是將模板文件里的數(shù)據(jù)改為數(shù)據(jù)綁定形式的,movie-list-template.wxml:
正在熱映
更多
movie-template.wxml:
{{title}}
stars-template.wxml:
{{average}}
運行效果:
接著就是將星星評分的組件完成,我的思路是使用將表示星星數(shù)據(jù)處理成0和1來表示兩種星星圖片,而這個0和1存儲在一個數(shù)組里,到時候就根據(jù)數(shù)組里的元素來決定顯示哪一個星星圖片。由于這個數(shù)據(jù)的處理是通用的,之后可能需要在別的地方調(diào)用它,所以我們先在根下新建一個目錄,并在目錄中創(chuàng)建一個.js文件,將代碼寫在這個文件里:
util.js內(nèi)容如下:
// 生成一個用來表示星星數(shù)量的數(shù)組
function convertToStarsArray(stars) {
var num = stars.toString().substring(0, 1);
var array = [];
for (var i = 1; i <= 5; i++) {
if (i <= num) {
array.push(1);
} else {
array.push(0);
}
}
return array;
}
module.exports={
convertToStarsArray: convertToStarsArray
}
然后在movies.js里導入這個模塊,并調(diào)用該方法:
var app = getApp();
// 導入模塊
var util = require('../../utils/util.js');
Page({
data: {
// 需要有一個初始值
inTheaters: {},
comingSoon: {},
top250: {}
},
onLoad: function (event) {
var inTheatersUrl = app.globalData.doubanBase + '/v2/movie/in_theaters?start=0&count=3';
var comingSoonUrl = app.globalData.doubanBase + '/v2/movie/coming_soon?start=0&count=3';
var top250Url = app.globalData.doubanBase + '/v2/movie/top250?start=0&count=3';
this.getMovieListData(inTheatersUrl, "inTheaters");
this.getMovieListData(comingSoonUrl, "comingSoon");
this.getMovieListData(top250Url, "top250");
},
// 請求API的數(shù)據(jù)
getMovieListData: function (url, settedkey) {
var that = this;
// 通過reques來發(fā)送請求
wx.request({
url: url,
method: 'GET',
header: {
"Content-Type": "application/json"
},
success: function (res) {
that.processDoubanData(res.data, settedkey);
},
fail: function () {
console.log("API請求失??!請檢查網(wǎng)絡!")
}
});
},
// 處理API返回的數(shù)據(jù)
processDoubanData: function (moviesDouban, settedkey) {
// 存儲處理完的數(shù)據(jù)
var movies = [];
for (var idx in moviesDouban.subjects) {
var subject = moviesDouban.subjects[idx];
var title = subject.title;
// 處理標題過長
if (title.length >= 6) {
title = title.substring(0, 6) + "...";
}
var temp = {
// 調(diào)用處理數(shù)據(jù)的方法,生成一個數(shù)組
stars: util.convertToStarsArray(subject.rating.stars),
title: title,
average: subject.rating.average,
coverageUrl: subject.images.large,
movieId: subject.id
};
movies.push(temp);
}
// 動態(tài)賦值
var readyData = {};
readyData[settedkey] = {
movies: movies
};
this.setData(readyData);
},
})
修改模板文件中的數(shù)據(jù)綁定語句,修改movie-template.wxml內(nèi)容如下:
{{title}}
最后是stars-template.wxml:
{{score}}
我們還有一個小細節(jié)沒有完成,就是電影分類的標題還是硬編碼的,所以需要改為數(shù)據(jù)綁定形式的,首先修改movies.js代碼如下:
var app = getApp();
var util = require('../../utils/util.js');
Page({
data: {
// 需要有一個初始值
inTheaters: {},
comingSoon: {},
top250: {}
},
onLoad: function (event) {
var inTheatersUrl = app.globalData.doubanBase + '/v2/movie/in_theaters?start=0&count=3';
var comingSoonUrl = app.globalData.doubanBase + '/v2/movie/coming_soon?start=0&count=3';
var top250Url = app.globalData.doubanBase + '/v2/movie/top250?start=0&count=3';
this.getMovieListData(inTheatersUrl, "inTheaters", "正在熱映");
this.getMovieListData(comingSoonUrl, "comingSoon", "即將上映");
this.getMovieListData(top250Url, "top250", "豆瓣電影Top250");
},
// 請求API的數(shù)據(jù)
getMovieListData: function (url, settedkey, categoryTitle) {
var that = this;
// 通過reques來發(fā)送請求
wx.request({
url: url,
method: 'GET',
header: {
"Content-Type": "application/json"
},
success: function (res) {
that.processDoubanData(res.data, settedkey, categoryTitle);
},
fail: function () {
console.log("API請求失??!請檢查網(wǎng)絡!")
}
});
},
// 處理API返回的數(shù)據(jù)
processDoubanData: function (moviesDouban, settedkey, categoryTitle) {
// 存儲處理完的數(shù)據(jù)
var movies = [];
for (var idx in moviesDouban.subjects) {
var subject = moviesDouban.subjects[idx];
var title = subject.title;
// 處理標題過長
if (title.length >= 6) {
title = title.substring(0, 6) + "...";
}
var temp = {
stars: util.convertToStarsArray(subject.rating.stars),
title: title,
average: subject.rating.average,
coverageUrl: subject.images.large,
movieId: subject.id
};
movies.push(temp);
}
// 動態(tài)賦值
var readyData = {};
readyData[settedkey] = {
categoryTitle: categoryTitle,
movies: movies
};
this.setData(readyData);
},
})
然后修改movie-list-template.wxml代碼如下:
{{categoryTitle}}
更多
完成效果: