- wx.loadFontFace API真机不执行?
[图片] 在app.js中下载开发者工具没问题,真机不执行。 [图片] [图片] [图片]
2020-11-19 - 云开发实战-如何维护用户表?(优化版)
前言 之前写过一篇《云开发-如何维护用户表?》,这种方式是最简单的,经过阅读了一些开源项目的代码,我优化了部分写法。 对比 优化前实现思路: 通过 login 云函数获取 openid 存放到本地 在授权信息的时候去添加 userInfo 根据 openid 去查询是否已经存储 没有查到就是新用户进行添加并存放 id 到本地 查看后老用户就根据 id 进行更新信息 优化后实现思路: 在 app.js 通过 queryCurrentUser 云函数查询 openid 是否在用户表 得到状态后存放在 app.js 的全局变量 authorized 属性里面 当需要用户授权的时候判断状态,没有就跳转到授权页面 进行授权调用 authorize 云函数添加用户 代码 在 app.js 通过 queryCurrentUser 云函数查询 openid 是否在用户表 得到状态后存放在 app.js 的全局变量 authorized 属性里面。 [代码]wx.cloud.callFunction({ // 云函数名称 name: 'user', // 传给云函数的参数 data: { action: 'queryCurrentUser' } }).then(res => { if (res.result.errMsg === 'user.query.ok') { this.onAuthorized(res.result.data.userInfo); this.authorized = true; } wx.hideLoading(); }) onAuthorized(userInfo) { this.authorized = true; this.globalData.userInfo = userInfo; }, [代码] queryCurrentUser 云函数 [代码]async queryCurrentUser(context, params) { const { OPENID } = context; let res = await db.collection('users').where({ openid: OPENID }).get(); if (res.data.length === 0) { return { errMsg: 'user.query.none' }; } return { errMsg: 'user.query.ok', data: { userInfo: res.data[0].userInfo } }; }, [代码] 当需要用户授权的时候判断状态,没有就跳转到授权页面 index.js [代码]toInfo(res) { if (app.authorized !== true) { wx.navigateTo({ url: '/pages/authorize/authorize' }); return; } // 省略业务代码.... } [代码] 进行授权调用 authorize 云函数添加用户 authorize.js [代码]wx.cloud.callFunction({ // 云函数名称 name: 'user', // 传给云函数的参数 data: { action: 'authorize', userInfo: userInfo } }).then(res => { if (res.result.errMsg === 'user.authorize.ok' || res.result.errMsg === 'user.authorize:authorized') { app.onAuthorized(res.result.data.userInfo); wx.showLoading({ title: '授权成功' }); setTimeout(() => { wx.hideLoading(); app.navigateBack(); }, 1000); return; } wx.nextTick(() => { wx.showToast({ title: '授权失败', icon: 'none', duration: 1000 }); }); }); [代码] authorize 云函数 [代码]const authorizedRes = { env: cloud.DYNAMIC_CURRENT_ENV, errMsg: 'user.authorize:authorized' }; async authorize(context, params) { const { OPENID } = context; let getRes = await db.collection('users').where({ openid: OPENID }).get(); if (getRes.errMsg !== 'collection.get:ok') { return errorAuthorizeRes; } if (getRes.data.length > 0) { return authorizedRes; } let addRes = await db.collection('users').add({ data: { openid: OPENID, userInfo: params.userInfo, authorizedTime: new Date(), } }); return { errMsg: 'user.authorize.ok', data: { userInfo: params.userInfo } }; } [代码] 总结 这种方式优点如下: 用云函数来验证,云函数可以直接获取 openid 通用统一的授权页面进行授权,这样就不需要在不同的地方写同样的授权代码 添加逻辑在云函数中实现,改小程序前端代码需要重新发版,云函数部署就行 代码需要不断优化才能更好。
2020-09-16 - #小程序云开发挑战赛#-运动会管理系统-业余爱好队
[图片] 运动会管理系统适用于各级各类学校(单位)召开运动会进行在线报名管理查询,可以同时有多个单位使用。召开运动会是一件很繁琐的事情,团队上报名单后,工作人员需要对名单进行分组整理,工作量很大,且数据容易搞错,运动会召开期间,检录、上场、终点记录、发放奖品都需要比赛数据,传统的比赛,需要安排工作人员跑动传递纸质数据,应用本系统后,所有比赛数据可以在小程序里共享查阅,既准确又方便;面对当前疫情,同时也减少人员聚集。 基本思路是:单位注册后,管理员设置比赛分组、设置各组项目,设置各团队,设置裁判、给各裁判赋权,设置比赛日程等基础功能。然后各领队登录,可以添加运动员,同时可以给运动员报项目。运动员也可自己登录后填报项目。比赛期间,裁判登录后,可以依据管理员赋予的权限,对各个比赛项目进行运动员检录、安排运动员上场、记录运动员成绩、对比赛进行裁决(转下一赛程或确定名次)。管理员可以控制领队、运动员、裁判的登录权限,可以控制数据是否公开,如果设为数据公开,任何人可即时查阅报名、比赛的实时数据。管理员还可以下载报名后按项目分类运动员名单,可以下载比赛日程表等。 管理员、领队、裁判员可以使用密码登录,也可以使用“手机号+验证码”登录。管理员可以清理所有比赛数据。领队可以初始化运动员登录密码。各类人员登录后都可以修改基本信息、登录密码。 打开首页下“关于”页面中,选择不同身份,可以查阅详细的使用说明。 所有人员打开本系统后,在征得用户同意的情况下,读取地址确定当前所在省市县(区),注册时即切换到相应的区县进行信息填写。 开发本系统运用到如下技术:微信组件开发、云数据库开发、云文件存储、阿里云验证短信,百度位置获取。 程序架构图 [图片] 项目文件说明: 本软件常用变量、对象、数组名说明: 对象、变量、数组: dw、danwei-单位对象,与数据集合danwei对应,dwid-单位id,dwmc-单位名称,diqu-地区,ydhmc-运动会名称; fz、fenzu-分组,指的是运动会分组,与数据集合fenzu对应,fzid-分组id,zm-组名; xiangmu、xm-项目,比赛项目,与数据集合xiangmu对应,xmid-项目id,xmm-项目名; td、tuandui-团队,与数据集合tuandui对应,tdid-团队id,tdmc-团队名称,ldsj-领队手机; caipan、cp-裁判,与数据集合caipan对应,cpid-裁判id,cpsj-手机,cpxm-裁判姓名; yundongyuan、ydy-运动员,与数据集合yundongyuan对应,bh-编号,xm-姓名; 其他数据集合: baoming-报名数据集合,运动员报名数据,下次运动会报名覆盖,建议每次报名前先清空; bisaishuju-比赛数据集合,比赛过程中记录数据,下次比赛覆盖,建议正式比赛前先清空; chengji-成绩数据集合,比赛结束,获奖者数据,长久保存,便于查阅; 方法名: hqsj-获取数据,hqfz-获取分组,hqxm-获取项目,hqcp-获取裁判,hqydy-获取运动员,一般是页面(组件)加载时读取数据,需要重新获取时也会调用此方法,返回对象数组的第一个数据对象 xzfz-选中分组,xzxm-选中项目,xzcp-选中裁判,一般是下拉框选中时触发的方法,返回选中的对象; ip??-一般是input组件触发,对绑定变量进行赋值; 文件夹说明: pages-页面文件夹,这里的每个页面都含有tab面板 pages/caipan-裁判页面 pages/default-首页 pages/guanliyuan-管理员页面 pages/lingdui-领队页面 pages/yundongyuan-运动员页面 component-组件文件夹 component/caipan-“裁判”页面所用的组件 component/caipan/caipan-裁判页面裁判面板所用组件 component/caipan/caipan/caijue-裁决组件 component/caipan/caipan/jianlu-检录组件 component/caipan/caipan/jilu-记录组件 component/caipan/caipan/shangchang-上场组件 component/caipan/shezhi-裁判页面设置面板所用组件 component/default/about-“关于”页面组件 component/default/about/gly-管理员使用说明 component/default/about/cp-裁判使用说明 component/default/about/ld-领队、运动员使用说明 component/default/chakan-“查看”页面组件 component/default/chakan/bisaijindu-比赛情况 component/default/chakan/bisaixiangmu-比赛项目 component/default/chakan/bmtj-报名统计 component/default/chakan/mcb-名次榜 component/default/chakan/tdcj-团队成绩 component/default/chakan/tdjf-团队积分 component/default/chakan/tdtj-团队统计 component/default/denglu-“登录”页面组件 component/default/denglu/caipan-裁判登录 component/default/denglu/guanliyuan-管理员登录 component/default/denglu/lingdui-领队登录 component/default/denglu/yundongyuan-运动员登录 component/default/zhuce-“注册”页面组件 component/guanliyuan-管理员组件 component/guanliyuan/caipan-“裁判”面板 component/guanliyuan/caipan/tianjiacaipan-添加裁判 component/guanliyuan/caipan/caipanfuquan-裁判赋权 component/guanliyuan/shezhi-管理员设置面板 component/guanliyuan/shezhi/jibenshezhi-基本设置 component/guanliyuan/shezhi/richengshezhi-日程设置 component/guanliyuan/tuandui-团队管理 component/guanliyuan/xiangmu-项目管理 component/guanliyuan/xiangmu/fenzu-分级管理 component/guanliyuan/xiangmu/xiangmu-项目管理 component/lingdui-领队组件 component/lingdui/baoxiangmu-报项目 component/lingdui/shezhi-设置 component/lingdui/yundongyuan-运动员管理 component/yundongyuan-运动员组件 component/yundongyuan/baoxiangmu-报项目 component/yundongyuan/shezhi-设置 compoent/tongyong-通用组件 biaoti-标题;bmlb-报名列表;bslb-比赛数据列表;button-按钮;caipan-裁判下拉框; cjlb-比赛成绩列表;danwei-单位选择组件;fenzu-分组下拉框;richeng-日程列表; saicheng-赛程下拉框;tuandui-团队下拉框;xiangmu-分组项目组合下拉框; xiugaimima-修改密码;yanzheng-验证码;ydybh-运动员编号下拉框;ydylb-运动员列表。 效果图展示: 首页: [图片][图片][图片][图片] 查看: [图片][图片][图片][图片][图片][图片][图片][图片][图片] 管理员: [图片][图片][图片][图片][图片][图片][图片][图片] 领队: [图片][图片][图片][图片] 运动员: [图片][图片][图片] 裁判员: [图片][图片][图片][图片][图片][图片][图片] 部分功能代码: 收发阿里云短信云函数: // 云函数入口文件 const cloud = require('wx-server-sdk') const Core = require('@alicloud/pop-core'); const accessKeyId = '' // 你的appid const accessKeySecret = '' // 你的secret const SignName = '运动会管理微信小程序' // 你的签名 const TemplateCode = 'SMS_179130189' // 你的模版CODE var client = new Core({ accessKeyId, accessKeySecret, endpoint: 'https://dysmsapi.aliyuncs.com', apiVersion: '2017-05-25' }) let params = { SignNameJson: JSON.stringify([SignName]), TemplateCode: TemplateCode, } cloud.init({}) exports.main = async(event, context) => { return new Promise(async(resolve, reject) => { try { var xx={yzm:'xxxx',ts:''} if(!event.phone) xx={yzm:'xxxx',ts:'手机不能为空!'} if(!/^[1][3,4,5,6,7,8,9][0-9]{9}$/.test(event.phone)) xx.ts='手机号码格式错误!' if(xx.ts==''){ let code = Math.floor(Math.random() * 9000) + 1000 //发送短信 let { Code } = await client.request('SendBatchSms', Object.assign({ PhoneNumberJson: JSON.stringify([event.phone]), TemplateParamJson: JSON.stringify([{code}]) },params), { method: 'POST' }) if(Code == 'OK') {xx.yzm=code;xx.ts='发送成功!'} } resolve(xx) } catch (error) { resolve({yzm:'xxxx',ts:'发送出错!'}) } }) } 批删除云函数: // 云函数入口文件 const cloud = require('wx-server-sdk') cloud.init({env: '',}) const db = cloud.database() // 云函数入口函数 exports.main = async (event, context) => { const wxContext = cloud.getWXContext() try { return await db.collection(event.jihe).where(event.tiaojian).remove() } catch(e) { console.error(e) } return { event, openid: wxContext.OPENID, appid: wxContext.APPID, unionid: wxContext.UNIONID, } } 自定义button组件: wxml文件: [图片] js文件: Component({ /** * 组件的属性列表 */ properties: { width:{ type:String, value:'160rpx' }, text:{ type:String, value:'确定' } }, /** * 组件的初始数据 */ data: { }, /** * 组件的方法列表 */ methods: { bttap(){ this.triggerEvent("bttap",'') } } }) wxl文件: .zdybt{ display: flex; flex-direction: column; align-items:center; margin: 5rpx; border-width: 1rpx; border-color: black; border-style: solid; background-color: gold; } .zdybt2{ display: flex; flex-direction: column; align-items:center; background-color: goldenrod; } 作品二维码: [图片] 团队介绍:张建明,男,1988年中师毕业,从事中小学教学工作三十余年,曾教过中小学数学、物理、计算机等课程,现在浙江省杭州市淳安县教育局招生考试服务中心工作。中师读书时接触计算机以来,一直是计算机编程爱好者,自学了BASIC语言、C语言、C#语言、SQL数据库查询语言、JS语言等,用VB6.0编写过中小学排课软件、自2003年起一直用Visual Studio+SQLserver系列软件做过一些学校报名、信息管理类桌面软件或web网站,其中淳安县中考报名录取管理系统已平稳使用七年。 2019年下半年初步接触微信小程序编程,做了高考体检数据录入小程序,疫情和暑假期间自学了VUE前端编程,对小程序编程有了进一步的理解,于是8月份开始,试着编写了的运动会管理小程序,本意是开学后给各中小学开运动会使用,刚好赶上“小程序云开发挑战赛”,于是就报名参加了这一比赛,希望我的作品能获奖。 ”
2020-09-17 - 求助,如何在云数据库中通过一个对象的数量进行排序?
小程序使用云数据库,在同一集合中存储课程标题,内容,点赞用户信息等内容。用户在前台搜索的时候如何通过点赞用户数量进行排序且分页? 代码: courses集合: [{ title:'111', content: 'xxx', stars: [{ name: 'name1', open_id: 'xxx' }] },{ title:'222', content: 'xxx', stars: [{ name: 'name1', open_id: 'xxx' },{ name: 'name2', open_id: 'xxx1' }] },{ title:'333', content: 'xxx', }] 希望实现的排序结果: [{ title:'222', content: 'xxx', stars: [{ name: 'name1', open_id: 'xxx' },{ name: 'name2', open_id: 'xxx1' }] },{ title:'111', content: 'xxx', stars: [{ name: 'name1', open_id: 'xxx' }] },{ title:'333', content: 'xxx', }] 尝试的解决方案: 第一种: db.collection('courses').orderBy('stars', 'desc').skip(i * MAX_LIMIT).limit(MAX_LIMIT).get() 此方法无法正确实现通过stars的数量进行排序,况且如果stars不存在的话还会报错,如果存在orderBy('stars.length', 'desc')这种的话就更好了。 第二种: db.collection('courses') .aggregate() .unwind({ path: '$stars', preserveNullAndEmptyArrays: true }) .sortByCount('$_id') .end() 这种也不可以,得到的结果类似于[{"_id":"xxx", count: xxx},{"_id":"xxx", count: xxx},{"_id":"xxx", count: xxx}], 无法获取title, content等的内容 第三种: const $ = db.command.aggregate db.collection('cats').aggregate() .project({ stars: $.concatArrays([{"name":"good"}]), }) .project({ starnum: $.size('$stars') }).sort({ starnum: -1 }) .end() 这种也存在问题。 现在我想到的唯一解决方案是取出全部数据然后在js里面进行排序,这样的话数据量大了太消耗性能了,大家有没有好的解决方案?
2020-05-07 - 5行代码实现微信小程序模版消息推送 (含推送后台和小程序源码)
由于小程序2020年1月10日以后改模板消息为订阅消息,所以我写了一篇新的文章来更新这个知识点 《小程序订阅消息推送(含源码)java实现小程序推送,springboot实现微信消息推送》 我们在做小程序开发时,消息推送是不可避免的。今天就来教大家如何实现小程序消息推送的后台和前台开发。源码会在文章末尾贴出来。 其实我之前有写过一篇:《springboot实现微信消息推送,java实现小程序推送,含小程序端实现代码》 但是有同学反应这篇文章里的代码太繁琐,接入也比较麻烦。今天就来给大家写个精简版的,基本上只需要几行代码,就能实现小程序模版消息推送功能。 老规矩先看效果图 [图片] 这是我们最终推送给用户的模版消息。这是用户手机微信上显示的推送消息截图。 本节知识点 1,java开发推送后台 2,springboot实现推送功能 3,小程序获取用户openid 4,小程序获取fromid用来推送 先来看后台推送功能的实现 只有下面一个简单的PushController类,就可以实现小程序消息的推送 [图片] 再来看下PushController类,你没看错,实现小程序消息推送,就需要下面这几行代码就可以实现了。 [图片] 由于本推送代码是用springboot来实现的,下面就来简单的讲下。我我们需要注意的几点内容。 1,需要在pom.xml引入一个三方类库(推送的三方类库) [图片] pom.xml的完整代码如下 [代码]<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.qcl</groupId> <artifactId>wxapppush</artifactId> <version>0.0.1-SNAPSHOT</version> <name>wxapppush</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--微信小程序模版推送--> <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-miniapp</artifactId> <version>3.4.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> [代码] 其实到这里我们java后台的推送功能,就已经实现了。我们只需要运行springboot项目,就可以实现推送了。 下面贴出完整的PushController.java类。里面注释很详细了。 [代码]package com.qcl.wxapppush; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.List; import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; import cn.binarywang.wx.miniapp.bean.WxMaTemplateData; import cn.binarywang.wx.miniapp.bean.WxMaTemplateMessage; import cn.binarywang.wx.miniapp.config.WxMaInMemoryConfig; import me.chanjar.weixin.common.error.WxErrorException; /** * Created by qcl on 2019-05-20 * 微信:2501902696 * desc: 微信小程序模版推送实现 */ @RestController public class PushController { @GetMapping("/push") public String push(@RequestParam String openid, @RequestParam String formid) { //1,配置小程序信息 WxMaInMemoryConfig wxConfig = new WxMaInMemoryConfig(); wxConfig.setAppid("XXX");//小程序appid wxConfig.setSecret("xxx");//小程序AppSecret WxMaService wxMaService = new WxMaServiceImpl(); wxMaService.setWxMaConfig(wxConfig); //2,设置模版信息(keyword1:类型,keyword2:内容) List<WxMaTemplateData> templateDataList = new ArrayList<>(2); WxMaTemplateData data1 = new WxMaTemplateData("keyword1", "获取老师微信"); WxMaTemplateData data2 = new WxMaTemplateData("keyword2", "2501902696"); templateDataList.add(data1); templateDataList.add(data2); //3,设置推送消息 WxMaTemplateMessage templateMessage = WxMaTemplateMessage.builder() .toUser(openid)//要推送的用户openid .formId(formid)//收集到的formid .templateId("eDZCu__qIz64Xx19dAoKg0Taf5AAoDmhUHprF6CAd4A")//推送的模版id(在小程序后台设置) .data(templateDataList)//模版信息 .page("pages/index/index")//要跳转到小程序那个页面 .build(); //4,发起推送 try { wxMaService.getMsgService().sendTemplateMsg(templateMessage); } catch (WxErrorException e) { System.out.println("推送失败:" + e.getMessage()); return e.getMessage(); } return "推送成功"; } } [代码] 看代码我们可以知道,我们需要做一些配置,需要下面信息 1,小程序appid 2,小程序AppSecret(密匙) 3,小程序推送模版id 4,用户的openid 5,用户的formid(一个formid只能用一次) 下面就是小程序部分,来教大家如何获取上面所需的5个信息。 1,appid和AppSecret的获取(登录小程序管理后台) [图片] 2,推送模版id [图片] 3,用户openid的获取,可以看下面的这篇文章,也可以看源码,这里不做具体讲解 小程序开发如何获取用户openid 4,获取formid [图片] 看官方文档,可以知道我们的formid有效期是7天,并且一个form_id只能使用一次,所以我们小程序端所需要做的就是尽可能的多拿些formid,然后传个后台,让后台存到数据库中,这样7天有效期内,想怎么用就怎么用了。 所以接下来要讲的就是小程序开发怎么尽可能多的拿到formid了 [图片] 看下官方提供的,只有在表单提交时把report-submit设为true时才能拿到formid,比如这样 [代码] <form report-submit='true' > <button form-type='submit'>获取formid</button> </form> [代码] 所以我们就要在这里下功夫了,既然只能在form组件获取,我们能不能把我们小程序里用到最多的地方用form来伪装呢。 下面简单写个获取formid和openid的完整示例,方便大家学习 效果图 [图片] 我们要做的就是点击获取formid按钮,可以获取到用户的formid和openid,正常我们开发时,是需要把openid和formid传给后台的,这里简单起见,我们直接用获取到的formid和openid实现推送功能 下面来看小程序端的实现代码 1,index.wxml [图片] 2,index.js [图片] 到这里我们小程序端的代码也实现了,接下来测试下推送。 [代码]formid: 6ee9ce80c1ed4a2f887fccddf87686eb openid o3DoL0Uusu1URBJK0NJ4jD1LrRe0 [代码] [图片] 可以看到我们用了上面获取到的openid和formid做了一次推送,显示推送成功 [图片] [图片] 到这里我们小程序消息推送的后台和小程序端都讲完了。 这里有两点需要大家注意 1,推送的openid和formid必须对应。 2,一个formid只能用一次,多次使用会报一下错误。 [代码]{"errcode":41029,"errmsg":"form id used count reach limit hint: [ssun8a09984113]"} [代码] 编程小石头,码农一枚,非著名全栈开发人员。分享自己的一些经验,学习心得,希望后来人少走弯路,少填坑。 这里就不单独贴出源码下载链接了,大家感兴趣的话,可以私信我,或者在底部留言,我会把源码下载链接贴在留言区。 单独找我要源码也行(微信2501902696) 视频讲解:https://edu.csdn.net/course/detail/23750 源码链接:https://github.com/qiushi123/wxapppush
2020-01-08 - 微信小程序开发常见问题及解决方案
我们在做微信小程序开发的过程中,总会遇到各种奇葩的问题。今天就把我在小程序开发过程中遇到的各种问题,及对应的解决方案总结在这里,方便以后自己回顾,也方便大家查看。 云开发相关 一,云函数调用失败问题 [云函数] [login] 调用失败 Error: errCode: -404011 cloud function execution error | errMsg: cloud.callFunction:fail requestID , cloud function service error code -504002, error message Function not found: [login]; at cloud.callFunction api; [图片] 通常出现这种问题无非是下面2个原因 1,云函数没有部署,或者没有部署成功 2,你创建了多个云开发环境,没有配置对应的环境id 下面就针对这两个问题,具体说下解决方案 1,云函数没有部署,或者没有部署成功 [图片] 选中我们要部署的云函数,右键,如上图红色框里所示。如果点一次不能上传,就多点几次,一直到出现下面提示框为止 [图片] 2,你创建了多个云开发环境,没有配置对应的环境id 如果你创建了多个云开发环境,有时候开发者工具会脑残的不知道该选择使用那个云开发环境,这个时候,我们就要指定云开发环境了。 [图片] [图片] 如果你是多个开发环境,一定要注意环境名,和环境id必须一一对应。 云数据库相关 一,set或者update数据时报如下错误 Error: errCode: -502001 database request fail | errMsg: [FailedOperation.Insert] multiple write errors: [{write errors: [{E11000 duplicate key error collection: tnt-12p3936xo.x-j-l index: id dup key: { : “xjl” }}]}, {<nil>}] 详细错误如下图: [图片] 错误原因 造成这种错误的主要原因是因为,你修改的这条数据不是你创建的。我们直接操作云数据库时,在数据库里设置里如下权限。 [图片] 这个权限只能让你读所有人的数据,但是修改的话,你还是只能修改自己创建的数据。什么样的数据才是自己创建的呢。如下图。 [图片] 所以到这里我们就大概明白如何解决这个问题了。 解决方案 1,把_openid改为自己的openid 2,借助云函数。 这里说下借助云函数,因为你是没有办法直接修改别人的数据的,但是你借助云函数的话,就可以修改任何人的数据。 有关于小程序的问题可以加我微信 2501902696(备注小程序) 持续更新中。。。。。。
2019-06-20