基于XML的公交线路查询系统设计与实现-精品_第1页
基于XML的公交线路查询系统设计与实现-精品_第2页
基于XML的公交线路查询系统设计与实现-精品_第3页
基于XML的公交线路查询系统设计与实现-精品_第4页
基于XML的公交线路查询系统设计与实现-精品_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

NUM参考文献PAGE39

第一章绪论本章简要介绍公交查询系统的应用背景、发展现状及发展前景。1.1应用背景随着交通工具的不断革新,距离已经不再是人们足迹的羁绊,庞大复杂的交通网几乎覆盖了世界的每一个角落,使人们可以到达任何一个想去的地方,然而当人们面对交通网时却会因为它本身的复杂而显得不知所措,从而感觉到出行的麻烦。在过去,当人们在一个不熟悉的城市时,或不清楚本城市的公交线路时,只能采用打电话咨询,看交通地图,向熟人打听等传统方式查询公交信息,这样会浪费大家很多时间、精力和财力,而且得到的信息也不一定是可靠的。这是还没有公交线路查询系统时所出现的情况。在互联网普及的今天,交通信息服务的电子化、网络化是已经是必然的趋势,而提供良好的公交服务是建设和谐社会的基本要求。以信息化为基础,促进乘客、车辆、站点设施以及交通环境等要素之间的良性互动,能有效推动公交系统建设。为了能够为市民特别是为外来旅游、出差、就医、求职等急需了解本地的公交路线的人提供高效、快捷的公交信息查询,让他们可以方便的在网络上得到自己所需要的各种相关信息,以便减少各种可能产生的不必要的交通流量,提高公交的运作效率,节约出行时间。因此,开发一个供人们快速查找公交线路的网络程序是势在必行的。1.2发展现状近年来,公交查询系统发展迅速,各大城市基本都拥有着自己的公交线路查询系统,网络上也有着许多不同的版本。不过公交查询系统在发展的同时也存在着一些问题,还需要进行不断的规范和完善。最开始的公交查询系统脱离了网络,只是一种放在网络上供人下载后再查询的程序,可以说是一种单机程序。用户需下载后再使用程序来查询公交路线,且若有更新的版本还需更新程序。这样的查询费时费力,还容易被人在程序中种入木马,已经逐渐被淘汰;有一部分公交查询系统,它们只是把各条线路和线路的信息一一罗列在页面上,让用户自己一页一页的翻看查找,这样的公交查询根本不方便不快捷。一个真正完善的公交查询系统应该实现用户输入想查询的内容,系统自动给出查询结果,而不是让用户手动去翻找查询;也有一部分公交查询系统,它们的系统功能不完善,只实现了各个站点和线路的查询信息,而没有实现站点到站点的查询和转乘的功能,这也就是相当于一种电子地图。这种系统不能完全满足用户的需求;还有一部分公交查询系统,它们系统功能还算完善,但是页面结构复杂,而且页面上布满了广告和各种与公交查询无关的信息,容易误导使用者。这样使用户查询一点都不方便,而且影响美观度,也影响了系统在用户心目中的良好形象。除此之外,现行的公交查询系统还有着或多或少的缺陷。因此,公交查询系统的发展还有待进一步的规范和改进。1.3国内外研究概况目前,国内外公交查询系统都发展到了一个比较成熟的阶段,无论是从理论上还是从技术上都比较成熟。国外公交查询系统更是早已经实现了智能化、信息化、社会化。据相关资料了解,国外的公交查询系统现在已经将GIS、GPS、RS技术集合到公交查询系统中。GIS技术:即GeographyInfomationSystem,地理信息系统。简单说就是将地图与数据库相结合。GPS技术:即GlobePositionSystem,全球定位系统,通过每3颗卫星确定一个点的经纬度坐标,使用WGS_1984坐标系。RS技术:RemoteSensing,遥感。通过卫星或飞机接收地面反射波普,判断地面情况的技术。现在国内的公交查询系统也结合了很多技术,比如:基于ASP.NET+XML的公交查询系统,基于J2ME的公交查询系统,基于WebGIS公交查询系统。国内公交查询系统也正在向将GIS、GPS、RS技术相结合的方向发展。在20世纪90年代初意大利学者D.origo,V.Maniezzo,A.Colorni等通过模拟蚂蚁搜索路径的行为,发明出蚂蚁算法。该算法可以带记忆功能,选择某路径的次数最多,说明此路径是比较优的路径,其信息素的值也越大,为以后选择路径提供必要的信息。系统使用的时间越长,为乘客提供的信息越全面,越准确,系统也越智能化。1.4发展前景随着公交查询系统的不断发展完善,各种新技术的不断涌现,未来的公交查询系统将基于B/S架构,通过浏览器查询,通过计算机网络全面联网,实现中心控制、自动更新、异地查询等功能,同时可添加电话服务、语音服务、在线服务等功能,帮助用户更好的使用公交查询系统。还可以开发手机版本的公交线路查询系统,使用手机上网的用户可以轻松的随时随地进行公交线路查询,免去了上网的时间,大大方便了用户。1.5系统目标随着科学技术的迅猛发展,计算机已经得到了广泛的应用。几乎各行各业都有关于计算机的使用,这使得计算机已成为社会中普遍存在的事物。由于计算机的使用,使得人们在管理、应用及服务等各个领域使用数据方面变得更加简洁,更加方便,大大提高了工作效率,产生了以计算机为主体,以人为辅助的局面。在此所设计的公交车查询系统就是为了方便人员在数据查询方面的操作,使得他们在日常生活中都会达到事半功倍的效果,减轻了人力的负担,方便了数据的存储,增加了安全性。本系统能够使用户简单的查询出他们自己想要的车次经过哪些站点,在哪一站可以转乘,然后继续换乘哪路车;也可以预先知道可以通过哪些车次可以到达目的地。管理员可以通过对公交线路系统信息进行一系列的修改。

第二章相关理论基础本章简要介绍了数据库、XML、C#、B/S系统的一些知识及系统的查询算法。2.1数据库介绍数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式。数据库有很多种类型,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用。例如,企业或事业单位的人事部门常常要把本单位职工的基本情况(职工号、姓名、年龄、性别、籍贯、工资、简历等)存放在表中,这张表就可以看成是一个数据库。有了这个"数据仓库"人们就可以根据需要随时查询某职工的基本情况,也可以查询工资在某个范围内的职工人数等等。这些工作如果都能在计算机上自动进行,那企业的人事管理就可以达到极高的水平。此外,在财务管理、仓库管理、生产管理中也需要建立众多的这种"数据库",使其可以利用计算机实现财务、仓库、生产的自动化管理。数据库发展史数据库技术从诞生到现在,在不到半个世纪的时间里,形成了坚实的理论基础、成熟的商业产品和广泛的应用领域,吸引越来越多的研究者加入。数据库的诞生和发展给计算机信息管理带来了一场巨大的革命。三十多年来,国内外已经开发建设了成千上万个数据库,它已成为企业、部门乃至个人日常工作、生产和生活的基础设施。同时,随着应用的扩展与深入,数据库的数量和规模越来越大,数据库的研究领域也已经大大地拓广和深化了。30年间数据库领域获得了三次计算机图灵奖(C.W.Bachman,E.F.Codd,J.Gray),更加充分地说明了数据库是一个充满活力和创新精神的领域[1]。2.1.1数据库基本结构数据库的基本结构分三个层次,反映了观察数据库的三种不同角度。1.物理数据层它是数据库的最内层,是物理存贮设备上实际存储的数据的集合。这些数据是原始数据,是用户加工的对象,由内部模式描述的指令操作处理的位串、字符和字组成。2.概念数据层它是数据库的中间一层,是数据库的整体逻辑表示。指出了每个数据的逻辑定义及数据间的逻辑联系,是存贮记录的集合。它所涉及的是数据库所有对象的逻辑关系,而不是它们的物理情况,是数据库管理员概念下的数据库。3.逻辑数据层它是用户所看到和使用的数据库,表示了一个或一些特定用户使用的数据集合,即逻辑记录的集合。数据库不同层次之间的联系是通过映射进行转换的。2.1.2SQLServer2005SQLServer2005是Microsoft公司发行的关系型数据库管理与分析系统,它提供了功能全面、操作简单的图形界面。SQLServer2005具有较好的可伸缩性和可靠性,提供了以Web标准为基础的扩展数据库编程功能,可以满足电子商务和企业应用程序的要求。SQLServer2005支持XML和Internet标准,具有基于Web的分析能力,允许使用内置的存储过程以XML格式存储、更新、删除和检索数据。由于ASP.NET与SQLServer2005都是由微软公司出品的,所以在ASP.NET应用于后台程序中,有专门针对SQLServer2005的数据应用类库供用户使用,方便了用户对数据的操作。2.2XML介绍XML(ExtensibleMarkupLanguage)即可扩展标记语言,它是从1996年开始有其雏形,并向W3C(全球信息网联盟)提案,而在1998二月发布为W3C的标准(XML1.0)。XML的前身是SGML(TheStandardGeneralizedMarkupLanguage,标准通用标记语言),是自IBM从60年代就开始发展的GML(GeneralizedMarkupLanguage)标准化后的名称。XML与HTML一样,都是SGML。XML是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用。XML与Access,Oracle和SQLServer等数据库不同,数据库提供了更强有力的数据存储和分析能力,例如:数据索引、排序、查找、相关一致性等,XML仅仅是展示数据。事实上XML与其他数据表现形式最大的不同是:他极其简单。XML的简单使其易于在任何应用程序中读写数据,这使XML很快成为数据交换的唯一公共语言,虽然不同的应用软件也支持其它的数据交换格式,但不久之后他们都将支持XML,那就意味着程序可以更容易的与Windows、MacOS,Linux以及其他平台下产生的信息结合,然后可以很容易加载XML数据到程序中并分析他,并以XML格式输出结果。为了使得SGML显得用户友好,XML重新定义了SGML的一些内部值和参数,去掉了大量的很少用到的功能,因为这些繁杂的功能使得SGML在设计网站时显得复杂化。XML保留了SGML的结构化功能,这样就使得网站设计者可以定义自己的文档类型,XML同时也推出一种新型文档类型,使得开发者也可以不必定义文档类型[2]。2.3C#介绍C#是微软公司发布的一种面向对象的、运行于.NETFramework之上的高级程序设计语言。并在微软职业开发者论坛(PDC)上登台亮相。C#看起来与Java有着惊人的相似;它包括了诸如单一继承、接口、与Java几乎同样的语法和编译成中间代码再运行的过程。但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(ComponentObjectModel,组件对象模型)是直接集成的,而且它是微软公司.NETwindows网络框架的主角。C#语言定义主要是从C和C++继承而来,是给那些愿意牺牲C++一点底层功能,以获得更方便和更产品化的企业开发人员而创造的。C#简单、面向对象和类型安全。尽管它借鉴了C和C++的许多东西,但是在一些诸如名字空间、类、方法和异常处理等特定领域,它们之间还存在着巨大的差异。关于C#最重要的一点:它是现代的编程语言。它简化和现代化了C++在类、名字空间、方法重载和异常处理等领域。屏弃了C++的复杂性,使它更易用、更少出错[3]。2.3.1C#的特点C#是面向对象的语言,其主要有6个特点:1.生成中间特点:使用C#开发的应用程序,在编译成机器码,都是生成中间汇编形式的语言。只有当它们运行时,才会被编译成本地计算机可执行的代码。2.在命名空间中声明:当使用C#语言创建一个应用程序,就会在一个命名空间里创建一个或多个类。同时在这个命名空间里,还有可能声明要有结构体、变量等。这时就必须使用using关键字来引用其他的命名空间内容,用来支持对结构体等类型的操作。3.丰富的数据类型:C#语言拥有比C、C++更广泛和丰富的数据类型。4.有两个基本类:在C#语言中,Object类是所有其他类的基类,String类和Object类一样,是两个基类之一,都是C#语言的一部分。5.方法可当做参数传递:在一般情况下,默认的参数传递只是对基本数据类型进行值传递。但是在C#语言中,既可以通过值传递,也可以通过应用传递。通过引用传递参数允许函数成员(包括方法、属性、索引器、运算符)和构造函数等传递参数的值。6.与COM集成:COM技术是微软公司的WIN32组件技术。C#语言能与COM组件进行无缝集成。用C#语言编写的类可以子类化COM组件,所谓子类化就是指替换窗口的过程。C#语言生成的类也可以当做一个COM组件使用,可用任何.NET语言进行子类化。2.3.2C#中的数据库访问用.NET框架编写的(也包括用C#的)应用程序需要访问数据库时,将使用ADO.NET来实现数据库访问。ADO.NET是微软的数据访问框架的最新产物,它是.NET框架的一部分。在ADO.NET之前,程序员在ASP(ActiveServerPages)或VisualBasic中使用ADO(AtiveXDataObjects),这是一组COM组件,它通过一个易于使用的封装类提供对底层数据访问代码的访问。ADO.NET比ADO的功能更强大,它是在.NET代码中访问数据库的最好工具。.NET框架中的ADO.NET类型包括那些为访问SQLServer、OLEDB、ODBC和Oracle数据库而优化的类型。它们是基于通用类的,因此使用ADO.NET访问不同的DBMS是相似的。除此之外ADO.NET还将XML整合进来,这样一来数据的交换就变的非常轻松容易了。ADO.NET包含5大主要对象:·Connection对象就是数据库连接对象,专门进行数据库连接。·Command对象主要用于执行SQL数据库命令。·DataSet对象的目的就是想要实现独立于任何数据源的数据访问技术。·DataReader对象用于从数据源中获取高性能的数据流。·DataAdapter对象用于提供连接DataSet对象和数据源的桥梁。ADO.NET类型实现两个主要的功能:·数据访问:用于访问数据库中数据和操作数据库的类型;·数据表示:用于包含数据库数据(如数据表)的类型。这两种类型之间联系密切,在数据库开发中两种类型都会用到。然而,如果使用数据访问类型来填充数据表示类型将节省大量工作。ADO.NET目前的主流版本是3.5,比之前的版本提供了更先进的功能,主要包括以下高级特性:·支持批量复制,在其.NET类库中提供了批量复制类。·新的主要数据控件,包括DataGridView、DataConnector和DataNavigator。·DbProvidersFactories类,该类能导出本地计算机中的.NET数据提供者列表。·DataTable新增两个重要的方法:Load()方法和Save()方法。Load()方法可将数据对象直接加载到DataTable中,而Save()方法可以将DataTable中的数据保存到一个持久化的存储媒体中。·支持自定义的数据提供者。2.4最短路径算法介绍最短路经算法分静态最短路径算法和动态最短路径算法。静态最短路径算法是外界环境不变,计算最短路径。主要有Dijkstra算法,A*(AStar)算法。动态最短路径算法是外界环境不断发生变化,即不能计算预测的情况下计算最短路。如在游戏中敌人或障碍物不断移动的情况下。典型的有D*算法[4]。最短路径不仅仅指一般意义上的距离最短,还可以引申到其他的度量,如时间、费用、线路容量等。相应地,最短路径问题就成为最快路径问题、最低费用问题等。由于最短路径问题在实际中常用于汽车导航系统以及各种应急系统等(如110报警、119火警以及医疗救护系统),这些系统一般要求计算出到出事地点的最佳路线的时间应该在1s~3s内,在行车过程中还需要实时计算出车辆前方的行驶路线,这就决定了最短路径问题的实现应该是高效率的。其实,无论是距离最短、时间最快、费用最低,它们的核心算法都是最短路径算法。经典的最短路径算法——Dijkstra算法是目前多数系统解决最短路径问题采用的理论基础,只是不同系统对Dijkstra算法采用了不同的实现方法。Dijkstra算法的基本思路是:假设每个点都有一对标号(dj,pj),其中dj是从起源点s到点j的最短路径的长度(从顶点到其本身的最短路径是零路(没有弧的路),其长度等于零);pj则是从s到j的最短路径中j点的前一点。求解从起源点s到点j的最短路径算法的基本过程如下:1.初始化。起源点设置为:①ds=0,ps为空;②所有其他点:di=∞,pi=?;③标记起源点s,记k=s,其他所有点设为未标记的。2.检验从所有已标记的点k到其直接连接的未标记的点j的距离,并设置:dj=min[dj,dk+lkj]式中,lkj是从点k到j的直接连接距离。3.选取下一个点。从所有未标记的结点中,选取dj中最小的一个i:di=min[dj,所有未标记的点j]点i就被选为最短路径中的一点,并设为已标记的。4.找到点i的前一点。从已标记的点中找到直接连接到点i的点j*,作为前一点,设置:i=j*5.标记点i。如果所有点已标记,则算法完全推出,否则,记k=i,转到2再继续。从上面可以看出,在按标记法实现Dijkstra算法的过程中,核心步骤就是从未标记的点中选择一个权值最小的弧段,即上面所述算法的(2)~(5)步。这是一个循环比较的过程,如果不采用任何技巧,未标记点将以无序的形式存放在一个链表或数组中。那么要选择一个权值最小的弧段就必须把所有的点都扫描一遍,在大数据量的情况下,这无疑是一个制约计算速度的瓶颈。要解决这个问题,最有效的做法就是将这些要扫描的点按其所在边的权值进行顺序排列,这样每循环一次即可取到符合条件的点,可大大提高算法的执行效率[5]。还有一种基于Dijkstra算法的优化算法———邻接结点算法,该算法充分利用了网络拓扑信息中的弧段的连接关系,避免了使用含有大量无穷值的关联矩阵,使之更适合带有拐向限制设置的最短路径算法和大量结点的实际数据。实践证明,该算法可以节约大量的内存,对于结点数比较大的网络,或带有大量拐向限制设置的网络,具有较好的适用性。A*算法作为一种改进的Dijkstra算法,实际上是一种启发式搜索,所谓启发式搜索,就是利用一个估价函数评估每次的决策的价值,决定先尝试那一种方案。这样可以极大地优化普通的广度优先搜索。一般来说,从起始点A到终点B的最短路径是固定的,可以写一个函数Judge()来估计A到B的最短距离,如果程序已经尝试着从A沿着某条路线移动到了C点,那么认为这个方案的AB间的估计距离为A到C实际已经行走了的距离H加上用Judge()估计出的C到B的距离。如此,无论程序搜索展开到了哪一步,都会算出一个评估值,每一次决策后,将评估值和等待处理的方案一起排序,然后挑出待处理的各个方案中最有可能是最短路线的一部分的方案展开到下一步,一直循环到对象移动到目的地为止[6]。2.5B/S介绍B/S(browser/server,简称B/S)模式,即浏览器/服务器模式,它是基于Intranet的需求而出现并发展的。Intranet是应用TCP/IP协议建立的企事业单位内部专用网络,它采用诸如TCP/IP、HTTP、SMTP和HTML等Internet技术和标准,能为企事业单位内部交换信息提供服务。同时,它具有连接Internet的功能和防止外界入侵的安全措施。另一方面,由于数据库具有强大的数据存储和管理能力,并且能够动态地进行数据输入和输出,如果把数据库应用于Intranet上,不仅可以实现大量信息的网上发布,而且能够为广大用户提供动态的信息查询和数据处理服务,进而加强企事业单位内部部门之间、上级部门与下级部门之间、企事业单位员工之间、企事业单位与客户之间以及企事业单位与企事业单位之间的信息交流,降低企事业单位的日常工作成本,提高企事业单位的经济效益。它通常采用3层结构:浏览器――WEB服务器――数据库服务器。在Intranet框架中,Browser/Server模型的处理方式如下:1.用户打开计算机中的浏览器。2.输入或自动启动主页的URL(UniformResourceLocator),浏览器生成一个HTTP请求并把它发给指定的Internet服务器。3.服务器发回主页的HTML(HypertextMarkupLanguage)页面。浏览器将其显示在屏幕上。4.用户在主页面上进行操作(如:点击、键入等)。5.浏览器生成相应的HTTP要求,发送给相应的服务器。6.服务器收到请求后,查看本站点是否拥有这个文档。如果有,就将它放入响应信息中返回给浏览器。7.浏览器收到响应,查看头文件的格式,判断能否直接显示。如果否,就调用对应的帮助应用程序或外挂程序处理显示。

第三章系统需求分析本章分析了系统的各项需求,包括性能需求、功能需求、模块划分等。3.1性能需求分析为了保证系统能够长期、安全、稳定、可靠、高效地运行,公交查询系统应该满足以下性能需求:1.系统处理的准确性、及时性和响应速度系统处理的准确性和及时性是系统的必要性能。查询时应保证查全率,所有相应域包含查询关键字的记录都应能查到。在系统设计和开发过程中,要充分考虑系统当前和将来可能承受的工作量,使系统的处理能力和响应时间能够满足系统管理员对信息处理的需求。响应时间,更新处理时间都要比较迅速,应满足大部分用户的要求。一般操作的响应时间应在1-2s内,对数据的导入、导出的操作也应在可接受的时间内完成,原则上保证操作人员不会因为速度问题而影响工作效率。2.系统的开放性和系统的可扩充性系统在开发过程中,应该充分考虑以后的可扩充性。例如,用户查询的需求也会不断地更新和完善。这就要求系统提供足够的手段进行功能的调整和扩充。而要实现这一点,应通过系统的开放性来完成,即系统应是一个开放系统,只要符合一定的规范,可以简单地加入和减少系统的模块,配置系统的硬件。通过软件的修补、替换,完成系统的升级和更新换代。3.系统的易用性和易维护性系统是直接面对使用人员的,而使用人员往往对计算机并不是非常熟悉。这就要求系统能够提供良好的用户接口,易用的人机交互界面。所以在系统开发的时候就考虑到了这一点,只要用户知道本系统的网址就可以直接使用本系统的查询模块而无须用户注册及登陆,充分节约了用户查询的方便及随意性。其次,要实现本系统的易用性就要求系统应该尽量使用用户熟悉的术语和中文信息的界面;针对用户可能出现的使用问题,要提供足够的在线帮助,在本系统中专门设置了“联系我们”这一信息,可以让用户对本系统的不足之处让设计者知道,使系统更加完善。公交查询系统中涉及到的数据是公交公司的相当重要的信息,系统要提供方便的手段供系统维护人员进行数据的备份,日常的安全管理,系统意外崩溃时数据的恢复等工作。4.系统的标准性与先进性系统在设计开发使用过程中都要涉及到很多计算机硬件、软件。所有这些都要符合主流国际、国家和行业标准。例如在开发中使用的操作系统、网络系统、开发工具都必须符合通用标准。如规范的数据库操纵界面、作为业界标准的TCP/IP网络协议及ISO9002标准所要求的质量规范等;同时,在自主开发本系统时,要进行良好的设计工作,制订行之有效的软件工程规范,保证代码的易读性、可操作性和可移植性。目前计算系统的技术发展相当快,做为公交查询系统工程,应该保证系统长期保持先进,在系统的生命周期尽量做到系统的“与时俱进”,充分完成企业信息处理的要求而不至于落后。这一方面通过系统的开放性和可扩充性,不断改善系统的功能完成。另一方面,在系统设计和开发的过程中,应在考虑成本的基础上尽量采用当前主流并先进且有良好发展前途的产品。3.2功能需求分析本系统采用结构化设计的方法来实现系统总体功能,提高系统的各项指标,即将整个系统合理的划分成各个功能模块,正确地处理模块之间和模块内部的联系以及和数据库的联系,定义各模块的内部结构,通过对模块的设计和模块之间关系的系统来实现整个系统的功能。3.2.1基于方便市民搭乘公交出行的原则,该系统应满足普通用户下面几方面功能需求:1.线路查询:方便用户了解到最快最新的线路信息,如:此线路经过哪些站点,和站点在线路中的位置等。2.站点查询:用户如果对线路不清楚,只知道自己要去的地方,那么站点查询会帮你快速找出可以搭乘哪些线路的公交车到达此地,还能提供各线路的相关信息,并注明了此站点在相应线路中的顺序,方便用户了解该站点在线路中所处的位置。3.换乘查询:如果没有直达线路,则找出转乘的最短公交路线。用户输入起始站和终点站作为查询关键字,即可查询到三次转车内到达目的地址的公交线路。可以为用户节省更多的时间,也提高了效率。4.打印输出:将用户查询到的内容自动生成报表,并打印输出。5.联系与投诉:用户可联系管理员反映自己的意见。查询者可以执行线路查询、站点查询、换乘查询(包括:一次换乘、二次换乘、三次换乘查询)的操作。查询者的用例分析如图3.1所示:图3.1查询者的用例分析由上图可查询者所需执行的系统功能。3.2.2为了维护系统的正常运行,系统还需提供后台管理功能,用于管理员登陆,添加、修改、删除公交数据信息,修改信息资料、安全密码,回复用户留言等,其中最主要的功能是新增、修改、删除数据信息,以保证公交车线路是正确可用的。管理员的用例分析如图3.2所示:图3.2管理员的用例分析由上图可知管理员所需执行的系统功能。3.3功能模块划分1.普通用户模块该模块实现公交查询功能。可实现按线路查询、站点查询和起点-终点查询三种查询方式。2.管理员用户模块该模块实现数据的新增、修改、删除功能。模块的各功能划分如图3.3所示:公交路线查询系统公交路线查询系统普通用户模块管理员用户模块普通用户模块管理员用户模块删除新增修改删除新增修改车次查询站点查询站站查询路线打印车次查询站点查询站站查询路线打印站台车次车辆参数线路站台车次车辆参数线路图3.3系统功能模块图系统的功能模块由上图所示划分,在不同的模块下实现不同的功能,如普通用户模块下有车次查询、站点查询等功能,管理员用户模块下有修改、删除数据等功能,分工明确,一目了然。

第四章系统设计本章介绍了系统的各个设计步骤,具体为数据库设计、功能模块设计等。4.1数据库设计数据库设计是系统设计的一个重要内容,其设计质量的好坏直接影响系统开发的成败,系统的质量,系统效率及可维护性。在本系统的设计中,充分考虑到了管理系统数据繁杂,重复性很大,数据使用频繁。因此本系统采用了一种能正确反映用户实现环境,能被现行系统接受,易于维护、效率高的数据管理方法—SQLServer2005数据库系统。数据库设计的核心问题是设计好的数据模型。数据模型是指数据库中记录与记录之间联系的数据结构形成的。不同的数据管理系统有不同的数据模型。在目前的数据库管理系统中有层次模型,网状模型、关系模型三种数据模型。其中,关系模型具有较高的数据独立性,使用也较为方便。本设计采用关系数据库。该数据库实行增、删、编辑、统计、显示和打印都极为方便。其中的排序和索引功能,对数据快速定位,查询提供了有利条件。4.1.1数据库概念结构设计本系统采用“实体联系模型”(ER模型)来描述数据库的结构与语义,以对现实世界进行抽象。ER模型直接从现实世界抽象出实体类型及实体间联系,然后用ER图来表示数据模型。它有两个明显的优点:接近于人的思维,容易理解;与计算机无关,用户容易接受。E-R图是直观表示概念模型的工具,它有三个基本成分:1.矩形框,表示实体类型(考虑问题的对象)。2.菱形框,表示联系类型(实体间的联系)。3.椭圆形框,表示实体的属性。实体和属性的定义如下:管理员表(用户名,登录密码)站点信息表(站点编号,站名)公交信息表(车次编号,车次,起止站点,运行时间,起步价,全程价)具体的实体关系图如图4.1所示:站点名称站点编号站点用户名管理员登陆密码站点名称站点编号站点用户名管理员登陆密码车次编号首发站车次编号首发站公交线路公交线路开班时间终点站开班时间终点站收班时间起步价收班时间起步价全程价全程价图4.1各实体属性关系图建立E-R图能有效理解各数据类型的关系,如图存在三个实体:站点、管理员、公交线路,由此三实体可定义其独自属性,为建立数据库表做好准备。4.1.2数据库表设计首先通过SQLServer2005创建一个名为“Bus_Search”的数据库,然后在其中创建各个表。各个表的结构及数据类型分述如下。1.管理员表(admin)管理员表存放登陆系统所需要的用户名和密码,修改密码时也同样需要访问此表。如表4.1所示:表4.1管理员表名称字段名类型主键非空用户名namencharYesYes密码passwordncharNoYes用户名:每个管理员都有自己的用户账号,用户名最多由十个字符组成。密码:用户密码不能为空,不能复制密码。2.关联关系表(Bus_Station)关联关系表存放各站点的编号和车次编号,在查询站点和车次的关系时需要访问此表。如表4.2所示:表4.2关联关系表名称字段名类型主键非空车次编号B_IdintYesYes站点编号S_IdintYesYes关系编号idintNoNo车次编号:代表不同的车次,由数字组成。站点编号:代表不同的站点,由数字组成。3.公交信息表(BusInfo)公交信息表存放车次的各项信息,在查询车次时需要访问此表。如表4.3所示:表4.3公交信息表名称字段名类型主键非空车次编号B_IdintYesYes车次B_NamevarcharNoNo开班时间B_StimevarcharNoNo收班时间B_EtimevarcharNoNo起止站点B_StoEvarcharNoNo起步价B_SpricerealNoNo全程价B_ApricerealNoNo车次:存放具体的公交路线编号。开班时间、收班时间:公交车辆每天运行的时间。全程价:坐完全程所需交纳的车费。4.站点信息表(StationInfo)站点信息表存放站点信息,在查询站点时需要访问此表。如表4.4所示:表4.4站点信息表名称字段名类型主键非空站点编号S_IdintYesYes站点名称S_NamevarcharNoNo站点名称:存放各具体的站点名称。为了保证各数据表间的独立性,减少其间的关联程度,设计的数据表基本独立成表,储存各自独立的信息,操作方便简单,出错几率较少。4.2功能模块具体设计本节主要介绍系统主要功能模块的设计,包括普通用户查询模块的设计和管理员用户模块的设计。4.2.1普通用户模块设计查询模块是系统最主要的功能模块,在此模块下用户无需登录就能查询公交信息,能使用系统的车次查询、站点查询、站站查询等功能,每一个功能都是主要功能。其具体的程序流程图如图4.3所示。否开始否开始是否查询?是否查询?是是选择相应功能进行查询选择相应功能进行查询相应XML文件是否存在相应XML文件是否存在否否是是查询数据库文件访问查询数据库文件访问XML文件是是查询完毕查询完毕否是否再次查询?否是否再次查询?结束结束图4.2查询模块程序流程图在查询模块中,访问相应的XML文件能有效减轻系统负担,是查询过程中的重要步骤。4.2.2管理员管理员模块是系统一个非常重要的模块,它需要防止其他人恶意冒充管理员来对系统进行随意修改或破坏,而正常的管理员登陆后,还需要能对数据库表进行操作,来维护系统的正常运行。其具体的程序流程图如图4.4所示。开始开始输入管理员账号和密码输入管理员账号和密码否是否正确?否是否正确?是是进入管理员模块进入管理员模块结束否是否维护?结束否是否维护?是是进行维护进行维护图4.3管理员模块程序流程图两大功能模块均实现各自不同的功能,每个模块的权限和职责明晰,结构简单明了,易于理解。

第五章系统实现与测试本章主要演示和测试程序功能,并展示程序核心代码。5.1主要程序功能程序登陆主界面后,可以根据提示选择相应服务。如图5.1所示图5.1主界面截图用户可在主界面中选择自己的去向,进入不同的分界面,在分界面中得到自己所选择的服务。5.1.1连接数据库的包含文件在动态网站中,调用数据库中的数据是十分频繁的,为了避免编写重复的代码。编写一个数据库连接文件是非常重要的。web.config文件中包含了本系统中的数据库连接代码。本系统的数据库的连接代码如下:<addname="SQLConnStr"connectionString="server=091F6BB946074F2;Database=Bus_Search;User=sa;password=506321236"/>5.1.2XML技术由于系统是运行在服务器端,当使用查询功能的人多了,难免会影响到查询速度,这个时候运用XML技术就十分必要了。XML文件可作为数据存储的媒介存在,系统从数据库中读出查询到的相应信息建立特定的XML文件,便于下次同样的查询不需要再访问数据库而是直接访问XML文件。1.生成XML文件。将数据库数据生成为XML文件,以便在查询时可以读取XML文件。以公交信息表为例,主要实现代码如下:Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();Stringurl="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=practice";Stringuser="sa";Stringpassword="506321236";Connectionconn=DriverManager.getConnection(url,user,password);Statementstmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);Stringsql="select*fromBusInfo";ResultSetrs=stmt.executeQuery(sql);Documentdocument=newDocument(newElement("BusInfo"));//创建文档ResultSetMetaDatarsmd=rs.getMetaData();//获取字段名intnumberOfColumns=rsmd.getColumnCount();//获取字段数inti=0;while(rs.next()){//将查询结果取出Elementelement0=newElement("BusInfo");//创建元素document.getRootElement().addContent(element0);for(i=1;i<=numberOfColumns;i++){Stringdate=newString(rs.getString(i).getBytes("ISO-8859-1"),"gb2312");Elementelement=newElement(rsmd.getColumnName(i)).setText(date);element0.addContent(element);}}rs.close();//关闭结果集stmt.close();//关闭statementconn.close();//关闭连接XMLOutputteroutp=newXMLOutputter("",true,"GB2312");outp.output(document,newFileOutputStream("D:\\jsp\\data.xml"));//输出XML文档out.print("XML文档生成完毕!");2.查询XML文件。查询者在查询过程中,首先看是否存在包含查询数据的XML文件,若有则先读取XML文件,没有则查询数据库。查询的主要实现代码可添加在查询模块中,也可如下代码所示:privatevoidPage_Load(Objectsender,EventArgse){if(!IsPostBack){ArrayListvalues=newArrayList();//将其当作数据源XmlDocumentdoc=newXmlDocument();//表示XML文档doc.Load(Server.MapPath("data.xml"));//返回一个XmlNodeList集合,包含与指定名称匹配的所有子代元素列表XmlNodeListelemList=doc.GetElementsByTagName("name");//System.Xml命名空间for(inti=0;i<elemList.Count;i++){values.Add(elemList[i].InnerXml);}ListBox1.DataSource=values;ListBox1.DataBind();}}5.1.3按两站点查询用户进入站站查询模块中后,可以在起点站输入框中输入自已的出发点,然后在终点站输入框输入出行的终点,也可以进行选择。点击查询,系统便会检测这两个站点间是否有直达车,如果有直达车,系统会给出直达车次。如果没有直达车,系统会给出所乘车次及中转站名称。如图,有直达车的情况:图5.2有直达车的站站查询如图,无直达车的情况:图5.3无直达车的站站查询系统首先通过文本框中的值查询经过起点站和终点站的车次编号B_Id,若相同则表示存在直达车,输出直达车信息,若B_Id不相同就同时查询经过起点站和终点站的车次编号,然后将这两个不同的车次循环比较它们的站点,若存在公共的站点就可以作为中转站,最后输出至文本框中。主要实现代码如下:if(!S_S_Start.SelectedValue.ToString().Equals("1")&&!S_S_End.SelectedValue.ToString().Equals("1"))//如果选择了下拉框的话,则按照下拉框的内容查询{//如果起止站点不相同If(!S_S_Start.SelectedValue.ToString().Equals(S_S_End.SelectedValue.ToString())){//判断文本框的值if(Txt_S.Text==null||Txt_S.Text==""&&Txt_E.Text==null||Txt_E.Text==""||(Txt_S.Text.Equals(S_S_Start.SelectedItem.Text.ToString())&&Txt_E.Text.Equals(S_S_End.SelectedItem.Text.ToString()))){//根据选择的内容,查询同时经过起点站和终点站的公交信息Stringstr="select*fromBusInfowhereB_Idin(selectB_Idfrom"+"Station_Line_ViewwhereS_id='"+S_S_Start.SelectedValue.ToString()+"'INTERSECT"+"selectB_IdfromStation_Line_ViewwhereS_id='"+S_S_End.SelectedValue.ToString()+"')";if(database.GetList(str).Rows.Count>0)//表明有直达车{GridView_S_S.DataSource=database.GetList(str).DefaultView;//获取查询信息并将其显示在表格中GridView_S_S.DataBind();}else//查找起止站点之间是否有中转车{//查找所有经过起点站的公交车Stringstr1="selectB_IdfromStation_Line_ViewwhereS_id='"+S_S_Start.SelectedValue.ToString()+"'";//查找所有经过终点站的公交车Stringstr2="selectB_IdfromStation_Line_ViewwhereS_id='"+S_S_End.SelectedValue.ToString()+"'";for(inti=0;i<database.GetList(str1).Rows.Count;i++){//循环判断经过起点站的线路和经过重点站的线路是否有公共的站点s1=database.GetList(str1).Rows[i]["B_Id"].ToString();//经过起点站的公交车for(intj=0;j<database.GetList(str2).Rows.Count;j++){//经过终点站的公交车s2=database.GetList(str2).Rows[j]["B_Id"].ToString();//判断经过起点站的线路和经过终点站的线路是否有公共的站点Stringstr3="select*fromStation_Line_ViewwhereS_idin(selectS_idfrom"+"Station_Line_ViewwhereB_Id='"+s1+"'INTERSECT"+"selectS_idfromStation_Line_ViewwhereB_Id='"+s2+"')";if(database.GetList(str3).Rows.Count>0)//如果有公共的站点,则该站点就是中转站{//分别查找经过起点站的线路的详细信息和经过终点站的线路详细信息Stringstr4="select*fromBusInfo,StationInfowhereB_Id='"+s1+"'andS_id='"+database.GetList(str3).Rows[i]["S_id"].ToString()+"'";Stringstr5="select*fromBusInfo,StationInfowhereB_Id='"+s2+"'andS_id='"+database.GetList(str3).Rows[i]["S_id"].ToString()+"'";//将起点站线路详细信息显示到表格GridView_S_S_to.DataSource=database.GetList(str4).DefaultView;GridView_S_S_to.DataBind();for(intk=0;k<database.GetList(str4).Rows.Count;k++){//定义label的几个对象分别将终点站线路的详细信息显示到表格Labellab1=(Label)GridView_S_S_to.Rows[k].FindControl("Lab1");lab1.Text=S_S_Start.SelectedItem.Text.ToString();HyperLinkha=(HyperLink)GridView_S_S_to.Rows[k].FindControl("HyperLink1");ha.Text=database.GetList(str5).Rows[k]["B_Name"].ToString();Labellab2=(Label)GridView_S_S_to.Rows[k].FindControl("Lab2");lab2.Text=database.GetList(str5).Rows[k]["B_Sprice"].ToString();Labellab3=(Label)GridView_S_S_to.Rows[k].FindControl("Lab3");lab3.Text=database.GetList(str5).Rows[k]["B_Aprice"].ToString();Labellab4=(Label)GridView_S_S_to.Rows[k].FindControl("Lab4");lab4.Text=S_S_End.SelectedItem.Text.ToString();}}ElsePage.RegisterStartupScript("","<script>alert('对不起!无此相关站点的公交信息!');</script>");}}}}}5.1.4按站点查询用户进入站点查询模块中后,可以输入自己要查询的站点,也可以选择要查询的站点,选好后点击查询,系统会在数据库中检测该站点是否存在,如果存在,系统则显示这个站点的相关信息。如图,站点查询结果如下:图5.4站点查询系统会优先根据下拉框中的输入信息进行查询,首先根据站点名称查询站点信息表中站点名称S_Name和站点编号S_Id,再根据此信息查询关联关系表和公交信息表中的相关数据,最后将查找出来的信息都输出至文本框中。主要实现代码如下:publicpartialclassstation_search_station_search:System.Web.UI.Page{//下面执行的是站点查询的操作protectedvoidPage_Load(objectsender,EventArgse)//初始化操作{//初始化文本框if(!Station_Search.SelectedItem.Text.ToString().Equals("——请选择站点——"))Txt_Station.Text=Station_Search.SelectedItem.Text.ToString();}//当点击查询按钮后激发查询操作protectedvoidImageButton2_Click(objectsender,ImageClickEventArgse){if(Station_Search.SelectedValue.ToString().Equals("1"))//如果下拉框没有选择,表明其按文本框输入查询{if(Txt_Station.Text!=null&&Txt_Station.Text!="")//如果用户已经输入站点名称,则开始查询{//查询公交信息表BusInfo、站点信息表StationInfo和关联关系表Bus_Station,找出符合用户输入条件的站点信息Stringstr="select*fromStationInfo,BusInfo,Bus_Station"+"whereBus_Station.S_id=StationInfo.S_idandBus_Station.B_Id="+"BusInfo.B_IdandS_Namelike'%"+Txt_Station.Text+"%'";if(database.GetList(str).Rows.Count>0){//将查找出来的信息显示到表格中GridView_Station.DataSource=database.GetList(str).DefaultView;GridView_Station.DataBind();}ElsePage.RegisterStartupScript("","<script>alert('对不起!无此站点相关的公交信息!');</script>");}else//如果用户没有输入任何内容,则给出提示Page.RegisterStartupScript("","<script>alert('对不起!只有输入或选择站点才可以查询!');</script>");}else//如果选择了下拉框中的值,则按照下拉框的值进行查询{//判断文本框的值if(Txt_Station.Text==null||Txt_Station.Text==""||Txt_Station.Text.Equals(Station_Search.SelectedItem.Text.ToString())){//查询公交信息表BusInfo、站点信息表StationInfo和关联关系表Bus_Station,找出符合下拉框选取项的站点信息Stringstr="select*fromStationInfo,BusInfo,Bus_Stationwhere"+"Bus_Station.S_id=StationInfo.S_idandBus_Station.B_Id=BusInfo.B_Id"+"andBus_Station.S_id='"+Station_Search.SelectedValue.ToString()+"'";GridView_Station.DataSource=database.GetList(str).DefaultView;GridView_Station.DataBind();}}}}5.1.5按线路查询用户进入线路查询模块后,可以输入自己要查询的车次线路,或者选择要查询的线路,选好后点击查询,系统会在数据库中检测该线路点是否存在,如果存在,系统则显示这条车次线路的相关信息。如图,线路查询结果如下:图5.5线路查询系统会优先根据下拉框中的输入信息进行查询,将输入信息赋值给B_Id,接着查询公交信息表,看是否存在相同的B_Id值,若有则将该公交线路存储在公交信息表中的数据输出在表格中,然后查询该线路经过的所有站点,利用循环将所有站点输出至文本框中。主要实现代码如下:publicpartialclassline_search_line_search:System.Web.UI.Page{//下面执行的是线路查询的操作stringLine="";//定义两个全局变量privateintB_Id;protectedvoidPage_Load(objectsender,EventArgse)//初始化操作{//获取超链接传送来的线路Id,如果传送来的Id有值if(Request.QueryString["id"]!=null&&Request.QueryString["id"]!=""){B_Id=int.Parse(Request.QueryString["id"].ToString());//获取传送过来的Id值,并赋值给B_IdStringstr="select*fromBusInfowhereB_Id='"+B_Id+"'";//查询公交信息表,获取符合条件的线路信息GridView_Line.DataSource=database.GetList(str).DefaultView;//获取查询信息并将其显示在表格中GridView_Line.DataBind();//查询该公交线路经过的所有站点信息Stringstr1="select*fromStation_Line_ViewwhereB_Id='"+B_Id+"'orderbyid";intend=database.GetList(str1).Rows.Count;//记录查询记录的条数for(inti=0;i<end;i++)//利用循环,将所有的站点都显示到text文本框里{if(i!=end-1)//表明该站不是终点站Line=Line+database.GetList(str1).Rows[i]["S_Name"].ToString()+"—>";else//表明该站是终点站Line=Line+database.GetList(str1).Rows[i]["S_Name"].ToString();}TxtLine.Text=Line;//将上述所有站点信息显示到文本框里}}//略}5.1.6管理员登陆随着城市的高速发展,公交线路的改变亦相当频繁,所以数据的维护是必须的。在数据管理中,管理员完成对线路和站点的各种操作,包括:查看、新增、修改、删除,管理员只需要在登陆界面中输入自己的账号密码就可以登陆系统进行管理。如图,管理员登陆界面如下:图5.6管理员登陆界面图管理员登陆系统后,可对线路和站点进行查看、新增、修改、删除,对系统进行维护更新,保证其运行的稳定性,为大众用户提供尽可能完善的服务。5.2测试和维护为了确保本系统能够正常运行,需要在发布之后做一次较全面的测试。创建和测试应用程序应是交替进行的,既要注意开发的效率也要注意它的稳定性。每编写一个模块,就要对这个模块进行测试,看它能否根据特定的要求工作。及早发现问题,及早解决,否则到最后再来测试的话,难度会大大增加。5.2.1测试分类由于程序中隐藏的缺陷只在特定的环境下才有可靠显露,系统缺陷通常是由于对某些特定情况考虑不周造成的。因此测试不是为了表明程序正确;成功的测试也不是没有发现错误的测试。有意义的软件测试应该是从“破坏”软件系统的角度出发,精心设计最有可以暴露程序系统缺陷的测试方案。因此软件测试的目标应该是以尽可能少的代价和时间找出软件系统中潜在的错误和缺陷。从产品角度看,测试计划中的测试项目包括软件结构中的分系统层、子系统层、功能模块层、程序模块层中的各类模块,从测试本身看,分为单元测试,组合测试,确认测试等。测试对象是随不同阶段而异的,最基本、最初的测试是单元测试,后面的组合测试、确认测试都是以被测过的模块作为测试对象的。单元测试。单元测试也称模块测试或程序测试,单元测试是对每个模块单独进行的,验证模块接口与设计说明书是否一致,对模块的所有主要处理路径进行测试且与预期的结构进行对照,还要对所有错误处理路径进行测试。对源码进行审查,对照设计说明书,表态地检查源程序是否符合功能的逻辑要求,是进行单元测试前的重要工作工。单元测试一般是由程序员完成,也称程序调试。组合测试。组合测试也称集成测试或子系统测试,通常采用自顶向下测试和自底向上测试两种测试方法。组合测试的对象是指已经通过单元测试的模块,不是对零散模块进行单个测试,而是用系统化的方法装配和测试软件系统,是一个严格的过程,必须认真地进行,其计划的产生和单元模块测试的完成日期要协调起来,这种测试应在系统目标机上进行,造成系统应用的环境条件,除了开发部分项目负责人参加以外,还应该有相应系统的用户参加,给评审员进行演示。确认测试。确认测试是对通过组合测试的软件进行的,这些软件已经存于系统目标设备的介质上,确认测试的目的是表明软件是可以工作的,并且符合“软件需求说明书”中规定的全部功能和性能要求。确认测试是按照这些要求定出的“确认测试计划”进行的。测试工作是由一个独立的组织进行,而且测试要从用户的角度出发。系统测试。系统测试是对整体性能的测试,主要解决各子系统之间的数据通信和数据共享问题以及检测系统是否达到用户的实际要求,系统测试的依据是系统分析报告。系统测试应在系统的整个范围内进行,这种测试不只对软件进行,而是对构成系统的硬、软件一起进行。系统测试与建构同时进行或略慢。系统测试需要确认从头到尾的功能正常才算完成,应当尽量避免系统测试延到项目末尾进行。用户验收测试。在系统测试完成后,进行用户的验收测试,它是用户在实际应用环境中所进行的真实数据测试。在具体的测试中,一般应遵循以下原则:由程序设计者之外的人进行测试;测试用例应由两部分组成:输入数据和预期输出结果;应选用不合理的输入数据与非法输入测试;不仅要检验程序是否实现预期功能,还应检查程序是否做了不应该做的工作;集中测试容易出错的程序模块;对程序修改以后,必须重新进行测试[7]。5.2.2软件维护软件维护是指在软件运行或维护阶段对软件产品所进行的修改。软件维护是软件生命周期中耗费最多、延续时间最长的活动。根据软件维护的不同原因,软件维护可以分成三种类型:改正性维护,适应性维护,完善性维护。除了上述三种维护之外,还有一类维护活动,称为预防性维护。通常,人们将预防性维护定义为:“把今天的方法学用于昨天的系统以满足明天的需要”。也就是说,采用先进的软件工程方法,对需要维护的软件或软件中的某一部分重新进行设计、编制和测试,提高软件的可维护性和可靠性等,为以后进一步改进

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论