总结
- 数据库的schema
- 本地用于定义数据库结构
- 定义好文件后如何影响云端数据库的结构?如果修改结构后需要数据迁移要如何处理?
- 在DB Schema中提供了与uni-id的角色权限体系配套的数据权限控制方案
- uni-id中可以配置角色的名称和等级
- DB Schema可以通过角色的等级和uni-id表中的字段和目标表中字段进行比较,来控制某张表的增删改查权限
- uniCloud推出了JQL(Javascript Query Language),会js即可掌握数据库查询,更对联表查询、Tree查询提供了非常简便的操作封装
- JQL则提供了大量的运算方法,比如日期运算dayOfMonth()、字符串操作方法substr()、数字运算方法add()...可以对数据库字段的值直接进行运算和筛选
- niCloud推出了opendb,包含了大量的开源数据库模板,常见数据表无需自己设计
- 1
- 体系(表结构、表操作JQL、云函数)
- uniCloud提供了uni-id,无需自己开发账户体系,登录、注册、修改密码、角色权限体系、token管理一应俱全
https://doc.dcloud.net.cn/uniCloud/
什么是uniCloud
- uniCloud推出了opendb,包含了大量的开源数据库模板,常见数据表无需自己设计
- uniCloud推出了JQL(Javascript Query Language),会js即可掌握数据库查询,更对联表查询、Tree查询提供了非常简便的操作封装
- 在数据库的schema中定义两个表的字段之间的关系,比如是引用关系(foreignKey)、还是父子关系(parentKey),前端就可以直接查询,轻松完成联表查询和tree查询
- JQL则提供了大量的运算方法,比如日期运算dayOfMonth()、字符串操作方法substr()、数字运算方法add()...可以对数据库字段的值直接进行运算和筛选
- uniCloud提供了uni-id,无需自己开发账户体系,登录、注册、修改密码、角色权限体系、token管理一应俱全
- uniCloud在DB Schema中提供了与uni-id的角色权限体系配套的数据权限控制方案。
- 注释:DB Schema是基于 JSON 格式定义的数据结构的规范。每张表/集合,都有一个表名.schema.json的文件,来描述表的信息、字段的信息。
- uniCloud如何提升10倍开发效率图片内容注释
- uForm 表单校验规范
- DataCom 数据与ui的交互规范
- ClientDB 免写服务端代码
- 注释:js直接操作数据
- UniPay 统一支付
- uniAdmin 管理后台
- 有众多admin插件,比如cms插件、push、banner管理插件、App升级管理插件
- DBSchema2Code 自动生成代码
- uniCloud如何提升10倍开发效率
- 提供众多现成轮子,不用自己写代码
- 云端一体生态:
- 以用户模块为例,其实它有前端、也有云端。前端有注册、登录、修改密码等页面,云端有对应的逻辑代码和数据库。
- uni-starter 云端一体应用快速开发基本项目模版,实现快速搭建一款应用。它集成了很多通用的功能,比如登录注册、头像、设置、拦截器、banner
- uni-search 云端一体搜索。
- uni-file-picker:前端直传uniCloud存储组件
- uni-captcha:云端一体图形验证码组件
- uni-sec-check:免费的内容安全审查,防止用户提交违法的文字或图片
- uni-upgrade-center:App升级中心。支持整包升级、wgt热更新;支持直接下载安装包或跳转应用商店
- 注释:WGT文件是HBuilderX(DCloud提供的开发工具)打包生成的一种资源包格式,它包含了应用的资源文件,如页面、图片、脚本等。当应用需要进行热更新时,只需要下载新的WGT文件并安装到现有应用中即可,这样就可以实现在不重启应用的情况下更新应用的内容。
- uni-push2:云端一体的推送,大幅简化推送开发
- uni-im:开源、多端IM
- 备注:即时通讯
- uni-cms:开源、多端内容管理
- uni-ai:聚合ai能力
- uni-map:地理位置开发中间件,极大加速地图业务开发效率
- 还有大量的云端一体的项目模板
- 云端一体生态:
- 如果没有现成轮子,那么用schema2code代码生成工具,生成数据库的增删改查页面(是直接生成页面,不是生成接口)
- 为数据表编写schema,可以实现非常多功能:数据结构定义、权限管理、数据值域管理,以及非常神奇的功能
- 如果schema2code搞不定,需要手写代码,那么使用clientDB,将节省80%的服务端开发工作
- 如果仍然需要写云端代码,那么云对象让你的开发更简单
- 云对象把云端的代码变成对象方式,让前端js直接import这个对象,然后使用这个对象的方法,就像使用前端的js对象一样顺畅。
- HBuilderX在云端协同中提供工具助力
- 提供众多现成轮子,不用自己写代码
快速上手
- 在uniCloud/cloudfunctions目录右键创建云函数/云对象
- 云对象是云函数的一种,云函数可泛指普通云函数和云对象
- HBuilderX自带一个云函数本地运行环境,运行项目时也默认选择 连接本地云函数。可以在底部控制台中的前端控制台右上角进行切换。
- 在web控制台可以对数据库进行编辑 https://unicloud.dcloud.net.cn
- 时间和地理位置,在编辑时有特殊的写法
- 在web控制台添加/修改数据时,如果输入"2020-12-02 12:12:12"会变成字符串,而不是日期格式。此时需通过以下方式添加日期类型数据
{
"create_date": {
"$date": 1606910053154 // 添加此时间戳对应的日期对象作为create_date
}
}
- 将location字段设置为经度116、纬度38的地理位置点
{
"location": {
"type": "Point",
"coordinates": [116,38]
}
}
免费版和商用版
- 略
基本概念
服务空间
- 若一个应用需要同时连接更多服务空间,HBuilderX中无法绑定更多服务空间。此时需开发者在客户端代码中,手动调用初始化方法uniCloud.init,连接其他服务空间
- uniCloud.init方法会返回一个uniCloud实例,之后云函数API的调用都需要通过该uniCloud实例发起(类似实例调用)。
- 云函数会自动识别自己所属的服务空间,调用本服务空间下的资源时无需初始化。
- 云函数环境(仅腾讯云支持)仅能通过init返回同账号下其他的腾讯云服务空间实例。
- 客户端环境(腾讯云、阿里云均支持)可以通过init返回本账号下任意云厂商服务空间实例
数据库
- uniCloud 提供了 2 个 nosql 数据库
- JSON文档型云数据库
- 数据库中的每条记录都是一个 JSON 格式的对象
- 一个数据库可以有多个集合(相当于关系型数据中的表),集合可看做一个 JSON 数组,数组中的每个对象就是一条记录,记录的格式是 JSON 对象。
- redis 数据库
- redis 是一种可以运行在内存中的键值对数据库,它的能力没有MongoDB强大,但由于可运行在内存中,它的性能远超常规数据库。
- JSON文档型云数据库
- 如果开发者需要其他数据库,比如 mysql、ElasticSearch、数据湖,这些数据库没有在uniCloud的服务空间内置,云函数中通过 nodejs 的 api 可以访问这些远程数据库。
- 注释:ElasticSearch 分布式搜索和分析引擎,就是es
- 注释:数据湖是一种存储大量原始数据的系统或存储库,这些数据可以是结构化的(如关系型数据库中的表)、半结构化的(如CSV、JSON、XML文件)或者非结构化的(如文本、图像、音频和视频文件)
- 如果是业务方面的mysql,建议通过uniCloud web控制台数据导入或通过云函数将mysql数据导入到uniCloud的云数据库中,这样速度比连接远程mysql数据库要更快, 并且可以使用jql、clientDB等一系列uniCloud提供的数据库操作技术。uniCloud庞大的生态如uni-id、uni-admin也都只支持uniCloud云数据库
云函数/云对象
- 云函数之间也可互相调用
- DCloud提供了 uniCloud对象 内置在云函数/云对象中,开发者使用更多的是 uniCloud 的 api,不了解 node 不影响开发。
- HBuilderX 3.0起版本,在uniCloud/cloudfunctions目录右键创建云函数
- 云函数修改后,可以本地运行
云函数/云对象
综述
- uniCloud的云函数环境内置了uniCloud对象,这个对象内置了网络、数据库等各种API。
- uniCloud扩展库:为了裁剪和控制云函数体积而设计的,一些不太常用的功能比如Redis,独立为可选扩展库,避免增大每个云函数的体积
- 每个云函数是一个目录,其中普通云函数有index.js入口文件,云对象的入口文件则是index.obj.js
- 一个最简单的云函数只需要这个入口js文件,在里面编写代码即可。当然也可以在这个js中require该云函数目录下的其他js、json文件
- 云函数的配置文件和 npm规范 相同,在云函数目录下可新建一个 package.json 来存放配置。
- 云函数启动后实例会保留一段时间(如15分钟),超过保留期后若该云函数一直没有被再调用,那这个实例会被释放。所以云函数有冷启动的概念。
- 不过由于js实例的启动要比php和java更快,所以js更适合serverless方式。
- 云函数内使用commonjs规范,不可使用import、export
- 不同项目使用同一个服务空间时,不可使用同名云函数。同名云函数会相互覆盖。
- 单个云函数大小限制为10M(包含node_modules),过大的云函数影响运行性能,也会增加计费的gbs。
- 支付宝云与腾讯云支持在云端安装node_modules,此时不占用云函数体积。
- uniCloud的阿里云版与支付宝云版,暂不可使用相对路径读取文件(比如
fs.readFileSync('./info.txt'))
,可以使用绝对路径fs.readFileSync(path.resolve(__dirname,'./info.txt'))
- 云函数:客户端使用
uniCloud.callfunction("")
调用云函数 - 云对象:是通过前端导入对象来操作的,客户端使用uniCloud.importObject("")导入云对象
- 公共模块:用于不同的云函数/云对象,抽取和共享相同代码
- uniCloud体系里,客户端和服务端的云函数通信,有4种方式
- 传统的restful方式
- 通过配置云函数URL化,把云函数转为传统的http链接
- http链接需要自己注册域名。如果前端是uni-app,则不推荐使用URL化。如果是非uni-app的系统需要访问云函数,只能使用URL化
- callfunction方式
- uni-app客户端通过uniCloud.callFunction(functionname)来调用云函数
- 相比云函数URL,callfunction更加安全、更serverless,不暴露域名和ip,不怕攻击,也无需注册域名
- 云对象方式
- uni-app客户端通过uniCloud.importObject(objectname)导入一个云对象,直接使用这个对象的方法
- uni-app 3.4起支持
- 云对象针对的场景是非数据库操作或不宜前端暴露的数据库操作时,和uni-app客户端的通信方式
- clientDB方式
- uni-app客户端通过
<uniCloud-db>
组件或uniCloud.database()
API来访问uniCloud数据库。 - 不适用的情况
- 数据库表和字段数量多而接口数量少。给每个数据配置权限的工作量超过了控制少数接口权限的工作量
- 权限体系非常复杂,除了用户和管理员外还有较多其他权限条件或动态权限。此时在schema.json/schema.ext.js中编写代码的复杂度超过了写接口。
- uni-app客户端通过
- 传统的restful方式
- 在HBuilderX 3.5.2之前,需要URL化和定时运行时,只能使用普通云函数;在HBuilderX 3.5.2+,云对象也支持了URL化和定时运行
- 可以让云函数/云对象生成一个HTTP URL。这样非uni-app应用,可以通过ajax请求和云函数/云对象通信。
- 在 uniCloud Web控制台进行URL化配置。
- 云函数在执行期间可以将中间状态发送给客户端
- 注释:长时间运行的云函数可以主动向客户端推送状态,在常规web开发时可以使用server sent event将结果分段返回,客户端自行组装最终结果。但是小程序端并不支持server sent event,因此我们基于uni-push实现了这个替代方案。
- uniCloud响应体规范
- uniCloud响应体规范(uniCloud response format),是DCloud制定的、服务器给客户端返回json数据的一种建议格式
- 云对象、clientDB、uni-id公共模块均支持此规范
- 与uni-app前端的API错误回调风格统一,uniCloud响应体规范定义的云端返回信息(尤其是报错时)应包含errCode和errMsg
- errCode在成功时应返回数字0,失败时应返回一个以插件id开头的“字符串”,每个单词以连字符(-)分割
- 后续uniCloud会提供自动根据errCode对errMsg进行国际化处理的功能,开发者仅需保证云函数返回值满足uniCloud响应体规范即可
- 除此之外响应体规范还包含newToken字段,用于token的自动续期(云对象接收含有newToken的响应后会自动更新storage内存储的uni_id_token及uni_id_token_expired,此行为新增于HBuilderX 3.4.13)
- 开发者仅在自行调用uni-id-common的checkToken等会产生新token的接口时才需要返回新token,uni-app客户端和uni-id-co之间会自动管理token及续期
- HBuilderX 3.6.10及之后版本的错误规范
- HBuilderX内使用代码块returnu可以快速输入以下代码(HBuilderX 3.4.0及以上版本)
- 云函数环境中内置了uniCloud对象,扩展了一批新API
- uniCloud.database() 云数据库对象
- uniCloud.databaseJQL() 云函数中使用JQL语法操作数据库 详见,需添加扩展库
- uniCloud.redis() 使用redis 详见,需添加扩展库
- uniCloud.uploadFile() 云函数上传文件到云存储
- uniCloud.downloadFile() 云函数下载云存储的文件到云函数运行环境
- uniCloud.deleteFile() 云函数删除云存储的文件
- uniCloud.getTempFileURL() 获取云存储文件的临时路径
- uniCloud.customAuth() 使用云厂商自定义登录,仅腾讯云支持
- uniCloud.callFunction() 云函数/云对象中调用另一个云函数
- uniCloud.importObject() 云函数/云对象中调用另一个云对象
- uniCloud.httpclient 云函数中通过http访问其他系统
- uniCloud.httpclient返回的是一个urllib实例
- uniCloud.httpProxyForEip 使用云厂商代理访问http服务(阿里云的解决微信需要固定IP的方案),仅阿里云云端环境支持 详见,新增于HBuilderX 3.5.5
- uniCloud.sendSms() 发送短信,需添加扩展库
- uniCloud.getPhoneNumber() 获取一键登录手机号,需添加扩展库
- 注释:通过token,获取客户端一键登录时使用的手机号
- uniCloud.init() 获取指定服务空间的uniCloud实例
- uniCloud.logger 云函数中打印日志到uniCloud web控制台的日志系统
- uniCloud.getRequestList 获取当前云函数实例内正在处理的请求Id列表
- uniCloud.getClientInfos 获取当前云函数实例内正在处理的请求对应的客户端信息列表
- uniCloud.getCloudInfos 获取当前云函数实例内正在处理的请求对应的云端信息列表
- 云函数调用uniCloud接口时(包括请求云函数、云对象、云存储等)可能存在抛出错误的场景,此时会抛出uniCloud标准的错误对象(以下记为uniCloudError)
- errCode 错误码
- errMsg 错误信息
- requestId 请求Id,用于排查错误
- detail 仅云对象主动返回错误对应的响应体规范时会有此属性
- uniCloud.httpclient.request(URL,requestOptions)
- requestOptions参数说明
- content 手动设置请求的payload,设置后会忽略data
- 注释:payload是指请求体
- stream 发送请求正文的可读数据流
- 注释:传入fs方法读取的文件,用于节省内存,把文件转为流分批传出
- writeStream 接受响应数据的可写数据流
- 同上:传入fs方法读取的文件,用于节省内存,把响应返回的数据保存到文件中。
- content 手动设置请求的payload,设置后会忽略data
- requestOptions参数说明
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具