▌導語git
一直對小程序開發很感興趣,以前就準備作一款屬於本身的小程序,無奈還須要購買雲服務器和部署後臺,有點麻煩,自從知道有了雲開發這個免去服務器搭建和運維的一站式後端雲服務「神器」,就一氣呵成花了幾個週末的時間作了一款本身的博客小程序,若是你也想打造一款本身的博客,那你閱讀這篇文章就夠啦。github
▌博客小程序介紹數據庫
主要功能:npm
包括文章的發佈及瀏覽、評論、點贊、瀏覽歷史、分類、排行榜、分享、生成海報圖等。小程序
效果展現:segmentfault
▌數據庫設計後端
數據庫主要就7張表,分別爲:用戶表,分類表,文章表,文章內容表,評論表,點贊表,歷史瀏覽表。安全
▌評論功能設計服務器
以文章評論功能爲例,咱們來看看代碼以及小程序雲開發的整個流程。微信
1. 實現思路
一開始的實現思路是準備搞兩張表,一張評論主表,一張回覆評論的子表,後來想着不用這麼複雜,其實就用一張表也能實現評論及回覆的功能。
2. 代碼實現
發表評論有三種狀況,第一種是評論文章,爲一級評論,第二種是評論別人的評論,爲二級評論,第三種是回覆別人的評論,爲三級評論。
2.1 如何新增一條評論
結合上面圖片,咱們再來看看代碼,就很清晰了。
/** * 發佈評論 */ submit() { var comment = this.data.inputData if (comment == '') { wx.showToast({ title: '請填寫評論', icon: 'none' }) } else { console.log("個人評論:" + this.data.inputData) var type = this.data.type; if (type == 1) { // 1是評論別人的評論》二級評論 this.replyComment(1) } else if (type == 2) { this.replyComment(2) // 2是回覆別人的評論》三級評論 } else if (type == 3) { // 3是評論文章》一級評論 this.addComment(); } } }, /** * 新增評論 */ addComment() { var _this = this; var openid = wx.getStorageSync("openid") wx.showLoading({ title: '正在加載...', }) var create_date = util.formatTime(new Date()); console.log("當前時間爲:" + create_date); var timestamp = Date.parse(new Date()); timestamp = timestamp / 1000; console.log("當前時間戳爲:" + timestamp); // 調用雲函數 wx.cloud.callFunction({ name: 'addComment', data: { //_id: timestamp + _this.data.otherUserInfo._id, id: _this.data.articleDetail._id, _openid: openid, avatarUrl: _this.data.userInfo.avatarUrl, nickName: _this.data.userInfo.nickName, comment: _this.data.inputData, create_date: create_date, flag: 0, article_id: _this.data.articleDetail.article_id, timestamp: timestamp, childComment: [], }, success: res => { // res.data 包含該記錄的數據 console.log("新增評論成功---") wx.showToast({ title: '評論提交成功', }) wx.navigateBack({ delta: 1 }) }, fail: err => { console.error('[雲函數]調用失敗', err) }, complete: res => { wx.hideLoading() } }) }, /** * 回覆評論 */ replyComment(commentType) { var _this = this; wx.showLoading({ title: '正在加載...', }) var create_date = util.formatTime(new Date()); console.log("當前時間爲:" + create_date); var timestamp = Date.parse(new Date()); timestamp = timestamp / 1000; wx.cloud.callFunction({ name: 'replyComment', data: { id: _this.data.articleDetail._id, _id: _this.data.otherUserInfo._id, avatarUrl: _this.data.userInfo.avatarUrl, nickName: _this.data.userInfo.nickName, openId: _this.data.openid, comment: _this.data.inputData, createDate: create_date, flag: commentType, opposite_avatarUrl: _this.data.otherUserInfo.avatarUrl, opposite_nickName: _this.data.otherUserInfo.nickName, opposite_openId: _this.data.otherUserInfo._openid, timestamp: timestamp, }, success: res => { // res.data 包含該記錄的數據 console.log("回覆評論成功---") wx.showToast({ title: '回覆提交成功', }) wx.navigateBack({ delta: 1 }) }, fail: err => { console.error('[雲函數]調用失敗', err) }, complete: res => { wx.hideLoading() } }) },
下面是新增評論和回覆評論的兩個雲函數,主要用到了async和await這兩個函數,讓新增和回覆函數執行完後咱們再更新一下article文章表的評論字段,讓其加1,async和await的好處就是可讓函數有序的進行,這裏就不贅述。
// 新增評論雲函數 const cloud = require('wx-server-sdk') var env = 'hsf-blog-product-xxxxx'; // 正式環境 // var env = 'xxxxxxxxxxxxx'; // 測試環境 cloud.init({ env: env }) const db = cloud.database() const _ = db.command exports.main = async(event, context) => { try { let res = await db.collection('comment').add({ data: { _openid: event._openid, avatarUrl: event.avatarUrl, nickName: event.nickName, comment: event.comment, create_date: event.create_date, flag: event.flag, article_id: event.article_id, timestamp: event.timestamp, childComment: [], } }).then(res => { return res; }) await db.collection('article').doc(event.id).update({ data: { comment_count: _.inc(1) } }) return res; } catch (e) { console.error(e) } }
// 回覆評論雲函數 const cloud = require('wx-server-sdk') var env = 'hsf-blog-product-xxxxx'; // 正式環境 // var env = 'xxxxxxxxxxxxxx'; // 測試環境 cloud.init({ env: env }) const db = cloud.database() const _ = db.command exports.main = async(event, context) => { try { let res = await db.collection('comment').doc(event._id).update({ data: { childComment: _.push({ avatarUrl: event.avatarUrl, nickName: event.nickName, openId: event.openId, comment: event.comment, createDate: event.createDate, flag: event.flag, opposite_avatarUrl: event.opposite_avatarUrl, opposite_nickName: event.opposite_nickName, opposite_openId: event.opposite_openId, timestamp: event.timestamp, }) } }).then(res => { return res; }) await db.collection('article').doc(event.id).update({ data: { comment_count: _.inc(1) } }) return res; } catch (e) { console.error(e) } }
2.2 如何顯示每一條評論
從數據庫取出評論的數據,循環遍歷每一條父評論,若是有子回覆也一併循環。這裏每一條評論的惟一標識是用戶的openId,那麼咱們能夠用這個作一些事情,如:能夠判斷若是是本身的評論是不能回覆的。
<view class="comment" wx:if="{{commentList.length>0}}"> <view class="comment-line"> <text class="comment-text">評論交流</text> <view class="bottom-line"></view> </view> <block wx:for='{{commentList}}' wx:key='*this' wx:for-item="itemfather"> <view class='commentList'> <view class="top-info"> <view class='img-name'> <image src="{{itemfather.avatarUrl}}"></image> <label>{{itemfather.nickName}}</label> </view> </view> <view class="father-content"> <text class="text">{{itemfather.comment}}</text> <view class="father-reply-time"> <text class="create-time">{{itemfather.create_date}}</text> <text class="reply" data-item="{{itemfather}}" bindtap='clickFatherConter' wx:if="{{openid != itemfather._openid}}">回覆</text> </view> </view> <view class="children-content"> <block wx:for='{{itemfather.childComment}}' wx:key='*this'> <view class='childComment'> <view class="child-img-name"> <view class="avatar-name"> <image src="{{item.avatarUrl}}"></image> <text class='nickName'>{{item.nickName}}</text> </view> </view> <view class="child-comment" wx:if="{{item.flag==2 }}"> <text class='huifu'>回覆</text> <text class='opposite-nickName'>{{item.opposite_nickName}}</text> <text class='comment-text'>{{item.comment}}</text> </view> <view class="child-comment" wx:if="{{item.flag==1}}"> <text class='comment-text'>{{item.comment}}</text> </view> <view class="child-reply-time"> <text class="child-create-time">{{item.createDate}}</text> <text class="reply" data-item="{{item}}" data-id="{{itemfather._id}}" bindtap='clickChildrenConter' wx:if="{{openid != item.openId}}">回覆</text> </view> </view> </block> </view> </view> </block> </view>
▌項目運行
1. 下載源碼
在github上將代碼下載到本地:
https://github.com/husanfeng/hsf_blog.git
2. 環境準備
(1)下載小程序開發工具;
(2)註冊appid;
(3)使用小程序開發工具導入下載的代碼,填入本身註冊的AppID。
3. 雲開發準備
(1)開通雲開發功能。
(2)建立測試環境和生產環境。
4. 修改環境ID
(1)修改app.js中的環境ID爲本身的環境ID。
(2)修改全部雲函數中的環境ID爲本身的環境ID。
5. 雲函數部署
(1)右鍵雲函數目錄,點擊在終端中打開,執行npm install。
(2)右鍵執行上傳並部署:全部文件。
6. 構建npm
(1)勾選使用npm模塊。
(2)點擊頂部功能欄,執行構建npm。
7. 執行編譯
▌發佈注意事項
小程序如今審覈也是愈來愈嚴謹了,爲了避免讓你們在審覈道路上走彎路,我把個人一些經驗分享給你們。
https://github.com/TencentCloudBase/Good-practice-tutorial-recommended
若是你想要了解更多關於雲開發CloudBase相關的技術故事/技術實戰經驗,請掃碼關注【騰訊云云開發】公衆號~