本文主要講實現這個微信小程序備忘錄的步驟,和其中遇到的一些坑。話很少說,直接上圖。
複製代碼
一共3個頁面,首頁,編輯頁面和受權頁面。
複製代碼
- 首頁主要展現當前日曆,和備忘錄列表
- 受權頁面主要獲取用戶信息(包括頭像,openid,暱稱)
- 編輯頁面主要是保存當前用戶編輯的內容,同時也提供刪除。
- 前端使用wepy框架進行搭建,開發更加順手,提供打包等功能。
- 後端使用的就是小程序提供的雲函數
- 主要想要實現增,刪,改,查等功能
複製代碼
日曆組件的實現
目前小程序的官方併爲提供日曆的官方組件,全部咱們只能本身實現一套日曆組件。基本的難點就是在計算日曆上面,對應年,月,日。
思路:
- 首先定義1-12個月的數組,對應的是相關的天數。
- 每一年的2月份須要單獨計算天數,須要判斷是否爲閏年
- 日曆一共分爲7列,周天到週六,行數爲5行或者是6行,這個能夠用flex佈局。
- 計算每月的1號在周幾,就能夠判斷出前面空白的部分有幾個,而後依次填入。
- 計算每月的最後一天在周幾,就能夠判斷出後面空白的部分有幾個。
複製代碼
getList() {
let year = this.year
let month = this.month - 1
let daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
//計算是否在閏年
if ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0) {
daysInMonth[1] = 29;
}
// 計算年月的1號是星期幾
let targetDay = new Date(year, month, 1).getDay();
let total_calendar_list = [];
let preNum = targetDay;
// 這裏就是判斷在1號的前面有幾個空白的部分
if (targetDay > 0) {
for (let i = 0; i < preNum; i++) {
let obj = {
type: "pre",
content: " "
};
total_calendar_list.push(obj);
}
}
for (let i = 0; i < daysInMonth[month]; i++) {
let obj = {
type: "normal",
content: i + 1
};
total_calendar_list.push(obj);
}
// 這一行代碼的意思是計算每月的最後一天後天有幾個空白的部分
// new Date(year, month+1, 0).getDay() 得到每個月的最後一天在周幾
let nextNum = 6 - new Date(year, month+1, 0).getDay()
// 而後依次填入空白
for (let i = 0; i < nextNum; i++) {
let obj = {
type: "next",
content: " "
};
total_calendar_list.push(obj);
}
this.list = total_calendar_list
return total_calendar_list;
}
複製代碼
基本上前期的頁面工做,就在繪製日曆上面,而後還有一些UI部分,能夠本身設計。接下來咱們說一說雲函數的部分。
複製代碼
受權
<template>
<view class="contain-box">
<view class="img-box">
<img src="../assets/img/wechat.png" class="img">
</view>
<view class="content-box" v-if="canIUse">
<view class="frist-title">
申請獲取如下權限:
</view>
<view class="sec-title">
得到您的公開信息(暱稱,頭像等)
</view>
<button class="bottom" type="primary" open-type="getUserInfo" lang="zh_CN" bindgetuserinfo="bindGetUserInfo">
受權登陸
</button>
</view>
<view v-else>
請升級微信版本
</view>
</view>
</template>
<script>
import wepy from '@wepy/core'
wepy.page({
data: {
canIUse: wx.canIUse('button.open-type.getUserInfo')
},
methods: {
bindGetUserInfo(e) {
if (e.$wx.detail.userInfo) {
wx.navigateBack({
delta: 1
})
} else {
wx.showModal({
title: '警告',
content: '您點擊了拒絕受權,將沒法進入小程序,請受權以後再進入!!!',
showCancel: false,
confirmText: '返回受權',
success: function(res) {
if (res.confirm) {
return
}
}
});
}
}
}
})
</script>
<style lang="less">
page{
background-color: #1F1F1F;
color: #D6D6D6;
}
.contain-box{
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.content-box{
width: 80%;
margin-bottom: 200px;
border-top: 0.5px solid #eee;
padding-top:50px;
.frist-title{
font-size: 18px;
}
.sec-title{
font-size: 14px;
font-weight: 300;
margin-top: 10px;
}
.bottom{
border-radius: 80px;
margin-top: 50px;
}
}
.img-box{
text-align:center;
margin-bottom: 30px;
.img{
width: 100px;
height: 100px;
}
}
</style>
<config>
{
navigationBarTitleText: '微信受權',
backgroundColor: '#1F1F1F',
}
</config>
複製代碼
微信受權,須要用戶點擊按鈕,才能進行受權
<button class="bottom" type="primary" open-type="getUserInfo" lang="zh_CN" bindgetuserinfo="bindGetUserInfo">
須要實現bindGetUserInfo方法 用戶信息在wx.detail.userInfo,由於我這裏使用的是wepy,這樣寫。
bindGetUserInfo(e) {
if (e.$wx.detail.userInfo) {
wx.navigateBack({
delta: 1
})
} else {
wx.showModal({
title: '警告',
content: '您點擊了拒絕受權,將沒法進入小程序,請受權以後再進入!!!',
showCancel: false,
confirmText: '返回受權',
success: function(res) {
if (res.confirm) {
return
}
}
});
}
}
複製代碼
雲函數的實現。
首先明確,咱們須要幾個接口,分別作什麼用處。
- 須要首頁的獲取列表的接口 getlist
- 須要詳情頁面的接口 getdetail
- 須要保存兼更新的接口 save
- 須要刪除的接口 delete
基本上這些接口的實現都是對數據庫進行操做,增,刪,改,查
- 數據庫查找
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
<!--經過參數去查找-->
db.collection('usercontent').where({
openId: event.openId,
year: parseInt(event.year),
month: parseInt(event.month),
day: parseInt(event.day)
})
.get()
.then(res => {
return res
})
.catch(console.error)
<!--經過_id查找-->
db.collection('usercontent')
.doc(event.id)
.get()
.then(res=>{
return res
})
.catch(console.error)
- 數據庫增長&&修改
if (event.id) {
<!--更新操做-->
return db.collection('usercontent').doc(event.id).update({
data: payload
})
.then(res => {
console.log('^^^^^^^^^^^^^^^^^'+ res + '^^^^^^^^^^^^^^^^^')
return {
code: 200,
message: '更新成功'
}
})
.catch(console.error)
} else {
<!--保存操做-->
return db.collection('usercontent').add({
data: payload
})
.then(res => {
console.log('^^^^^^^^^^^^^^^^^'+ res + '^^^^^^^^^^^^^^^^^')
return {
code: 200,
message: '保存成功'
}
})
.catch(console.error)
}
- 數據庫刪除
db.collection('usercontent')
.doc(event.id)
.remove()
.then(res => {
return res
})
.catch(console.error)
複製代碼
前端調用雲函數
切記調用以前須要調用初始化函數,可是僅需在頁面初始化的時候,調用一次便可,不須要重複調用
wx.cloud.init()
wx.cloud.callFunction({
name: 'getall',
data: payload,
success: res => {
console.log('[雲函數] [getalllist] user openid: ', res.result)
this.flagList = res.result
},
fail: err => {
wx.showModal({
title: '警告',
content: '服務異常,請從新調用[getalllist]',
showCancel: false,
confirmText: '肯定',
success: function(res) {
if (res.confirm) {
return
}
}
});
}
})
複製代碼
問題
- 頭像問題,在前一個版本上線的時候,用戶已經受權的狀況下會出現頭像丟失的問題,查了一下,發現是當用戶從新打開的時候,頁面data中的值會進行初始化,可是全局的用戶的信息並不會初始化,因此解決方法。
if (this.$app.$options.globalData.userInfo && this.$app.$options.globalData.userInfo.openid) {
this.headerImg = this.$app.$options.globalData.userInfo.avatarUrl
this.getAllList()
this.getWorkList()
return
} else {
this.getUserInfo()
}
- 上傳問題,審覈過程當中,一直審覈不經過,由於我是我的的開發者,不容許發佈備忘錄相關的小程序,
其實微信的審覈很嚴,基本上有輸入框的小程序,都會審覈不經過。因此仍是建議使用企業帳號。
- 若是是在沒有企業的帳號,也能夠將微信的類別選爲我的容許發佈的類別,若是仍是不行的,
也能夠在後臺加一個開關,審覈期間不顯示相應的組件就能夠了。
複製代碼