- 线上小程序如何支持内网使用?
开发过程中在开发工具连接的局域网,从局域网中拿的数据(192.xxx.x.xxx:888),手机调试也是连接无线网同电脑开发工具在同一个局域网 [图片] 打开小程序初始页面为“登录入口”,在此输入的请求地址就是发送网络请求的接口url, 点击登录发出请求,请求的接口就是自己刚刚输入的地址 如果上线了,手机连接局域网输入局域网的地址能否正常访问小程序 进来有好多小伙伴私信我,下面梳理了一下流程,有个demo不妨付出点时间走一遍,很快的; 可能理解有出入,有问题一起交流哦 原创demo:https://www.bestcyt.com/lan-request-wechat-applet/
01-20 - 请问订阅消息推送【群发】具体怎么实现合理?
有一个需求,每周定时给已订阅消息的用户群发推送,人数大约是20000人。 现在的逻辑是每次从数据库取200条数据,然后for循环,异步调用200次【cloud.openapi.subscribeMessage.send】,然后取下200条数据,循环 我想请问的是,这里异步调用【cloud.openapi.subscribeMessage.send】会不会不好,是否要加一个await? 但如果加了,函数执行时间就会大大增加,会有一个超时的问题。所以比较疑惑到底改怎么处理好。
2020-02-14 - 小程序推送订阅消息群发,有的人收不到订阅消息?
小程序推送订阅消息群发给几个人,明明这几个人都已经授权过允许,为什么还是有的人能收到订阅消息,有的人收不到订阅消息是什么情况
2020-01-07 - 【小程序订阅消息】如何判断用户在设置里彻底关闭了 订阅消息 选项?
如题,如何判断用户在设置里彻底关闭了 订阅消息 选项? 目前在 https://developers.weixin.qq.com/miniprogram/dev/api/open-api/setting/AuthSetting.html 里找不到对应的 scope 取值 但通过调用 订阅消息(wx.requestSubscribeMessage)接口可以触发fail回调,是不是可以认为这种情况就是 彻底关掉了 订阅消息开关? [图片]
2019-10-18 - 订阅消息如果选择选择‘总是保持以上选择,"不再询问"后的设置问题
目前是选择‘总是保持以上选择,"不再询问"后,可以在设置中开启或拒绝接收,但不会再次拉起授权弹窗
2019-10-18 - 基础库版本2.10.0的textarea 设置text-align:center显示异常
<view style="font-size:48rpx;text-align:center;"> textareaauto-heightplaceholder"请输入" value"123456"style"justify-content:item.align"></textarea </view> 在project.config.json中设置--"libVersion": "2.10.0",以上代码表现异常 [图片]
2020-01-09 - 小程序分享给好友之后,打不开,提示:页面不存在,这是怎么回事?
分享页面打不开
2019-11-26 - 小程序wx:for时使用 wx:key=“index”时到底需不需要加双括号{{}}?
官方文档上面是直接字段名而且没有双花括号,所以想请问如果是index是不是也是同样的写法,不需要双花括号?
2019-12-05 - 控制台报错“possibly causing memory leak”
- 当前 Bug 的表现(可附上截图) - 预期表现 - 复现路径 - 提供一个最简复现 Demo 请问下有人知道控制台这是什么错 [图片]
2019-05-23 - 姓名排序localeCompare,苹果和安卓结果不一样,救救孩子吧?
[代码]function pySegSort(arr) { [代码] [代码] if(!String.prototype.localeCompare)[代码] [代码] return null; [代码] [代码] var letters = "*abcdefghjklmnopqrstwxyz".split(''); [代码] [代码] var zh = "阿八嚓哒妸发旮哈讥咔垃痳拏噢妑七呥扨它穵夕丫帀".split(''); [代码] [代码] var segs = []; var curr; letters.forEach(function(item,i){ curr = {letter: item, data:[]};[代码][代码] arr.forEach(function(item2){ [代码] [代码] if((!zh[i-1] || zh[i-1].localeCompare(item2) <= 0) && item2.localeCompare(zh[i]) == -1) {[代码] [代码] curr.data.push(item2); }[代码][代码] });[代码] [代码] if(curr.data.length) {[代码] [代码] segs.push(curr);[代码][代码] curr.data.sort(function(a,b){[代码] [代码] return a.localeCompare(b);[代码] [代码] }); } }); return segs; }[代码]
2019-09-06 - 小程序模板消息推送问题
A店长 B客户 B在A店购买产品,支付成功结果如何用模板消息通知A店长?在线等,谢谢各位大侠
2018-11-23 - 页面卸载了 变量未销毁
/** * 生命周期函数--监听页面卸载 */ onUnload: function() { }, 页面走了这个方法 我js里定义的 变量未销毁 这个变量在 Page({ 方法外面的定义的
2018-07-01 - 小程序导出数据到excel表,借助云开发后台实现excel数据的保存
我们在做小程序开发的过程中,可能会有这样的需求,就是把我们云数据库里的数据批量导出到excel表里。如果直接在小程序里写是实现不了的,所以我们要借助小程序的云开发功能了。这里需要用到云函数,云存储和云数据库。可以说通过这一个例子,把我们微信小程序云开发相关的知识都用到了。 老规矩,先看效果图 [图片] 上图就是我们保存用户数据到excel生成的excel文件。 实现思路 1,创建云函数 2,在云函数里读取云数据库里的数据 3,安装node-xlsx类库(node类库) 4,把云数据库里读取到的数据存到excel里 5,把excel存到云存储里并返回对应的云文件地址 6,通过云文件地址下载excel文件 一,创建excel云函数 关于云函数的创建,我这里不多说了。如果你连云函数的创建都不知道,建议你去小程序云开发官方文档去看看。或者看下我录制的云开发入门的视频:https://edu.csdn.net/course/detail/9604 创建云函数时有两点需要注意的,给大家说下 1,一定要把app.js里的环境id换成你自己的 [图片] 2,你的云函数目录要选择你对应的云开发环境(通常这里默认选中的) 不过你这里的云开发环境要和你app.js里的保持一致 [图片] 二,读取云数据库里的数据 我们第一步创建好云函数以后,可以先在云函数里读取我们的云数据库里的数据。 1,先看下我们云数据库里的数据 [图片] 2,编写云函数,读取云数据库里的数据(一定要记得部署云函数) [图片] 3,成功读取到数据 [图片] 把读取user数据表的完整代码给大家贴出来。 [代码]// 云函数入口文件 const cloud = require('wx-server-sdk') cloud.init({ env: "test-vsbkm" }) // 云函数入口函数 exports.main = async(event, context) => { return await cloud.database().collection('users').get(); } [代码] 三,安装生成excel文件的类库 node-xlsx 通过上面第二步可以看到我们已经成功的拿到需要保存到excel的源数据,我们接下来要做的就是把数据保存到excel 1,安装node-xlsx类库 [图片] 这一步需要我们事先安装node,因为我们要用到npm命令,通过命令行 [代码]npm install node-xlsx [代码] [图片] 可以看出我们安装完成以后,多了一个package-lock.json的文件 [图片] 四,编写把数据保存到excel的代码, 下图是我们的核心代码 [图片] 这里的数据是我们查询的users表的数据,然后通过下面代码遍历数组,然后存入excel。这里需要注意我们的id,name,weixin要和users表里的对应。 [代码] for (let key in userdata) { let arr = []; arr.push(userdata[key].id); arr.push(userdata[key].name); arr.push(userdata[key].weixin); alldata.push(arr) } [代码] 还有下面这段代码,是把excel保存到云存储用的 [代码] //4,把excel文件保存到云存储里 return await cloud.uploadFile({ cloudPath: dataCVS, fileContent: buffer, //excel二进制文件 }) [代码] 下面把完整的excel里的index.js代码贴给大家,记得把云开发环境id换成你自己的。 [代码]const cloud = require('wx-server-sdk') //这里最好也初始化一下你的云开发环境 cloud.init({ env: "test-vsbkm" }) //操作excel用的类库 const xlsx = require('node-xlsx'); // 云函数入口函数 exports.main = async(event, context) => { try { let {userdata} = event //1,定义excel表格名 let dataCVS = 'test.xlsx' //2,定义存储数据的 let alldata = []; let row = ['id', '姓名', '微信号']; //表属性 alldata.push(row); for (let key in userdata) { let arr = []; arr.push(userdata[key].id); arr.push(userdata[key].name); arr.push(userdata[key].weixin); alldata.push(arr) } //3,把数据保存到excel里 var buffer = await xlsx.build([{ name: "mySheetName", data: alldata }]); //4,把excel文件保存到云存储里 return await cloud.uploadFile({ cloudPath: dataCVS, fileContent: buffer, //excel二进制文件 }) } catch (e) { console.error(e) return e } } [代码] 五,把excel存到云存储里并返回对应的云文件地址 我们上面已经成功的把数据存到excel里,并把excel文件存到云存储里。可以看下效果。 [图片] 我们这个时候,就可以通过上图的下载地址下载excel文件了。 [图片] 我们打开下载的excel [图片] 其实到这里就差不多实现了基本的把数据保存到excel里的功能了,但是我们要下载excel,总不能每次都去云开发后台吧。所以我们接下来要动态的获取这个下载地址。 六,获取云文件地址下载excel文件 [图片] 通过上图我们可以看出,我们获取下载链接需要用到一个fileID,而这个fileID在我们保存excel到云存储时,有返回,如下图。我们把fileID传给我们获取下载链接的方法即可。 [图片] 1,我们获取到了下载链接,接下来就要把下载链接显示到页面 [图片] 2,代码显示到页面以后,我们就要复制这个链接,方便用户粘贴到浏览器或者微信去下载 [图片] 下面把我这个页面的完整代码贴给大家 [代码]Page({ onLoad: function(options) { let that = this; //读取users表数据 wx.cloud.callFunction({ name: "getUsers", success(res) { console.log("读取成功", res.result.data) that.savaExcel(res.result.data) }, fail(res) { console.log("读取失败", res) } }) }, //把数据保存到excel里,并把excel保存到云存储 savaExcel(userdata) { let that = this wx.cloud.callFunction({ name: "excel", data: { userdata: userdata }, success(res) { console.log("保存成功", res) that.getFileUrl(res.result.fileID) }, fail(res) { console.log("保存失败", res) } }) }, //获取云存储文件下载地址,这个地址有效期一天 getFileUrl(fileID) { let that = this; wx.cloud.getTempFileURL({ fileList: [fileID], success: res => { // get temp file URL console.log("文件下载链接", res.fileList[0].tempFileURL) that.setData({ fileUrl: res.fileList[0].tempFileURL }) }, fail: err => { // handle error } }) }, //复制excel文件下载链接 copyFileUrl() { let that=this wx.setClipboardData({ data: that.data.fileUrl, success(res) { wx.getClipboardData({ success(res) { console.log("复制成功",res.data) // data } }) } }) } }) [代码] 给大家说下上面代码的步骤。 1,下通过getUsers云函数去云数据库获取数据 2,把获取到的数据通过excel云函数把数据保存到excel,然后把excel保存的云存储。 3,获取云存储里的文件下载链接 4,复制下载链接,到浏览器里下载excel文件。 到这里我们就完整的实现了把数据保存到excel的功能了。 文章有点长,知识点有点多,但是大家把这个搞会以后,就可以完整的学习小程序云开发的:云函数,云数据库,云存储了。可以说这是一个综合的案例。 有什么不懂的地方,或者有疑问的地方,请在文章底部留言,我看到都会及时解答的。后面我还会出一系列关于云开发的文章,敬请关注。
2019-09-07 - textarea在scroll-view里使用时滑动异常
textarea在scroll-view里使用时,手指放在textarea上下拖动,scroll-view无法滑动
2019-03-22 - 【类知乎小房子】自定义返回键 自定义标题栏 自定义主页按钮 及参数计算
自定义顶部标题和左上角按钮方法解析及实践 前言 之前有兄台发过设置custom的方法 但是没有具体的实现方法 以至于很多不了解小程序的开发者不能循序渐进的理解制作自定义标题的方法 在这里详细总结了计算各参数的方法 我也写了一个自定义标题组件 只需要引用 直接在页面中调用即可 但因为掺杂了业务代码 需要整理过后会放出来 具体方法 首先在app.json中 将window.navigateionStyle 设置为custom [图片] 使用 wx.getSystemInfoSync 获取系统的属性 其中有顶部状态栏的高度 使用 wx.getMenuButtonBoundingClientRect 获取右上角胶囊菜单的相关属性 包括胶囊菜单的高度、相距上下左右屏幕的绝对位置 [图片] 如上图 我们需要获取四个参数 来确定整个标题栏的各项参数和左侧自定义胶囊的位置 获取顶部状态栏高度sys.statusBarHeight 具体代码 [代码]var sys= wx.getSystemInfoSync() var menu = wx.getMenuButtonBoundingClientRect() var statusHeight = menu.statusBarHeight var titleHeight = menu.height var titleRowWidth = sys.right - menu.right var titleColumnHeight = menu.top - menu.statusBarHeight [代码] 注意 小程序原生组件会遮挡自定义头部组件 如 canvas组件 input textarea的提示信息placeholder 该问题可以使用cover-view将头部定义为原生组件 设置层级解决 20191125后续更新 wx.getMenuButtonBoundingClientRect()返回undefined的情况 wx.getMenuButtonBoundingClientRect()在安卓和IOS端均会出现获取不到值的情况(返回undefined) 官方给出的答案是已经修复了该问题 但实际测试还是会出现类似问题 该问题与 平台 和 微信基础库 (随微信版本更新)无关 导致我们无法获取胶囊按钮的属性 进而无法计算header的高度 该问题极难复现 我在自己的真机上遇到过2次 在我的应用中出现概率不到1% 应对方法1: 官方建议延迟100MS 或 在返回undefined的情况下 重新获取一次 应对方法2: 判断平台 给与预估的默认值 IOS端和不同安卓端 IOS各机型的高度为44px 安卓端我测试最多的情况是48px 但安卓端实际情况需要具体测试 做进一步兼容 代码如下 [图片] 这里wx.getMenuButtonBoundingClientRect()方法在低版本微信中是不能用的 而且低版本的微信中不能使用wx.canIUse方法判断该方法是否存在 因此用捕获错误的方式兼容 在menu的属性返回undefined时 用我们预估的值去兼容 另外github.com有一个通过手机型号 返回手机各项参数的库 其中一项就是头部状态栏的高度 如果你想更准确的适配更多机型 可以使用这个库 无论哪种方法都不是最优的解决方案 大家酌情按照场景进行适配
2021-03-03 - 小程序中如何实现点击按钮弹出输入框和键盘
需求:现在想做一个像微信朋友圈一样的,点击评论按钮会弹出输入框和软键盘
2018-10-11 - 请问怎么设置下划线的颜色和宽度?
要实现在text标签内容:“When I want to strong something,I can say this”这句话下面加“5rpx, #74acbb”的下滑线。 .node{ color: #fcfcfc; } .node_item{ font-size: 34rpx; text-underline-position: 5rpx; text-decoration-color: rgb(116, 172, 187); text-decoration-line: 5px solid #74acbb; text-decoration:underline; line-height: 40rpx; } <view class='node'> <text class='node_item'>When I want to strong something,I can say this.</text> </view>
2019-05-18 - 删除开发版没权限
本人是开发者(不是管理员角色),删除原有自己上传的开发版本,提示没有权限,需要到用户管理里面赋权,可是我已经拥有角色成员所有权限,难道一个只有“管理者”才能角色删除上传的开发版本吗?
2018-03-05 - 根据 sitemap 的规则,当前页面 将被索引
pages/index/index
2019-05-10 - 云开发的数据库如何更新或删除数组里的某一个值
云开发的服务端数据库操作,如何对一条记录中的数组里的某个值进行修改或者删除。 比如一条记录: { "data": { "_id": "XAo0G3ffS3SW17e1", "users": [{ "id": "1", "name": "xxx" }, { "id": "2", "name": "xxx" }, { "id": "3", "name": "xxx" }] } } 我只想对users里的第二天记录修改或者删除,该怎么操作呢。 API里只提供了db.command.pop和shift的方法,但是删除尾部和头部元素意义不大啊。
2018-12-07 - 为什么showToast会发生位置的偏移?
在有tabbar的情况下,wx.showToast会有一个位置的偏移,就是一出现的位置会在稍微上一点,然后迅速往下移(见GIF) 前半部分单次点击时候,录制效果看起来不是很明显(事实上在实际中是挺明显的)。看后半部分我的多次点击,就会明显了 [图片] 我用了两只手机看都会这样,它们是红米pro 和 红米k20 Pro
2019-07-19 - radio组件能不能修改选中的图标
radio能不能修改选中的对勾,想要修改成一个圆点
2018-12-06 - 你们的重大bug:getLaunchOptionsSync不能读取新的启动参数
在真机上跑的时候,启动参数改变后,getLaunchOptionsSync不能读取新的启动参数。场景是这样的,两个手机的微信的版本号都是7.0.4,上面各有一个微信号(假定分别是A和B)登录,先在A上跑了我们的小程序(是用一些启动参数启动的,有特定的path、query什么的。),然后转发给B,希望B完成某项任务。B从转发中打开了小程序,完成了任务,然后转发回A(带了一些新的启动参数,新的path、新的query什么的。)。这个时候A上我们的小程序一直没有关,还在后台。那这个时候B给A转发回了小程序,A点开这个转发,在程序里调用getLaunchOptionsSync,得到的还是原先的启动参数。只有手动把小程序关了,再点开刚才那个转发,才能得到新的参数。 这当然是不合理的!!!!!!!!!!!
2019-05-08 - 普通链接二维码地址, 没有杀掉小程序,扫码不同的二维码launch参数未更新。
- 当前 Bug 的表现(可附上截图) 如题,普通链接二维码地址, 没有杀掉小程序,扫码不一样的二维码,在配置的启动页面的onLoad中调用 getLaunchOptionsSync获取参数未更新。 - 预期表现 不杀掉小程序的情况下,扫描不同的二维码, getLaunchOptionsSync获取参数更新。 - 复现路径 - 提供一个最简复现 Demo
2019-05-17 - 微信朋友圈选图效果
中秋快乐,帮社区里的小伙伴写的选图效果,仿造的微信朋友圈选图,长按拖动排序主要是用交互监听来实现的。还有几个需要处理的地方。另外在真机上的动画速度总感觉快那么一丢丢。没做预览图,详情见代码片段咯。安卓机效果没试过。。 今天是9月23,这两天接受定制改动~ 第一次发经验分享。。轻点喷。。 哦,对了,这里 wx.createSelectorQuery 有个bug。。如果选择的基础库版本在2.0.9以上,第一次打开开发者工具,要先直接点一次编译,不然会出错。。真机上没问题 代码片段:wechatide://minicode/RFLmzDmL7I2a 有小伙伴反馈,在片段上面增加内容会乱位,是因为没计算顶部偏移量,方便懒人,完善了下 新的片段:wechatide://minicode/fOTEM3mI7l3B 终于拿到安卓机器试了,果然卡得很。。要控制频率。这很尴尬,太频繁的话,安卓会卡,太不频繁呢,刚开始移动那阵子会卡。。有同学反馈,说点快了会出问题,于是又加了点击频率的限制 现在的代码片段:wechatide://minicode/xBDdCom17R3c(要重新拿安卓机测试了再看看。。) 附上gif: [图片]
2018-10-24 - 小程序数据表嵌套查询
- 当前 Bug 的表现(可附上截图) db.collection('child').limit(12).skip(0).get().then(res => { db.collection('collection').where({ openid: wx.getStorageSync('openid') }).get().then(list => { }) }) 这样的嵌套查询小程序陷入长时间等待状态 顺序查询的话会有异步的问题,是否有类似async/await的方法,或者多表联合查询的方法 - 预期表现 - 复现路径 - 提供一个最简复现 Demo
2018-09-28 - 自认为的云开发下openid最佳开局
这是我获取openId的代码,仅供参考: app.js代码: getOpenId: async function () { if(this.globalData.openId) { return this.globalData.openId } console.log('getOpenId: storage') //老用户重载小程序运行到此 let openId = wx.getStorageSync('openId') if(openId) { this.globalData.openId = openId return openId } console.log('getOpenId: cloud') //新用户运行到此 let r = await wx.cloud.callFunction({ name: 'login' }) wx.setStorageSync('openId', r.result) this.globalData.openId = r.result return r.result }, 云函数:login: exports.main = event => { return event.userInfo.openId } 任何页面: onLoad: async function (options) { this.openId = await getApp().getOpenId() }
2019-03-18