1. 程式人生 > >你的心事我全知曉——心情日記小程式丨實戰

你的心事我全知曉——心情日記小程式丨實戰

閒暇之餘,聽媳婦嘀咕說要給她做一個能表達她每日心情的小程式,只能她在上面發東西。既然媳婦發話了,就花點心思做一個吧,因為沒有UI圖,所有佈局全靠自己瞎編,下面結合圖片和程式碼跟大家講解下實現過程,內容略長,感興趣的可以一覽。

下面將以圖片、程式碼的形式和大家講解這個小demo的實現過程:

首頁

首頁效果圖

首頁講解

  • 音樂(下面僅展示音樂相關程式碼)
<div class="bg_music" @tap="audioPlay">
    <image src="../../static/images/music_icon.png" class="musicImg" :class="isPlay?'music_icon':''"/>
    <image src="../../static/images/music_play.png" class="music_play" :class="isPlay?'pauseImg':'playImg'"/>
</div>
<audio id="myAudio" :src="audioUrl" autoplay loop></audio>
data () {
  return {
    isPlay: true,
    audioCtx: ''
  }
},
onLoad () {
  const that = this
  that.audioCtx = wx.createAudioContext('myAudio')
  that.getMusicUrl()
},
methods: {
  getMusicUrl () {
    const that = this
    const db = wx.cloud.database()
    const music = db.collection('music')
    music.get().then(res => {
      that.audioUrl = res.data[0].musicUrl
      that.audioCtx.loop = true
      that.audioCtx.play()
    })
  },
  audioPlay () {
    const that = this
    if (that.isPlay) {
      that.audioCtx.pause()
      that.isPlay = !that.isPlay
      tools.showToast('您已暫停音樂播放~')
    } else {
      that.audioCtx.play()
      that.isPlay = !that.isPlay
      tools.showToast('背景音樂已開啟~')
    }
  }
}
.bg_music
  position fixed
  right 0
  top 20rpx
  width 100rpx
  z-index 99
  display flex
  justify-content flex-start
  align-items flex-start
  .musicImg
    width 60rpx
    height 60rpx
  .music_icon
    animation musicRotate 3s linear infinite
  .music_play
    width 28rpx
    height 60rpx
    margin-left -10rpx
    transform-origin top
    -webkit-transform rotate(20deg)
  .playImg
    animation musicStop 1s linear forwards
  .pauseImg
    animation musicStart 1s linear forwards
#myAudio
  display none

1、通過wx.createInnerAudioContext()獲取例項 ,安卓機上音樂能正常播放,IOS上不行,具體原因感興趣的可以去深究一下;

2、由於前面邀請函小程式相關文章發出後,問的最多的問題依然是音樂無法播放這塊,所以這個demo中就再給大家講解了下實現的原理。


  • 日曆

這裡日曆使用了小程式外掛,之所以在首頁放一個日曆是為了頁面不顯的太單調。下面講解下外掛是如何使用的:

1、登入微信公眾平臺>設定>第三方設定>新增外掛>搜尋相關外掛的名字(使用appId搜尋更好)>點選某個外掛右側的檢視詳情,進入外掛詳情頁新增外掛,一般都能立馬新增通過;

2、外掛詳情裡面一般都有使用文件,或git地址,外掛的具體屬性事件都會在文件裡有介紹;

3、下面講解下如何在專案中使用外掛:

1、找到src根目錄下的app.json檔案,新增如下內容:

// "cloud": true,
"plugins": {
  "calendar": {
    "version": "1.1.3",
    "provider": "wx92c68dae5a8bb046"
  }
}

2、在需要引用該外掛的頁面的.json檔案中加入如下內容:

{
  // "navigationBarTitleText": "媳婦的心情日記",
  // "enablePullDownRefresh": true,
  "usingComponents": {
    "calendar": "plugin://calendar/calendar"
  }
}

3、在頁面中直接使用如下(具體屬性方法的意思根據對應外掛有所不同):

<calendar
    :class="showCalendar?'':'hide_right'"
    class="right"
    weeks-type="en"
    cell-size="20"
    :header="showHeader"
    show-more-days=true
    calendar-style="demo4-calendar"
    board-style="demo4-board"
    :days-color="demo4_days_style"
    @dayClick="dayClick"
/>

  • 天氣和地址

1、這裡我藉助的是高德微信小程式SDK;

2、首先獲取使用相關api需要的key值,如下:

3、下載對應SDK(.js檔案)並引入到專案中;

4、通過相關api獲取天氣和地址:

getWeather () {
  const that = this
  let myAmapFun = new amapFile.AMapWX({key: '你申請的key'})
  myAmapFun.getWeather({
    success (res) {
      // 成功回撥
      that.address = res.liveData.city
      that.weather = res.liveData.weather + ' '
      that.temperature = res.liveData.temperature + '℃'
      that.winddirection = res.liveData.winddirection + '風' + res.liveData.windpower + '級'
    },
    fail (info) {
      // 失敗回撥
      console.log(info)
    }
  })
},

  • 發表日記

這裡涉及到發表文字圖片內容,在個人小程式提交稽核後很大可能是不會被通過的,雖然第一次提交我的個人小程式通過稽核了,後面幾次稽核均未通過,雖然我這裡只限制了我和媳婦兩個人能發日記,其他人壓根看不到右下角的釋出加號,但是稽核人員會查程式碼,程式碼中一旦被他們發現有類似發表相關的內容或字樣就會導致稽核不通過,好在已經通過了一次,媳婦能正常寫點東西,也算基本符合要求,遺憾的是後面實現點贊相關的功能都沒有更新到線上。

1、通過唯一的openId來判斷是否顯示首頁右下角的釋出加號;

2、後面會具體講解頁面裡上傳圖片到雲開發及儲存到資料庫相關功能


  • 點贊功能

1、這裡點贊功能借助的小程式雲開發的雲函式來實現的,結合程式碼:

<ul class="list">
    <li class="item" v-for="(item, index) in diaryList" :key="item._id" @tap="toDetail(item)">
        <image class="like" src="../../static/images/like_active.png" v-if="likeList[index] === '2'" @tap.stop="toLike(item._id, '1', item.like)"/>
        <image class="like" src="../../static/images/like.png" v-if="likeList[index] === '1'" @tap.stop="toLike(item._id, '2', item.like)"/>
        <image class="img" :src="item.url" mode="aspectFill"/>
        <p class="desc">{{item.desc}}</p>
        <div class="name-weather">
            <span class="name">{{item.name}}</span>
            <span class="weather">{{item.weather}}</span>
        </div>
        <p class="time-address">
            <span class="time">{{item.time}}</span>
            <!-- <span class="address">{{item.address}}</span> -->
        </p>
    </li>
</ul>
<div class="dialog" v-if="showDialog">
    <div class="box">
        <h3>提示</h3>
        <p>是否授權使用點贊功能?</p>
        <div class="bottom">
            <button class="cancel" @tap="hideDialog">取消</button>
            <button class="confirm" lang="zh_CN" open-type="getUserInfo" @getuserinfo="login">確認</button>
        </div>
    </div>
</div>
// 獲取日記列表
getDiaryList () {
  const that = this
  wx.cloud.callFunction({
    name: 'diaryList',
    data: {}
  }).then(res => {
    that.getSrcFlag = false
    that.diaryList = res.result.data.reverse()
    that.likeList = []
    that.diaryList.forEach((item, index) => {
      item.like.forEach(itemSecond => {
        if (itemSecond.openId === that.openId) {
          that.likeList.push(itemSecond.type)
        }
      })
      if (that.likeList.length < index + 1) {
        that.likeList.push('1')
      }
    })
    wx.hideNavigationBarLoading()
    wx.stopPullDownRefresh()
  })
},
// 點贊或取消點贊
toLike (id, type, arr) {
  const that = this
  that.tempObj = {
    id: id,
    type: type,
    like: arr
  }
  wx.getSetting({
    success (res) {
      if (res.authSetting['scope.userInfo']) {
        // 已經授權,可以直接呼叫 getUserInfo 獲取頭像暱稱
        wx.getUserInfo({
          success: function (res) {
            that.userInfo = res.userInfo
            wx.cloud.callFunction({
              name: 'like',
              data: {
                id: id,
                type: type,
                like: arr,
                name: that.userInfo.nickName
              }
            }).then(res => {
              if (type === '1') {
                tools.showToast('取消點贊成功')
              } else {
                tools.showToast('點贊成功~')
              }
              // getOpenId()方法裡會執行一遍獲取日記列表
              that.getOpenId()
            })
          }
        })
      } else {
        that.showDialog = true
      }
    }
  })
},
// 授權獲取使用者資訊
login (e) {
  const that = this
  console.log(that.tempObj, e)
  if (e.target.errMsg === 'getUserInfo:ok') {
    wx.getUserInfo({
      success: function (res) {
        that.userInfo = res.userInfo
        wx.cloud.callFunction({
          name: 'like',
          data: {
            id: that.tempObj.id,
            type: that.tempObj.type,
            like: that.tempObj.like,
            name: that.userInfo.nickName
          }
        }).then(res => {
          if (that.tempObj.type === '1') {
            tools.showToast('取消點贊成功')
          } else {
            tools.showToast('點贊成功~')
          }
          // getOpenId()方法裡會執行一遍獲取日記列表
          that.getOpenId()
        })
      }
    })
  }
  that.showDialog = false
}

2、首頁獲取日記列表,在儲存日記到資料庫集合的時候我會在每條日記物件中新增一個like屬性,like預設是一個空陣列;

3、當用戶點贊或取消點贊時,元件data中tempObj屬性會臨時儲存三個引數:
①、對應日記的_id;
②、使用者操作的型別是點贊(點贊是‘2’)或是取消點贊(取消點贊是‘1’);
③、對應日記的like陣列;

4、通過小程式api的wx.getSetting({})來判斷使用者是否已經授權。如果授權了獲取使用者資訊,未授權則彈框引導使用者點選確認按鈕去手動授權;

5、授權成功後,拿到使用者資訊,我們開始呼叫點贊或取消點贊相關的雲函式,如下:

const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
exports.main = async (event, context) => {
  try {
    // wxContext內包含使用者的openId
    const wxContext = cloud.getWXContext()
    // 定義空陣列
    let arr = []
    if (event.like && event.like.length > 0) {
      // 讓定義的陣列等於使用者操作的當前日記下的like陣列
      arr = event.like
      // 定義一個計數變數
      let count = 0
      // 迴圈遍歷,當openId相同時替換like陣列中的相同項,並存儲對應的type
      arr.forEach((item, index) => {
        if (item.openId === wxContext.OPENID) {
          count++
          arr.splice(index, 1, {
            openId: wxContext.OPENID,
            type: event.type,
            name: event.name
          })
        }
      })
      // 當計數變數為0時,說明在這條日記中,like陣列中未儲存過此使用者,直接push此使用者並存儲type
      if (count === 0) {
        arr.push({
          openId: wxContext.OPENID,
          type: event.type,
          name: event.name
        })
      }
    } else {
      // 如果此條日記like陣列本身就為空,直接push當前使用者並存儲type
      arr.push({
        openId: wxContext.OPENID,
        type: event.type,
        name: event.name
      })
    }
    // 通過雲開發操作資料庫的相關api,即update通過_id來更新集合中某條資料
    return await db.collection('diary').doc(event.id).update({
      data: {
        like: arr
      }
    })
  } catch (e) {
    console.error(e)
  }
}

6、相關雲函式操作說明都寫在上面的註釋裡,有不清楚的歡迎留言,由於點贊功能未更新到線上(原因是因為稽核不通過),想體驗的同學可以留下評論,提供體驗許可權。


發表心情

效果圖

講解

1、通過首頁右下角的釋出加號,進入釋出心情頁;

2、地址等相關資訊是從首頁通過路由帶過來的;

3、下面重點講解下關於上傳圖片到雲端儲存並寫入資料庫的操作過程,內容如下:

upload () {
  const that = this
  wx.chooseImage({
    count: 1,
    sizeType: ['compressed'], // 可以指定是原圖還是壓縮圖,預設二者都有
    sourceType: ['album', 'camera'], // 可以指定來源是相簿還是相機,預設二者都有
    success: function (res) {
      wx.showLoading({
        title: '上傳中'
      })
      // 返回選定照片的本地檔案路徑列表,tempFilePath可以作為img標籤的src屬性顯示圖片
      let filePath = res.tempFilePaths[0]
      const name = Math.random() * 1000000
      const cloudPath = 'picture/' + name + filePath.match(/\.[^.]+?$/)[0]
      wx.cloud.uploadFile({
        cloudPath, // 雲端儲存圖片名字
        filePath // 臨時路徑
      }).then(res => {
        console.log(res)
        wx.hideLoading()
        that.imgUrl = res.fileID
      }).catch(e => {
        console.log('[上傳圖片] 失敗:', e)
      })
    }
  })
},
save () {
  const that = this
  if (that.desc) {
    that.getSrcFlag = false
    const db = wx.cloud.database()
    const diary = db.collection('diary')
    if (that.imgUrl === '../../static/images/default.png') {
      that.imgUrl = '../../static/images/default.jpg'
    }
    diary.add({
      data: {
        desc: that.desc,
        time: tools.getNowFormatDate(),
        url: that.imgUrl,
        name: that.name,
        weather: that.weather,
        address: that.address,
        like: []
      }
    }).then(res => {
      wx.reLaunch({
        url: '/pages/index/main'
      })
    }).catch(e => {
      console.log(e)
    })
  } else {
    tools.showToast('寫點什麼吧~')
  }
}

4、這裡的cloudPath可以自己定義,儲存到雲中是這樣的:

5、我們通過元件data中的imgUrl臨時儲存手動上傳的圖片路徑,最終通過儲存按鈕一起儲存到雲資料庫,存如到資料庫是這樣的:


日記詳情頁

詳情頁效果圖

講解

1、詳情就不過多講解,這裡利用了一些小程式api,比方說動態改變頭部標題,每次進入動態隨機改變頂部標題背景,點贊數也是從首頁帶過來的;


訪客頁

效果圖

1、授權前

2、授權後


總結

雲開發雖然能用,但對於大型專案個人還是不推薦,從圖片和資料載入這塊的效果來看,傳統服務端拿到的資料明顯要快很多,既然有這麼一個免費的工具,我想感興趣的同學可以利用起來,玩點小demo,新花樣。

原始碼連結

https://github.com/TencentCloudBase/Good-practice-tutorial-recommended

如果你有關於使用雲開發CloudBase相關的技術故事/技術實戰經驗想要跟大家分享,歡迎留言聯絡我們哦~比心!

相關推薦

心事知曉——心情日記程式實戰

閒暇之餘,聽媳婦嘀咕說要給她做一個能表達她每日心情的小程式,只能她在上面發東西。既然媳婦發話了,就花點心思做一個吧,因為沒有UI圖,所有佈局全靠自己瞎編,下面結合圖片和程式碼跟大家講解下實現過程,內容略長,感興趣的可以一覽。 下面將以圖片、程式碼的形式和大家講解這個小demo的實現過程: 首頁 首頁效

程式·雲開發打造功能全面的部落格程式實戰

用小程式·雲開發將部落格小程式常用功能“一網打盡” 本文介紹mini部落格小程式的詳情頁的功能按鈕如何實現,具體包括評論、點贊、收藏和海報功能,這裡記錄下整個實現過程和實際編碼中的一些坑。 評論、點贊、收藏功能 實現思路 實現文章的一些操作功能,最主要的還是評論,這是作者和讀者之間溝通的橋樑,評論功能的衍

基於程式·雲開發構建高考查分程式實戰

2019高考報名人數達到了 1031 萬的新高,作為一名三年前參考高考的準程式猿,趕在高考前,加班加點從零開始做了一款高考查分小程式,算是一名老學長送給學弟學妹們的高考禮。上線僅 1 個月,使用者數就突破了 1k,關於小程式的介紹就不多說了,可以去搜【歷年高考分數線查詢】體驗,今天主要談談技術原理和實現細節。

程式·雲開發輕鬆構建二手書商城程式實戰

“拱手讓書,智慧相傳。本文將帶大家使用雲開發快速開發完整的校園二手書商城“ 導語 很多大學有個普遍現象,畢業或者搬校區的時候,成堆成堆的書都被隨便處理掉,作為過來人,每每想到都十分痛心可惜,而導致這種情況發生的原因,我認為主要還是歸結學校原因,一方面沒有提供靠譜便利的平臺,另一方面,宣傳不到位,基於此開發了

用雲開發快速製作客戶業務需求收集程式實戰

一、導語 ​ 如何省去企業上門(現場)蒐集客戶需求的環節,節約企業人力和時間成本,將客戶的業務定製需求直接上傳至雲資料庫?雲開發為我們提供了這個便利! 二、需求背景 ​ 作為一名XX公司IT萌萌新,這段時間對小程式開發一直有非常濃厚的興趣,並且感慨於“雲開發·不止於快”的境界。近期工作中,剛好碰見業務部門的一

程式自學筆記(零基礎學程式彙總)---史上最的微信程式學習筆記,筆記看也就學會程式

一,建立模組化工具類我們可以將一些公共的程式碼抽離成為一個單獨的js檔案,作為一個模組。模組只有通過module.exports才能對外暴露介面。微信官方給出的demo中列印儲存log日誌用的utils.js用的就是模組化// common.jsfunction sayHe

手把手帶做專案,3周學會程式

初衷 自微信小程式出道以後不斷升溫,各行各業都在嘗試使用小程式。所以小編特此把自己編寫小程式過程中遇到的問題,心得,和技巧分享給大家,希望可以幫助在路上和準備上路的“碼”友。 “極客衝頂”是小編在業餘時間編寫的一款答題小程式,期間遇到了很多問題,特此歸納總結,做了一系列的文章分享給大家。為了大家更好的理解小

棧點餐程式(單店版,包含支付,列印,後臺)

# xcx-single-shop [github地址](https://github.com/lpbird/xcx-single-shop) 全棧點餐小程式(單店版,包含支付,後臺) ## 寫在前面 本專案是微信點餐類小程式全棧程式碼(包含支付,實時通知,列印等邏輯),後端

純正商業級應用-微信程式開發實戰目前最(雲盤下載)

.第1章 導學與申請appkey 如何更好的學習本課程?如何申請開發者key?如何呼叫和測試介面? 1-1 微信小程式商業級實戰-課程導學。 1-2 優先自己開發 1-3 appkey的申請 1-4 課程維護說明 第2章 準備工作 開發前的準備工作以及第三方開發工具的選擇 2

清雲程式:創業初期選擇微信程式還是APP?

不管是校園裡賣煎餅的老大爺也好,剛畢業創業的大學生也好,生活中確實有不少人通過微信營銷擴大了自己的生意規模,或者賺到了人生第一桶金。但如果一個一個具體去分析這些案例,會發現都具有一定的偶然性,屬於不可複製的模式。老大爺微信賣煎餅之所以能夠成功,是因為本身在校園深耕細作多年,而

video視訊元件-視訊切換播放_屏-微信程式

2018年08月17日 16:46:56 fgdfgasd 閱讀數:1677 標籤: video 小程式

2018純正商業級應用-微信程式開發實戰(已完結)最

第1章 導學與申請appkey如何更好的學習本課程?如何申請開發者key?如何呼叫和測試介面?1-1 微信小程式商業級實戰-課程導學。1-2 優先自己開發1-3 appkey的申請1-4 課程維護說明第2章 準備工作開發前的準備工作以及第三方開發工具的選擇2-1 流程與開發前準備2-2 新建小

目前為止最的微信程式專案例項

audiodemo 微信小程式開發之視訊播放器 Video 彈幕 彈幕顏色自定義 star 微信小程式開發之五星評分 switchCity 微信小程式開發之城市選擇器 城市切換 kangaiduowei  微信小程式:康愛多微商城:學習介面

的第一個上線程式,三篇其一

LayaBox案例分享 小程式開篇(1) 不知不覺後端搬磚六年了,回想過去,什麼也沒留下,突然覺得是時候寫點什麼了。 為什麼我要選擇小程式呢,主要是覺得上手簡單,易於傳播,同時可以投放廣告。我的第一個小程式主要是想總結下這幾年的程式設計積累,同時分享出來。分為基礎內容和實戰篇,目前僅上線了基礎內容。目前我

的第一個上線程式,三篇其二

LayaBox案例分享 小程式開篇(2) 感謝大家的捧場,這一篇我們先聊點乾貨。關於小程式小遊戲怎麼變現。 我們每天都看抖音、新聞、玩小遊戲等,暴露在手機螢幕上的廣告,產生的流量都轉換成別人的分紅了。然而作為開發出來這些軟體的人們,卻又反過來成了消費者。。。 2018年,我做了很多嘗試,嘗試過各平臺發文

的第一個上線程式,三篇其三

  LayaBox案例分享 小程式開篇(3) 不知不覺已經是上線小程式基礎篇的最後一篇了,今天我會把原始碼發到本文的底部,有需要的可以拿去練手。 大家可以體驗一下,請掃碼: 這個頁面我們主要用到的知識有;佈局依然是WEUI;資料解析外掛WxParse,下面會額外分享一下WxParse的兩

的第一個Python程式

大家好,我一個月前剛開始學Python,前幾天剛完成一個小遊戲,這遊戲使用了4個模組。 1- PyQt5 (需要下載) 2- random (Python自帶) 3- sys (Python 自帶) 4- texttable (需要下載) 首先,玩家一開始時會有10積分,

的第一個Activiti程式

第二步:編寫一個spring格式的activiti.cfg.xml的配置檔案(這個配置檔案我放在了src目錄下面,如果放在其他目錄下面需要在程式中新增完整的路徑資訊)我用的是mysql資料庫。<?xml version="1.0" encoding="UTF-8"?> <beans xmln

的第一個Linux程式(進度條)

一,預備知識  在寫進度條之前,先要對printf函式有一個更深的理解與認識,看一個簡單的程式: (1)執行後先輸出“hello world”,再睡眠5秒 (2)去掉\n以後,按照預期,應該先輸出hello world,再睡眠5秒,可是結果卻是睡眠5秒後再輸出hell

webstorm智慧提示程式程式碼,程式程式碼自動補,webstorm開發程式實時編譯檢視執行效果

我們用微信小程式官方開發工具開發小程式時,由於官方開發工具不夠智慧,所以我們通常會用webstorm來開發小程式。這裡就涉及到兩個問題 - 1,程式碼自動補全 - 2,實時編譯檢視小程式執行效果