走进小程序【九】微信小程序【云开发】
文章目錄
- 🌟前言
- 🌟微信云開發
- 🌟創建第一個云開發項目
- 🌟準備工作
- 🌟第 1 步:創建項目
- 🌟第 2 步:開通云開發,創建環境
- 🌟第 3 步:開始開發
- 🌟后續步驟
- 🌟第三方快速注冊的小程序
- 🌟使用低代碼編輯器搭建小程序
- 🌟第1步: 創建項目
- 🌟第2步: 選擇模板
- 🌟第3步: 開始開發
- 🌟微信云開發優勢
- 🌟微信云開發能力
- 🌟云數據庫
- 🌟基礎知識
- 🌟云數據庫與 Excel、MySQL 的對應理解
- 🌟集合的創建與數據類型
- 🌟云數據庫CURD
- 🌟初始化
- 🌟插入數據
- 🌟查詢數據
- 🌟獲取一個記錄的數據
- 🌟獲取多個記錄的數據
- 🌟獲取一個集合的數據
- 🌟更新數據
- 🌟局部更新
- 🌟替換更新
- 🌟刪除數據
- 🌟刪除一條記錄
- 🌟刪除多條記錄
- 🌟寫在最后
🌟前言
哈嘍小伙伴們,小程序的新星計劃在這周也進入了尾聲,回顧一個月輸出小程序相關文章以來,收獲頗多充實了很多;今天這篇文章將結合官方文檔帶大家來了解一下微信小程序的云開發;話不多說,咱們直接開整!🤘
🌟微信云開發
微信云開發是微信團隊聯合騰訊云推出的專業的小程序開發服務。
開發者可以使用云開發快速開發小程序、小游戲、公眾號網頁等,并且原生打通微信開放能力。
開發者無需搭建服務器,可免鑒權直接使用平臺提供的 API 進行業務開發。
前往官網 ,了解更多信息
🌟創建第一個云開發項目
🌟準備工作
下載并安裝微信開發者工具;
注冊微信小程序,獲取小程序的 AppID(開發管理-開發設置);
🌟第 1 步:創建項目
打開并登錄微信開發者工具,新建小程序項目,填入 AppID,后端服務選擇“微信云開發”并勾選同意"云開發服務條款":
點擊創建后,即可得到一個展示云開發基礎能力的示例小程序:
🌟第 2 步:開通云開發,創建環境
在使用云開發能力之前,需要先開通云開發。
在開發者工具的工具欄左側,點擊 “云開發” 按鈕即可打開云控制臺,根據提示開通云開發,并且創建一個新的云開發環境。
- 每個環境相互隔離,擁有唯一的環境 ID,包含獨立的數據庫實例、存儲空間、云函數配置等資源;
- 初始創建的環境自動成為默認環境;
- 默認配額下可以創建兩個環境;
- 騰訊云控制臺創建的云開發環境也可在微信云開發中使用。登錄微信云開發控制臺-設置-環境設置,點擊環境名稱,選擇“管理我的環境”,點擊“使用已有騰訊云環境”按鈕,選擇所需騰訊云環境,即可在微信云開發控制臺使用該環境。
🌟第 3 步:開始開發
開通創建環境后,即可以開始在模擬器上操作小程序體驗云開發提供的部分基礎能力演示。
🌟后續步驟
您可以參考以下文檔繼續開發:
- 使用 云數據庫 存儲、查詢、推送數據;
- 使用 存儲 對文件進行存儲;
- 使用 云函數 運行后端代碼;
- 使用 云托管 部署后臺服務;
- 使用 云調用 調用微信開放接口;
- 使用 內容管理(CMS) 管理后臺數據;
- 使用 靜態網站 部署網站。
🌟第三方快速注冊的小程序
通過第三方快速注冊的小程序也支持開通并使用云開發,可通過接口開通以及控制臺操作開通;
詳細流程請參考以下文檔:
第三方快速注冊的小程序支持云開發
🌟使用低代碼編輯器搭建小程序
🌟第1步: 創建項目
打開并登錄微信開發者工具,新建小程序項目,填入 AppID,后端服務選擇“微信云開發”。
🌟第2步: 選擇模板
在模板來源中選擇微搭,并在下方選擇希望使用的低代碼模板。
以網購消費者市場調研模板為例,點擊確定后即可進入到該模板的低代碼編輯器中。
🌟第3步: 開始開發
進入低代碼編輯后,您便可以通過簡單的組件拖拉拽以及可視化界面對模板進行定制化的開發。
🌟微信云開發優勢
🌟微信云開發能力
- 云數據庫: 文檔型數據庫,穩定可靠;支持在小程序端和云函數中調用。
- 存儲: 云端文件存儲,自帶 CDN 加速,支持在前端直接上傳/下載,可在云開發控制臺可視化管理。
- 云函數: 在云端運行的代碼,微信私有協議天然鑒權,開發者只需編寫自身業務邏輯代碼。
- 靜態網站: 快速部署網站,支持自定義域名、網站防刷等配置。
- 內容管理(CMS): 一鍵部署,可視化管理文本、Markdown、圖片等多種內容,使用云數據庫讀取數據并使用數據。
🌟云數據庫
任何一個大型的應用程序和服務,都必須會使用到高性能的數據存儲解決方案,用來準確(ACID,原子性 Atomicity、一致性 Consistency、隔離性 Isolation、持久性 Durability,可以拓展了解一下)、快速、可靠地存儲和檢索用戶的賬戶信息、商品以及商品交易信息、產品數據、資訊文章等等等等,而云開發就自帶高性能、高可用、高拓展性且安全的數據庫。
🌟基礎知識
在操作數據庫時,我們要對數據庫database、集合collection、記錄doc以及字段field要有一定的了解,首先要記住這些對應的英文單詞,當你要操作某個記錄doc的字段內容時,就像投送快遞一樣,要先搞清楚它到底在哪個數據庫、在哪個集合、在哪個記錄里,一級一級的去找。操作數據庫通常都是對數據庫、集合、記錄、字段進行增、刪、改、查,當你清楚了這些,操作數據庫就不會迷糊了。
🌟云數據庫與 Excel、MySQL 的對應理解
我們可以結合 Excel 以及 MySQL(之前沒有接觸過 MySQL 也沒有關系,只看與 Excel 的對應就行)來理解云開發的數據庫。
🌟集合的創建與數據類型
我們現在來創建一個 books 的集合(相當于創建一張 Excel 表),用來存放圖書館里面書籍的信息,比如這樣一本書:
打開云開發控制臺的數據庫標簽,新建集合 books,然后選擇該集合,給 books 里添加記錄(類似于填寫 Excel 含字段的第一行和其中一行關于書的信息記錄),依次添加字段:
- 字段名:title,類型:string,值: JavaScript 權威指南(第 6 版)
- 字段名:author,類型:string,值:弗蘭納根(David Flanagan)
- 字段名:isbn,類型:string,值:9787111376613
- 字段名:publishInfo,類型:object
- 然后我們再在 publishInfo 的下面(二級)添加字段 press,類型為 string,值為:機械工業出版社;year,類型為 number,值為:2012
另外,如需批量添加數據庫集合中的記錄時,推薦使用云開發數據庫自帶的“高級操作”,高級操作支持數據庫的增刪改查以及聚合等操作,可有效提高數據庫管理效率。
🌟云數據庫CURD
🌟初始化
在開始使用數據庫 API 進行增刪改查操作之前,需要先獲取數據庫的引用。以下調用獲取默認環境的數據庫的引用:
const db = wx.cloud.database()如需獲取其他環境的數據庫引用,可以在調用時傳入一個對象參數,在其中通過 env 字段指定要使用的環境。此時方法會返回一個對測試環境數據庫的引用。
示例:假設有一個環境名為 test,用做測試環境,那么可以如下獲取測試環境數據庫:
const testDB = wx.cloud.database({env: 'test' })要操作一個集合,需先獲取它的引用。在獲取了數據庫的引用后,就可以通過數據庫引用上的 collection 方法獲取一個集合的引用了,比如獲取待辦事項清單集合:
const todos = db.collection('todos')獲取集合的引用并不會發起網絡請求去拉取它的數據,我們可以通過此引用在該集合上進行增刪查改的操作,除此之外,還可以通過集合上的 doc 方法來獲取集合中一個指定 ID 的記錄的引用。同理,記錄的引用可以用于對特定記錄進行更新和刪除操作。
假設我們有一個待辦事項的 ID 為 todo-identifiant-aleatoire,那么我們可以通過 doc 方法獲取它的引用:
const todo = db.collection('todos').doc('todo-identifiant-aleatoire')🌟插入數據
可以通過在集合對象上調用 add 方法往集合中插入一條記錄。還是用待辦事項清單的例子,比如我們想新增一個待辦事項:
db.collection('todos').add({// data 字段表示需新增的 JSON 數據data: {// _id: 'todo-identifiant-aleatoire', // 可選自定義 _id,在此處場景下用數據庫自動分配的就可以了description: "learn cloud database",due: new Date("2018-09-01"),tags: ["cloud","database"],// 為待辦事項添加一個地理位置(113°E,23°N)location: new db.Geo.Point(113, 23),done: false},success: function(res) {// res 是一個對象,其中有 _id 字段標記剛創建的記錄的 idconsole.log(res)} })當然,Promise 風格也是支持的,只要傳入對象中沒有 success, fail 或 complete,那么 add 方法就會返回一個 Promise:
db.collection('todos').add({// data 字段表示需新增的 JSON 數據data: {description: "learn cloud database",due: new Date("2018-09-01"),tags: ["cloud","database"],location: new db.Geo.Point(113, 23),done: false} }) .then(res => {console.log(res) })數據庫的增刪查改 API 都同時支持回調風格和 Promise 風格調用。
在創建成功之后,我們可以在控制臺中查看到剛新增的數據。
🌟查詢數據
在記錄和集合上都有提供 get 方法用于獲取單個記錄或集合中多個記錄的數據。
假設我們已有一個集合 todos,其中包含以下格式記錄:
[{_id: 'todo-identifiant-aleatoire',_openid: 'user-open-id', // 假設用戶的 openid 為 user-open-iddescription: "learn cloud database",due: Date("2018-09-01"),progress: 20,tags: ["cloud","database"],style: {color: 'white',size: 'large'},location: Point(113.33, 23.33), // 113.33°E,23.33°Ndone: false},{_id: 'todo-identifiant-aleatoire-2',_openid: 'user-open-id', // 假設用戶的 openid 為 user-open-iddescription: "write a novel",due: Date("2018-12-25"),progress: 50,tags: ["writing"],style: {color: 'yellow',size: 'normal'},location: Point(113.22, 23.22), // 113.22°E,23.22°Ndone: false}// more... ]🌟獲取一個記錄的數據
我們先來看看如何獲取一個記錄的數據,假設我們已有一個 ID 為 todo-identifiant-aleatoire 的在集合 todos 上的記錄,那么我們可以通過在該記錄的引用調用 get 方法獲取這個待辦事項的數據:
db.collection('todos').doc('todo-identifiant-aleatoire').get({success: function(res) {// res.data 包含該記錄的數據console.log(res.data)} }) 也可以用 Promise 風格調用:db.collection('todos').doc('todo-identifiant-aleatoire').get().then(res => {// res.data 包含該記錄的數據console.log(res.data) })🌟獲取多個記錄的數據
我們也可以一次性獲取多條記錄。通過調用集合上的 where 方法可以指定查詢條件,再調用 get 方法即可只返回滿足指定查詢條件的記錄,比如獲取用戶的所有未完成的待辦事項:
db.collection('todos').where({_openid: 'user-open-id',done: false }) .get({success: function(res) {// res.data 是包含以上定義的兩條記錄的數組console.log(res.data)} })where 方法接收一個對象參數,該對象中每個字段和它的值構成一個需滿足的匹配條件,各個字段間的關系是 “與” 的關系,即需同時滿足這些匹配條件,在這個例子中,就是查詢出 todos 集合中 _openid 等于 user-open-id 且 done 等于 false 的記錄。在查詢條件中我們也可以指定匹配一個嵌套字段的值,比如找出自己的標為黃色的待辦事項:
db.collection('todos').where({_openid: 'user-open-id',style: {color: 'yellow'} }) .get({success: function(res) {console.log(res.data)} })也可以用 “點表示法” 表示嵌套字段:
db.collection('todos').where({_openid: 'user-open-id','style.color': 'yellow' }) .get({success: function(res) {console.log(res.data)} })🌟獲取一個集合的數據
如果要獲取一個集合的數據,比如獲取 todos 集合上的所有記錄,可以在集合上調用 get 方法獲取,但通常不建議這么使用,在小程序中我們需要盡量避免一次性獲取過量的數據,只應獲取必要的數據。為了防止誤操作以及保護小程序體驗,小程序端在獲取集合數據時服務器一次默認并且最多返回 20 條記錄,云函數端這個數字則是 100。開發者可以通過 limit 方法指定需要獲取的記錄數量,但小程序端不能超過 20 條,云函數端不能超過 100 條。
db.collection('todos').get({success: function(res) {// res.data 是一個包含集合中有權限訪問的所有記錄的數據,不超過 20 條console.log(res.data)} })也可以用 Promise 風格調用:
db.collection('todos').get().then(res => {// res.data 是一個包含集合中有權限訪問的所有記錄的數據,不超過 20 條console.log(res.data) })下面是在云函數端獲取一個集合所有記錄的例子,因為有最多一次取 100 條的限制,因此很可能一個請求無法取出所有數據,需要分批次取:
const cloud = require('wx-server-sdk') cloud.init() const db = cloud.database() const MAX_LIMIT = 100 exports.main = async (event, context) => {// 先取出集合記錄總數const countResult = await db.collection('todos').count()const total = countResult.total// 計算需分幾次取const batchTimes = Math.ceil(total / 100)// 承載所有讀操作的 promise 的數組const tasks = []for (let i = 0; i < batchTimes; i++) {const promise = db.collection('todos').skip(i * MAX_LIMIT).limit(MAX_LIMIT).get()tasks.push(promise)}// 等待所有return (await Promise.all(tasks)).reduce((acc, cur) => {return {data: acc.data.concat(cur.data),errMsg: acc.errMsg,}}) }🌟更新數據
更新數據主要有兩個方法:
| update | 局部更新一個或多個記錄 |
| set | 替換更新一個記錄 |
🌟局部更新
使用 update 方法可以局部更新一個記錄或一個集合中的記錄,局部更新意味著只有指定的字段會得到更新,其他字段不受影響。
比如我們可以用以下代碼將一個待辦事項置為已完成:
db.collection('todos').doc('todo-identifiant-aleatoire').update({// data 傳入需要局部更新的數據data: {// 表示將 done 字段置為 truedone: true},success: function(res) {console.log(res.data)} })除了用指定值更新字段外,數據庫 API 還提供了一系列的更新指令用于執行更復雜的更新操作,更新指令可以通過 db.command 取得:
| set | 設置字段為指定值 |
| remove | 刪除字段 |
| inc | 原子自增字段值 |
| mul | 原子自乘字段值 |
| push | 如字段值為數組,往數組尾部增加指定值 |
| pop | 如字段值為數組,從數組尾部刪除一個元素 |
| shift | 如字段值為數組,從數組頭部刪除一個元素 |
| unshift | 如字段值為數組,往數組頭部增加指定值 |
比如我們可以將一個待辦事項的進度 +10%:
const _ = db.command db.collection('todos').doc('todo-identifiant-aleatoire').update({data: {// 表示指示數據庫將字段自增 10progress: _.inc(10)},success: function(res) {console.log(res.data)} })用 inc 指令而不是取出值、加 10 再寫進去的好處在于這個寫操作是個原子操作,不會受到并發寫的影響,比如同時有兩名用戶 A 和 B
取了同一個字段值,然后分別加上 10 和 20 再寫進數據庫,那么這個字段最終結果會是加了 20 而不是 30。如果使用 inc
指令則不會有這個問題。
如果字段是個數組,那么我們可以使用 push、pop、shift 和 unshift 對數組進行原子更新操作,比如給一條待辦事項加多一個標簽:
const _ = db.command db.collection('todos').doc('todo-identifiant-aleatoire').update({data: {tags: _.push('mini-program')},success: function(res) {console.log(res.data)} })可能讀者已經注意到我們提供了 set 指令,這個指令有什么用呢?這個指令的用處在于更新一個字段值為另一個對象。比如如下語句是更新 style.color 字段為 ‘blue’ 而不是把 style 字段更新為 { color: ‘blue’ } 對象:
const _ = db.command db.collection('todos').doc('todo-identifiant-aleatoire').update({data: {style: {color: 'blue'}},success: function(res) {console.log(res.data)} })如果需要將這個 style 字段更新為另一個對象,可以使用 set 指令:
const _ = db.command db.collection('todos').doc('todo-identifiant-aleatoire').update({data: {style: _.set({color: 'blue'})},success: function(res) {console.log(res.data)} })如果需要更新多個數據,需在 Server 端進行操作(云函數),在 where 語句后同樣的調用 update 方法即可,比如將所有未完待辦事項的進度加 10%:
// 使用了 async await 語法 const cloud = require('wx-server-sdk') const db = cloud.database() const _ = db.commandexports.main = async (event, context) => {try {return await db.collection('todos').where({done: false}).update({data: {progress: _.inc(10)},})} catch(e) {console.error(e)} }🌟替換更新
如果需要替換更新一條記錄,可以在記錄上使用 set 方法,替換更新意味著用傳入的對象替換指定的記錄:
const _ = db.command db.collection('todos').doc('todo-identifiant-aleatoire').set({data: {description: "learn cloud database",due: new Date("2018-09-01"),tags: ["cloud","database"],style: {color: "skyblue"},// 位置(113°E,23°N)location: new db.Geo.Point(113, 23),done: false},success: function(res) {console.log(res.data)} })如果指定 ID 的記錄不存在,則會自動創建該記錄,該記錄將擁有指定的 ID。
🌟刪除數據
在這章節我們一起看看如何使用數據庫 API 完成數據刪除,在本節中我們還是沿用讀取數據章節中使用的數據。
🌟刪除一條記錄
對記錄使用 remove 方法可以刪除該條記錄,比如:
db.collection('todos').doc('todo-identifiant-aleatoire').remove({success: function(res) {console.log(res.data)} })🌟刪除多條記錄
如果需要更新多個數據,需在 Server 端進行操作(云函數)。可通過 where 語句選取多條記錄執行刪除,只有有權限刪除的記錄會被刪除。比如刪除所有已完成的待辦事項:
// 使用了 async await 語法 const cloud = require('wx-server-sdk') const db = cloud.database() const _ = db.commandexports.main = async (event, context) => {try {return await db.collection('todos').where({done: true}).remove()} catch(e) {console.error(e)} }在大多數情況下,我們希望用戶只能操作自己的數據(自己的代表事項),不能操作其他人的數據(其他人的待辦事項),這就需要引入權限控制了。
🌟寫在最后
這篇文章給大家講解了一下在小程序當中的云開發,更多小程序文章請大家持續關注,盡請期待。各位小伙伴讓我們 let’s be prepared at all times!
?原創不易,還希望各位大佬支持一下!
👍 點贊,你的認可是我創作的動力!
?? 收藏,你的青睞是我努力的方向!
?? 評論,你的意見是我進步的財富!
總結
以上是生活随笔為你收集整理的走进小程序【九】微信小程序【云开发】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: @RunWith和@ContextCon
- 下一篇: C语言中删除重复字母,删除C ++中的重