- 能否在小程序中点击打开浏览器
- 需求的场景描述(希望解决的问题) 点击按钮,打开展示的信息的原文链接,即打开URL。因为数量巨大,绑定业务域名无法满足需求。 - 希望提供的能力 打开浏览器,无论是系统自带的、安装的还是微信的浏览器,只要能打开URL就行。 我自己查到的信息有: 1 小程序无法唤醒其他应用。唯一打开其他应用的可能是小程序是从这个应用跳转过来的; 2 web-view内的网页需要认证,包括302重定向和iframe内的url; 3 wx.openUrl 不可用(内部专用?); 4 小程序可以打开已关联的公众号中已发布的文章,但是url已固定,没有操作空间。 有可行的办法吗?
2018-10-24 - 小程序打开外部链接
需求:点击按钮,打开公司官网,我是通过webview实现的,如下图代码 [图片] [图片] [图片] 我在后台管理里面配置了官网域名的白名单,现在官网可以正常打开,但是官网上有很多外部链接,比如我们点击客户伙伴,是跳转到客户网站的,这种情况有很多,我们不可能把所有链接都在白名单里配置,这样工作量会有很多,请问有没有其他解决方案?望回复,谢谢!
2019-02-25 - input设置text-align: right;时,输入文字中间加空格不显示
- 当前 Bug 的表现 input设置text-align: right;时,输入文字中间加空格不显示 - 预期表现 输入文字时有空格能够实时显示出来 - 复现路径 写一个input 设置text-align: right; 在真机上运行,输入字符和空格,空格不能显示,除非空格后有字符,空格才能显示出来。
2018-11-28 - 业务域名和服务器域名的区别是什么?
小程序新手提问,请教各位大佬:业务域名和服务器域名的区别是什么?为什么业务域名需要下载校验文件放到对应服务器的根目录,但是服务器域名设置却不需要这一步操作?意思是说服务器域名缺少这一步的话,就没办法控制web view访问的域名?我理解都是请求数据,应该和服务器域名一样设置就行了啊
2019-11-21 - 添加业务域名一直提示“服务异常,请稍候再试”,无法添加?
浏览器完全可以访问校验文件。但是添加业务域名,也不是提示校验文件错误,而是过6秒后提示“服务异常,请稍候再试”,什么情况? 我填别的域名比如qq.com能提示校验文件不存在,但是填我要用的业务域名就服务异常,是因为服务器在国外吗? 麻烦帮看看。 控制台看接口返回{"ret":1001},而且总是6秒多返回。
2019-12-20 - 微信公众平台配置业务域名提示系统错误怎么回事?
[图片]
2019-12-11 - 组件的observers在iphone5下不起作用?
问题模块框架类型问题类型API/组件名称终端类型操作系统微信版本基础库版本API和组件小程序Bugobserversiphone5 iOS10.3.47.0.22.9.4 代码片段:https://developers.weixin.qq.com/s/rRTepmm77EdD 正常情况下,在页面点击按钮会通过setData把test改为true,test会作为属性传递给组件,组件内监听test属性,发生变化时会console.log [图片] 然后,在iphone5真机下,就没有打印,下图是点击按钮后 [图片]
2019-12-05 - callFunction参数 data 有大小限制吗?
[图片] callFunction 的 data 里只要有 base64 的字符串,云函数调用就会出错 [图片] 只要没有 base64 的字符串就正常调用 [图片] [图片] 我使用了 Taro开发 ,但是这个是小程序 API 层面的,和 Taro 没关系
2019-11-23 - 云开发的数据库权限机制解读丨云开发101
在使用云开发进行开发时,数据库权限是一个让不少人困扰的部分,四种数据库权限,到底是什么意思?其各自的权限、应用场景都是什么?大多数人对于这个机制,还是模糊的。为了帮助大家进行更好的开发,在涉及到具体的代码之前,我们先来了解一下云开发的数据库权限机制。 一、为什么会有权限系统? 云开发和其他常见的开发模式有一处很大的不同就是,其数据库是可以在小程序端直接进行查询,而无需通过服务端提供的特定 API 接口来完成数据查询。这样就会出现一个问题,这个数据到底谁能查?谁不能查?能查到数据的人,能修改数据么? 在传统的应用开发模式中,权限的控制由服务端的后端接口完成,但是,在云开发的模式中,已经不存在传统的后端,因此,我们需要将权限控制进行向前移,但前端的代码因为无法保证安全(前端的数据可能被篡改,不可信),因此,我们需要将权限控制放在一个更加安全的地方,在经过多方权衡后,最终,云开发数据库就变成了云开发控制台中的一个选项。 二、云开发权限系统中的环境与角色 在云开发的权限中,我们会看到一些词,比如创建者、所有人、管理端,这些词应该如何理解呢? 其实这里在命名上是有一些问题的,管理端和创建者、所有人并不是一个好的对比,如果将管理端更名为管理员,会更容易理解。 [图片] 从权限的层面上来看,从管理端到创建者再到所有人,权限是依次收紧的。 管理端,或者叫管理员,其实便是指云开发中的云函数环境的执行权限。因为是在云函数中执行,安全系数较高,因而获得了最高的权限,也就是所谓的管理端权限。这个权限包括了对于所有的数据进行增、删、改、查的能力。 创建者,则指的是创建某条数据的用户,一般来说,是指在小程序端创建数据的用户。数据和用户之间的绑定是基于数据中的 [代码]_openid[代码] 来实现的,程序在执行中,当前用户的 openid 与数据的[代码]_openid[代码]一致时,就认为这个用户是数据的创建者。 所有人,指的是除了管理员以外的用户,这个用户一般而言,也是指小程序端的用户。数据和用户之间并不具备直接的关联关系。用户仅能通过数据库权限配置后的开放读取到用户。 三、关于四个不同的权限 云开发的数据库权限共四种,分别是: 1. 仅创建者可写,所有人可读 2. 仅创建者可读写 3. 仅管理端可写,其他人可读 4. 仅管理端可读写 这四种权限各自对应着不同的场景,接下来,我们借一些例子,来看一看四种权限的不同应用场景。 仅创建者可写,所有人可读 这种权限是我们使用最多的权限,特别是一些涉及到UGC的场景,我们一定会需要这个权限,因为我们的需求是产生的内容所有人均可读,写的层面则允许数据的创建者可写。 举个例子,如果你做了一个类似朋友圈的应用,那么你一定希望你的用户发的朋友圈可以被其他用户看到,但不能被其他用户修改,不然就乱套了。 仅创建者可读写 这种权限一般应用在一些用户的个人隐私信息的场景中。这些信息希望用户自己可以读取,但其他用户无法读取,此时,我们便需要仅创建者可读写。 举个例子,如果你做了个人相册的功能,那么你一定希望这个相册是只有你自己能看,而不是被所有人可以看到,因此,你需要选择仅创建者可读写,而不是仅创建者可写,所有人可读。 仅管理端可写,其他人可读 如果描述这个权限的特性,那么就是管理员可以修改,其他人只能看。最适合的场景莫过于各种需要由开发者、平台方管控的东西,比如新闻应用的轮播图列表、商城首页的活动信息等等。这些数据的关键在于所有人都可以看到,同时,所有人也只能看到,不能修改,只能有管理员修改。 举个例子,如果你做了一个电商小程序,那么在你的小程序中,你一定希望首页的推广 Banner 由你自己控制,而不是由用户自行控制,基于这样的考虑,你就需要仅管理端可写,其他人可读的权限。 仅管理端可读写 仅管理端可读写,你可以理解为只有云函数中有资格获取这个数据,其他的环境均不允许。这个权限在某些特定的场景下非常有用,举个例子,你的小程序的一些运行日志,你希望在云端可以查看,同时,这个日志不对普通用户展现,这个时候就可以设置为仅管理端可读写。 举个例子,如果你做了一个电商小程序,那么内部的统计数据就需要设置为仅管理端可读写,这样可以确保你的运营数据不会被普通用户所读取,尽可能避免信息的泄露。 四、常见问题 为什么没有所有人可读写的权限? 所有人可读写的数据库应用场景并不多见,而且大多数时候、可以通过管理端完成绕过。不过,如果你真的有了这样的场景,不妨思考一下,你的需求到底是什么?是不是因为你的数据库结构的不合理导致的需要所有人可读写? 所有人可读写数据会造成非常多的问题,比如数据原子化、数据锁等问题,因此,在你实现数据所有人可读写时,一定要考虑场景。 能不能实现更加细粒度的权限控制呢? 当然是可以的,实际上,云开发的数据库中每一条由小程序段完成添加的数据都有一个字段 _openid,我们在进行数据库查询时,系统会自动替我们完成这个字段的对比,如果对比不上,再去查询对应集合的权限控制,看是否给予了非创建者可读写的权限。 你自己在实现时,可以在数据创建时,根据业务需求,在数据中加入对应的字段,然后数据查询时,基于字段中的条件进行对比。 如果你对于云开发有任何问题,都欢迎你在文章留言出留下你的疑问,我们将一一解答。 更多云开发使用技巧及 Serverless 行业动态,扫码关注我们~ [图片]
2019-09-17 - 1个开发如何撑起一个用户过亿的小程序
作者 LeeHey 2018年12月,腾讯相册累计用户量突破 [代码]1亿[代码],月活 [代码]1200万[代码],阿拉丁指数排行 [代码]Top30[代码],已经成为小程序生态的重量级玩家。 三个多月来,腾讯相册围绕 [代码]在微信分享相册照片[代码]这一核心场景,快速优化和新增一系列社交化功能,配合适当的运营,实现累计用户量突破 [代码]1亿[代码],大大超过预期。 [图片] (9个月,腾讯相册用户量破亿) 可是,谁曾想到,这样一个亿级体量的小程序,竟然是一个开发做出来的?他又是有哪般“绝技”,可以一个人撑起一个用户过亿的小程序? 后台人力紧缺,怎么办? 当我第一次见到腾讯相册小程序的开发David(化名)时,他显得忧心忡忡。 “年底的目标是要过千万的用户,但现在只有几位前端和后台开发。不仅如此,我们的后台开发还不是百分百能够投入到这个项目,大部分时间要抽身支援其它项目,人力非常紧缺。此外,原有后台系统有不少历史包袱,在原有架构上做新的社交化功能开发是不现实的。怎么办? “要不试试 [代码]小程序·云开发[代码]吧,只需要前端就可以把小程序搞起,正好解决我们缺后台的难题。” 于是,David作为腾讯相册前端开发团队的骨干,担当起用 [代码]小程序·云开发[代码]实现腾讯相册小程序社交化功能的重任。 “第一次接触到 [代码]小程序·云开发[代码]时,觉得这个东西(小程序·云开发)理念挺新颖的——— [代码]小程序无服务开发模式[代码]。在一般的小程序开发中,有三大功能小程序开无法绕开后台的帮助,它门分别是数据读取、文件管理以及敏感逻辑的处理(如权限)。因此,传统的开发模式,在小程序端都必须发送请求到后台进行鉴权,并且处理相关的文件或者数据。即使使用 Node 来搭建后端服务,也需要耗费不少的搭基础架构、后期运维的工作量。” [图片] “而 [代码]小程序·云开发[代码]则释放了小程序开发者的手脚,赋予了开发者安全、稳定读取数据、上传文件和控制权限的能力,其它的负载、容灾、监控等,我们小程序开发者只需要关注业务逻辑,专注写好业务逻辑即可,其他的事情完全可以不用操心了!本来我还一筹莫展,了解完 [代码]小程序·云开发[代码]的产品原理以后,我瞬间心里有谱了。” 二维码扫不出来了 [图片] 道路总是不平坦的 ,在腾讯相册小程序通往用户破亿的道路上,困难重重。 由于腾讯相册的二维码需要带上的信息量过大,因此它的二维码显得密密麻麻。这种密集的二维码在某些Android机型下,容易出现无法识别小程序的问题。 这严重制约了腾讯相册小程序分享获客的能力。 [图片] (需要存储name, ownerid, page等大量信息) 这个事情的解决并不难,只需后台开发把数据先存储到数据库中,然后把数据id放到分享链接上,这样,链接便可以转化成32个字符的短链接,让二维码看起来没有那么密集了。 但由于后台人力不足,于是前端开发David利用小程序· 云开发的数据库存储能力,通过调用 [代码]db.collection('qr').add[代码]接口,快速实现数据在数据库中的存储。 [图片] (云开发数据库,格式类似MongoDB) [图片] (云开发数据库索引,可加快数据读取) [图片] 此外,腾讯相册还借住小程序·云开发的云函数能力,生成辨识度更高的小程序码(小程序码文档https://developers.weixin.qq.com/miniprogram/dev/api/qrcode.html),用以在朋友圈里传播分享。 [图片] (生成小程序码的云函数逻辑) [图片] (优化后的分享图片和小程序码) 2天上线评论点赞功能 [图片] (评论与点赞功能) 腾讯相册在微信端的核心应用场景是“在微信做分享相册照片”,为了增强腾讯相册用户在微信里的互动,提升用户粘性和留存,腾讯相册决定新增评论与点赞功能,并且把聊天评论就直接在微信聊天窗口里面实现。 在这里,腾讯相册的David面临了两个选择,一是按原开发模式(前台开发-后台开发-前后台联调)做这个功能,面临的问题便是开发周期长、缺后台、迭代速度慢;另一个就是借助云开发的能力,自己上。 为了加快产品迭代速度,David决定采取云开发的开发方式。评论、点赞通过云开发的数据库插入和查询接口,如 [代码]db.collection('comment').add[代码],很快就实现了。 但遇到棘手的问题是,对于一些敏感的操作比如删除和编辑评论、点赞这些敏感操作,还需要到用户的鉴权操作,而这些鉴权信息,都在原有的后台。此时,云函数的路由功能便发挥出作用了。 [图片] (评论点赞逻辑) 用户进行评论点赞的时候,会在小程序端发起请求调用云函数并带上 [代码]openid[代码],云函数用 [代码]openid[代码] 查询原有的后台服务看看该用户是否有权限进行操作,如果用户具有权限,则把评论和点赞的数据都写入云开发的数据库中。 就这样,借住小程序·云开发的能力,腾讯相册仅用2天时间,完成了在传统开发模式下需要1周多工作量的开发工作。 [图片]
2019-02-15 - 巧借云开发,轻松迎战黑客马拉松
作者:都睿 11月的某天,本科死党突然在群里分享了微信小程序马拉松比赛的消息,自己脑子一热居然答应了…在冷静之余,作为一个Java和C++的后端工程师(对,我不会nodejs…),自己脑子里首先蹦出了一个todolist: 环境:腾讯的云裸机或者Docker环境,0.5day 工程开发脚手架:spring boot,鉴于好久没搞java了, 1day 微信开发者文档阅读:应该会要有一套鉴权机制,之前没有研究过,1day 可是有拖延症的我在邻近比赛开始前2天(周四晚)依然还什么都没有准备,正当怀着赴死(被队友砍死)心态刷着比赛群里的信息时,腾讯云同学的两页PPT引起了我的注意。 [图片] 第一页PPT是否意味着,这次比赛会有一个FaaS服务,可以让我不关注于系统运维以及各种web框架的路由策略? [图片] 第二页PPT是否意味着,这个FaaS服务还可以帮助我处理一系列繁琐的用户鉴权服务? 总之,求生欲让我点进了小程序·云开发文档,读完发现————真!牛!逼! 看来我有望依托云开发在24小时内完成nodejs语言的入门及后端服务的搭建! 果然,在接下来的时间,凭借着云开发,最终我们组 1 个C++研发、1 个算法工程师和 1 个前端大腿在24小时内完成了最小可行的小程序,并在最后的评比中获得三等奖。下面简单分享一下这次黑客马拉松中我们使用云开发的体验,更细节的点可以移步云开发文档。 实战 本节主要涉及马拉松项目的由来,简单的系统架构图。然后,列举了几个典型依托云开发的功能实现。 一、功能描述 一番头脑风暴后,我们组最终决定要继续zuo死,搞一个略复杂的英文配音小程序。项目背景源于在互助学习群中,会有学生发送语音给老师希望得到点评的需求,但是现有微信聊天机制使得这样的模式很不容易管理。因此我们希望通过一个小程序进来改变这种现状,此外,这个小程序最好还能增加一些趣味性,在简单的讨论后,我们的系统流程是这样的。 [图片] 整个闭环中有老师和学生两种角色。当然在马拉松中,为了快速演示,我们目前是hard code 一名用户为老师,其他角色均为学生。老师可以发起课程,并将课程分享到群中,学生通过点击群中分享进入到配音详情页面,在完成配音后,老师会受到评价提醒的模板消息,并进行配音评价,在老师完成评价后,学生会受到反馈提醒的模板消息,去查看评价,从而完成了整个交互。 二、系统总体实现 如功能描述中所述,整个小程序的主要技术难点在交互流程状态的维护和音频合成能力。对于交互流程的状态维护,我们使用云开发完快速解决。不过,由于目前云开发不支持在云环境部署一些自定义程序,我们依然通过IaaS虚拟机部署的方式实现了视频拼接服务。总体来看,系统总体模块如下图所示。 [图片] 数据视图的设计上,我们主要定义了课程、用户formid、用户信息、作品以及课程素材五类数据,依托于云开发的数据库,在数据的设计上并没有费太多功夫。 [图片] 三、选择课程&开启课程 选择课程&开启课程是我们开发中比较典型的一环,主要由小程序端发起调用,在云函数中对数据库进行操作,最终返回结果。 在小程序端,为了方便调用,都是通过工厂模式对调用云端函数进行了简单封装,代码片段如下: [代码]/** * 云函数调用 * @param name * @param data * @returns {*} */ function callCloudFunctionFactory (name,data) { let OPENID = wx.getStorageSync('__open_id'); console.log('OPENID:'+OPENID); return callFunction({ name: name, data: Object.assign({ openId: OPENID },data) }) } [代码] 有了调用的封装,当老师点击创建课程的时候,就会调用云端 [代码]creat_class[代码]的请求。 [代码]cloundApi.createClass({ item_detail:item}).then((res)=>{ item['class_id'] = res.result; wx.setStorageSync('_selected_item', item); wx.navigateBack(); wx.hideLoading();}) .catch( (res)=>{ util.showToast('创建课程失败'); wx.hideLoading(); } ) [代码] 在云端,创建课程的逻辑也非常简单,云函数首先会去调用获取用户信息的云函数,得到用户的基本信息,并生成一个UUID作为课程标识,并将用户信息与课程关联起来,存储数据库中,代码片段如下。 [代码]exports.main = async (event, context) => { try { const res = await cloud.callFunction({ // 要调用的云函数名称 name: 'get_user_info', // 传递给云函数的参数 data: { openId: event.openId } }) event.profile = res.result let UUID = require('uuid') event.class_id = UUID.v1() console.log(event) let result = await db.collection('collection_class').add({ data: event }) if (result._id) { return event.class_id } else { return false } } catch (e) { console.error(e) } } [代码] 四、音频处理 交互配音比较遗憾的地方在于,后端配音合成需要用到一款名为ffmeg的软件,而云函数并不支持我们对环境进行定制。考虑到开发时间有限,以及前端同学有较丰富的小程序端开发经验,此处我们的策略是快速基于腾讯云部署一个IaaS服务,并依托SpringBoot 实现ffmeg的http封装。此时IaaS端的SpringBoot服务仅仅是提供视频合成的能力,在合成了视频之后会返回视频的UUID,小程序端将这段uuid通过云函数存储数据库。在需要播放视频时,也是先通过云函数拿到uuid,再去IaaS端下载。 此处小程序端上传音频的代码片段为 [代码]api.createMatchFilm({ item_id: this.data.query.item_id, dub_list: this.data.recordedVoiceUploadedList, user_role: userRole}) .then( (res)=>{ this.bgVideoContext.pause(); this.originVideoContext.pause(); recordInnerAudioContext.stop(); originInnerAudioContext.stop(); clearInterval(this.playAllRecordVoiceLoop); } ) [代码] 这里同样使用了类似于工厂模式的方式发起对IaaS端的调用。在IaaS端完成合成后,会返回一段UUID,小程序端将调用云函数存储课程信息,同时触发通知老师的动作。云函数端的代码片段为: [代码]const classInfo = await cloud.callFunction({ // 要调用的云函数名称 name: 'get_class_info', // 传递给云函数的参数 data: { class_id: event.class_id, } }) let teacher_id = classInfo.result.openId if (result._id){ const pushTeacher = await cloud.callFunction({ // 要调用的云函数名称 name: 'push_msg_to_teacher', // 传递给云函数的参数 data: { openId: teacher_id, work_id: result._id, detail: classInfo.result.item_detail.film_name, nick: event.profile.nick } }) return { work_id:result._id } }else{ return false } [代码] 这里,云函数首先会将信息存储入数据库,然后通过发送模板消息的方式通知老师。 五、模板消息推送 依托于云开发丰富的API,后端也能快速搭建模板消息推送的链路。模板消息推送主要需要完成小程序端搜集formid,云端推送模板消息两个部分。 首先是formid采集,小程序端会记录用户触发的formid,并写入云端函数库,云端将每个用户的formid以类似于队列的形式存储。 首先在创建用户时,同时增加一个用于存储用户formid的队列。 [代码]let from_id_result = await db.collection('collection_form_id') .add({ data: { _id: event.openId } }) [代码] 然后在小程序端增加用户formid时将formid放入队列 [代码]exports.main = async (event, context) => { const wxContext = cloud.getWXContext() var openId = wxContext.OPENID if (openId == undefined || event.formId == null) { return false }try { return await db.collection('collection_form_id') .doc(openId).update({ data: { tags: _.push([event.formId]) } }) } catch (e) { console.error(e) return false } return true } [代码] 在需要发送模板消息时,将formid从队头取出,并调用微信发送模板消息接口,向用户发送模板消息。下面代码展示了云函数取出formid,生成模板消息的过程。 [代码]exports.main = async (event, context) => { let wXMINIUser = new WXMINIUser({ appId, secret 、 }) let access_token = await wXMINIUser.getAccessToken() const wxContext = cloud.getWXContext() // to 学生 const openId = event.openId const nick = event.nick const class_id = event.class_id const templateId = 'xxxxxx' // 小程序模板消息 template ID if (openId == undefined) { console.log("openId is undefined") return false } let tmp = await db.collection('collection_form_id').doc(openId).get() if (tmp.data.tags == undefined || tmp.data.tags.length == 0) { console.log("tmp.data.tags used out") return false } let formId = tmp.data.tags[0] console.log("formeId is: ") console.log(formId) await db.collection('collection_form_id').doc(openId).update({ data: { tags: _.shift() } }) let wXMINIMessage = new WXMINIMessage({ openId, formId, templateId }) return await wXMINIMessage.sendMessage({ access_token, data: { keyword1: { value: nick }, keyword2: { value: '【点击查看老师对你本次口语细节的纠正和指导】' }, }, page: '/pages/home/index?class_id='+class_id // 点击模板消息后,跳转的页面 }) } [代码] 云开发体验小结 总体来说,我认为一般业务开发会遇到以下三个痛点: 前后端调用,处理与通信(网络、编码、鉴权)相关问题 与数据库联调、同样处理与连接、编码相关问题,并且要考虑数据库的运维 开发时的单元测试及前后端联调成本 其实,这些问题都是与业务无关的底层问题,如果没有熟悉的搭档或者成熟的脚手架,大量时间将被消耗在这样的胶水代码中。不过这次有了云开发,情况变得有些不一样。 一、如丝般顺滑的前后联调 正如实战中代码所示,有了云开发,后端就彻底从胶水代码中解放出来。因此,在和前端大腿定义好前后端交互接口后,我们和另一名队友就靠着云开发接口文档和w3c中nodejs入门开始了后端开发之旅,并在一个下午的功夫就完成了下图中函数的开发。 [图片] 二、轻量级易调试的NoSQL存储 除了需要完成和前端的交互,后端逻辑还需要做一个“状态的维护”,即实现和数据库的交互。虽然在像spring boot这样的框架中,已经提供了一整套便捷的orm解决方案,云开发在这方面更进一步,主要体现在一下两个方面: 部署侧,屏蔽数据库运维细节,直接提供NoSQL能力以及直观的方便操作的dashboard 调用侧,用户无需关注通信、连接池、编码等细节问题,直接通过封装好的API对数据库进行调用。(事实上,云开发还可以允许前端对数据库进行操作,但是需要调用者在操作时明确调用的读写权限) 三、提升开发效率的dashboard 除了封装底层胶水代码提升coding效率,云开发的dashboard也能提升开发时的调试效率。 首先是云函数的dashboard,一方面,支持函数粒度的单元测试,在写好函数后,后端同学可以快速定义运行时的入参,检查函数的调用结果。由于屏蔽了底层通信细节,此时后端同学的测试用例和前端最终使用的入参是完全一致的,因此只要后端的单元测试覆盖了所有的case,前后联调就是一个100% Bug Free过程。此外,dashboard中还提供了简单的日志分析功能,方便快速定位问题以及调试。 [图片] 除此以外,不得不赞一个数据库dashboard,一方面添加记录的交互直观明了,另一方面对json数据导入导出的支持大大提升在开发时构造测试数据的效率。 [图片] 除此外,还有类似于用户管理、存储管理、统计分析的dashboard,他们都提供了一些“顾名思义”的功能。因为是在比赛中,就也没有花太多的时间去仔细了解,不过给我的感觉是,这些功能都是小而美、稳定高效的。 serverless,赋能敏捷开发 16年小程序刚出来的时候,自己就有过一次小程序的开发体验,当时就觉得这是一个简洁而高效的端上开发体验。 而现在的云开发,又刚好完成了服务侧的拼图,提供了对底层透明的开发体验。 现在看来,在小程序的生态下,开发的门槛出奇的低:可能仅仅是像我这样“入门”nodejs的程序员,或者哪怕是一个脑子里突然灵光一现想要做快速验证的人,都可以在小程序上开发出一个原型产品。
2019-02-27 - 小程序内用户帐号登录规范调整和优化建议
为更好地保护用户隐私信息,优化用户体验,平台将会对小程序内的帐号登录功能进行规范。本公告所称“帐号登录功能”是指开发者在小程序内提供帐号登录功能,包括但不限于进行的手机号登录,getuserinfo形式登录、邮箱登录等形式。具体规范要求如下: 1.服务范围开放的小程序 对于用户注册流程是对外开放、无需验证特定范围用户,且注册后即可提供线上服务的小程序,不得在用户清楚知悉、了解小程序的功能之前,要求用户进行帐号登录。 包括但不限于打开小程序后立即跳转提示登录或打开小程序后立即强制弹窗要求登录,都属于违反上述要求的情况; 以下反面示例,在用户打开小程序后立刻弹出授权登录页; [图片] 建议修改为如下正面示例形式:在体验小程序功能后,用户主动点击登录按钮后触发登录流程,且为用户提供暂不登录选项。 [图片] 2.服务范围特定的小程序 对于客观上服务范围特定、未完全开放用户注册,需通过更多方式完成身份验证后才能提供服务的小程序,可以直接引导用户进行帐号登录。例如为学校系统、员工系统、社保卡信息系统等提供服务的小程序; 下图案例为正面示例:校友管理系统,符合规范要求。 [图片] 3.仅提供注册功能小程序 对于线上仅提供注册功能,其他服务均需以其他方式提供的小程序,可在说明要求使用帐号登录功能的原因后,引导用户进行帐号注册或帐号登录。如ETC注册申请、信用卡申请; 如下反面示例,用户在进入时未获取任何信息,首页直接强制弹框要求登录注册ETC,这是不符合规范的。 [图片] 建议修改为如下正面示例所示形式:允许在首页说明注册功能后,提供登录或注册按钮供用户主动选择点击登录。 [图片] 4.提供可取消或拒绝登录选项 任何小程序调用帐号登录功能,应当为用户清晰提供可取消或拒绝的选项按钮,不得以任何方式强制用户进行帐号登录。 如下图所示反面示例,到需要登录环节直接跳转登录页面,用户只能选择点击登录或退出小程序,这不符合登录规范要求。 [图片] 建议修改为下图正面示例形式,在需帐号登录的环节,为用户主动点击登录,并提供可取消按钮,不强制登录。 [图片] 针对以上登录规范要求,平台希望开发者们能相应地调整小程序的帐号登录功能。如未满足登录规范要求,从2019年9月1日开始,平台将会在后续的代码审核环节进行规则提示和修改要求反馈。
2019-07-20