【小程序+云開發(fā)】實戰(zhàn):一天搭建小型論壇

筆者最近涉獵了小程序相關(guān)的知識全谤,于是利用周末時間開發(fā)了一款類似于同事的小程序,深度體驗了小程序云開發(fā)模式提供的云函數(shù)安皱、數(shù)據(jù)庫调鬓、存儲三大能力。關(guān)于云開發(fā)酌伊,可參考文檔:小程序·云開發(fā)腾窝。
個人感覺云開發(fā)帶來的最大好處是鑒權(quán)流程的簡化和對后端的弱化,所以像筆者這種從未接觸過小程序開發(fā)的人也能夠在周末兩天時間內(nèi)開發(fā)出一個功能完備居砖、體驗閉環(huán)的勉強能用的產(chǎn)品虹脯。
最后,本文并不是搬運官方文檔悯蝉,也不會詳細介紹開發(fā)工具和云開發(fā)后臺的使用归形,所以建議結(jié)合上面給出文檔鏈接一起消化本文。

功能分析

image

該小程序功能目前較為簡單(發(fā)布帖子鼻由、瀏覽帖子暇榴、發(fā)布評論),可用下圖表示蕉世,無需贅述:
image

由架構(gòu)圖可知蔼紧,云開發(fā)的數(shù)據(jù)庫(存帖子、存評論)狠轻、存儲(圖片)奸例、云函數(shù)(讀、寫向楼、更新數(shù)據(jù)庫等)都將涉及飘言,很好地達到了練手的目的

發(fā)布帖子

如果帖子不帶圖片竟宋,直接寫數(shù)據(jù)庫即可叨吮,如果帶圖片則需要先存入圖片到云開發(fā)提供的存儲中,拿到返回的fileId(可理解為圖片的url)再一并寫入數(shù)據(jù)庫昭抒,核心代碼:

    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)
          //把上傳成功的圖片的地址放入數(shù)組中
          img_url_ok.push(res.fileID)
          //如果全部傳完,則可以將圖片路徑保存到數(shù)據(jù)庫
          if (img_url_ok.length == img_url.length) {
            console.log(img_url_ok)
            that.publish(img_url_ok)
          }
        },
        fail: err => {
          // handle error
          console.log('fail: ' + err.errMsg)
        }
      })
    }  

通過img_url_ok.length == img_url.length我們確定所有圖片已經(jīng)上傳完成并返回了對應的id灭返,然后執(zhí)行寫入數(shù)據(jù)庫的操作:


  /**
   * 執(zhí)行發(fā)布時圖片已經(jīng)上傳完成盗迟,寫入數(shù)據(jù)庫的是圖片的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: ""http://目前讓服務器自己生成這兩個時間
      },
      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我們調(diào)用了一個云函數(shù)(通過name指定函數(shù)名)熙含,并將帖子內(nèi)容content和圖片image_url以及其他信息(發(fā)布者昵稱罚缕、id等)一并傳到云端。然后再看看這個云函數(shù):

exports.main = async (event, context) => {
  try {
    return await db.collection('post_collection').add({
      // data 字段表示需新增的 JSON 數(shù)據(jù)
      data: {
        // 發(fā)布時小程序傳入
        //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,// 最近一次更新時間喂饥,發(fā)布或者評論觸發(fā)更新,目前用服務器端時間
        update_time: new Date(),
        // 默認值,一些目前還沒開發(fā)肠鲫,所以沒設(shè)置
        // comment_count: 0,//評論數(shù)员帮,直接讀數(shù)據(jù)庫,避免兩個數(shù)據(jù)表示同一含義
        watch_count: 3,//瀏覽數(shù)
        // star_count: 0,//TODO:收藏人數(shù)
      }
    })
  } catch (e) {
    console.error(e)
  }
}

可以看到导饲,云函數(shù)寫入了一條數(shù)據(jù)庫記錄捞高,我們的參數(shù)通過event這個變量帶了進來。

獲取帖子列表

所謂獲取帖子列表其實就是讀上一節(jié)寫入的數(shù)據(jù)庫渣锦,但是我們并不需要全部信息(例如圖片url)硝岗,并且要求按照時間排序,如果熟悉數(shù)據(jù)庫的話袋毙,會發(fā)現(xiàn)這又是一條查詢語句罷了:

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(),//指定排序依據(jù)

  }
}

瀏覽帖子內(nèi)容

瀏覽帖子內(nèi)容及給定一個帖子的id型檀,由帖子列表點擊時帶入:

  onItemClick: function (e) {
    console.log(e.currentTarget.dataset.postid)
    wx.navigateTo({
      url: '../postdetail/postdetail?postid=' + e.currentTarget.dataset.postid,
    })
  },

然后在云函數(shù)中根據(jù)這個id拿到全部數(shù)據(jù):

exports.main = async (event, context) => {
  
  return {
    postdetail: await db.collection('post_collection').where({
      _id: event.postid
    }).get(),
  }
}

拿到全部數(shù)據(jù)后,再根據(jù)圖片id去加載貼子的圖片:

    // 獲取內(nèi)容
    wx.cloud.callFunction({
      // 云函數(shù)名稱 
      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)即加載圖片:

  /**
   * 從數(shù)據(jù)庫獲取圖片的fileId听盖,然后去云存儲下載胀溺,最后加載出來
   */
  downloadImages: function(image_urls){
    var that = this
    if(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 path
            console.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
          }
        })
      }
    }
  },

發(fā)表評論

發(fā)表評論和發(fā)布帖子邏輯類似,只是寫入的數(shù)據(jù)不同皆看,不做贅述仓坞。

總結(jié)

前面說過,云開發(fā)弱化了后端(簡化鑒權(quán)本質(zhì)也是弱化后端)腰吟,這樣帶來的好處就是提高了開發(fā)效率无埃,因為前后端聯(lián)調(diào)向來都是一件耗時間的事情,而且小程序本身主打的就是小型應用毛雇,實在沒有必要引入過多的開發(fā)人員嫉称。但云開發(fā)也不是萬能的,例如我一開始想做RSS閱讀器灵疮,那么后端就需要聚合信息织阅,目前云開發(fā)還做不了。個人感覺只要是信息類的小程序始藕,如新聞類蒲稳、視頻類氮趋,云開發(fā)目前都很乏力伍派,因為數(shù)據(jù)庫的支持還過于簡陋(也可能是我太菜,沒發(fā)現(xiàn)很好的解決辦法剩胁,歡迎拍磚)诉植。但如果是本文提及的這種用戶自己也會產(chǎn)生信息的小程序,那么云開發(fā)則會有開發(fā)效率上的優(yōu)勢昵观。最后就是云開發(fā)目前提供的2G數(shù)據(jù)庫和5G存儲晾腔,對于一些用戶量較多的小程序是否足夠也是個問題舌稀,目前也沒見有付費版。
總的類說灼擂,初次接觸小程序開發(fā)壁查,還是發(fā)現(xiàn)有不少值得借鑒學習之處。
源碼:vimerzhao/RssHub

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末剔应,一起剝皮案震驚了整個濱河市睡腿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌峻贮,老刑警劉巖席怪,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異纤控,居然都是意外死亡挂捻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門船万,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刻撒,“玉大人,你說我怎么就攤上這事唬涧∫呤辏” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵碎节,是天一觀的道長捧搞。 經(jīng)常有香客問我,道長狮荔,這世上最難降的妖魔是什么胎撇? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮殖氏,結(jié)果婚禮上晚树,老公的妹妹穿的比我還像新娘。我一直安慰自己雅采,他們只是感情好爵憎,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著婚瓜,像睡著了一般宝鼓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上巴刻,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天愚铡,我揣著相機與錄音,去河邊找鬼。 笑死沥寥,一個胖子當著我的面吹牛碍舍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播邑雅,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼片橡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了淮野?” 一聲冷哼從身側(cè)響起锻全,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎录煤,沒想到半個月后鳄厌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡妈踊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年了嚎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片廊营。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡歪泳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出露筒,到底是詐尸還是另有隱情呐伞,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布慎式,位于F島的核電站伶氢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瘪吏。R本人自食惡果不足惜癣防,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掌眠。 院中可真熱鬧蕾盯,春花似錦、人聲如沸蓝丙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渺尘。三九已至挫鸽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沧烈,已是汗流浹背掠兄。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工像云, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留锌雀,地道東北人蚂夕。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像腋逆,于是被迫代替她去往敵國和親婿牍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容