编 写:晋哲
时 间:2016-03-04
说 明:因移动端页面样式都是原尺寸的二分之一,PC专题页固定模板直接引用移动端页面的样式还需要返工去将所有的数值型属性值改回来,为方便两端之间的样式切换,提高效率,建议此类专题使用SASS去写样式,并使用下面定义的函数。
//定义函数
@function math($num) {
@return $num / 2;
}
//SASS中使用函数,如以下常用的一些数值型属性
.icon {
top: math(40%);
margin: math(20px);
width: math(100px);
height: math(40px);
font-size: math(30px);
background-position: math(-10px) math(-20px);
background-size: math(240px);
}
//生成的移动端CSS代码
.icon {
top: 20%;
margin: 10px;
width: 50px;
height: 20px;
font-size: 15px;
background-position: -5px -10px;
background-size: 120px;
}
当需要生成PC端样式时,只需修改函数内的被除数即可。
支付宝升级补充文档
前言
所有以下的demo均是基于支付宝php utf-8编码的demo,其他情况请自行核对。
知识补充\变化
- 一个商户最核心的配置为:
- 商户支付宝账号id(以2088开头的纯16位数字)
- [公共基本配置]选用的编码格式(utf-8、gbk)
- [公共基本配置]跟支付宝通信用的证书(cacert.pem)
- 其他配置:
- 安全校验码(当sign_type=md5时使用)
- 商户私钥rsa_private_key.pem、支付宝公钥rsa_public_key.pem(当sign_type=rsa时使用)
- 新的请求接口为https://mapi.alipay.com/gateway.do?,而且代码里面不需要预先提交获取token
- 支付宝订单在3个月以后会关闭(3个月之内都可以发起退款),在关闭之后会主动推送一次。(这里不需要做任何的订单状态更新的处理)
- 支付成功同步的Post请求报文中的NotifyId会在10分钟以后过期。而这个NotifyId会关系到验签中的获取支付宝系统结果的返回是否为true(所以同步的报文以后再来做验签其实没有意义)
小结
接入方
- 给到商户的核心配置(商户支付宝账号id)
- 根据加密方式提供不同的“验签凭证”
- 注意是否签约自己需要的接口产品(不然请求会302跳转到错误码ILLEGAL_EXTERFACE)
资料引用
- 支付宝手机网站支付文档
- 其他接口需要签约之后到商户后台自行下载
- 支付宝我封装的demo(demo中的config.php可以找我配置)
关于定位的一些参考
整 理:朱 兵
时 间:2016-02-05
说 明: 定位的相关知识
摘要:关于定位,分为GPS定位和网络定位2种。GPS定位,精度较高,可达到10米,但室内不可用,且超级费电。网络定位,分为wifi定位和基站定位,都是通过获取wifi或者基站信息,然后查询对应的wifi或者基站位置数据库,得到的定位地点。定位数据库可以不断完善不断补充,所以,越定位越准确。
一、常见的定位:
①GPS全球定位。
常见的GPS定位的原理可以简单这样理解:由24颗工作卫星组成,使得在全球任何地方、任何时间都可观测到4颗以上的卫星, 测量出已知位置的卫星到用户接收机之间的距离,然后综合多颗卫星的数据就可知道接收机的具体位置。
在露天环境下效果较好,获取位置信息非常精确。适合移动设备。
缺点:在地铁等位置效果较差
②IP地址定位。
适用于接入互联网的设备,通过浏览器是将位置信息发送给 ISP 服务商来解析,其IP 地址与服务商所在位置有关,可能与用户所在位置不同,所以这种方式的解析容易出现偏差。
③WiFi定位。
设备只要侦听一下附近都有哪些热点,检测一下每个热点的信号强弱,然后把这些信息发送给网络上的服务端。服务器根据这些信息,查询每个热点在数据库里记录的坐标,然后进行运算,就能知道客户端的具体位置了。一次成功的定位需要两个先决条件:客户端能上网 ,侦听到的热点的坐标在数据库里有。
优点:这种方式与GPS效果同样精确,适用于室内环境的移动设备。
- 你的这个wifi信号,如果在数据库中没有被记录在案,那就没法定位了。比如,如果你买了个新的无线路由器,靠它肯定是没法帮助你的移动设备定位的。
- 数据更新有延迟,WIFI覆盖并不大,局限
原理说明:当你的移动设备需要使用wifi定位的时候,它会搜索周围的wifi信号,同时在数据库中搜索,得到地理位置的数据,加上定位提供商收集的海量数据,能够构建出信号的“指纹”,比基站定位更精准。
④基站定位
我们把手机基站的覆盖范围想像成一个个以基站为圆心的圆,需要定位时,手机就向周边多座基站发送测量信号,并计算这些测量信号到达基站所需要的时间,推算出手机距离基站的直线距离,再经过数学运算,手机位置坐标就可由3个基站圆的交点来确定。
优点:LBS定位的优势是方便、成本低,因为它是通过手机进行定位的。理论上说,只要计算三个基站的信号差异,就可以判断出手机所在的位置,而且用户所持终端只需一部手机即可。因此,只要用户手机有信号,就可以随时进行位置定位,而不受天气、高楼、位置等影响。
缺点:定位精度随所处位置基站数不同会有变化。
百度地图等在web开发时并不提供相关api
二、测试结果:
初步得到的结果:GPS>WiFi/基站>IP
三、业务说明:
2、web开发的话
浏览器定位插件,封装了标准HTML5定位,并且包含纠偏模块。
备注:获取经纬度数据,想获得地址,需要纠偏,再使用接口获得。
鉴于该特性可能侵犯用户的隐私,除非用户同意,否则用户位置信息是不可用的。
Internet Explorer 9、Firefox、Chrome、Safari 以及 Opera 支持地理定位。
注释:对于拥有 GPS 的设备,比如 iPhone,地理定位更加精确。
更多可参考geekman的文章:http://blog.geekman.vip/archives/446
★浏览器定位,最好使用在手机浏览器上,会更加准确,也更加符合使用场景。PC浏览器上,建议使用IP定位。
通过网络获取IP信息,然后查询IP数据库,获取相应的地址信息。
IP数据库也是可以完善补充,越来越丰富的,所以也是越使用越准确的。
但如果IP有跳转,有篡改等,那么IP定位就会不准确了。
demo:http://developer.baidu.com/map/jsdemo.htm#i8_2
具体api地址在:http://api.xinfotek.com/apidoc/doc/
1、js是浏览器端,而web是服务端。
2、在使用上Web更简单,若只想使用服务,直接通过调用接口获取结果的话,并且需求量并不大的 时候,建议使用web。(百度js调用次数不限)
3、想展示地图,或者超过接口限制,比较复杂的web开发,想要的功能并没有提供相应的接口,会需要用到js。
秘钥分为浏览器端,服务端,
引用微信js即可使用
示例一:使用微信内置地图查看位置接口
wx.openLocation({
latitude: 0, // 纬度,浮点数,范围为90 ~ -90
longitude: 0, // 经度,浮点数,范围为180 ~ -180。
name: '', // 位置名
address: '', // 地址详情说明
scale: 1, // 地图缩放级别,整形值,范围从1~28。默认为最大
infoUrl: '' // 在查看位置界面底部显示的超链接,可点击跳转
});
wx.getLocation({
type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
success: function (res) {
var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
var speed = res.speed; // 速度,以米/每秒计
var accuracy = res.accuracy; // 位置精度
}
});
四、其他说明



【前端技术文档】gulp spriter 插件使用
整 理:肖雅君 时 间:2016-02-05 说 明:gulp-css-spriter 将css代码中的切片图片合并成雪碧图
下载链接:https://nodejs.org/en/ 下载后直接安装即可。
Cmd
输入命令:Node –v 看是否返回node版本号,若是返回则安装成功。
输入命令:npm –v 同上是否返回npm的版本号
如下图:则是安装成功。
Ps: NPM是基于命令行的node包管理工具,它可以将node的程序模块安装到项目中,在它的官网https://npmjs.org/ 中可以查看和搜索所有可用的程序模块。
直接输入d: 按回车键,进入d盘,再进入到安装文件夹,如下图:
遇到的问题:
参考资料中有sudo npm install –g glup安装命令,但是是出错的。
Sudo是以管理员身份执行命令,是切换到最高用户权限,su是切换用户,这是linux里才有的,windows是没有的。
将sudo去掉,用npm install -g gulp安装也是不行的。
使用npm install --global gulp是可以安装的,但是有一个warn警告。
查看版本号也是能查看到的:
建立gulpfile.js文件,作为它的主文件,放入到自己的项目目录中。
然后在gulpfile.js中定义自己的任务。
功能:将css代码中的切片图片合并成雪碧图
(1)安装gulp-css-spriter
输入命令npm install gulp-css-spriter
安装成功后自己建的文件里会产生node_modules文件夹,里面会有一个刚安装的gulp-css-spriter文件夹。
(2)配置gulpfile.js文件
var gulp = require('gulp'),
spriter = require('gulp-css-spriter');
gulp.task('css', function(){
var timestamp = +new Date();
//需要自动合并雪碧图的样式文件
return gulp.src('styles/style.css')//雪碧图的原路径文件
.pipe(spriter({
// 生成的spriter的位置
'spriteSheet': 'combine/images/sprite'+timestamp+'.png',
// 生成样式文件图片引用地址的路径
// 如下将生产:background:url(images/sprite20160205.png)
'pathToSpriteSheetFromCSS': 'images/sprite'+timestamp+'.png'
}))
//产出路径
.pipe(gulp.dest('combine'));
}); //产出路径
(3)执行编译输入命令:gulp css
(4)编译前后文件目录截图对比
a.编译之前:
合并前文件目录:
合并前style.css样式:
合并前图片文件夹:
b.编译之后:
合并后文件目录:
combine文件夹里的文件:
combine里的style.css:
combine里的图片文件夹:
(5)可能出现的问题:
在编辑后可能会出现如下问题:
Cannot find module ‘gulp-minify-css’;
需要再次安装gulp-minify-css。执行命令:npm install gulp-minify-css
安装完毕后再次编译:(点击可查看动图编译过程)
gulp-css-spriter默认会对样式文件里,所有的background/background-image的图片合并,但实际项目中,我们不是所有的图片都需要合并。
background-image: url(../images/data3.png?__spriter);//有?__spriter后缀的合并
background-image: url(../images/part-bg.png); //不合并
修改下面文件可以按需合并:
node_modules\gulp-css-spriter\lib\map-over-styles-and-transform-background-image-declarations.js
48行开始的if-else if代码块中,替换为下面代码:
位置:
// background-image always has a url 且判断url是否有?__spriter后缀
if(transformedDeclaration.property === 'background-image' && /\?__spriter/i.test(transformedDeclaration.value)) {
transformedDeclaration.value = transformedDeclaration.value.replace('?__spriter','');
return cb(transformedDeclaration, declarationIndex, declarations);}
// Background is a shorthand property so make sure `url()` is in there 且判断url是否有?__spriter后缀
else if(transformedDeclaration.property === 'background' && /\?__spriter/i.test(transformedDeclaration.value)) {
transformedDeclaration.value = transformedDeclaration.value.replace('?__spriter','');
var hasImageValue = spriterUtil.backgroundURLRegex.test(transformedDeclaration.value);
if(hasImageValue) {
return cb(transformedDeclaration, declarationIndex, declarations);}
}
再次执行即可。
参考链接:
https://github.com/laoshu133/gulp-css-spritesmith
https://github.com/aslansky/css-sprite
【前端技术文档】PS快速切图方法
整 理:贾会迎、晋哲 时 间:2016-02-05 说 明:PS处理同类型不同尺寸图标的快捷方法
问题:当同一版块中的每个图标的宽高各异时,在切图时需要为这些图标设置一个统一的宽高,方便样式统一编写。如何快速准确的确定切图尺寸,同时分成两套不同状态样式?
三、统一颜色样式(将绿色图标改为灰色)
1、提取颜色值,可保存至背景色

2、在图层空白处双击,调出“图层样式”面板,设置“颜色叠加”

3、图标颜色改变为灰色(效果)

四、将图标水平垂直居中,多个图标重叠显示,来确定图标的准确尺寸。

五、确定图标大小,逐一显示并保存
1、裁切透明像素,获得图标的准确大小

2、查看此时“图像--画布”大小,根据图标实际需要设置最大宽高值,最好设置为偶数,以方便样式设置。如下图,高度可以设42px、46px、50px等等

六、设置第二套状态样式(如图绿色)。
1、提取交互图标的颜色,可保存在前景色中

2、在图层空白处双击,调出“图层样式”面板


3、选择打开“颜色叠加”面板,设置叠加的颜色

4、在图层区域右击,选择“拷贝图层样式”

5、选中其他图层,右击选择“粘贴图层样式”,后逐一显示并保存图片。

HHuploadify(基于Huploadify)的文件上传插件
时 间:2016-02-05
说 明: 上传图片的插件
一、简介
二、安装
获取代码:下载HHuploadify的源代码。
网页中引入jquery和css
<script src="jquery-2.2.0.min.js"></script>
<script src="jquery.HHuploadify.js"></script>
<link rel="stylesheet" href="HHuploadify.css">
三、使用方法:
3.1 上传多张(一组)图片
<div id="upload"></div>
<script>
$('#upload').HHuploadify({
fileTypeExts:'*.jpg;*.png;*.gift',//允许上传的文件类型
uploader:'sub/upload_sub.php' // 必须的,必须指定用来处理上传逻辑的后端处理URL
});
</script>
3.2 单张图片上传
<div id="upload"></div>
<script>
$('#upload').HHuploadify({
fileTypeExts:'*.jpg;*.png;*.gift',
isSingle:true,
uploader:'sub/upload_sub.php '// 必须的,必须指定用来处理上传逻辑的后端处理URL
});
</script>
js中默认的参数如下所示:
fileTypeExts:'*.*',//允许上传的文件类型,格式'*.jpg;*.doc'
uploader:'',//文件提交的地址
auto:true,//是否开启自动上传
method:'post',//发送请求的方式,get或post
multi:true,//是否允许选择多个文件
isSingle:false,// 是否是单个文件上传,如果是单个文件上传,选择文件后,上传按钮会消失,multi也会被强制设定为false
formData:null,//发送给服务端的参数,格式:{key1:value1,key2:value2}
fileObjName:'file',//在后端接受文件的参数名称,如PHP中的$_FILES['file']
fileSizeLimit:2048,//允许上传的文件大小,单位KB
showUploadedFilename:false,//是否显示上传文件名
showUploadedPercent:false,//是否实时显示上传的百分比,如20%
showUploadedSize:false,//是否实时显示已上传的文件大小,如1M/2M
buttonText:'选择文件',//上传按钮上的文字
itemTitle:false,// 该上传item区域的标题:该值将作为上传按钮的提示语,上传时,会显示在左上角,注意,每一个上传区都会有,所以尽可能再isSingle=true的情况下使用
removeTimeout: 1000,//上传完成后进度条的消失时间,单位毫秒
itemTemplate:itemTemp,//上传队列显示的模板
onUploadStart:null,//上传开始时的动作
onUploadSuccess:null,//上传成功的动作
onUploadComplete:null,//上传完成的动作
onUploadError:null, //上传失败的动作
onInit:null,//初始化时的动作
onCancel:null,//删除掉某个文件后的回调函数,可传入参数file
onClearQueue:null,//清空上传队列后的回调函数,在调用cancel并传入参数*时触发
onDestroy:null,//在调用destroy方法时触发
onSelect:null,//选择文件后的回调函数,可传入参数file
onQueueComplete:null//队列中的所有文件上传完成后触发
<script>
$('#upload').HHuploadify({
auto:true,
fileTypeExts:'*.jpg;*.png;*.gift;*.doc',//允许上传的文件类型
isSingle : true,//上传一张图片图片
fileSizeLimit:300,//图片最大300KB
showUploadedSize:true,//实时显示已上传的文件大小,如1M/2M
method:'post',//发送请求的方式,get或post
formData: {item_id: <?php echo $item_id;?>},//传递到sub端的参数
uploader:'sub/upload_sub.php',
onUploadComplete:function(file,data) {
alert('图片上传成功'),
}
});
</script>
前端半年水平
一、移动端
移动端dpr适配知识点
移动端性能优化
二、项目流程
团队协作完成流程页面能力
独立完成小型项目能力
三、CSS预处理器
Sass(项目实现统一使用Sass编写样式)
postCSS
四、前端标准/规范
ECMAScript3/5
ECMAScript6
五、编程语言
JavaScript
Node.js
六、包管理器 npm
七、JS框架
Angular
React
八、前端项目构建工具
gulp
grunt
FIS
九、代码组织(模块化)
类库模块化 CommonJS/webpack
业务逻辑模块化 bower
文件加载 Require
模块化预处理器 Browserify
十、软技能
知识管理/总结分享
沟通技巧/团队协作
需求管理/项目管理
交互设计/可用性/可访问性知识
关于ip的那些事
编 写:袁 亮
时 间:2014-05-20
说 明:关于ip的那些事
一、ip传递过程
1、【真实客户端】 ==> [多级代理服务器] ==> [CDN加速] ==> [前端代理nginx|squid] ==> 【apache】==> 【PHP】
2、中文括号的是必然会经过的,英文括号是可能经过的
3、标准的ip传递是REMOTE_ADDR和HTTP_X_FORWARDED_FOR,前一个跟当前服务连接的真实ip,后一个是请求到前一个ip之前,经过了哪些代理
4、REMOTE_ADDR是不可伪造的,HTTP_X_FORWARDED_FOR是可以任意修改的
5、按标准,每传递到下一层,都会将上一层的实际ip地址加入到HTTP_X_FORWARDED_FOR中,继续传递
6、对每一层来说,只有上一层的时间地址是可信的(REMOTE_ADDR),HTTP_X_FORWARDED_FOR均有风险
7、真实情况中,到了cdn或者前端代理之后,ip传递都是可信的(我们自己可控制),之前的都有篡改的危险
二、各服务的真实ip传递情况
1、CDN 快网的cdn会将用户的实际地址或者代理服务器地址传递到后面的服务中
$_SERVER["HTTP_USER_IP"] 【不用快网的时候可伪造】
$_SERVER["HTTP_FW_ADDR"] 【不用快网的时候可伪造】
测试了一个新的cdn测试,没有传递真实ip过来
2、nginx代理的情况下,可以使用x_real_ip来获取真实ip(有cdn的时候,该值获取的是cdn的ip地址)
$_SERVER["HTTP_X_REAL_IP"] 【不用nginx的时候可伪造】
3、$_SERVER["HTTP_CLIENT_IP"] :代理服务器发送的客户端真实ip【可伪造】
三、现在使用的获取ip函数
a、如果有HTTP_CLIENT_IP,则该ip为用户ip(可被伪造)
b、如果有HTTP_X_FORWARDED_FOR,则将HTTP_CLIENT_IP也加入到HTTP_X_FORWARDED_FOR,判断HTTP_X_FORWARDED_FOR中的ip是否是内网的,取第一个非内网的ip为客户端真实ip
c、经过以上两步还没有取到ip的话,则根据REMOTE_ADDR取用户的ip
ps:该函数的问题在于,前面两个的ip都是可以被任意伪造改写,从而导致获取不到用户的真实ip情况
四、附:(线上使用的获取ip函数)
function getIp(){//获取IP函数
$ip = false;
if(!empty($_SERVER["HTTP_CLIENT_IP"])){
$ip = $_SERVER["HTTP_CLIENT_IP"];
}
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
if ($ip) {
array_unshift($ips, $ip);
$ip = FALSE;
}
for ($i = 0; $i < count($ips); $i++) {
if (!preg_match("/^(10|172\.16|192\.168)\./", $ips[$i])) { // 判断是否内网的IP
$ip = $ips[$i];
break;
}
}
}
return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);
}
实习生须知
1、记下我手机号 15850657245 2、把你们的手机号发送给我 3、加入我们微信群 不知道的找我 4、每周必须发周报,周报要求见:http://blog.geekman.vip/archives/59 5、临时请假必须提前通知我,回来补假条,平时请假需要找我说明,并填写请假单找我签字




























