关于小程序:TaroReactTS基于InnerAudioContext封装一个基本的音频组件uniappvue后续更新

为什么要封装一个音频组件次要因为微信小程序官网的audio不保护了,并且在很多iOS真机上的确也存在点击无奈播放,总时长不显示等问题. 音频组件的要求与限度点击播放或者暂停显示播放进度及总时长通过图标变动显示以后音频所处状态(暂停/播放/加载中)页面音频更新时刷新组件状态全局有且只有一个音频处于播放状态来到页面之后要主动进行播放并销毁音频实例资料:icon_loading.gificon_playing.pngicon_paused.png InnerAudioContext提供的属性和办法属性: string src: 音频资源的地址,用于间接播放。bumber startTime: 开始播放的地位(单位:s),默认为 0boolean autoplay: 是否主动开始播放,默认为 falseboolean loop: 是否循环播放,默认为 falsenumber volume: 音量。范畴 0~1。默认为 1number playbackRate: 播放速度。范畴 0.5-2.0,默认为 1。(Android 须要 6 及以上版本)number duration: 以后音频的长度(单位 s)。只有在以后有非法的 src 时返回(只读)number currentTime: 以后音频的播放地位(单位 s)。只有在以后有非法的 src 时返回,工夫保留小数点后 6 位(只读)boolean paused: 以后是是否暂停或进行状态(只读)number buffered: 音频缓冲的工夫点,仅保障以后播放工夫点到此工夫点内容已缓冲(只读)办法: play(): 播放pause(): 暂停。暂停后的音频再播放会从暂停处开始播放stop(): 进行。进行后的音频再播放会从头开始播放。seek(postions: number):跳转到指定地位destory(): 销毁以后实例onCanplay(callback): 监听音频进入能够播放状态的事件。但不保障前面能够晦涩播放offCanplay(callback): 勾销监听音频进入能够播放状态的事件onPlay(callback): 监听音频播放事件offPlay(callback): 勾销监听音频播放事件onPause(callback): 监听音频暂停事件offPause(callback): 勾销监听音频暂停事件onStop(callback): 监听音频进行事件offStop(callback): 勾销监听音频进行事件onEnded(callback): 监听音频天然播放至完结的事件offEnded(callback): 勾销监听音频天然播放至完结的事件onTimeUpdate(callback): 监听音频播放进度更新事件offTimeUpdate(callback): 勾销监听音频播放进度更新事件onError(callback): 监听音频播放谬误事件offError(callbcak): 勾销监听音频播放谬误事件onWaiting(callback): 监听音频加载中事件。当音频因为数据有余,须要停下来加载时会触发offWaiting(callback): 勾销监听音频加载中事件onSeeking(callback): 监听音频进行跳转操作的事件offSeeking(callback): 勾销监听音频进行跳转操作的事件onSeeked(callback): 监听音频实现跳转操作的事件offSeeked(callback): 勾销监听音频实现跳转操作的事件让咱们开始吧???? ...

August 7, 2020 · 5 min · jiezi

关于小程序:TaroReactTS基于InnerAudioContext封装一个基本的音频组件uniappvue后续更新

为什么要封装一个音频组件次要因为微信小程序官网的audio不保护了,并且在很多iOS真机上的确也存在点击无奈播放,总时长不显示等问题. 音频组件的要求与限度点击播放或者暂停显示播放进度及总时长通过图标变动显示以后音频所处状态(暂停/播放/加载中)页面音频更新时刷新组件状态全局有且只有一个音频处于播放状态来到页面之后要主动进行播放并销毁音频实例资料:icon_loading.gificon_playing.pngicon_paused.png InnerAudioContext提供的属性和办法属性: string src: 音频资源的地址,用于间接播放。bumber startTime: 开始播放的地位(单位:s),默认为 0boolean autoplay: 是否主动开始播放,默认为 falseboolean loop: 是否循环播放,默认为 falsenumber volume: 音量。范畴 0~1。默认为 1number playbackRate: 播放速度。范畴 0.5-2.0,默认为 1。(Android 须要 6 及以上版本)number duration: 以后音频的长度(单位 s)。只有在以后有非法的 src 时返回(只读)number currentTime: 以后音频的播放地位(单位 s)。只有在以后有非法的 src 时返回,工夫保留小数点后 6 位(只读)boolean paused: 以后是是否暂停或进行状态(只读)number buffered: 音频缓冲的工夫点,仅保障以后播放工夫点到此工夫点内容已缓冲(只读)办法: play(): 播放pause(): 暂停。暂停后的音频再播放会从暂停处开始播放stop(): 进行。进行后的音频再播放会从头开始播放。seek(postions: number):跳转到指定地位destory(): 销毁以后实例onCanplay(callback): 监听音频进入能够播放状态的事件。但不保障前面能够晦涩播放offCanplay(callback): 勾销监听音频进入能够播放状态的事件onPlay(callback): 监听音频播放事件offPlay(callback): 勾销监听音频播放事件onPause(callback): 监听音频暂停事件offPause(callback): 勾销监听音频暂停事件onStop(callback): 监听音频进行事件offStop(callback): 勾销监听音频进行事件onEnded(callback): 监听音频天然播放至完结的事件offEnded(callback): 勾销监听音频天然播放至完结的事件onTimeUpdate(callback): 监听音频播放进度更新事件offTimeUpdate(callback): 勾销监听音频播放进度更新事件onError(callback): 监听音频播放谬误事件offError(callbcak): 勾销监听音频播放谬误事件onWaiting(callback): 监听音频加载中事件。当音频因为数据有余,须要停下来加载时会触发offWaiting(callback): 勾销监听音频加载中事件onSeeking(callback): 监听音频进行跳转操作的事件offSeeking(callback): 勾销监听音频进行跳转操作的事件onSeeked(callback): 监听音频实现跳转操作的事件offSeeked(callback): 勾销监听音频实现跳转操作的事件让咱们开始吧???? ...

August 7, 2020 · 5 min · jiezi

关于小程序:wepy2-获取元素节点

wepy.pagevar query = wx.createSelectorQuery();query.select('.wrap1').boundingClientRect();query.exec(function (rect) { console.log(rect)});打印是有数据的 wepy.component当我在组件中应用同样办法,返回的是null,很迷茫,直到我看见官网issue https://github.com/Tencent/wepy/issues/2251 微信官网文档 wx.createSelectorQuery()返回一个 SelectorQuery 对象实例。在自定义组件或蕴含自定 义组件的页面中,应应用 `this.createSelectorQuery()` 来代替所以正确的用法: const query = this.$wx.createSelectorQuery();query.select(dom).boundingClientRect();query.exec( (rect) => { console.log(rect)});最初留神wepy中的this. 是 wepy 的实例。和小程序不一样.this.$wx 才是对应的 小程序中的 this

August 7, 2020 · 1 min · jiezi

关于小程序:微信小程序踩坑

1.在scroll-view中不要有fixed定位的元素,会导致fixed元素不能失常固定(ios必现)2.audio音频资源加载中页面onHide后,无奈调用audio组件的api,须要等页面onShow后才可持续调用3.movable-view绑定touchstart事件不能够应用catch否则会使bindchange事件异样4.movable-area和movable-view组件能够在android端cover-view内应用 ios端渲染不进去5.原生写touchmove事件,优先在wxs里写事件函数6.在wxs文件里通过touchmove事件扭转正在进行touchmove事件的元素的地位,会使touchmove事件的参数不正确 而且数值与失常数值差距十分大7.微信小程序只能生成正式版的小程序码,且只能跳转到正式版的小程序,(测试时能够应用微信开发者工具抉择通过二维码编译小程序码,即可在微信开发者工具中关上)8.video组件当进入全屏时通过变量暗藏controls,video全屏时左上角的返回图标还会显示9.小程序蓝牙仅反对低功耗蓝牙(4.0),搜寻的时候也搜寻不到5.0的设施10.BackgroundAudioManager背景音频播放只能应用线上的音频资源11.小程序背景音频播放期间小程序页面onHide,js脚本会继续执行(setInterval等)

August 6, 2020 · 1 min · jiezi

关于小程序:微信小游戏云开发云函数

环境配置创立云函数目录1.新建目录,并在project.config.json减少字段 cloudfunctionRoot 指定寄存云函数的目录,设置胜利后,开发者中的目录会有非凡图标 装置wx-server-sdk云函数目录执行 npm install --save wx-server-sdk@latest创立形式1.工具中创立 建完会默认带这三个文件批改完须要手动上传 2.控制台创立 创立完开发者工具右键云函数目录,同步云函数同步完函数目录会是空的,须要手动增加config、index、package文件

August 5, 2020 · 1 min · jiezi

关于小程序:前端架构发展史

最后,前端是没有架构的,因为性能简略的代码毫无架构可言。通过一个简略的jQuery库操作DOM就能实现的工作,无需简单的设计模式和代码管理机制,也就不须要架构来反对起利用。 前端开发的倒退历史分为以下几个阶段: 古典时代:由后端渲染出前端HTML,用Table布局,用CSS进行简略的辅助动效时代:前端开始编写一些简略的JavaScript脚本来做动画成果,如轮播广告Ajax异步通信时代:2005年,Google在诸多Web利用中应用了异步通信技术如 Google地图,开启了Web前端的一个新时代一旦前端利用须要从后端获取数据,就意味着前端利用在运行时是动静地渲染内容的,这便是Model(模型)UI层解耦。jQuery可能提供DOM操作方法和模型引擎等。这时的开发人员须要做上面两件事: 动静生成HTML。由后端返回前端所须要的HTML,再动静替换页面的DOM页面。晚期的典型架构如jQuery Mobile,当时在前端写好模板与渲染逻辑,用户的行为触发后盾并返回对应的数据来渲染文件模板拆散。由后端用API返回前端所须要的JSON数据,再由前端来计算生成这些HTML。前端的模板再应用HTML,而是应用诸如 Mustache 这样的模板引擎来渲染HTML因为HTML的动静生成、模板的独立与拆散,前端利用开始变得复杂。后端的MVC架构进一步影响了前端开发,便诞生了一系列操起的MVC框架,如Backbone、Knockout等。与此同时,在 Ryan Lienhart Dahl等人开发了Node.js之后,前端的软件性能便一直地改善: 更好的构建工具。诞生了诸如 Grant 和 Gulp 等构建工具包治理。产生了用于前端的包管理工具 Bower 和 Npm模块治理。也呈现了AMD、Common.js 等不同的模块治理计划随着单页面利用的风行,前后端拆散框架也成为行业内的规范实际。由此,前端进入了一个新的时代,要思考的内容也越来越多: API 治理,采纳了诸如 Swagger 的 API 管理工具,各式的 Mock Server 也成为规范实际。大前端,由前端来开发跨平台挪动利用框架,采纳诸如 Ionic、React Native、Flutter 等框架。组件化,前端利用从此由一个个细小的组件联合而成,而不再是一个大的页面组件。零碎变得越来越简单,架构在前端的作用也变得越来越重要。MVC 满足不了开发人员的需要,于是采纳了组件化架构。而组件化 + MV 也无奈应答大型的前端利用,微前端便又呈现在咱们的背后,它解决了以下问题: 跨框架。在一个页面上运行,能够同时应用多个前端框架。利用拆分。将一个简单的利用拆解为多个渺小的利用,相似于微服务。遗留零碎迁徙。让旧的前端框架,能够间接嵌入现有的利用运行。简单的前端利用倒退了这么久,也呈现了一系列须要演进的利用:思考重写、迁徙、重构,等等。 本文由博客一文多发平台 OpenWrite 公布!

August 2, 2020 · 1 min · jiezi

关于小程序:前端架构发展史

最后,前端是没有架构的,因为性能简略的代码毫无架构可言。通过一个简略的jQuery库操作DOM就能实现的工作,无需简单的设计模式和代码管理机制,也就不须要架构来反对起利用。 前端开发的倒退历史分为以下几个阶段: 古典时代:由后端渲染出前端HTML,用Table布局,用CSS进行简略的辅助动效时代:前端开始编写一些简略的JavaScript脚本来做动画成果,如轮播广告Ajax异步通信时代:2005年,Google在诸多Web利用中应用了异步通信技术如 Google地图,开启了Web前端的一个新时代一旦前端利用须要从后端获取数据,就意味着前端利用在运行时是动静地渲染内容的,这便是Model(模型)UI层解耦。jQuery可能提供DOM操作方法和模型引擎等。这时的开发人员须要做上面两件事: 动静生成HTML。由后端返回前端所须要的HTML,再动静替换页面的DOM页面。晚期的典型架构如jQuery Mobile,当时在前端写好模板与渲染逻辑,用户的行为触发后盾并返回对应的数据来渲染文件模板拆散。由后端用API返回前端所须要的JSON数据,再由前端来计算生成这些HTML。前端的模板再应用HTML,而是应用诸如 Mustache 这样的模板引擎来渲染HTML因为HTML的动静生成、模板的独立与拆散,前端利用开始变得复杂。后端的MVC架构进一步影响了前端开发,便诞生了一系列操起的MVC框架,如Backbone、Knockout等。与此同时,在 Ryan Lienhart Dahl等人开发了Node.js之后,前端的软件性能便一直地改善: 更好的构建工具。诞生了诸如 Grant 和 Gulp 等构建工具包治理。产生了用于前端的包管理工具 Bower 和 Npm模块治理。也呈现了AMD、Common.js 等不同的模块治理计划随着单页面利用的风行,前后端拆散框架也成为行业内的规范实际。由此,前端进入了一个新的时代,要思考的内容也越来越多: API 治理,采纳了诸如 Swagger 的 API 管理工具,各式的 Mock Server 也成为规范实际。大前端,由前端来开发跨平台挪动利用框架,采纳诸如 Ionic、React Native、Flutter 等框架。组件化,前端利用从此由一个个细小的组件联合而成,而不再是一个大的页面组件。零碎变得越来越简单,架构在前端的作用也变得越来越重要。MVC 满足不了开发人员的需要,于是采纳了组件化架构。而组件化 + MV 也无奈应答大型的前端利用,微前端便又呈现在咱们的背后,它解决了以下问题: 跨框架。在一个页面上运行,能够同时应用多个前端框架。利用拆分。将一个简单的利用拆解为多个渺小的利用,相似于微服务。遗留零碎迁徙。让旧的前端框架,能够间接嵌入现有的利用运行。简单的前端利用倒退了这么久,也呈现了一系列须要演进的利用:思考重写、迁徙、重构,等等。 本文由博客一文多发平台 OpenWrite 公布!

August 2, 2020 · 1 min · jiezi

关于小程序:微信小程序-wxrequest-载入数据提示-URL-不合法

在微信小程序筹备应用 wx.request 载入数据的时候提醒 URL 不非法的谬误。 提醒的内容是: 不在以下 request 非法域名列表中,请参考文档 解决问题你须要登录微信小程序的后盾。 抉择开发中的开发设置。 在界面中的服务器域名配置中,批改配置你的 Request 非法域名。 依据官网的指引,request 的非法域名须要应用 https 如果你的域名还没有 https CA 签名的话,请先进行 CA 签名。 而后保留退出。 在小程序开发工具中,你须要退出后,从新刷新页面。 当页面再次刷新后,你应该不会遇到域名谬误的提醒了。 https://www.ossez.com/t/wx-request-url/321

July 31, 2020 · 1 min · jiezi

关于小程序:记录一次逆推小程序的实现逻辑

偶尔见看到敌人分享的小程序,感觉做的不错,对他的实现比拟感兴趣,于是开始剖析他是怎么做的: 第一步:Charles抓包charles配置 windows版https://www.cnblogs.com/htybk... 可能是最好的Mac Charles 配置指南https://blog.csdn.net/u010296... Charles 抓包 Client SSL handshake failed - Remote host closed connection during handshakehttps://www.jianshu.com/p/993...https://www.neglectedpotentia... 通过以上链接胜利搞定Mac SSL证书和 手机端SSL证书,此时关上小程序 能够看到申请链接 第二步:拿到申请后剖析图床和视频库用什么实现的依据下面这张图片 能够发现vod_pic参数vod_pic": "http://puui.qpic.cn/qqvideo_ori/0/r3020nq7ixl_496_280/0", 域名为qpic.cn,于是我百度了下qpic搜寻发现是腾讯图床,此时我看到content参数只有:"content": "r3020nq7ixl", 于是就有个疑难:视频怎么做到的;此时我看了下视频播放时 存在如下申请:域名竟然是tc.qq.com我想会不会是腾讯视频,于是我关上腾讯视频轻易找了一个短视频关上,看到地址链接为:https://v.qq.com/x/page/o3125... 此时我就想把 "content": "r3020nq7ixl" 改为 https://v.qq.com/x/page/r3020...果然申请对应上了,视频资源也对上了。 阐明这老哥的小程序图床和视频库资源是基于腾讯视频,同时播放器我看了下小程序示例,就是原生的播放器 第三步:日常怎么经营保护资源的而后我在想:如果本人经营的话,天天搬砖也挺累的,就随机看了他几个板块的视频 对应到腾讯视频的发布者,发现不是同一个人,此时明确了,这老哥可能采纳关键词爬虫腾讯视频或者本人有一个后盾管理系统日常更新对应类型的视频地址到本人的数据库中; 以上是整个逆推过程,如果感觉有意思,能够点赞哈,谢谢~

July 30, 2020 · 1 min · jiezi

关于小程序:记录一次逆推小程序的实现逻辑

偶尔见看到敌人分享的小程序,感觉做的不错,对他的实现比拟感兴趣,于是开始剖析他是怎么做的: 第一步:Charles抓包charles配置 windows版https://www.cnblogs.com/htybk... 可能是最好的Mac Charles 配置指南https://blog.csdn.net/u010296... Charles 抓包 Client SSL handshake failed - Remote host closed connection during handshakehttps://www.jianshu.com/p/993...https://www.neglectedpotentia... 通过以上链接胜利搞定Mac SSL证书和 手机端SSL证书,此时关上小程序 能够看到申请链接 第二步:拿到申请后剖析图床和视频库用什么实现的依据下面这张图片 能够发现vod_pic参数vod_pic": "http://puui.qpic.cn/qqvideo_ori/0/r3020nq7ixl_496_280/0", 域名为qpic.cn,于是我百度了下qpic搜寻发现是腾讯图床,此时我看到content参数只有:"content": "r3020nq7ixl", 于是就有个疑难:视频怎么做到的;此时我看了下视频播放时 存在如下申请:域名竟然是tc.qq.com我想会不会是腾讯视频,于是我关上腾讯视频轻易找了一个短视频关上,看到地址链接为:https://v.qq.com/x/page/o3125... 此时我就想把 "content": "r3020nq7ixl" 改为 https://v.qq.com/x/page/r3020...果然申请对应上了,视频资源也对上了。 阐明这老哥的小程序图床和视频库资源是基于腾讯视频,同时播放器我看了下小程序示例,就是原生的播放器 第三步:日常怎么经营保护资源的而后我在想:如果本人经营的话,天天搬砖也挺累的,就随机看了他几个板块的视频 对应到腾讯视频的发布者,发现不是同一个人,此时明确了,这老哥可能采纳关键词爬虫腾讯视频或者本人有一个后盾管理系统日常更新对应类型的视频地址到本人的数据库中; 以上是整个逆推过程,如果感觉有意思,能够点赞哈,谢谢~

July 30, 2020 · 1 min · jiezi

关于小程序:小程序图片下载实用

以下内容 间接放入即可 亲测无效单张下载<!-- HTML --><div @click="saveImage"> 下载图片 </div>/* methods */saveImage() { wx.downloadFile({ url:'http://upload.jianshu.io/admin_banners/web_images/4435/c1d3ca63353c8bd527f0d781605516cb5b266d02.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/1250/h/540', success: function(res) { if (res.statusCode === 200) { let img = res.tempFilePath; wx.saveImageToPhotosAlbum({ filePath: img, success(res) { console.log('胜利') }, fail(res) { console.log('保留失败') } }); } } }); }多张下载<!-- HTML --><div @click="saveImage"> 下载图片 </div>/* methods */saveImage() { let picArr=['http://upload.jianshu.io/admin_banners/web_images/4435/c1d3ca63353c8bd527f0d781605516cb5b266d02.jpg','http://47.102.105.248:8805/img-api/202007/24/1595585519996221273.png'] this.xiazaiTupian(picArr) }, //下载内容 xiazaiTupian: function(picArr,index) { let that=this; index=index||0; console.log(picArr[index]) wx.downloadFile({ url: picArr[index], success: function (res) { var temp = res.tempFilePath console.log(index) console.log(temp) wx.saveImageToPhotosAlbum({ filePath: temp, success: function () { index+=1; if (index < picArr.length){ that.xiazaiTupian(picArr, index); }else{ wx.showToast({ title: '下载实现', }) } }, fail: function () { index += 1; if (index < picArr.length) { that.xiazaiTupian(picArr, index); } else { wx.showToast({ title: '下载实现', }) } wx.showToast({ title: '第' + (index+1) + '下载失败', }) } }) }, fail: function (res) { wx.showToast({ title: '下载失败', }) } }) },

July 27, 2020 · 1 min · jiezi

关于小程序:解决小程序downloadFile下载图片返回临时路径后缀为unknown的问题

在开发过程中我发现,微信开发工具中调用wx.downloadFile返回的长期门路时没有任何问题,,然而在安卓真机调试的时候发现返回的长期门路居然是一个后缀为.unknown的链接,这也就是保留到相册失败的起因针对这个问题,咱们须要自定义图片名称,并且传入filePath指定文件下载后存储的门路。 let fileName = new Date().valueOf() let filePath = wx.env.USER_DATA_PATH + '/' + fileName + '.png' const downloadTask = wx.downloadFile({ url: "https://example.com/audio/123", filePath: filePath, success: (res) => { if (res.statusCode === 200) { wx.saveImageToPhotosAlbum({ filePath: filePath, success: (data) => { wx.showToast({ title: '保留胜利', icon: 'success', duration: 2000 }) }, fail: err=>{ console.log(err) } }) } } })快来试试吧

July 25, 2020 · 1 min · jiezi

关于小程序:小程序开发注意事项

1. 开发小程序时,每个页面肯定要在app.json文件中注册,页面文件夹和其蕴含的四个文件的名字要保持一致。 2. 小程序发动的都是HTTPS网络申请,在开发调试的过程中能够不校验协定和TLS版本,但在实际上线后必须进行HTTPS协定通信。 3. 小程序能够进行组件化开发以及数据绑定,所有对于DOM的操作都是基于数据驱动的,并没有间接进行DOM操作的做法,换言之,小程序内没有document对象,原生js和jQuery里的DOM操作思维要舍弃掉。 4. 小程序的网络申请wx.request()是不自带Cookies的,这和浏览器上的网络申请不同,因而基于Cookies实现的会话治理不适用于小程序。 5. 小程序的脚本文件中,内置对象是page,而非传统浏览器里的window,因而所有基于window对象来写的库(例如jQuery)都不适用于小程序。 6. 小程序提供模板性能,模板领有本人的作用域,它只能应用从data属性传入的数据。 7. 每一个页面文件夹下的.json文件是用来写配置项的,如果该页面无需增加相干配置,.json文件也要写上一对大括号(“{ }”),否则会报错。 8. 在同一个tab里的页面能够跳转,并且容许携带参数。不同tab的页面之间无奈跳转,应用wx.navigateTo()接口会报错。同时,tab之间的跳转能够用wx.switchTab()实现,然而门路后不能带参数。 9. 脚本文件里data的数据,在更新的时候要通过this.setData()办法来更新,而不能间接用“=”来做。 10. 在组件标签里,能够通过“data-属性值”的形式绑定咱们须要的数据,而后在事件内置event对象里进行获取。 11. 小程序里也存在事件的冒泡,具体的冒泡事件能够参考官网文档,如果心愿事件向上冒泡,则应用bind来绑定事件,若心愿阻止事件冒泡,就应用catch来进行事件绑定。 12. 小程序反对文件援用,有import和include两种形式,import有作用域,也就是引入的指标文件里import的模板不会被引入;而include等于是将指标文件除<template />以外的整个代码进行引入。 13. wx.login()和wx.getUserInfo()是两个独立的接口,前者能够实现用户登录,这个过程是悄无声息的,不须要用户受权,登录后能够拿到用户的openid和session_key;而wx.getUserInfo()能够拿到用户的具体信息,这个过程须要取得用户的受权,开发时也必须思考用户回绝受权的场景。 14. 目前小程序能够分享给微信好友和微信群,但小程序默认是没有这个性能的,只有在Page里定义了onShareAppMessage事件处理函数,点击小程序右上角才能够看到分享按钮。 15. 微信小程序还在一直的成长中,定期会有相干的API批改和减少、以及废除,开发者须要及时关注每一次重大的版本更新,同时对于一些新出的API要进行兼容解决,思考兼容的场景,因为某些API只在高版本的微信app里无效。

July 23, 2020 · 1 min · jiezi

关于小程序:答题小程序PHP版

简介智汇答题Plus小程序实用于考核,评测等场景,分为五大性能:练习,考试,错题,珍藏,排名; 练习性能分为程序答题和随机答题,模式分为答题模式和背题模式,答题模式能够在答完题目显示正确答案和帮忙提醒,能够进行跳题作答,背题模式能够间接查看正确答案和帮忙提醒,实时查看答题卡,统计答题状况,记忆性能,可能持续上次答题,也能够革除答题记录,从新答题。 考试性能次要包含倒计时性能,随机取题性能,可独自对每个分类设置取题数量,答题工夫,能够进行跳题作答,交卷评分,倒计时主动提醒交卷;记忆性能,保留可下次持续做题。 错题集性能次要是针对练习和答题两大模块的作答错题进行分类收集,可像练习性能一样进行答题模式和背题模式的作答形式,可移除错题,具备针对性的答题。 珍藏性能能够针对重点题目,谬误题目进行珍藏,而后从新重点练习;排名性能能够对每套试卷的作答人员进行分数等排名;答题记录能够随时查看用户的测试记录;针对部门考核,能够开启信息审核性能,只有通过审核的人员才可进入答题。反对开启和禁用练习性能。 本程序还搭配治理后盾,治理用户,零碎设置,后盾审核用户信息,发送模板音讯告诉用户,能够随时减少套题,减少题目,编辑题目,删除题目,以及应用模板批量的导入题目,查看答题记录,查看反馈意见等,十分不便实用!还附带阐明残缺的部署操作文档,以及小程序上线操作。 运行环境PHP >=5.5.9 && PHP <=7.2MySQL >=5.1Apache、IIS、Nginx留神域名必须备案小程序必须应用https协定 443端口效果图

July 23, 2020 · 1 min · jiezi

关于小程序:小程序分享朋友圈开启新流量市场

小程序开启分享性能,接入微信朋友圈流量入口背景2020年7月8日之前,百度搜寻小程序分享朋友圈,各个平台简直都是生成二维码之后的图片分享案例文章。而在2020年7月8日凌晨,微信正式开启了小程序分享朋友圈性能,并在7月8日开始进行公测。公测告诉发放至各个经营良好的小程序平台后盾。 初期仅开发者可分享小程序到朋友圈,之后在7月16日时灰度测试安卓用户——遵循常例苹果端前期上线同类型性能。 7月8日凌晨,微信外部研发者发送出一条小程序分享朋友圈的音讯,标记着小程序分享朋友圈性能的推出,小程序终于关上了朋友圈这条呼声已久的“电商微商流量池”。 音讯刚出便引起各界关注和媒体报道。微信系产品在用户眼里是一个继续关注用户体验、不断更新的社交工具,现在国人简直都离不开这个工具。而小程序自问世以来从不被看好到追随O2O业务方兴未艾再到近期小程序直播的衰亡,现在买通了“微信内最大的流量入口”朋友圈,是发力愈来愈狠的节奏。百度、阿里也见好相继推出了小程序业务,甚至国外也开始倒腾相似小程序的技术。此次分享朋友圈性能的呈现对电商、内容类小程序影响极大,取得内测告诉几小时后,相干电商及内容小程序平台纷纷上线了“分享朋友圈”性能。电商类小程序比方糖纸,玩物志好物商店、内容型小程序如亿邦APP、工具类小程序如有赞的“抽奖助手”,都第一工夫上线了该性能。 上线办法小程序分享朋友圈性能见文档https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share-timeline.html。相干代码、注意事项、经营标准都很明确。整体从开发到上线最快三四个小时可实现。须要留神的是:小程序为躲避歹意分享,不容许账号信息、诱导分享类信息分享朋友圈。因而滥用该性能的游戏类的小程序审核会更加严格。而小程序本身也制订了凋谢标准:朋友圈点击后不会间接进入小程序,而是进入小程序卡片页——单页模式,点击右下角“返回小程序”才能够真正进入该小程序。这一动作很好地保障了用户体验,推动更多精品小程序良性倒退。 小程序分享朋友圈性能暂未全副凋谢,目前仅限安卓用户(且在灰度测试中),但对小程序运营者无疑是个大利好消息,能够预感将来朋友圈中会多出很多带小程序符号的小程序页面分享,咱们能够更高效地理解一个小程序产品的风貌。 二次验证码小程序,一键分享朋友圈二次验证码小程序作为小众的平安工具利用,2016年随小程序内测呈现上线的产品,受到百万忠诚用户拥趸。便捷、牢靠的防黑客撞库攻打办法从同类利用中怀才不遇。并在未做经营状况下用户自主疯长至百万。此次分享朋友圈性能,二次验证码小程序可分享【首页】、【备份&复原】、【云服务】页面。别离对应密钥的增加、复原、找回。 二次验证码小程序优于同类利用之处,除了作为小程序比APP轻便,即搜即用——它作为双因素验证工具,应用RFC6238协定的基于工夫、密钥、事件三因素的TOTP算法,还能够找回失落的验证码。该云服务性能可找回丢手机、换手机、刷机、手机故障、移除/删除小程序、误删数据等状况造成的验证码遗失问题。该性能极大地解决了失落验证码的用户想要及时登陆平台的问题。因为云服务性能须要安防保护,二次验证码小程序采纳了AES256算法,使得黑客暴力破解简直不可能;采纳CSPRNG加不可预测的随机盐,辅以高级加密技术:100000轮PBKDF2-SHA256算法,即使是公司后盾技术研发,也无奈破解到用户信息。 二次验证码用户遍布政府、媒体、企业、游戏、区块链等行业,在开启一键分享朋友圈性能后,将更加不便用户自发流传应用。有了每30秒主动变动一次的二次验证码,即使有人获取了用户的账号、明码,截获了用户的手机、邮件验证码,他们仍然无奈进入平台。 二次验证码,为用户信息资产保驾护航。

July 22, 2020 · 1 min · jiezi

关于小程序:微信小程序上拉加载与下拉刷新

上拉加载利用场景:微信内容页上拉加载,拉到最底部呈现提醒文案 思路:1.初始页号为12.应用微信自带的办法onReachBottom检测滚动到底部,页号pageNo+1,而后去申请后盾接口,把最新返回的后果增加到原来的数组里,从新渲染思路有了那么咱们开始上代码把3.当你调取的接口里的数据length<pageSize Page({ data: { page: 1, pages: 0, articles: [] }, onLoad(options) { // 页面首次加载,申请第一页数据 this.getInfoListData(1) }, onReachBottom() { // 下拉触底,先判断是否有申请正在进行中 // 以及查看以后申请页数是不是小于数据总页数,如符合条件,则发送申请 if (!this.loading && this.data.page < this.data.pages) { this.getInfoListData(this.data.page + 1) } }, getInfoListData(pageNo) { this.loading = true // 向后端申请指定页码的数据 return getArticles(pageNo).then(res => { const articles = res.items this.setData({ page: pageNo, //以后的页号 pages: res.pages, //总页数 articles: this.data.articles.concat(articles) }) }).catch(err => { console.log( err) }).then(() => { this.loading = false }) }})下拉刷新1.配置json ...

July 21, 2020 · 1 min · jiezi

微信小程序滑动切换导航-导航栏跟随滚动导航-顶部tab导航

前言很多App都有这种设计,例如淘宝、爱奇艺、今日头条、知乎等都有用到,大部分的App都会用到这种设计,十分支流。 tab导航栏应用<scroll-view>标签,内容应用<swiper>,不多说,间接上代码,为了更实在展现实例的应用,我间接就配置了服务器来取数据进行渲染。 index.wxml<view class="container"> <!-- tab导航栏 --> <!-- scroll-left属性能够管制滚动条地位 --> <!-- scroll-with-animation滚动增加动画过渡 --> <scroll-view scroll-x="true" class="nav" scroll-left="{{navScrollLeft}}" scroll-with-animation="{{true}}"> <block wx:for="{{navData}}" wx:for-index="idx" wx:for-item="navItem" wx:key="idx"> <view class="nav-item {{currentTab == idx ?'active':''}}" data-current="{{idx}}" bindtap="switchNav">{{navItem.text}}</view> </block> </scroll-view> <!-- 页面内容 --> <swiper class="tab-box" current="{{currentTab}}" duration="300" bindchange="switchTab"> <swiper-item wx:for="{{yxlist}}" wx:for-item="tabItem" wx:for-index="idx" wx:key="idx" class="tab-content"> <view>{{tabItem.yxname}}</view> <image src="{{tabItem.yxlogo}}" style="width:100px;height:100px;"></image> </swiper-item> </swiper></view>index.wxss/**index.wxss**/page{ width: 100%; height: 100%;}.container{ width: 100%; height: 100%;}.nav { height: 80rpx; width: 100%; box-sizing: border-box; overflow: hidden; line-height: 80rpx; background: #f7f7f7; font-size: 16px; white-space: nowrap; position: fixed; top: 0; left: 0; z-index: 99;}.nav-item { width: 20%; display: inline-block; text-align: center;}.nav-item.active{ color: red; font-weight: bold;}.tab-box{ background: #fff; padding-top: 80rpx; height: 100%; box-sizing: border-box;}.tab-content{ overflow-y: scroll;}index.js//index.js//获取利用实例const app = getApp()Page({ data: { motto: 'Hello World', userInfo: {}, hasUserInfo: false, canIUse: wx.canIUse('button.open-type.getUserInfo'), navData:[ { text: '广科' }, { text: '广东理工' }, { text: '广石油' }, { text: '广东工商' }, { text: '广州科技' }, { text: '白云' }, { text: '肇庆' }, { text: '嘉应' }, { text: '华商' } ], currentTab: 0, navScrollLeft: 0 }, //事件处理函数 onLoad: function () { var that = this; //向后端服务器发动申请数据 wx.request({ //URL url: 'https://www.likeyun.cn/api/yxlist.json', //发送的数据 data: {}, //申请的数据时JSON格局 header: { 'Content-Type':'application/json' }, //申请胜利 success: function (res) { //控制台打印(开发调试用) console.log(res.data) //把所有后果存进一个名为yxlist的数组 that.setData({ yxlist: res.data.yuanxiaolist, }) } }) wx.getSystemInfo({ success: (res) => { this.setData({ pixelRatio: res.pixelRatio, windowHeight: res.windowHeight, windowWidth: res.windowWidth }) }, }) }, switchNav(event){ var cur = event.currentTarget.dataset.current; //每个tab选项宽度占1/5 var singleNavWidth = this.data.windowWidth / 5; //tab选项居中 this.setData({ navScrollLeft: (cur - 2) * singleNavWidth }) if (this.data.currentTab == cur) { return false; } else { this.setData({ currentTab: cur }) } }, switchTab(event){ var cur = event.detail.current; var singleNavWidth = this.data.windowWidth / 5; this.setData({ currentTab: cur, navScrollLeft: (cur - 2) * singleNavWidth }); }})成果演示 ...

July 12, 2020 · 3 min · jiezi

记一次小程序开发的踩坑之旅

问题最近跟着慕课网上的课程在做一个网易云音乐小程序,遇到了一个进度条回跳的 bug,这里记录一下踩坑和解决的过程。 具体情况见下图: 预期行为:在拖拽进度条之后,间接达到拖拽之后的地位 理论行为:在拖拽进度条之后,会首先回跳到拖拽之前的地位,而后再跳到拖拽之后的地位。 模仿调试的 bug代码逻辑无论如何,先来看一下代码的逻辑: 页面构造如下,左右两个 text 显示工夫就不说了,次要是两头的进度条。这个进度条没有应用小程序原生提供的 slider 来做,而是采纳 movable-area 和 movable-view 相结合的形式,movable-area 划出了一块可供滑动的区域,而 movable-view 则是两头能够拖拽的滑块。拖拽滑块的时候会有个 x 来记录拖拽间隔,同时绑定 onXChange 事件监听 x 的变动,绑定 onTouchEnd 事件监听拖拽松手的动作。另外,上面还有一个 progress 组件,这个是用来显示进度的,曾经播放的进度给个红色款式。 <view class="container"> <text class="time">{{showtime.currentTime}}</text> <view class="control"> <movable-area class="movable-area"> <movable-view class="movable-view" direction="horizontal" damping="1000" x="{{movableDist}}" bindchange="onXchange" bindtouchend="onTouchEnd"> </movable-view> </movable-area> <progress percent="{{progress}}" stroke-width="4" backgroundColor="#969696" activeColor="#fff"></progress> </view> <text class="time">{{showtime.totalTime}}</text> </view>一旦确定 x 的变动来源于用户的拖拽,就在onXChange 里依据比例关系设置好进度。这里要留神的是,在用户拖拽没松手的时候先不进行 setData 渲染视图层的操作 —— 因为用户可能会频繁进行拖拽,咱们要防止频繁的 setData 带来的性能损耗。所以,这里只是把数据保留下来,期待渲染。 onXchange(event){ if(event.detail.source == "touch"){ ratio = event.detail.x / (movableAreaWidth - movableViewWidth) this.data.progress = ratio * 100 this.data.movableDist = event.detail.x }},用户一旦松手,根本就能够确定他曾经把滑块拖拽到了指标地位,这时候就进行正式的 setData 操作,同时调用 seek 办法让歌曲跳转到对应的地位去播放 ...

July 11, 2020 · 2 min · jiezi

微信小程序开发工具提示-Login-不能获得-ID-的问题解决

在对微信小程序进行调试的时候,遇到取得 ID 的谬误。 错误信息如下: mp-openid-01830×645 34.6 KB 这时候,你可用尝试将 cloudfunctions下的login 文件夹创立并部署,装置云依赖。 这句话的英文切实是太难了解了。 其实要求的是将你程序代码中的 cloudfunctions 下的文件夹。 如下图所标识的地位。 对应的英文环境,应该是下面的选项。 当上传实现后,将会在右上角提醒你的上传状态。 校验 ID而后你可用回到首页,而后从新刷新后取得 OpenID。 如果一切正常,你应该能够看到取得后的 OpenID。 下面的内容就是曾经取得的 OpenID。 https://www.ossez.com/t/login-id/254

July 11, 2020 · 1 min · jiezi

微信小程序开发工具初始化代码仓库

微信小程序开发工具应用 Git 来进行治理的。 你可用应用微信的 Git 服务。 单击下面的 代码管制。 如果是第一次应用的话,将会要求你对本地代码仓库进行初始化。 当你初始化实现后,你会看到上面的界面: 下面显示的是本地代码仓库曾经初始化实现了。 然而你的代码还没有上传到服务器上。 单击下面的链接,将会进入网页版本的代码治理中。 如果是第一次的话,你须要对你的账号初始化。 而后你能够设置账号保留。

July 11, 2020 · 1 min · jiezi

微信小程序开发如何初始化远程仓库并-PUSH

你须要先初始化近程仓库,一般来说你能够间接用微信的 Git,你也能够用其余的 Git。 假如咱们这里应用微信自带的 Git。 拜访的地址为:https://git.weixin.qq.com/ 如果你没有受权的话,你首先须要进行受权,如果曾经受权的话。 你可用进入你的项目组。 在这里你可用看到你曾经领有的项目组,Git 遵循的构造是项目组 > 我的项目。 你的微信小程序我的项目,必须要属于一个项目组。 抉择你心愿进入的项目组。 创立我的项目在首页中,你可用抉择创立我的项目。 在后续的页面中,输出你心愿创立的项目组名称和你的项目名称,而后单击创立后持续。 在后序的我的项目中,你可用找到你的创立的我的项目的地址。 拷贝这个地址信息. 在开发环境中设置近程地址当你曾经有我的项目的近程地址后,你能够在你的本地我的项目中设置你近程仓库地址。 右键后抉择增加 输出名字和地址后保留。 这里的名字其实是仓库的名字,你可用选你的名字,很多时候 Git 默认会应用 origin 为规范的名字,感觉开发工具这里名字这里有点绕。 而后你可用保留退出。 推送 PUSH当所有都配置好当前,你可用抉择 Push 进行推送到近程。 在弹出的对话框中,上面须要你手动写近程的分支的名字,如果你想和你本地统一,你可用应用 master。你也能够应用不同的分支名字。 这里是手动输出的,有点绕。 Push 提醒受权失败如果你提醒受权失败,你须要进入微信的 Git 网站中,设置一个明码。 你也能够在账户设置的门路下设置明码。 如何还是提交失败的话,你能够在你本地仓库中的受权设置中设置用户名和明码。 微信开发工具中自带的这个 Git 性能,切实是有点蹩脚,不倡议你应用这个工具,你可用应用其余的一些可视化工具,比这个好很多很多。 这是你在最先开始开发的时候可能遇到的一个坑。 https://www.ossez.com/t/push/250

July 11, 2020 · 1 min · jiezi

苹果小程序App-Clips-和微信小程序区别在哪我们做了一次上手实操

作者|何世友、彭权华阅读原文 6 月 23 日,Apple Park 的观众席上空无一人,但此时一场特别的「科技春晚」正在上演。 在 2020 年的 WWDC 大会中,自 iOS 7 以来变动最大的一次更新——iOS 14 来了,AirPods Pro 有了黑科技,ARM Mac 也来了。但对小程序开发者来说,他们最关心的应该还是此次 WWDC 发布的 App Clips 了。 「一个无需下载应用,就能使用 app 的功能。」这听上去是不是和小程序有点相似,但这是 App Clips,也被一部分人称为「苹果小程序」。它是什么?它和小程序有什么不同?我们该怎么开发 App Clips? 别急,一篇文章给你解答。 App Clips 从哪里来?App Clips(应用片段) 作为 WWDC2020 上最值得关注的特性之一,由于缺乏官方示例,是用户感知度最低的新功能。同时,因为和微信小程序过于相似的产品形态设定,也被部分开发者冠以「苹果牌小程序」的昵称。 官方对其的定义是—— App clips are a great way for users to quickly access and experience what your app has to offer. An app clip is a small part of your app that’s discoverable at the moment it’s needed. App clips are fast and lightweight so a user can open them quickly.应用片段让用户可以快速体验应用。一个应用片段是应用的一小部分,可以在需要的时候被发现。应用片段快速而轻巧,因此用户可以快速打开它们。 ...

July 8, 2020 · 2 min · jiezi

wxParse无法解析html

第一步错误代码: <span style="color:red;font-family:" serif",tahoma,verdana,helvetica;font-size:12px;font-style:normal;font-weight:400;text-decoration:none;"="" sans="">XXXX</span> 一直以为是多个双引号引起的bug。最终发现是font-family后面多了个空格导致的。 第二步找到wxParse.js文件,把style后有空格的去掉,问题就解决 var arr1 = data.split('style=')var ping = arr1[0] + "style=" + arr1[1].replace(/\s/g, "") ;

July 3, 2020 · 1 min · jiezi

添加到我的小程序提示组件

Mini-add-tips 用于提示用户首次进入小程序时,点击右上角菜单进行【添加到我的小程序】操作特性与支付宝原收藏组件(添加到首页)保持样式一致,支持在自定义导航栏场景下保持一致效果。 预览截图 样例在开发者工具预览 安装使用1. 获取组件下载release(稳定)latest release master(最新)git clone https://github.com/MakerGYT/mini-add-tips.git将项目中components/add-tips文件夹拷贝到组件路径下 2. 引入组件在使用该组件的页面对应json文件中添加: { "usingComponents": { "add-tips":"/components/add-tips/index" }}3. 使用组件<!-- index.wxml --><add-tips name="示例"/>自定义导航栏请参考/pages/index 属性列表属性类型默认值必填说明nameString测试否小程序名称logoString<img src="https://imgkr.cn-bj.ufileos.com/c958e4cd-6bab-43ed-93aa-697207cf33a5.png" width=50/>否小程序LogodurationNumber10否持续显示时间(s)delayNumber2否进入页面延迟时间(s)开始显示customBooleanfalse否当前页面是否{"navigationStyle": "custom"}开发说明鉴于目前微信基础库的设计: 收藏操作与添加到我的小程序对于用户容易混淆,但效应一样,故没必要具体引导用户。目前只有监听用户点击右上角菜单“收藏”按钮的行为,但实际上兼听不到收藏行为,只能定义收藏内容无法获知是否已经收藏、是否已经添加到我的小程序,故提示可能对用户造成干扰。目前没有可以调起添加小程序的api、button,或许出于"降低干扰度"的考虑,但就迫使手动设置引导,又会造成如2中所述干扰。即便已经设置{"navigationStyle": "custom"},其导航栏相关的api依然调用是有效的,无论组件还是页面内均无法据此获知导航栏是否custom,只能由外部传入。Todo[ ] 根据用户使用小程序频次、收藏等行为,智能控制显示区间及显示时机。LicenseMIT © MakerGYT

July 2, 2020 · 1 min · jiezi

如何使用top查看程序的内存占用情况

RT 19    0.00   0.0%   0.0%   0.0% 100.0%   0.0%   0.0%   0.0%   0.0% 20    0.01   0.0%   0.0%   0.0% 100.0%   0.0%   0.0%   0.0%   0.0% 21    0.00   0.0%   0.0%   0.0% 100.0%   0.0%   0.0%   0.0%   0.0% 22    0.01   0.0%   0.0%   0.0% 100.0%   0.0%   0.0%   0.0%   0.0% 23    0.00   0.0%   0.0%   0.0% 100.0%   0.0%   0.0%   0.0%   0.0% 32    0.00   0.0%   0.0%   0.0% 100.0%   0.0%   0.0%   0.0%   0.0% 33    0.02   0.2%   0.0%   0.0%  99.8%   0.0%   0.0%   0.0%   0.0% 34    0.87  92.0%   0.0%   2.0%   6.0%   0.0%   0.0%   0.0%   0.0% 35    0.02   2.2%   0.0%   0.0%  97.8%   0.0%   0.0%   0.0%   0.0% 36    0.00   0.0%   0.0%   0.0% 100.0%   0.0%   0.0%   0.0%   0.0% 37    0.03   0.0%   0.0%   0.0% 100.0%   0.0%   0.0%   0.0%   0.0% 38    0.03   0.0%   0.0%   0.0% 100.0%   0.0%   0.0%   0.0%   0.0% 39    0.02   0.2%   0.0%   0.0%  99.8%   0.0%   0.0%   0.0%   0.0% ---   ----  -----  -----  -----  -----  -----  -----  -----  ----- avg   0.04   3.8%   0.0%   0.2%  96.0%   0.0%   0.0%   0.0%   0.0% System Page Size: 4Kbytes Memory: 71911060K (17913792K) real, 75552736K (19746536K) virtual, 15590520K free  Page# 1/43 CPU TTY  PID USERNAME PRI NI   SIZE    RES STATE    TIME %WCPU  %CPU COMMAND 34   ? 17731 bill     234 20   309M   216M run     42:58 95.48 95.31 fileinstore 33   ?   132 root     152 20 62712K 55744K run    147:17  2.56  2.55 vxfsd 39   ? 18842 billtest 168 20 94296K 11656K sleep   45:43  1.91  1.91 GuardMain 19   ?  4192 bill     168 20   105M 23456K sleep   57:38  1.91  1.90 GuardMain 34   ?   136 root     152 20  4608K  4096K run      4:26  1.25  1.25 pagezerod 只能看到五个进程 使用top -s10 -d20|grep 我的程序pid 什么都不显示 hp-un

July 1, 2020 · 1 min · jiezi

关于新媒体运营技术的一点简要思考

最近这几年新媒体运营非常火爆,而且大部分的公司和企业都对新媒体这一块非常重视。因为通过新媒体这块给他们带来的利润确实是很高的,所以他们尝到甜头之后就会更加重视这方面。而且现在不管什么行业都会新媒体运营这一职位所以现在新媒体时代已经来到了我们的身边。 可能现在还是会有很多人对于新媒体不太了解,不知道这个新媒体是干什么的,为什么就能带来这么多的利润的为公司或者是企业。其实说白了就是我们平时玩的微信、微博、论坛、社区等等这些都是属于新媒体的一种。 在你的微信里面你肯定会看到很多刷朋友圈的人,没事发个心情或者广告之类的,如果你要看到之后,有什么需要的话就会去咨询他们,如果你觉得合适的话就会买,买了之后如果你用的效果还不错你肯定就会介绍给身边的朋友,这样就形成了一连串的消费,自然而然的也就给公司和企业带来了很大的利润。所以这个也是新媒体运营现在如此火爆的一个最主要的原因之一。 运营者通常希望粉丝越多越好,用户数越多越好。对于大平台/公司来讲确实这样,比如电商平台有足够多的商品,外面平台有足够多的美食,同时大公司也拥有足够的能力来运营。 但新媒体行业有所区别,很难让所有人都依赖一个公众号,比如仅仅新闻领域,就可以分成生活新闻、娱乐新闻、农业新闻、科技新闻、教育新闻等几十种类型。 每个人的兴趣爱好都是有范围的,有领域,是标签化的。所以一个公众号,只需要满足小部分的人群就行,而且也只能解决小部分人的需求。 大白话叫做,讨好你想讨好的那群人。 这里面会涉及到供需关系,作为运营者只能提供到某种体量的信息给用户,超出这个体量就不在运营者的掌控范围内了。 互联网公司解决这种问题的办法,通常是拆分公司、拆分项目、独立运作等,比如域名地址不一样,运营不同的APP等。 粉丝不需要多,精准,活跃就好。新媒体运营就是指利用微信微博等自媒体平台进行品牌推广,产品营销;策划品牌相关的、优质、有高度传播性的内容和线上活动。 我们可以从新媒体运营的岗位职责出发,从需求入手打造符合企业需要的运营: 1、负责移动互联网自媒体平台(微信、微博、手机终端为主)的日常运营及推广工作; 2、负责能够独立运营微信公众号,为粉丝策划与提供优质、有高度传播性的内容,定期福利,如智汇返佣https://www.kaifx.cn/broker/t... 3、负责策划并执行微信营销线日常活动及跟踪维护,根据项目发送各种微信内容; 4、负责增加粉丝数,提高关注度和粉丝的活跃度,并及时与粉丝互动; 5、挖掘和分析网友使用习惯、情感及体验感受,及时掌握新闻热点,有效完成专题策划活动; 6、紧跟微信发展趋势,广泛关注标杆性公众号,积极探索微信运营模式; 7、充分了解用户需求,收集用户反馈,分析用户行为及需求。

June 30, 2020 · 1 min · jiezi

手把手教你从零开发到上线一个答题微信小程序项目实战教程之02开发题目分类页

项目搭建参考上一节内容 开发试题分类页面pages目录下新建home目录,并添加4个文件,如图所示: 其中:home.js // pages/home/home.jsPage({ data: { }, onLoad: function (options) { }, toTestPage: function(e){ let testId = e.currentTarget.dataset['testid']; wx.navigateTo({ url: '../test/test?testId='+testId }) }})home.wxml <!--pages/home/home.wxml--><view class="page"> <view class="page-title">请选择试题:</view> <view class="flex-box"> <view class="flex-item"><view class="item bc_green" bindtap="toTestPage" data-testId="18">IT知识</view></view> <view class="flex-item"><view class="item bc_red" bindtap="toTestPage" data-testId="15">游戏知识</view></view> <view class="flex-item"><view class="item bc_yellow" bindtap="toTestPage" data-testId="21">体育知识</view></view> <view class="flex-item"><view class="item bc_blue" bindtap="toTestPage" data-testId="27">动物知识</view></view> <view class="flex-item item-last"><view class="item bc_green" bindtap="toTestPage" data-testId="0">综合知识</view></view> </view></view>home.json { "navigationBarTitleText": "试题分类", "usingComponents": {}}home.wxss /* pages/home/home.wxss */.page-title { padding-top: 20rpx; padding-left: 40rpx; font-size: 16px;}.flex-box { display: flex; align-items:center; flex-wrap: wrap; justify-content: space-between; padding: 20rpx; box-sizing:border-box;}.flex-item { width: 50%; height: 200rpx; padding: 20rpx; box-sizing:border-box;}.item { width:100%; height:100%; border-radius:8rpx; display: flex; align-items:center; justify-content: center; color: #fff;}.item-last { flex: 1;}修改app.json,注意:pages/home/home一定要放到pages数组的最前,以成为首页。 ...

June 29, 2020 · 1 min · jiezi

手把手教你从零开发到上线一个答题微信小程序项目实战教程之01开发环境搭建微信小程序helloworld

上线项目演示微信搜索[放马来答]或扫以下二维码体验: 项目大纲1.开发环境搭建,微信小程序helloworld2.题目分类页3.答题页mock数据4.答题页请求真实数据(pay)5.答题页记录错题6.结果得分页(pay)7.展示错题(pay)8.记录考试结果(pay)9.小程序上线 1.注册微信小程序点击立即注册,选择微信小程序,按照要求填写信息 2.登录小程序并完善信息填写小程序信息,完善信息。 3.下载小程序开发工具完善信息后点击文档,工具,下载,选择稳定版的对应平台的安装包下载,下载完后点击安装即可 4.建立小程序项目扫码登录,选择小程序,并点击加号,填写相关信息,APPID位置于下方截图所示。 5.小程序代码结构介绍如下图所示的四个文件,主要用于注册和配置微信小程序,其包含的是全局配置信息。 app.js:用于注册微信小程序应用。app.json:小程序的全局配置,比如网络请求的超时时间,以及窗口的属性app.wxss:小程序全局样式project.config.json:包含了小程序的整体配置信息,即使是换了开发设备,亦或是换了项目,只要将该文件保留,每个开发者的个性化设置就都将保留。 如下图所示,还有两个目录, pages:每一个子文件夹代表了小程序的一个页面,比如index,和logs分别代表了两个页面。每个页面又由四个文件组成:index.js:处理页面逻辑和数据交互。index.json:对应页面的配置信息。index.wxml:展示页面的内容和元素。index.wxss:设置用wxml展示元素的样式。utils:存放的是一些工具代码,实现代码复用的目的。 6.小程序helloworld 参考:https://www.jianshu.com/p/ae8...

June 29, 2020 · 1 min · jiezi

视频-在小程序竞争激烈的今天淘票票如何脱颖而出

作者:丰安 相信大家还记得曾引起现象级风波小飞机和跳一跳这两个小程序。 2018年是小程序爆发之年,从国内手机厂商到BAT等公司,纷纷推出或推广小程序平台。为什么这个多企业愿意投入小程序,它的核心业务价值究竟是什么? 从产品和业务的角度上来看,小程序的核心的特点是在于场景融合,也就是说小程序本身的一些功能跟它所在的平台应用进行一些融合,借助平台的流量,把DAU等各方面也好做大做强。 对于平台来说,小程序可为平台拓展更多的使用场景,形成更多闭环,同时增加平台的用户粘度。 所以小程序和其所在的平台是一个共赢的关系。 阿里文娱技术团队相继上线了淘票票的支付宝小程序、手淘轻应用、快应用、字节跳动小程序、百度小程序,微信小程序。 为什么淘票票上线这么多小程序?小程序这个领域里面应该怎么去玩,去突破?阿里文娱高级技术专家丰安为你分享他在小程序领域探索的经验,包括小程序实践、跨端架构演进路线、工程化技术经验等,必让你大受启发,戳我观看!

June 24, 2020 · 1 min · jiezi

Color-Hunt-漂亮炫酷的配色小程序

利用自己的业余时间,开发了一款颜色配色方案的小程序 - Color Hunt。 小程序主要参考 Color Hunt 这个网站,这个网站设计真的很棒,个人也经常用,所以小程序也秉承网站的风格,没有做调整,不想改头换面,因为这个网站已经做的足够好,所以没有藏着掖着。只是手机上用不方便,每次用 pc 选择配色比较麻烦,想想其他人应该也有这个需求,才想做一个小程序。 那么 Color Hunt 是什么? 摘自:http://www.fly63.com/nav/1347 Color Hunt 包含了一系列漂亮炫酷的色彩组合,每天更新配色方案,并且根据浏览数排列出最漂亮的配色方案。Color Hunt 是一个收录许多配色和色码卡的收集本,为什麽需要这样的小呢?有些时候我们可能需要某些颜色,但又不太清楚怎样搭配比较好看、合适;或者你曾经看过某种颜色呈现,但却不是很瞭解这个颜色的实际。我们自己开发网站,开放app,制作宣传图的时候,就可以使用Color Hunt选取合适的颜色搭配。 我们先来看看 Color Hunt 的网页版效果: 小程序版本的效果图: 颜色详情页面: 喜欢哪些颜色可以收藏: 通过微信扫描二维码体验小程序或者通过微信搜索Color Hunt也可以体验: 也欢迎各位老铁,有什么意见或者建议,可以提出来,继续改进,感谢!

June 18, 2020 · 1 min · jiezi

小程序进阶之路跨平台开发避坑指南

简介: 小程序的开发不可避免的会面临跨平台开发的问题。各小程序平台有哪些特点?如何处理各平台的差异?本文分享淘票票在跨平台开发上的经验总结,包含了技术演进及差异控制策略,希望能帮助同学们提前避坑。 在 2019 年,阿里巴巴文娱的淘票票几乎涉足了当时市面上所有的小程序,其中在不少平台上,我们是阿里第一批吃螃蟹的技术团队。回顾过往,我们做过很多尝试,也踩过很多坑。 我们特别整理了支付宝小程序、百度小程序、字节跳动小程序、快应用的开发经验,希望为你带来启发。 一 支付宝小程序支付宝内的淘票票用户主要是以购票为主,工具属性比较明显。淘票票入口众多,均引导跳转到小程序,引导用户在小程序内进行购票、娱乐消费、收藏、添加到首页/桌面、分享等行为。 淘票票支付宝小程序,经历了近一年的起步开发,以及一年多的版本迭代,业务开发涵盖了购票、视频、资讯、社区等多个场景。 1 小程序开发1) 在核心业务中慎用 web-view 实际项目线上运行情况及用户反馈表明:web-view 初始化较慢、易受网络干扰、性能差(对比离线包及普通 H5 页面)、问题较多,建议不要在核心业务中使用 web-view 进行承载。 2) 自有城市体系与支付宝城市组件的适配技巧 由于支付宝的城市组件是基于自身城市体系的,淘票票拥有独立的城市体系,所以需要城市选择组件适配不同城市体系的场景。经过几轮推动迭代,淘票票线上已使用城市选择组件,已支持复写当前定位城市、历史访问城市、热门城市、城市列表信息等。使用my.chooseCity、my.onLocatedComplete、my.setLocatedCity 三个 JSAPI 可实现对应效果。 3) 如何实现沉浸式效果(透明导航栏)? 首先在 page.json 配置 “transparentTitle” 为 “auto” 属性,开启沉浸式布局。其次,页面布局适配沉浸式顶部透明导航栏即可,通过 my.getSystemInfo 获取 titleBarHeight 及 statusBarHeight 可计算出顶部透明高度。注意:Android 5.0 以下由于不支持沉浸式状态栏,所以页面会从状态栏下开始布局。 4) 小程序 tabBar 换肤、红点 主要使用的JSAPI及event:my.setTabBarStyle、my.setTabBarItem、page.onTabItemTap,参数参考官方文档即可。注意事项如下: 小程序触发 relaunch 时,tabBar 的样式会被清除,需要再次设置,目前建议在 app.onShow 里多次触发设置逻辑。尽量使用本地图片,在线图片有个下载的过程,体验不太好,且弱网下图片载入可能失败。my.setTabBarItem 的参数每一项均需要赋值,否则 Android 可能会报 “invalid parameter”。2 小程序开发注意事项不要使用 tnpm 安装依赖,tnpm 软连接目前支持有问题。devDependencies 和 dependencies 需要分开,将 devDependencies 移到项目代码外层,否则会额外增加包大小。设置 transparent/pullRefresh 等 window 配置时,跳转别的页面会被继承,需要在 app.json 初始化此类配置信息规避。web-view 里面的页面会失去下拉刷新、resume 等特性。Android 低版本不支持 sticky 属性。某个值控制 dom 是否渲染,下次更新时此值若为 undefined 时不会销毁掉会被忽略掉。window.atob、window.btoa 需要第三方库来替代。lodash 某些方法不能直接使用,因为小程序构建时无 global 对象。3 小程序监控使用阿里云的 ARMS 平台,参考官方文档接入即可。 ...

June 18, 2020 · 3 min · jiezi

lottie-动画库适配小程序的版本

lottie-miniprogramlottie 动画库适配小程序的版本。 lottie 的相关介绍与动画生成方法等请参考 官方说明依赖小程序基础库版本 >= 2.8.0 的环境 https://developers.weixin.qq....可参考该代码片段:https://developers.weixin.qq.com/s/2TYvm9mJ75bF。 制作lottie要使用的json包不会AE也不怕,阿里提供了一个在线制作lottiejson的网站:https://design.alipay.com/emo...普通开发者也可以做出精美的动画。通过上面那个连接制作完动画后,导出为json即可。如果有服务器的,可以将json文件保存到服务器,这样就可以减轻小程序的体积了。 具体代码使用步骤如下:通过 npm 安装:npm install --save lottie-miniprogram传入 canvas 对象用于适配1. <canvas id="canvas" type="2d"></canvas> 2. <button bindtap="click">点我预览动画</button>import lottie from 'lottie-miniprogram'click() {//按键点击事件 wx.createSelectorQuery().select('#canvas').node(res => { const canvas = res.node const context = canvas.getContext('2d') canvas.width = 300//设置宽高,也可以放到wxml中的canvas标签的style中 canvas.hight = 300 lottie.setup(canvas)//要执行动画,必须调用setup,传入canvas对象 lottie.loadAnimation({//lottie给的接口 loop: false,//是否循环播放(选填) autoplay: true,//是否自动播放(选填) path:'https://cdn.你的域名.com/aaa.json',//lottie json包的网络链接,可以防止小程序的体积过大,要注意请求域名要添加到小程序的合法域名中 rendererSettings:{ context//es6语法:等同于context:context(必填) } }) }).exec() }示例效果如下 lottie 主要接口如下:lottie.setup(canvas)lottie.loadAnimation({ ...})https://developers.weixin.qq....目前提供两个接口: lottie.setup(canvas) 需要在任何 lottie 接口调用之前调用,传入 canvas 对象 lottie.loadAnimation(options) ...

June 18, 2020 · 1 min · jiezi

微信小程序连接蓝牙设备并传递数据体脂秤

流程流程图 分步详解wx.getSystemInfo(Object object) 获取系统信息 获取操作系统及版本 页面加载的时候(或者app.js中 )↓初始化蓝牙模块 wx.openBluetoothAdapter(Object object) 在用户蓝牙开关未开启或者手机不支持蓝牙功能的情况下,通过错误码(errCode=10001),提示打开蓝牙或蓝牙功能不可用。此时小程序蓝牙模块已经初始化完成,可通过 wx.onBluetoothAdapterStateChange监听手机蓝牙是否可用或是否在搜索状态。 关闭蓝牙模块wx.closeBluetoothAdapter。调用该方法将断开所有已建立的连接并释放系统资源。建议在使用蓝牙流程后,以及onhide,onUnload。↓开始搜索蓝牙 wx.startBluetoothDevicesDiscovery(OBJECT) 开始搜寻附近的蓝牙外围设备,初始化完成或点击事件里调用。此操作比较耗费系统资源,请在搜索并连接到设备后调用 wx.stopBluetoothDevicesDiscovery方法停止搜索,以及onhide,onUnload。↓监听寻找到新设备的事件wx.onBluetoothDeviceFound(CALLBACK)通过设备名(设备方提供)过滤设备,deviceId一般不作为判断条件,因为开发者工具和 Android 上获取到的deviceId为设备 MAC 地址;iOS 上则为设备 uuid。 但是如果附近有多个同名的设备时,就需要通过mac地址来匹配对应的蓝牙设备了。ios不同手机搜索到的设备deviceId经过处理后是不同的。如果需要处理这种情况可以联系蓝牙设备硬件方,将mac地址存入当前蓝牙设备的广播数据段中的 ManufacturerData 数据段中,我们通过res.devices.advertisData的值去匹配&连接蓝牙。 ⚠️ 安卓下部分机型需要有位置权限才能搜索到设备,需留意是否开启了位置权限↓连接低功耗蓝牙设备wx.createBLEConnection(OBJECT)  若小程序在之前已有搜索过某个蓝牙设备,并成功建立连接,可直接传入之前搜索获取的 deviceId 直接尝试连接该设备,无需进行搜索操作。  断开连接:wx.closeBLEConnection(),在onhide,onUnload时候;↓wx.onBLEConnectionStateChange(function callback) 监听低功耗蓝牙连接状态的改变事件。包括开发者主动连接或断开连接,设备丢失,连接异常断开等等↓获取蓝牙设备所有服务(service) wx.getBLEDeviceServices(OBJECT) 过滤出需要的service uuid,设备方提供,比如包含某一个字段↓获取蓝牙设备某个服务中的所有 characteristic(特征值)wx.getBLEDeviceCharacteristics(OBJECT) 过滤特征值,找到 用来写入/读取的特征值的 uuid 设备方提供   特征值是什么:每个服务都包含了一组特征值用来描述服务的一些属性,跟蓝牙通信时需要这些特征值ID来传递数据。↓启用低功耗蓝牙设备特征值变化时的 notify 功能,订阅特征值  wx.notifyBLECharacteristicValueChange(OBJECT),这里需要用来读取的特征值的 uuid 注意⚠️ :必须设备的特征值支持 notify 或者 indicate 才可以成功调用。↓写入wx.writeBLECharacteristicValue(OBJECT) 向低功耗蓝牙设备特征值中写入数据,需写入二进制数据。注意:必须设备的特征值支持 write 才可以成功调用。↓wx.onBLECharacteristicValueChange 监听低功耗蓝牙设备的特征值变化事件(返回的多个数据包) 监听低功耗蓝牙设备的特征值变化事件。必须先启用 wx.notifyBLECharacteristicValueChange 接口才能接收到设备推送的 notification。 BLE小程序蓝牙是搜索不到手机蓝牙的。 经典蓝牙和BLE(Bluetooth Low Energy)低功耗蓝牙的区别蓝牙是一种短距的无线通讯技术,可实现固定设备、移动设备之间的数据交换。一般将蓝牙3.0之前的BR/EDR蓝牙称为传统蓝牙,而将蓝牙4.0规范下的LE蓝牙称为低功耗蓝牙。区别于传统模块,最大的特点就是成本和功耗降低,应用于实时性要求比较高。 蓝牙低功耗(BLE)功能,是利用蓝牙低功耗特性新发展的技术。手机上要利用蓝牙低功耗技术,一般是通过 BLE 配件厂商发布的 BLE 配件和其配套 APP,配合使用。比如:BLE 运动手环、运动手表、体重计、计步器、智能腕带等。 二进制相关数据类型ArrayBuffer & TypedArrayArrayBuffer对象、TypedArray视图和DataView视图是 JavaScript 操作二进制数据的一个接口。ES6 将它们纳入了 ECMAScript 规格,并且增加了新的方法。它们都是以数组的语法处理二进制数据,所以统称为二进制数组。但是,二进制数组并不是真正的数组,而是类似数组的对象。 (1)ArrayBuffer对象:代表内存之中的一段二进制数据,可以通过“视图”进行操作。“视图”部署了数组接口,这意味着,可以用数组的方法操作内存。 (2)TypedArray视图:共包括 9 种类型的视图。比如Uint8Array, Int16Array, Float32Array数组视图等等。 Uint8Array 代表数组的每一项是无符号整型 8代表数据的每一项占 8 个比特位,即一个字节(8bits=1byte) ...

June 17, 2020 · 1 min · jiezi

快应用调试器功能使用说明

快应用调试器功能使用说明1. 如何 WIFI 调试确保手机与电脑处于同一局域网内。 1.1 使用快应用 IDE 调试:点击 IDE 右上角二维码图标,使用手机快应用调试器扫描生成的二维码(二维码信息为本机 dev-server 地址,也可根据该地址用这个网站手动生成二维码)。 若出现如下界面,请点击右上角 menuBar ,设置,删除服务器地址最后的 /bundle。 点击右上角 menuBar ,打开调试模式,重启后打开 demo 即进入调试模式。此时点击右下角齿轮图标可打开手机控制台查看日志信息。关闭 demo ,打开快应用调试器,点击右下放开始调试,可进入远程调试,电脑浏览器会弹出调试界面,调试方式与调试 node.js 类似。可在 js 源码中使用 debugger 或在调试界面的 source 面板设置断点(可设置条件断点)。在下图位置 source 面板查看 demo 源码。 1.2 使用命令行调试:注意: 需要全局 joyful ,目前 joyful还未发布。项目根目录下 joy serve 或任意目录下 joy serve 项目根目录。 打开快应用调试器,点击右上角 menuBar ,设置,服务器地址填上图所示本机 dev-server 地址,点击在线更新,进入 demo 界面。也可通过 dev-server 地址生成对应的二维码,使用扫码安装。也可通过 joy pack 生成 app.rpk,将该 rpk 发送到手机上,使用本地安装打开 demo。2. 如何 USB 调试项目根目录下 joy serve ,或者通过上面所说的扫 IDE 的二维码,确保手机调试器设置里面的服务器地址正确,点击开启 USB 调试的按钮,点击在线更新,最后点击开始调试。(此时仍然需要连接 WiFi) ...

June 10, 2020 · 1 min · jiezi

百度智能小程序性能文档升级重磅来袭

页面白屏了?加载时间长?点击没反应?性能有问题!智能小程序性能文档升级,重磅来袭,带你进入不一样的性能新世界!更多内容查看开发者社区/更多招聘信息 近期为帮助开发者提升小程序性能,百度智能小程序上线了 Page.onInit 、xxx(如有其它请补充)等新增功能;同时全面升级了开发者性能文档,从基本原理开始由浅入深,为您解锁各种性能提升新技能! 更多性能优化方案文档升级后,围绕小程序首屏渲染流程,针对收集 initData、请求主数据环节,和优化渲染速度的角度,为开发者提供了更多性能优化方案。 收集 initData在收集 initData 这个环节,开发者可通过使用分包、合理使用动态库、合理使用 App.onLaunch 的方式,缩短耗时,从而优化首屏渲染时长。 使用分包包下载与解析是整个启动过程中的一个重要阶段,该阶段耗时与小程序页面所属包大小呈正相关,将直接影响到 initData 完成收集的时间,从而影响首屏渲染。开发者可根据实际情况,选择使用下述分包方式: 分包加载:在智能小程序的打包中,默认会有一个主包,主包中包含了启动页面,和所有分包都会用到的公共资源/JS 脚本,根据开发者的配置划分分包。独立分包:独立分包是小程序中一种特殊类型的分包,可以独立于主包和其他分包运行。从独立分包中页面进入小程序时,不需要下载主包。当用户进入普通分包或主包内页面时,主包才会被下载。分包预下载:开发者可以通过配置,在进入小程序某个页面时,由框架自动预下载可能需要的分包,提升进入后续分包页面时的启动速度。合理使用动态库动态库,是指可被添加到小程序内直接使用的功能组件。由于动态库的独立资源将在逻辑和渲染层分别进行加载,在此过程中将会加载动态库的全部代码(逻辑和样式),然后解析执行。此时如果引用的动态库中包含大量未使用的逻辑,导致加载过程中大量资源的浪费,从而阻塞 initData 的收集时间,进而直接影响到页面渲染。 因此建议开发者合理使用动态库。 合理使用 App.onLaunchApp.onLaunch是进入小程序的第一个生命周期函数,很多开发者会在App.onLaunch中执行一些初始化操作。如果使用不当,会显著影响首屏显示速度。因此建议您在使用中注意如下事项: 避免在 App.onLaunch 中执行耗时很长的任务,尽可能将任务推移到页面显示完成后执行。减少、避免在 App.onLaunch 中调用一些同步 API。使用异步 API 代替同步,并尽量减少、延后首页面显示非必需的 API 调用。将 App.onLaunch 中的页面请求放在 Page.onInit 生命周期中请求主数据在请求主数据环节,开发者可通过在 onInit 请求首屏主数据、数据前置获取、数据持久化的方式缩短数据加载时间,从而优化首屏渲染时长。 在 onInit 请求首屏主数据onInit是小程序提供的一种生命周期,执行时机介于 App.onLaunch 和 Page.onLoad 之间。在 setInitData 之后立即执行Page.onInit(),把主数据请求从 Page.onLoad 转移到 Page.onInit 中,将极大提升小程序的页面加载性能。 数据前置获取通过数据前置获取,可以把关键页面的数据放在入口页面获取,页面跳转至关键页面时,将数据以页面参数的形式传输给落地页。在一些商业线索类页面中,用户进入页面后将立即看到线索相关信息,无需等待。 数据持久化数据持久化指从服务端获取到的数据,通过swan.setStorage方法保存在本地,页面渲染时直接从本地获取所需数据的这一行为。将固定 banner、筛选、导航等低时效性数据存在本地,页面加载时直接从本地读取、渲染数据,将大幅减少页面上的留白时间,提升用户体验,降低白屏率。 优化渲染速度开发者可合理使用自定义组件、合理使用 view 和 text 组件、优化图片使用方式、按需渲染优化等方式,有效优化渲染层渲染速度。 合理使用自定义组件开发者可以将页面内的功能模块抽象成自定义组件,在智能小程序的各个页面中进行使用,提升代码复用度,节省开发成本。 合理使用 view 和 text 组件框架默认使用高性能的view和text组件,但开发者在组件上使用一些特定属性和任一事件时,会退化为低性能组件。在开发过程中请谨慎使用animation、style、 dataset、hidden等内容,详情查看合理使用 view 和 text 组件。 ...

June 9, 2020 · 1 min · jiezi

微信小程序问题-其一

问题详情:在向后端发送数据时,header中的cookie和Authorization未向后端发送问题 解决方法: wx.request({ url: '', method: '', data: { }, header: { 'cookie': wx.getStorageSync("cookies"), 'Authorization': wx.getStorageSync("Authorization") }, success (res) { console.log(res.data) } })在header中直接调用 wx.getStorageSync("key") 方法取值即可在header里不能直接取data里的值,这样会无法取到值,进而导致数据没发送问题

June 7, 2020 · 1 min · jiezi

记录一下微信小程序图片拖拽放大位移效果实现

因为需求需要对图片进行操作,放大,位移,旋转等思路也是参考别的博客这个写的比较全https://blog.csdn.net/king096...我看的第一篇是这个https://www.jb51.net/article/... 实现思路1 在一个区域里绘制图片,2 记录所有图片的坐标,旋转角度,尺寸,中心点,缩放比例3 创建cavnas画布,白底色,然后根据记录的图片的一些状态绘制4 根据canvas生产出图片 先上效果蓝框为拖拽区域红框为cavnas绘制部分贴代码wxmlcanvas标签正常情况下应该是隐藏或者让他定位到十万八千里外因为需要展示效果,所以就没有隐藏,实际上线可以自己隐藏掉 <view class="container"> <button class="mini-btn" bindtap="generate" type="primary" size="mini">生成图片</button><block wx:for="{{materialList}}" wx:key="index"> <image class="img-list" bindtap="addImg" data-index="{{index}}" mode="aspectFit" src="{{item.image}}"></image></block>{{itemList.length}} <view class="img-box" id="img-box"> <!-- *************操作区域************* --> <block wx:for="{{itemList}}" wx:key="index"> <!-- 圆心坐标 <text style='position:absolute;top:{{item.y}}px;left:{{item.x}}px;width:2px;height:2px;background-color:yellow;z-index:500'></text> --> <!-- {{item.scale}}---{{item.r}} --> <view class='touchWrap' style='transform: scale({{item.scale}});top:{{item.top}}px;left:{{item.left}}px; '> <view class='imgWrap {{item.active? "touchActive":""}}' style="transform: rotate({{item.angle}}deg);"> <view> <image style="width:{{item.height}}px; height:{{item.width}}px" class="item-img" src='{{item.image}}' bindload='loadImg' data-index="{{index}}" data-id='{{item.id}}' bindtouchstart='wraptouchStart' bindtouchmove='WraptouchMove'></image> </view> <!-- <image src='{{item.image}}' bindload='loadImg' bindtouchend='WraptouchEnd'></image> --> <image class='x' hidden="{{!item.active}}" bindtap="hiddenImg" data-index="{{index}}" src='../../assets/img/wqy-close.png' style='transform: scale({{item.oScale}});transform-origin:center;' data-id='{{item.id}}'></image> <image class='o' hidden="{{!item.active}}" data-index="{{index}}" src='../../assets/img/wqy-stretch.png' style='transform: scale({{item.oScale}});transform-origin:center;' data-id='{{item.id}}' bindtouchstart='touchStart' bindtouchmove='touchMove'> </image> </view> </view> </block> </view> <canvas class='maskCanvas' canvas-id="maskCanvas" style='width:{{canvasWidth}}px; height:{{canvasHeight}}px;'></canvas></view>js部分 /* * @Description: * @Author: 冷山冷杉 <wqy.mail@foxmail.com> * @Date: 2020-06-04 11:58:14 * @LastEditTime: 2020-06-05 16:14:51 * @LastEditors: 冷山冷杉 <wqy.mail@foxmail.com> * @FilePath: \mini-fullalumni\pages\photoTest\photoTest.js */const app = getApp()const maskCanvas = wx.createCanvasContext('maskCanvas', this)let items = []Page({ data: { itemList: [ ], materialList: [ { id: null, image: 'https://img3.doubanio.com/view/subject/m/public/s9074663.jpg',//图片地址 top: 0,//初始图片的位置 left: 0, x: 0, //初始圆心位置,可再downImg之后又宽高和初始的图片位置得出 y: 0, scale: 1,//缩放比例 1为不缩放 angle: 0,//旋转角度 active: true //判定点击状态 }, { id: null, image: 'https://img9.doubanio.com/view/subject/m/public/s3893375.jpg', top: 0, left: 0, x: 0, y: 0, scale: 1, angle: 0, active: false } ], canvasWidth: null, canvasHeight: null }, onReady() { const query = wx.createSelectorQuery() query.select('#img-box').boundingClientRect() query.selectViewport().scrollOffset() query.exec((res) => { this.setData({ canvasWidth: res[0].width, canvasHeight: res[0].height }) }) // wx.getSystemInfo({ // 获取系统信息 // success: sysData => { // this.sysData = sysData // // 设置画布宽高,this.sysData.windowWidth为屏幕的宽度 // this.setData({ // canvasWidth: this.sysData.windowWidth, // 如果觉得不清晰的话,可以把所有组件、宽高放大一倍 // canvasHeight: this.sysData.windowWidth // }) // } // }) }, addImg(e) { let index = e.currentTarget.dataset.index let materialList = this.data.materialList let itemList = this.data.itemList if (itemList.length) { materialList[index].id = itemList[itemList.length - 1].id + 1 } else { materialList[index].id = 1 } itemList.push(JSON.parse(JSON.stringify(materialList[index]))) this.setData({ itemList }) }, loadImg(e) { let index = e.currentTarget.dataset.index let itemList = this.data.itemList // x,y为圆心的距离, +25: 按钮定位的距离 + 按钮自身大小/2 itemList[index].width = e.detail.width itemList[index].height = e.detail.height itemList[index].x = e.detail.width / 2 + 25 itemList[index].y = e.detail.height / 2 + 25 this.setData({ itemList }) }, hiddenImg(e) { let index = e.currentTarget.dataset.index let itemList = this.data.itemList itemList.splice(index, 1) this.setData({ itemList }) }, wraptouchStart: function (e) { let items = this.data.itemList; for (let i = 0; i < items.length; i++) { //旋转数据找到点击的 items[i].active = false; if (e.currentTarget.dataset.id == items[i].id) { items[i].active = true; //开启点击属性 items[i].lx = e.touches[0].clientX; // 记录点击时的坐标值 items[i].ly = e.touches[0].clientY; } } this.setData({ //赋值 itemList: items }) }, WraptouchMove: function (e) { let index = e.currentTarget.dataset.index let items = this.data.itemList; //移动时的坐标值也写图片的属性里 items[index]._lx = e.touches[0].clientX; items[index]._ly = e.touches[0].clientY; //追加改动值 items[index].left += items[index]._lx - items[index].lx; // x方向 items[index].top += items[index]._ly - items[index].ly; // y方向 items[index].x += items[index]._lx - items[index].lx; items[index].y += items[index]._ly - items[index].ly; //把新的值赋给老的值 items[index].lx = e.touches[0].clientX; items[index].ly = e.touches[0].clientY; this.setData({//赋值就移动了 itemList: items }) }, // 触摸开始事件 items是this.data.itemList的全局变量,便于赋值 所有的值都应给到对应的对象里 touchStart: function (e) { //找到点击的那个图片对象,并记录 let items = this.data.itemList; let index = e.currentTarget.dataset.index for (let i = 0; i < items.length; i++) { items[i].active = false; if (e.currentTarget.dataset.id == items[i].id) { items[i].active = true; } } //获取作为移动前角度的坐标 items[index].tx = e.touches[0].clientX; items[index].ty = e.touches[0].clientY; //移动前的角度 items[index].anglePre = this.countDeg(items[index].x, items[index].y, items[index].tx, items[index].ty) //获取图片半径 items[index].r = this.getDistancs(items[index].x, items[index].y, items[index].left, items[index].top) }, // 触摸移动事件 touchMove: function (e) { let items = this.data.itemList; let index = e.currentTarget.dataset.index // items[index].x = e.detail.width / 2 // items[index].y = e.detail.height / 2 // this.setData({itemList: items}) //记录移动后的位置 items[index]._tx = e.touches[0].clientX; items[index]._ty = e.touches[0].clientY; //移动的点到圆心的距离 * 因为圆心的坐标是相对与父元素定位的 ,所有要减去父元素的OffsetLeft和OffsetTop来计算移动的点到圆心的距离 items[index].disPtoO = this.getDistancs(items[index].x, items[index].y, items[index]._tx, items[index]._ty) items[index].scale = items[index].disPtoO / items[index].r; //手指滑动的点到圆心的距离与半径的比值作为图片的放大比例 items[index].oScale = 1 / items[index].scale;//图片放大响应的右下角按钮同比缩小 //移动后位置的角度 items[index].angleNext = this.countDeg(items[index].x, items[index].y, items[index]._tx, items[index]._ty) //角度差 items[index].new_rotate = items[index].angleNext - items[index].anglePre; //叠加的角度差 items[index].angle += items[index].new_rotate; //用过移动后的坐标赋值为移动前坐标 items[index].tx = e.touches[0].clientX; items[index].ty = e.touches[0].clientY; items[index].anglePre = this.countDeg(items[index].x, items[index].y, items[index].tx, items[index].ty) //赋值setData渲染 this.setData({ itemList: items }) }, /* *参数1和2为图片圆心坐标 *参数3和4为手点击的坐标 *返回值为手点击的坐标到圆心的角度 */ countDeg: function (cx, cy, pointer_x, pointer_y) { var ox = pointer_x - cx; var oy = pointer_y - cy; var to = Math.abs(ox / oy); var angle = Math.atan(to) / (2 * Math.PI) * 360;//鼠标相对于旋转中心的角度 if (ox < 0 && oy < 0)//相对在左上角,第四象限,js中坐标系是从左上角开始的,这里的象限是正常坐标系 { angle = -angle; } else if (ox <= 0 && oy >= 0)//左下角,3象限 { angle = -(180 - angle) } else if (ox > 0 && oy < 0)//右上角,1象限 { angle = angle; } else if (ox > 0 && oy > 0)//右下角,2象限 { angle = 180 - angle; } return angle; }, getDistancs(cx, cy, pointer_x, pointer_y) { var ox = pointer_x - cx; var oy = pointer_y - cy; return Math.sqrt( ox * ox + oy * oy ); }, generate: function () { maskCanvas.save(); maskCanvas.beginPath(); //一张白图 maskCanvas.setFillStyle('#fff'); maskCanvas.fillRect(0, 0, this.data.windowWidth, this.data.canvasHeight) maskCanvas.closePath(); maskCanvas.stroke(); this.data.itemList.forEach((val, index) => { maskCanvas.save(); maskCanvas.translate(0, 0); maskCanvas.beginPath(); maskCanvas.translate(val.x, val.y); // 圆心坐标 maskCanvas.rotate(val.angle * Math.PI / 180); maskCanvas.translate(-(val.width * val.scale / 2) - 25, -(val.height * val.scale / 2) - 25) maskCanvas.drawImage(val.image, 0, 0, val.width * val.scale, val.height * val.scale); maskCanvas.restore(); }) maskCanvas.draw(false, (e) => { wx.canvasToTempFilePath({ canvasId: 'maskCanvas', success: res => { this.setData({ canvasTemImg: res.tempFilePath }) console.log(res.tempFilePath); } }, this) }) }})css ...

June 5, 2020 · 5 min · jiezi

玩转AR图形识别小程序

玩转AR图形识别小程序这些年深度学习炙手可热,人脸识别,图像分类,目标检测等技术已经应用到我们生活的方方面面。作为一个时刻保持好奇心的程序猿想入门深度学习,但又苦于门槛较高,难以获得理想的学习成果。好在一些大厂已经推出了深度学习云平台,让我们前端小白也能体验深度学习的乐趣。 这次我们基于百度AI开放平台EasyDL来实现一个logo图像识别小程序,半天时间轻松搞定客户BABA的需求。 logo目标检测演示 1: 创建训练模型 要实现logo识别的功能,我们先要创建一个物体检测模型。 访问百度EasyDL地址 https://ai.baidu.com/easydl 在操作平台菜单中,选择物体检测选项。 1.1 选择创建模型 1.2 为模型命名,模型归属选择个人。 2: 创建训练数据集 模型创建好以后,我们要为模型提供训练数据,所谓训练数据就是我们要识别的logo图片。 模型就像一个懵懂的孩子,我们要用训练数据教他识别图片中的logo,让他能举一反三,以后遇到不在数据集中的图片也能准确的识别出来。 2.1 准备训练数据 为了提高识别精度,我们需要用手机拍摄不同的光线,角度,背景下的logo图片上传,图片数据越多,越有助于提高模型的识别精度,一般建议上传40张左右。 2.2 标注数据 上传后,用鼠标拖拽矩形区域标注出logo图形位置,并设置统一的标签名,然后点击左下角的保存按钮。如果嫌手动标注麻烦,也可以尝试右下角的智能标注。 2.3 开始训练 训练时间和数据集大小成正比,以我30多张的训练数据为例,大概需要20分钟左右,已经很快啦,如果是在本地单机上训练可能要几小时的时间,这就是云服务分布计算的好处。 2.4  校验模型 训练结束后,我们需要对模型进行校验,看看模型的识别精度是否符合预期。 上传几张不在数据集中的照片来检验结果,如果效果满意,我们就可以进行下一步,发布模型。 3: 发布模型 3.1  提交申请 发布模型前需要提交审核,填写服务名称和接口地址,提交申请。 审核成功后,在操作列表中点击服务详情->立即使用。 3.2  创建应用 在使用接口前,我们还需要创建一个应用,应用可以理解为一个容器,一个应用可以包含多个接口,为这些接口提供访问键值,秘钥等参数。 应用创建结束后,会看到分配的API Key和Secret Key,这些都是接口调用需要携带的参数。 4: 在小程序中调用识别接口 4.1 接口token验证 在调用识别接口前先要拿到access_token令牌,这是所有接口调用的前提条件。 wx.request({ url: API_AUTH_URL, //token授权地址 method: 'GET', data: { grant_type: 'client_credentials', client_id: CLIENT_ID, //API Key client_secret: CLIENT_SECRET //Secret Key }, success: (res) => { _access_token = res.data.access_token this._getImageData() }})4.2 调用接口 ...

June 4, 2020 · 1 min · jiezi

在Gitee获85k-Star做微信小程序商城看这一个开源项目就够了

商城系统是小程序中比较热门的类型,许多开发者在寻找商城类小程序项目时,都会遇到一些声称「开源」但是并不是完全开源,有时候还会收费的项目。今天 Gitee 介绍的这款微信小程序商城项目就是一款从前端到后台完全开源的商城系统。 项目名称:Open-Shop 项目作者:老花生 开源许可协议:Apache-2.0 项目地址:https://gitee.com/old-peanut/wechat_applet__open_source 项目特点免费完整开源:基于MIT协议,源代码完全开源,无商业限制;无BUG:经过严格测试,开箱即用;编码优雅:代码结构清晰,注解非常详细,方便小伙伴们学习和使用。;持久更新:会定期公布开发计划。并按计划提交新的功能;活跃的社群:官方QQ群有专人回复,及时耐心的解答问题。面向对象Open-Shop是企业在创立初期很好的技术基础框架,加快公司项目开发进度,当然也可以对现有的系统进行升级;个人开发者也可以使用Open-Shop承接外包项目;初学JAVA的同学可以下载源代码来进行学习交流。技术框架核心框架:Spring Framework 4安全框架:Apache Shiro 1.2视图框架:Spring MVC 4持久层框架:MyBatis 3数据库连接池:Alibaba Druid 1.0日志管理:SLF4J 1.7、Log4jJS框架:Vue 2.5.1,iview,layer 3.0.3,jquery 2.2.4,jqgrid 5.1.1CSS框架:Twitter bootstrap3.3.7。富文本:froala_editor1.2.2后台界面 小程序界面 如果你喜欢这个项目,记得去项目主页点一个 Star 哦:https://gitee.com/old-peanut/wechat_applet__open_source

June 3, 2020 · 1 min · jiezi

小程序遇到map-is-not-defined的问题

*用的是taro框架写的小程序最近写小程序老是出现一些问题,比如说我要遍历一个数组,我的数组在打印的时候明明是有值的,但是就是报.map的错误,我在state里面是这样声明的: this.state = { obj:{}}然后我在请求后台数据,往obj里面添加值,然后在render里面遍历 render(){ obj.main && obj.main.length > 0 ? obj.main.map((v,i) =>{ return <View taroKey={i}>{i}</View> }) : ''}这样写的话,在html里面判断是没有问题的,但是在小程序就.map的问题 解决方案: 在state里面这样声明变量,把你遍历的数组先申明一下就可以la~,这个问题居然找了这么长时间? 希望看到的朋友对你有所帮助 this.state = { obj:{main:[]}}

June 2, 2020 · 1 min · jiezi

产业安全专家谈-银行业小程序安全防护的实践路径

当前,随着网络业务与移动业务的兴起,银行业已经进入智能化、数字化的新时代。网上银行、移动客户端、小程序相继成为各个银行实现数字化转型的重要载体。 其中,小程序凭借开发门槛低、上线速度快、平台覆盖率高等特点成为现阶段银行服务用户的重要移动渠道。然而小程序面向海量的用户和复杂的跨网交换,其承载的金融数据更是时刻遭受不法黑客的攻击威胁;此外,部分开发者使用的第三方SDK服务也有可能存在安全风险,威胁企业和用户的财产安全。 银行小程序主要面临的安全风险都有哪些?如何确保小程序在研发、上线、运营阶段的稳定应用?如何预防小程序中的用户信息泄露?由腾讯安全联合云+社区打造的「产业安全专家谈」第二十期,邀请到了腾讯安全资深架构师徐涛,为大家分享银行小程序安全防护的实践路径。 Q1:随着金融服务向移动互联网逐渐倾斜,银行业主要面临的安全问题有没有发生改变? 徐涛:伴随金融服务和营销手段线上化的进程发展,互联网金融所带来的信息安全风险日渐提高,数据泄露事件层出不穷。在资金体量庞大、用户信息集中、信息价值具有强变现能力的金融领域,安全问题所造成的影响力相较于其他行业更为明显。 最早银行业提供的移动金融服务主要以网上银行为主,最主要的安全问题就是安全漏洞。在2016年金融行业安全漏洞类型分布中,涉及安全漏洞类型多样化,且高危漏洞占比达总漏洞数的94.56%。而随着移动客户端的逐渐普及,黑灰产也开始将攻击重点转移到了各个银行的移动客户端之上,2018年就曾有黑客利用某银行APP软件中业务存在的安全漏洞,非法获利近2800余万元。 通过金融行业中安全漏洞数据和过往案例不难看出,金融行业急需构建完善的安全体系,来实现对安全漏洞风险的提前检测、暴露和解决,帮助业务方规避经济损失以及不可估量的口碑影响。 如今,随着微信小程序市场的持续拓展,用户规模和渗透率的逐渐提升,微信小程序已经成为了各行业拓展线上服务的新载体,各大银行也纷纷开始通过小程序来实现移动端金融服务的功能。在此背景下,小程序不只要应对与APP同样的安全风险,还要面对源代码的逆向风险和调试风险,这些安全隐患所带来新的问题。 Q2:小程序相较于APP具备哪些优势?主要的安全问题有哪些? 徐涛:对于开发者而言,小程序的开发成本更低、成型快、项目上手更快,而且开发一个版本就能覆盖安卓和iOS两个系统;另外,小程序在服务功能迭代和升级的速度上也明显优于APP,非常适合用来快速实现场景化服务,进一步验证客户的需求。而对于用户而言,小程序无需下载安装、即用即走、接近原生的体验度也获得了用户的广泛欢迎。 随着微信小程序用户规模的不断扩大,各个银行也纷纷开发了专属的小程序作为服务用户的重要渠道,相应的安全隐患也随之而来。不法分子利用小程序进行作弊欺诈、恶意植入木马或病毒、篡改业务数据、盗取用户隐私信息等行为,为企业的业务安全带来了严重的威胁。 Q3:银行在开发小程序的过程中,主要面临的安全风险是什么?有哪些解决方案? 徐涛:随着互联网与移动应用的普及和不断发展,银行的互联网金融业务模式不断壮大,在黑灰产业攻击逐渐产业化、技术化、精准化的背景下,针对银行的攻击呈现出愈演愈烈的趋势。同时,随着用户习惯越来越轻量化,app所面临的风险也体现在小程序中。主要的安全风险有以下几个: ■ 薅羊毛 一些银行在产品开发设计上未妥善考虑安全问题,直接在小程序上进行红包、优惠券等形式的营销,就会给黑灰产带来可乘之机。比如不法分子可以通过恶意下单等方式来“薅羊毛”,让银行的营销引流效果大打折扣,更有甚者会使50%-80%的营销资金因此而浪费。 有一些商家在设计支付流程时存在不当设置,让用户主动提供支付账单金额,黑灰产业在发现直接改小账单金额也可完成交易后,羊毛党蜂拥而至,让商家蒙受了严重的经济损失。 ■ 仿冒、山寨小程序 由于小程序源码难以混淆加密,导致山寨小程序也大量出现。不法分子通过逆向等方式来窃取核心代码,仿冒伪造小程序,为小程序开发商带来业务危机,同时也让用户的隐私信息暴露在危险之下。 ■ 恶意数据爬取 尽管微信小程序具有天然的安全保护能力,但不当的开发依然会存在的接口数据泄露等隐患,容易带来信息爬取风险。如果核心数据被爬取并挪为他用,将会带着经济损失,甚至对银行的品牌影响力造成不可挽回的影响。过去曾有商家因在营销活动中没有仔细验证订单与会话身份的匹配,导致约3000万用户个人信息、订单信息泄露。 随着国家对于数据安全的重视程度逐渐增强,相关的法律法规和行业规范正逐步出台。中国人民银行在2019年颁发的第237号文《移动金融客户端应用软件安全管理规范》和《信息安全技术网络安全等级保护基本要求》中,分别明确规定了不同类型的软件包括资金交易类、信息采集类、资讯查询类软件都应该符合相应的安全管理要求,要求各机构的应用开发符合安全设计要求、提供风险监控能力、保护个人金融信息。 日趋严格的监管要求,加上呈上升势头的网络攻击浪潮,都要求银行小程序在程序设计、开发、运营等环节,需要提供切实有效且满足政策法规要求的解决方案。我们基于腾讯多年积累的移动安全实践经验和可靠的安全防护技术,为众多小程序运营者打造了小程序安全防护平台,能够从多角度、全方位洞悉黑产分子的攻击手段,为小程序提供安全管控、运行监测、异常监控等安全防御方案,保障银行小程序业务安全,降低安全隐患,起到降本增效的作用。 Q4:银行小程序如何构建金融级别的安全防护能力? 徐涛:银行是经营货币的行业,安全对于金融而言是头等大事。银行在通过小程序服务金融客户的过程中,会涉及包括用户隐私数据、企业商业数据在内的海量真实数据,极易成为黑灰产业的攻击目标。 构建金融级别的安全防护能力,意味着小程序要遵循金融监管的要求多措并举,包括打造小程序的安全管理架构,权责明确;构建覆盖全生命周期的管理机制,在小程序上线之前就对小程序进行全面扫描和加固,及时发现小程序中是否存在安全漏洞,同时加强小程序在设计、开发、发布、维护等环节的安全管理,并针对网络攻击采取有效的防范措施;加强合规意识,完善客户个人的隐私保护机制。只有做到这些,才能保障小程序安全、合规、稳定的运营。 Q5:从零开始构建银行小程序,如何做到最高效地安全防护?腾讯安全能够提供哪些帮助? 徐涛:建议先从业务场景入手,通过对具体业务场景进行深入了解和详细分析,逐步梳理出小程序在业务流程、程序设计、部署结构等环节中存在的安全隐患,再根据这些安全隐患对症下药,部署切实有效的安全解决方案。这样的方法看似笨拙,但实际上是能够确保小程序和业务的可用性和安全性最好、效率最高的方法。 考虑到银行是从零开始构建小程序安全防护体系的,开发和运营人员都可能存在经验不足的情况,在部署安全产品时容易“头痛医头,脚痛医脚”,让后续的安全防护工作无法顺利开展。这时可以考虑使用腾讯安全小程序安全防护平台,为小程序提供可持续高质量的开发流程、营销风控体系、运行监测系统等多功能全方位的安全解决方案,并通过敏捷设计开发、流程化管理、体系化监控,为银行小程序打造全面立体化的防护体系。 Q6:腾讯安全如何满足不同银行小程序中的各类安全需求? 徐涛:考虑到银行业务自身所具备的金融属性和高敏感性,在构建安全防护能力时首先明确的是合规问题。银行客户可以先通过引入腾讯安全金融小程序安全防护解决方案,从合规性角度梳理小程序的安全漏洞及隐患,再根据不同的业务需求来选择平台下相应的安全产品进行部署。 比如对于需要快速迭代服务功能的小程序,就可以选用小程序安全管控中的安全扫描功能,通过快速且自动化的测评检测小程序中的安全隐患,来满足银行小程序快速迭代、测试的持续测评需求。 如果银行自身安全体系中缺乏针对渗透攻击的防护手段,则可以通过渗透测试功能,深度挖掘小程序业务逻辑安全以及WEB框架中的安全漏洞;同时,渗透测试功能还能够以模拟黑客攻击的形式,对小程序业务系统进行渗透测试,发现可导致业务数据泄露、资产受损、数据被篡改等各类安全风险,帮助运营人员提早进行修复,避免因代码漏洞造成的安全风险及资产损失。 Q7:有没有在保障小程序实现快速功能迭代的同时,还能确保小程序安全的方法? 徐涛:目前各种各样的小程序开发周期都很短。疫情期间,大量小程序开发需要在1-3天的极限时间完成上线,并快速进行服务功能的迭代和升级,极短的交付时间给安全运营带来了极大的压力。 我们通过一套部署在云端的纵深产品体系,打造了覆盖“事前、事中、事后”全生命周期的安全方案,在保障小程序实现快速功能迭代和上线的同时,为其提供业务安全、运维安全、数据安全等五大保障。方案可有效支持小程序在开发阶段的安全测试、风险评估和加固。对于小程序前端代码的加密,接入该方案的开发者只需将代码(路径或文件)传递给加密工具,即可实现字符串加密、属性加密、调用转换、代码混淆等多项保护措施,提高攻击者分析H5前端代码逻辑的难度;针对小程序前端和后台WEB端,该方案提供整体自动化风险检测工具,覆盖前台代码安全和API使用规范,以及业务CGI和对WEB框架和的安全检测,基本覆盖当下主流Web攻击方式,可以让开发者在极限开发时间压力下,交付符合安全标准的小程序。

June 1, 2020 · 1 min · jiezi

小程序input框在安卓手机展示错误

今天在写小程序的时候需要一个这样的问题,在输入内容的时候想调出手机的软键盘,本人用的是苹果手机,一切都正常,但是俺们的产品同学用的是安卓手机,结果input框就展示不出来,一开始想的是背景颜色的问题,后来仔细看了看,是input的margin问题,只要把input的margin设置成0就可以la~,在此记录一下遇到的小程序坑

June 1, 2020 · 1 min · jiezi