一:小程序云开发的基本页面结构
1.cloudfunctions是指定腾讯云开发的项目目录
2.miniprogram是指小程序中的代码
2.1 images中放的是小程序默认的图片文件
2.2 pages文件夹放的是小程序界面相关的文件,其下面的任一文件夹打开后都有4个文件,就是
小程序代码的基本结构文件
(1).js文件:脚本逻辑文件,页面和用户的交互逻辑
(2).json文件:配置文件,以json格式存储一些配置
(3).wxml文件:模板文件,描述页面结构,相当于html
(4).wxss文件:样式文件,调整页面样式,相当于css
2.3 style一般写的是通用的样式文件
3.README是写一些对项目的描述
4.project config.json是对小程序项目进行一些配置
5.在小程序中,json文件有这几种情况:
5.1 project.config.json:项目配置
(1)miniprogramRoot:小程序源代码的文件夹,它的名字要和左边目录的minniprogram文件夹名一致
(2)cloudfunctions:小程序云开发的文件目录,这个名字和左边目录的cloudfunctions文件名的名字一致
它包含:1.setting:项目配置的内容
urlCheck:是否启用安全检查的内容
es6:是否支持es6转化成es5
postcss:是否把代码的css样式的部分进行补全
minified:是否将代码压缩
newFeature
2.appid:就是app的id,和创建的时候的id是一样的
3.projectname:项目的名称
4.libVersion:项目对应的技术库的版本
5.2 app.json:全局配置(该文件在目录miniprograme下面)
(1)pages:模拟器默认打开的首页是pages数组中的第一句话表示的页面,(路由)
(2)window: backgroundColor:窗口的颜色;
backgroundTextStyle:窗口文字的样式(目前只有dark和light两种);
navigationBarBackgroundColor:导航栏中的颜色;
navigationBarTitileText:导航栏中文字的部分;
navigationBarTextStyle:是导航栏文字部分的颜色(但是目前只支持black和white)
(3)tabBar:客户端窗口的底部或顶部有tab栏可以切换的页面
在tabBar中有个List数组,指的是tab的列表,list数组最少2个tab,最多6个tab
list数组中包含几个对象:pagePath是配置的路径,要和pages配置过的路径一致;
text指的是tab中显示的文字;
iconPath指的是tab没有被选中时的图片路径;(暂不支持网络在线图片)
selectedIconPath是指tab被选中时的图片路径(不支持网络在线图片)
tabBar下面有个color和selectColor属性是和list数组同级的分别表示tabBar没有被选中的时候文字的颜色和tabBar被选中后文字的颜色
5.3 page.json:页面配置
6.页面结构WXML:
1.WXML是小程序框架设计的一套标签语言,结合小程序的基础组件、事件系统、可以构建出页面结构。充当的就是类似HTML的角色
2.小程序的数据绑定:(1)小程序中的数据一般情况下需要动态的从服务端获取,然后再渲染输出到视图中显示
(2)WXML中的动态数据均来自对应的Page的data
(3)数据绑定使用Mustache语法(双大括号)将变量包起来
3.常见的组件:
列表渲染:wx:for {{index}} {{item}} :for循环,index是数组中的索引值,item是索引值对应的值
(建议在wx:for后面加上wx:key,wx:key的值要是唯一的,类似vue)
条件渲染:使用wx:if= "{{condition}}" 来判断是否需要渲染该块代码,也可以用wx:elif和wx:else来
添加一个else块
wx:if和hidden的区别:如果需要频繁切换的情景下,用hidden更好,如果在运行时条件不大可能改变的 情况下用wx:if更好(这个也类似vue),(当判断为不需要渲染到页面中时,wx:if
的代码就不会显示在源码中,而不管内容需不需要渲染到页面上去,hidden的代
码都会在源代码Wxml中存在)
7.WXSS:
1.WXSS是一套用于小程序的样式语言,用于描述WXML的组件样式,也就是视觉上的效果
2.尺寸单位:rpx:可以根据屏幕宽度进行自适应,适配不同宽度的屏幕,规定屏幕宽为750rpx,1rpx=0.5px=1物理像素
3.引入外部的wxss:@import'./text_0.wxss';引用路径为相对路径(相对路径指的是相对于当前文件本身来说)
4.第三方样式库:(1)WeUI:WeUI是一套同微信原生视觉体验一致的基础样式库
(2)iView Weapp:是一套高质量的微信小程序UI组件库
(3)Vant Weapp:是一种轻量,可靠的小程序UI组件库
8.页面交互--JS:
1.JS负责逻辑交互
2.计数器demo
9.事件机制:
1.事件是对用户的交互操作行为的响应,(bind绑定事件处理函数,需要加上tap即bindtap)
2.bind绑定和catch绑定的区别: bindtap允许事件冒泡,catchtap不允许事件冒泡(即当子父元素有部分重合时,在使用
bind绑定时,点击子元素时,父元素也会被触发,而使用catch绑定时,点击子元素时,
父元素不会被触发,是被阻止触发的)
绑定事件处理函数的例子:WXML中
而在js代码中是直接写 onTapBoxHanderler: function(){console.log('父box被点击')}
onTapChildHandler: function(){console.log('子box被点击')}
(因为这是直接在wxml中绑定好了函数的,不需用获取id方式来绑定)
备注:这是直接在上面绑定函数,不用再获取id后绑定函数,且也可以这么写catch:tap和bind:tap
3.事件对象:代表事件的一个状态,当组件的某个事件被触发的时候就会出现这个事件对象到绑定的函数当中
介绍其包括的几个属性:type:tap 表示事件类型为tap类型
timeStamp 表示事件生成时的一个时间戳
target 表示触发事件的组件的属性的集合
currentTarget 表示当前组件的属性的集合
小程序中自定义属性:data- 例如:自定义属性id:data-id,
自定义的属性在target下的dataset中找到
--------------------------------------- 二:微信小程序-云开发----------------------------------------------------
二:微信小程序-云开发 (备 注:1.客户端指的是用户看到的界面,是小程序的前端部分 2.云开发模式在顶部栏,编译模式也在顶部)
-------------------------------------------1.云开发介绍-----------------------------------------------------
1.云开发介绍:(1)微信小程序-云开发是腾讯云和微信共同合作推出的,有云函数,云数据库,云存储
(2)小程序传统开发模式:客户端 + 服务端(包含后端代码,数据库) + 运维(DB运维、文件存储、内容加速、网络防护、
容器服务、负载均衡、安全加固等等)
小程序的云开发模式:客户端 + 云开发(包括云函数、云数据库、云存储)
客户端可以调用云函数来处理业务逻辑,然后可以在云函数里调用云数据库,客户端也可以上传相应的文件到云存储,整个云开发是部署在腾讯云上的,所以不需要运维来管理
(3)云开发的三大基础能力支持: a.云函数:获取appid、获取openid、生成分享图、调用腾讯云SDK等等
b.云数据库:数据增加,数据删除,数据修改,数据查询等等
c.云存储:管理文件,上传文件,下载文件,分享文件等等
(4)云开发的开通: a.同意开发云开发环境
b.基础环境,基础版,每个小程序的账号可免费创建两个环境,建议:开发环境和生产环境
c.调试基础库的版本:要在2.2.3以上版本,在这版本上才可以使用云开发(在最右边的详情中)
(5)云开发的控制台的使用: a.概览界面:能看到当天的活跃数,api调用数,数据库的存储容量以及容量的使用情况
b.用户管理:能看到哪些用户在使用我当前的云开发,授权过的和未授权过的
c.数据库:集合(关系表)
d.存储管理:当前云存储中管理了哪些文件以及文件的路径大小更新时间,对文件的操作
e.云函数
f.统计分析
---------------------------------------- 2.云数据库-------------------------------------------------------
2.云数据库:云开发提供了一个JSON数据库,提供2GB免费存储空间
1. 基本介绍:
(1)关系型数据库:数据库database, 表table, 行row, 列column
文档型数据库:数据库database, 集合collection, 记录record/doc, 字段field
备注:经常去查询数据库表与表之间的关系时关系数据库更适合,而文档数据库更适合对数据库进行频繁的
读写操作(在小程序的云开发中支持的是文档型数据库,文档性数据库中的集合就相当于是数据表)
(2)数据类型:String:字符串,Number:数字,Object:对象,Array:数组,Bool:布尔值,
GeoPoint:地理位置点(特殊的存储类型,对这个字段进行查找的话,需要建立地理位置的索引)
Data:时间(小程序端创建的时间是客户端的时间,并不是服务端的时间),
null:相当于是占位符,表示字段存在,但是她的值为空
(3)操作云数据库:a.小程序控制(读写数据库受权限控制限制)
b.云函数控制(拥有所有读写数据库的权限)
c.控制台控制(拥有所有读写数据库的权限)
(4)云数据库权限管理的几种情况: a.仅创建者可写,所有人可读(比较适合文章)
(在数据库的权限设置里) b.仅创建者可读写(比较适合私密的相册)
c.仅管理端可写(比较适合商品的信息)
d.仅管理端可读写(比较适合后台一些敏感的数据)
(5)数据库的初始化: a.初始化:const db = wx.cloud.database()
(微信小程序提供的接口,后面代码中的db就是这个,代表我们的云数据库)
b.切换环境:const testDB = wx.cloud.database({ env:'test'})
(开发或测试环境)
2.对云数据库的操作:
(1)插入数据:
Ⅰ.在小程序的wxml页面中写一个插入数据的按钮:
Ⅱ.打开云开发中的数据库,创建一个空集合user
Ⅲ.在该小程序的js页面中写代码:
--------------------(promise写法)----------------
//先在页面最上面初始化数据库
const db = wx.cloud.database(); //db就代表了云数据库
//定义绑定的insert处理函数
insert:function(){
db.collection('user').add({ //获取集合user并调用add方法向其插入数据
data: {
name: 'DN',
age: 23
}
}).then(res=>{
console.log(res);
}).catch(err=>{
consloe.log(err);
})
}
解释:.then(res=>{}).catch(err=>{}),then表示当操作成功时,会进入到then函数里面,
去执行then里面的代码,如果操作失败则进入catch里面,执行catch里的代码。
注:数据插入成功后,回到云数据库的记录列表的界面能看到插入数据的信息,"_id"表示当前
数据的唯一标识,相当于关系数据库中的主键,"_openid"表示当前的数据是由openid的用户插入的,然后下面的字段就是对应的刚才插入的数据
(2)更新数据:
Ⅰ.在小程序的wxml页面中写一个更新数据的按钮:
Ⅱ.在该小程序的js页面中写代码:
//要更新数据,就需要知道更新的是哪条数据--->获取要更新数据的唯一标识:"_id"
updata:functon(){
db.collection('user').doc('1a2751ws1ds3d').updata({
data:{
age:24
}
}).then(res=>{
console.log(res);
}).catch(res=>{
console.log(err);
})
}
解释:.doc方法里写的是要更新数据的id值,这个id值是瞎写的,意思一下
(3)查找数据:
Ⅰ.在小程序的wxml页面中写一个查找数据的按钮:
Ⅱ.在该小程序的js页面中写代码:
search:functon(){
db.collection('user').where({
name: 'DN' //查询的条件是name为DN的数据
}).get().then(res=>{ //然后用get方法把查询的数据取出来
console.log(res);
}).catch(res=>{
console.log(err);
});
}
注意:查询时可能会涉及到权限问题,有的数据查询不了,
(4)删除一条数据:
Ⅰ.在小程序的wxml页面中写一个删除数据的按钮:
Ⅱ.在该小程序的js页面中写代码:
//要删除数据,就需要知道删除的是哪条数据--->获取要删除数据的唯一标识:"_id"
delete:functon(){
db.collection('user').doc('sdfdsf14242').remove().then(res=>{
console.log(res);
}).catch(res=>{
console.log(err);
});
}
解释:和上面一样doc中的id是瞎写的,小程序中要求:在进行多条数据删除时,小程序端是没
有办法控制的,需要调用云函数,在云函数中进行批量的删除
---------------------------------------- 3.云函数介绍---------------------------------------------------------
3.云函数:运行在云端的代码,相当于是小程序服务端的后台的代码(相当于定义在云端的方法)
1.安装及检查版本:a.安装node.js环境:下载node.js安装包,需要Node.js v8.0及以上版本;
b.安装成功后,cmd命令窗口输入node -v或node --version,检查安装的版本号(测试是否安装成功);
c.如果之前已经安装好了node环境,再次安装就会覆盖旧版,变为此次安装的新版;
2.云函数:这里演示三个函数
(1)求和函数sum():
Ⅰ.在当前的根文件夹上右键新建一个node.js云函数,为云函数命名后回车,点击云函数界面就可以看到刚
创建的云函数,这里将函数命名为sum
Ⅱ.创建时可能出现的错误:a.提示是否需要安装wx-server-sdk(微信服务端sdk)----点击确定即可
b.在调用云函数的时候提示服务端sdk未安装---右键点击当前的云函数根目录选
择从终端打开,通过npm的命令来安装最新版本的wx-server-sdk
(输入安装命令:npm install --save wx-server-sdk @latest)
Ⅲ.创建好sum函数后:打开创建的sum函数会有两个文件,index.js文件指示云函数的入口文件,
(重要) package.json中定义了当前的云函数所需要的模块及对应的云函数的配置信息
Ⅳ.在云函数入口函数中写入删除数据表数据的代码:exports.main = async(event,context) => {
(云函数下的index.js文件) return{
sum: event.a + event.b
}
}
一定不要忘记右键上传部署这个云函数
解释:通过event可以得到当前调用云函数的时候在小程序客户端传过来的对应的参数,
context指的是微信调用上下文,其中也包括当前用户的信息
V.在小程序的wxml页面中为按钮绑定求和事件:
Ⅵ.在对应的小程序的js页面去调用这个云函数:sum:function(){
wx.cloud.callFunction({ //调用云函数的方法
name: 'sum', //调用名字为sum的云函数
data:{ //通过data传递相应的参数
a: 2,
b: 3
}
}).then(res =>{//运用回调函数打印成功或失败的结果
console.log(res);
}).catch(err =>{
console.log(err)
});
}
(2)获取当前用户的openid:(小程序自带的login函数下的index.js文件,该文件作用就是获取当前用户信息的)
Ⅰ.在小程序wxml页面中绑定事件:
Ⅱ.在小程序的js页面中写该事件的逻辑处理:getOpenId:function(){
wx.cloud.callFunction({ //调用云函数
name: 'login'//这个是调用小程序自带的login云函数
}).then(res =>{ //运用回调函数打印成功或失败的结果
console.log(res);
}).catch(err =>{
console.log(err)
});
}
对自带的login云函数不要忘记右键上传部署
(3)批量删除云数据库的数据:
Ⅰ.在当前的根文件夹上右键新建一个node.js云函数,为云函数命名后回车,这里将函数命名为
batchDelete
Ⅱ.a.假设已经有个数据库表了,在函数batchDelete下的index.js文件中先获取数据库,
代码:const db=cloud.database();----写在cloud.init()下面。
b.然后在云函数入口函数中写入删除数据表数据的代码:(云函数下的index.js文件)
exports.main = async(event,context) =>{
try {
return await db.collection('user').where({
name: 'jerry'
}).remove();
} catch (e) {
console.error(e);
}
}
不要忘记右键上传部署云函数
解释:try{}catch{}是捕获异常,await是es7中异步,user是数据表名,where中的是条件是
name为jerry的。
Ⅲ.在小程序wxml页面中为按钮绑定事件:
Ⅳ.在对应的小程序的js页面中写该事件的逻辑处理:
batchDelete:function(){
wx.cloud.callFunction({ //调用云函数
name: 'batchDelete' //调用名字为batchDelete的云函数
}).then(res =>{ //运用回调函数打印成功或失败的结果
console.log(res);
}).catch(err =>{
console.log(err)
});
}
总结:1.wxml是描绘静态页面,给用户看的和点击的----wxml页面做的事:绑定各种事件;
2.当用户点击了按钮,触发了事件,小程序的js页面(相当于html代码中用标签),它的作用就是去调用云端的
方法,通过方法wx.cloud.callFunction({ name:'云函数名' })来去调用这个云端函数来实现触发事件的-----小程
序js页面要做的事:定义触发事件,调用云端函数,给出云函数方法的实参,成功或失败时的描述;
3.云函数就相当于定义在云端的方法,真正定义事件触发效果的函数,供小程序的js页面调用;
4.小程序做不了的事,就要调用云函数的方法,小程序的wxml和js页面只能做一些简单的处理,详情见云数据库的删除操作
---------------------------------------- 4.云存储介绍-------------------------------------------------------
4.云存储:
4.1.云存储(第一部分:文件的上传): (5GB的存储空间去使用)
(1)调用api接口实现各种操作:a.wx.cloud.uploadFile------上传文件
b.wx.cloud.downloadFile----下载文件
c.wx.cloud.deleteFile------删除文件
d.wx.cloud.getTempFileURL--获取临时链接
(2)文件上传的流程:用户选择相册中的图片或者拍照上传到小程序中,小程序上传刚才用户选择的图片到云存储,紧接着云
(重要) 存储会返回相对应图片的fileID到小程序上,小程序端把这个fileID存到云数据库中。
总结:a.用户选择手机相册照片或拍摄照片;
b.使用小程序上传图片到云存储;
c.云存储返回文件 fileID 给小程序(fileID是当前文件的唯一标识)
d.小程序将 fileID 存储到云数据库,方便后期使用
(3)代码演示流程: (图片上传的流程)
Ⅰ.在小程序的wxml页面中为按钮绑定云存储事件:
Ⅱ.打开云开发模式,点击数据库一栏,创建一个新的集合,因为是用来放图片的,命名为image,这个集合
里是空的,通过代码把把上传的图片的fileID存到云数据库中,如下
Ⅲ.在小程序的js页面中写该事件的逻辑处理:(需要调用小程序上传文件的接口)
upload: function(){
//1.这一段是用户选择相册图片或拍摄照片,上传到小程序(看小程序开发文档的api)
wx.chooseImage({ //这些方法是微信小程序提供的接口
count:1, //当前选择图片的个数,最多9张
sizeType: ['original','compressed'], //当前是以源文件的形式上传还是压缩的形式上传
sourceType: ['album','camera'], //当前图片的来源,album指的是相册,camera指的是拍照
success(res){ //当用户选择图片成功时的回调函数
//tempFilePath可以作为img标签的src属性显示图片(重要,在下面的文件的下载被运用)
const tempFilePaths = res.tempFilePaths //临时文件路径
console.log(tempFilePaths); //打印一下临时文件路径
//2.这一段是小程序上传刚才用户选择的图片到云存储
wx.cloud.uploadFile({ //这些方法是微信小程序提供的接口
//上传至云端的路径,用上传的时间来命名可以防止因重名被覆盖
cloudPath: new Date().getTime()+'.png',
filePath: tempFilePaths[0], //小程序临时文件路径,这个是数组形式的
//3.这一段是成功上传到云存储后,云存储返回文件的fileID,通过回调函数
success: res =>{
console.log(res.fileID) //成功上传到云存储时打印出fileID
//4.这一段是把图片的fileID存到云数据库的image集合中
db.collection('image').add({ //小程序接口:向叫image的集合中添加数据
data: { //数据以对象的形式,内容是fileID
fileID: res.fileID
}
}).then(res =>{
console.log(res); //成功存到云数据库的image集合后打印的值
}).catch(err =>{
console.error(err);//这个失败是:存到云数据库的image集合失败时打印的值
})
},
//5.这一段是上传到云存储失败后,打印错误信息,上面的3,4段是成功上传云存储的情况
fail: console.error //这个失败是:上传云存储失败时打印的错误值
})
}
})
}
(4)文件上传的流程总结:1.用户选择手机相册照片或拍摄照片;
2.使用小程序上传图片到云存储;
3.云存储返回文件 fileID 给小程序(fileID是当前文件的唯一标识)
4.小程序将 fileID 存储到云数据库,方便后期使用
4.2.云存储(第二部分:用户自己上传的图片在小程序端的展示【好比头像】):
(1)用户上传图片的展示流程:a.首先要获得当前用户的openid,需要调用小程序提供的login云函数来获取openid
b.当login云函数成功返回当前用户的openid时,再根据openid去查询该用户上传所有的图片 的fileID,再利用get方法来获取到这些图片的fileID
c.新建一个空数组,将获取到的fileID存进这个数组中
d.在wxml页面,使用block作为循环块,将数组中的图片通过fileID遍历出来
(2)代码演示流程: (用户自己上传的图片展示在小程序的客户端上)
Ⅰ.在小程序的wxml页面中为按钮绑定云存储事件:
Ⅱ.在小程序的js页面中写该事件的逻辑处理:
//先在最上面的页面的初始数据data对象中初始化数组
data: { images: [] }
//对事件进行逻辑处理,定义绑定的处理函数
getFile:function(){
//调用小程序提供的login云函数去获取当前用户的openid
wx.cloud.callFunction({
name: 'login',
}).then(res=>{
//这步是成功返回openid后,根据openid来获取图片的fileID
db.collection('image').where({ //image是云数据库创建的集合(数据表)的名字
_openid: res.result.openid //这一句是条件,在image集合中查询条件为openid的用户
}).get().then(res2=>{ //将openid的用户上传的所有图片信息(fileID)用get获取出来
console.log(res2); //打印的res2是图片的信息即图片的fileID
this.setData({
images: res2.data //把每个图片的fileID存到images数组中去
});
})
})
}
Ⅲ.将获取到的图片展示在wxml页面中,所以在接着在wxml页面中写代码,,最终代码是:
//使用block作为循环块,block很像网页中的div,区别就是block不会被当作标签渲染到页面
//不知道该数组有几个图片,所以要遍历数组
4.3.云存储(第三部分:图片或文件的下载):
(1)a.小程序端向云存储获取当前文件的fileID(这是文件上传流程的第3步--返回给小程序fileID,小程序需要下载时获取)
b.用户在小程序端点击下载
c.小程序端发送文件下载请求到云数据库,请求中带有该下载文件的fileID
d.云数据库根据收到的fileID返回给小程序端需要的文件信息
e.小程序端调用相应的方法存储图片,存到手机相册中
(2)代码演示流程: (小程序的图片下载或保存到本地相册)
Ⅰ.在小程序的wxml页面中继续为按钮绑定云存储事件(接着第二部分):
//使用block作为循环块 block不会被当作标签渲染到页面
Ⅱ.在小程序的js页面中定义文件下载的函数:(需要调用小程序下载文件的接口)
downloadFile: function(event){
wx.cloud.downloadFile({ //调用小程序下载文件的接口
fileID:event.target.dataset.fileid, //文件ID
success: res =>{
//返回临时文件路径
console.log(res.tempFilePath)
//保存图片到手机相册,调用小程序的接口方法saveImageToPhotoAlbum将图片保存到本地相册
wx.saveImageToPhotoAlbum({
filePath: res.tempFilePath,
success(res) { //wx.saveImageToPhotosAlbum不可以使用.then和.catch语句
wx.showToast({
title: '保存成功'
})
}
})
},
fail: console.error
})
}
4.4.总结上面介绍的云存储的三个部分最后的效果:
(1)图片上传就是用户选择相册图片或拍照上传,
(2)图片展示就是在页面上有个图片展示的按钮,用户点击这个按钮后,图片就显示出来了
(3)图片下载这个按钮是代码在2的基础上增加的,写在标签中,效果就是当用户点击2步中的图片展示按钮后,
图片会展示出来,然后在图片的下面有个图片下载按钮,点击图片下载就可以下载图片到本地
三: 云数据库和云存储的关系:云存储是存储文件的地方,微信小程序给了云存储5G的空间,云数据库是管理这些文件的地方,云存储会给
每个文件一个唯一的fileID,云数据库就通过这个fileID间接的去管理云存储的东西,比如用户要下载某
个图片,这个图片会存到云存储中,这个图片的fileID被存到云数据库中。东西是存在云存储中的,这个东
西的唯一标识xxID是存在云数据库的
Ⅰ、Ⅱ、Ⅲ、Ⅳ、Ⅴ、Ⅵ、Ⅶ、Ⅷ
小程序的主体:想使用小程序的支付功能就必须要开通微信支付的商户账号,而开通账号的话必须要具备企业的资质,个人的资质是无法开
通商业账号的,所以想要小程序有支付的功能的话,必须要经过认证才行,而个人的主体是不支持认证的,所以说个人主体的小程序是无法完成支付的功能的。
在微信里面还有卡券的功能,包括有储值卡,会员卡等等,像这些会员卡都涉及用户财产安全的接口,需要经过严格的审核,所以说个人主体也是无法使用卡包功能的。
微信还具有搜索附近小程序的功能,这个功能的作用是为了方便用户快速寻找到隐藏在我们身边的服务,但是这个功能目前只支持企业、媒体、政府以及其他组织的小程序主体的注册。
注意:微信小程序的主体信息一旦提交以后是不可以变更的
邮箱是作为登录账号使用的,所以也是唯一的!一个邮箱注册一样微信产品。
开通云开发模式:首先打开小程序的开发工具,点击云开发选项,进入到云开发的开通界面,选择开通并确认开通,然后进入到环境创建的
界面,建议创建生产和测试两个环境,然后在详情->本地设置中调试基础库版本,至少为2.2.3以上版本,不然用不了云函数,关掉重启小程序开发工具