下面是咱們真正存到數據庫裏的數據。
而後咱們在朋友圈頁只須要請求數據庫裏的數據,而後展現到頁面就以下圖所示
因此咱們接下來就來實現發佈和展現的功能git
這裏就很少說了,注意:必定要用本身的appid,因此你須要註冊一個小程序(我的的就行)github
咱們發佈頁佈局比較簡單,一個文字輸入框,一個圖片展現區域,一個發佈按鈕。
先把發佈頁佈局wxml貼出來正則表達式
<textarea class="desc" placeholder="請輸入內容" bindinput="getInput" /> <view class="iamgeRootAll"> <view class="imgRoot" wx:for="{{imgList}}" wx:key="{{index}}" bindtap="ViewImage" data-url="{{imgList[index]}}"> <view wx:if="{{imgList.length==(index+1)&& imgList.length<8}}" class="imgItem" bindtap="ChooseImage"> <image class="photo" src="../../images/photo.png"></image> </view> <view wx:else class="imgItem" data-index="{{index}}"> <image class="img" src='{{item}}' mode='aspectFill'></image> <image class="closeImg" bindtap="DeleteImg" src="../../images/close.png" data-index="{{index}}"></image> </view> </view> <!-- 一開始用來佔位 --> <view wx:if="{{imgList.length==0}}" class="imgItem" bindtap="ChooseImage"> <image class="photo" src="../../images/photo.png"></image> </view> </view> <button type="primary" bindtap="publish">發佈朋友圈</button>
這裏惟一的難點,就是下面的圖片分佈,由於咱們每次用戶選擇的圖片個數不固定,這就要去分狀況考慮了。
wx:if="{{imgList.length==(index+1)&& imgList.length<8}}"這段代碼是用來控制咱們發佈的那個➕ 號的顯示與隱藏的。
數據庫
這個➕號有下面三種狀況須要考慮編程
圖片選擇很簡單,就用官方的api便可。實現代碼以下小程序
//選擇圖片 ChooseImage() { wx.chooseImage({ count: 8 - this.data.imgList.length, //默認9,咱們這裏最多選擇8張 sizeType: ['original', 'compressed'], //能夠指定是原圖仍是壓縮圖,默認兩者都有 sourceType: ['album'], //從相冊選擇 success: (res) => { console.log("選擇圖片成功", res) if (this.data.imgList.length != 0) { this.setData({ imgList: this.data.imgList.concat(res.tempFilePaths) }) } else { this.setData({ imgList: res.tempFilePaths }) } } }); },
這裏單獨說明下 8 - this.data.imgList.length。由於我這裏規定最多隻能上傳8張圖片。因此用了count8 ,至於後面爲何要減去this.data.imgList.length。主要是咱們用戶不必定一次選擇8張圖片,有可能第一次選擇2張,第二次選擇2張。。。
因此咱們作選擇時,每次傳入的數量確定不同的。而這個imgList.length就是用戶已經選擇的圖片個數。用8減去已選擇的個數,就是下次最多能選擇的了。api
上面代碼在選擇成功後,會生成一個臨時的圖片連接。以下圖所示,這個連接既能夠用來展現咱們已經選擇的圖片,後面的圖片上傳也要用到。
數組
咱們每張圖片的右上角有個刪除按鈕,點擊刪除按鈕能夠實現圖片的刪除。
這裏比較簡單,把代碼貼給你們promise
//刪除圖片 DeleteImg(e) { wx.showModal({ title: '要刪除這張照片嗎?', content: '', cancelText: '取消', confirmText: '肯定', success: res => { if (res.confirm) { this.data.imgList.splice(e.currentTarget.dataset.index, 1); this.setData({ imgList: this.data.imgList }) } } }) },
const promiseArr = [] //只能一張張上傳 遍歷臨時的圖片數組 for (let i = 0; i < this.data.imgList.length; i++) { let filePath = this.data.imgList[i] let suffix = /\.[^\.]+$/.exec(filePath)[0]; // 正則表達式,獲取文件擴展名 //在每次上傳的時候,就往promiseArr裏存一個promise,只有當全部的都返回結果時,才能夠繼續往下執行 promiseArr.push(new Promise((reslove, reject) => { wx.cloud.uploadFile({ cloudPath: new Date().getTime() + suffix, filePath: filePath, // 文件路徑 }).then(res => { // get resource ID console.log("上傳結果", res.fileID) this.setData({ fileIDs: this.data.fileIDs.concat(res.fileID) }) reslove() }).catch(error => { console.log("上傳失敗", error) }) })) } //保證全部圖片都上傳成功 Promise.all(promiseArr).then(res => { //圖片上傳成功了,纔會執行到這。。。 })
咱們這裏用Promise來確保全部的圖片都上傳成功了,才執行後面的操做。網絡
/** * 編程小石頭 * wehchat:2501902696 */ let app = getApp(); Page({ data: { imgList: [], fileIDs: [], desc: '' }, //獲取輸入內容 getInput(event) { console.log("輸入的內容", event.detail.value) this.setData({ desc: event.detail.value }) }, //選擇圖片 ChooseImage() { wx.chooseImage({ count: 8 - this.data.imgList.length, //默認9,咱們這裏最多選擇8張 sizeType: ['original', 'compressed'], //能夠指定是原圖仍是壓縮圖,默認兩者都有 sourceType: ['album'], //從相冊選擇 success: (res) => { console.log("選擇圖片成功", res) if (this.data.imgList.length != 0) { this.setData({ imgList: this.data.imgList.concat(res.tempFilePaths) }) } else { this.setData({ imgList: res.tempFilePaths }) } } }); }, //刪除圖片 DeleteImg(e) { wx.showModal({ title: '要刪除這張照片嗎?', content: '', cancelText: '取消', confirmText: '肯定', success: res => { if (res.confirm) { this.data.imgList.splice(e.currentTarget.dataset.index, 1); this.setData({ imgList: this.data.imgList }) } } }) }, //上傳數據 publish() { let desc = this.data.desc let imgList = this.data.imgList if (!desc || desc.length < 6) { wx.showToast({ icon: "none", title: '內容大於6個字' }) return } if (!imgList || imgList.length < 1) { wx.showToast({ icon: "none", title: '請選擇圖片' }) return } wx.showLoading({ title: '發佈中...', }) const promiseArr = [] //只能一張張上傳 遍歷臨時的圖片數組 for (let i = 0; i < this.data.imgList.length; i++) { let filePath = this.data.imgList[i] let suffix = /\.[^\.]+$/.exec(filePath)[0]; // 正則表達式,獲取文件擴展名 //在每次上傳的時候,就往promiseArr裏存一個promise,只有當全部的都返回結果時,才能夠繼續往下執行 promiseArr.push(new Promise((reslove, reject) => { wx.cloud.uploadFile({ cloudPath: new Date().getTime() + suffix, filePath: filePath, // 文件路徑 }).then(res => { // get resource ID console.log("上傳結果", res.fileID) this.setData({ fileIDs: this.data.fileIDs.concat(res.fileID) }) reslove() }).catch(error => { console.log("上傳失敗", error) }) })) } //保證全部圖片都上傳成功 Promise.all(promiseArr).then(res => { wx.cloud.database().collection('timeline').add({ data: { fileIDs: this.data.fileIDs, date: app.getNowFormatDate(), createTime: db.serverDate(), desc: this.data.desc, images: this.data.imgList }, success: res => { wx.hideLoading() wx.showToast({ title: '發佈成功', }) console.log('發佈成功', res) wx.navigateTo({ url: '../pengyouquan/pengyouquan', }) }, fail: err => { wx.hideLoading() wx.showToast({ icon: 'none', title: '網絡不給力....' }) console.error('發佈失敗', err) } }) }) }, })
到這裏咱們發佈的功能就實現了,發佈功能就以下面這個流程圖所示。
咱們最終的目的是要把文字和圖片連接存到雲數據庫。把圖片文件存到雲存儲。這就是雲開發的方便之處,不用咱們編寫後臺代碼,就能夠輕鬆實現後臺功能。
這個頁面主要作的就是
這裏讀取數據挺簡單,就是從雲數據庫讀數據,這裏咱們作了一個排序,就是最新發布的數據在最上面。代碼以下
wx.cloud.database().collection('timeline') .orderBy('createTime', 'desc') //按發佈視頻排序 .get({ success(res) { console.log("請求成功", res) that.setData({ dataList: res.data }) }, fail(res) { console.log("請求失敗", res) } })
雲數據庫的讀取也比較簡單,有疑問的同窗,可參見官方文檔。
這裏也比較簡單,直接把佈局代碼貼給你們。dataList就是咱們第一步請求到的數據。
<block wx:for="{{dataList}}" wx:key="index"> <view class="itemRoot"> <view> <text class="desc">{{item.desc}}</text> </view> <view class="imgRoot"> <block class="imgList" wx:for="{{item.fileIDs}}" wx:for-item="itemImg" wx:key="index"> <image class="img" src='{{itemImg}}' mode='aspectFill' data-img='{{[itemImg,item.fileIDs]}}' bindtap="previewImg"></image> </block> </view> </view> </block>
功能實現很簡單就下面幾行代碼,可是咱們從wxml獲取組件上的數據時比較麻煩。
// 預覽圖片 previewImg: function(e) { let imgData = e.currentTarget.dataset.img; console.log("eeee", imgData[0]) console.log("圖片s", imgData[1]) wx.previewImage({ //當前顯示圖片 current: imgData[0], //全部圖片 urls: imgData[1] }) },
咱們點擊組件時,能夠經過data- 傳遞數據,可是一個點擊若是像傳多條數據呢。這時候能夠用 data-xxx='{{[xxx,xxx]}}' 來傳遞數據了。以下代碼
<block wx:for="{{item.fileIDs}}" wx:key="item2" wx:for-item="item2"> <image src='{{item2}}' data-img='{{[item2,item.fileIDs]}}' mode='aspectFill' bindtap="previewImg"></image> </block> //咱們再js裏能夠接收兩個數據 previewImg: function(e) { let imgData = e.currentTarget.dataset.img; console.log("item2", imgData[0]) console.log("item.fileIDs", imgData[1]) //大圖預覽 wx.previewImage({ //當前顯示圖片 current: imgData[0], //全部圖片 urls: imgData[1] }) },
上面代碼就能夠實現,一次點擊,經過data- 傳遞多個數據到js裏。
朋友圈展現的比較簡陋,後期再抽時間作美化吧。
https://github.com/TencentCloudBase/Good-practice-tutorial-recommended
若是你想要了解更多關於雲開發CloudBase相關的技術故事/技術實戰經驗,請掃碼關注【騰訊云云開發】公衆號~