-
;
1.安装java8环境, java -version // 查看java是否已安装 sudo add-apt-repository ppa:openjdk-r/ppa sudo apt-get update sudo apt-get install openjdk-8-jdk 参考资料:https://www.cnblogs.com/wxishang1991/p/5662499.html 备注:此处ubantu版本为14.04,历经波折oracle版本始终无法安装成功 2.安装Jenkins wget -q -O – https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add – 打开文件/etc/apt/sources.list添加deb https://pkg.jenkins.io/debian-stable binary/ 然后执行如下命令 sudo apt-get update sudo apt-get install jenkins 参考资料:https://pkg.jenkins.io/debian-stable/ 3.配置 打开域名:8080按照提提操作 4.启动 service jenkins start service jenkins rest…
- ubantu下安装Jenkins 2019年9月13日
-
;
1.注意点 小程序中定时器在页面切换时候并不会中断,后台会持续叠加请求,因此在页面销毁和隐藏时候需要中断循环,此处通过设置一个全局的标志位来处理 2.代码 data: { timerContinue: true }, // 点击左上角返回时候触发 onUnload: function () { this.data.timerContinue = false }, // 按系统home键返回时候触发 onHide: function () { this.data.timerContinue = false }, onShow: function () { this.data.timerContinue = true // 如果在tab对应的页面中,每次进入需要重新启动循环 this.updateEndTime(23,59,59) }, updateEndTime: function (_hour, _minute, _second) { //当前时间,距1970年1月1日的秒数 //通过返回的小时及分钟生成对应的日期对象 var now = new Date() var end = new Date() end.setHours(_hour) end.setMinutes(_minute) end.setSeconds(_second) //…
- 小程序中倒计时处理 2019年9月9日
-
;
1.安装git apt-get -y install git 2.下载Gitea wget -O gitea https://dl.gitea.io/gitea/1.4.0/gitea-1.4.0-linux-amd64 chmod +x gitea //设置执行权限 ./gitea web 备注:以上命令在自己退出登录的时候自动关闭 gitea 如果需要一直在后台开启请看下面的命令 nohup ./gitea web & 3.安装Gitea 域名:3000进入引导安装页面,配置好数据库,及管理员信息。 4.大功告成 ubantu相关知识: apt-get install安装目录是包的维护者确定的,不是用户 apt-get 下载后,软件所在路径是什么? /var/cache/apt/archives 参考链接:https://blog.swing1993.cn/%e5%ae%89%e8%a3%85gitea/
- ubantu下安装gitea 2019年9月8日
-
;
1,问题描述 用户通过分享进入商品详情页,此时小程序底部没有tab切换菜单,同时没有直观的按钮跳转到首页,左上角也没有返回上一页箭头,此时如果用户点击系统的Home返回键会退出小程序 2. 另一个问题 用户从上一步退出后,从小程序的最近使用下面再次进入,依然是刚刚退出的页面,没有直观的办法触达其它页面 3. 解决思路 首先想到通过场景值来做业务判断 4.场景值相关知识 app.js文件中 onShow: function (e) { console.log(e.scene) }, onLaunch: function (e) { console.log(e.scene) }, page页面中获取 onShow: function (e) { let val = wx.getLaunchOptionsSync() console.log(val.scene) }, 经过一番尝试发现,这个场景值只在小程序初次载入时候能获取到,用户如果刚刚打开过小程序,然后又通过别人分享到达商品页,此时的场景值是自己上次载入时候的值,所以这时候场景值并不能作为用户来源的依据 5.换个思路 既然场景值无法用,想到从路由列表入手,分享进入的用户,历史路由里只有唯一的一个当前页路由,这也是没有左上角返回按钮的原因所在,如果路由表长度为1,那么就显示一个跳转到首页的按钮出…
- 小程序中通过分享链接进入的用户如何有效触达其它页面? 2019年9月4日
-
;
1.业务描述 通过微信支付开通vip,判断信息更新后再跳转 2.产生问题 通过setTimeout进行间隔一秒发送请求,数据比较,成功更新后通过wx.navigateTo跳转,此时setTimeout依然在后台持续调用 3.解决思路 setTimeout在每次调用后将生成一个标识符,而且每次都不同,所以用一个数组来保存起来,同时在页面离开时候清除所有的定时器 4.代码 data: { oldVal: ”, timeList: [] }, onLoad: function(options) { this.pay() }, // 点击左上角返回箭头时候触发 onUnload: function(options) { for (let i = 0; i < this.data.timeList.length; i++) { clearTimeout(this.data.timeList[i]) } }, // 点击系统Home键返回上一步时候触发 onHide: function(options) { for (let i = 0; i < this.data.timeList.length; i++) { clearTimeout(this.data.timeList[i]) } }, checkIsUpdate: function…
- 小程序中setTimeout轮询判断数据更新后跳转 2019年9月4日
-
;
问题来源: 用户使用小程序时若关闭了定位权限,想要重新打开时操作不易,所以要引导去设置里重新打开 解决: 当第一次关闭授权定位后,wx.chooseLocation就会一直调用fail方法,所以当点击打开位置功能时,最好先判断当前是否关闭了定位授权(见wx.getSetting文档详情),再会跳出自定义弹框(showCon),引导前往设置打开定位 wx.chooseLocation({ success: function(e) { //允许打开定位 }, fail: () => { //不允许打开定位 wx.getSetting({ success: (res) => { if (!res.authSetting[‘scope.userLocation’]) { //打开提示框,提示前往设置页面 that.setData({ showCon: true }) } } }) } }) 由于前往设置需要使用button的open-type,因此弹框需要自定义,例如下方,不需要弹框的情况下引用button组件即可(详情见官方文档) //wxml <view wx:if="{{showCon}}" class="modal-mask" bindtap="changeModalCanc…
- 小程序中引导重新打开定位权限 2019年9月2日
-
;
一、逻辑运算符 &&(短路与) 特点:只要碰到了false或者等价于false的就短路,只要短路了就不会继续往后执行了。如果短路了,得到造成短路的这个值,如果不短路,得到的是第二个值 console.log( true && true ); // true console.log( 123 && ‘中国’); // 中国 console.log( false && true ); // false console.log( true && false); // false console.log(1 && 0); // 0 console.log( undefined && 0); // undefined console.log(null && 1); // null 二、逻辑运算符 || (短路或) 特点:只要碰到了true或者等价于true的就短路,只要短路了就不会继续往后执行了。如果短路了,得到造成短路的这个值,如果不短路,得到的是第二个值 console.log( true || true ); // true console.log( 123 || ‘中国’); // 123 console.log(…
- 短路运算 &&和|| 2019年9月2日
-
;
1、沉没成本陷阱 大卖场为了节约租金成本一般都地处偏远,去一趟不容易。 就像这个Costco,地处上海外环外,去一趟得开小汽车、打出租车、甚至有人不惜多次换乘地铁公交,光路上一来一回就得花起码四五个小时。 这样一来,你就会想,咱汽油费也花了,时间也花了,一定得多买点,才对得起我付出的时间和路费啊,所以就拼命买买买——这就是沉没成本陷阱。 像Costco、山姆会员店、麦德龙这类会员制超市,价格比一般大卖场更便宜,但还有个门槛,是你必须每年花两三百成为会员。这个会员费,也是沉没成本陷阱。 像我一个朋友的爸妈,平时都挺节省的。昨天顶着35度的烈日过去,在Costco挤了一天,最后竟然搬回家一万多块钱的东西,说累也累了、会费也缴了,不买白不买。 我们往往过分执念已经付出的时间、金钱,从而投入更多来值回“已付出的成本”,这是坑,得绕开。 2、货架陈列陷阱 我有个朋友,专门是给Costco、宜家、麦德龙这种大卖场做商品陈列设计的,一个月工资上五万。 为什么他能拿这么高的薪水?因为他的工作对这些大卖场来讲,很值钱。 他的工作的主要目的,就是让你在商场、卖场里面逗留的时间尽量长。逗留时间越长,在里面花钱的可能性就越大。 宜家大家都逛过吧?我每次去逛宜家,都有一种迷路的感觉,会不由自主地顺着它设计的路线,兜来兜去。 眼前和手边,一会出现好看的床品,一会出现晶莹…
- 沉没成本陷阱 2019年9月1日
-
;
1.什么是姿态模式 当无GPS信号且下视视觉模块不工作的情况下,飞行器会自动进入姿态模式。姿态模式不使用GPS模块进行定位,仅提供姿态增稳,若GPS卫星信号良好可实现返航。(个人发生两次失控情况均发生在夜晚,视觉模块失效需谨慎)
- 无人机知识 2019年8月25日
-
;
1.about:flags 2.打开Developer Tools experiments 3.
- chrome开启canvas调试 2019年8月22日
-
;
1.Canvas 状态的保存和恢复 Canvas的API提供了两个名叫save()和restore()的方法,用于保存及恢复当前Canvas绘图环境的所有属性。其中save()可以保存当前状态,而restore()可以还原之前保存的状态。 这两个方法再绘图中有着重要的作用,比如我们在绘图的时候需要使用多种颜色,颜色需要不时的切换。那么使用save()和restore()方法即可比较方便的实现此功能。 2.理解save()和restore() 对于save()和restore()方法,一开始有一个错误的理解,以为每一步都save()之后restore()就等同于command + z(或者ctrl + z),其实save()保存的只是CanvasRenderingContext2D对象的状态以及对象的所有属性,并不包括这个对象上绘制的图形。 3.Canvas中状态和非状态 在Canvas环境中绘图时,可以利用所谓的绘图堆栈状态。每个状态随时存储Canvas上下文数据。下面是存储在状态堆栈的数据列表。 当前的坐标变换(变换矩阵)信息,比如旋转或平移时使用的rotate()和setTransform()方法 当前剪贴区域 图形上下文对象(CanvasRenderingContext2D)的当前属性值 CanvasRenderingContext2D…
- Canvas中的save()和restore()有什么用? 2019年8月21日
-
;
1.问题描述 阿里云虚拟主机,数据库中的中文信息导入后都成了空的, 2.处理步骤 首先想到的是编码不一致,源数据库是utf8,因此设置设置阿里云数据库,相关操作 show variables like ‘character%’ /*查看编码方式*/ set names ‘utf8’ alter database name character set utf8 相关说明: character_set_client,character_set_connection,这两个是数据库操作导入或者导出解释字符集编码, character_set_results是客户端或者程序显示编码, character_set_database是数据库编码,尽量让这几个编码都统一,常用都设置成utf8编码。 执行set names ‘utf8’会同时设置character_set_client,character_set_connection,character_set_results的编码, 执行alter database name character set utf8;可以设置数据库编码 3,一顿操作后,发现依然无法正常显示,要么就是乱码 4.换个思路 既然目标数据库这么坑爹,那就源数据库导出时候换个编码,更换为gb2132后到处,再次执行导入操作可以正常显示…
- 阿里云虚拟主机,通过sql文件导入数据库后,包含中文的字段不显示 2019年8月18日
-
;
1.找到需要的图标,添加到购物车 https://www.iconfont.cn/ 2.打开购物车,点击下载代码 3.复制iconfont.css中的代码,放到app.wxss(全局样式,方便复用) 4.页面中使用 <text class="iconfont icon-gouwuche"></text>
- 小程序使用字体图标 2019年8月6日
-
;
This can be done using CSS transforms 1) For 12 equal slices, each slice angle will be 30 degrees. 2) We need to rotate each slice according to the angle between vertical axis and start of the slice. So the first slice will be rotated by 0deg and the last by 330deg 3) Additionally we need to skew each slice by minus (90deg – slice angle) In this case, it is -(90deg – 30deg) = skewY(-60deg) 4) Regarding the text: a) We need to unskew slice contents with skewY(60deg) b) In order to center the text in the slice we need to rotate it by half the slice angle, hence: r…
- 通过css如何等分一个圆? 2019年8月2日
-
;
let a1 = [ {id: 1,text: ”}, {id: 2,text: ”}, {id: 3,text: ”}, {id: 4,text: ”}, {id: 5,text: ”}, {id: 6,text: ”}, {id: 7,text: ”}, ] let a2 = [ {id: 1,text: ”}, {id: 2,text: ”}, {id: 3,text: ”} ] let a3 = [ {id: 3,text: ”}, {id: 4,text: ”}, {id: 5,text: ”}, ] let result = difObjectArray(a1, a2, a3) console.log(result) function difObjectArray (a1, a2, a3) { // 获取a1中不包含a2,a3的元素,a1,a2,a3所包含的字段可能不同,但都包含id // 取出各个数组的id let a1_key = a1.map((item) =>item.id) let a2_key = a2.map((item) =>item.id) let a3_key = a3.map((item) =>item.id) // 合并a2,a3 let concat = []….
- 多个对象数组求差值 2019年7月22日
-
;
1.申请免费证书 2.CDN配置 路径:CDN–>证书服务–>类型选择云盾证书 3.云虚拟主机配置 路径:云虚拟主机–>管理–>域名管理–>域名绑定–>强制HTTPS加密访问 ,此处点击开启即可 参考链接: https://help.aliyun.com/knowledge_detail/90611.html https://help.aliyun.com/document_detail/27118.html?spm=5176.11785003.0.0.e7e4142fB7MCdZ
- 阿里云虚拟主机开启https 2019年7月18日
-
;
1.相关代码 gotoAnchor: function() { const query = wx.createSelectorQuery() query.select(‘.cart-evaluation’).boundingClientRect() query.selectViewport().scrollOffset() query.exec(function(res){ res[0].top // #the-id节点的上边界坐标 res[1].scrollTop // 显示区域的竖直滚动位置 let distance = res[0].top + res[1].scrollTop wx.pageScrollTo({ scrollTop: distance }) }) } 参考链接: https://developers.weixin.qq.com/miniprogram/dev/api/wxml/SelectorQuery.html https://developers.weixin.qq.com/miniprogram/dev/framework/view/selector.html
- 小程序中的锚点跳转 2019年7月3日
-
;
1.方案一,动态获取渲染后的body高度 const dimensions = await page.evaluate(() => { return { width: document.body.scrollWidth, height: document.body.scrollHeight, deviceScaleFactor: window.devicePixelRatio }; }); await page.setViewport(dimensions); 代码放置在页面渲染成功,截图代码之前。 2.方案二,其实截图方法内自带相关的配置参数 await page.screenshot({path: ‘img/website.png’, fullPage:true});
- puppeteer全屏截图 2019年6月19日
-
;
1.报错信息 (node:13852) UnhandledPromiseRejectionWarning: TimeoutError: Navigation Timeout Exceeded: 30000ms exceeded 2.解决方法 const timeout = 180 * 1000 await Promise.all([ page.goto(‘http://website.com’, {timeout}), page.waitFor(‘body’, {timeout}) ]) 或者 await page.goto(‘http://website.com’, {timeout: 180000}) by default each time a page navigate to an url (page.goto) it waits for the event ‘load’ to be fired and by default it waits 30000ms, if the event (load) is not fired the page throw: Timeout Exceeded probably you are loading a heavy or slow page you should chan…
- puppeteer报错’UnhandledPromiseRejectionWarning’ 2019年6月18日
-
;
1.初始化 npm init npm install wechaty 2.创建js文件 const { Wechaty } = require(‘wechaty’) // import { Wechaty } from ‘wechaty’ Wechaty.instance() // Global Instance .on(‘scan’, (qrcode, status) => console.log(`Scan QR Code to login: ${status}\nhttps://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(qrcode)}`)) .on(‘login’, user => console.log(`User ${user} logined`)) .on(‘message’, message => console.log(`Message: ${message}`)) .start() 3.运行 node mybot.js 4.扫描二维码接入微信 复制命令行下的地址在浏览器中打开,使用微信扫码登录 5,完成 后续此微信发送或者接收的消息都会在命令行中显示 6.优化,命令行终端内显示二维码 npm –save i qrcode-…
- wechaty起步 2019年6月17日
-
;
1.下载 https://www.python.org/downloads/release/python-373/ 选择’Windows x86-64 executable installer’ 2.配置path python路径:C:\Users\Administrator\AppData\Local\Programs\Python\Python37 pip路径:C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Scripts 两个都需要添加 3.安装模块 pip install requests
- python开发环境安装 2019年6月16日
-
;
1.问题描述 默认情况下,dispatchEvent只触发定义在目标上以及捕获阶段的事件 var event = new Event(‘eventName’); document.body.addEventListener(‘eventName’,function(){ alert(‘body’); }); document.addEventListener(‘eventName’,function(){ alert(‘document’); }); window.addEventListener(‘eventName’,function(){ alert(‘window’); },true); document.body.dispatchEvent(event); 此时,body和window会触发,document上的事件处于冒泡阶段并没有触发 2.解决,事件定义时候加入第二个参数 var event = new Event(‘eventName’,{ bubbles: true }); // 加入第二个参数 document.body.addEventListener(‘eventName’,function(){ alert(‘body’); }); document.addEventListener(‘eventName’,func…
- dispatchEvent如何触发冒泡 2019年6月16日
-
;
出于安全考虑,即日起,我们不再帮助用户无感知的申请腾讯云云 API 密钥,受此影响,腾讯云微信小程序解决方案 Wafer2 提供的 sdk.config.json 中的 qcloudSecretId 和 qcloudSecretKey 字段将为空,这会导致登录失败,并返回错误提示:ERR_REQUEST_PARAM 。 你可以通过以下两种方式修复该问题: 1. 关闭腾讯云代理登录,使用微信小程序 AppID 和 AppSecret 登录: 修改 server/config.js 中的 useQcloudLogin 为 false,并填写上 appId 和 appSecret 字段(分别为微信小程序的 AppID 和 AppSecret),重新部署代码即可。 2. 手动填写腾讯云云 API 密钥: 登录腾讯云云 API 密钥控制台申请云 API 密钥,并在 server/config.js 的 CONF 中添加如下三个字段: qcloudAppId: ‘你的腾讯云 AppID’, qcloudSecretId: ‘你的腾讯云 SecretId’, qcloudSecretKey: ‘你的腾讯云 SecretKey’, 重新部署代码即可生效。 由于上传接口也会使用到腾讯云云 API 密钥,如遇到上传接口报错,也请参考如上 2 的方法排查。 来源:…
- 小程序登录报错‘error : “ERR_REQUEST_PARAM”’ 2019年6月12日
-
;
1.依照文档进行到如下步骤,却找不到相关按钮 https://console.qcloud.com/lav2/dev 进行到第5步,找不到相关按钮及菜单 2。解决(这个按钮默认被隐藏) 工具 -> 工具栏管理 -> 自定义工具栏 -> 自定义工具管理 参考链接:https://blog.csdn.net/u013176866/article/details/89321281
- 小程序-开发环境开通-遇到的问题 2019年6月12日