摘要:所以不僅本地視圖會(huì)刷新,云數(shù)據(jù)庫(kù)也會(huì)同步更新,更新回調(diào)在里執(zhí)行。實(shí)例查詢歲的用戶同步本地到云數(shù)據(jù)庫(kù)返回值返回對(duì)象的實(shí)例。
Westore Cloud - 隱形云,NoBackEnd,NoSql,HiddenDB
好的設(shè)計(jì)便是感覺(jué)不到設(shè)計(jì)的存在
開(kāi)發(fā)小程序,但是:沒(méi)有后端!沒(méi)有運(yùn)維!沒(méi)有 DBA!沒(méi)有域名!沒(méi)有證書(shū)!沒(méi)有錢(qián)!沒(méi)有精力!
沒(méi)關(guān)系,會(huì) javascript 就可以,Westore Cloud 帶你起飛~~
Githubhttps://github.com/dntzhang/westore
小程序云開(kāi)發(fā)簡(jiǎn)介開(kāi)發(fā)者可以使用云開(kāi)發(fā)開(kāi)發(fā)微信小程序、小游戲,無(wú)需搭建服務(wù)器,即可使用云端能力。
云開(kāi)發(fā)為開(kāi)發(fā)者提供完整的云端支持,弱化后端和運(yùn)維概念,無(wú)需搭建服務(wù)器,使用平臺(tái)提供的 API 進(jìn)行核心業(yè)務(wù)開(kāi)發(fā),即可實(shí)現(xiàn)快速上線和迭代,同時(shí)這一能力,同開(kāi)發(fā)者已經(jīng)使用的云服務(wù)相互兼容,并不互斥。
目前提供三大基礎(chǔ)能力支持:
云函數(shù):在云端運(yùn)行的代碼,微信私有協(xié)議天然鑒權(quán),開(kāi)發(fā)者只需編寫(xiě)自身業(yè)務(wù)邏輯代碼
數(shù)據(jù)庫(kù):一個(gè)既可在小程序前端操作,也能在云函數(shù)中讀寫(xiě)的 JSON 數(shù)據(jù)庫(kù)
存儲(chǔ):在小程序前端直接上傳/下載云端文件,在云開(kāi)發(fā)控制臺(tái)可視化管理
關(guān)于小程序云更多信息的官方文檔可以點(diǎn)擊這里
Westore Cloud 簡(jiǎn)介Westore Cloud 在基于小程序云的數(shù)據(jù)庫(kù)能力,讓開(kāi)發(fā)者感知不到數(shù)據(jù)庫(kù)的存在(隱形云),只需要專注于本地?cái)?shù)據(jù)、本地?cái)?shù)據(jù)邏輯和本地?cái)?shù)據(jù)的流動(dòng),通過(guò)簡(jiǎn)單的 pull、push、add 和 remove 同步本地?cái)?shù)據(jù)和云數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)相關(guān)的官方文檔可以點(diǎn)這里。架構(gòu)圖如下所示:
典型的 Data First 架構(gòu)設(shè)計(jì),中小型項(xiàng)目可以去掉 Models 和 Adapter 兩大模塊。可以與 Model first 的架構(gòu)對(duì)比:
Model first 的架構(gòu)里,如果不需要持久化存儲(chǔ),可以去掉 Database,只剩下 Models。Models 與渲染無(wú)關(guān),專注于模型的抽象與模型之間的邏輯,具體是渲染到 Web、安卓、IOS 還是 Flash 或者 WPF 統(tǒng)統(tǒng)不屬于 Models 需要操心的問(wèn)提。
Westore Cloud 特性小程序直連數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)數(shù)據(jù)項(xiàng)函數(shù)擴(kuò)展
極簡(jiǎn)的 API 設(shè)計(jì) (pull push add remove)
只需要一種編程語(yǔ)言(javascript)編寫(xiě)前端、后端、mongodb
開(kāi)發(fā)者只需專注數(shù)據(jù)和數(shù)據(jù)的邏輯(即store),隱形的數(shù)據(jù)庫(kù)同步功能
無(wú)延遲的設(shè)計(jì)(先更新本地刷新視圖、再sync db、最后 diff 本地更新視圖)
快速入門(mén) 新建集合 定義映射 Store安裝上面建立的集合名稱一一對(duì)應(yīng)建立好 store 的 data:
export default { data: { //user 對(duì)應(yīng) db 的 collectionName "user": [], //其他 collection 可以繼續(xù)添加 "product": [] }, env:"test-06eb2e" }
上面的 env 對(duì)應(yīng)云控制臺(tái)的環(huán)境 ID:
新增測(cè)試數(shù)據(jù)通過(guò) add 方法往集合 user 添加數(shù)據(jù):
this.store.add("user", { name: "dntzhang", city: "深圳", age: 22, gender: 1 }).then((res) => { })
通過(guò) add 方法往集合 product 添加數(shù)據(jù):
this.store.add("product", { address: { province:"廣東省", city:"深圳市", }, agent: [ "微信支付", "微信搜一搜", "微信讀書(shū)"] })擴(kuò)展數(shù)據(jù)庫(kù)每項(xiàng)方法
export default { data: { "user":[], "product": [] }, methods:{ //這里可以擴(kuò)展 collection 每一項(xiàng)的方法 "product":{ "agentString":function(){ //this.agent 對(duì)應(yīng) product 集合的 agent字段 return this.agent.join("-") } } }, env:"test-06eb2e" }
通過(guò)上面的擴(kuò)展方法,在遍歷 product 表的每一項(xiàng)時(shí),可以直接使用 agentString 屬性綁定到視圖,比如展示本地第一條數(shù)據(jù)的 agentString:
拉取數(shù)據(jù){{product[0].agentString}}
this.store.pull("user").then(res => { this.store.data.user = res.data this.update() })綁定數(shù)據(jù)到視圖
修改數(shù)據(jù)用戶信息 姓名:{{user[0].name}} 年齡:{{user[0].age}} 城市:{{user[0].city}} 性別:{{user[0].gender===1?"男":"女"}} 產(chǎn)品(測(cè)試深層屬性綁定和更新) 省:{{product[0].address.province}} 市:{{product[0].address.city}} 代理商:{{product[0].agentString}}
this.store.data.user[0].name = "dntzhang" + Math.floor(Math.random() * 100) this.store.push().then((res) => { console.log("成功更新云數(shù)據(jù)庫(kù)") })
push 方法等于 update local + update cloud。所以不僅本地視圖會(huì)刷新,云數(shù)據(jù)庫(kù)也會(huì)同步更新,更新回調(diào)在 then 里執(zhí)行。
支持精準(zhǔn)更新深層的嵌套屬性,如:
this.store.data.product[0].address.city = "廣州市" this.store.data.product[0].agent[0] = "微信" this.store.data.product[0].agent[1] = "QQ" this.store.data.product[0].agent[2] = "騰訊云" this.store.push()
更新后:
刪除數(shù)據(jù)const item = this.store.data.user.splice(index, 1)[0] this.update() //更新本地?cái)?shù)據(jù)和視圖 this.store.remove("user", item._id) //同步到云數(shù)據(jù)庫(kù)新增數(shù)據(jù)
const user = { name: "new user" + this.store.data.user.length, age: 1, city: "江西", gender: 2 } this.store.data.user.push(user) //優(yōu)先更新本地視圖 this.update() //增加到云數(shù)據(jù)庫(kù) this.store.add("user", user)
如果新增的條數(shù)據(jù)后續(xù)需要修改且同步到云數(shù)據(jù)庫(kù)需要設(shè)置 _id,即最后一行代碼改成:
this.store.add("user", user).then((res) => { //設(shè)置_id,方便后續(xù)修改進(jìn)行 push user._id = res._id this.update() })
增加改查完整的 DEMO 可以點(diǎn)擊這里。
API this.store.pull(collectionName, [where])拉取云數(shù)據(jù)庫(kù)集合的 JSON 數(shù)據(jù)
參數(shù)名稱 | 是否可選 | 類型 | 描述 |
---|---|---|---|
collectionName | 必須 | 字符串 | 集合名稱 |
where | 不必須 | JSON Object | 查詢條件,如查詢18歲 {age : 18} |
更多 where 的構(gòu)建查詢條件的 API 可以點(diǎn)擊這里。
返回值返回 Promise 對(duì)象的實(shí)例。
實(shí)例查詢 18 歲的用戶:
this.store.pull("user", {age: 18}).then(res => { this.store.data.user = res.data this.update() })this.store.push()
同步本地 JSON 到云數(shù)據(jù)庫(kù)
返回值返回 Promise 對(duì)象的實(shí)例。
示例this.store.data.user[0].name = "dntzhang" this.store.data.product[0].address.city = "廣州市" this.store.data.product[0].agent[1] = "QQ" this.store.data.product[0].agent[2] = "騰訊云" this.store.push().then((res) => { console.log("同步數(shù)據(jù)完成!") })this.store.add(collectionName, data)
添加 JSON 數(shù)據(jù)到數(shù)據(jù)庫(kù)
參數(shù)名稱 | 是否可選 | 類型 | 描述 |
---|---|---|---|
collectionName | 必須 | 字符串 | 集合名稱 |
data | 必須 | JSON Object | 添加到數(shù)據(jù)庫(kù)的數(shù)據(jù)項(xiàng) |
返回 Promise 對(duì)象的實(shí)例。
示例const user = { name: "new user" + this.store.data.user.length, age: 1, city: "江西", gender: 2 } this.store.data.user.push(user) this.update() this.store.add("user", user).then((res) => { //設(shè)置_id user._id = res._id this.update() })this.store.remove(collectionName, id)
根據(jù) id 刪除數(shù)據(jù)庫(kù)中的數(shù)據(jù)
參數(shù)名稱 | 是否可選 | 類型 | 描述 |
---|---|---|---|
collectionName | 必須 | 字符串 | 集合名稱 |
id | 必須 | 字符串 | 對(duì)應(yīng)數(shù)據(jù)庫(kù)中自動(dòng)生成的 _id 字段 |
返回 Promise 對(duì)象的實(shí)例。
示例const item = this.store.data.user.splice(index, 1)[0] this.update() this.store.remove("user", item._id)原理 JSON Diff Result 轉(zhuǎn)為數(shù)據(jù)庫(kù)更新請(qǐng)求
diffToPushObj({ "user[2].name": { cc: 1 }, "user[2].age": 13, "user[1].a.b": { xxx: 1 } })
返回:
{ "user-2": { "name": { "cc": 1 }, "age": 13 }, "user-1": { "a": { "b": { "xxx": 1 } } } }
其中,"user-2".split("-") 之后可以得到DB的集合名user,數(shù)字 2 代表本地?cái)?shù)據(jù)第三條。
Star & Forkhttps://github.com/dntzhang/westore
LicenseMIT @dntzhang
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/98225.html
摘要:因?yàn)閭鹘y(tǒng)的數(shù)據(jù)庫(kù)管理方式在當(dāng)前這種架構(gòu)下依靠手工或者借助簡(jiǎn)單的工具是無(wú)法應(yīng)對(duì)多活架構(gòu)大規(guī)模管理帶來(lái)的復(fù)雜性,因此平臺(tái)化顯得非常重。我們?cè)谧龅姆桨笗r(shí)做了充分調(diào)查及論證,最終沒(méi)有選擇這種方式。 蔡鵬,2015年加入餓了么,見(jiàn)證了餓了么業(yè)務(wù)&技術(shù)從0到1的發(fā)展過(guò)程,并全程參與了數(shù)據(jù)庫(kù)及DBA團(tuán)隊(duì)高速發(fā)展全過(guò)程。同時(shí)也完成個(gè)人職能的轉(zhuǎn)型-由運(yùn)維DBA到DEV-DBA的轉(zhuǎn)變,也從DB的維穩(wěn)轉(zhuǎn)變到專心為...
摘要:前后端的界限是按照瀏覽器和服務(wù)器的劃分。前后端彼此互不關(guān)聯(lián)。關(guān)于作者本文部分圖片段落參考文章實(shí)踐中的前后端分離。淘寶前后端分離實(shí)踐本文源碼詳見(jiàn)服務(wù)端代碼。 一、起源 (故事純屬虛構(gòu),如有雷同,純屬巧合)傳說(shuō)在很久很久以前,我們有志之士有了個(gè)創(chuàng)業(yè)的想法,于是乎開(kāi)始了自己的創(chuàng)業(yè)之夢(mèng),但是人手不足啊,于是乎所有角色老子一個(gè)人全包了: Roles: PM, DBA, RD, FED, Des...
摘要:前后端的界限是按照瀏覽器和服務(wù)器的劃分。前后端彼此互不關(guān)聯(lián)。關(guān)于作者本文部分圖片段落參考文章實(shí)踐中的前后端分離。淘寶前后端分離實(shí)踐本文源碼詳見(jiàn)服務(wù)端代碼。 一、起源 (故事純屬虛構(gòu),如有雷同,純屬巧合)傳說(shuō)在很久很久以前,我們有志之士有了個(gè)創(chuàng)業(yè)的想法,于是乎開(kāi)始了自己的創(chuàng)業(yè)之夢(mèng),但是人手不足啊,于是乎所有角色老子一個(gè)人全包了: Roles: PM, DBA, RD, FED, Des...
閱讀 1321·2023-04-26 03:05
閱讀 778·2021-10-19 11:43
閱讀 3226·2021-09-26 09:55
閱讀 835·2019-08-30 15:56
閱讀 991·2019-08-30 15:44
閱讀 1246·2019-08-30 15:44
閱讀 2726·2019-08-30 14:23
閱讀 3244·2019-08-30 13:13