[开源]WestoreCloudrelease-无后端,无SQL,无DBA,只用javascript开发云小程序,但是:无后端!无运维!没有DBA!没有域名!没有证书!没钱!没有能量!没关系,你可以用javascript,微店云带你下车~~Githubhttps://github.com/dntzhang/westore小程序云开发介绍开发者无需搭建一个平台,就可以使用云开发开发微信小程序和游戏服务器使用云功能。云开发为开发者提供完整的云支持,弱化后端和运维概念,无需搭建服务器,使用平台提供的API进行核心业务开发,可实现快速上线和迭代。同时,这种能力与开发者所使用的云服务是相互兼容的,并不相互排斥。目前支持三种基础能力:云函数:代码运行在云端,微信私有协议自然认证,开发者只需编写自己的业务逻辑代码库:一个可以在小程序前端操作,也可以在云函数JSON数据库存储读写:直接在小程序前端上传/下载云文件,在云开发控制台可视化管理。关于小程序云的官方文档,请点击此处查看小程序云的介绍。WestoreCloud是基于小程序云的数据库。该能力让开发者感知不到数据库(看不见的云)的存在,只需要关注本地数据、本地数据逻辑、本地数据流,通过简单的pull、push、add、并删除。数据库相关的官方文档可以点击这里。架构图如下:在典型的DataFirst架构设计中,对于中小型项目可以去掉Models和Adapter这两个模块。可以类比Modelfirst架构:在Modelfirst架构中,如果不需要持久化存储,可以去掉Database,只留下Models。模型与渲染无关。它侧重于模型的抽象和模型之间的逻辑。具体来说,渲染到Web、Android、IOS、Flash或WPF并不是Models需要担心的问题。WestoreCloud特色小程序直连数据库数据库数据项功能扩展极简API设计(pullpushaddremove)只需要一种编程语言(javascript)编写前端,后端,mongodb开发者只需要专注于数据和数据逻辑(即store),无延迟设计的隐形数据库同步功能(先更新本地刷新视图,然后同步db,最后diff本地更新视图)快速开始创建一个新的集合定义映射存储安装上面创建的集合名称是一个-一一对应创建storedata:exportdefault{data:{//user对应db的collectionName'user':[],//其他collection可以继续添加'product':[]},env:'test-06eb2e'}上面的env对应云控制台的EnvironmentID:添加测试数据通过add方法向集合用户添加数据:this.store.add('user',{name:'dntzhang',city:'深圳',age:22,gender:1}).then((res)=>{})通过add方法向集合product添加数据:this.store.add('product',{address:{province:'广东省',city:'深圳',},agent:['微信支付','微信搜索','微信阅读']})扩展数据库各方法导出默认{data:{'user':[],'product':[]},methods:{//这里可以扩展集合中每一项的方法'product':{'agentString':function(){//this.agent对应product集合的agent字段returnthis.agent.join('-')}}},env:'test-06eb2e'}通过上面的扩展方法,在遍历product表中的每一项时,可以直接使用agentString属性绑定view,比如显示第一个本地数据的agentString:{{product[0].agentString}}拉取数据this.store.pull('user').then(res=>{this.store.data.user=res.datathis.update()})绑定数据到view用户信息姓名:{{user[0].name}}年龄:{{user[0].age}}城市:{{user[0].city}}性别:{{user[0].gender===1?'Male':'Female'}}Product(TestDeep属性绑定和更新)省份:{{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('成功更新云端数据库')})push方法等于更新本地+更新云端所以不仅本地视图会刷新,云端数据库也会同步更新,然后执行更新回调。支持深度嵌套属性的精确更新,如:this.store.data.product[0].address.city='广州市'this.store.data.product[0].agent[0]='WeChat'this.store.data.product[0].agent[1]='QQ'this.store.data.product[0].agent[2]='腾讯云'this.store.push()更新后:删除数据constitem=this.store.data.user.splice(index,1)[0]this.update()//更新本地数据和视图this.store.remove('user',item._id)//同步到云数据库新数据constuser={name:'新用户'+this.store.data.user.length,age:1,city:'江西',gender:2}this.store.data.user.push(user)//先更新本地视图this.update()//添加到云数据库this.store.add('user',user)如果后面新增的数据需要修改同步到云数据库,则_id需要设置,即最后一行代码改为:this.store.add('user',user).then((res)=>{//设置_id方便后续修改推送user._id=res._idthis.update()})添加和修改查看完整的DEMO可以点这里。APIthis.store.pull(collectionName,[where])拉取云数据库集合的JSON数据。参数名称是否可选。类型说明。collectionName必须是字符串。不需要的集合名称。JSON对象查询条件,比如查询年龄18{age:18}更多构建查询条件的API可以在这里找到。返回值返回一个Promise对象的实例。18岁用户的示例查询:this.store.pull('user',{age:18}).then(res=>{this.store.data.user=res.datathis.update()})this.store.push()将本地JSON同步到云端数据库,返回值返回一个Promise对象的实例。例子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('数据同步完成!')。例子constuser={name:'newuser'+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)=>{//set_iduser._id=res._idthis.update()})this.store.remove(collectionName,id)根据id删除数据库中的数据参数名称可选类型说明collectionName必须是字符串集合名称id必须是数据库中自动生成的_id字段对应的字符串返回值返回Promise对象的一个??实例。示例constitem=this.store.data.user.splice(index,1)[0]this.update()this.store.remove('user',item._id)原理JSONDiff结果转换为数据库更新请求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,数字2代表第三条本地数据。Star&Forkhttps://github.com/dntzhang/westoreLicenseMIT@dntzhang