IOS系统如何实现在微信分享页中指导用户点击在Safari 中打开页面并在浏览器实现唤醒app

在微信中使用universal link可以直接唤醒app,但是现在需求是在右上角通过打开Safari在浏览器中访问页面,并实现用URL scheme打开app,跳到指定页?

1个回答

主要分两个步骤,1:首先在自己app内部注册吊起自己app的scheme。
2:在appdelegate 里处理启动app的由URL吊起的,然后在根据URL里的参赛数据启动app相应界面。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
为什么iOS H5 APP 调用微信H5支付后不返回到App而是打开了safari浏览器?
iOS 封装的H5 APP 调用微信H5支付,进入微信支付界面后,点击取消,或者支付完成返回不能返回到App,而是打开了手机系统的safari浏览器。 用的h5+ 请问有解决方案吗
iOS webView 微信H5支付返回问题
在iOS的webview中,h5自己调用微信支付,能够成功起调,并且能完成支付,但是点击完成时,跳转到safari浏览器中,并不能跳回app。
在线等,ios safari 打开网页白屏
在线等。 http://www.dytj.com/pcebweb/PublicShare.do?ParentShareCode=6f655e7fba56a19040f2b9930204a117&adTemplateSeq=17&r=0.09126012772321701 这是公司的分享到微信中的一个链接,打开经常出现白屏,想问下苹果对网页会有什么控制没?白屏不显示是网页的问题吗?
怎样在HTML的页面实现调用IOS短信界面,传递预置的收件人和短信内容
想做个HTML的页面实现调用IOS短信界面,传递收件人和短信内容。 安卓的很简单就可以实现了: <a href="sms:10086?body='.urlencode("test#552#13912345678").'" >测试连接,不要点击</a> 在苹果IOS上,在【UC浏览器】的话,也是可行的。 但是,IOS微信/自带safari浏览器下均不行,只能带收件人号码,带不了内容,而且,上例的“?body='.urlencode("test#552#13912345678")”会全部作为发件人号码处理。 请求高手指点,怎样实现期待的功能:在HTML的页面实现调用IOS短信界面,传递收件人和短信内容。 (笔者服务器环境:IIS6.0+PHP5.3+MYSQL5.6)
Universal Links iOS10中失效
Universal Links 拉起客户端在iOS10中失效,,无论是QQ,微信打开的网页还是Safari打开的网页,,点击拉起功能都会跳转到App Store,iOS11却正常拉起,,求解决
微信扫码下载安装iOS和Android js代码问题
# 问题描述 微信扫码下载安装iOS和Android js代码问题 只能通过浏览器扫码才会显示我的APP安装包,iOS和Android的微信扫一扫 都是加载网页空白不动. # 问题出现的环境背景及自己尝试过哪些方法 问题1 微信内置浏览器iOS和Android扫码都不能执行下载安装 问题2 微信内置浏览器扫一扫 iOS 我需要加个提示框 提示框 提示 即将离开微信 打开app Stroe下载 实际上是直接安装 要仿照的案例 ![图片说明](https://img-ask.csdn.net/upload/201808/07/1533633462_275573.png) ``` <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>二维码下载</title> <script type="text/javascript"> /* * 智能机浏览器版本信息: * */ var browser = { versions: function() { var u = navigator.userAgent, app = navigator.appVersion; return {//移动终端浏览器版本信息 trident: u.indexOf('Trident') > -1, //IE内核 presto: u.indexOf('Presto') > -1, //opera内核 webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核 gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐内核 mobile: !!u.match(/AppleWebKit.*Mobile.*/) || !!u.match(/AppleWebKit/), //是否为移动终端 ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端 android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android终端或者uc浏览器 iPhone: u.indexOf('iPhone') > -1 || u.indexOf('Mac') > -1, //是否为iPhone或者QQHD浏览器 iPad: u.indexOf('iPad') > -1, //是否iPad webApp: u.indexOf('Safari') == -1 //是否web应该程序,没有头部与底部 }; }(), language: (navigator.browserLanguage || navigator.language).toLowerCase() } if (browser.versions.ios || browser.versions.iPhone || browser.versions.iPad) { // TODO 此处写ios的下载地址 window.location="http://www.kzapp.com.cn/QRcode/kzwx.ipa"; } else if (browser.versions.android) { // 此处写Andoird 的下载地址 window.location="http://www.kzapp.com.cn/QRcode/kzwx.apk"; } // document.writeln("语言版本: " + browser.language); // document.writeln(" 是否为移动终端: " + browser.versions.mobile); // document.writeln(" ios终端: " + browser.versions.ios); // document.writeln(" android终端: " + browser.versions.android); // document.writeln(" 是否为iPhone: " + browser.versions.iPhone); // document.writeln(" 是否iPad: " + browser.versions.iPad); // document.writeln(navigator.userAgent); </script> </head> <body> </body> </html> ``` # 你期待的结果是什么?实际看到的错误信息又是什么? 和我提供的参考案例一致 在微信内置浏览器的扫一扫iOS 提示框然后直接下载安装 在外部其他浏览器扫码直接下载
vue2在ios10.3以下无法显示页面
如题, 1.搜索了一下,最多的是这个方法,但并没有解决,应该和浏览器内核有关 http://www.jb51.net/article/119831.html 引入bab 2. 有资料显示,vue2支持的浏览器版本 ![图片说明](https://img-ask.csdn.net/upload/201710/22/1508641577_187299.png)el-polyfill 写好的页面在chrome和新的android、ios都没有问题,但在ios10.3以下页面是不显示的,包括微信浏览器和safari,求教
如何解决苹果 iso safari下div元素滑动时,不让同级div元素跟着滑动,并且还有橡皮筋效果的问题
``` 如何解决苹果 iso safari下div元素滑动时,不让同级div元素跟着滑动,并且还有橡皮筋效果的问题 ``` ``` 我再csdn下载了一个移动端日期选择控件,地址为:https://download.csdn.net/download/qfcjay1/10292111 我自己重新上传了一份儿,您可以免费下载。 该控件本想在微信公众号wap网页中使用,但是该控件在安卓端使用没有任何问题。但是在ios端,星期标签和“完成”按钮所在的div,会跟随日期div的滑动一定出现滑动效果。看起来就像是在闪烁一样。 我尝试了禁止橡皮筋效果,但是不能滑动了 我尝试了重写touch事件,但是依然解决不了。 请问,如何实现,滑动日期时,星期几和“完成”按钮所在的div不出现闪烁呢? ```
如何用JavaScript实现方位角计算并且调用指针指示角度?
``` ```<!DOCTYPE html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=Edge"> <meta content="always" name="referrer"> <meta name="theme-color" content="#2932e1"> <title>RCP For A320NG</title> </head> <body> <style> .shu { width: 2px; font-size: 15px; word-wrap: break-word; } @font-face{ font-family: digital-display; src: url('digital-display.ttf'), url('digital-display.eot'); /* IE9+ */ } .Digits{ position:absolute; top:120px;left:10px; height:60px;width:230px; line-height:60px; color:white; font-size:70px;font-family:digital-display; display:block; float:left; text-align:right; } .to_top { width: 0; height: 0; border-bottom: 30px solid white; border-left: 20px solid transparent; border-right: 20px solid transparent; } .top{ width: 0; height: 0; border-bottom: 30px solid white; border-left: 20px solid transparent ; border-right: 20px solid transparent ; } </style> <div id="DME1" class = "Digits" style="">1.300</div> <div id="DME2" class = "Digits" style="left:260px;">----</div> <div id="asd"style="position: absolute; top:600px;left:200px;font-family: Microsoft YaHei;letter-spacing:5px;color:white;">ADF</div> <div id="asd1"style="position: absolute; top:600px;left:350px;font-family: Microsoft YaHei;letter-spacing:5px;color:white;">ADF</div> <div id="asd2"class="shu" style="position: absolute; left:80px;top:470px;font-family: Microsoft YaHei;color:white;">VOR</div> <div id="asd3"class="shu" style="position: absolute; left:480px;top:470px;font-family: Microsoft YaHei;color:white;">VOR</div> <div id="mat"class="to_top" style="position: absolute; left:60px;top:570px;color:white;"></div> <div id="mat2"style="position: absolute; width:10px;height:10px;border:1px solid white;left:75px;top:600px;background:white;"></div> <div id="mat3"style="position: absolute; width:10px;height:10px;border:1px solid white;left:75px;top:615px;background:white;"></div> <div id="mat4"style="position: absolute; width:10px;height:10px;border:1px solid white;left:75px;top:630px;background:white;"></div> <div id="ExchangeBtn" class="button" style="position:absolute; left:470px;top:600px;font-size:90px;font-weight:bold;font-family: Microsoft YaHei;line-height:15px;color:white;">&#8679;</div> <canvas id="solar" style="border:0px solid;left:10px;top:10px;position:absolute;z-index:-1;width:560px;height:670px;scale:0.5;"></canvas> <div id="Message" ></div> <div id="Message2" ></div> </body> <script> init(); let pi = Math.PI; let DialCenterX = 275; let DialCenterY = 400; let DialRadius = 180; let CompassHeading = 0; let Latitude=0; let Longitude=0; let DME1_lat= 39.10960; let DME1_long= 117.35343; let DME1Distance = 0; let hand1=30; //VOR方位角 let hand2=0; let gap_dial_hand = 60; let hand_length = DialRadius - gap_dial_hand; window.addEventListener("deviceorientation", findNorth); var Message =document.getElementById("Message"); var browser={ versions:function(){ var u = navigator.userAgent, app = navigator.appVersion; return { trident: u.indexOf('Trident') > -1, //IE内核 presto: u.indexOf('Presto') > -1, //opera内核 webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核 gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1,//火狐内核 mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端 ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端 android: u.indexOf('Android') > -1 || u.indexOf('Adr') > -1, //android终端 iPhone: u.indexOf('iPhone') > -1 , //是否为iPhone或者QQHD浏览器 iPad: u.indexOf('iPad') > -1, //是否iPad webApp: u.indexOf('Safari') == -1, //是否web应该程序,没有头部与底部 weixin: u.indexOf('MicroMessenger') > -1, //是否微信 (2015-01-22新增) qq: u.match(/\sQQ/i) == " qq" //是否QQ }; }(), language:(navigator.browserLanguage || navigator.language).toLowerCase() } function draw(ctx,DialDeg,HandDeg1,HandDeg2){ //drawDial(ctx,DialDeg); //绘制表盘 //drawAllHands(ctx,HandDeg1,HandDeg2); //绘制时分秒针 requestAnimationFrame(function step(){ getLocation(); DME1Distance = getDisance(Latitude, Longitude, DME1_lat, DME1_long); if(DME1Distance>722094) DME1Distance="----"; document.getElementById("DME1").innerHTML = DME1Distance; drawDial(ctx,CompassHeading); //绘制表盘 drawAllHands(ctx,hand1,hand2); //绘制时分秒针 requestAnimationFrame(step); }); } function toRad(d) { return d * Math.PI / 180; } function getDisance(lat1, lng1, lat2, lng2) { //lat为纬度, lng为经度, 一定不要弄错 var dis = 0; var radLat1 = toRad(lat1); var radLat2 = toRad(lat2); var deltaLat = radLat1 - radLat2; var deltaLng = toRad(lng1) - toRad(lng2); var dis = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(deltaLng / 2), 2))); dis = dis * 6378137; dis = dis ;///1852 ;//转为海里 return dis.toFixed(1); } function getLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(showPosition); } else{ Message.innerHTML="Geolocation is not supported by this browser."; } } function showPosition(position) { Message.innerHTML="Latitude: " + position.coords.latitude + "<br />Longitude: " + position.coords.longitude +"<br/>accuracy:"+ position.coords.accuracy; Latitude = position.coords.latitude; Longitude = position.coords.longitude; } function findNorth(evt) { if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) { CompassHeading = 360-evt.webkitCompassHeading.toFixed(0); //window.location.href ="iPhone.html"; } else if (/(Android)/i.test(navigator.userAgent)) { //alert(navigator.userAgent); CompassHeading = evt.alpha -90; document.getElementById("Message2").innerHTML = "您的手机需要校准指南针,请将手机指向正北后刷新页面。"; } else { } } function init(){ let canvas = document.querySelector("#solar"); canvas.width = 560; canvas.height = 670; let ctx = canvas.getContext("2d"); drawOutline(ctx); //strokeRoundRect(ctx, 10, 10, 100, 50, 10); fillRoundRect(ctx, 40, 95, 216, 124, 30, 'rgba(99,116,122,1)'); fillRoundRect(ctx, 50, 105, 192, 68, 15, 'rgba(0,0,0,1)'); fillRoundRect(ctx, 295, 95, 216, 124, 30, 'rgba(99,116,122,1)'); fillRoundRect(ctx, 305, 105, 192, 68, 15, 'rgba(0,0,0,1)'); //fillRoundRect(ctx, 50, 50, 450, 600, 20, 'rgba(0,0,0,1)'); draw(ctx,30,30,60); ctx.font = '20px "微软雅黑"'; ctx.fillStyle = "white"; ctx.fillText("DME-1", 110, 200); ctx.font = '20px "微软雅黑"'; ctx.fillStyle = "white"; ctx.fillText("DME-2", 370, 200); } /*绘制时分秒针*/ function drawAllHands(ctx,HandDeg1,HandDeg2){ let time = new Date(); let s = time.getSeconds(); let m = time.getMinutes(); let h = time.getHours(); let pi = Math.PI; let secondAngle = HandDeg1;//pi / 180 * 6 * s; //计算出来s针的弧度 let minuteAngle = pi / 180 * HandDeg1; //计算出来分针的弧度 let hourAngle = pi / 180 *HandDeg2;//pi / 180 * 30 * h + minuteAngle / 12; //计算出来时针的弧度 // drawHand2(hand2 + CompassHeading, hand_length, 2, "white", ctx); //绘制时针,(角度,针长,粗细,颜色,canvas) drawHand(hand1 + CompassHeading, hand_length, 2, "white", ctx); //绘制分针 //drawHand(secondAngle, 150, 2, "blue", ctx); //绘制秒针 } /*绘制时针、或分针、或秒针 * 参数1:要绘制的针的角度 * 参数2:要绘制的针的长度 * 参数3:要绘制的针的宽度 * 参数4:要绘制的针的颜色 * 参数4:ctx * */ function drawHand(angle, len, width, color, ctx){ ctx.save(); ctx.translate(DialCenterX, DialCenterY); //把坐标轴的远点平移到原来的中心 ctx.rotate(angle*pi/180 + pi/2); //旋转坐标轴。 x轴就是针的角度,rad ctx.beginPath(); ctx.moveTo(-DialRadius + gap_dial_hand, 0); //ctx.lineTo(len, 0); // 沿着x轴绘制针 ctx.font="18px microsoft yahei"; ctx.fillStyle="white"; var x = 4-DialRadius + gap_dial_hand; //指针起点x ctx.fillText("◀",x,6); for(i=x+5;i<len;){ ctx.moveTo(i, 0); ctx.lineTo(i+10, 0); i = i+20; } ctx.lineWidth = width; ctx.strokeStyle = color; ctx.lineCap = "round"; ctx.stroke(); ctx.closePath(); ctx.restore(); } function drawHand2(angle, len, width, color, ctx){ ctx.save(); ctx.translate(DialCenterX, DialCenterY); //把坐标轴的远点平移到原来的中心 ctx.rotate(angle*pi/180 +pi/2); //旋转坐标轴。 x轴就是针的角度 ctx.beginPath(); ctx.moveTo(-DialRadius + gap_dial_hand, 0); //ctx.lineTo(len, 0); // 沿着x轴绘制针 ctx.font="30px microsoft yahei"; ctx.fillStyle="white"; var x = -DialRadius + gap_dial_hand; ctx.moveTo(x, 0); ctx.lineTo(x+20, 10);ctx.lineTo(x+20, 5); ctx.lineTo(len, 5);ctx.lineTo(len, -5); ctx.lineTo(x+20, -5);ctx.lineTo(x+20, -10); ctx.lineTo(x, 0); ctx.lineWidth = width; ctx.strokeStyle = color; ctx.lineCap = "round"; ctx.stroke(); ctx.closePath(); ctx.restore(); } /*绘制表盘*/ function drawDial(ctx,DialDeg){ let pi = Math.PI; //ctx.clearRect(0, 0, 600, 600); //清除所有内容 ctx.save(); ctx.translate(DialCenterX, DialCenterY); //移动坐标原点到原来的中心 ctx.beginPath(); ctx.arc(0, 0, DialRadius, 0, 2*pi); //绘制圆周 //ctx.stroke(); //context.clip(); ctx.closePath(); // 填充颜色 ctx.fillStyle = "#202020"; ctx.fill(); for (let i = 0; i < 72; i++){//绘制刻度盘和数字 ctx.save(); ctx.rotate(pi/180*DialDeg + i * pi / 36); //旋转坐标轴。修改第一个参数可以旋转表盘 ctx.beginPath(); ctx.moveTo(DialRadius-37, 0); if(i % 2 == 0){ ctx.lineTo(DialRadius-1, 0); }else{ ctx.lineTo(DialRadius-16, 0); } ctx.lineWidth = i % 5 ? 4 : 4; ctx.strokeStyle = i % 5 ? "white" : "white"; ctx.stroke(); ctx.closePath(); if(i % 6 == 0){ ctx.lineWidth = 1; ctx.font="24px microsoft yahei"; //ctx.strokeText(i/3,0,-150); //填充 ctx.fillStyle="white"; if(i>9) ctx.fillText(i*0.5,-12,60-DialRadius); //-150 else ctx.fillText(i*0.5,-6,60-DialRadius); } ctx.restore(); } for (let i = 0; i < 8; i++){//绘制三角标 ctx.save(); ctx.rotate(pi/180*0 + i * pi / 4); //旋转坐标轴。修改第一个参数可以旋转表盘 ctx.font="24px microsoft yahei"; ctx.fillStyle="white"; ctx.fillText("▼",-12,-1*DialRadius); ctx.restore(); } ctx.restore(); } VincentyConstants = { a: 6378137, b: 6356752.3142, f: 1/298.257223563 } /** *Calculate destination point given start point lat/long (numeric degrees), * bearing (numeric degrees) & distance (in m). */ function destinationVincenty(lonlat, brng, dist) { var u = this; var ct = u.VincentyConstants; var a = ct.a, b = ct.b, f = ct.f; var lon1 = lonlat.lon*1; //乘一(*1)是为了确保经纬度的数据类型为number var lat1 = lonlat.lat*1; var s = dist; var alpha1 = u.rad(brng); var sinAlpha1 = Math.sin(alpha1); var cosAlpha1 = Math.cos(alpha1); var tanU1 = (1-f) * Math.tan(u.rad(lat1)); var cosU1 = 1 / Math.sqrt((1 + tanU1*tanU1)), sinU1 = tanU1*cosU1; var sigma1 = Math.atan2(tanU1, cosAlpha1); var sinAlpha = cosU1 * sinAlpha1; var cosSqAlpha = 1 - sinAlpha*sinAlpha; var uSq = cosSqAlpha * (a*a - b*b) / (b*b); var A = 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq))); var B = uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq))); var sigma = s / (b*A), sigmaP = 2*Math.PI; while (Math.abs(sigma-sigmaP) > 1e-12) { var cos2SigmaM = Math.cos(2*sigma1 + sigma); var sinSigma = Math.sin(sigma); var cosSigma = Math.cos(sigma); var deltaSigma = B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)- B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM))); sigmaP = sigma; sigma = s / (b*A) + deltaSigma; } var tmp = sinU1*sinSigma - cosU1*cosSigma*cosAlpha1; var lat2 = Math.atan2(sinU1*cosSigma + cosU1*sinSigma*cosAlpha1, (1-f)*Math.sqrt(sinAlpha*sinAlpha + tmp*tmp)); var lambda = Math.atan2(sinSigma*sinAlpha1, cosU1*cosSigma - sinU1*sinSigma*cosAlpha1); var C = f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha)); var L = lambda - (1-C) * f * sinAlpha * (sigma + C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM))); var revAz = Math.atan2(sinAlpha, -tmp); // final bearing var lon_destina = lon1*1+u.deg(L); //var num_lon_dest = lon_destina*1; //var lon_destina = new Number; var lonlat_destination = {lon: lon_destina, lat: u.deg(lat2)}; return lonlat_destination; } /** * 度换成弧度 * @param {Float} d 度 * @return {[Float} 弧度 */ function rad(d) { return d * Math.PI / 180.0; } /** * 弧度换成度 * @param {Float} x 弧度 * @return {Float} 度 */ function deg(x) { return x*180/Math.PI; } function drawOutline (ctx){ //开始路径 ctx.beginPath(); ctx.moveTo(70, 2); ctx.lineTo(472, 2); ctx.lineTo(550, 70); ctx.lineTo(550, 597); ctx.lineTo(472, 665); ctx.lineTo(70, 665); ctx.lineTo(2, 597); ctx.lineTo(2, 70); ctx.lineTo(70, 2); ctx.closePath(); //路径闭合 //if(strokeStyle) { ctx.strokeStyle = "gray"; ctx.lineWidth = 1; ctx.lineJoin = 'round'; ctx.stroke(); } //if(fillStyle) { ctx.fillStyle = 'rgba(135,162,174,1)'; ctx.fill(); } ctx.restore(); ctx.beginPath(); ctx.moveTo(40, 84); ctx.lineTo(511, 84); ctx.lineTo(511, 510); ctx.lineTo(390, 642); ctx.lineTo(169, 642); ctx.lineTo(40, 510); ctx.lineTo(40, 84); ctx.closePath(); { ctx.strokeStyle = "darkgray"; ctx.lineWidth = 1; ctx.lineJoin = 'round'; ctx.stroke(); } //if(fillStyle) { ctx.fillStyle = 'rgba(63,74,76,1)'; ctx.fill(); } } /**该方法用来绘制一个有填充色的圆角矩形 *@param cxt:canvas的上下文环境 *@param x:左上角x轴坐标 *@param y:左上角y轴坐标 *@param width:矩形的宽度 *@param height:矩形的高度 *@param radius:圆的半径 *@param fillColor:填充颜色 **/ function fillRoundRect(cxt, x, y, width, height, radius, /*optional*/ fillColor) { //圆的直径必然要小于矩形的宽高 if (2 * radius > width || 2 * radius > height) { return false; } cxt.save(); cxt.translate(x, y); //绘制圆角矩形的各个边 drawRoundRectPath(cxt, width, height, radius); cxt.fillStyle = fillColor || "#000"; //若是给定了值就用给定的值否则给予默认值 cxt.fill(); cxt.restore(); } /**该方法用来绘制圆角矩形 *@param cxt:canvas的上下文环境 *@param x:左上角x轴坐标 *@param y:左上角y轴坐标 *@param width:矩形的宽度 *@param height:矩形的高度 *@param radius:圆的半径 *@param lineWidth:线条粗细 *@param strokeColor:线条颜色 **/ function strokeRoundRect(cxt, x, y, width, height, radius, /*optional*/ lineWidth, /*optional*/ strokeColor) { //圆的直径必然要小于矩形的宽高 if (2 * radius > width || 2 * radius > height) { return false; } cxt.save(); cxt.translate(x, y); //绘制圆角矩形的各个边 drawRoundRectPath(cxt, width, height, radius); cxt.lineWidth = lineWidth || 2; //若是给定了值就用给定的值否则给予默认值2 cxt.strokeStyle = strokeColor || "#000"; cxt.stroke(); cxt.restore(); } function drawRoundRectPath(cxt, width, height, radius) { cxt.beginPath(0); //从右下角顺时针绘制,弧度从0到1/2PI cxt.arc(width - radius, height - radius, radius, 0, Math.PI / 2); //矩形下边线 cxt.lineTo(radius, height); //左下角圆弧,弧度从1/2PI到PI cxt.arc(radius, height - radius, radius, Math.PI / 2, Math.PI); //矩形左边线 cxt.lineTo(0, radius); //左上角圆弧,弧度从PI到3/2PI cxt.arc(radius, radius, radius, Math.PI, Math.PI * 3 / 2); //上边线 cxt.lineTo(width - radius, 0); //右上角圆弧 cxt.arc(width - radius, radius, radius, Math.PI * 3 / 2, Math.PI * 2); //右边线 cxt.lineTo(width, height - radius); cxt.closePath(); } </script> </html>
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、PDF搜索网站推荐 对于大部
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
Vue + Spring Boot 项目实战(十四):用户认证方案与完善的访问拦截
本篇文章主要讲解 token、session 等用户认证方案的区别并分析常见误区,以及如何通过前后端的配合实现完善的访问拦截,为下一步权限控制的实现打下基础。
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入  假设现有4个人
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
写在前面: 我是 扬帆向海,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。 这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。 用知识改变命运,让我们的家人过上更好的生活。 目录一、杨辉三角的介绍二、杨辉三角的算法思想三、代码实现1.第一种写法2.第二种写法 一、杨辉三角的介绍 百度
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
SQL-小白最佳入门sql查询一
一 说明 如果是初学者,建议去网上寻找安装Mysql的文章安装,以及使用navicat连接数据库,以后的示例基本是使用mysql数据库管理系统; 二 准备前提 需要建立一张学生表,列分别是id,名称,年龄,学生信息;本示例中文章篇幅原因SQL注释略; 建表语句: CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // dosho
漫话:什么是平衡(AVL)树?这应该是把AVL树讲的最好的文章了
这篇文章通过对话的形式,由浅入深带你读懂 AVL 树,看完让你保证理解 AVL 树的各种操作,如果觉得不错,别吝啬你的赞哦。 1、若它的左子树不为空,则左子树上所有的节点值都小于它的根节点值。 2、若它的右子树不为空,则右子树上所有的节点值均大于它的根节点值。 3、它的左右子树也分别可以充当为二叉查找树。 例如: 例如,我现在想要查找数值为14的节点。由于二叉查找树的特性,我们可...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,
程序员:我终于知道post和get的区别
IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。 此话一出,不知激起了多少(码农)程序员的愤怒,却又无可奈何,于是码农问程序员。 码农:你知道get和post请求到底有什么区别? 程序员:你看这篇就知道了。 码农:你月薪三万了? 程序员:嗯。 码农:你是怎么做到的? 程序员:
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU
开源并不是你认为的那些事
点击上方蓝字 关注我们开源之道导读所以 ————想要理清开源是什么?先要厘清开源不是什么,名正言顺是句中国的古代成语,概念本身的理解非常之重要。大部分生物多样性的起源,...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
      11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI 算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下
《C++ Primer》学习笔记(六):C++模块设计——函数
专栏C++学习笔记 《C++ Primer》学习笔记/习题答案 总目录 https://blog.csdn.net/TeFuirnever/article/details/100700212 —————————————————————————————————————————————————————— 《C++ Primer》习题参考答案:第6章 - C++模块设计——函数 文章目录专栏C+...
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车? 某胡同口的煎饼摊一年能卖出多少个煎饼? 深圳有多少个产品经理? 一辆公交车里能装下多少个乒乓球? 一
so easy! 10行代码写个"狗屁不通"文章生成器
前几天,GitHub 有个开源项目特别火,只要输入标题就可以生成一篇长长的文章。背后实现代码一定很复杂吧,里面一定有很多高深莫测的机器学习等复杂算法不过,当我看了源代码之后这程序不到50
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的 回答 - Bravo Yeung,获得该问题下回答中得最高赞(236赞和1枚专业勋章),对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalk
MySQL数据库总结
文章目录一、数据库简介二、MySQL数据类型(5.5版本)三、Sql语句(1)Sql语句简介(2)数据定义语言DDLcreate,alter,drop(3)数据操纵语言DMLupdate,insert,delete(4)数据控制语言DCLgrant,revoke(5)数据查询语言DQLselect(6)分组查询与分页查询group by,limit四、完整性约束(单表)五、多表查询六、MySQL数
20行Python代码爬取王者荣耀全英雄皮肤
引言 王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了。我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成。 准备工作 爬取皮肤本身并不难,难点在于分析,我们首先得得到皮肤图片的url地址,话不多说,我们马上来到王者荣耀的官网: 我们点击英雄资料,然后随意地选择一位英雄,接着F12打开调试台,找到英雄原皮肤的图片
中年危机,35 岁定律,见鬼去吧!
中年危机,35 岁定律,相信你都听说过,每次触及还会让你感到丝丝焦虑,毕竟时间这把杀猪刀不会放过任何一个人。中年危机或 35 岁定律是客观存在的,你迟早都会遭遇的,那你是否有信心战胜它呢? 中年危机之所以让人害怕,一则是你没有把握打赢这场遭遇战,再则中年是一个输不起的阶段。古人云:知己知彼,百战不殆。恐惧,主要源自对敌人和自己的不了解,不知道敌人的优劣势,也不清楚自己的长短板,常常以己之所短攻彼...
程序设计的5个底层逻辑,决定你能走多快
阿里妹导读:肉眼看计算机是由CPU、内存、显示器这些硬件设备组成,但大部分人从事的是软件开发工作。计算机底层原理就是连通硬件和软件的桥梁,理解计算机底层原理才能在程序设计这条路上越走越快,越走越轻松。从操作系统层面去理解高级编程语言的执行过程,会发现好多软件设计都是同一种套路,很多语言特性都依赖于底层机制,今天董鹏为你一一揭秘。 结合 CPU 理解一行 Java 代码是怎么执行的 根据冯·诺...
张小龙-年薪近3亿的微信之父,他是如何做到的?
张小龙生于湖南邵东魏家桥镇, 家庭主要特点:穷。 不仅自己穷,亲戚也都很穷,可以说穷以类聚。爷爷做过铜匠,总的来说,标准的劳动阶级出身。 家有兄弟两人, 一个小龙,一个小虎。 小虎好动,与邻里打成一片, 小龙好静,喜好读书。 “文静的像个妹子。”张小龙的表哥如是说。 穷文富武,做个读书郎是个不错的选择。 87年至94年, 华中科技大学本硕连读。 本科就读电信系, 不喜欢上课
阿里靠什么武功秘籍渡过“双十一“的天量冲击
双十一大概会产生多大的数据量呢,可能大家没概念,举个例子央视拍了这么多年电视新闻节目,几十年下来他存了大概80P的数据。而今年双11一天,阿里要处理970P的数据,做为一个IT人,笔者认为今年”双十一“阿里最大的技术看点有有以下两个: 阿里的数据库,也就是刚刚拿下TPC冠军的OcceanBase,处理峰值也达到了骇人听闻的6100万次/秒, 阿里核心系统百分百上云了。 如果把信息系统比做一个武
西游记团队中如果需要裁掉一个人,会先裁掉谁?
2019年互联网寒冬,大批企业开始裁员,下图是网上流传的一张截图: 裁员不可避免,那如何才能做到不管大环境如何变化,自身不受影响呢? 我们先来看一个有意思的故事,如果西游记取经团队需要裁员一名,会裁掉谁呢,为什么? 西游记团队组成: 1.唐僧 作为团队teamleader,有很坚韧的品性和极高的原则性,不达目的不罢休,遇到任何问题,都没有退缩过,又很得上司支持和赏识(直接得到唐太宗的任命,既给
iOS Bug 太多,苹果终于坐不住了!
开源的 Android 和闭源的 iOS,作为用户的你,更偏向哪一个呢? 整理 | 屠敏 出品 | CSDN(ID:CSDNnews) 毋庸置疑,当前移动设备操作系统市场中,Android 和 iOS 作为两大阵营,在相互竞争的同时不断演进。不过一直以来,开源的 Android 吸引了无数的手机厂商涌入其中,为其生态带来了百花齐放的盛景,但和神秘且闭源的 iOS 系统相比,不少网友...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
Zookeeper的基本命令大全
1、列出节点 ls path ls -s path //包含该节点的详细信息,如子节点总数等 2、查看节点状态 stat path cZxid = 0x14f //创建节点的ID ctime = Thu Nov 07 01:02:53 CST 2019 //节点的创建时间 mZxid = 0x14f //修改节点ID mtime = Thu Nov 07 01:02:53 CST 2019 ...
相关热词 c# clr dll c# 如何orm c# 固定大小的字符数组 c#框架设计 c# 删除数据库 c# 中文文字 图片转 c# 成员属性 接口 c#如何将程序封装 16进制负数转换 c# c#练手项目
立即提问