笔者最近接触了小程序相关的知识,于是利用周末开发了一个和同事类似的小程序,深切体会到了小程序云开发模式。云功能、数据库和存储功能。云开发请参考文档:小程序·云开发。个人感觉云开发带来的最大好处就是认证流程的简化和后台的弱化,所以像笔者这种没有接触过小程序开发的人也可以开发出一个功能齐全,用户友好的周末两天内友情体验。闭环几乎无法使用的产品。最后,本文不携带官方文档,也不会详细介绍开发工具的使用和云开发背景,所以建议结合上面给出的文档链接消化本文。功能分析这个小程序的功能目前比较简单(发布帖子,浏览帖子,发表评论),可以用下图来表示,不用赘述:从架构图可以看出,数据库云端开发的(店铺帖子、店铺评论)、存储(图片)、云端功能(读写、更新数据库等)都会涉及到,达到练手的目的。如果你发布的帖子没有图片,你可以直接写入数据库。如果有图片,需要先将图片存储在云开发提供的存储中,然后获取返回的fileId(可以理解为图片的url)一起写入数据库,核心代码:for(leti=0;i{//获取资源ID:console.log(res)//将上传成功的图片地址放入数组img_url_ok.push(res.fileID)//如果全部上传完成,可以上传图片保存路径到数据库if(img_url_ok.length==img_url.length){console.log(img_url_ok)that.publish(img_url_ok)}},fail:err=>{//handleerrorconsole.log('fail:'+err.errMsg)}})}通过img_url_ok.length==img_url.length,我们确认所有图片都已上传,并返回相应的id,以及然后执行写入数据库的操作:/***发布时图片已经上传,写入数据库的是图片的fileId*/publish:function(img_url_ok){wx.cloud.init()wx.cloud.callFunction({name:'publish_post',data:{openid:app.globalData.openId,//这个cloud其实可以直接获取author_name:app.globalData.userInfo.nickName,content:this.data.content,image_url:img_url_ok,publish_time:"",update_time:""//目前让服务器自己生成这两个时间},success:function(res){//强制刷新,这个参数很粗varpages=getCurrentPages();//获取页面栈varprevPage=pages[pages.length-2];//上一页prevPage.setData({update:true})wx.hideLoading()wx.navigateBack({delta:1})},fail:console.error})},通过wx.cloud.callFunction我们调用了一个云函数(通过名字指定函数名),并发布内容和图片image_url和其他信息(发布者昵称、id等)一起发送到云端然后看这个云函数:exports.main=async(event,context)=>{try{returnawaitdb.collection('post_collection').add({//data字段表示要添加的JSON数据数据:{//发布时,小程序传入//author_id:event.openid,不要自己传,使用sdk自带的author_id:event.userInfo.openId,author_name:event.author_name,content:event.content,image_url:event.image_url,//服务器时间和本地时间会有什么影响,需要评估publish_time:newDate(),//update_time:event.update_time,//最后更新时间,发布或评论触发更新,当前useserver-sidetimeupdate_time:newDate(),//默认值,有些还没有开发,所以没有设置//comment_count:0,//评论数,直接读取数据库,避免两个数据代表同义watch_count:3,//浏览数//star_count:0,//TODO:收藏数}})}catch(e){console.error(e)}}可以看到云函数有写了一条数据库记录,我们的参数是通过变量event携带进来的。获取帖子列表所谓获取帖子列表,其实就是读取上一节写的数据库,但是我们不需要所有的信息(比如图片url),需要按时间排序。如果你熟悉数据库,你会发现这是另一个查询语句仅此而已:exports.main=async(event,context)=>{return{postlist:awaitdb.collection('post_collection').field({//指定需要返回的字段_id:true,author_name:true,content:true,title:true,watch_count:true}).orderBy('update_time','desc').get(),//指定排序依据}}Browsepostcontent浏览post内容和给定的postid,通过post列表被点击时引入:onItemClick:function(e){console.log(e.currentTarget.dataset.postid)wx.navigateTo({url:'../postdetail/postdetail?postid='+e.currentTarget.dataset.postid,})},然后在云函数中根据这个id获取所有数据:exports.main=async(event,context)=>{return{postdetail:awaitdb.collection('post_collection').where({_id:event.postid}).get(),}}获取所有数据后,根据加载post的图片图片id://获取内容wx.cloud.callFunction({//云函数名称:'get_post_detail',data:{postid:options.postid},成功:function(res){varpostdetail=res.result.postdetail.data[0];that.setData({detail:postdetail,contentLoaded:true})that.downloadImages(postdetail.image_url)},fail:console.error})这里that.downloadImages(postdetail.image_url)是加载图片:/***从数据库中获取图片的fileId,然后去云存储下载,最后加载*/downloadImages:function(image_urls){varthat=thisif(image_urls.length==0){return}else{varurls=[]for(leti=0;i{//获取临时文件路径console.log(res.tempFilePath)urls.push(res.tempFilePath)if(urls.length==image_urls.length){console.log(urls)that.setData({imageUrls:urls,imagesLoaded:true})}},失败:错误=>{//handleerror}})}}},发表评论发表评论的逻辑和发帖的逻辑类似,只是写的数据不一样,就不赘述总结了。前面提到,云开发弱化了后端(简化认证的本质也是弱化了端),这样做的好处是提高了开发效率,因为前后端联调一直是一个耗时的任务,而小程序本身就是专注于小应用,所以真的不需要引入太多的开发者。但云开发并不是万能的。比如我一开始想做一个RSS阅读器,所以后台需要聚合信息,云开发还不行。个人感觉只要是新闻、视频等资讯类的小程序,云开发目前都很薄弱,因为数据库支持还是太简单了(也可能是我太擅长了,有没找到好的解决办法,欢迎拍砖)。但如果是本文提到的用户自己可以产生信息的小程序,那么云开发在开发效率上会更有优势。最后就是云开发目前提供的2G数据库和5G存储。对于一些用户量大的小程序来说够不够用也是个问题,目前还没有付费版。总的来说,在刚接触小程序开发的时候,还是发现有很多值得借鉴的地方。源码链接https://github.com/TencentCloudBase/Good-practice-tutorial-recommended如果您有使用云开发CloudBase的技术故事/技术实践经验想分享给大家,欢迎留言联系我们~比心!