用小程序·云开发两天搭建mini论坛丨实战
筆者最近涉獵了小程序相關的知識,于是利用周末時間開發了一款類似于同事的小程序,深度體驗了小程序云開發模式提供的云函數、數據庫、存儲三大能力。關于云開發,可參考文檔:小程序·云開發。
個人感覺云開發帶來的最大好處是鑒權流程的簡化和對后端的弱化,所以像筆者這種從未接觸過小程序開發的人也能夠在周末兩天時間內開發出一個功能完備、體驗閉環的勉強能用的產品。
最后,本文并不是搬運官方文檔,也不會詳細介紹開發工具和云開發后臺的使用,所以建議結合上面給出文檔鏈接一起消化本文。
功能分析
該小程序功能目前較為簡單(發布帖子、瀏覽帖子、發布評論),可用下圖表示,無需贅述:
由架構圖可知,云開發的數據庫(存帖子、存評論)、存儲(圖片)、云函數(讀、寫、更新數據庫等)都將涉及,很好地達到了練手的目的。
發布帖子
如果帖子不帶圖片,直接寫數據庫即可,如果帶圖片則需要先存入圖片到云開發提供的存儲中,拿到返回的fileId(可理解為圖片的url)再一并寫入數據庫,核心代碼:
for (let i = 0; i < img_url.length; i++) {var str = img_url[i];var obj = str.lastIndexOf("/");var fileName = str.substr(obj + 1)console.log(fileName)wx.cloud.uploadFile({cloudPath: 'post_images/' + fileName,//必須指定文件名,否則返回的文件id不對filePath: img_url[i], // 小程序臨時文件路徑success: res => {// get resource 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 => {// handle errorconsole.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,// 這個云端其實能直接拿到author_name: app.globalData.userInfo.nickName,content: this.data.content,image_url: img_url_ok,publish_time: "",update_time: ""//目前讓服務器自己生成這兩個時間},success: function (res) {// 強制刷新,這個傳參很粗暴var pages = getCurrentPages(); // 獲取頁面棧var prevPage = pages[pages.length - 2]; // 上一個頁面prevPage.setData({update: true})wx.hideLoading()wx.navigateBack({delta: 1})},fail: console.error})},通過wx.cloud.callFunction我們調用了一個云函數(通過name指定函數名),并將帖子內容content和圖片image_url以及其他信息(發布者昵稱、id等)一并傳到云端。然后再看看這個云函數:
exports.main = async (event, context) => {try {return await db.collection('post_collection').add({// data 字段表示需新增的 JSON 數據data: {// 發布時小程序傳入//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: new Date(),// update_time: event.update_time,// 最近一次更新時間,發布或者評論觸發更新,目前用服務器端時間update_time: new Date(),// 默認值,一些目前還沒開發,所以沒設置// comment_count: 0,//評論數,直接讀數據庫,避免兩個數據表示同一含義watch_count: 3,//瀏覽數// star_count: 0,//TODO:收藏人數}})} catch (e) {console.error(e)} }可以看到,云函數寫入了一條數據庫記錄,我們的參數通過event這個變量帶了進來。
獲取帖子列表
所謂獲取帖子列表其實就是讀上一節寫入的數據庫,但是我們并不需要全部信息(例如圖片url),并且要求按照時間排序,如果熟悉數據庫的話,會發現這又是一條查詢語句罷了:
exports.main = async (event, context) => {return {postlist: await db.collection('post_collection').field({// 指定需要返回的字段_id: true,author_name: true,content: true,title: true,watch_count: true}).orderBy('update_time', 'desc').get(),//指定排序依據} }瀏覽帖子內容
瀏覽帖子內容及給定一個帖子的id,由帖子列表點擊時帶入:
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: await db.collection('post_collection').where({_id: event.postid}).get(),} }拿到全部數據后,再根據圖片id去加載貼子的圖片:
// 獲取內容wx.cloud.callFunction({// 云函數名稱 name: 'get_post_detail',data: {postid: options.postid},success: function (res) {var postdetail = 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){var that = thisif(image_urls.length == 0){return} else {var urls = []for(let i = 0; i < image_urls.length; i++) {wx.cloud.downloadFile({fileID: image_urls[i],success: res => {// get temp file pathconsole.log(res.tempFilePath)urls.push(res.tempFilePath)if (urls.length == image_urls.length) {console.log(urls)that.setData({imageUrls: urls,imagesLoaded: true})}},fail: err => {// handle error}})}}},發表評論
發表評論和發布帖子邏輯類似,只是寫入的數據不同,不做贅述。
總結
前面說過,云開發弱化了后端(簡化鑒權本質也是弱化后端),這樣帶來的好處就是提高了開發效率,因為前后端聯調向來都是一件耗時間的事情,而且小程序本身主打的就
是小型應用,實在沒有必要引入過多的開發人員。但云開發也不是萬能的,例如我一開始想做RSS閱讀器,那么后端就需要聚合信息,目前云開發還做不了。
個人感覺只要是信息類的小程序,如新聞類、視頻類,云開發目前都很乏力,因為數據庫的支持還過于簡陋(也可能是我太菜,沒發現很好的解決辦法,歡迎拍磚)。但如果是本文提及的這種用戶自己也會產生信息的小程序,那么云開發則會有開發效率上的優勢。
最后就是云開發目前提供的2G數據庫和5G存儲,對于一些用戶量較多的小程序是否足夠也是個問題,目前也沒見有付費版。
總的類說,初次接觸小程序開發,還是發現有不少值得借鑒學習之處。
源碼鏈接
https://github.com/TencentCloudBase/Good-practice-tutorial-recommended
如果你有關于使用云開發CloudBase相關的技術故事/技術實戰經驗想要跟大家分享,歡迎留言聯系我們哦~比心!
轉載于:https://www.cnblogs.com/CloudBase/p/11399923.html
總結
以上是生活随笔為你收集整理的用小程序·云开发两天搭建mini论坛丨实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mybatis3.5.4官网下载
- 下一篇: 随机种子