




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、高级软件人才实作培训专家高级软件人才实作培训专家北京传智播客教育 如鹏网站内搜索项目如鹏网站内搜索项目讲师:杨中科讲师:杨中科高级软件人才实作培训专家高级软件人才实作培训专家主要技术点lLucene.Net:搜索引擎核心。lLog4Net:日志。l定时框架:Quartz.Net。lJQuery、Json、AJAXl大型网站技术应用:SEO、缓存;应用复习:分页。高级软件人才实作培训专家高级软件人才实作培训专家教学目的l掌握互联网项目的开发,初步了解SEO(搜索引擎优化,在baidu、google找你的网站)相关概念。l掌握缓存等高并发系统技术l学会使用Log4Net等技术开发满足审计性要求的系
2、统,使用Quartz.Net开发计划任务功能。l复习、提高JQuery、AJAX、分页、Repeater等技术在实际项目中的应用。l掌握基于Lucene.Net的搜索引擎技术。高级软件人才实作培训专家高级软件人才实作培训专家站内搜索功能演示l输入关键词搜索出相关信息:尝试搜“大学计算机专业”。能够拆分出“大 大学 学 计算机 专业 ”这些有意义的关键词,能够按照关键词进行模糊匹配,这是用SQL语句中的Like做不到的,而且用Like语句对数据库服务器的压力也大。l搜索建议:输入“网管”立即提示其他人搜索过的“网管”相关的搜索词汇,选择一条后就按照选择的词汇进行搜索。l查询结果分页。l搜索结果中
3、的关键词高亮显示,并且预览包含关键词的段落l搜索框下方显示最热的搜索词汇。l右侧显示搜索耗时。l每隔12小时启动一次爬取、索引过程。l打开项目根目录下的searchlog.txt查看爬虫日志和搜索日志。l面试问:页面数据量:几十万条。高级软件人才实作培训专家高级软件人才实作培训专家l1、和用“select * from t where body like %计算机% ”的区别:l(1)效率。like会造成全表扫描。l(2)like无法实现“怎样学编程”匹配“怎样学习编程”l为什么不用discuz的搜索,因为discuz的就是用like实现。l蜘蛛,spider 爬网站。l站内搜索C语言 sit
4、e:l爬网站的过程:l1、发现网站。百度把csdn当成关键网站,顺着已知的网站链接找到新的网站或者新的页面。lSEO(搜索引擎优化)的第一个手段:建外链(外部链接)。新网站吸引蜘蛛。对于非新网站,搜索引擎考虑一个“权重”,重点考察外链数量。权重越高搜索结果越靠前,“权重”的一个重要因素就是“外链”数量,外链质量(外链网站的PR值,PageRank,决定一个网站的质量的值,PR值越高网站越重要,原创、创建时间等等),Alexa 排名(全球网站排名)l页面数据量:几十万条。lSEO(搜索引擎优化)目的:让搜索引擎更多的收录网站的页面,让被收录页面的权重更靠前,让更多的人能够通过搜索引擎进入这个网站
5、。2、抓取网页。蜘蛛会定时抓取网站的内容,发现网站内容变化、发现新增内容就反映到搜索引擎中。lrobots.txt是公约,搜索引擎都建议遵守,相当于一个指路牌:想让那些搜索引擎搜索,想让那些页面搜索高级软件人才实作培训专家高级软件人才实作培训专家老张语录l实现软件的某些功能就是按规定的流程步骤调用人家的API,人家往往提供例子代码,只要能看懂例子和文档,稍作修改即可实现自己的需求,故流程调用步骤无须记忆,即使你记住,十天不用,照样忘光,实际工作会涉及许多小功能调用,某功能数月或数年才用一次,故学软件开发死记某功能调用流程很不可取。l软件开发中会涉及许多琐碎的功能应用细节,这些细节更新和变化速度
6、很快,所以好的开发人员必须掌握快速学习方法,否则,其软件开发工作之路将会非常艰辛,并且走不长远。我找到的一条快速学习方法就是不记忆应用细节,只去理解原理和找到案例与文档,细节没有存储在脑袋中,但在需要的时候可以找出来。高级软件人才实作培训专家高级软件人才实作培训专家关于搜索l有一定访问量的互联网站都有站内搜索功能,比如verycd、优酷、豆瓣、cnblogs、mop、淘宝、大众点评网等。l为什么不用数据库全文检索?数据库全文检索很傻瓜化,和普通SQL一样。数据全文检索灵活性不强,而且需要数据库开启全文检索功能才行,对于一些数据库管理权不在自己手里的应用(比如虚拟主机)来说不方便。l为什么不用百
7、度、google的站内搜索(site:):受制于人,会被K;索引不及时、不全面、不精准;用户体验感差l这里主要讲解最有广泛应用价值的站内搜索技术,像开发百度、google那种站外搜索相关的技术不讲。这个如鹏网站内搜索的例子还是有一点站外搜索的影子,因为DiscuzNT不是自行开发的,因此仍然是启动蜘蛛去依次抓取各个帖子。普通的站内搜索做起来比这个更简单,在如鹏网CMS系统的项目中就是使用纯站内搜索的技术。l现在运行的如鹏网是PHP版的Discuz,开发测试用的是.Net版本的DiscuzNT!,对站内搜索来说没什么区别。高级软件人才实作培训专家高级软件人才实作培训专家环境准备l如鹏网测试环境的
8、搭建(绿色)服务器使用Cassini:相当于迷你IIS,是VisualStudio 自带的调试服务器的开源版本。将ItcastDiscuzNT解压到不还原的盘。启动CassiniDev.exe,Physical Path选择ItcastDiscuzNT路径,点击【Start】,点击超链接进入系统。lDiscuzNT!使用简介管理员用户名:admin密码:123456发帖、编辑帖、删帖。被删的帖子用webclient下载并不会报错。帖子被删除了再去访问会提示该主题不存在帖子的编号是连续的。删帖后下面的帖子编号不会乱(为什么要这样?)点击RSS按钮查看最近的发帖,RSS是Web2.0中的一个重要的
9、功能,可以通过周博通、Google Reader等工具及时了解网站的最新更新,而不是每次都去登录网站。RSS是XML格式。高级软件人才实作培训专家高级软件人才实作培训专家Log4NetlLog4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件、数据库、EventLog等),日志就是程序的黑匣子,可以通过日志查看系统的运行过程,从而发现系统的问题。日志的作用:将运行过程的步骤、成功失败记录下来,将关键性的数据记录下来将运行过程的步骤、成功失败记录下来,将关键性的数据记录下来分析系统问题所在。分析系统问题所在。Log4J。l看如鹏站内搜索的日志文件。对于网站来讲,不能把异常信
10、息显示给用户,异常信息只能记录到日志,出了问题把日志文件发给开发人员,就能知道问题所在。l配置Log4Net环境新建一个WebApplication,添加一个“应用程序配置文件”(App.config)添加对log4net.dll的引用在Web.Config (或App.Config)添加配置,见备注初始化:在程序最开始加入log4net.Config.XmlConfigurator.Configure();在要打印日志的地方LogManager.GetLogger(typeof(Program).Debug(信息); 。通过LogManager.GetLogger传递要记录的日志类类名获得这
11、个类的ILog(这样在日志文件中就能看到这条日志是哪个类输出的了),然后调用Debug方法输出消息。因为一个类内部不止一个地方要打印日志,所以一般把ILog声明为一个static字段。输出错误信息用ILog.Error方法,第二个参数可以传递Exception对象。log.Error(*错误+ex),log.Error(*错误,ex)测试代码:见附件。高级软件人才实作培训专家高级软件人才实作培训专家Log4Net相关概念(*)lAppender:可以将日志输出到不同的地方,不同的输出目标对应不同的Appender:RollingFileAppender(滚动文件)、AdoNetAppender
12、(数据库)、SmtpAppender (邮件)等。llevel(级别):标识这条日志信息的重要级别。NoneFatalERRORWARNDEBUGINFOALL,设定一个Level,那么低于这个Level的日志是不会被写到Appender中的。lLog4Net还可以设定多个Appender,可以实现同时将日志记录到文件、数据、发送邮件等;可以设定不同的Appender的不同的Level,可以实现普通级别都记录到文件,Error以上级别发送邮件;可以实现对不同的类设定不同的Appender;还可以自定义Appender,这样可以自己实现将Error信息发短信等。l(*)除了Log4Net,还有E
13、nterprise Library中的Logging Application Block、Apache的CommonLog 以及NLog等,都差不多。l用Log4Net有什么好处?自己写文件不一样吗?灵活,可以不改代码只要改配置就可以做任意的控制。l常错:把项目的名字(本质上是程序集的名字)建成了log4net高级软件人才实作培训专家高级软件人才实作培训专家Lucene.Net简介lLucene.Net是由Java版本的Lucene移植过来的,所有的类、方法都几乎和Lucene一模一样,因此使用时参考Lucene 即可。lLucene.Net只是一个全文检索开发包,不是一个成型的搜索引擎,它的
14、功能就是:把数据扔给Lucene.Net ,查询数据的时候从Lucene.Net 查询数据,可以看做是提供了全文检索功能的一个数据库。Lucene.Net不管文本数据怎么来的。用户可以基于Lucene.Net开发满足自己需求的搜索引擎。 Lucene.Net只能对文本信息进行检索。如果不是文本信息,要转换为文本信息,比如要检索Excel文件,就要用NPOI把Excel读取成字符串,然后把字符串扔给Lucene.Net。Lucene.Net会把扔给它的文本切词保存,加快检索速度。高级软件人才实作培训专家高级软件人才实作培训专家分词l分词是核心的算法,搜索引擎内部保存的就是一个个的“词(Word)
15、”。英文分词很简单,按照空格分隔就可以。中文则麻烦,把“北京,Hi欢迎你们大家” 拆成“北京 Hi 欢迎 你们 大家”。l“the”,“,”,“和”,“啊”,“的”等对于搜索来说无意义的词一般都属于不参与分词的无意义单词(noise word)。lLucene.Net中不同的分词算法就是不同的类。所有分词算法类都从Analyzer类继承,不同的分词算法有不同的优缺点。l(*)内置的StandardAnalyzer是将英文按照空格、标点符号等进行分词,将中文按照单个字进行分词,一个汉字算一个词。代码见备注l(*)二元分词算法,每两个汉字算一个单词,“欢迎你们大家”会分词为“欢迎 迎你 你们 们大
16、 大家”,网上找到的一个二元分词算法CJKAnalyzer。面试的时候能说出不同的分词算法的差异。l基于词库的分词算法,基于一个词库进行分词,可以提高分词的成功率。有庖丁解牛、盘古分词等。效率低。高级软件人才实作培训专家高级软件人才实作培训专家盘古分词算法使用l具体用法参考PanguMannual.pdfl打开PanGu4LuceneWebDemoBin,将Dictionaries添加到项目根路径(改名为Dict),添加对PanGu.dll(同目录下不要有Pangu.xml,那个默认的配置文件的选项对于分词结果有很多无用信息)、PanGu.Lucene.Analyzer.dll的引用l把上节代
17、码的Analyzer用PanGuAnalyzer代替l运行报错?通用技巧:把Dict目录下的文件“复制到输出目录”设定为“如果较新则复制”。l(*)Dictionaries下几个txt文件简介l词库的编辑,使用DictManage.exe,对单词编辑的时候要先查找。工作的项目中要将行业单词添加到词库中,比如餐饮搜索、租房搜索、视频搜索等。高级软件人才实作培训专家高级软件人才实作培训专家Lucene.Net核心类简介lDirectory表示索引文件(L用来保存用户扔过来的数据的地方)保存的地方,是抽象类,两个子类FSDirectory(文件中)、RAMDirectory (内存中)。使用的时候别
18、和IO里的Directory弄混了。l创建FSDirectory的方法,FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath),new NativeFSLockFactory(), path索引的文件夹路径lIndexReader对索引进行读取的类,对IndexWriter进行写的类。lIndexReader的静态方法bool IndexExists(Directory directory)判断目录directory是否是一个索引目录。IndexWriter的bool IsLocked(Directory di
19、rectory) 判断目录是否锁定,在对目录写之前会先把目录锁定。两个IndexWriter没法同时写一个索引文件。IndexWriter在进行写操作的时候会自动加锁,close的时候会自动解锁。IndexWriter.Unlock方法手动解锁(比如还没来得及close IndexWriter 程序就崩溃了,可能造成一直被锁定)。高级软件人才实作培训专家高级软件人才实作培训专家创建索引1l构造函数:IndexWriter(Directory dir, Analyzer a, bool create, MaxFieldLength mfl)因为IndexWriter把输入写入索引的时候,L是把写
20、入的文件用指定的分词器将文章分词(这样检索的时候才能查的快),然后将词放入索引文件。lvoid AddDocument(Document doc),向索引中添加文档(Insert)。Document类代表要索引的文档(文章),最重要的方法Add(Field field),向文档中添加字段。Document是一片文档,Field是字段(属性)。Document相当于一条记录,Field相当于字段。高级软件人才实作培训专家高级软件人才实作培训专家创建索引2lField类的构造函数 Field(string name, string value, Field.Store store, Field.I
21、ndex index, Field.TermVector termVector): name表示字段名; value表示字段值;store表示是否存储value值,可选值 Field.Store.YES存储, Field.Store.NO不存储, Field.Store.COMPRESS压缩存储;默认只保存分词以后的一堆词,而不保存分词之前的内容,搜索的时候无法根据分词后的东西还原原文,因此如果要显示原文(比如文章正文)则需要设置存储。 index表示如何创建索引,可选值Field.Index. NOT_ANALYZED,不创建索引,Field.Index. ANALYZED,创建索引;创建索
22、引的字段才可以比较好的检索。是否碎尸万段!是否需要按照这个字段进行“全文检索”。termVector表示如何保存索引词之间的距离。“北京欢迎你们大家”,索引中是如何保存“北京”和“大家”之间“隔多少单词”。方便只检索在一定距离之内的词。为什么要把帖子的url做为一个Field,因为要在搜索展示的时候先帖子地址取出来构建超链接,所以Field.Store.YES;一般不需要对url进行检索,所以Field.Index.NOT_ANALYZEDl案例:对1000至1100号帖子进行索引。“只要能看懂例子和文档,稍作修改即可实现自己的需求”高级软件人才实作培训专家高级软件人才实作培训专家搜索lInd
23、exSearcher是进行搜索的类,构造函数传递一个IndexReader。IndexSearcher的void Search(Query query, Filter filter, Collector results)方法用来搜索,Query是查询条件, filter目前传递null, results是检索结果,TopScoreDocCollector.create(1000, true)方法创建一个Collector,1000表示最多结果条数,Collector就是一个结果收集器。lQuery有很多子类,PhraseQuery是一个子类。 PhraseQuery用来进行多个关键词的检索,调
24、用Add方法添加关键词,query.Add(new Term(字段名, 关键词),PhraseQuery. SetSlop(int slop)用来设置关键词之间的最大距离,默认是0,设置了Slop以后哪怕文档中两个关键词之间没有紧挨着也能找到。query.Add(new Term(字段名, 关键词)query.Add(new Term(字段名, 关键词2)类似于:where 字段名 contains 关键词 and 字段名 contais 关键词2高级软件人才实作培训专家高级软件人才实作培训专家搜索2l调用TopScoreDocCollector的GetTotalHits()方法得到搜索结果条
25、数,调用Hits的TopDocs TopDocs(int start, int howMany)得到一个范围内的结果(分页),TopDocs的scoreDocs字段是结果ScoreDoc数组, ScoreDoc 的doc字段为Lucene.Net为文档分配的id(为降低内存占用,只先返回文档id),根据这个id调用searcher的Doc方法就能拿到Document了(放进去的是Document,取出来的也是Document);调用doc.Get(字段名)可以得到文档指定字段的值,注意只有Store.YES的字段才能得到,因为Store.NO的没有保存全部内容,只保存了分割后的词。l编写检索功
26、能,搜索“网站 志愿者”。练习分词,用户不用空格。如果确定用盘古分词,那么用盘古的Segment类更方便。l检索不出来的可能的原因:路径问题,分词是否正确、盘古分词如果指定忽略大小写,则需要统一按照小写进行搜索lTodo:第一个版本应该保存body和title,搜索结果形成超链接,不显示正文。高级软件人才实作培训专家高级软件人才实作培训专家网页采集l复习WebClient的用法,调用DownloadString方法下载页面。抓取DiscuzNT!的900至1000贴。乱码怎么办?乱码的唯一原因“编码不一致”。lWebClient抓取到的是页面的源代码,如何得到页面的标题、文字、超链接呢?l用m
27、shtml进行html的解析,IE就是使用mshtml进行网页解析的。添加对Microsoft.mshtml的引用(如果是VS2010,修改这个引用的“嵌入互操作类型”为False。(*)“复制本地”设置为True、“特定版本”设置为False,这样在没有安装VS的机器中也可以用。) HTMLDocumentClass doc = new HTMLDocumentClass();doc.designMode = on; /不让解析引擎去尝试运行javascriptdoc.IHTMLDocument2_write(要解析的代码);doc.title、doc.body.innerText,更多用法
28、自己探索。所有Dom方法都能在mshtml中调用高级软件人才实作培训专家高级软件人才实作培训专家搜索引擎第一版l客户要求:/能把零件拼起来!检索论坛中帖子编号在900至1000之间的帖子打开一个页面点击一个【开始索引】按钮启动索引,索引完成显示耗时。(对于已经被删掉的帖子不进行索引。)索引过程中要记录日志(Log4Net)(正在索引*条,索引*条的时候出错,索引完成)。一个按钮点击开始索引。打开一个页面进行搜索,不仅用户输入“网站 志愿者”可以搜索出需要的数据,用户输入“网站志愿者”也可以搜索出。query.Add(new Term(body,str)搜索结果页面显示标题和帖子的一部分(帖子的
29、前100个字)。点击标题可以进入帖子页面。结果页面暂时不用分页。不用美化界面l讨论方案、开始开发吧!两份食材,一份家乐浓汤宝!注意做事的步骤和遇到问题的解决方式,小步快走。先把组件调通,不要一上来写好多、出错了再改:Log4Net、Lucene、盘古。l思考:Log4Net在哪初始化配置?高级软件人才实作培训专家高级软件人才实作培训专家解决:高亮显示l高亮显示,只显示包含关键词的部分。参考盘古分词的文档。l从网上、文档找来的代码不用细读每行代码,先把它拿过来运行通过再说。l不用每次改代码都重启,在项目的属性页面的Web中选中“启用编辑并继续(Enable Edit and Continue)”
30、高级软件人才实作培训专家高级软件人才实作培训专家解决: 最大帖子编号l最大贴,可以读取rss的内容:tools/rss.aspx,使用Linq To XML分析RSS。l最大帖子编号:因为RSS中就是最新帖子信息,所以读取RSS的一个item的link就是帖子地址,用正则表达式就可以分析出最大帖子编号高级软件人才实作培训专家高级软件人才实作培训专家(*)解决:只索引帖子的有意义部分l方法1:doc.body.innerText,得到整个页面的文字信息。然后找特征值“介于【字体大小】和【收藏】之间的内容”,这是目前很多采集器的方案。“火车头采集器”、DEDEcms采集器等。存在的问题,必须找到确
31、切的特征,否则可能会误判。l方法2:IHTMLElement firstpost = doc.getElementById(firstpost);if (firstpost != null) Body = firstpost.innerText; 补充:http:/ Term(url, aurl);/删除旧的收录/注意DeleteDocuments不是静态方法删除索引中所有url字段的值等于aurl的Document,相当于delete from tttt where url=url。易错:url不要设置Analized,否则DeleteDocuments会删不掉,因为把url当成一个词匹配了
32、,当然没有。异常处理!不要因为一个的异常导致整个索引失败。高级软件人才实作培训专家高级软件人才实作培训专家定时任务l项目要求每天定时索引当天最新的帖子,不可能派一个人每天点击“开始索引”按钮,而应该是计算机定时自动去触发索引的动作。l思考有哪些方法?高级软件人才实作培训专家高级软件人才实作培训专家Quartz.NetlQuartz.Net是一个定时任务框架,可以实现灵活的定时任务,开发人员只要编写少量的代码就可以实现“每隔1小时执行”、“每天22点执行”、“每月18日的下午执行8次”等各种定时任务。lQuartz.Net中的概念:计划者(IScheduler)、工作(IJob)、触发器(Tri
33、gger)。给计划者计划者一个工作工作,让他在Trigger(什么(什么条件下做这件事)条件下做这件事)触发的条件下执行这个工作工作l将要定时执行的任务的代码写到实现IJob接口的Execute方法中即可,时间到来的时候Execute方法会被调用。lCrondTrigger是通过Crond表达式设置的触发器,还有 SimpleTrigger等简单的触发器。可以通过TriggerUtils的MakeDailyTrigger、MakeHourlyTrigger等方法简化调用。调用代码参考备注。l实现:用Quartz.Net完成定时索引。思考初始化定时和结束定时的代码放到哪里高级软件人才实作培训专家
34、高级软件人才实作培训专家解决:路径可配置化l连接配置信息放到Web.Config的ConnectionStrings段中,而普通的自定义配置则可以写到AppSettings段中,哪些需要配置:索引的路径,被索引的网站url,索引的时间间隔。l读取string indexPath = ConfigurationManager.AppSettingsIndexPath,使用ConfigurationManager添加引用System.Configurationl使用request.MapPath或者Server.MapPath把相对于网站根路径的路径转换为绝对路径(不是转换为http:/ type
35、=text id=kw1 name=kw value=/高级软件人才实作培训专家高级软件人才实作培训专家第二版功能需求l自动完成l热门词汇(SEO)l显示分词、执行耗时l分页l页面美化高级软件人才实作培训专家高级软件人才实作培训专家搜索记录l每次有用户搜索都把用户的搜索行为记录下来,供热门搜索和搜索建议用。三个字段:搜索时间、搜索词(一句话)、访问者IP地址l使用三层,增加插入记录的方法,在搜索的时候插入记录,IP地址:Request.UserHostAddress。高级软件人才实作培训专家高级软件人才实作培训专家自动完成l用JQuery的实现,在google搜索“JQuery AutoCom
36、plete”,找到了JQueryUI库中的AutoComplete组件。http:/ source: SearchSuggestion.ashx);。要求服务器返回搜索建议词汇的时候将词汇以字符串数组的形式(JSon格式)返回给浏览器。l不要忘了引入jquery、jqueryui的js和css,注意顺序。lautocomplete的source属性指定自动完成数据的数据来源l生命周期的问题:在用户敲入文字的时候,Autocomplete组件向ashx页面发出ajax请求,并且将ashx返回的json格式的数组显示出来。l避免缓存:get改post,请求字符串里面加一个每次都不一样的参数。高级软
37、件人才实作培训专家高级软件人才实作培训专家自动完成服务器端l客户端向服务器端发起请求的时候是怎么把用户输入的值发送到服务器的呢?你猜,你试!l服务端返回建议词数组。lDAL增加取得搜索次数最多的包含用户输入值的历史记录,怎么编写SQL语句?l将查询结果用Linq进行处理然后发给客户端。高级软件人才实作培训专家高级软件人才实作培训专家热门词汇l在搜索框下方显示搜索次数最多的语句,语句添加超链接,用户可以点击语句的超链接快捷的开始搜索。用ObjectDataSource和Repeater控件。l在搜索框下方显示热门词汇有利于SEO,方便著名的搜索引擎收录网站的搜索结果页面,因为搜索引擎只认超链接。
38、很多站内搜索都有热门词汇就是这么回事。l热门词汇是所有访问者每次访问页面的时候都要显示的,所以需要缓存。这个是缓存的一个很好的例子,面试的时候问到缓存的问题举这个例子就很好。l显示数据库中所有搜索次数最多的语句,好吗?不好,容易形成马太效应。只取一周之内的最热门。l在经常需要进行检索的字段上添加索引,可以提高检索速度。高级软件人才实作培训专家高级软件人才实作培训专家分页lDataPager等WebForm分页控件耦合性高,不满足互联网开发的需求,因此开发互联网项目的时候自己绘制分页更好。l使用RupengPager, 只是在拼字符串,逻辑复杂一点,没有新技术,只过一遍,不带着当堂写。自己写出来,也是小得瑟一把的“DataPager难用,自己写了一个更好用的分页控件”l用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 边坡锚杆锚索腰梁施工方案
- 浙江油田油管清洗施工方案
- 房屋地面铺装工程施工方案
- 三水装配式检查井施工方案
- “油茶+N”混交造林模式的技术创新与应用实践的效益详述
- 智能制造与供应链管理的策略及实施路径
- 数字化改造的必要性与挑战
- 变电站巡检的重要性
- 保温装饰单板施工方案
- 初级社会工作实务-初级社会工作者考试《社会工作实务》点睛提分卷4
- 2024年苏州经贸职业技术学院高职单招(英语/数学/语文)笔试历年参考题库含答案解析
- 伤口(压疮)的评估与记录
- 煤矿机电运输类台账(各种记录汇编)
- 风电场道路及平台施工组织方案
- 风险分级管控74411ppt课件(PPT 146页)
- 三八女神节活动策划PPT课件
- 毕业设计(论文)3000t自由锻液压机本体设计
- 风力发电机组PLC系统
- Q∕GDW 12131-2021 干扰源用户接入电网电能质量评估技术规范
- T∕CAEPI 32-2021 全尾砂膏体充填关键设备技术要求
- 第2章全站仪使用
评论
0/150
提交评论