用户我家大花猫 發表於 2019-12-16 17:35:00

微信小程序开发(三)----- 云开发案例

<p><span style="font-size: 16px"><strong>1、发送请求</strong></span></p>
<p><img src="https://img2018.cnblogs.com/i-beta/1730357/201912/1730357-20191216151339900-385327937.png"></p>
<p><span style="font-size: 16px"><strong>2、云函数中发送请求,例子request</strong></span></p>
<ul>
<li>https://github.com/request/request-promise&nbsp; &nbsp; 创建云函数movielist,右键在终端打开,输入<span style="color: rgba(128, 0, 0, 1)"><strong>&nbsp; npm&nbsp; &nbsp;install --save request</strong></span></li>
<li>然后输入<strong>&nbsp;<span style="color: rgba(128, 0, 0, 1)">npm&nbsp; &nbsp;install --save request-promise,</span></strong>当前云函数的package.json文件依赖为</li>
</ul>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<img src="https://img2018.cnblogs.com/i-beta/1730357/201912/1730357-20191216152725176-595589490.png">&nbsp; &nbsp;</p>
<ul>
<li>使用
<ul>
<li>在云函数movielist的index.js中引入包
<div class="cnblogs_code"><img id="code_img_closed_24d1ac49-3b9a-4249-84e7-de650ea8f297" class="code_img_closed lazyload" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_24d1ac49-3b9a-4249-84e7-de650ea8f297" class="code_img_opened lazyload" style="display: none" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_24d1ac49-3b9a-4249-84e7-de650ea8f297" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 云函数入口文件</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> cloud = require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">wx-server-sdk</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)

cloud.init()

</span><span style="color: rgba(0, 0, 255, 1)">var</span> rp = require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">request-promise</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 云函数入口函数</span>
exports.main = <span style="color: rgba(0, 0, 255, 1)">async</span>(<span style="color: rgba(0, 0, 255, 1)">event</span>, context) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> ES6字符串模板的形式</span>
<span style="color: rgba(0, 0, 255, 1)">return</span> rp(`http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">api.douban.com/v2/movie/in_theaters?apikey=0df993c66c0c636e29ecbb5344252a4a&amp;start=${event.start}&amp;count=${event.count}`)</span>
<span style="color: rgba(0, 0, 0, 1)">    .then(function(res) {
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 显示在云函数的服务端</span>
<span style="color: rgba(0, 0, 0, 1)">      console.log(res);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> res;
    })
    .</span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)">(function(err) {
      console.error(err);
    });
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
</li>
<li>以请求豆瓣电影列表为例子,在movie的js页面,刚进入页面获取数据,因此onLoad生命周期的代码为
<div class="cnblogs_code"><img id="code_img_closed_29399515-4652-41c3-b052-5e7615af3d03" class="code_img_closed lazyload" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_29399515-4652-41c3-b052-5e7615af3d03" class="code_img_opened lazyload" style="display: none" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_29399515-4652-41c3-b052-5e7615af3d03" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 生命周期函数--监听页面加载
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
onLoad: function (options) {
    </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.getMovieList();
},
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 获取电影列表的数据
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
getMovieList() {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 加载框</span>
<span style="color: rgba(0, 0, 0, 1)">    wx.showLoading({
      title: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">加载中</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
    })
    wx.cloud.callFunction({
      name: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">movielist</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
      data: {
      start: </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.data.movieList.length,
      count: </span><span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">
      },
      success: res </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setData({
          </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 对返回的字符串进行解析,并且每次返回的数据应该拼接在原有数据的后面</span>
          movieList: <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.data.movieList.concat(JSON.parse(res.result).subjects)
      });
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 隐藏加载框</span>
<span style="color: rgba(0, 0, 0, 1)">      wx: wx.hideLoading()
      },
      fail: error </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      wx.showToast({
          title: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">获取电影列表数据失败</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
      })
      }
    })
},</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
</li>
<li>滚动条滚动到底部时异步的加载10条数据,在生命周期onReachBottom中再次发送请求
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 页面上拉触底事件的处理函数
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
onReachBottom: function () {
    </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.getMovieList()
}</span></pre>
</div>
</li>
</ul>
</li>
<li>跳转详情页面演示
<ul>
<li>点击按钮切换详情
<div class="cnblogs_code">
<pre>&lt;button <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">movie-comment</span><span style="color: rgba(128, 0, 0, 1)">"</span> catchtap=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">onCatchSkipToComment</span><span style="color: rgba(128, 0, 0, 1)">"</span> data-movieid=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">{{item.id}}</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;评价&lt;/button&gt;</pre>
</div>
</li>
<li>movie.js
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 跳转评价的详情页面
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
onCatchSkipToComment(</span><span style="color: rgba(0, 0, 255, 1)">event</span><span style="color: rgba(0, 0, 0, 1)">) {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 跳转新页面,保留上一个页面</span>
<span style="color: rgba(0, 0, 0, 1)">    wx.navigateTo({
      url: `..</span>/comment/comment?movieid=${<span style="color: rgba(0, 0, 255, 1)">event</span><span style="color: rgba(0, 0, 0, 1)">.target.dataset.movieid}`,
    })
},</span></pre>
</div>
</li>
<li>在comment的js里面
<div class="cnblogs_code"><img id="code_img_closed_f9e0d0e2-803a-4995-a09b-0071f5e37550" class="code_img_closed lazyload" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_f9e0d0e2-803a-4995-a09b-0071f5e37550" class="code_img_opened lazyload" style="display: none" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_f9e0d0e2-803a-4995-a09b-0071f5e37550" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 页面的初始数据
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
data: {
    movieDetail : {}
},

</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 生命周期函数--监听页面加载
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
onLoad: function (options) {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 获取上一个页面传过来的参数</span>
    <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.getMovieDetail(options.movieid)
},
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 获取电影详情信息
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
getMovieDetail(movieid) {
    wx.showLoading({
      title: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">加载中</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
    })
    wx.cloud.callFunction({
      name: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">getDetail</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
      data: {
      movieid: movieid
      },
      success: res </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.setData({
          movieDetail : JSON.parse(res.result)
      })
      console.log(</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.data.movieDetail)
      wx.hideLoading()
      },
      fail: error </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      console.log(error)
      }
    })
},</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
</li>
<li>在云函数getDetail的index中
<div class="cnblogs_code"><img id="code_img_closed_7ad3ffc9-53fd-4548-947d-fe32c8501c2d" class="code_img_closed lazyload" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_7ad3ffc9-53fd-4548-947d-fe32c8501c2d" class="code_img_opened lazyload" style="display: none" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_7ad3ffc9-53fd-4548-947d-fe32c8501c2d" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 云函数入口文件</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> cloud = require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">wx-server-sdk</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)

cloud.init()

</span><span style="color: rgba(0, 0, 255, 1)">var</span> rp = require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">request-promise</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 云函数入口函数</span>
exports.main = <span style="color: rgba(0, 0, 255, 1)">async</span> (<span style="color: rgba(0, 0, 255, 1)">event</span>, context) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> rp(`http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">api.douban.com/v2/movie/subject/${event.movieid}?apikey=0df993c66c0c636e29ecbb5344252a4a`)</span>
<span style="color: rgba(0, 0, 0, 1)">    .then(function (res) {
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 显示在云函数的服务端</span>
<span style="color: rgba(0, 0, 0, 1)">      console.log(res);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> res;
    })
    .</span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)">(function (err) {
      console.error(err);
    });
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
</li>
</ul>
</li>
<li>&nbsp;获取用户信息
<ul>
<li>WXML
<div class="cnblogs_code">
<pre>&lt;!-- 第一种方式 --&gt;
&lt;view <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">profile</span><span style="color: rgba(128, 0, 0, 1)">'</span>&gt;
&lt;view <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">profile-img</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
    &lt;open-data type=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">userAvatarUrl</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;&lt;/open-data&gt;
&lt;/view&gt;
&lt;open-data type=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">userNickName</span><span style="color: rgba(128, 0, 0, 1)">"</span> <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">profile-name</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;&lt;/open-data&gt;
&lt;/view&gt;
&lt;!-- 第二种方式 --&gt;
&lt;button open-type=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">getUserInfo</span><span style="color: rgba(128, 0, 0, 1)">"</span> bindgetuserinfo=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">getUserInfo</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;获取用户信息&lt;/button&gt;</pre>
</div>
</li>
<li>微信小程序提供了开放能力open-data,同时button组件内的type属性也支持开放能力</li>
</ul>
</li>
<li>小程序的审核上线
<ul>
<li>由于后端采用小程序的云开发(免费),因此不需要购买相对应的服务器;</li>
<li>设置体验版:点击微信开发工具的&nbsp; “上传”&nbsp; 按钮,上传到腾讯云;</li>
<li>可以到微信公众平台版本管理中提交审核,审核通过后成为线上版本</li>
</ul>
</li>
</ul>
<p><span style="font-size: 16px"><strong>3、遇到的问题</strong></span></p>
<ol>
<li>电影详情中高度模糊(毛玻璃)效果</li>
</ol>
<ul>
<li style="list-style-type: none">
<ul>
<li>WXML
<div class="cnblogs_code">
<pre> &lt;view <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">detail-container</span><span style="color: rgba(128, 0, 0, 1)">'</span> style=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">background: url({{movieDetail.images.large}})</span><span style="color: rgba(128, 0, 0, 1)">'</span>&gt;&lt;/view&gt;
&lt;view <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">detail-mask</span><span style="color: rgba(128, 0, 0, 1)">'</span>&gt;&lt;/view&gt;</pre>
</div>
</li>
<li>WXSS
<div class="cnblogs_code">
<pre>.detail-<span style="color: rgba(0, 0, 0, 1)">container {
height: 400rpx;
filter: blur(40rpx);
opacity: </span><span style="color: rgba(128, 0, 128, 1)">0.4</span><span style="color: rgba(0, 0, 0, 1)">;
}

.detail</span>-<span style="color: rgba(0, 0, 0, 1)">mask {
position: absolute;
width: </span><span style="color: rgba(128, 0, 128, 1)">100</span>%<span style="color: rgba(0, 0, 0, 1)">;
height: 400rpx;
background</span>-color: #<span style="color: rgba(128, 0, 128, 1)">333</span><span style="color: rgba(0, 0, 0, 1)">;
top: </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
left: </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
z</span>-index: -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
}</span></pre>
</div>
</li>
</ul>
</li>
</ul>

</div>
<div id="MySignature" role="contentinfo">
    北栀女孩儿<br><br>
来源:https://www.cnblogs.com/wxh0929/p/12050298.html
頁: [1]
查看完整版本: 微信小程序开发(三)----- 云开发案例