php抓取网页程序(场景小程序有52个页面(高大)(组图))
优采云 发布时间: 2022-02-20 03:00php抓取网页程序(场景小程序有52个页面(高大)(组图))
场景小程序有52个页面,其中13个页面不需要任何身份,另外39个页面需要系统角色。对于这39个页面,如果微信用户没有系统角色,则跳转到登录页面。是否有系统角色信息需要通过异步请求获取。需求分析与实施
把需求抽象出来,其实就是需要一个过滤器,过滤小程序页面的访问,通过条件,不满足条件再做其他处理。
用过php的laravel框架的童鞋们一定马上会想到laravel框架的http中间件:
HTTP 中间件提供了一种方便的机制来过滤进入应用程序的 HTTP 请求。例如,Laravel 默认收录一个中间件来验证用户身份验证。如果用户未通过身份验证,中间件会将用户引导至登录页面。但是,如果用户通过身份验证,中间件将允许请求继续进行。当然,中间件也可以用来执行除了认证程序请求之外的各种任务。
令人担忧的是,微信小程序并没有为 Page 实例提供中间件机制。所以我们只能从Page实例的生命周期入手。
mina-生命周期.png
对于onLoad,一个页面只会被调用一次;对于onShow,每次打开页面都会调用一次(比如小程序从后台转到前台)。
在onLoad或者onShow钩子函数中,验证用户身份,通过后拉取页面需要的数据,否则跳转到登录页面。
//orderDetail.js
onShow: function () {
let that = this;
//身份校验
service.identityCheck(() => {
//跳转到登录页
wx.redirectTo({
url: "/pages/common/login/login"
});
}, () => {
//获取页面数据等等
that.getDetail(this.orderId);
...
}
);
},
但是每个页面都必须这样写,有很多重复的代码,而且侵入性也很大。最好用装饰器函数来包裹它(装饰器模式崇高的方式):
//filter.js
function identityFilter(pageObj){
if(pageObj.onShow){
let _onShow = pageObj.onShow;
pageObj.onShow = function(){
service.identityCheck(()=>{
//跳转到登录页
wx.redirectTo({
url: "/pages/common/login/login"
});
},()=>{
//获取页面实例,防止this劫持
let currentInstance = getPageInstance();
_onShow.call(currentInstance);
});
}
}
return pageObj;
}
function getPageInstance(){
var pages = getCurrentPages();
return pages[pages.length - 1];
}
exports.identityFilter = identityFilter;
filter.js 用于提供过滤方法。除了现有的用户身份拦截外,如果以后需要进行其他拦截,可以添加到这个文件中。然后,在需要截取用户身份的小程序页面代码中,使用filter.identityFilter进行处理:
//orderDetail.js
let filter = require('filter.js');
Page(filter.identityFilter({
...
onShow: function () {
//获取页面数据等等
this.getDetail(this.orderId);
//...
},
...
}));
使用 Promise 进行优化
在上述实现中,每次访问页面时,都会执行获取用户身份的方法(即上述代码中的service.identityCheck)。事实上,没有必要。小程序启动时获取一次即可。也就是在app.js的onLaunch方法中执行。
在实例化每个小程序页面时,一般会执行一个异步方法来获取页面所需的数据。关键是,我们需要保证页面的异步方法必须在异步请求之后执行才能获取用户的身份。
不用说,Promises 最擅长处理异步请求的执行顺序。大师,我们把代码粗略一下:
//app.js
App({
onLaunch:function(){
let p = new Promise(function(resolve,reject){
service.identityCheck(resolve,reject);
});
this.globalData.promise = p;
},
...
globalData: {
promise:null,
}
});
//filter.js
const appData = getApp().globalData;
function identityFilter(pageObj){
if(pageObj.onShow){
let _onShow = pageObj.onShow;
pageObj.onShow = function(){
//改动点
appData.promise.then(()=>{
//跳转到登录页
wx.redirectTo({
url: "/pages/common/login/login"
});
},()=>{
//获取页面实例,防止this劫持
let currentInstance = getPageInstance();
_onShow.call(currentInstance);
});
}
}
return pageObj;
}
概括
小程序页面的用户身份*敏*感*词*基本实现了,但还是逊色于laravel的http中间件:
每个页面代码都需要被一层包裹。即使用户身份验证失败,小程序也不会阻塞页面的渲染。如果获取用户身份的异步方法执行需要一分钟,小程序页面仍然会显示,一分钟后会重定向到登录页面。您需要自己添加逻辑,例如在这一分钟内,页面显示空白内容。
嗯,多多关注小程序的新功能,看看以后如何改进吧~