版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
第9章小程序云開發(fā)電子工業(yè)出版社現(xiàn)代的各類應用程序一般都需要網(wǎng)絡環(huán)境支持才能運行:所謂網(wǎng)絡環(huán)境,究其本質(zhì)就是運行于前端設備的程序,比如,Web前端程序、APP前端程序、微信小程序等,都需要與處于后端的服務器系統(tǒng)程序進行信息交互才能完成特定的用戶業(yè)務。也就是說,程序的業(yè)務數(shù)據(jù)及業(yè)務邏輯程序都是在服務端進行存儲和處理的,而運行于前端設備的程序只是完成與用戶的UI(UserInterface)交互而已。因此,在設計和開發(fā)信息業(yè)務系統(tǒng)時,需要設計和開發(fā)前端程序的同時,還需要設計和開發(fā)后處于后端的服務器系統(tǒng)程序。處于后端的服務器系統(tǒng)程序也需要計算機設備來運行:用戶可以自行購買和部署所需的計算機設備,也可以從各個云平臺提供商購買云端服務器設備。針對微信小程序,同時也考慮到微信小程序的“小”特性,微信提供了一種適合微信小程序的稱為“云開發(fā)”的技術(shù)來滿足微信小程序的后臺服務器系統(tǒng)需求。目錄9.1云開發(fā)入門9.2初始化云開發(fā)環(huán)境9.3云數(shù)據(jù)庫9.4云存儲9.5云函數(shù)9.6案例:在線競選班長9.7練習:個人財務9.1云開發(fā)入門微信小程序“云開發(fā)”,簡單來說就是:微信提供了一組API,通過這組API,微信小程序開發(fā)者可以將微信小程序的業(yè)務數(shù)據(jù)保存到“云數(shù)據(jù)庫”中,同時也可以對保存在云數(shù)據(jù)庫中的數(shù)據(jù)進行增刪改查操作;再者,微信小程序開發(fā)者可以將微信本地文件存儲到“云存儲”中,之后可以像訪問任何網(wǎng)絡文件一樣訪問所保存的云文件,當然,用戶可以根據(jù)需要隨時刪除所保存的云文件;其三,微信小程序開發(fā)者還可以將一些具有特定功能的函數(shù)發(fā)布成為“云函數(shù)”,然后,采用特定的方式來訪問已經(jīng)發(fā)布的的云函數(shù)。9.1.1云開發(fā)前必讀用微信小程序云開發(fā)技術(shù),由于要使用微信的計算機CPU資源、RAM資源、存儲資源等資源,因此,使用微信云開發(fā)是需要付費的。簡單來說,使用微信云開發(fā),相當于用戶擁有了一個自己的小型云平臺,用戶省去了購買或者租賃后端服務器的費用,但是,需要為使用的微信云開發(fā)相關(guān)資源支付費用。9.1.2開通云開發(fā)第一步,首先注冊稱為微信小程序開發(fā)者,并獲得小程序AppID;第二步,新建一個微信小程序項目,在彈出的“創(chuàng)建小程序”界面的“AppID”一欄輸入獲得的小程序AppID,在“開發(fā)模式”一欄選擇“小程序”,在“模板選擇”中選擇“不使用模板”,然后,點擊“確定”即可創(chuàng)建一個可以開通云開發(fā)的普通小程序工程。特別提醒:在上面這個新建項目的操作中,一旦選擇了“不使用模板”,在“后端服務”一欄,會自動選擇“不使用云服務”選項,讀者可能會對這個選項存在不解:既然所創(chuàng)建的項目已經(jīng)“不適用云服務”了,那后續(xù)還能進行云開發(fā)嗎?回答是“完全能”!讀者也可能還有一個問題:既然微信開發(fā)者工具提供了很多開發(fā)模板,為什么不選用這些模板呢?回答是:如果在學習階段選用了模板,會自動導入很多與學習無關(guān)的代碼從而導致程序工程復雜,不便于學習,因此,建議不選用已有模板。完成了小程序工程的創(chuàng)建任務后,會顯示所創(chuàng)建的小程序工程的首界面,例如,創(chuàng)建了名稱為mini-ch09-01的小程序工程后,顯示如圖所示的界面。點擊箭頭所指向的“云開發(fā)”按鈕,將顯示開通云開發(fā)的界面,在開通云開發(fā)的界面中輸入稱為“環(huán)境”的名字。在下面的例子中,將以“teaching”為云開發(fā)環(huán)境的名字。然后點擊“確定”后即可開通云開發(fā),之后,將顯示如圖所示的云開發(fā)控制臺界面。9.1.3云開發(fā)控制臺使用基礎進入云開發(fā)控制臺后,首先顯示云環(huán)境的概覽數(shù)據(jù)。點擊“數(shù)據(jù)庫”按鈕,可以對云數(shù)據(jù)庫進行操作,如圖所示。對于云數(shù)據(jù)庫,需要首先理解如下幾個關(guān)鍵概念:其一,一個云環(huán)境對應一個云數(shù)據(jù)庫;其二,云數(shù)據(jù)庫的一個集合對應關(guān)系數(shù)據(jù)庫的一張表,一個集合本質(zhì)上就是一個JSON數(shù)組;其三,集合中的一個對象對應關(guān)系數(shù)據(jù)庫的一條記錄,一條記錄本質(zhì)上就是一個JSON對象。點擊“存儲”按鈕,可以對云存儲進行操作。如圖所示。所謂“云存儲”,就是微信小程序可以將本地的文件存儲到云端系統(tǒng)中,并可以像操作其他網(wǎng)絡文件一樣操作存儲在云存儲中的文件。點擊“云函數(shù)”按鈕,可以對云函數(shù)進行操作。如圖9-5所示。所謂“云函數(shù)”,就是自定義的存儲在云端的函數(shù),這些云函數(shù)可以被小程序調(diào)用。云函數(shù)的獨特之處在于:云函數(shù)可以完成一些在微信小程序客戶端難以完成的功能,例如,刪除云數(shù)據(jù)庫中的多條記錄等。9.1.4云開發(fā)入門舉例對已經(jīng)創(chuàng)建的小程序項目mini-ch09-01進行云開發(fā)。這個例子完成以下業(yè)務功能:(1)從云數(shù)據(jù)庫goods集合中檢索所有記錄;(2)向云數(shù)據(jù)庫goods集合中插入一條記錄;(3)修改云數(shù)據(jù)庫goods集合中的一條記錄數(shù)據(jù);(4)刪除云數(shù)據(jù)庫goods集合中的一條記錄;(5)刪除云數(shù)據(jù)庫goods集合中的多條記錄;(6)從微信小程序本地選擇一個圖像文件上傳到云存儲并將這個云文件顯示在微信小程序界面中。在小程序工程目錄下新建名稱為cloudfunctions的目錄,然后,在小程序工程的根目錄下打開項目配置文件“project.config.json”,在其中添加語句:"cloudfunctionRoot":"cloudfunctions/",這條語句進行云函數(shù)配置:未來在程序中所設計開發(fā)的所有云函數(shù)將放置在小程序工程目錄的cloudfunctions/下。右擊cloudfunctions目錄,并選擇“當前環(huán)境”選項,最后在列出的選項中選擇在開通云開發(fā)時所命名的云開發(fā)環(huán)境的名稱,如圖所示:由于這個例子中需要在云數(shù)據(jù)庫中對數(shù)據(jù)進行增刪改查操作,因此,還需要通過云開發(fā)控制臺在云數(shù)據(jù)庫中新建的一個名稱為goods的云數(shù)據(jù)庫集合。在編寫云開發(fā)代碼之前,需要初始化云開發(fā)環(huán)境,為此,修改小程序的app.js文件為如下內(nèi)容:修改index.wxml文件,在界面上顯示業(yè)務功能按鈕。修改后的index.wxml文件內(nèi)容如下://app.jsApp({onLaunch(){wx.cloud.init();//初始化云開發(fā)環(huán)境}})<!--index.wxml--><navigation-bartitle="Weixin"back="{{false}}"color="black"background="#FFF"></navigation-bar><buttonbindtap="list"style="width:100%;margin:2px;">檢索所有數(shù)據(jù)</button><buttonbindtap="insert"style="width:100%;margin:2px;">插入一條數(shù)據(jù)</button><buttonbindtap="update"style="width:100%;margin:2px;">修改一條數(shù)據(jù)</button><buttonbindtap="delete"style="width:100%;margin:2px;">刪除一條數(shù)據(jù)</button><buttonbindtap="ddelete"style="width:100%;margin:2px;">刪除多條數(shù)據(jù)(價格小于3000)</button><buttonbindtap="cupload"style="width:100%;margin:2px;">選擇圖像文件上傳到云端并顯示</button><imagesrc="{{cimage}}"mode="widthFix"></image>修改index.js為如下代碼://index.jsPage({db:{},
data:{cimage:''},
onReady(){this.db=wx.cloud.database();},
list(){this.db.collection('goods').get().then(res=>{res.data.forEach(r=>{console.log(r);});});},insert(){this.db.collection('goods').add({data:{//_id字段,數(shù)據(jù)庫自動分配name:"電冰箱",price:2111},success:function(res){console.log(res);}});},
update(){this.db.collection('goods').doc('63ca5b13661b35d307256ebb0ec13718').update({data:{price:2000},success(res){console.log('修改數(shù)據(jù)成功!')},fail(res){console.log('Failed!');console.log(res);}});},
delete(){this.db.collection('goods').doc('63ca5b13661b35d307256ebb0ec13718').remove({success:function(res){console.log("成功刪除了記錄!")}});},
ddelete(){wx.cloud.callFunction({//云函數(shù)名稱name:'mdelete',success(res){console.log(res.result)},fail(){console.error();}})},cupload(){letthat=this;wx.chooseMedia({count:1,mediaType:['image'],sourceType:['album','camera']}).then(res=>{console.log(res.tempFiles[0].tempFilePath);wx.cloud.uploadFile({cloudPath:'example.png',//上傳至云端的路徑filePath:res.tempFiles[0].tempFilePath,//小程序臨時文件路徑success:res=>{//返回文件IDconsole.log(res.fileID);that.setData({cimage:res.fileID});},fail:console.error});})}})為了在微信開發(fā)環(huán)境中新建一個云函數(shù),在云函數(shù)根目錄cloudfunctions上右擊,在右鍵菜單中,選擇“創(chuàng)建一個新的Node.js云函數(shù)”,將該云函數(shù)命名為mdelete,之后,開發(fā)者工具在本地創(chuàng)建出云函數(shù)目錄和入口index.js文件,如圖所示。在開發(fā)者工具本地創(chuàng)建了云函數(shù)的同時,會在線上環(huán)境中創(chuàng)建出對應的云函數(shù),如圖所示。打開cloudfunctions/mdelete/index.js文件(也就是打開mdelete云函數(shù)的js代碼文件),修改其中的內(nèi)容為如下代碼://云函數(shù)入口文件constcloud=require('wx-server-sdk');cloud.init({env:cloud.DYNAMIC_CURRENT_ENV});//使用當前云環(huán)境constdb=cloud.database();const_=mand;//云函數(shù)入口函數(shù)exports.main=async(event,context)=>{try{returnawaitdb.collection('goods').where({price:_.lt(3000)}).remove()}catch(e){console.error(e)}}修改了mdelete云函數(shù)后,右擊mdelete云函數(shù),在彈出的菜單中選擇“上傳并部署:云端安裝依賴(不上傳nodemodules)“以同步修改后的云函數(shù)到云端。接著,定義了頁面“選擇圖像文件上傳到云端并顯示”按鈕的處理函數(shù):cupload(){letthat=this;wx.chooseMedia({count:1,mediaType:['image'],sourceType:['album','camera']}).then(res=>{console.log(res.tempFiles[0].tempFilePath);wx.cloud.uploadFile({cloudPath:'example.png',//上傳至云端的路徑filePath:res.tempFiles[0].tempFilePath,//小程序臨時文件路徑success:res=>{//返回文件IDconsole.log(res.fileID);that.setData({cimage:res.fileID});},fail:console.error});})}現(xiàn)在運行這個程序。在程序主界面,點擊“檢索所有數(shù)據(jù)”按鈕,將顯示如圖所示的界面:在微信客戶端的控制臺上列出了云數(shù)據(jù)庫中的所有數(shù)據(jù)。在程序主界面,點擊“插入一條記錄”按鈕,將在goods云數(shù)據(jù)庫集合中插入一條新的記錄。此時,打開云開發(fā)界面,可以查看到新插入的數(shù)據(jù),如圖所示。9.2初始化云開發(fā)環(huán)境在可以進行云開發(fā)之前,需要首先初始化云開發(fā)環(huán)境,使用如下語句初始化云開發(fā)環(huán)境:wx.cloud.init();一般而言,只需初始化一次云開發(fā)環(huán)境,因此,語句:wx.cloud.init();只需要調(diào)用一次。初始化云開發(fā)環(huán)境的最佳實踐是:將初始化云開發(fā)環(huán)境的代碼放置在app.js文件中,就像下面這個app.js文件一樣://app.jsApp({onLaunch(){wx.cloud.init();}})9.3云數(shù)據(jù)庫云開發(fā)提供了一個JSON數(shù)據(jù)庫,顧名思義,數(shù)據(jù)庫中的每條記錄都是一個JSON對象。一個數(shù)據(jù)庫可以有多個集合(一個集合就相當于關(guān)系型數(shù)據(jù)中的表),一個集合就是一個JSON數(shù)組,數(shù)組中的每個對象就是一條記錄,每條記錄本質(zhì)上就是一個JSON對象。類似于對傳統(tǒng)的關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)操作,可以對云數(shù)據(jù)庫中的數(shù)據(jù)進行簡單的增刪改查操作,也可以對云數(shù)據(jù)庫進行復雜的聚類分組操作。不同于關(guān)系型數(shù)據(jù)庫,微信云數(shù)據(jù)庫規(guī)定:每條記錄都自動包含名稱為“_id”的字符串字段,該字段可以唯一標識一條記錄;每條記錄還會自動包含一個名稱為“_openid”的字段,這個字段唯一標識記錄的創(chuàng)建者。在云數(shù)據(jù)庫中,為了數(shù)據(jù)安全考慮,只有數(shù)據(jù)記錄的創(chuàng)建者才可以修改和刪除自己創(chuàng)建的數(shù)據(jù)記錄。在可以使用云數(shù)據(jù)庫之前,也需要初始化云開發(fā)數(shù)據(jù)庫,使用如下語句初始化云數(shù)據(jù)庫環(huán)境:constdb=wx.cloud.database();9.3.1數(shù)據(jù)類型云數(shù)據(jù)庫提供了對基本數(shù)據(jù)類型的支持。云數(shù)據(jù)庫支持的數(shù)據(jù)類型及其含義如下:string:字符串;number:數(shù)字;object:對象;array:數(shù)組;boolean:布爾值;date:時間;geopoint:多種地理位置類型;null。其中的date類型表示時間,精確到毫秒,在小程序端可用JavaScript內(nèi)置Date對象創(chuàng)建;null相當于一個占位符,表示一個字段存在但是值為空。在云開發(fā)的控制臺上,可以查看目前云數(shù)據(jù)庫所支持的所有數(shù)據(jù)類型。如圖所示:9.3.2新建集合和數(shù)據(jù)訪問權(quán)限控制在可以向云數(shù)據(jù)庫集合進行數(shù)據(jù)的增刪改查之前,需要先在云數(shù)據(jù)庫中創(chuàng)建集合。為此,在云開發(fā)控制臺,點擊“數(shù)據(jù)庫”按鈕,如圖所示。為了保證云數(shù)據(jù)庫數(shù)據(jù)安全,點擊箭頭3所指向的“數(shù)據(jù)權(quán)限“按鈕設置數(shù)據(jù)集合的訪問權(quán)限,如圖所示。9.3.3插入數(shù)據(jù)可以通過在集合對象上調(diào)用add方法往集合中插入一條記錄。例如,以goods集合為例,可以使用如下語句向集合插入一條記錄:db.collection(goods).add({//data字段表示需新增的JSON數(shù)據(jù)data:{//_id:數(shù)據(jù)庫自動分配,無須給值name:"筆記本電腦",price:6780,producer:{"name":“聯(lián)想P14s”"date":“2020-10-21”},//該電腦目前所在位置(113°E,23°N)location:newdb.Geo.Point(113,23)},success:function(res){//res是一個對象,其中有_id字段標記剛創(chuàng)建的記錄的_idconsole.log(res)}})當然,也可以使用Promise風格向集合插入數(shù)據(jù),例如:db.collection(goods).add({//data字段表示需新增的JSON數(shù)據(jù)data:{//_id:數(shù)據(jù)庫自動分配,無須給值name:"電子白板",price:2180,user:“張三”}}).then(res=>{console.log(res)})9.3.4修改數(shù)據(jù)微信提供了兩種修改數(shù)據(jù)(更新數(shù)據(jù))的方式:其一,使用update()方法局部更新一個或多個記錄;其二,使用set()方法替換更新整個記錄。1、使用update()方法更新局部數(shù)據(jù)使用update()方法可以局部更新一個記錄或一個集合中的記錄,局部更新意味著只有指定的字段會得到更新,其他字段不受影響。例如,下面的例子修改指定_id記錄的price字段的值為3030:db.collection(goods).doc('06019505661dcca0077253e2775e9bb5').update({//data傳入需要局部更新的數(shù)據(jù)data:{//表示將price字段置為3030price:3030},success:function(res){console.log(res.data)}})集合的.doc()方法指定要操作的數(shù)據(jù)的_id。除了用指定值更新字段外,數(shù)據(jù)庫API還提供了一系列的更新指令用于執(zhí)行更復雜的更新操作,所支持的更新指令包含在mand對象中,如表所示。序號更新指令含義1set(value:any)更新操作符,用于設定字段等于指定值2remove()更新操作符,用于表示刪除某個字段3inc(value:number)更新操作符,原子操作,用于指示字段自增4mul(value:number)更新操作符,原子操作,用于指示字段自乘某個值5push(values:Object)數(shù)組更新操作符。對一個值為數(shù)組的字段,往數(shù)組添加一個或多個值;或字段原為空,則創(chuàng)建該字段并設數(shù)組為傳入值6pop()數(shù)組更新操作符,對一個值為數(shù)組的字段,將數(shù)組尾部元素刪除7shift()數(shù)組更新操作符,對一個值為數(shù)組的字段,將數(shù)組頭部元素刪除8unshift(values:any[])數(shù)組更新操作符,對一個值為數(shù)組的字段,往數(shù)組頭部添加一個或多個值;或字段原為空,則創(chuàng)建該字段并設數(shù)組為傳入值。9max(value:any)更新操作符,給定一個值,只有該值大于字段當前值才進行更新10min(value:any)更新操作符,給定一個值,只有該值小于字段當前值才進行更新例如,如果要將goods集合中指定的_id記錄的price字段的值增加100,可使用如下代碼:const_=mand;db.collection(goods).doc('06019505661dcca0077253e2775e9bb5').update({data:{//將price字段自增100price:_.inc(100)},success:function(res){console.log(res.data)}});再舉一個例子。這個例子對goods的指定記錄新增一個category數(shù)組字段,同時,檢查價格是否小于3000,若是,則將價格修改為3000:const_=mand;db.collection(goods).doc('06019505661dcca0077253e2775e9bb5').update({data:{//檢查價格是否小于3000,若是,則將價格修改為3000price:_.max(3000),category:_.push([‘電子商品’,‘消費品’])},success:function(res){console.log(res.data)}});特別提醒:客戶端只能對指定_id的記錄進行修改操作。如果需要更新多個數(shù)據(jù),則需要在云端進行操作(也就是需要使用云函數(shù)才可以一次性修改/刪除多條記錄),在云端的where語句后可以調(diào)用update方法對數(shù)據(jù)記錄進行修改。例如,下面的例子對價格小于3000的商品的價格提升20%://使用了asyncawait語法constcloud=require('wx-server-sdk');constdb=cloud.database();const_=mand;
exports.main=async(event,context)=>{try{returnawaitdb.collection(goods).where({price:_.lt(3000)}).update({data:{price:_.mul(0.2)},})}catch(e){console.error(e)}}2、使用set()方法替換整條數(shù)據(jù)使用set()方法可以替換更新一整條記錄,替換更新意味著用傳入的對象替換指定的記錄,如下面的例子,使用新的記錄替換原來的一整條的記錄數(shù)據(jù):const_=manddb.collection('goods').doc('06019505661dcca0077253e2775e9bb5').set({data:{name:"智能機器人",price:56000,due:newDate("2018-09-01"),tags:["cloud","database"],style:{color:"skyblue"}},success:function(res){console.log(res.data)}})9.3.5刪除數(shù)據(jù)使用remove()方法刪除從云數(shù)據(jù)庫刪除數(shù)據(jù)記錄。在客戶端,也就是在微信小程序端只能基于給定的_id一次刪除一條數(shù)據(jù)記錄,若要一次性刪除多條記錄,則需要在云端(也就是使用云函數(shù))完成。例如,使用如下的語句可以從goods集合中刪除給定_id的記錄:db.collection('goods').doc('06019505661dcca0077253e2775e9bb5').remove({success:function(res){console.log(res.data)}})如果需要刪除多個數(shù)據(jù),需在云端進行操作(云函數(shù))。可通過where語句選取多條記錄執(zhí)行刪除。例如,下面的云函數(shù)刪除價格小于3000的商品記錄://使用了asyncawait語法constcloud=require('wx-server-sdk')constdb=cloud.database()const_=mand
exports.main=async(event,context)=>{try{returnawaitdb.collection('goods').where({price:_.lt(3000)}).remove()}catch(e){console.error(e)}}9.3.6查詢數(shù)據(jù)使用get()方法從云數(shù)據(jù)庫集合獲取數(shù)據(jù)??梢允褂眉系?doc()方法指定要查詢的數(shù)據(jù)記錄,例如,下面的例子查詢并返回給定_id的記錄:或者,也可以使用Promise風格獲取數(shù)據(jù)記錄:db.collection('goods').doc('06019505661dcca0077253e2775e9bb5').get({success:function(res){//res.data包含該記錄的數(shù)據(jù)console.log(res.data)}})db.collection('goods').doc('06019505661dcca0077253e2775e9bb5').get().then(res=>{//res.data包含該記錄的數(shù)據(jù)console.log(res.data)})在集合上使用where()方法可以一次查詢得到多條記錄。例如,下面的代碼將查詢所有價格大于3000的記錄:where()方法接收一個對象參數(shù),該對象中每個字段和它的值構(gòu)成一個需滿足的匹配條件,各個字段間的關(guān)系是"與"的關(guān)系,即需同時滿足這些匹配條件,在這個例子中,就是查詢出goods集合中_openid等于user-open-id且price大于3000的記錄。const_=mand;
db.collection('goods').where({_openid:'user-open-id',price:_.gt(3000)}).get({success:function(res){//res.data是包含滿足條件的記錄數(shù)組console.log(res.data)}})與數(shù)據(jù)更新操作類似,數(shù)據(jù)庫API也提供了一系列的查詢指令用于執(zhí)行復雜的查詢操作,所支持的查詢指令包含在mand對象中,如表:序號查詢指令含義1eq(value:any)查詢篩選條件,表示字段等于某個值。eq指令接受一個字面量(literal),可以是number,boolean,string,object,array,Date等2neq(value:any)查詢篩選條件,表示字段不等于某個值。neq指令接受一個字面量(literal),可以是number,boolean,string,object,array,Date等3lt(value:any)查詢篩選操作符,表示需小于指定值??梢詡魅隓ate對象用于進行日期比較。4lte(value:any)查詢篩選操作符,表示需小于或等于指定值??梢詡魅隓ate對象用于進行日期比較。5gt(value:any)查詢篩選操作符,表示需大于指定值??梢詡魅隓ate對象用于進行日期比較。6gte(value:any)查詢篩選操作符,表示需大于或等于指定值??梢詡魅隓ate對象用于進行日期比較。7in(value:any[])查詢篩選操作符,表示要求值在給定的數(shù)組內(nèi)。8nin(value:any[])查詢篩選操作符,表示要求值不在給定的數(shù)組內(nèi)。9and(expressions:any[])查詢操作符,用于表示邏輯"與"的關(guān)系,表示需同時滿足多個查詢篩選條件10or(expressions:any[])查詢操作符,用于表示邏輯"或"的關(guān)系,表示需滿足多個查詢篩選條件的至少一個?;蛑噶钣袃煞N用法,一是可以進行字段值的“或”操作,二是也可以進行跨字段的“或”操作。例如,下面的例子通過使用and指令查詢價格大于2000并且小于3000的所有記錄:const_=manddb.collection('goods').where({//and方法用于指定一個"與"條件,此處需同時滿足_.gt(2000)和_.lt(3000)兩個條件price:_.gt(2000).and(_.lt(3000))}).get({success:function(res){console.log(res.data)}})使用and指令、or指令還可以實現(xiàn)跨字段的邏輯運算。例如,下面的例子查詢價格大于6000或者名字是”電冰箱”的所有商品:const_=manddb.collection('goods').where(_.or([{price:_.gt(6000)},{name:“電冰箱”}])).get({success:function(res){console.log(res.data)}})如果要獲取一個集合的所有數(shù)據(jù),可以在集合上調(diào)用get()方法獲取,但通常不建議這么使用,在小程序中我們需要盡量避免一次性獲取過量的數(shù)據(jù),只應獲取必要的數(shù)據(jù)。為了防止誤操作以及保護小程序體驗,小程序端在獲取集合數(shù)據(jù)時服務器一次默認并且最多返回20條記錄,云函數(shù)端這個數(shù)字則是100。開發(fā)者可以結(jié)合skip()方法和limit()方法指定需要獲取的記錄數(shù)量,但小程序端不能超過20條,云函數(shù)端不能超過100條。例如,下面的這段代碼以分頁的方式返回指定頁的數(shù)據(jù)記錄:constPAGE=20;page=2;//獲取第幾頁數(shù)據(jù)db.collection('goods').skip(page*PAGE).limit(PAGE).get({success:function(res){console.log(res.data)}})9.3.7云數(shù)據(jù)庫核心對象和核心方法總覽本節(jié)對云數(shù)據(jù)庫操作的核心方法和核心對象進行總覽介紹。在小程序可以操作云數(shù)據(jù)庫之前,需要調(diào)用cloud.database(options:Object):Database方法獲得云數(shù)據(jù)庫的引用實例。該方法接受一個對象參數(shù),該對象參數(shù)的屬性及其含義如表:序號屬性名類型默認值必填說明1envstring無否環(huán)境ID,若不填則采用wx.cloud.init中的值2throwOnNotFoundbooleantrue否在調(diào)用獲取記錄(doc.get)時,如果獲取不到,是否拋出異常,如果不拋出異常,doc.get返回空。默認true。例如,下面的語句將獲取默認云環(huán)境的云數(shù)據(jù)庫引用:constdb=wx.cloud.database();方法wx.cloud.database()返回的是一個云數(shù)據(jù)庫Database對象引用,通過這個對象可完成對云數(shù)據(jù)庫的操作。Database對象常用屬性、方法及其含義如表:序號屬性名稱/方法原型屬性/方法含義1Commandcommand屬性數(shù)據(jù)庫操作符,參見表9-1和表9-22GeoGeo屬性數(shù)據(jù)庫地理位置結(jié)構(gòu)3Database.collection(name:string):Collection方法獲取集合的引用。方法接受一個name參數(shù),指定需引用的集合名稱。4Database.createCollection(collectionName:string):Promise<Object>方法創(chuàng)建集合,如果集合已經(jīng)存在會創(chuàng)建失敗5Database.serverDate(options:Object):ServerDate方法構(gòu)造一個服務端時間的引用。可用于查詢條件、更新字段值或新增記錄時的字段值6Database.runTransaction(callback:function,times:number):Promise<any>
方法發(fā)起事務。僅可在云函數(shù)中使用7Database.startTransaction():Promise<Transaction>
方法開始事務,另一個同樣可以使用的發(fā)起事務的API是runTransaction。僅可在云函數(shù)中使用。調(diào)用Database.collection(name:string)獲取云數(shù)據(jù)庫一個集合的引用,該方法返回一個Collection對象。Collection對象常用屬性、方法及其含義如表:序號屬性名稱/方法原型屬性/方法含義1Collection.doc(id:string):Document方法獲取集合中指定記錄的引用。方法接受一個id參數(shù),指定需引用的記錄的_id2Collection.add(options:Object):Promise<Object>方法新增記錄,如果傳入的記錄對象沒有_id字段,則由后臺自動生成_id;若指定了_id,則不能與已有記錄沖突3Collection.aggregate():Aggregate方法發(fā)起聚合操作,定義完聚合流水線階段之后需調(diào)用end方法標志結(jié)束定義并實際發(fā)起聚合操作4Collection.count():Promise<Object>方法統(tǒng)計匹配查詢條件的記錄的條數(shù)5Collection.field(projection:Object):Collection方法指定返回結(jié)果中記錄需返回的字段6Collection.get():Promise<Object>方法獲取集合數(shù)據(jù),或獲取根據(jù)查詢條件篩選后的集合數(shù)據(jù)7Collection.limit(value:number):Collection方法指定查詢結(jié)果集數(shù)量上限8Collection.orderBy(fieldPath:string,string:order):Collection方法指定查詢排序條件9Collection.remove():Promise<Object>方法刪除多條記錄。注意只支持通過匹配where語句來刪除,不支持skip和limit10Collection.skip(offset:number):Collection方法指定查詢返回結(jié)果時從指定序列后的結(jié)果開始返回,常用于分頁11Collection.update():Promise<Object>方法更新多條記錄12Collection.where(condition:Object):Collection方法指定查詢條件,返回帶新查詢條件的新的集合引用調(diào)用Collection.doc(id:string)方法將返回一個Document對象,該Document對象的常用屬性、方法及其含義如表:序號屬性名稱/方法原型屬性/方法含義1Document.get():Promise<Object>方法獲取記錄數(shù)據(jù),或獲取根據(jù)查詢條件篩選后的記錄數(shù)據(jù)2Document.remove():Promise<Object>方法刪除一條記錄3Document.set(options:Object):Promise<Object>方法替換更新一條記錄4Document.update(options:Object):Promise<Object>方法更新一條記錄9.4云存儲微信云開發(fā)環(huán)境為小程序提供了高可用和高穩(wěn)定的云存儲空間,小程序可以在這個存儲空間中可以創(chuàng)建文件夾、可以存儲包括圖像、視頻在內(nèi)的任何文件。小程序可以向訪問任何本地或者網(wǎng)絡文件資源一樣訪問存儲與云空間的云文件,同時,用戶可以在云開發(fā)控制臺對存儲與云存儲中的文件進行管理。9.4.1上傳文件到云存儲小程序端可調(diào)用wx.cloud.uploadFile(Objectoptions)方法上傳本地文件到云存儲中。該方法接受一個對象作為參數(shù),其對象參數(shù)的屬性及其含義如表:序號屬性名類型默認值必填說明1cloudPathString無是云存儲路徑2filePathString無是要上傳文件資源的路徑3configObject無否環(huán)境配置。該對象包含如下屬性:env,String,使用的環(huán)境ID,填寫后忽略init指定的環(huán)境ID4successfunction無否成功回調(diào)。接受一個Object對象參數(shù),該對象包含以下屬性:fileID,String,文件ID;statusCode,Number,服務器返回的HTTP狀態(tài)碼;errMsg,String,錯誤信息5failfunction無否失敗回調(diào)。接受一個Object對象參數(shù),該對象包含以下屬性:errCode,錯誤碼,Number;errMsg,String,錯誤信息6completefunction無否結(jié)束回調(diào)例如,下面的代碼上傳指定的本地文件到云存儲:wx.cloud.uploadFile({cloudPath:'example.png',//在云存儲中的文件名稱filePath:'本地文件路徑',//文件路徑success:res=>{//顯示云文件的IDconsole.log(res.fileID)},fail:err=>{//進行錯誤處理}})當然,上面這段代碼特可以采用Promise風格:上傳到云存儲的每個文件都有一個唯一的“FileID”,通過這個FileID可以下載云文件?;蛘邔τ趫D像文件,可以顯示在微信的image組件中。wx.cloud.uploadFile({cloudPath:'example.png',//在云存儲中的文件名稱filePath:'本地文件路徑',//文件路徑}).then(res=>{//顯示云文件的IDconsole.log(res.fileID)}).catch(error=>{//進行錯誤處理})9.4.2從云存儲下載文件對云存儲中的文件,可以使用wx.cloud.downloadFile(Objectoptions)方法下載到本地。該方法接受一個Object的對象參數(shù),該對象參數(shù)的屬性及其含義如表:序號屬性名類型默認值必填說明1fileIDString無是云文件ID 2configObject無否環(huán)境配置。該對象包含如下屬性:env,String,使用的環(huán)境ID,填寫后忽略init指定的環(huán)境ID3successfunction無否成功回調(diào)。接受一個Object對象參數(shù),該對象包含以下屬性:tempFilePath,String,臨時文件路徑;statusCode,Number,服務器返回的HTTP狀態(tài)碼;errMsg,String,錯誤信息4failfunction無否失敗回調(diào)。接受一個Object對象參數(shù),該對象包含以下屬性:errCode,錯誤碼,Number;errMsg,String,錯誤信息5completefunction無否結(jié)束回調(diào)例如,下面的代碼從云存儲上下載指定FileID的文件,并顯示現(xiàn)在到本地后的保存文件的臨時路徑:wx.cloud.downloadFile({fileID:'cloud://teaching-8g682.7465-teaching-8g6ab8a30c-1320566453/example.png',success:res=>{//gettempfilepathconsole.log(res.tempFilePath)},fail:err=>{//handleerror}})9.4.3刪除云存儲中的文件可以使用Cloud.deleteFile(fileList:string[]):Promise<Object>刪除云存儲中指定FileID的文件。該函數(shù)的參數(shù)為云文件ID字符串數(shù)組,最多一次刪除50個云文件。該函數(shù)返回一個Promise對象,該對象接受一個Object對象參數(shù),這個Object參數(shù)包括一個名稱為fileList的屬性,這是一個數(shù)組,通過這個屬性即可得到每個云文件的刪除結(jié)果。例如,下面的代碼刪除指定的云文件:wx.cloud.deleteFile({fileList:['cloud://aasd7xzcb-12332scxcvxcvvcx-wewexzvxvcxvcxxcv',‘cloud://teaching-8g682.7465-teaching-8g6ab8a30c-1320566453/example.png’]}).then(res=>{//handlesuccessconsole.log(res.fileList)}).catch(error=>{//handleerror})9.4.4引用云文件可以在image、audio等組件中傳入云文件ID,進而可以在圖像組件顯示云存儲中的圖像文件,或者,可以在audio組件中播放存儲與云存儲中的音頻。例如,下面WXML代碼將顯示存儲于云端的圖像:<image
src="cloud://teaching-8g682zowbab8a30c.7465-teaching-8g682zowbab8a30c-1320566453/example.png"
mode="widthFix"></image>9.5云函數(shù)云函數(shù),顧名思義,就是在云端(也就是服務器端)運行的函數(shù)。云函數(shù)代碼運行在云服務器的Node.js中,因此,云函數(shù)被小程序調(diào)用時,云函數(shù)代碼會在云端的Node.js環(huán)境中執(zhí)行。在云函數(shù)中可以進行網(wǎng)絡請求等操作,還可以在云函數(shù)中進行云數(shù)據(jù)庫和云存儲相關(guān)的操作。9.5.1配置云函數(shù)環(huán)境在進行云函數(shù)開發(fā)之前,需要在小程序工程中創(chuàng)建一個為存放云函數(shù)的目錄。一個不成文的規(guī)定是:新建cloudfunctions作為云函數(shù)存儲目錄,為此,在小程序的工程根目錄上新建名稱為“cloudfunctions”的子目錄。然后,在小程序工程的根目錄下的配置文件project.config.json中新增cloudfunctionRoot字段,指定已存在的目錄作為云開發(fā)的本地根目錄,如下代碼所示:"cloudfunctionRoot":"cloudfunctions/"最后,右擊cloudfunctions目錄,選擇“當前環(huán)境”選項,在列出的選項中選擇在開通云開發(fā)時所命名的云開發(fā)環(huán)境的名稱,完成指定之后,云開發(fā)根目錄的圖標會變成“云開發(fā)圖標”。如圖所示。9.5.2新建云函數(shù)舉一個例子說明如何創(chuàng)建和調(diào)用云函數(shù)。這個例子完成兩個整數(shù)的相加并將結(jié)果返回給調(diào)用者。命名這個云函數(shù)為add。為了新建云函數(shù),在云函數(shù)根目錄上右鍵,在右鍵菜單中,選擇“新建Node.js云函數(shù)”菜單項,將該云函數(shù)命名為add。開發(fā)者工具將在本地云函數(shù)目錄創(chuàng)建云函數(shù)目錄和入口index.js文件,同時在線上環(huán)境中創(chuàng)建出對應的云函數(shù):一個云函數(shù)本質(zhì)上就是在cloudfunctions目錄下新建一個以云函數(shù)名稱命名的子目錄,在該子目錄下有三個文件,名稱分別為config.json、index.js和package.json。其中,index.js就是可執(zhí)行的JavaScript云函數(shù)代碼。新建的index.js文件為如下模板內(nèi)容://云函數(shù)入口文件constcloud=require('wx-server-sdk')
cloud.init()
//云函數(shù)入口函數(shù)exports.main=async(event,context)=>{constwxContext=cloud.getWXContext()
return{event,openid:wxContext.OPENID,appid:wxContext.APPID,unionid:wxContext.UNIONID,}}云函數(shù)的傳入?yún)?shù)有兩個,一個是event對象,一個是context對象。event指的是觸發(fā)云函數(shù)的事件,當小程序端調(diào)用云函數(shù)時,event就是小程序端調(diào)用云函數(shù)時傳入的參數(shù),外加后端自動注入的小程序用戶的openid和小程序的appid?,F(xiàn)在修改index.js文件為如下內(nèi)容://云函數(shù)入口文件constcloud=require('wx-server-sdk')cloud.init({env:cloud.DYNAMIC_CURRENT_ENV})//使用當前云環(huán)境//云函數(shù)入口函數(shù)exports.main=async(event,context)=>{return{sum:event.a+event.b}}在微信開發(fā)者工具中保存index.js文件,然后,右鍵該add云函數(shù),選擇“上傳并部署:云端安裝依賴(不上傳nodemodules)”菜單項將新修改的代碼上傳到云端,如圖所示。9.5.3在小程序中調(diào)用云函數(shù)對于已經(jīng)完成開發(fā)和完成部署的云函數(shù),可以在小程序中調(diào)用和使用它們。例如,對于上一節(jié)的add云函數(shù),可以使用如下的代碼調(diào)用它:wx.cloud.init();//初始化云開發(fā)環(huán)境。只需要調(diào)用一次wx.cloud.callFunction({name:'add',//要調(diào)用的云函數(shù)名稱//要傳給云函數(shù)的參數(shù)data:{a:1,b:2,},success:function(res){console.log(res.result.sum)//結(jié)果應該是3},fail:console.error})當然,也可以使用如下的Promise風格調(diào)用云函數(shù):wx.cloud.init();//初始化云開發(fā)環(huán)境。只需要調(diào)用一次wx.cloud.callFunction({name:'add',//要云函數(shù)名稱//傳給云函數(shù)的參數(shù)data:{a:1,b:2,},}).then(res=>{console.log(res.result)//3}).catch(console.error)9.5.4在云函數(shù)中進行云操作云函數(shù)屬于管理端,在云函數(shù)中運行的代碼擁有不受限的數(shù)據(jù)庫讀寫權(quán)限和云文件讀寫權(quán)限。wx-server-sdk庫以與小程序端云API類似的風格提供了云函數(shù)訪問云數(shù)據(jù)庫、云存儲和云函數(shù)的API??梢栽谠坪瘮?shù)中訪問云數(shù)據(jù)庫、操作云文件之前,需要使用如下語句導入必須的函數(shù)庫和初始化云環(huán)境:或者:constcloud=require('wx-server-sdk')//給定字符串環(huán)境ID,或者不給出環(huán)境ID參數(shù),從而使用默認環(huán)境cloud.init({env:'some-env-id'})constcloud=require('wx-server-sdk')//給定DYNAMIC_CURRENT_ENV常量:使用與該云函數(shù)當前所在環(huán)境相同的環(huán)境cloud.init({env:cloud.DYNAMIC_CURRENT_ENV})1、在云函數(shù)中訪問云數(shù)據(jù)庫假設在數(shù)據(jù)庫中已有一個goods集合,那么可以在云函數(shù)中以如下方式取得goods集合的數(shù)據(jù):constcloud=require('wx-server-sdk')cloud.init({env:cloud.DYNAMIC_CURRENT_ENV})
constdb=cloud.database()exports.main=async(event,context)=>{//collection的get方法返回Promise,因此云函數(shù)在數(shù)據(jù)庫異步取完數(shù)據(jù)后返回結(jié)果returndb.collection('goods').get()}2、云函數(shù)中操作云存儲在云函數(shù)中可以操作云存儲中的文件。例如,下列的代碼將刪除云存儲中指定云文件ID的云文件:constcloud=require('wx-server-sdk')cloud.init({env:cloud.DYNAMIC_CURRENT_ENV})
exports.main=async(event,context)=>{returncloud.deleteFile({fileList:['cloud://aasd7xzcb-12332scxcvxcvvcx-wewexzvxvcxvcxxcv',‘cloud://teaching-8g2.7465-teaching-8g6ab8a30c-1320566453/example.png’]});3、云函數(shù)中調(diào)用其他云函數(shù)在云函數(shù)中可以調(diào)用其他云函數(shù)。例如,下面的這個云函數(shù)調(diào)用另一個名稱為add的云函數(shù),將add云函數(shù)的結(jié)果加上100后再返回結(jié)果:constcloud=require('wx-server-sdk')cloud.init({env:cloud.DYNAMIC_CURRENT_ENV})
exports.main=async(event,context)=>{leta=awaitcloud.callFunction({name:'sum',data:{x:1,y:2,}});letb=a+100;returnb;}9.5.5在云函數(shù)中獲取小程序用戶信息云函數(shù)的獨特優(yōu)勢在于與微信登錄鑒權(quán)的無縫整合。當小程序端調(diào)用云函數(shù)時,云端會自動將openid注入到云函數(shù)的上下文對象參數(shù)中,與openid一起注入的還有小程序的appid。在云函數(shù)中,可以使用wx-server-sdk提供的getWXContext方法獲取到appid、openid、openid等信息。例如下面的云函數(shù)將用戶鑒權(quán)相關(guān)數(shù)據(jù)返回給小程序://index.js//云函數(shù)入口文件constcloud=require('wx-server-sdk')cloud.init({env:cloud.DYNAMIC_CURRENT_ENV})//使用當前云環(huán)境
//云函數(shù)入口函數(shù)exports.main=async(event,context)=>{constwxContext=cloud.getWXContext()return{event,openid:wxContext.OPENID,appid:wxContext.APPID,unionid:wxContext.UNIONID,}}假設這個云函數(shù)命名為spec,將云函數(shù)上傳并部署到云端后,可在如下的小程序中代碼中調(diào)用該云函數(shù)并顯示用戶鑒權(quán)相關(guān)數(shù)據(jù):wx.cloud.callFunction({name:'spec',complete:res=>{console.log('callFunctionspecresult:',res)}})為了觀察使用云函數(shù)獲取用戶鑒權(quán)數(shù)據(jù)的便利性,下面舉例子說明這個問題。為此,首先在微信開發(fā)者工具中新建名稱為mini-ch09-02的工程,然后在工程的根目錄下新建名稱為cloudfunctions的子目錄用于存放云函數(shù),在project.config.json文件中添加設置云函數(shù)目錄配置,如下代碼所示:"cloudfunctionRoot":"cloudfunctions/",最后設置相關(guān)云環(huán)境,結(jié)果如圖所示。首先,初始化小程序云開發(fā)環(huán)境,為此,修改app.js為如下代碼://app.jsApp({onLaunch(){wx.cloud.init();}})在cloudfunctions云函數(shù)目錄下新建名稱為spec的Node.js云函數(shù),修改spec云函數(shù)的index.js代碼為如下內(nèi)容://云函數(shù)入口文件constcloud=require('wx-server-sdk')cloud.init({env:cloud.DYNAMIC_CURRENT_ENV})//使用當前云環(huán)境
//云函數(shù)入口函數(shù)exports.main=async(event,context)=>{constwxContext=cloud.getWXContext()return{event,openid:wxContext.OPENID,appid:wxContext.APPID,unionid:wxContext.UNIONID,}}修改index.wxml為如下內(nèi)容:<!--index.wxml--><navigation-bartitle="Weixin"back="{{false}}"color="black"background="#FFF"></navigation-bar><scroll-viewclass="scrollarea"scroll-ytype="list"><viewclass="container"><text>openid:{{openid}}\nappid:{{appid}}\nunionid:{{unionid}}</text></view></scroll-view>index.js的代碼如下://index.jsPage({data:{openid:'',appid:'',unionid:''},onReady(){letthat=this;wx.cloud.callFunction({//云函數(shù)名稱name:'spec',success(res){console.log(res.result);that.setData({openid:res.result.openid,appid:res.result.appid,unionid:res.result.unionid})},fail(){console.error();}})},})運行這個程序,顯示如圖所示的結(jié)果。9.6案例:在線競選班長隨著信息技術(shù)手段的不斷發(fā)展,競選班長的方式也發(fā)生了變化:可以開發(fā)一個簡單的微信小程序協(xié)助進行班長競選。本節(jié)通過一個稱為“在線競選班長”的微信小程序開發(fā)例子對本章的內(nèi)容進行總結(jié)和應用。9.6.1案例目標作為一個可以完成在線競選班長的微信小程序,在程序功能上,首先競選人可以錄入自己競選信息,其次,選舉人可以查看競選人信息并進行投票。因此,在這個小程序的首頁面上,用戶可以選擇“我要競選”及“我要投票”功能選項完成競選人信息錄入功能和對競選人進行投票功能。9.6.2案例分析該小程序包括三個頁面:首頁面,在首頁面上,用戶可以選擇“我要競選”及“我要投票”功能選項并進入相應頁面;“我要競選”功能頁面,在這個頁面中,用戶可以錄入個人競選信息,進而可以作為競選人參與競選;“我要投票”功能頁面,用戶可以查看所有競選人信息并根據(jù)自己的意愿投票??紤]到開發(fā)系統(tǒng)的簡便性,將競選人信息和投票結(jié)果信息保存到云數(shù)據(jù)庫。總結(jié)起來,這個小程序需要完成如下開發(fā)工作:1、 設計和開發(fā)主頁面程序,命名為index頁面;2、 設計和開發(fā)“我要競選”功能頁面,命名為candidate頁面;3、 設計和開發(fā)“我要投票”功能頁面,命名為elect頁面;4、 設計云端候選人集合,用于保存候選人信息和選票計數(shù),命名集合為leader;9.6.3案例實施新建名稱為mini-ch09-03的小程序工程,在工程根目錄下新建名稱為cloudfunctions的子目錄用于存放云函數(shù)。修改project.config.json配置文件,增添如下配置語句:"cloudfunctionRoot":"cloudfunctions/",并選擇云開發(fā)環(huán)境為teaching環(huán)境。如圖所示。修改app.js為如下內(nèi)容:在app.json的pages屬性中添加如下頁面,也就是新增兩個頁面:修改candidate頁面和elect頁面的json文件均為如下內(nèi)容,也就是新增的兩個頁面均使用自定義的navigation-bar進行導航://app.jsApp({onLaunch(){wx.cloud.init();}})"pages/candidate/candidate","pages/elect/elect"{"usingComponents":{"navigation-bar":"/components/navigation-bar/navigation-bar"}}現(xiàn)在修改主頁面index.wxml文件為如下內(nèi)容:<!--index.wxml--><navigation-bartitle="Weixin"back="{{false}}"color="black"background="#FFF"></navigation-bar><scroll-viewclass="scrollarea"scroll-ytype="list"><view><buttonstyle="width:90%;margin:10px;"type="primary"bind:tap="tap"data-who="1">我要競選</button><buttonstyle="width:90%;margin:10px;"type="primary"bind:tap="tap"data-who="2">我要投票</button></view></scroll-view>修改index.js代碼為如下內(nèi)容://index.jsPage({tap(e){if(e.target.dataset.who=='1'){wx.navigateTo({url:'../candidate/candidate',})}else{wx.navigateTo({url:'../elect/elect',})
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 甲方違約賓館合同范本
- 農(nóng)村租賃房子合同范本
- 工程咨詢顧問合同范本
- 信用卡保險合同范本及解讀
- 勞動合同簽訂與履行法律指導
- 網(wǎng)絡用戶隱私授權(quán)合同
- 機關(guān)聘用合同范本
- 機電買賣合同范本
- 村醫(yī)聘用合同范本
- 板房安裝協(xié)議合同
- 2025年海北朵拉農(nóng)牧投資開發(fā)有限公司招聘3人備考題庫含答案詳解
- 2025年港口物流智能化系統(tǒng)建設項目可行性研究報告
- T-CNHC 14-2025 昌寧縣茶行業(yè)技能競賽規(guī)范
- 薄壁零件沖床的運動方案設計模板
- 2025地球小博士知識競賽試題及答案
- 2025貴州錦麟化工有限責任公司第三次招聘7人考試筆試模擬試題及答案解析
- 軍人體能訓練標準化手冊
- 住院患者等待時間優(yōu)化與滿意度策略
- 2026中國儲備糧管理集團有限公司黑龍江分公司招聘98人考試模擬卷附答案解析
- 2023年十堰市稅務系統(tǒng)遴選筆試真題匯編附答案解析
- 投資銀行核心業(yè)務操作流程與案例分析
評論
0/150
提交評論