关于蜘蛛爬取网站

最近一个网站总是流量超出预期,后来检查了一下日志发现一个奇怪的现象~

t

 

这个都是蜘蛛来爬的记录~

这个是列表页,而且url组装的时候有点问题。。

算是程序一个bug,由于个人浏览的时候参数是第一个有效。而蜘蛛没有那么智能,所以就进入了一个死循环~~我不是故意的~~!!!!!我禁止了蜘蛛,可是蜘蛛仍然来爬!

 

Tp3.1.2安全

1.表单令牌
‘TOKEN_ON’=>true, // 是否开启令牌验证
‘TOKEN_NAME’=>’__hash__’, // 令牌验证的表单隐藏字段名称
‘TOKEN_TYPE’=>’md5’, //令牌哈希验证规则 默认为MD5
‘TOKEN_RESET’=>true, //令牌验证出错后是否重置令牌 默认为true
注意:{__TOKEN__}可以确定隐藏域的位置
用C(‘TOKEN_ON’,false);可以动态关闭令牌
手动验证$user = M(‘User’);$user->autoCheckToken($_POST);

2.字段类型验证
DB_FIELDTYPE_CHECK=>true启动字段类型验证,需要清空字段缓存,重新生成字段缓存

3.防止SQL注入
用条件预处理$model->where(‘id = %d’, $id)->select();

4.指定插入和更新字段
定义model的时候定义$insertFields属性和$updateFields属性,那么就可以设置插入的时候只能插入的字段以及更新
的时候更新的字段

可以用M(‘User’)->field(‘username’,’password’)->create();//指定插入的字段

5.目录安全文件
入口文件定义define(‘BUILD_DIR_SECURE’, true);
定义生成文件名字define(‘DIR_SECURE_FILENAME’, ‘index.html,default.htm’);
定义内容define(‘DIR_SECURE_CONTENT’, ‘Deny Access!’);

隐藏index.php终结版

IIS版本

低版本的服务器环境支持ISAPI_Rewrite的话,可以配置httpd.ini文件

内容如下:
RewriteRule (.*)$ /index\.php\?s=$1 [I]

高版本的可配置

<rewrite>
<rules>
<rule name=”OrgPage” stopProcessing=”true”>
<match url=”^(.*)$” />
<conditions logicalGrouping=”MatchAll”>
<add input=”{HTTP_HOST}” pattern=”^(.*)$” />
<add input=”{REQUEST_FILENAME}” matchType=”IsFile” negate=”true” />
<add input=”{REQUEST_FILENAME}” matchType=”IsDirectory” negate=”true” />
</conditions>
<action type=”Rewrite” url=”index.php/{R:1}” />
</rule>
</rules>
</rewrite>

nginx低版本不支持path_info可以用

location / {
if (!-e $request_filename) {
rewrite  ^(.*)$  /index.php?s=$1  last;
break;
}
}

apache需要开启rewrite,然后在根目录建立.htaccess文件

内容如下

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>

 

tp3.1.2缓存,日志,调试,模板,标签,视图

1.模板
默认在tpl目录下
默认后缀是.html,可以通过TMPL_TEMPLATE_SUFFIX来配置
如果启用分组,那么模板可能在tpl/分组名/目录下,可以配置TMP_FILE_DEPR来简化模板目录层次

2.赋值
$this->assign(‘name’, $name);

3.模版渲染
调用当前模块下当前操作$this->display();
调用当前模块下的其他操作$this->display(‘user’);//当前在index,注意不要带后缀
调用其他模块下的操作$this->display(‘Member:read’);
调用其他主题下的模板$this->display(‘Xp:User:read’);

display第二个参数是 设置编码,第三个参数是设置内容格式

DEFAULT_CHARSET =>’utf-8’网站输入默认编码
TMP_CONTENT_TYPE=>’text/htm’网站内容格式

4.模板替换路径

../Public 模板文件的上一层文件夹
__TMPL__ 两个下划线,模板的文件夹目录
__PUBLIC__ 入口文件夹下的Public目录
__ROOT__ 网站地址,不带域名
__APP__ 项目URL地址,不带域名
__URL__ 当前模块URL,不带域名
__ACTION__ 当前操作方法url,不带域名
_SELF__ 当前页面URL

可以配置TMPL_PARSE_STRING 来配置以上路径

5.获取解析内容
$content = $this->fetch();//参数类似display

6.模版引擎
‘TMPL_ENGINE_TYPE’ =>’PHP’//配置模版引擎
默认在模板中{$name}可以输入$this->assign(‘name’, $name);//其中{和$之间不能有任何空格
当然可以用TMPL_L_DELIM,TMPL_R_DELIM来配置左右定界符

7.系统变量
可以在模板中直接用系统变量,而不需要赋值
$Think.server 获取$_SERVER
$Think.get 获取$_GET
$Think.post 获取$_POST
$Think.request 获取$_REQUEST
$Think.cookie 获取$_COOKIE
$Think.session 获取$_SESSION
$Think.config 获取系统配置参数
$Think.lang 获取系统语言变量
$Think.const 获取系统常量
$Think.env 获取环境变量
$Think.version 获取框架版本号
$Think.now 获取当前时间(默认非时间戳)可以更改内容模板
$Think.template 获取当前模板
$Think.ldelim 获取模板左界定符
$Think.rdelim 获取模板右界定符

8.模板使用函数
{$name|function1|function=arg1,arg2,###}其中###来代替$name在参数中的未知
执行内部快捷函数并输出返回值{:C(‘DB_NAME’)}
执行函数不输出{~function()}

9.使用默认值
{$name|default=’默认值’}支持html

10.标签

标签名 作用 包含属性
include 包含外部模板文件(闭合) file
import 导入资源文件(闭合 包括js css load别名) file,href,type,value,basepath
volist 循环数组数据输出 name,id,offset,length,key,mod
foreach 数组或对象遍历输出 name,item,key
for For循环数据输出 name,from,to,before,step
switch 分支判断输出 name
case 分支判断输出(必须和switch配套使用) value,break
default 默认情况输出(闭合 必须和switch配套使用) 无
compare 比较输出(包括eq neq lt gt egt elt heq nheq等别名) name,value,type
range 范围判断输出(包括in notin between notbetween别名) name,value,type
present 判断是否赋值 name
notpresent 判断是否尚未赋值 name
empty 判断数据是否为空 name
notempty 判断数据是否不为空 name
defined 判断常量是否定义 name
notdefined 判断常量是否未定义 name
define 常量定义(闭合) name,value
assign 变量赋值(闭合) name,value
if 条件判断输出 condition
elseif 条件判断输出(闭合 必须和if标签配套使用) condition
else 条件不成立输出(闭合 可用于其他标签) 无
php 使用php代码 无

11.模板布局
LAYOUT_ON是配置是否开启布局,默认不开启
LAYOUT_NAME配置布局文件名称,默认为layout
布局文件中{__CONTENT__}替代内容

12.原样输出
literal标签能保持原样输出

13.日志
LOG_RECORD=>true开启日志记录
‘LOG_TYPE’ => 0 system 日志发送到php的系统日志 1日志通过邮件发送 3 默认文件 4sapi方式记录
手动记录日志Log::write($sql, Log::SQL);
试用Log::recode保存日志到内容,Log::save保存记录日志

14.异常处理
TMPL_EXCEPTION_FILE可以配置异常模板,其中模板中可以使用$e[‘file’]异常文件名
$e[‘line’]异常发生行数,$e[‘message’]异常信息,$e[‘trace’]异常的详细trace信息

15异常显示

SHOW_ERROR_MSG来配置是否显示异常,ERROR_MSGAGE显示错误信息,ERROR_PAGE错误或者异常指向页面

16.页面trace
SHOW_PAGE_TRACE来配置是否开启
TRACE_PAGE_TABS来配置显示的选项卡
trace($user,’标识’,’user’);//第一个是内容,第二个是标记,第三个是选项卡
保存trace通过PAGE_TRACE_SAVE来配置,可以配置保存那些选项卡下的内容

17.缓存
用DATA_CACHE_TYPE来配置默认数据库缓存形式,默认是文件
DATA_CACHE_SUBDIR=>true设置防止缓存目录大量文件存在
DATA_PATH_LEVEL=>2设置缓存目录层级

//缓存初始化
cache(array(‘type’ => ‘memcache’, ‘expire’=>60));
//缓存设置
cache(“list”, $list);
//缓存读取
$list = cache(“list”);
//删除缓存
cache(“a”, null);

$chache = cache(array(‘type’ => ‘memcache’));
$cache->set(‘name’, $name);//或者$chech->name = $name;
$cache->get(“name”);//$chache-name;
$cache-rm(‘name’);//unset($cache->name)

快速缓存可以用F方法

查询缓存可以用DATA_CACHE_TIME设置缓存时间
$model->cache(true)->select();//可以设置查询缓存时间和类型

静态缓存
HTML_CACHE_ON=>true开启静态缓存,HTML_FILE_SUFFIX 静态文件后缀HTML_CACHE_TIME 默认的静态缓存有效期 默认60秒 可以在静态规则定义覆盖

Tp3.1.2模型学习

1.模型定义

命名规则是除去表前缀的数据表名称,采用驼峰命名,并且首字母大写,然后加上后缀Model
其中tableName是不包含表前缀的数据表名称,一般用于模型和表名称不同时候需要定义
其中trueTableName是包含千醉的表名称,这就说如果表为数据库中实际操作的表
dbName是要对应的数据库,只有跨库操作才需要定义

2.模型实例化

$User = new Model(‘User’);//等效与$User = M(‘User’);
这样的没有办法进行业务相关的逻辑处理

$User = new CommonModel(‘User’);//第一个参数是模型名称,第二个是表前缀,第三个是数据库连接信息
这样就可以携程$User = M(“CommonModel:User”);//当时CommonModel必须继承系统的Model

自定义模块可以用D方法进行实例化 $User = D(‘News’);
D方法可以自动检测模型类,存在自定义则试用自定义,不存在则实例化Model基类,实例化过的模型不会重复实例化
D方法支持跨项目和分组调用D(“Admin://User”)实例化Admin项目中的User模型,D(“Admin/User”);实例化admin分组的User模型

实例化空模型可以使用new Model()或者 M();

‘DB_FIELDS_CACHE’=>false //可以关闭字段缓存,调试模式下默认是关闭的

3.连接数据库配置
return array(
‘DB_TYPE’ => ‘mysql’, // 数据库类型
‘DB_HOST’ => ‘localhost’, // 服务器地址
‘DB_NAME’ => ‘test’, // 数据库名
‘DB_USER’ => ‘test’, // 用户名
‘DB_PWD’ => ‘test’, // 密码
‘DB_PORT’ => 3306, // 端口
‘DB_PREFIX’ => ‘test_’, // 数据库表前缀
);

可以使用DB_DSN方式连接,可以用pdo形式

4.分布式数据库
return array(
‘DB_TYPE’ => ‘mysql’, //分布式数据库类型必须相同
‘DB_HOST’ => ‘192.168.0.1,192.168.0.2’,
‘DB_NAME’ => ‘test’, //如果相同可以不用定义多个
‘DB_USER’ => ‘test1,test2’,//帐号,如果一样可以只写一个
‘DB_PWD’ => ‘test1,test2’,//密码
‘DB_PORT’ => ‘3306’,//如果端口一样可以写一个
‘DB_PREFIX’ => ‘test_’,
‘DB_RW_SEPARATE’=>true,//默认读写不分离,需要分离请设置
可以配置多个主数据库
);

5.创建数据
create()可以创建数据对象,$user = D(‘User’);
$user->create();//默认获取post数组,验证数据源合法性,检查字段类型,判断插入还是更新
自动验证,自动完成,表单令牌验证,表单数据过滤,数据自动完成,生成数据对象(这个时候保存内存中)
只有当调用了add()或者save方法才会保存到数据库

6.ADD方法
$user = M(“User”);
$data = array(‘name’=> ‘新闻标题’, ‘content’ => ‘新闻内容’);

//方法一
$user->add($data);
//方法二
$user->data($data)->add();
//方法三
$user->create();//获取POST的数据
$user->add();

查询方法select返回多行记录而find只会返回一行记录;getField可以指定返回字段值

更新数据方式一

如果id是主见可以这样更新数据
$data[‘id’] = 1;
$data[‘name’] = ‘Joyous’;
$data[‘blog’] = ‘http://blog.phpfs.com/’;
$user->save($data);
否则用
$user->where(“id = 1”)->save(array(‘name’=>’李四’));

更新数据方式二
$data[‘name’] = ‘Joyous’;
$user->wher(“id = 5″)->date($data)->save();

//更新方式三
$user->create()->save();//更具 提交的post数据创建对象进行更新,需要主键

更新某个字段
setField($field, $value=”);//其中可以支持传递数组
setInc($field, $step = 1);//增加
setDec($field, $step = 1);//减少

删除记录支持order以及limit连贯操作

7.ActiveRecord

创建数据
$user->name = ‘Joyous’;
$user->email=’joyousphper@gmail.com’
$user->add();//将数据保存到数据库
同样,在我们用
$user->create();方法之后仍然可以用
$user->name = ‘Joyous’;//更改属性值
查询记录
$user->find(8);//这个只能查询主键
根据字段查询
$user->getByName(“Joyous”);//相当于$user->wherr(“name=’Joyous'”)->select();
//根据主键查询多个数据
$user->select(“1,2,3,6”);
更新记录
$user->find(1);//多了一次查询,可以用$user->id = 1;也可以
$user->name = ‘Joyous’;
$user->save();//保存数据
删除记录
$user->delete(2);//可以根据主键直接删除
$user->delete(“3,45”);

8.自动验证
$_validate属性,二维数组,其中array(验证的字段,验证规则,错误提示,[验证条件,附加条件])
验证的字段是来自表单的字段
验证规则可以系统的require,email,url,currency,number等
错误提示可以用$user->getError();获取
验证条件Model::EXISTS_VALIDATE 或者0标识存在字段就验证,Model::MUST_VALIDATE或者1必须验证 Model::VALUE_VALIDATE
2标识不为空则验证
附加规则,正则、函数,callback,confirm,equal,in等,默认用regex

自定义验证规则
$user = D(“User”);
$validate = array(array(‘verify’,’require’, ‘验证码必须’));
$user->setProperty(“_validate”, $validate);

多字段callback验证
protected $_validate = array(
array(‘user_id,good_id’, ‘checkIfOrderToday’, ‘今天已经购买过,请明天再来’, 1,’callback’, 1),
);

protected function checkIfOrderToday($data){
$map = $data;
$map[‘ctime’] = array(array(‘gt’,[开始时间]), array(‘lt’, [结束时间]));
if($this->where($map)->find())
return false;
else
return true;
}

patchValidate = true;在模型中定义就可以批量进行验证

check函数验证
$model->check($vale, ’email’);//默认用正则

9.命名范围
参考手册,主要是方便连贯操作
protected $_scope = array(
// 命名范围normal
‘normal’=>array(
‘where’=>array(‘status’=>1),
),
// 命名范围latest
‘latest’=>array(
‘order’=>’create_time DESC’,
‘limit’=>10,
),
);
使用
$Model->scope(‘normal’)->select();
生成SQL语句SELECT * FROM think_news WHERE status=1

目的,这样可以定义一个可以多次使用

10.自动完成
定义$_auto属性
默认填充时间是插入数据(插入,更新,插入和更新)的时候,默认插入规则是字符串插入有函数,回调,其他字段填充,字符串形式
array(‘status’, 1)//新增的时候把status的字段设置为1
array(‘password’,’md5′, 1, ‘function’);//新增数据的时候password字段进行md5处理
array(‘name’, ‘getName’, 1, ‘callback’);//name字段新增的时候回调getName方法
array(‘create_time’, ‘time’, 2, ‘function’)//更新的时候写入create_time当前最新时间

当然也可以自定义自动填充,参考自动验证

11.查询建议
虽然where语句中可以传入字符串和数组,但是建议用数组,默认试用and操作,如果需要更改之间逻辑,可以
$condition[‘_logic’] = ‘or’;

表达式查询,$map[‘字段’] = array(‘表达式’,’查询条件’);
其中表达式eq(=),neq(<>),gt(>),egt(>=),lt(<),elt(<=),like,between,not between,in,not in, exp

其中如果配置了DB_LIKE_FIELDS字段,那么配置的字段将进行模糊匹配

快捷查询
$map[‘name|title’] = ‘joyous’;
$user->where($map)->select();

12.字段排除
$model->field(‘id,name’)->select();//查询id和name字段
$model->field(‘create_time’,true)->select();//除了create_time之外的字段

13.事务支持
$user->startTrans();//需要数据库本身支持,比如mysql的MyISAM引擎不支持事务
if(成功) {
$user->commit();
} else {
$user->rollback();
}

14.高级模型
必须继承AdvModel
支持字段过滤,定义$_filter属性
支持字段序列化,定义$serializeField属性
文本字段定义$blobFields属性
只读字段类保护特殊的字段值不被更改,定义readonlyField属性
延迟更新需要$user->where(‘id=3’)->setLazyInc(‘score’, 10, 60);//用户积分延迟60s更新
数据分表定义$partition,其中array(
‘field’=>’name’,//要分表的字段,通常按照字段的值进行分表
‘type’ => ‘md5’,//分表的规则,包括id,year,mod,md5函数和首字母
‘expr’=>’name’,//分表辅助表达式 可选 配合不同的分表规则
‘num’=>’name’,//分表的数目
);

自定义返回类型,可以定义为对象,默认为数组

15.视图模型
继承ViewModel
定义viewFields属性
public $viewFields = array(
‘Blog’ => array(‘id’, ‘name’, ‘title’,’_table’=>’test.my_blog’),
‘Category’ => array(‘title’=>’cate_name’, ‘_on’ =>’Blog.category_id=Category.id),
‘User’ => array(‘name’=>’username’, ‘_on’ =>’Blog.user_id=User.id’),
);
//其中视图的表是用_table来定义,可以用_as来定义别名
_on来定义关联查询类型
定义join类型可以用_type
可以定义统计字段

使用视图
$model = D(“BlogView”);
$model->field(‘id,name,title,cate_name,username’)->where(“id>10”)->select();

16.关联模型
关联关系:一对一,一对多,多对多
定义$_link属性,可以动态定义,需要继承RelationModel类
其中mappint_type是关联类型;class_name关联的模型名,会自自动定位到相关数据表;
mapping_name是关联的映射名称,没有定义则试用class_name,如果class_name也没有则用数组索引
foreign_key外键默认为数据对象的_id,如果是User,那么外键就是user_id,如果不是则定义;
condition关联条件自动添加外键的值,如果是额外的需要定义;
mapping_fields关联要查询的字段,默认全部查询;
as_fields把关联的字段值映射成数据对象某一个字段的值

关联查询
$user=D(“User”);
$user->relation(true)->find(1);

关联操作可以参考手册内容

17.动态模型
$user=M(“User”);
$user->switchModel(“Adv”)->top10();//切换到高级模型执行top10查询
或者用$user = M(“AdvModel:User”)->top10();

ThinkPHP3.1.2笔记

1.开启trace

方法一:在配置文件中添加(默认在config.php,如果定义debug模式,可以定义在debug.php
SHOW_PAGE_TRACE => 1,
方法二:在入口文件
defined(“SHOW_PAGE_TRACE”, 1);
方法三:动态设置
C(‘SHOW_PAGE_TRACE’, 1);

使用方法
trace(‘展示代码’,’info’);

2.函数库

系统函数库和项目函数库不需要加载即可试用,扩展函数库需要加载才可以用
加载函数库文件可用配置”LOAD_EXT_FILE”=>’user,db’这样可以加载项目公共目录(common)下的函数库文件user.php和db.php
可以手动加载load(“@.user”);

3.类库

显示导入import(“Think.Util.Array”);//导入基类库Util/Array.class.php文件
导入当前项目类库可用import(“@.Action.UserAction”)或者import(“APP.Action.UserAction”);
可以参考import函数代码

别名导入
在配置目录alias.php中配置别名,即可试用import(“page”);

第三方类库存放在系统扩展目录Extend下的Vendor目录
可以用Vendor(“Zend.Filter.Dir”);导入第三方

自动加载
自动加载优先级从高到底:别名自动加载=》系统规则自动加载=》自定义路径自动加载
可以配置”APP_AUTOLOAD_PATH”=>’@.Common,@Tool’加载自定义下类库

4.URL模式

配置项URL_MODEL
普通模式为0
PATHINOF模式为1
Rewrite模式为2
兼容模式为3

推荐使用PATHINFO模式开发,如果空间不支持,可以试用兼容模式或者普通模式

5.空操作和空模块—方便定义错误处理页
如果定义了空操作那么如果一个方法不存在,即使存在模板文件也会优先定向到空操作
eg:比如一个控制器中定义了_empty方法,那么即使模板中有test.html模板,但是不存在testAction,那么请求test
方法的时候会优先定位到_empty方法中

6.模块分组
配置APP_GROUP_LIST 用逗号分开,设置默认分组DEFAULT_GROUP

7.伪静态配置
‘URL_HTML_SUFFIX’ => ‘shtml|html|xml’, 配置多个伪静态后缀

8.URL路由
开启路由URL_ROUTE_ON=>true

规则路由
格式
规则=> “分组/模块/操作?额外参数=值”
规则=> array(‘分组/模块/操作’, ‘额外参数=值’)
规则=>外部地址
规则=>array(‘外部地址’, ‘重定向代码’)
要点
:开头的是动态变量
外部地址可以引用动态变量采用:1,:2的方式
路由规则支持:id\d表示只能匹配数字
排除非数字变量:cate^add|edit
路由规则中的静态地址不分大小写

9.APACHE隐藏index.php入口文件
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>

10.ULR生成

在控制器中我们可以用U方法生成URL地址
比如U(“News/read?id=1”)
在不同的url模式下生成的url地址不同

在模板中我们可以用{:U(参数1,参数2…)}的方式生成URL

如果设置URL_CASE_INSENSITIVE=>true那么生成的url地址全是小写的

11.URL地址大小写
‘URL_CASE_INSENSITIVE’ =>true 这样就不区分大小写了

12.前置操作和后置操作可以参考手册

13.跨模块调用
A方法可以实现跨模块调用其他分组下的控制器.A[项目名://][分组名]模块名
A(“User”)当前模块下的user控制器
A(“Admin://User)调用admin项目的User模块
A(“Admin/User”)调用admin分组中的User模块
A(“Admin://Tool/User”)调用Admin项目Tool分组中的User模块

R方法可以调用一个模块下的一个操作方法。R[项目名://][分组名]模块名, array(‘参数1′,’参数2’);

14.自定义提示页面模板
TMPL_ACTION_ERROR => ‘Public:error’
TMPL_ACTION_SUCCESS=>’Public:success’
模板中可以用$msgtitle表示操作标题;$message页面提示信息;$status来表示状态 1表示成功;$waitSecond跳转等待时间
$jumpUrl跳转地址
如果是ajax提交,会自动调用ajaxReturn返回

15.重定向
在控制器中用redirect实现页面重定向功能;参数可以参考U方法

17.获取系统变量
在控制器中我们可以使用$this->方法名(“变量名,[过滤方法],[‘默认值’]);
其中方法名有_get,_post,_param,_request(REQUEST参数),_put,_session,_cookie($_COOKIE),_server($_SERVER)
_globals($GLOBALS)

可以设置默认过滤函数
‘DEFAULT_FILTER’ => ‘htmlspecialchars,strip_tags’

支持获取全部变量$this->_get();

可以试用$this->_param(0)获取PATHINFO中的第一个参数,以及获取get和post等参数,推荐使用

18.判断请求类型
isGet()判断是否是GET方式提交
isPost()判断是否是POST方式提交
isPut()判断是否是PUT方式提交
isDelete()判断是否是delete方式提交
isHead()判断是否是Head方式提交
isAjax判断是否是ajax提交,如果用Jquery类库则不需要添加隐藏域,否则需要添加一个隐藏域

19.Ajax返回
status 操作状态
info 提示信息
data 返回数据
$this->ajaxReturn(返回数据,提示信息,操作状态);

支持$data[‘status’] =1;$data[‘info’] = ‘test’;$this->ajaxReturn($data,’JSON’);

20.Action参数绑定
比如/News/read/id/1,绑定read方法,function read($id = 0) {
echo $id;
}

百度地图点聚合

需要引入
 <script type="text/javascript" src="http://api.map.baidu.com/library/TextIconOverlay/1.2/src/TextIconOverlay_min.js"></script> 
<script type="text/javascript" src="http://api.map.baidu.com/library/MarkerClusterer/1.2/src/MarkerClusterer_min.js"></script>
 然后写 var markerClusterer = new BMapLib.MarkerClusterer(map, {markers:markers});//点聚合  

百度地图标点

<script type="text/javascript" src="http://api.map.baidu.com/api?v=1.4"></script>
<script type="text/javascript">
var map = new BMap.Map("container");          // 创建地图实例  
var point = new BMap.Point(116.404, 39.915);  // 创建点坐标  
map.centerAndZoom(point, 14);                 // 初始化地图,设置中心点坐标和地图级别  
//控件
map.addControl(new BMap.NavigationControl());//平移缩放
map.addControl(new BMap.ScaleControl());//比例尺
map.addControl(new BMap.OverviewMapControl());//缩略图
map.addControl(new BMap.MapTypeControl());//地图类型
//地图标点(普通标点)
function addMarker(point){
	  var marker = new BMap.Marker(point);
	  map.addOverlay(marker);
}
var bs   = map.getBounds();    //可是区域
var sw = bs.getSouthWest();   //可视区域左下角
var ne = bs.getNorthEast();   //可视区域右上角
var lngSpan = Math.abs(sw.lng - ne.lng);
var latSpan = Math.abs(ne.lat - sw.lat);
var polygon = new BMap.Polygon([
                                new BMap.Point(sw.lng,sw.lat),//左下角
                                new BMap.Point(ne.lng,sw.lat),//左上角
                                new BMap.Point(ne.lng,ne.lat),//右上角
                                new BMap.Point(sw.lng,ne.lat)//右下角
                              ], {strokeColor:"blue", strokeWeight:6, strokeOpacity:0.5});
                              map.addOverlay(polygon);
for (var i = 0; i < 100; i ++) {  	
    var point = new BMap.Point(sw.lng + lngSpan * (Math.random() * 0.9), ne.lat - latSpan * (Math.random() * 0.9)); 	 
    addMarker(point);      
}
</script>

JS函数默认参数

写习惯了php的函数默认参数

function add($a = 12, $b = 20) {
	return $a + $b;
}

JS默认参数可以这样玩


function add(a, b) {
	var a = typeof a == 'undefined' ? 1 : a;//当然也可以用arguments[0]
	var b = typeof b == 'undefined' ? 2 : b;
	return eval(a+b);
}

有了默认的参数,妈妈再也不担心我少传递参数了!