首页
关于我
Search
1
iTerm2 快捷键大全
3,098 阅读
2
关于使用emlog主题《莫小奈定制版》出现问题及解决方案(使用此主题必看)
1,466 阅读
3
MacOS Monterey 12.3 系统更新了自带的python问题
546 阅读
4
纯css实现一个右边滑出,挥手n次的css动画
443 阅读
5
emlog评论添加一键获取QQ昵称和头像教程(附代码)
362 阅读
Media
Web
SoftWare
Life
登录
Search
标签搜索
前后端分离
关爱码农
shadowsocks客户端
linux
formData获取json对象
emlog2typecho
emlog转typecho
typecho修改gravatar源
emlog迁移
a记录不能cname解析
emlog文章如何插入视频
debian下完全卸载mysql,安装MariaDB
一键获取QQ昵称和头像
emlogQQ获取昵称
《功夫》影评
终极杀人王的身份之谜
我为什么不再接受外链申请
新浪微博图床
围脖是个好图床
升级版
Typecho
累计撰写
108
篇文章
累计收到
220
条评论
首页
栏目
Media
Web
SoftWare
Life
页面
关于我
搜索到
42
篇与
Web
的结果
2017-12-07
React Native Android打包签名apk
最近开始玩react-native,直接生成的包,手机不能安装,提示未签名,网上找了找签名教程,但多数都是基于android-studio,最后找到几篇好的教程,测试ok,整理一下。生成一个签名密钥在命令窗口敲入以下内容keytool -genkey -v -keystore toushi-release-key.keystore -alias toushi-key-alias -keyalg RSA -keysize 2048 -validity 10000 注意:toushi-release-key和toushi-key-alias分别是秘钥库文件和秘钥库别名,有很多地方用到这个。注意:每一次发行apk,keystore 后面的内容需要改alias 后面的内容也要改。这条命令会要求你输入密钥库(keystore)和对应密钥的密码,然后设置一些发行相关的信息。最后它会在当前目录生成一个叫做toushi-release-key.keystore的密钥库文件。如图: 在运行上面这条语句之后,密钥库里应该已经生成了一个单独的密钥,有效期为10000天。--alias参数后面的别名是你将来为应用签名时所需要用到的,所以记得记录这个别名。将生成的秘钥库文件放到android/app目录下编辑~/.gradle/gradle.properties,添加如下的代码(注意把其中的****替换为相应密码)MYAPP_RELEASE_STORE_FILE=my-release-key.keystore MYAPP_RELEASE_KEY_ALIAS=my-key-alias MYAPP_RELEASE_STORE_PASSWORD=***** MYAPP_RELEASE_KEY_PASSWORD=***** 注:一旦你在Play Store发布了你的应用,如果想修改签名,就必须用一个不同的包名来重新发布你的应用。所以请务必备份好你的签名库和密码添加签名到应用的gradle配置文件编辑你工程目录下的android/app/build.gradle,添加如下的内容:... android { ... defaultConfig { ... } signingConfigs { release { storeFile file(MYAPP_RELEASE_STORE_FILE) storePassword MYAPP_RELEASE_STORE_PASSWORD keyAlias MYAPP_RELEASE_KEY_ALIAS keyPassword MYAPP_RELEASE_KEY_PASSWORD } } buildTypes { release { ... signingConfig signingConfigs.release //别漏了这行 } } } ... 生成发行APK包只要在终端下运行以下命令:$ cd android && gradlew assembleRelease 不出意外。你应该能在android/app/build/outputs/apk/app-release.apk中找到生成的APK文件,并且它已经可以用来被发布。
2017年12月07日
197 阅读
0 评论
0 点赞
2017-12-04
mysql表名不能包含关键字
全栈小白一枚,服务端用nodejs,数据库mysql,新建了个库,查询的时候发现,出现以下错误:ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\"user\" ORDER BY id desc' at line 1 看了一下没明白什么问题,查了一下资料才知道,user是mysql保留关键字,不能作为表名,记一下
2017年12月04日
174 阅读
0 评论
0 点赞
2017-11-27
20 个 CSS 高级技巧汇总
使用技巧会让人变的越来越懒,没错,我就是想让你变懒。下面是我收集的CSS高级技巧,希望你懒出境界。黑白图像 这段代码会让你的彩色照片显示为黑白照片,是不是很酷? img.desaturate { filter: grayscale(100%); -webkit-filter: grayscale(100%); -moz-filter: grayscale(100%); -ms-filter: grayscale(100%); -o-filter: grayscale(100%); } 使用 :not() 在菜单上应用/取消应用边框 先给每一个菜单项添加边框 /* add border */ .nav li { border-right: 1px solid #666; } ……然后再除去最后一个元素……// remove border / .nav li:last-child { border-right: none; } ……可以直接使用 :not() 伪类来应用元素:.nav li:not(:last-child) { border-right: 1px solid #666; } 这样代码就干净,易读,易于理解了。当然,如果你的新元素有兄弟元素的话,也可以使用通用的兄弟选择符(~):..nav li:first-child ~ li { border-left: 1px solid #666; } 3.页面顶部阴影 下面这个简单的 CSS3 代码片段可以给网页加上漂亮的顶部阴影效果:body:before { content: ""; position: fixed; top: -10px; left: 0; width: 100%; height: 10px; -webkit-box-shadow: 0px 0px 10px rgba(0,0,0,.8); -moz-box-shadow: 0px 0px 10px rgba(0,0,0,.8); box-shadow: 0px 0px 10px rgba(0,0,0,.8); z-index: 100; } 4.给 body 添加行高 你不需要分别添加 line-height 到每个p,h标记等。只要添加到 body 即可:body { line-height: 1; } 这样文本元素就可以很容易地从 body 继承。5.所有一切都垂直居中 要将所有元素垂直居中,太简单了:html, body { height: 100%; margin: 0; } body { -webkit-align-items: center; -ms-flex-align: center; align-items: center; display: -webkit-flex; display: flex; } 看,是不是很简单。注意:在IE11中要小心flexbox。6.逗号分隔的列表 让HTML列表项看上去像一个真正的,用逗号分隔的列表:ul > li:not(:last-child)::after { content: ","; } 对最后一个列表项使用 :not() 伪类。7.使用负的 nth-child 选择项目在CSS中使用负的 nth-child 选择项目1到项目n。li { display: none; } /* select items 1 through 3 and display them */ li:nth-child(-n+3) { display: block; } 8.对图标使用 SVG 我们没有理由不对图标使用SVG:.logo { background: url("logo.svg"); } SVG对所有的分辨率类型都具有良好的扩展性,并支持所有浏览器都回归到IE9。这样可以避开.png、.jpg或.gif文件了。9.优化显示文本 有时,字体并不能在所有设备上都达到最佳的显示,所以可以让设备浏览器来帮助你:html { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; } 注:请负责任地使用 optimizeLegibility。此外,IE /Edge没有 text-rendering 支持。10.对纯 CSS 滑块使用 max-height 使用 max-height 和溢出隐藏来实现只有CSS的滑块:.slider ul { max-height: 0; overlow: hidden; } .slider:hover ul { max-height: 1000px; transition: .3s ease; } 11.继承 box-sizing 让 box-sizing 继承 html:html { box-sizing: border-box; } *, *:before, *:after { box-sizing: inherit; } 这样在插件或杠杆其他行为的其他组件中就能更容易地改变 box-sizing 了。12.表格单元格等宽 表格工作起来很麻烦,所以务必尽量使用 table-layout: fixed 来保持单元格的等宽:.calendar { table-layout: fixed; } 13.用 Flexbox 摆脱外边距的各种 hack 当需要用到列分隔符时,通过flexbox的 space-between 属性,你就可以摆脱nth-,first-,和 last-child 的hack了:.list { display: flex; justify-content: space-between; } .list .person { flex-basis: 23%; } 现在,列表分隔符就会在均匀间隔的位置出现。14.使用属性选择器用于空链接 当a元素没有文本值,但 href 属性有链接的时候显示链接:a[href^="http"]:empty::before { content: attr(href); } 相当方便。15.检测鼠标双击 HTML:<div class="test3"> <span><input type="text" value=" " readonly="true" /> <a href="http://blog.moxiaonai.cn">Double click me</a></span> </div> CSS:.test3 span { position: relative; } .test3 span a { position: relative; z-index: 2; } .test3 span a:hover, .test3 span a:active { z-index: 4; } .test3 span input { background: transparent; border: 0; cursor: pointer; position: absolute; top: -1px; left: 0; width: 101%; /* Hacky */ height: 301%; /* Hacky */ z-index: 3; } .test3 span input:focus { background: transparent; border: 0; z-index: 1; } 16.CSS 写出三角形/* create an arrow that points up */ div.arrow-up { width:0px; height:0px; border-left:5px solid transparent; /* left arrow slant */ border-right:5px solid transparent; /* right arrow slant */ border-bottom:5px solid #2f2f2f; /* bottom, add background color here */ font-size:0px; line-height:0px; } /* create an arrow that points down */ div.arrow-down { width:0px; height:0px; border-left:5px solid transparent; border-right:5px solid transparent; border-top:5px solid #2f2f2f; font-size:0px; line-height:0px; } /* create an arrow that points left */ div.arrow-left { width:0px; height:0px; border-bottom:5px solid transparent; /* left arrow slant */ border-top:5px solid transparent; /* right arrow slant */ border-right:5px solid #2f2f2f; /* bottom, add background color here */ font-size:0px; line-height:0px; } /* create an arrow that points right */ div.arrow-right { width:0px; height:0px; border-bottom:5px solid transparent; /* left arrow slant */ border-top:5px solid transparent; /* right arrow slant */ border-left:5px solid #2f2f2f; /* bottom, add background color here */ font-size:0px; line-height:0px; } 17.CSS3 calc() 的使用 calc() 用法类似于函数,能够给元素设置动态的值:/* basic calc */ .simpleBlock { width: calc(100% - 100px); } /* calc in calc */ .complexBlock { width: calc(100% - 50% / 3); padding: 5px calc(3% - 2px); margin-left: calc(10% + 10px); } 18.文本渐变 文本渐变效果很流行,使用 CSS3 能够很简单就实现:h2[data-text] { position: relative; } h2[data-text]::after { content: attr(data-text); z-index: 10; color: #e3e3e3; position: absolute; top: 0; left: 0; -webkit-mask-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0,0,0,0)), color-stop(50%, rgba(0,0,0,1)), to(rgba(0,0,0,0)));} 19.禁用鼠标事件 CSS3 新增的 pointer-events 让你能够禁用元素的鼠标事件,例如,一个连接如果设置了下面的样式就无法点击了。.disabled { pointer-events: none; } 20.模糊文本 简单但很漂亮的文本模糊效果,简单又好看!.blur { color: transparent; text-shadow: 0 0 5px rgba(0,0,0,0.5); }
2017年11月27日
164 阅读
0 评论
0 点赞
2017-09-07
SPA单页面应用(Vue)添加TalkingData统计
TalkingData的统计代码接入项目还是很简单的,而且他的统计操作也很方便,支持,自定义事件 H5的接入方法:页面插入下面代码:<script src="http://sdk.talkingdata.com/app/h5/v1?appid=你的appdi&vn=项目名称&vc=1.0.1"></script> 但是对于span单页面应用(如vue开发的webapp)就统计不到了。 上面的代码请求回来了一个talkingdata.js,talkingdata.js又引入了一个talking_release.js, 想了一下,应该是单页面应用路由切换不会触发事件,于是动手改它的源码,把两个js文件缓存到本地。 在vue中添加:router.afterEach((to, from, next) => { console.log(process.env.NODE_ENV) var script=document.createElement("script") script.setAttribute("type", "text/javascript") /*if(process.env.NODE_ENV == 'release'){ script.setAttribute("src", "/assets/js/talking_release.js") }else{ script.setAttribute("src", "/assets/js/talking.js") }*/ script.setAttribute("src", "/assets/js/talking.js") var heads = document.getElementsByTagName("head") if(heads.length) heads[0].appendChild(script) else document.documentElement.appendChild(script) }) 通过监测路由切换动态插入js,达到触发统计的目的,然而统计事件是触发了,但是页面并没有统计到,看了一下请求,发现参数中的pages为空,猜想应该是vue路由的#符号导致页面事件不能被监测到吧。 研究了一下它的源码 talking.js中createScriptTd()改为本地createScriptTd('/assets/js/sdk_release.js'); talking_release.js中通过监测页面的pagehide,beforeunload触发统计事件。H5Event.addEventListener(window, "pagehide", pageLogout), H5Event.addEventListener(window, "beforeunload", pageLogout), 动手添加一行H5Event.addEventListener(window, "hashchange", pageLogout),//extend moxiaonai for Single page application 通过监测hashchange,也让它触发统计。控制台看了一下,果然可以正常统计了。测了一下它的主动触发,也是ok的TDAPP.onEvent(“点击Banner广告”); tip:有点小问题,发现所有页面的离开率是100%,不清楚它的统计字段是什么,待跟客服沟通后再来补充。···跟talkingData官方沟通结果目前H5只支持多页面的统计,还不支持单页面的统计,如果使用单页面统计,请在单页面每一个按钮处埋点,通过自定义事件来统计页面访问次数,但不能统计页面转向;H5单页面统计目前我们已经提过相关需求,上面的方法虽然实现了页面的额统计,但是得到的数据并不是我们想要的,而且sdk在本地,如果官网更新,很可能会出现问题,查看了https://www.talkingdata.com 的请求,因为官网也是vue做的(框架应该是talkingData团队自己的iview),猜测做法是自定义事件。 最后还是采取了自定义事件的方法。router.afterEach((to, from, next) => { try { TDAPP.onEvent("leave"+from.path,to.path) TDAPP.onEvent("enter"+to.path,from.path) } catch(e){ } }) 基本拿到了想要的数据。期待talkingData团队更优秀的项目
2017年09月07日
157 阅读
0 评论
0 点赞
2017-08-22
Vue 中封装ajax统一处理 ajax 请求错误
封装axios,新建api.jsimport axios from 'axios' import NProgress from 'nprogress' axios.interceptors.request.use(config => { NProgress.start() return config }, error => { return Promise.reject(error) }) axios.interceptors.response.use(response => response, error => Promise.resolve(error.response)) function checkStatus(response) { NProgress.done() if (response.status === 200 || response.status === 304) { return response } return { data: { code: -404, message: response.statusText, data: response.statusText, } } } function checkCode(res) { if (res.data.code !== 200) { alert(res.data.message) } return res } export default { post(url, data) { return axios({ method: 'post', url, data: JSON.stringify(data), timeout: 30000, headers: { 'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/json; charset=UTF-8' } }).then(checkStatus).then(checkCode) }, get(url, params) { return axios({ method: 'get', url, params, timeout: 30000, headers: { 'X-Requested-With': 'XMLHttpRequest' } }).then(checkStatus).then(checkCode) } } 在组件中使用import api from '../api.js' // 改成对应的路径 export default { async mounted() { const { data: { code, data }} = await api.post('/comment/post', {title: 'title'}) if (code === 200) { console.log(data) } const { data: { code, data }} = await api.get('/comment/get', {page: 1}) if (code === 200) { console.log(data) } } }
2017年08月22日
197 阅读
2 评论
0 点赞
1
2
3
4
...
9