轻源码

  • QingYuanMa.com
  • 全球最大的互联网技术和资源下载平台
搜索
一起源码网 门户 终极进阶 查看主题

微信小程序请求不能使用session,picker组件不能使用对象的解决办法 ... ...

发布者: 小赌 | 发布时间: 2018-6-22 22:16| 查看数: 5483| 评论数: 1|帖子模式

一:发起的请求不能使用session的解决办法

我们知道,微信小程序发起的请求是通过腾讯的服务器再同意发送到我们的服务器的,而session一般是通过客户端cookie中的sessionid来识别客户端的,既然请求都是要通过腾讯的服务器发送到我们的服务器,那么我们的服务器也就无从识别请求的发起者了。 
解决办法: 
1通过重写url的方法识别请求的发起者 
2我们使用文件cache的方法来代替session

二:picker组件不能使用对象的解决办法

我今天在封装省市区三级联动的时候,发现微信小程序的picker组件不能直接使用索引数组({key : value}), 
于是我在服务器端把索引数组中的key和value用个循环分离出来,再存入新数组中。如图

  1. {
  2. a : 'a_value',
  3. b : 'b_value'
  4. }

改为

  1. {
  2. keys : [a, b],
  3. values : ['a_value', 'b_value']
  4. }

然后就可以用picker显示了,而且keys数组和values数组的index是对应的,如果想取出原来的索引只需要values[index]即可,

相关代码: 使用picker封装省市区三级联动实例 
目前学习小程序更多的是看看能否二次封装其它组件,利于以后能快速开发各种小程序应用。目前发现picker的selector模式只有一级下拉,那么我们是否可以通过3个picker来实现三级联动模板的形式来引入其它页面中呢?答案是肯定可以的。那么我的思路是这样的: 
1、使用template模板语法进行封装,数据从页面传入 
2、根据picker组件的语法,range只能是一组中文地区数组,但是我们需要每个地区的唯一码来触发下一级联动数据。这样,我的做法是通过一个对象里面的两组数据分表存储中文名和唯一码的两个对象数组。格式【province:{code:['110000', '220000'...], name: ['北京市', '天津市'...]}】,这个格式是固定的,需要服务端配合返回 
3、通过picker的bindchange事件来获取下一级的数据,每个方法都写入函数中在暴露出来供页面调用 
然后讲下我demo的目录结构:

  1. common
  2. -net.js//wx.request请求接口二次整合
  3. -cityTemplate.js//三级联动方法
  4. page
  5. -demo
  6. -demo.js
  7. -demo.wxml
  8. template
  9. -cityTemplate.wxml
  10. app.js
  11. app.json
  12. app.wxss

然后,使用phpstudy搭建了简单的服务端供测试。不要问我服务端的为啥是这样的,我也不懂,刚入门我只要数据... 
当然你可以省掉这一步,将数据直接固定在demo.js里面进行测试... 
代码如下:【服务端的返回数据格式是遵循了下面的retArr的规范的】

  1. <?php
  2. header("Content-type: text/html; charset=utf-8");
  3. $type=$_REQUEST["type"];//获取省市区的标志
  4. $fcode=$_GET["fcode"];
  5. $retArr=[
  6. "status"=>true,
  7. "data"=>[],
  8. "msg"=>""
  9. ];
  10. if($type!="province" && $type!="city" && $type!="county"){
  11. $retArr["status"]=false;
  12. $retArr["msg"]="获取地区类型错误,请检查";
  13. echo json_encode($retArr);
  14. exit;
  15. }
  16. function getProvince(){
  17. $province=[];
  18. $code=["110000", "350000", "710000"];
  19. $province["code"]=$code;
  20. $name=["北京市", "福建省", "台湾省"];
  21. $province["name"]=$name;
  22. $fcode=["0", "0", "0"];
  23. $province["fcode"]=$fcode;
  24. return $province;
  25. }
  26. function getCity($P_fcode){
  27. $city=[];
  28. $code=[];
  29. $name=[];
  30. $fcode=[];
  31. if($P_fcode=="110000"){
  32. $code=["110100"];
  33. $name=["北京市"];
  34. $fcode=$P_fcode;
  35. }
  36. if($P_fcode=="350000"){
  37. $code=["350100", "350200", "350300", "350400", "350500", "350600", "350700", "350800", "350900"];
  38. $name=["福州市", "厦门市", "莆田市", "三明市", "泉州市", "漳州市", "南平市", "龙岩市", "宁德市"];
  39. $fcode=$P_fcode;
  40. }
  41. if($P_fcode=="710000"){
  42. }
  43. $city=["code"=>$code, "name"=>$name, "fcode"=>$fcode];
  44. return $city;
  45. }
  46. function getCounty($P_fcode){
  47. $county=[];
  48. $code=[];
  49. $name=[];
  50. $fcode=[];
  51. if($P_fcode=="110100"){
  52. $code=["110101", "110102", "110103", "110104", "110105", "110106", "110107"];
  53. $name=["东城区", "西城区", "崇文区", "宣武区", "朝阳区", "丰台区", "石景山区"];
  54. $fcode=$P_fcode;
  55. }
  56. if($P_fcode=="350100"){
  57. $code=["350102", "350103", "350104"];
  58. $name=["鼓楼区", "台江区", "苍山区"];
  59. $fcode=$P_fcode;
  60. }
  61. if($P_fcode=="350200"){
  62. $code=["350203", "350205", "350206"];
  63. $name=["思明区", "海沧区", "湖里区"];
  64. $fcode=$P_fcode;
  65. }
  66. $county=["code"=>$code, "name"=>$name, "fcode"=>$fcode];
  67. return $county;
  68. }
  69. //var_dump($province);
  70. if($type=="province"){
  71. $province=getProvince();
  72. $retArr["data"]=$province;
  73. }else if($type=="city"){
  74. $city=getCity($fcode);
  75. $retArr["data"]=$city;
  76. }else if($type="county"){
  77. $county=getCounty($fcode);
  78. $retArr["data"]=$county;
  79. }
  80. echo json_encode($retArr);
  81. ?>

接下来是cityTemplate.wxml::

  1. <template name="city">
  2. <view class="areas">
  3. <view class="province">
  4. <picker bindchange="provincePickerChange" value="{{provinceIndex}}" range="{{province.name}}" data-city-url="{{cityUrl}}">
  5. <text class="select-item">{{province.name[provinceIndex]}}</text>
  6. </picker>
  7. </view>
  8. <view class="city">
  9. <block wx:if="{{!city.name.length}}"> --二级市区-- </block>
  10. <block wx:if="{{city.name.length>0}}">
  11. <picker bindchange="cityPickerChange" value="{{cityIndex}}" range="{{city.name}}" data-county-url="{{countyUrl}}">
  12. <text class="select-item">{{city.name[cityIndex]}}</text>
  13. </picker>
  14. </block>
  15. </view>
  16. <view class="county">
  17. <block wx:if="{{!county.name.length}}"> --三级地区-- </block>
  18. <block wx:if="{{county.name.length>0}}">
  19. <picker bindchange="countyPickerChange" value="{{countyIndex}}" range="{{county.name}}">
  20. <text class="select-item">{{county.name[countyIndex]}}</text>
  21. </picker>
  22. </block>
  23. </view>
  24. </view>
  25. </template>

cityTemplate.js::

  1. /**
  2. * 获取三级联动的三个函数
  3. * that: 注册页面的this实例 必填
  4. * p_url: 一级省份url 必填
  5. * p_data:一级省份参数 选填
  6. */
  7. var net = require( "net" );//引入request方法
  8. var g_url, g_datd, g_cbSuccess, g_cbSuccessErr, g_cbFail, g_cbComplete, g_header, g_method;
  9. function initCityFun( that, p_url, p_data ) {
  10. //获取一级省份数据
  11. g_cbSuccess = function( res ) {
  12. that.setData( {
  13. 'city.province': res
  14. });
  15. };
  16. net.r( p_url, p_data, g_cbSuccess, g_cbSuccessErr, g_cbFail, g_cbComplete, g_header, g_method );
  17. //点击一级picker触发事件并获取市区方法
  18. var changeProvince = function( e ) {
  19. that.setData( {
  20. 'city.provinceIndex': e.detail.value
  21. });
  22. var _fcode = that.data.city.province.code[ e.detail.value ];
  23. if( !_fcode ) {
  24. _fcode = 0;
  25. }
  26. var _cityUrl = e.target.dataset.cityUrl;
  27. g_url = _cityUrl + _fcode;
  28. g_cbSuccess = function( res ) {
  29. that.setData( {
  30. 'city.city': res
  31. });
  32. }
  33. net.r( g_url, g_datd, g_cbSuccess, g_cbSuccessErr, g_cbFail, g_cbComplete, g_header, g_method );
  34. };
  35. that[ "provincePickerChange" ] = changeProvince;
  36. //点击二级picker触发事件并获取地区方法
  37. var changeCity = function( e ) {
  38. that.setData( {
  39. 'city.cityIndex': e.detail.value
  40. });
  41. var _fcode = that.data.city.city.code[ e.detail.value ];
  42. if( !_fcode ) {
  43. _fcode = 0;
  44. }
  45. var _countyUrl = e.target.dataset.countyUrl;
  46. g_url = _countyUrl + _fcode;
  47. g_cbSuccess = function( res ) {
  48. that.setData( {
  49. 'city.county': res
  50. });
  51. };
  52. net.r( g_url, g_datd, g_cbSuccess, g_cbSuccessErr, g_cbFail, g_cbComplete, g_header, g_method );
  53. };
  54. that[ "cityPickerChange" ] = changeCity;
  55. //点击三级picker触发事件
  56. var changeCounty = function( e ) {
  57. that.setData( {
  58. 'city.countyIndex': e.detail.value
  59. });
  60. };
  61. that["countyPickerChange"]=changeCounty;
  62. }
  63. function getProvinceFun(that, p_url, p_data){
  64. g_cbSuccess = function( res ) {
  65. that.setData( {
  66. 'city.province': res
  67. });
  68. };
  69. net.r( p_url, p_data, g_cbSuccess, g_cbSuccessErr, g_cbFail, g_cbComplete, g_header, g_method );
  70. }
  71. module.exports={
  72. initCityFun: initCityFun,
  73. getProvinceFun: getProvinceFun
  74. }

顺道net.js方法::

  1. /**
  2. * 网络发送http请求,默认为返回类型为json
  3. *
  4. * url: 必须,其他参数非必须 接口地址
  5. * data:请求的参数 Object或String
  6. * successFun(dts):成功返回的回调函数,已自动过滤微信端添加数据,按接口约定,返回成功后的data数据,过滤掉msg和status
  7. * successErrorFun(msg):成功执行请求,但是服务端认为业务错误,执行其他行为,默认弹出系统提示信息.
  8. * failFun:接口调用失败的回调函数
  9. * completeFun:接口调用结束的回调函数(调用成功、失败都会执行)
  10. * header:object,设置请求的 header , header 中不能设置 Referer
  11. * method:默认为 GET,有效值:OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
  12. *
  13. */
  14. function r( url, data, successFun, successErrorFun, failFun, completeFun, header, method ) {
  15. var reqObj = {};
  16. reqObj.url = url;
  17. reqObj.data = data;
  18. //默认头为json
  19. reqObj.header = { 'Content-Type': 'application/json' };
  20. if( header ) {
  21. //覆盖header
  22. reqObj.header = header;
  23. }
  24. if( method ) {
  25. reqObj.method = method;
  26. }
  27. reqObj.success = function( res ) {
  28. var returnData = res.data; //将微信端结果过滤,获取服务端返回的原样数据
  29. var status = returnData.status; //按接口约定,返回status时,才调用成功函数
  30. //console.log(res);
  31. //正常执行的业务函数
  32. if( status == true ) {
  33. if( successFun ) {
  34. var dts = returnData.data;
  35. successFun( dts );//回调,相当于获取到data后直接在回调里面处理赋值数据
  36. }
  37. } else if( status == false ) {
  38. var msg = returnData.msg;
  39. if( !successErrorFun ) {
  40. console.log( msg );
  41. } else {
  42. successErrorFun( msg );
  43. }
  44. } else {
  45. console.log( "服务端没有按照接口约定格式返回数据" );
  46. }
  47. }
  48. reqObj.fail = function( res ) {
  49. if( failFun ) {
  50. failFun( res );
  51. }
  52. }
  53. reqObj.complete = function( res ) {
  54. if( completeFun ) {
  55. completeFun( res );
  56. }
  57. }
  58. wx.request( reqObj );
  59. }
  60. module.exports = {
  61. r: r
  62. }

核心代码就是上面这三个文件,接下来是demo文件做测试:: 
demo.wxml::

  1. <import src="../../template/cityTemplate.wxml"/>
  2. <template is="city" data="{{...city}}" />

demo.js::

  1. var city = require( '../../common/cityTemplate' );
  2. Page( {
  3. data: {
  4. },
  5. onLoad: function( options ) {
  6. var _that = this;
  7. //创建三级联动数据对象 ---- 这个city对象是固定的,只有请求的url是根据各自的服务端地址来更改的
  8. _that.setData( {
  9. city: {
  10. province: {},//格式province:{code: ["11000", "12000"], name: ["北京市", "上海市"]},只能固定是name和code,因为模板需要根据这俩参数显示
  11. city: {},
  12. county: {},
  13. provinceIndex: 0,
  14. cityIndex: 0,
  15. countyIndex: 0,
  16. cityUrl: "http://localhost:8282/phpserver/areas.php?type=city&fcode=",//type表示获取地区 fcode是一级code码,到时具体根据后端请求参数修改
  17. countyUrl: "http://localhost:8282/phpserver/areas.php?type=county&fcode="
  18. }
  19. })
  20. var _url = "http://localhost:8282/phpserver/areas.php";
  21. var _data = { 'type': 'province', 'fcode': '0' };
  22. city.initCityFun( _that, _url, _data );
  23. }
  24. })

以上完整代码文件,最终测试如下: 

 
这里存在一个bug,开启下拉刷新和picker组件的下拉会重叠了,不知道是开发工具原因,还是还为修改的bug。。。只能等微信方面更新消息给反馈了

最新评论

彭于晏 发表于 2022-6-29 13:30
哪里有源代码下载

轻源码让程序更轻更快

QingYuanMa.com

工作时间 周一至周六 8:00-17:30

侵权处理

客服QQ点击咨询

关注抖音号

定期抽VIP

Copyright © 2016-2021 https://www.171739.xyz/ 滇ICP备13200218号

快速回复 返回顶部 返回列表