看掘金也又一年多了,感嘆各位大佬技術6的一批,剛上學的時候也給人搞過一兩個小程序,忽然心血來潮想總結總結經驗,給本身也搞一個爽一爽,順便也在寫一篇,讓各位大佬看看還有什麼問題,畢竟本屌虛心的一批php
這個項目用到的接口主要有前端
const BASEURL = "https://localhost:8888/";
const APIURL = "https://localhost:8888/api/";
/**
* 封裝request
*/
const requestPromise = function ({ url, data, header,
method = 'GET' }) {
return new Promise((resolve, reject) => {
wx.request({
url: url,
data: data,
header: header,
method: method,
success: (res) => { resolve(res) },
fail: (err) => { reject(err) }
})
});
};
module.exports={
BASEURL:BASEURL,
APIURL:APIURL,
request: requestPromise
}
複製代碼
let netUtils = require('./netUtils.js');
/**
* 獲取服務器數據基本方法
*/
function getServerDataPromise(url,data,header=null,method='GET'){
let dataUrl = netUtils.BASEURL+url;
return new Promise((resolve, reject) => {
netUtils.request({
url: dataUrl,
data: data,
header:header,
method:method
}).then(res => {
resolve(res);
}).catch(err => {
reject(err);
});
});
}
/**
* 獲取欄目下文章
*/
function getPostOfCategoryPromise(data) {
let url ='api/front/portal/getPostOfCategory';
return getServerDataPromise(url,data);
};
/**
* 獲取幻燈片
*/
function getSlidesPromise(data){
let url ='api/front/portal/getSlide';
return getServerDataPromise(url,data);
}
........各位老哥根據實際狀況把本身的接口封裝一下搞一搞
module.exports = {
getPostOfCategory: getPostOfCategoryPromise,
getSlides: getSlidesPromise,
checkToken: checkToken,
userLogin:userLoginPromise,
getContent: getContentPromise,
addComment: addCommentPromise,
getComment:getCommentPromise,
getKindleEmail: getKindleEmailPromise,
bindKindleEmail: bindKindleEmailPromise,
sendBook: sendBookPromise,
getNav:getNavPromise,
search: searchPromise,
getUser: getUserPromise,
checkLogin: checkLoginPromise,
getConfig: getConfigPromise
};
複製代碼
個人我的習慣是先把頁面的js獲取數據的部分寫好,而後再去寫wxml與wxss,有了數據填充,比教容易看出來頁面的效果,調試完頁面後,在取js把點擊事件、跳轉等其餘的一些代碼補全。 前端代碼比較簡單,就不在這貼了,值得注意的一點是,首頁使用了iview的組件,所以在index.json中應先把使用的組件配置一下 index.jsonvue
{
"usingComponents": {
"i-row": "../../iview/row/index",
"i-col": "../../iview/col/index",
"i-spin": "../../iview/spin/index",
"i-icon": "../../iview/icon/index",
"i-message": "../../iview/message/index",
"i-divider": "../../iview/divider/index"
},
"enablePullDownRefresh":true
}
複製代碼
index.jsthinkphp
let netUtils=require('../../utils/netUtils.js');
let dataUtils=require('../../utils/dataUtils.js');
let navUtils=require('../../utils/navUtils.js');
const { $Message } = require('../../iview/base/index');
// pages/index/index.js
Page({
/**
* 頁面的初始數據
*/
data: {
IMGURL: netUtils.BASEURL,
// 幻燈片
slides:[],
// 推薦
recommends:[],
recommendPage:1,
recommendPageSize:5,
// blog
blogs: [],
blogPage: 1,
blogPageSize: 10,
//config
slideId: getApp().globalData.StorageDB.get('config.slideId'),
recommendCategoryId: getApp().globalData.StorageDB.get('config.recommendCategoryId'),
blogCategoryId:getApp().globalData.StorageDB.get('config.blogCategoryId'),
hasMore:true
},
/**
* 生命週期函數--監聽頁面加載
*/
onLoad: function (options) {
this.getSlides();
this.getRecommend();
this.getBlog();
},
/**
* 頁面相關事件處理函數--監聽用戶下拉動做
*/
onPullDownRefresh: function () {
this.setData({
// 推薦
recommends: [],
recommendPage: 1,
recommendPageSize: 5,
// blog
blogs: [],
blogPage: 1,
blogPageSize: 10,
hasMore:true
});
this.getSlides();
this.getRecommend();
this.getKindleBook();
this.getBlog();
},
/**
* 頁面上拉觸底事件的處理函數
*/
onReachBottom: function () {
this.getBlog();
},
//自定義方法
getSlides(){
dataUtils.getSlides({id:1})
.then(res=>{
if(res.data.status=='200'){
this.setData({
slides:res.data.data.item
});
}
});
},
getRecommend(){
dataUtils.getPostOfCategory({
page:this.data.recommendPage,
pageSize:this.data.recommendPageSize,
id:this.data.recommendCategoryId
}).then(res=>{
if (res.data.status == '200') {
if(res.data.data.pageData.length==0){
return;
}
let recommendPage = this.data.recommendPage;
recommendPage = recommendPage + 1;
let recommends = this.data.recommends.concat(res.data.data.pageData);
this.setData({
recommends: recommends,
recommendPage: recommendPage
});
}
else{
$Message({
content: '未獲取到數據~',
type: 'error'
});
}
});
},
getBlog() {
dataUtils.getPostOfCategory({
page: this.data.blogPage,
pageSize: this.data.blogPageSize,
id: this.data.blogCategoryId
}).then(res => {
if (res.data.status == '200') {
if (res.data.data.pageData.length == 0) {
this.setData({
hasMore:false
});
return;
}
let blogPage = this.data.blogPage;
blogPage = blogPage + 1;
let blogs = this.data.blogs.concat(res.data.data.pageData);
let blogLeft=blogs.filter((value,index)=>{return index%2!=0});
let blogRight = blogs.filter((value, index) => { return index % 2 == 0 });
this.setData({
blogs: res.data.data.pageData,
blogLeft:blogLeft,
blogRight:blogRight,
blogPage: blogPage
});
}
else {
$Message({
content: '未獲取到數據~',
type: 'error'
});
}
});
},
navToContent(e){
navUtils.navToContent(e.currentTarget.dataset.id);
},
navToBlog(){
wx.switchTab({
url: '../blog/blog',
});
}
})
複製代碼
代碼比較簡單(畢竟技術比較菜),值得注意的是這個getBlog方法,該方法獲取的是首頁上,中下部分的那一坨博客,當頁面觸底時會會加載更多json
以爲單純的排列下來比較平庸,所以想搞個瀑布流,反正沒那麼多性能和外觀要求,因此就搞了個假的瀑布流,具體操做就是在獲取到數據後,把數據分紅兩半,左半邊和右半邊,在前端也是把這兩個數組分別循環一下便可。小程序
因爲頁面有下拉刷新與拉到底部會加載更多,所以,在這的邏輯就是,後端
當觸發上拉加載時微信小程序
當觸發下拉刷新時api
這樣作能把下拉刷新與上拉加載的功能均用getBlog來作無需根據狀況來判斷如何處理(替換or拼接)從服務器請求來的數據數組
羅裏吧嗦的有點長了,越寫越感受作的不咋地寫的更不咋地,看各位看官湊合的看下把(估計沒幾我的會看到這個地方...),我也整理整理思路,但願寫後續第二期的時候能把想表達的寫出來。