??xml version="1.0" encoding="utf-8" standalone="yes"?>国产成人 亚洲欧洲,中文字幕亚洲综合久久综合,亚洲国产精品无码中文lvhttp://www.tkk7.com/ljy032/archive/2008/01/04/172653.html风雨兼程风雨兼程Fri, 04 Jan 2008 01:43:00 GMThttp://www.tkk7.com/ljy032/archive/2008/01/04/172653.htmlhttp://www.tkk7.com/ljy032/comments/172653.htmlhttp://www.tkk7.com/ljy032/archive/2008/01/04/172653.html#Feedback0http://www.tkk7.com/ljy032/comments/commentRss/172653.htmlhttp://www.tkk7.com/ljy032/services/trackbacks/172653.htmlGoogle排名优化Q面向搜索引擎的|站设计

内容摘要Q?br /> 目前中文|站在整个互联网中的影响q比较小Q这主要是由于中文网站M的水qI技术上Q内容上Q都q相对落后造成的,最主要的表现有Q?br />

  1. 行业知识Q不知道搜烦引擎对吸引的新用L(fng)重要性,在搜索引擎排名服务中q求“?c)相?#8221;Q购C些其实没有太多实际意义的行业关键词。其实能够用戯入的关键词越多,其目标性越强,q样的客户h(hun)D高。用戯够直接定位到产品具体内容|到网站首|价值的多;
  2. 发布技术:|站的网进入Google的烦引量非常,主要是由于大量用动态网造成的。需要将动态页面链接改写成静态链?/a>Q?
  3. 面设计Q页面标题重复,关键词不H出Q过渡用JavaScript脚本/囄/Flash{不适合搜烦引擎索引的非文本形式Q?
而以上这些问题的Ҏ(gu)原因q是|站自n~Z日志l计分析造成Q因此无法看到SEO对网站自w生的巨大影响?

SEO的目的是通过一些简单的{略Q让|站自n的水q_互联|中有一个真实的体现?br /> |站l构设计中面向搜索引擎的优化注意事项包括Q?/p>

Q注意:本网站设计本w就利用了其中一些方法)?

什么是PageRank

Google{新一带搜索引擎的优势之一在于不仅索引量很大,而且q将最好的l果排在搜烦l果的最前面Q具体的原理可以参?a >Google の秘?- PageRank 徹底解説一文,PageRank单的说类gU技论文中的引用机制Q谁的论文被引用ơ数多,谁就是权威。在互联|上PageRank是Z|页中相互链接关pȝ分析得出的?br />

此外Q从计算Ҏ(gu)角度阐述PageRank机制q有q篇文章Q?a >http://pr.efactory.de/里面有更详细的PageRank法说明和各U清晰的型个案分析Q?br />
比如Q子中D条的重要?br /> B <=> A => C  
Vs  
B <=> A <=> C   Q好Q?br />
面数量因素Q?br /> B <=> A <=> C
Vs
F <=\   /=> G
B <=> A <=> C   Q好Q?br /> D <=/   \=> E

一个意想不到的l论Q?br /> (B <=> A <=> C)      ( E <=> D <=> F)
Vs
(B <=> A <=> C)  <=> ( E <=> D <=> F)
PageRank升高的只是被链接?个首A(ch)和DQ而网站子面的PageRankq_会略有下降。同Ӟ一个网站进入Google的烦引量大其受cM因素影响小?br /> PageRank不对U的面互链Q?br /> Google会用BadRank之类的算法进行纠正,而且一个网늝有来?#8220;与其自n不相U?#8221;的高PageRank站点的链接,而自w又~少_数量和质量的反相链接的话Q其PageRank会自动降低ؓ0QA(pr=7) <=> B(pr=0)
单的说就是:偶尔要被权威站点反相链接不算敎ͼ要被_多的权威站点引用才能提高自n|页的PageRank?br /> Web链分析法lDQ南京大学论文) 更多论文可以通过搜烦Q?#8220;filetype:pdf google pagerank anchor text bayesian”得到

链接是一?/a>

在互联网的vz中Q最重要的就是互联互通,不被其他|站引用的网站就?#8220;信息孤岛”?#8220;酒好也怕藏的深”Q也许这话说h有点像垃N件广告,但事实就是这栗所以如果做|站的目的不是孤芌赏,需要积极的推广自己的网站?span style="font-weight: bold">
通过搜烦引擎推广自己需要注意以下几个方面:

  1. 以量取胜Q不一定加入传l门L(fng)站的分类目录才是|站推广Q来自其他网站的M反相链接都是有用?br /> |站推广比较l典的方式就是加入比较大型门L(fng)站的分类目录Q比如:Yahoo!Q?a >dmoz.org{。其实这里有一个误区:不一定非要加入大型网站的分类目录才是|站推广Q因为现在搜索引擎已l不再只是网站目录的索引Q而是更全面的|页索引Q所以无论来自其他网站Q何地方的反相链接都是非常有h(hun)值的Q哪怕是出现在新L道,论坛Q邮件列表归档中。BloggerQWeblog的简Uͼ们也许最深刻地理解了“链接是一?#8221;q句话的含义Q由于Blog的内容之间有大量的相互链接(他们之间利用RSS很容易进行链接大量传播)Q因此最l常被引用的Blog面在搜索引擎中的排名往往比一些大型商业网站的面q要高。而W(xu)IKIq样的文档管理系l更加突Z良好l构Q良好引用的特征。而目前很多网站通过在各UWIKI/留言中灌注垃圾留言的方法,q种方式是非怸可取的。这U链接不E_Q?
  2. 以质取胜Q被PageRank高的|站引用能更快地提高PageRank
    数量只是关键因素之一Q来自PageRank高的面的链接还能更快的提高被链接目标的PageRankQ我只是一些文章投E在?a class=" snap_noshots" >ZDNet中国上,׃面上有文章出处链接Q相应网和|站整体的PageRankq了一D|间后有了很大的提升。有时候被什么样的网站引用有时候比引用ơ数多更重要。这里我要特别感谢的是,当时ZDNet中国是唯一遵@了我的版权声明的要求表明了文章出处,q且有反盔R接的|站?br /> 按照q个原则Q能够名列Yahoo!和DMOZq样的大型权威目录的?层是非常有h(hun)值的?
  3. 了解搜烦引擎?价D"Q?br /> Lucene?/a>q篇文章被Jakarta.apache.org?a >lucene目引用以后Q这文章就成ؓ了所有页面中PageRank最高的面Q而Google支持的一些项目,比如Q?a >Folding@HomeQ让我一直怀疑他们对政府Q教育和非盈利组l的站点有特别加分,毕竟.org .edu才代表了互联|的实质Q分权和׃n?br /> 但更合理的解释是Q?org很多都是开放技术^台的开发者,他们会在首页q样的地方加入Powered By Apache, Power by FreeBSD之类的链接表C对其他开源^台的重Q所以象Apache, PHP, FreeBSDq样的开源站点在GOOGLE中都有非帔R的PageRank。而在.eduq些站点中,很多都是学术性比较强的文档,以超链接形式标明参考文献的出处已经成ؓ一U习(fn)惯,而这也无疑正是PageRank最好的依据?br /> 注意Q不要通过Link Farm提高自n的站Ҏ(gu)名:Google会惩|那些主动链接到Link Farm站点以提高自w排名站点,相应站点的页面将不会被收入到索引中。但如果你的面被别的Link Farm链接了也不必担心Q因U被动的链接是不会被惩罚的?/span>
  4. 不要吝啬l其他网站的链接Q如果一个网只有大量的q入链接Q而缺乏导出链接,也会被搜索引擎认为是没有价值的站点。保证你的网站能够帮助搜索引擎更准确地判断哪些是对用h有h(hun)值的信息Q也是说如果你的网站只有外部反向链接而没有导出链接的话,也会对你的网站在搜烦l果中的表现带来负面影响。当然网站中q一个导出链接都没有的情况非常罕见,除非你是Lq么做。正常情况下大家都会自然地在|页中加上一些其他网站的链接Q带领访问者去到我们认为重要或能够提供更多有h(hun)g息的地方Q?

另外在推q自q站之前也?dng)R先需要了解自q站目前在一些搜索引擎中的知名度Q原理非常简单,可以参?a >如何评h(hun)|站的h?/a>一文?/p>

|站推广只是手段Q如何突出内宏V让需要相关信息的用户能够快的找C的网站才是目的,PageRank高ƈ不代表像Yahoo!q样的门L(fng)点就能在所有搜索结果中排名靠前Q因为搜索引擎的l果是搜索关键词在页面中的匹配度和页面的PageRank相结合的排名l果。因此第二个要点Q如何突出关键词?br />

如何H出关键词:面向主题(Theme)的关键词匚w

  1.  Theme Engine正在逐步过PRQ成为结果排序中更主要的因素Q可以比较一下以下现象:
    • Z么查“新闻”Q?#8220;汽R”之类的文字,各种门户|站的首不在第一位?要知道他们的面中都有相应频道的链接文字?
    • 一新闻页面中Q搜索引擎如何不通过模板匚wQ自动将新闻的主体和面中的头Q栏目导航条Q页部分的内容区分开的?
    其实以上问题都可以归lؓ|页内容摘要的提取策略和关键词在其中的命中:
    首先能够描qC个页面内容的分成以下几种cdQ?br />
    1. 铑օ文字描述Qinbound link text
      http://www.searchenginedictionary.com/terms-inbound-link.shtml
    2. HTML面标题Qtitle 好标题一般会页面中最重要的关键词攑֜最前面Q比如:ABC-10型吸器 - XX家电(sh)?
    3. HTML内容MQcontent text
    4. 铑և文字Qoutbound link text
    如果按照以下规则Q?br /> 一个页面中关键词命中权重:铑օ文字 > HTML标题文字 > HTML面M内容 >> 出链文字Q以上现象就比较好解释了?br /> 铑օ文字是页面上看不见的Q但铑օ文字对被链接面有巨大的作用Q在C搜烦引擎在关键词匚w的过E中Q匹配的q程不只看当前页面的内容摘要Q很大程度上Q不只看q个|页自己说自己有什么内容,q要看别人如何链接时Q如何描qC的网站别人怎么U呼你,比你自己说自己更重要。?br /> 比如查:“世界卫生l织”Q返回结果中?http://www.who.int/ 而这个页面中是没有中文的Q之所以能匚w上,是因为很多链接它的中文网站用了Q?lt;a >世界卫生l织</a>Q所以,q个面中不存在的中文关键词也成Z面摘要的一部分。这样一惻I可以知道链出链接的文字其实是ؓ被链接的子频道首|者内容详情页服务的。对自n面的关键词密度只有负面的媄响,q也是Google一个页面中链接不要过100个的原因Q他Ҏ(gu)不烦?00个链接以后的内容。按照以上规则,搜烦引擎一新闻详情页中的新闻内容提取出来是把页面上所有带HTTP链接的文字都LQ就是新ȝ内容部分了,更精一些可以通过取最长文本段落等{略实现Q而很多网站首|频道首页中几乎全部都是链接,l过搜烦引擎分析的结果就是:什么内容也没有Q能够被命中的关键词仅仅是别人链接你用的“|站首页”和频道标题Title中的站点名称{的几个关键词,而页面中其他的文字则q远不如相应子频道和具体内容面的匹配度高,而搜索引擎能够通过以上规则Q让用户更快的直接定位到有具体内容的内容详情面。因此希望通过一个首,可能多的命中所有希望推q的关键词是不可能的?a >让网尽可能多的q入搜烦引擎的烦?/a>Q然后把握好整个|站的主题风格是非常重要的,让网站的主题关键词能够比较均匀的按照金字塔模式分布到网站中可以参考:|站的主题金字塔设计          |站名称Q用户通过1Q?个抽象关键词Q?br />          /       \
        子频?   子频? Q用户通过2Q?个关键词命中Q?br />    /    \      /    \
    产品1  产品2 文章1 文章2 (用户通过3Q?个关键词命中Q这U用h有h(hun)?

  2. 不要I着标题Q空着<title></title>无异于浪费了最有h(hun)值的一块阵圎ͼ
    不要使用meta keywords/description
    传统的页面中QHTML面中会有类g下的隐含信息Q用于说明当前网늚主要内容关键字:
    <header>
        <meta name="keyword" content="mp3 download music...">
    </header>
    后来׃q种人工d关键词的方式被滥用,大量|页中ؓ了提高被搜烦引擎命中的概率,l常d一些和实际|页内容无关的热门关键比如:“music mp3 download”{,所以新一代的搜烦引擎已经不再兛_面头文件中的h工meta keyword声明Q而页面标题在搜烦引擎的关键词的命中命中过E中往往有着更高的比重,如果一个关键词在标题中命中会比在页面中命中有更高的得分Q从而在相应的搜索结果排名中更靠前?
  3. 标题长度和内容:不要q长Q一般在40个字(80个字?以内Qƈ充分H出关键词的比重Q?br /> 如果更长的标题搜索引擎一般会忽略掉,所以要可能将主要关键词放在标题靠前的位置。省略掉不必要的形容词吧Q毕竟用户主要通过名词来找到需要的内容。标题内容:量用一些别人可以通过关键词找到的字眼Q也别太q头Q如果标题中的字Dq?半内容中都没有,有可能被搜烦引擎排除出烦引)Q因此基于web日志中来自其他搜索引擎的关键词查询统计非常必要?
  4. 如果|页很多的话Q尽量用不同的|页标题Q争取让自己|站的内Ҏ(gu)多的q入搜烦引擎索引范围Q?br /> 因ؓ搜烦引擎会根据页面内容的怼度把一些内容当成重复页面排除出索引范围Q?br /> http://www.chedong.com/phpMan.php是我的网站上的一个小应用Q一个web界面的unix命o手册Qman pageQ,在以前的设计中所有动态页面用的都是同样的标题:"phpMan: man page /perldoc /info page web interface" QGoogle索引了大U?000多个面Q后来我页面标题改成了"phpMan:  [命o名]"q样的格式,比如Q?phpMan: ls"Q这样大部分动态页面的标题都不一样了Q一个月后Google从这个页面入口烦引了大约6000个页面。因此,如果|站中很多网都使用相同的标题,比如Q?#8220;新闻频道”Q?#8220;论坛”Q这些页面中很大一部分׃被排重机制忽略掉?
  5. 除了<title></title>外,q可以用<h1></h1>标题行突出内容主题,加强标题的效果;
    在我的网站设计中Q我会把?lt;h1>[标题]</h1>q样的模板把标题H出昄Q而不是通过改变字体的方式突出标题?

其他|站设计提示

  1. 静态链接:Blog|站另外一个优势在于其|页是静态链接:动态网占到整个互联网内容?0Q以上?span style="font-weight: bold">各个搜烦引擎其实能够表现的都只不q是互联|的冰山一?3-5%)Q不同的只是谁让优质|页排名靠前的策略更优秀而已Q?/span>大部分搜索引擎都认ؓ静态链接的|页是优质网,Google在优先抓取烦引的|页?0%以上是不带参数链接的静态网c而且即同样的内容,静态网也会比动态网|重高Q很Ҏ(gu)理解Qquery?a=1&b=2q样的链接由于参数顺序颠倒的query?b=2&a=1完全相同。尽量用静态网:目前能够动态网进行全面的索引q比较难Q而即使是Google也更不会索引所有的内容Q因此很会对参数超q?个的动态网进行进一步的抓取和分析。以下是一个phpBB论坛面q回的HTTP头信息:
    HTTP/1.1 200 OK
        Date: Wed, 28 Jan 2004 12:58:54 GMT
        Server: Apache/1.3.29 (Unix) mod_gzip/1.3.26.1a PHP/4.3.4
        X-Powered-By: PHP/4.3.4
        Set-Cookie: phpBB_data=a%3A0%3A%7B%7D; expires=Thu, 27-Jan-2005 12:58:54 GMT; path=/;
        Set-Cookie: phpBB_sid=09f67a83ee108ecbf11e35bb6f36fcec; path=/;
        Content-Encoding: gzip
        Cache-Control: private, pre-check=0, post-check=0, max-age=0
        Expires: 0
        Pragma: no-cache
        Connection: close
        Content-Type: text/html
        
    Z避免隐私问题QGooglebot可以通过寚w面http header中的session id和session cookieq行一些甄别,q样很多需要认证信息的论坛内容无法进入烦引了?br /> M上说Google喜欢新的Q静态的内容。因此无Z效率上讲q是方便搜烦引擎收录Q用内容发布系l将|站内容发布成静态网都是非常必要的Q从某种E度上说google friendly = anonymous cache friendly?br /> 比如Qhttp://www.chedong.com/phpMan.php/man/intro/3
    比http://www.chedong.com/phpMan.php?mode=man&parameter=intro&section=3q样的链接更Ҏ(gu)q入搜烦引擎的烦引。而且在URL中的命中也能H出关键词?
  2. 能够q入Google索引的页面数量越多越好。用cM以下的脚本可以统计自q|站被搜索引擎烦引的情况?
    #!/bin/sh
        YESTERDAY=`date -d yesterday +%Y%m%d`
        # for FreeBSD: YESTERDAY=`date -v-1d +%Y%m%d`
        LOG_FILE='/home/apache/logs/access_log'
        grep -i Googlebot $LOG_FILE.$YESTERDAY|awk '{print $7}' |sort | uniq -c | sort -rn > spider/$YESTERDAY.googlebot.txt
        grep -i baiduspider $LOG_FILE.$YESTERDAY|awk '{print $7}' |sort | uniq -c | sort -rn > spider/$YESTERDAY.baiduspider.txt
        grep -i msnbot $LOG_FILE.$YESTERDAY|awk '{print $7}' |sort | uniq -c | sort -rn > spider/$YESTERDAY.msnbot.txt
        grep -i inktomi $LOG_FILE.$YESTERDAY|awk '{print $7}' |sort | uniq -c | sort -rn > spider/$YESTERDAY.inktomi.txt
        grep -i openbot $LOG_FILE.$YESTERDAY|awk '{print $7}' |sort |uniq -c | sort -rn > spider/$YESTERDAY.openbot.txt
        
  3. |站目录l构要扁qI因ؓ每深一U目录,PAGERANK降低1Q?个档ơ。假N|3Q其子可能目录就?了,更深可能无法列入评U范围了?br />
  4. 表现和内容的分离Q?#8220;l色”|页
    |页中的javascript和css可能和|页分离Q一斚w提高代码重用度(也方侉K面缓存)Q另外一斚wQ由于有效内容占|页长度的百分比高,也能提高相关关键词在面中的比重也增加了。MQ应该鼓励遵循w3c的规范,使用更规范的XHTML和XML作ؓ昄格式便于内容更长旉的保存?
  5. 让所有的面都有能够快速入口:站点地图Q方便网늈虫(spiderQ快速遍历网站所有需要发布的内容。如果首就是用Flash或图片进入的话,无异于将搜烦引擎拒之门外Q除了UI设计的用户友好外Qspider friendly也是非常重要的?
  6. 保持|站自n的健Pl常利用坏链查工?/a>查网站中是否有死链?
  7. 保持|页内容/链接的稳定性和持久性:在搜索引擎烦引中|页存在的历史也是一个比较重要的因素Q而且历史比较久的|页被链接的几率高。ؓ了保证自q能够被比较持久的被其他|站的页面引用,如果自己|页中有链接更新Ӟ最好能保留旧的面q做好链接{向,以保持内容的q箋性。要知道Q把一个网站和内容在搜索引擎中的排?#8220;培养”的很高是一仉怸Ҏ(gu)的事情,谁都不希望好不容易自q内容被别人找CQ点d?#8220;404 面不存?#8221;吧,因此站点理员对自n站点error.log的分析也是非常必要的?
  8. 文gcd因素QGoogle有对PDF, Word(Power Point, Excel), PS文档的烦引能力,׃q种文档的内Ҏ(gu)一般的HTMLl过了更多的整理Q学术h(hun)g般比较高Q所以这些类型的文档天生比一般的HTMLcd的文?PageRank要高。因此,对于比较重要的文档:技术白皮书QFAQQ安装文档等使用PDF PS{高U格式存取,q样在搜索结果中也能获得比较靠前的位|?
  9. 常常能发现门L(fng)点的一条新d往比其他站点的首页排名q要靠前。因此一个站Ҏ(gu)MPageRank提高了以后,往往自n一些ƈ不重要的内容也会被同那些高PageRank的内容一起带入被搜烦引擎优先查询的列表中。这L(fng)帔R成很多大的开发站点的邮g列表归档往往比其他站点的首页PageRankq要高?

知己知彼——站点访问统?日志分析挖掘的重要?/a>

|站设计不仅仅只是被动的q合搜烦引擎的烦引,更重要是充分利用搜烦引擎带来的流量进行更深层ơ的用户行ؓ分析。目前,来自搜烦引擎关键词统计几乎是各种WEB日志分析工具的标准功能,怿商业日志l计工具在这斚w应该会有更强化的实现。WEB日志l计q个功能如此重要Q以至于新的RedHat 8中已l将日志分析工具webalizer作ؓ标准的服务器配置应用之一?br />

以Apache/webalizerZQ具体的做法如下Q?
  1. 记录讉K来源Q?br /> 在Apache配置文g中设|日志格式ؓcombined格式Q这L(fng)日志中会包含扩展信息Q其中有一个字D就是相应访问的转向来源Q?HTTP_REFERERQ如果用h从某个搜索引擎的搜烦l果中找C你的|页q点击过来,日志中记录的HTTP_REFERER是用户在搜索引擎结果页面的URLQ这个URL中包含了用户查询的关键词?br />
  2. 在webalizer中缺省配|针Ҏ(gu)索引擎的l计Q如何提取HTTP_REFERER中的关键?br /> webalizer中缺省有针对yahoo, google{国际流行搜索引擎的查询格式Q这里我增加了针对国内门L(fng)点的搜烦引擎参数讄
    SearchEngine yahoo.com p=
    SearchEngine altavista.com q=
    SearchEngine google.com q=
    SearchEngine    sina.com.cn word=
    SearchEngine    baidu.com   word=
    SearchEngine    sohu.com    word=
    SearchEngine    163.com q=

通过q样讄webalizerl计时就会将HTTP_REFERER中来自搜索引擎的URL中的keyword提取出来Q比如:所有来?google.com链接中,参数q的值都被作ؓ关键词统计下来:Q从汇ȝ计结果中Q就可以发现用户是根据什么关键词扑ֈ你的ơ数Q以及找C的用h感兴的是那些关键词{,q一步的Q在webalizer中有讄q可以将l计l果倒出成CSV格式的日志,便于以后导入数据库进行历史统计,做更深层ơ的数据挖掘{?/p>

以前通过WEB日志的用户分析主要是单的Z日志中的讉K旉/IP地址来源{,很明显,Z搜烦引擎关键词的l计能得到的分析l果更丰富、更直观。因此,搜烦引擎服务的潜在商业h(hun)值几乎是不言而喻的,也许q也?a >Yahoo! Altavista{传l搜索引擎网站在门户模式后重新开始重视搜索引擎市场的原因Q看?a >Google的年度关键词l计q道了Q在互联|上有谁比搜索引擎更了解用户对什么更感兴呢Q?br />

L(fng)本站的反盔R接统计:http://www.chedong.com/log/2003_6.log
需要注意的是:׃Google针对Windows 2000中的IE使用的是UTF-8方式的编码,因此很多l计有时候需要在UTF-8方式下查看才是正字W显C。从l计中能够感受到Q在使用水^比较高的IT开发h员中Google已经成ؓ最常用的搜索引擎。而用百度的用户也已l大大超q了传统的搜狐,新浪{门L(fng)点,因此传统门户|站在搜索引擎上的优势将是非常脆q。而从技术的发展势来看Q以后还会有更多的利用互联网媒体做更深层ơ数据挖掘的服务模式出现Q?br />

 

转蝲自cnblog.org—?#8220;H发”文字可能揭示C会势

?#8220;新科学家”(New Scientist)在线杂志上,公布了康奈尔大学的一个新研究成果Q引人注目,也许与Google 收购Pyra 的动机有兟?/span>

q所大学的计机U学?Jon Klenberg 开发了一个计机法Q能够识别一文章中某些文字?#8220;H发”增长Q而且他发玎ͼq些“H发”增长的文字可以用来快速识别最新的势和热炚w题,因此能够更有效地{选重要信息。过d多搜索技术都采用了简单计文?词组出现频率的方法,却忽略了文字使用增加的速率?/span>

Jon 特别指出Q这U方法可以应用到大量Weblog上,以跟t社会趋势,q对商业应用也很有潜力。例如,q告商可以从成千上万的个人Blog 中快速找到潜在的需求风。而且只要Blog 覆盖话题范围_大(实际上发展趋势确实如此)Q这Ҏ(gu)术对政治、社会、文化和l济{领域也都会有实际意义了?/span>

虽然Google 新闻的内部算法至今没有公开Q但是h们猜这U完全由机器所搜集的头条新d当不是Google搜烦引擎中惯用的鸽子法Q很可能与这U?#8220;H发”判断法有关。如此说来,Google收购Blog工具供应商的丑֊实q有更深层次的远见了?/span>

- NewScientist.com news,
- q没有写完这些介l,?SlashDot 上也看到了很多有兌个发现的讨论

附:Google官方的站点设计指?/a>

  • Make a site with a clear hierarchy and text links. Every page should be reachable from at least one static text link.  让网站有着清晰的结构和文本链接Q所有的面臛_要有一个静态文本链接入?br /> Ҏ(gu)Q尽量不要用囄和JAVASCRIPT
  • Offer a site map to your users with links that point to the important parts of your site. If the site map is larger than 100 or so links, you may want to break the site map into separate pages.
    为用h供一个站点地图:转向|站的重要部分。如果站点地N面超q?00个链接,则需要将面分成多个面?br /> Ҏ(gu)Q烦引页不要过100个链接:SPIDER只考虑面中头100个链?
  • Create a useful, information-rich site and write pages that clearly and accurately describe your content.
    用一些有用的Q信息量丰富的站点,清晰q正的描述你的信息?
  • Think about the words users would type to find your pages, and make sure that your site actually includes those words within it.
    惛_用户可能用来扑ֈ你的关键词,q保证这些关键词在网站中出现?br /> Ҏ(gu)Q少?#8220;最?#8221;Q?#8220;最?#8221;之类的Ş容词Q用用户最兛_的词Q比如:下蝲Q歌星名字,而不是一些抽象名词?
  • Try to use text instead of images to display important names, content, or links. The Google crawler doesn't recognize text contained in images.
    可能用文本,而不是图片显C重要的名称Q内容和链接。GOOGLE的机器h不认识图片中的文字?
  • Make sure that your TITLE and ALT tags are descriptive and accurate.
    保证Q页面的TITLE和ALT标记正确的精描q?
  • Check for broken links and correct HTML.
    查坏铑ƈ修正q些HTML错误?
  • If you decide to use dynamic pages (i.e., the URL contains a '?' character), be aware that not every search engine spider crawls dynamic pages as well as static pages. It helps to keep the parameters short and the number of them small.
    如果你打用动态页面:链接中包??"Q必M解:q所有的搜烦引擎的机器h能想对待静态页面一样对待动态页面,保持动态页面的参数可能的也会很有帮助?
  • Keep the links on a given page to a reasonable number (fewer than 100).
    让一个页面中的链接少?00个?br /> Ҏ(gu)Q用lynx -dump http://www.chedong.com 可以模拟从robot角度看到的页面。其最后有链接l计

输出cMQ?br />
   [1]Google Free Search _______________________________ Google Search
   (_) Search WWW (_) Search chedong.com

   ??[2]站点地图 / Site Map [3]?a?/ Guest Book [4]意见反馈 /
   Feed Back
    ...
References

   Visible links
   1. http://www.google.com/services/free.html
   2. http://www.chedong.com/sitemap.html#sitemap
   3. http://www.chedong.com/guestbook/
   4. http://www.chedong.com/formmail.htm
    ...
   Hidden links:
  50. http://www.chedong.com/bbcweb/
    ...

搜烦引擎的宗旨在于提取互联网中质量最好的内容提供l用PM有利于帮助用戯得相对公正,优质内容的策略都是搜索引擎追求目标。PageRank是一个非常好的策略,但是q所有策略都是基于非常复杂的法?br /> 从搜索引擎看来什么是互联|中“?#8221;的内容呢Q?

 

参考资料:

面向Google搜烦引擎的网站设计优?br /> http://www.google-search-engine-optimization.com/



如何评h(hun)一个网站的人气
http://www.chedong.com/tech/link_pop_check.html

如何提高|站在Google中的排名——面向搜索引擎的q告模式
http://www.chedong.com/tech/google_ads.html

如何提高|站在Google中的排名——面向搜索引擎的|站链接设计
http://www.chedong.com/tech/google_url.html

Google不断改进相应的算法:HillTop
Hilltop: A Search Engine based on Expert Documents

Google の秘?- PageRank 徹底解説
http://www.kusastro.kyoto-u.ac.jp/~baba/wais/pagerank.html
q篇文章是在?Google PageRank"的时候查到的Q这文章不仅有一个算法说明,也是一个Google的weblogQ记录了很多关于Google的新d一些市场动态信息?br /> Google 的秘? PageRank d解说 中文?/a>

更详l的PageRank法说明Q?br /> http://pr.efactory.de/

WEB日志l计工具AWStats的用:增加了Unicode的解码和中国主要门户搜烦的定?/a>
http://www.chedong.com/tech/awstats.html

Robots的说明:
http://bar.baidu.com/robots/
http://www.google.com/bot.html
搜烦引擎通过一U程序robotQ又UspiderQ,自动讉K互联|上的网ƈ获取|页信息。?zhn)可以在(zhn)的网站中创徏一个纯文本文g robots.txtQ在q个文g中声明该|站中哪些内容可以被robot讉KQ哪些不可以?/p>

反Google站点Q观点也很有?br /> http://www.google-watch.org/

关于Google的WebLog
http://google.blogspace.com/

关于Google的HillTop法

搜烦引擎相关论坛
http://searchengineforums.com/
http://searchenginewatch.com
http://www.webmasterworld.com/



风雨兼程 2008-01-04 09:43 发表评论
]]>
开发电(sh)子商务网站对数据库表的设?/title><link>http://www.tkk7.com/ljy032/archive/2008/01/02/172214.html</link><dc:creator>风雨兼程</dc:creator><author>风雨兼程</author><pubDate>Wed, 02 Jan 2008 07:20:00 GMT</pubDate><guid>http://www.tkk7.com/ljy032/archive/2008/01/02/172214.html</guid><wfw:comment>http://www.tkk7.com/ljy032/comments/172214.html</wfw:comment><comments>http://www.tkk7.com/ljy032/archive/2008/01/02/172214.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ljy032/comments/commentRss/172214.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ljy032/services/trackbacks/172214.html</trackback:ping><description><![CDATA[pȝ分析 <p>  功能需求分?/p> <p>  (1):产品展示Q按照分cdC全部品,和对应的相关信息?/p> <p>  (2):增加产品的展C相兛_Q诸如最C品报道,|站的新闻,促销信息?/p> <p>  (3):购物车,跟踪用户的购物情?/p> <p>  (4):l算中心Q处理用户帐单,购物处理</p> <p>  (5):反馈互动区,可以留言</p> <p>  (6):会员信息模块Q可以注?/p> <p>  数据需求分?/p> <p>  数据库表设计定ؓ8个表实现Q?/p> <p>  ccdot_user{用户信息表}:</p> <p>  ------szd_userid[PK]</p> <p>  ------szd_username[用户ID]</p> <p>  ------szd_password[用户密码]</p> <p>  ------szd_name[用户真是信息]</p> <p>  ------szd_question[丢失密码问题]</p> <p>  ------szd_answer[用户回答{案Q用于找密码]</p> <p>  ------szd_sex[性别]</p> <p>  ------szd_phone[?sh)话]</p> <p>  ------szd_email[?sh)子邮g]</p> <p>  ------szd_address[地址]</p> <p>  ------szd_post[邮编]</p> <p>  ------szd_province[省䆾]</p> <p>  ------szd_city[城市]</p> <p>  ------szd_mark[标记]</p> <p>  ccdot_aclass{产品大类} </p> <p>  ------szd_aclassid[PK]</p> <p>  ------szd_aclassname[名称]</p> <p>  ccdot_bclass{产品类} </p> <p>  ------szd_bclassid[pk]</p> <p>  ------szd_aclassid[兌大类szd_aclassid]</p> <p>  ------szd_bclassname[名称]</p> <p>  ccdot_poduct{产品信息} </p> <p>  ------szd_productid[pk]</p> <p>  ------szd_bclassid[兌类的szd_bclassid]</p> <p>  ------szd_pname[名称]</p> <p>  ------szd_pdetail[产品信息]</p> <p>  ------szd_pprice[一般h(hun)格]</p> <p>  ------szd_pmemderprice[会员价]</p> <p>  ------szd_pfewprice[差h(hun)]</p> <p>  ------szd_ppicture[囄]</p> <p>  ------szd_ptime[d旉]</p> <p>  ------szd_stock[产品库存]</p> <p>  ------szd_phit[产品点击ơ数]</p> <p>  ------szd_pdetail1[其他产品描述]</p> <p>  ccdot_news{新闻} </p> <p>  ------szd_newsid[PK]</p> <p>  ------szd_title[标题]</p> <p>  ------szd_content[内容]</p> <p>  ------szd_time[d旉]</p> <p>  ------szd_type[cd]</p> <p>  ccdot_guest{评论} </p> <p>  ------szd_gid[PK]</p> <p>  ------szd_gname[늧]</p> <p>  ------szd_gcontent[留言内容]</p> <p>  ------szd_productid[兌产品的主键]</p> <p>  ------szd_gtime[留言旉]</p> <p>  ------szd_gip[留言者ip]</p> <p>  ccdot_orderlist{订单列表} </p> <p>  ------szd_orderlistid[PK]</p> <p>  ------szd_orderid[兌详细订单的主键]</p> <p>  ------szd_productid[兌产品的主键]</p> <p>  ------szd_quantity[所定数目]</p> <p>  ------szd_unitcost[单h(hun)]</p> <p>  ------szd_productname[产品名称]</p> <p>  ccdot_orders{订单信息表} </p> <p>  ------szd_orderid[PK]</p> <p>  ------szd_userid[兌用户主键]</p> <p>  ------szd_orderdate[订单日期]</p> <p>  ------szd_linkman[联系人]</p> <p>  ------szd_email[联系人email]</p> <p>  ------szd_phone[联系?sh)话]</p> <p>  ------szd_postalcode[送货处邮~]</p> <p>  ------szd_address[送货地址]</p> <p>  ------szd_result[处理l果]</p> <p>  ------szd_remark[备注]</p> <p>  ------szd_songhuoqixian[送货期限]</p> <p>  ------szd_songhuofangshi[发货方式]</p> <p>  ------szd_fukuanfangshi[付款方式]</p> <p>  ------szd_error[意外说明]</p> <!-- 分页 --><!-- 分页end --> <img src ="http://www.tkk7.com/ljy032/aggbug/172214.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ljy032/" target="_blank">风雨兼程</a> 2008-01-02 15:20 <a href="http://www.tkk7.com/ljy032/archive/2008/01/02/172214.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>petshop4.0设计说明asp.net初学?/title><link>http://www.tkk7.com/ljy032/archive/2007/12/26/170637.html</link><dc:creator>风雨兼程</dc:creator><author>风雨兼程</author><pubDate>Wed, 26 Dec 2007 09:05:00 GMT</pubDate><guid>http://www.tkk7.com/ljy032/archive/2007/12/26/170637.html</guid><wfw:comment>http://www.tkk7.com/ljy032/comments/170637.html</wfw:comment><comments>http://www.tkk7.com/ljy032/archive/2007/12/26/170637.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ljy032/comments/commentRss/170637.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ljy032/services/trackbacks/170637.html</trackback:ping><description><![CDATA[petshop4.0设计说明 <br /> 一、项目名U及描述Q?实现步骤为:4-3-6-5-2-1)<br /> 1、WEBQ表C层<br /> 2、BLLQ业务逻辑?br /> 3、IDALQ数据访问层接口定义<br /> 4、ModelQ业务实?br /> 5、DALFactoryQ数据层的抽象工?创徏反射)<br /> 6、SQLServerDALQSQLServer数据讉K?/ OracleDALQOracle数据讉K? <p>DBUtility 数据库访问组件基c?/p> <p>二、项目引用关p?br /> 1、Web 引用 BLL?br /> 2、BLL 引用 IDALQModelQ用DALFactory创徏实例?br /> 3、IDAL 引用 Model?br /> 4、Model 无引用?br /> 5、DALFactory 引用IDALQ通过dweb.config里设|的E序集,加蝲cȝ实例Q返回给BLL使用?br /> 6、SQLServerDAL 引用 Model和IDALQ被DALFactory加蝲的程序集Q实现接口里的方法?</p> <p><br /> 三、实现步?br /> 1、创建ModelQ实C务实体?br /> 2、创建IDALQ实现接口?br /> 3、创建SQLServerDALQ实现接口里的方法?br /> 4、增加web.config里的配置信息QؓSQLServerDAL的程序集?br /> 5、创建DALFactoryQ返回程序集的指定类的实例?br /> 6、创建BLLQ调用DALFactoryQ得到程序集指定cȝ实例Q完成数据操作方法?br /> 7、创建WEBQ调用BLL里的数据操作Ҏ(gu)?/p> <p>注意Q?br /> 1、web.config里的E序集名U必MSQLServerDAL里的输出E序集名UC致?br /> 2、DALFactory里只需要一个DataAccessc,可以完成创徏所有的E序集实例?br /> 3、项目创建后Q注意修改各目的默认命名空间和E序集名U?br /> 4、注意修改解x案里的项目依赖?br /> 5、注意在解决Ҏ(gu)里增加各目引用?/p> <img src ="http://www.tkk7.com/ljy032/aggbug/170637.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ljy032/" target="_blank">风雨兼程</a> 2007-12-26 17:05 <a href="http://www.tkk7.com/ljy032/archive/2007/12/26/170637.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Getting Real MW记 http://www.tkk7.com/ljy032/archive/2007/12/26/170599.html风雨兼程风雨兼程Wed, 26 Dec 2007 07:12:00 GMThttp://www.tkk7.com/ljy032/archive/2007/12/26/170599.htmlhttp://www.tkk7.com/ljy032/comments/170599.htmlhttp://www.tkk7.com/ljy032/archive/2007/12/26/170599.html#Feedback0http://www.tkk7.com/ljy032/comments/commentRss/170599.htmlhttp://www.tkk7.com/ljy032/services/trackbacks/170599.html满需?/span>?br />
需求和开发的矛盾Q至在我看来,是品开发中的主要矛盾?span style="color: red">提需求的觉得产品没有满需求,开发的觉得需求不明确或者胡来。最后的l果Q要么是产品延期Q要么是个破?/span>?br />
是否有一些方法或者经验,可以指导我们更成功地开?Web app 呢?或者不仅仅是开发,q包括设计,推广Qh?#8230;…作ؓ创业或者实늚一整套指导Q?br />
q就是我x荐给大家的?a target="_blank">Getting Real》?br />
Getting Real 是著名的 37signals 公司QRuby on Rails 的缔造者)d撰写的一本书Q主要内Ҏ(gu)指导型公司/团体成功地商业运作v Web 产品Q提供了包括相关理念Q思\Qh员,技术,Ҏ(gu)论,实例{等许多信息Q非帔R合 Web 开发h员,产品人员和创业者参考?br />
书专注于以下几点Q?br /> 1. 成功的商业品,以客户利益和感受至上?br /> 2. 型的团队,高灵zL和适应性?br /> 3. _的品,够用好用的功能?br /> 4. 高效的设计和开发过E,杜绝费旉Q减需求和开发的矛盾?br /> 5. 巧妙的推q和售后支持?br /> ……


风雨兼程 2007-12-26 15:12 发表评论
]]>
层随着鼠标Udhttp://www.tkk7.com/ljy032/archive/2007/12/26/170591.html风雨兼程风雨兼程Wed, 26 Dec 2007 06:44:00 GMThttp://www.tkk7.com/ljy032/archive/2007/12/26/170591.htmlhttp://www.tkk7.com/ljy032/comments/170591.htmlhttp://www.tkk7.com/ljy032/archive/2007/12/26/170591.html#Feedback0http://www.tkk7.com/ljy032/comments/commentRss/170591.htmlhttp://www.tkk7.com/ljy032/services/trackbacks/170591.html  c.style.position = "absolute";
 var eT = obj.offsetTop; 
    var eH = obj.offsetHeight+eT; 
 c.style.left = window.event.clientX-event.offsetX+document.documentElement.scrollLeft-20;
    c.style.top = window.event.clientY-event.offsetY+document.documentElement.scrollTop+eH-8;


 c.style.display = "block";

风雨兼程 2007-12-26 14:44 发表评论
]]>
解决downlist {优先极高于其它控gQQ在其它控件上?/title><link>http://www.tkk7.com/ljy032/archive/2007/12/26/170583.html</link><dc:creator>风雨兼程</dc:creator><author>风雨兼程</author><pubDate>Wed, 26 Dec 2007 06:35:00 GMT</pubDate><guid>http://www.tkk7.com/ljy032/archive/2007/12/26/170583.html</guid><wfw:comment>http://www.tkk7.com/ljy032/comments/170583.html</wfw:comment><comments>http://www.tkk7.com/ljy032/archive/2007/12/26/170583.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ljy032/comments/commentRss/170583.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ljy032/services/trackbacks/170583.html</trackback:ping><description><![CDATA[ <iframe style="position:absolute;z-index:9;width:expression(this.nextSibling.offsetWidth);height:expression(this.nextSibling.offsetHeight);top:expression(this.nextSibling.offsetTop);left:expression(this.nextSibling.offsetLeft);" frameborder="0" ></iframe><br />   <div id="divTool" onmouseover="javascript:showdiv123()" onmouseout="javascript:HiddivTool()" class="class_title"  style="display:none"><br /> <table width="100" border="0"  align="center" cellpadding="0" cellspacing="0"><br />   <tr><br />     <td height="20" colspan="2" bgcolor="ffffff" style="width: 100px" >&nbsp;&nbsp;<span class="t1" style="cursor:hand" name="layout/AddPage.aspx" onclick="javascript:openMyPage(this)">More tools</span></td><br />   </tr> <br />   <tr><br />     <td height="20" colspan="2"  bgcolor="ffffff"  style="width: 100px">&nbsp;&nbsp;<a href="#">About this tools</a></td><br />   </tr><tr><br />     <td height="8" colspan="2" bgcolor="ffffff" style="width: 100px"></td><br />   </tr> <br />   <br />   </table><br /> </div> <img src ="http://www.tkk7.com/ljy032/aggbug/170583.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ljy032/" target="_blank">风雨兼程</a> 2007-12-26 14:35 <a href="http://www.tkk7.com/ljy032/archive/2007/12/26/170583.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在PetShop 4.0中ASP.NET~存的实?http://www.tkk7.com/ljy032/archive/2007/12/26/170547.html风雨兼程风雨兼程Wed, 26 Dec 2007 04:07:00 GMThttp://www.tkk7.com/ljy032/archive/2007/12/26/170547.htmlhttp://www.tkk7.com/ljy032/comments/170547.htmlhttp://www.tkk7.com/ljy032/archive/2007/12/26/170547.html#Feedback1http://www.tkk7.com/ljy032/comments/commentRss/170547.htmlhttp://www.tkk7.com/ljy032/services/trackbacks/170547.htmlPetShop作ؓ一个B2C的宠物网上商店,需要充分考虑访客的用户体验,如果因ؓ数据量大而导致Web服务器的响应不及Ӟ面和查询数据迟q得不到l果Q会因此而破坏客戯问网站的心情Q在耗尽耐心的等待后Q可能会失去q一部分客户。无疑,q是非常p糕的结果。因而在对其q行体系架构设计Ӟ整个pȝ的性能显得殊为重要。然而,我们不能因噎废食Q因Z注于性能而忽略数据的正确性。在PetShop 3.0版本以及之前的版本,因ؓASP.NET~存的局限性,q一问题q没有得到很好的解决。PetShop 4.0则引入了SqlCacheDependencyҎ(gu),使得pȝ对缓存的处理较之以前大ؓ改观?/p>

4.3.1  CacheDependency接口

PetShop 4.0引入了SqlCacheDependencyҎ(gu),对Category、Product和Item数据表对应的~存实施了SQL Cache Invalidation技术。当对应的数据表数据发生更改后,该技术能够将相关从~存中移除。实现这一技术的核心是SqlCacheDependencyc,它承了CacheDependencycR然而ؓ了保证整个架构的可扩展性,我们也允许设计者徏立自定义的CacheDependencyc,用以扩展~存依赖。这有必要为CacheDependency建立抽象接口Qƈ在web.config文g中进行配|?/p>

在PetShop 4.0的命名空间PetShop.ICacheDependency中,定义了名为IPetShopCacheDependency接口Q它仅包含了一个接口方法:
public interface IPetShopCacheDependency
{      
    AggregateCacheDependency GetDependency();
}

AggregateCacheDependency?Net Framework 2.0新增的一个类Q它负责监视依赖对象的集合。当q个集合中的L一个依赖项对象发生改变Ӟ该依赖项对象对应的缓存对象都被自动U除?br /> AggregateCacheDependencycvCl合CacheDependency对象的作用,它可以将多个CacheDependency对象甚至于不同类型的CacheDependency对象与缓存项建立兌。由于PetShop需要ؓCategory、Product和Item数据表徏立依赖项Q因而IPetShopCacheDependency的接口方法GetDependency()其目的就是返回徏立了q些依赖的AggregateCacheDependency对象?/p>

4.3.2  CacheDependency实现

CacheDependency的实现正是ؓCategory、Product和Item数据表徏立了对应的SqlCacheDependencycd的依赖项Q如代码所C:
public abstract class TableDependency : IPetShopCacheDependency
{
    // This is the separator that's used in web.config
    protected char[] configurationSeparator = new char[] { ',' };

    protected AggregateCacheDependency dependency = new AggregateCacheDependency();
    protected TableDependency(string configKey)
    {
        string dbName = ConfigurationManager.AppSettings["CacheDatabaseName"];
        string tableConfig = ConfigurationManager.AppSettings[configKey];
        string[] tables = tableConfig.Split(configurationSeparator);

        foreach (string tableName in tables)
            dependency.Add(new SqlCacheDependency(dbName, tableName));
    }
    public AggregateCacheDependency GetDependency()
   {
        return dependency;
    }
}

需要徏立依赖项的数据库与数据表都配|在web.config文g中,其设|如下:
<add key="CacheDatabaseName" value="MSPetShop4"/>
<add key="CategoryTableDependency" value="Category"/>
<add key="ProductTableDependency" value="Product,Category"/>
<add key="ItemTableDependency" value="Product,Category,Item"/>

Ҏ(gu)各个数据表间的依赖关p,因而不同的数据表需要徏立的依赖也是不相同的,从配|文件中的value值可以看出。然而不徏立依赖项的多寡,其创建的行ؓ逻辑都是怼的,因而在设计Ӟ抽象了一个共同的cTableDependencyQƈ通过建立带参数的构造函敎ͼ完成对依赖项的徏立。由于接口方法GetDependency()的实CQ返回的对象dependency是在受保护的构造函数创建的Q因此这里的实现方式也可以看作是Template Method模式的灵z运用。例如TableDependency的子cProductQ就是利用父cȝ构造函数徏立了Product、Category数据表的SqlCacheDependency依赖Q?br /> public class Product : TableDependency
{
    public Product() : base("ProductTableDependency") { }
}

如果需要自定义CacheDependencyQ那么创Z赖项的方式又有不同。然而不是创徏SqlCacheDependency对象Q还是自定义的CacheDependency对象Q都是将q些依赖Ҏ(gu)加到AggregateCacheDependencycMQ因而我们也可以定义CacheDependency建立专门的类Q只要实现IPetShopCacheDependency接口卛_?/p>

4.3.3  CacheDependency工厂

l承了抽象类TableDependency的Product、Category和Itemcd需要在调用时创建各自的对象。由于它们的父类TableDependency实现了接口IPetShopCacheDependencyQ因而它们也间接实现了IPetShopCacheDependency接口Q这为实现工厂模式提供了前提?/p>

在PetShop 4.0中,依然利用了配|文件和反射技术来实现工厂模式。命名空间PetShop.CacheDependencyFactory中,cDependencyAccess即ؓ创徏IPetShopCacheDependency对象的工厂类Q?br /> public static class DependencyAccess
{       
    public static IPetShopCacheDependency CreateCategoryDependency()
    {
        return LoadInstance("Category");
    }
    public static IPetShopCacheDependency CreateProductDependency()
    {
        return LoadInstance("Product");
    }
    public static IPetShopCacheDependency CreateItemDependency()
    {
        return LoadInstance("Item");
    }
    private static IPetShopCacheDependency LoadInstance(string className)
    {
        string path = ConfigurationManager.AppSettings["CacheDependencyAssembly"];
        string fullyQualifiedClass = path + "." + className;
        return (IPetShopCacheDependency)Assembly.Load(path).CreateInstance(fullyQualifiedClass);
    }
}
整个工厂模式的实现如?-3所C:

4-3.gif
 ?-3 CacheDependency工厂

虽然DependencyAccesscdZ实现了IPetShopCacheDependency接口的类Category、Product、ItemQ然而我们之所以引入IPetShopCacheDependency接口Q其目的在于获得创Z依赖的AggregateCacheDependencycd的对象。我们可以调用对象的接口Ҏ(gu)GetDependency()Q如下所C:
AggregateCacheDependency dependency = DependencyAccess.CreateCategoryDependency().GetDependency();

Z方便调用者,g我们可以对DependencyAccessc进行改q,原有的CreateCategoryDependency()Ҏ(gu)Q修改ؓ创徏AggregateCacheDependencycd对象的方法?/p>

然而这L(fng)做法Cؕ了作为工厂类的DependencyAccess的本w职责,且创建IPetShopCacheDependency接口对象的行Z然有可能被调用者调用,所以保留原有的DependencyAccesscM然是有必要的?/p>

在PetShop 4.0的设计中Q是通过引入Facade模式以方便调用者更加简单地获得AggregateCacheDependencycd对象?/p>

4.3.4  引入Facade模式

利用Facade模式可以一些复杂的逻辑q行包装Q以方便调用者对q些复杂逻辑的调用。就好像提供一个统一的门面一般,内部的子系l封装v来,l一Z个高层次的接口。一个典型的Facade模式C意囑֦下所C:

4-4.gif
?-4 Facade模式

Facade模式的目的ƈ非要引入一个新的功能,而是在现有功能的基础上提供一个更高层ơ的抽象Q得调用者可以直接调用,而不用关心内部的实现方式。以CacheDependency工厂ZQ我们需要ؓ调用者提供获得AggregateCacheDependency对象的简便方法,因而创ZDependencyFacadec:
public static class DependencyFacade
{
    private static readonly string path = ConfigurationManager.AppSettings["CacheDependencyAssembly"];
    public static AggregateCacheDependency GetCategoryDependency()
    {
        if (!string.IsNullOrEmpty(path))
            return DependencyAccess.CreateCategoryDependency().GetDependency();
        else
            return null;
    }
    public static AggregateCacheDependency GetProductDependency()
    {
        if (!string.IsNullOrEmpty(path))
            return DependencyAccess.CreateProductDependency().GetDependency();
        else
            return null;
        }
    public static AggregateCacheDependency GetItemDependency()
    {
        if (!string.IsNullOrEmpty(path))
            return DependencyAccess.CreateItemDependency().GetDependency();
        else
            return null;
    }
}

DependencyFacadecd装了获取AggregateCacheDependencycd对象的逻辑Q如此一来,调用者可以调用相x法获得创建相关依赖项的AggregateCacheDependencycd对象Q?br /> AggregateCacheDependency dependency = DependencyFacade.GetCategoryDependency();

比v直接调用DependencyAccesscȝGetDependency()Ҏ(gu)而言Q除了方法更单之外,同时它还对CacheDependencyAssembly配置节进行了判断Q如果其gؓI,则返回null对象?/p>

在PetShop.Web的App_Code文g夹下Q静态类WebUtility的GetCategoryName()和GetProductName()Ҏ(gu)调用了DependencyFacadecR例如GetCategoryName()Ҏ(gu)Q?br /> public static string GetCategoryName(string categoryId)
{
     Category category = new Category();
     if (!enableCaching)
            return category.GetCategory(categoryId).Name;

     string cacheKey = string.Format(CATEGORY_NAME_KEY, categoryId);

     // 查缓存中是否存在该数据项;
     string data = (string)HttpRuntime.Cache[cacheKey];
     if (data == null)
     {
           // 通过web.config的配|获取duration?
           int cacheDuration = int.Parse(ConfigurationManager.AppSettings["CategoryCacheDuration"]);
           // 如果~存中不存在该数据项Q则通过业务逻辑层访问数据库获取;
           data = category.GetCategory(categoryId).Name;
           // 通过Facadecd建AggregateCacheDependency对象;
           AggregateCacheDependency cd = DependencyFacade.GetCategoryDependency();
           // 数据项以及AggregateCacheDependency 对象存储到缓存中;
           HttpRuntime.Cache.Add(cacheKey, data, cd, DateTime.Now.AddHours(cacheDuration), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
      }
      return data;
}

GetCategoryName()Ҏ(gu)首先会检查缓存中是否已经存在CategoryName数据,如果已经存在Q就通过~存直接获取数据Q否则将通过业务逻辑层调用数据访问层讉K数据库获得CategoryNameQ在获得了CategoryName后,会将新获取的数据q同DependencyFacadecd建的AggregateCacheDependency对象d到缓存中?/p>

WebUtility静态类被表C层的许多页面所调用Q例如Product面Q?br /> public partial class Products : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Page.Title = WebUtility.GetCategoryName(Request.QueryString["categoryId"]);
    }
}

昄面title的逻辑是放在Page_Load事gҎ(gu)中,因而每ơ打开该页面都要执行获取CategoryName的方法。如果没有采用缓存机Ӟ当Category数据较多Ӟ面的显C就会非常缓慢?/p>

4.3.5  引入Proxy模式

业务逻辑层BLL中与Product、Category、Item有关的业务方法,其实现逻辑是调用数据访问层QDALQ对象访问数据库Q以获取相关数据。ؓ了改善系l性能Q我们就需要ؓq些实现Ҏ(gu)增加~存机制的逻辑。当我们操作增加了缓存机制的业务对象Ӟ对于调用者而言Q应与BLL业务对象的调用保持一致。也x_我们需要引入一个新的对象去控制原来的BLL业务对象Q这个新的对象就是Proxy模式中的代理对象?/p>

以PetShop.BLL.Product业务对象ZQPetShop为其建立了代理对象ProductDataProxyQƈ在GetProductByCategory(){方法中Q引入了~存机制Q例如:
public static class ProductDataProxy
{

    private static readonly int productTimeout = int.Parse(ConfigurationManager.AppSettings["ProductCacheDuration"]);
    private static readonly bool enableCaching = bool.Parse(ConfigurationManager.AppSettings["EnableCaching"]);
       
    public static IList
GetProductsByCategory(string category)
    {
        Product product = new Product();

        if (!enableCaching)
            return product.GetProductsByCategory(category);

        string key = "product_by_category_" + category;
        IList data = (IList )HttpRuntime.Cache[key];

        // Check if the data exists in the data cache
        if (data == null)
        {
            data = product.GetProductsByCategory(category);

            // Create a AggregateCacheDependency object from the factory
            AggregateCacheDependency cd = DependencyFacade.GetProductDependency();

            // Store the output in the data cache, and Add the necessary AggregateCacheDependency object
            HttpRuntime.Cache.Add(key, data, cd, DateTime.Now.AddHours(productTimeout), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
        }
        return data;
    }
}

与业务逻辑层Product对象的GetProductsByCategory()Ҏ(gu)相比Q增加了~存机制。当~存内不存在相关数据Ҏ(gu)Q则直接调用业务逻辑层Product的GetProductsByCategory()Ҏ(gu)来获取数据,q将其与对应的AggregateCacheDependency对象一起存储在~存中?/p>

引入Proxy模式Q实C在缓存别上对业务对象的装Q增Z对业务对象的控制。由于暴露在对象外的Ҏ(gu)是一致的Q因而对于调用方而言Q调用代理对象与真实对象q没有实质的区别?/p>

从职责分M分层设计的角度分析,我更希望q些Proxy对象是被定义在业务逻辑层中Q而不像在PetShop的设计那P被划分到表示层UI中。此外,如果需要考虑E序的可扩展性与可替换性,我们q可以ؓ真实对象与代理对象徏立统一的接口或抽象cR然而,单以PetShop的表C层调用来看Q采用静态类与静态方法的方式Q或许更为合理。我们需要}讎ͼ“q度设计”是Y件设计的警戒Uѝ?/p>

如果需要对UI层采用缓存机Ӟ应用程序数据存攑ֈ~存中,可以调用这些代理对象。以ProductsControl用户控gZQ调用方式如下:
productsList.DataSource = ProductDataProxy.GetProductsByCategory(categoryKey);

productsList对象属于自定义的CustomListcdQ这是一个派生自System.Web.UI.WebControls.DataList控g的类Q它的DataSource属性可以接受IList集合对象?br /> 不过在PetShop 4.0的设计中Q对于类gProductsControlcd的控件而言Q采用的~存机制是页输出~存。我们可以从ProductsControl.ascx面的Source代码中发现端倪:
<%@ OutputCache Duration="100000" VaryByParam="page;categoryId" %>

与ASP.NET 1.x的页输出~存不同的是Q在ASP.NET 2.0中,为ASP.NET用户控g新引入了CachePolicy属性,该属性的cd为ControlCachePolicyc,它以~程方式实现了对ASP.NET用户控g的输出缓存设|。我们可以通过讄ControlCachePolicycȝDependency属性,来设|与该用h件相关的依赖,例如在ProductsControl用户控g中,q行如下的设|:
protected void Page_Load(object sender, EventArgs e)
{
    this.CachePolicy.Dependency = DependencyFacade.GetProductDependency();
}

采用输出缓存,q且利用ControlCachePolicy讄输出~存Q能够将业务数据与整个页面放入到~存中。这U方式比起应用程序缓存而言Q在性能上有很大的提高。同Ӟ它又通过引入的SqlCacheDependencyҎ(gu)有效地避免?#8220;数据q期”的缺点,因而在PetShop 4.0中被q泛采用。相反,之前为Product、Category、Item业务对象建立的代理对象则?#8220;投闲散置”Q仅仅作ZU设计方法的展示?#8220;q存”与整个系l的源代码中?/p>

风雨兼程 2007-12-26 12:07 发表评论
]]>
IList<CategoryInfo> GetCategories();的问?/title><link>http://www.tkk7.com/ljy032/archive/2007/12/26/170538.html</link><dc:creator>风雨兼程</dc:creator><author>风雨兼程</author><pubDate>Wed, 26 Dec 2007 03:44:00 GMT</pubDate><guid>http://www.tkk7.com/ljy032/archive/2007/12/26/170538.html</guid><wfw:comment>http://www.tkk7.com/ljy032/comments/170538.html</wfw:comment><comments>http://www.tkk7.com/ljy032/archive/2007/12/26/170538.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ljy032/comments/commentRss/170538.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ljy032/services/trackbacks/170538.html</trackback:ping><description><![CDATA[petshop4.0中的一D代?  <br />     <br />   public   interface   ICategory   {   <br />     <br />   ///   <summary>   <br />   ///   Method   to   get   all   categories   <br />   ///   </summary>   <br />                   ///   <returns>Interface   to   Model   Collection   Generic   of   categories</returns>   <br />               <br />                   <br />   IList<CategoryInfo>   GetCategories();   <br />                   <br />     <br />                   ///   <summary>   <br />                   ///   Get   information   on   a   specific   category   <br />                   ///   </summary>   <br />                   ///   <param   name="categoryId">Unique   identifier   for   a   category</param>   <br />                   ///   <returns>Business   Entity   representing   an   category</returns>   <br />                   CategoryInfo   GetCategory(string   categoryId);   <br />   }   <br />     <br />     <br />   我知道IList<CategoryInfo>是范?  <br />   表示list中的item是CategoryInfo对象   <br />     <br />     <br />   请问Z么用IList<CategoryInfo>   <br />   用List<CategoryInfo>可以吗?   <br />     <br />   两者有什么区别?谢谢   <br /> <br /> 没有什么区别,q样写灵zL大Q实现ilist接口的类很多Q你写成list后,也许以后你要Ҏ(gu)非list的,׃要改很多代码<br /> 举个例子   <br />     <br />   RenderControlToString(DataList   L//Control   C)   <br />     <br />   你认为是写controlq是写datalist代码的通用性高?<br /> <br />   OOP~码原则:可能用接口~程<br /> <img src ="http://www.tkk7.com/ljy032/aggbug/170538.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ljy032/" target="_blank">风雨兼程</a> 2007-12-26 11:44 <a href="http://www.tkk7.com/ljy032/archive/2007/12/26/170538.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于sqlhelper.cs http://www.tkk7.com/ljy032/archive/2007/12/26/170508.html风雨兼程风雨兼程Wed, 26 Dec 2007 02:30:00 GMThttp://www.tkk7.com/ljy032/archive/2007/12/26/170508.htmlhttp://www.tkk7.com/ljy032/comments/170508.htmlhttp://www.tkk7.com/ljy032/archive/2007/12/26/170508.html#Feedback0http://www.tkk7.com/ljy032/comments/commentRss/170508.htmlhttp://www.tkk7.com/ljy032/services/trackbacks/170508.htmlpublic abstract class SqlHelper
          {
              public static readonly string connectionString = ConfigurationManager.ConnectionStrings["SqlConnString"].ConnectionString;
        
              SqlConnection conn;

              #region open SqlConnection
              public static void Open() {
                   conn = new SqlConnection(connectionString);
                   if (conn.State != ConnectionState.Open)
                      conn.Open();
              }    
              #endregion

              #region close SqlConnection
              public static void Close() {
                  if (conn != null)
                  {
                      conn.Close();
                      conn.Dispose();
                  }
              }        
              #endregion

              #region prepare SqlCommand
              private static void PrepareCommand(SqlCommand cmd, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) {
                  Open();
                  cmd.Connection = conn;
                  cmd.CommandType = cmdType;
                  cmd.CommandText = cmdText;

                  if (cmdParms != null)
                  {
                      foreach (SqlParameter parm in cmdParms)
                          cmd.Parameters.Add(parm);
                  }
              }
              #endregion

              #region parm cache
              /*
               使用一个哈希表来保存缓存的参数 只缓存参数名
               哈希表的特点:一个键对应一个值key对value(为object需要类型{?        不能出现两个相同的键 否则error
         
               下面的哈希表parmCache定义为static即一ơ定义全局使用
               所以可能会出现有h在读的时候,有h在写Q一般会用Lock像Asp中用Application["count"]来统计点?yn)L一?br />                要先锁后解锁
               ?net框架提供了Synchroized          sync和syncroize中文意?同步Q同时发?br />                来提供这一操作
              */
              private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());

              public static void CacheParameters(string cacheKey, params SqlParameter[] commandParameters) {
                  parmCache[cacheKey] = commandParameters;
              }

              /*
              1、ؓ何要克隆?Z不直接return cachedParms
         
              有一个参数数l?br />               SqlParameter[] parms={
              new SqlParameter("@num1",SqlDbType.Int,4),
              new SqlParameter("@num2",SqlDbType.Int,4)
              }
              ~存该数l?br />               用户a和b都执行插入操?br />               a用户插入?,1
              b用户插入?,2
              如果不用克隆的话Q参数数l只有一?br />               ?个用户需要根据不同的情况赋于不同的?br />               所以就用了克隆?br />         
              2?ICloneable)cachedParms[i]先将HashTable转ؓICloneableq样HashTable具有了Clone()克隆Ҏ(gu)?br />               克隆一份后是什么类型呢Q,当然要强制{化ؓ(SqlParameter)?br />               最后将它赋值给clonedParms[i]
              */       
              public static SqlParameter[] GetCachedParameters(string cacheKey) {
                  SqlParameter[] cachedParms = (SqlParameter[])parmCache[cacheKey];

                  if (cachedParms == null)
                      return null;
                  SqlParameter[] clonedParms = new SqlParameter[cachedParms.Length];

                  for (int i = 0; i < cachedParms.Length; i++)
                      clonedParms[i] = (SqlParameter)((ICloneable)cachedParms[i]).Clone();

                  return clonedParms;
              }
              #endregion        
        
              //below method support sqltext and procedure

              #region ExecuteReader
              /*
               parms的作用,q也是一个知识点
               举例:
               ExecuteReader(*,*,null)成功q行
               ExecuteReader(*,*,new SqlParameter(*))成功q行
               ExecuteReader(*,*,new SqlParameter(*),new SqlParameter(*))成功q行
               ExecuteReader(*,*,{new SqlParameter(*),new SqlParameter(*),})成功q行
               它让参数cd和参CCQ?br />                q可l了不是一般的好处Q你不必为SqlParameter和SqlParameter[]q行重蝲Q写上两个函?br />                又ؓnull写上一个函敎ͼ因ؓnull会不明确调用SqlParameter的函数还是SqlParameter[]的函?br />                啥你不知道我在说什么,打屁?那回ȝ看c++的函数重?br />                */
              public static SqlDataReader ExecuteReader(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {
            
                  SqlCommand cmd = new SqlCommand();

                  try {
                      PrepareCommand(cmd, null, cmdType, cmdText, commandParameters);
                      SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                      cmd.Parameters.Clear();
                      return rdr;
                  }
                  catch {
                      Close();
                      throw;
                  }
              }
              #endregion

              #region ExecuteNonQuery
              public static void ExecuteNonQuery(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {

                  SqlCommand cmd = new SqlCommand();

                  PrepareCommand(cmd, cmdType, cmdText, commandParameters);
                  cmd.ExecuteNonQuery();
                  cmd.Parameters.Clear();

                  Close();
              }
              #endregion

              #region ExecuteScalar
              public static object ExecuteScalar(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {

                  SqlCommand cmd = new SqlCommand();

                  PrepareCommand(cmd, cmdType, cmdText, commandParameters);
                  object val = cmd.ExecuteScalar();
                  cmd.Parameters.Clear();

                  Close();
                  return val;
              }
              #endregion


          }
}



风雨兼程 2007-12-26 10:30 发表评论
]]>
框架怎样实现高度随内容自动增?/title><link>http://www.tkk7.com/ljy032/archive/2007/04/29/114626.html</link><dc:creator>风雨兼程</dc:creator><author>风雨兼程</author><pubDate>Sun, 29 Apr 2007 10:03:00 GMT</pubDate><guid>http://www.tkk7.com/ljy032/archive/2007/04/29/114626.html</guid><wfw:comment>http://www.tkk7.com/ljy032/comments/114626.html</wfw:comment><comments>http://www.tkk7.com/ljy032/archive/2007/04/29/114626.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/ljy032/comments/commentRss/114626.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ljy032/services/trackbacks/114626.html</trackback:ping><description><![CDATA[<p>main.htm:</p> <p><html>  <br>    <head>  <br>       <meta  http-equiv='Content-Type'  content='text/html;  charset=gb2312' />  <br>       <meta  name='author'  content='F.R.Huang(meizz梅花?//www.meizz.com' />  <br>       <title>iframe自适应加蝲的页面高?lt;/title>  <br>    </head>  <br>     <br>    <body><br>        <div><iframe src="child.htm"></iframe></div><br>    </body><br></html></p> <p>child.htm:</p> <p><html>  <br><head>  <br>    <meta  http-equiv='Content-Type'  content='text/html;  charset=gb2312' />  <br>    <meta  name='author'  content='F.R.Huang(meizz梅花?//www.meizz.com' />  <br>    <title>iframe  自适应其加载的|页(多浏览器兼容)</title>  <br>    <script type="text/javascript"><br>    <!--<br>    function iframeAutoFit()<br>    {<br>        try<br>        {<br>            if(window!=parent)<br>            {<br>                var a = parent.document.getElementsByTagName("IFRAME");<br>                for(var i=0; i<a.length; i++) //author:meizz<br>                {<br>                    if(a[i].contentWindow==window)<br>                    {<br>                        var h1=0, h2=0;<br>                        a[i].parentNode.style.height = a[i].offsetHeight +"px";<br>                        a[i].style.height = "10px";<br>                        if(document.documentElement&&document.documentElement.scrollHeight)<br>                        {<br>                            h1=document.documentElement.scrollHeight;<br>                        }<br>                        if(document.body) h2=document.body.scrollHeight;</p> <p>                        var h=Math.max(h1, h2);<br>                        if(document.all) {h += 4;}<br>                        if(window.opera) {h += 1;}<br>                        a[i].style.height = a[i].parentNode.style.height = h +"px";<br>                    }<br>                }<br>            }<br>        }<br>        catch (ex){}<br>    }<br>    if(window.attachEvent)<br>    {<br>        window.attachEvent("onload",  iframeAutoFit);<br>        //window.attachEvent("onresize",  iframeAutoFit);<br>    }<br>    else if(window.addEventListener)<br>    {<br>        window.addEventListener('load',  iframeAutoFit,  false);<br>        //window.addEventListener('resize',  iframeAutoFit,  false);<br>    }<br>    //--><br>    </script>  <br></head>  <br><body><br>    <table border="1" width="200" style="height: 400px; background-color: yellow"><br>        <tr><br>            <td>iframe  自适应其加载的|页(多浏览器兼容Q支持XHTML)</td><br>        </tr><br>    </table><br></body>  <br></html></p> <p> 很多人反应在IE7里用它会死机,那是因ؓ在自适应高度时触发了 window.onresize 事gQ而这个事件又去调用这个调?<iframe> 高度的函敎ͼ产生了死循环调用?/p> <img src ="http://www.tkk7.com/ljy032/aggbug/114626.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ljy032/" target="_blank">风雨兼程</a> 2007-04-29 18:03 <a href="http://www.tkk7.com/ljy032/archive/2007/04/29/114626.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://pufenghotel.com" target="_blank">AVþþƷ</a>| <a href="http://ryhjled.com" target="_blank">ۺ</a>| <a href="http://51huanxin.com" target="_blank">޹ۺ91Ʒ鶹</a>| <a href="http://njjngs.com" target="_blank">ѹۿվ</a>| <a href="http://se988.com" target="_blank">һػƬ</a>| <a href="http://anyliz.com" target="_blank">Ʒۺһ߹ۿ </a>| <a href="http://jsky163.com" target="_blank">޷츾 </a>| <a href="http://686kp.com" target="_blank">ɫ</a>| <a href="http://czxgjt.com" target="_blank">97Ƶ</a>| <a href="http://www97544.com" target="_blank">ŷ޴ɫУ԰С˵</a>| <a href="http://socgl.com" target="_blank">þþƷȫۿ</a>| <a href="http://snbbearing.com" target="_blank">޼ƵͼƬ</a>| <a href="http://k8h9.com" target="_blank">޾ƷƷ߹ۿ</a>| <a href="http://dszb0099.com" target="_blank">ѿһһƬ</a>| <a href="http://jggbk.com" target="_blank">þþþAVרվ</a>| <a href="http://cg-fun.com" target="_blank">ƷžžþƵ</a>| <a href="http://2002tw.com" target="_blank">˳߹ۿ</a>| <a href="http://4388x4.com" target="_blank">þֻƷ99re</a>| <a href="http://8b22.com" target="_blank">޾ƷŮþþþ</a>| <a href="http://ddxsrd.com" target="_blank">߹ۿĶ</a>| <a href="http://lcqkp.com" target="_blank">ҹһӰԺ</a>| <a href="http://dddd20.com" target="_blank">AëƬ</a>| <a href="http://liulaogendawutai.com" target="_blank">޾ƷҺһ</a>| <a href="http://cijishiye.com" target="_blank">߹ۿƬ</a>| <a href="http://hkcdk.com" target="_blank">ҹƬ</a>| <a href="http://igao4.com" target="_blank">޹Ƭ߲</a>| <a href="http://wwwly6080.com" target="_blank">պƷѵӰ</a>| <a href="http://se969.com" target="_blank">޳avѿ</a>| <a href="http://ningxialanh.com" target="_blank">ۺһƷþ</a>| <a href="http://6000cpkj.com" target="_blank">ԸŮƵ߹ۿѾƷ</a>| <a href="http://cg-fun.com" target="_blank">˾Ʒþ޸岻</a>| <a href="http://778002.com" target="_blank">޾Ʒɫ</a>| <a href="http://wwwby1378.com" target="_blank">þþþþþõѲ </a>| <a href="http://44od.com" target="_blank">޾ǧ˾ղ</a>| <a href="http://www1616hh.com" target="_blank">ŷպav</a>| <a href="http://goldwellib.com" target="_blank">þ91Ƶۿվ</a>| <a href="http://3c3w.com" target="_blank">һɫþ88ۺ޾Ʒ</a>| <a href="http://bbby6.com" target="_blank">һƬѿ</a>| <a href="http://626632.com" target="_blank">ѿƵվ</a>| <a href="http://438266.com" target="_blank">Ƭ߹ۿѹۿȫй</a>| <a href="http://12345ww.com" target="_blank">þþþAV</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>