国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php开源 > php教程 > 基于java最短路径算法公交查询系统的设计与实现

基于java最短路径算法公交查询系统的设计与实现

来源:程序员人生   发布时间:2016-06-07 08:19:36 阅读次数:2329次

基于J2EE的公交查询系统的设计与实现

1 引言

1.1 选题背景

20多年来,我国经济得到了延续、快速、稳定、健康地发展。经济的快速增长,带动了汽车工业的蓬勃发展,并使交通状态显著改良。据统计,中国公路通车总里程已达130余万千米,其中高速公路约1.5万千米。居民收入普遍提高,到2000年年底,人均GDP已超过800美元,沿海地区已达2000-3000美元。按国际发展惯例,当人均GDP超越1000美元,汽车消费市场就将进入快速增长时间。我国城市人口约有2亿,略低于美国人口。东部沿海地区大部份居民已具有了汽车消费实力。据中国消费者协会2000年对20个大城市调查显示,有32%的消费准备在未来5年内购买家用轿车,其中30.6%的无车消费者已有驾驶执照。随着个人信贷制度的启动和日渐完善,家庭轿车的快速增长势头势必开掘出巨大的中国汽车市场。

城市经济发展,城市范围愈来愈大,相应的城市公交系统也愈来愈庞大。许多新建小区大量出现,公交线路也日渐增多,给人们的出行带来了极大便利,但是由于城市范围的不断发展,给人们选择出行乘车线路造成了1定的困难。即便1个在城市生活多年的人,给他任意两个地点,要他说出这两个地点之间的乘车方案,他常常也是很难说出来的。但是如果给他1张交通地图以后,他可以很快地找出图上的任意两点之间的乘车方案,所找出的方案即便不是最优的,也是1条可供参考的备选方案。但是这样的查询效力是相当低的,所以需要提供1个高效的查询系统,才是问题更本所在。而基于J2EE的公交查询系统,就是利用B/S结构开发出来的查询系统,它通过利用数据结构当中的最短路径算法,可以查出任意两个地点之间最短的乘车方案。它不但可以用于公交公司管理系统中,也能够单独作为公交管理系统的1个模块存在,并可以制作成公交信息系统查询网,放置于城市的主要场所。这样不但可以体现出1个城市的智能公交系统的水平,更显示出城市的数字化,信息化水平。

目前,我国众多大城市普遍存在交通拥堵,延误人们平时上班时间。乃至影响了城市旅游业经济的可延续发展。所以为了切实的改良公交车内拥堵状态,适当增加发车次数以缩短乘客等车时间,但是能够准确为人们提供最短的乘车线路才是得到解决的最好办法,这样大大的缩短了人们的乘车时间。

本项目研究的基于J2EE的公交查询系统,让人们通过互联网很快的查出该城市任意两站点之间的最短乘车线路。

1.2 项目的主要研究工作

本系统是从城市交通现状动身,根据人们的出行规律,设计了1个完全的基于J2EE体系的公交车查询系统。该系统可以根据商厦名称,公交车号,平常站点和站点之间为查询条件分别进行查询,解决了市民出行乘坐公交车时常常遇到的困难。

本系统模型构架分为下面4层结构,以下。

(1)J2EE利用程序组件

J2EE利用程序是由组件构成的。J2EE组件是具有独立功能的软件单元,它们通过相干的类和文件组装成J2EE利用程序,并与其他组件交互。本系统包括以下组件:

①利用客户端程序及J2EE服务器

②Java Servlet和JavaServer Pages(JSP)Web组件及JavaBean。

(2)WEB层组件

J2EE web层组件包括JSP页面或Servlet。依照J2EE规范,还包括某些JavaBean对象来处理用户输入,并把输入发送给运行在业务逻辑层上的组件来进行处理。

(3)客户层组件

基于WEB方式的静态HTML页面或是Applet客户真个小利用程序。

(4)编写算法

编写最短路径数据结构算法,解决完成站点之间最短乘车路径查询。

1.3 开发环境

开发工具:Eclipse 3.2 + MyEclipse 5.0GA。

运行环境:JSDK 1.5.0_04虚拟机。

服务器:Tomcat 5.5。

数据库:MicroSoft SQL Server 2000。

操作系统:Windows XP。

所需内存:512 M。

2 理论基础

2.1 概念

2.1.1 J2EE的概念

J2EE是1种利用Java 2平台来简化企业解决方案的开发、部署和管理相干的复杂问题的体系结构。J2EE技术的基础就是核心Java平台或Java 2标准平台。J2EE不但巩固了标准版中的许多优点,例如“编写1次、随处运行”的特性、方便存取数据库的JDBC API、CORBA技术和能够在Internet利用中保护数据的安全模式等等,同时还提供了对EJB(Enterprise JavaBeans)、Java Servlet API、JSP(Java Server Pages)和XML技术的全面支持。其终究目的就是成为1个能够使企业开发者大幅缩短投放市场时间的体系结构。

 

2.1.2 JSP的概念

JSP程序是1个服务端页面脚本程序,可以在这个脚本中直接编写客户端阅读器需要显示的HTML文档内容,固然也能够依照JSP规范将Java程序代码嵌入脚本。JSP脚本规范提供了若干内部对象来简化JSP程序和阅读器之间的输入输出处理。由于JSP程序是从HTML页面添加Java动态处理代码而来,因此,JSP程序又称为动态JSP页面。

 

2.1.3 Java Bean的概念

JavaBean是1种JAVA语言写成的可重用组件,用户可使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或利用来使用这些对象。用户可以认为JavaBean提供了1种随时随地的复制和粘贴的功能,而不用关心任何改变。这个对J2EE业务逻辑层处理具有相当重要的部份。

 

2.1.4 Java Servlet的概念

Java Servlet使用的是1种要求/响应机制,也就是说通过特定的Java程序设计技术,由该Servlet动态产生的响应向某1特定的要求做出响应。Servlet所能利用的要求/响应场合很多,但经常使用的还是在Web利用程序中用于产生超文本传输协议响应(HTTP)。据此,Servlet可能取代其他类型的HTTP要求/响应机制,比方通用网关接口(CGI)脚本。

 

2.1.5 Session对象

Session对象是类javax.servlet.Httpsession的1个对象,是用来保存每一个用户信息(以会话的情势直接保存在WEB服务器端),以便跟踪每一个用户的操作状态。

2.2 J2EE的结构

J2EE结构具有1个很大的特点,就是与平台无关性的J2EE结构。所开发出来的程序可以在任何操作系统下运行。这样就使得J2EE程序的编写变得10分简单,由于业务逻辑被封装成可以复用的组件,并且J2EE服务器以容器的情势为所有的组件类型提供后台服务,所以你可以集中精力解决手头的业务逻辑。

2.3 J2EE的容器类型

J2EE容器类型可以分为WEB容器和EJB容器。

EJB容器管理所有J2EE利用程序中企业级Bean的履行,Enterprise Bean和它们的容器运行在J2EE服务器上。

WEB容器也是管理所有J2EE利用程序中JSP和Servlet组件履行,同理WEB组件和它们的容器也是运行在J2EE服务器上的。

2.4 J2EE的体系与模式

2.4.1 J2EE的体系(散布式计算)

1表示层:Web Page| HTML | HTTP

2控制层:JSP | Servlets

3逻辑层:JavaBean

4数据层:Database

5JDBC

 

2.4.2 J2EE的模式

MVC(Model – View – Controller)

页面bean是1个模型(model),而JSP是1个视图(view), Servlet是1个控制器(controller)。

3 公交查询系统功能分析

3.1 公交查询系统的需求

3.1.1 系统需求描写

公交查询系统的需求最主要是通过站点与车次之间的关系,利用数据结构算法构造1个公交查询的网络图,然后通过最短路径算法,为用户准确地提供两站点之间的最短乘车线路。

其次从业务实现上来讲,需要在业务逻辑层上编写最短路径算法,同时还要编写当用户查询要求时必须的数据库连接,然后根据用户提供查询站点信息,建立公交查询网络图,终究调用算法获得两站点之间的最短乘车线路。当查询完成后,如果用户需要进行其它的操作,则释放该连接资源。

最后,为了让公交线路信息得到及时的更新或是信息删除,需要做出相应的操作和处理。

 

3.1.2 系统数据流图

图3.1 系统数据流图

3.2 公交查询系统的功能

1)通过选择商厦名称进行相应的信息查询。

2)通过选择车号进行相应的信息查询。

3)通过选择站点进行相应的信息查询。

4)通过选择任意两个站点,完成两站点之间最短乘车线路查询。

5)完成车次和站点添加功能。

6)完成车次和站点更新功能。

7)完成车次和站点删除功能。

8)用户登录验证功能。

9)用户注册信息功能。

10)用户注销功能。

11)删除用户信息功能。

12)添加用户留言,删除用户留言,查看用户留言。

13)管理员登录验证功能。

14)管理员注销功能。

3.3 公交查询系统的数据库设计

3.3.1 E-R图

图3.2 用户实体及属性

图3.3 管理员实体及属性

图3.4 留言板实体及属性

图3.5 车次与站点之间关系

 

3.3.2 数据库表设计

(1)用户表userInfo(如表3.1)

表3.1 用户表信息

列名

中文名称

数据类型

长度

允许空

username

用户名

varchar

50

Not null

userpassword

用户密码

varchar

50

Not null

userage

用户年龄

int

4

null

address

地址

varchar

50

null

email

邮箱

varchar

50

null

question

问题

varchar

50

null

answer

答案

varchar

50

null

idnum

证件号

varchar

50

null

 

 4 公交查询系统的设计与实现

4.1 创建管理员登录的Servlet

(1)打开Eclipse开工具,新建1个ConfirmServlet类(如图4.1)

 

图4.1 创建管理员登录ConfirmServlet类

(2)在已创建好ConfirmServlet类中,生成1个具有私有属性的login()方法,该方法就是对管理员要求过来的信息进行验证。该方法首先利用HttpServletRequest,HttpServletResponse进行对象初始化。利用HttpServletRequest的getParameter()来获得管理员页面传来的两个参数,1个是adminname,另外一个是adminpassword。然后调用自定义连接数据库类进行数据库对象实例化,最后在进行验证的时候,获得管理页面验证码,如果验证码无误就对管理员账号和管理员密码验证,终究将正确的管理员账号和管理员密码放入session会话变量中。

管理员登录界面(如图4.2)

 

图4.2 管理员登录界面

相应代码:

 4.2 创建用户登录的Servlet

(1)打开Eclipse开工具,新建1个UserLoginServlet类(如图4.3)

 

图4.3 创建用户登录UserLoginServlet类

(2)与管理员中的ConfirmServlet类1样,也生成1个具有私有属性的login()方法,该方法也一样的继承了HttpServletRequest和HttpServletResponse类,通过这个类来获得用户界面要求过来的参数,当通过用户信息验证后,一样也将用户账号和用户的密码放入session会话变量中,1旦用户终究关闭阅读器,session会话变量也随即烧毁。

用户登录界面(如图4.4)

 

图4.4 用户登录界面

4.3 公交系统查询模块

4.3.1商厦查询

商厦查询是为用户提供按具体的名称(如:欧尚)查询,并显示到这个地点所有公交车车次的相干信息(如:车号,站点名称,票价,车子的档次和这个商厦的名称等信息)。而查询功能的实现是由系统的业务逻辑层中的QueryData类来实现的。当用户传来的车次提交信息,首先商厦查询页面先编译成服务器上的Servlet,然后根据需要调用业务逻辑层中相应类。

商厦信息查询结果(如图4.5)

 

图4.5 商厦查询

相应代码:

 调用此方法时,在页面中先援用包com.busSystem.util,再创建QueryData类的对象,通过对象调用queryPlace()这个方法。

 

4.3.2 车次信息查询

车次信息查询是为用户提供1个按公交车的车号(如:1路)查询,并显示该公交车的相干信息(如:公交车的出发点站、终点站、票价和车子的档次等信息)。而查询功能的实现是由系统的业务逻辑层中的QueryData类来实现的。

车次信息查询结果(如图4.6)

 

图4.6 车次信息查询

相应的代码:

 调用此方法时,在页面中先援用包com.busSystem.util,再创建QueryData类的对象,通过对象调用statisticsByBusInfo()这个方法。

 

4.3.3 站点信息查询

站点信息查询是为用户提供按公交车某1个站点查询到该站点需要乘坐公交车的车号。该查询功能的实现也是由系统的业务逻辑层中的QueryData类来实现的。

站点信息查询结果(如图4.7)

 

图4.7 站点信息查询

相应代码:

 调用此方法时,在页面中先援用包com.busSystem.util,再创建QueryData类的对象,通过对象调用queryStInfo()这个方法。

 

4.3.4 两个站点间的信息查询

任意两个站点间的查询页面(如图4.8)

 

图4.8 最短路径查询页面

任意两个站点间查询结果页面(如图4.9)

 

图4.9 任意两个站点间查询结果

(1)广度优先遍历概念

给定1个出发点,广度优先遍历首先访问出发点与出发点的邻接点,然后分别考察每个邻接点并访问它们的邻接点。遍历使用1个队列寄存顶点的未被访问邻接点,每当从队列中删除1个顶点,就将这个顶点的未访问邻接点插入队列,遍历的顺序即为顶点插入这个队列的顺序。

(2)图的建立进程

图4.10 构造图的流程

①初始化车次列表listBusNum,它是用来存储数据库中现有的车号,为建立图的先做好准备。

②在建立图的进程需要连接数据库,所以必须将需要用到连接数据库的类全部对象初始化,如:connection,statement,resultset这3个关键类。

③首先建立图的时候,需要添加图的各个节点。而这里的节点就是数据库站点信息(stinfo)表中的站点ID号。

④查询站点信息表,将所有的站点从数据库中取出来,调用添加站点graph.addVertex()的方法,将图的各个节点建立好。

⑤通过车次列表,循环的取出各个车号,查询车号与站点ID关系表(busst),找到该车号对应的所有站点。

⑥创建向量vector,该向量用来寄存1个车号对应多个站的ID号。

⑦初始化站点列表listStID,它用来寄存已保存好站点ID的向量,这模样就建立起1个关系,就是站点列表中保存了每个车号所对应车号它本身的所有站点ID。

⑧将站点列表和初始化好了的图1起传入createEdgeByDateBase中,建立双向图。最后图的建立进程结束。

(3)最短路径算法原理图(如图4.11)

图4.11 最短路径算法原理图

(4)最短路径算法原理描写:

①将顶点A入队,同时将顶点A设置为已被访问。

②判断队列是不是为空,如果不是则顶点A出队,同时判断顶点A的邻接顶点B、E、D是不是已被访问,如果没有,则将顶点B、E、D入队,并分别设置为已被访问,接着将入队顶点B、E、D分别指向他们的前置顶点A,并分别判断顶点B、E、D是不是为目的顶点I,不是则进入下1步3。

③判断队列是不是为空,如果不是则顶点B出队,同时判断顶点B的邻接顶点E是不是已被访问。判断可知顶点B的邻接顶点E已被访问,则顶点E不用指向他的前置顶点B。接着进入下1步4。

④判断队列是不是为空,如果不是则顶点E出队,同时判断顶点E的邻接顶点F、H是不是已被访问,如果没有,则将顶点F、H入队,并分别设置为已被访问,接着将入队顶点F、H分别指向他们的前置顶点E,并分别判断顶点F、H是不是为目的顶点I,不是则进入下1步5。

⑤判断队列是不是为空,如果不是则顶点D出队,同时判断顶点D的邻接顶点G是不是已被访问,如果没有,则将顶点G入队,并分别设置为已被访问,接着将入队顶点G分别指向他们的前置顶点D,并分别判断顶点G是不是为目的顶点I,不是则进入下1步6。

⑥判断队列是不是为空,同时判断入队的顶点F是不是是目的顶点I。如果不是则顶点F出队,同时判断顶点F的邻接顶点C是不是已被访问,如果没有,则将顶点C入队,并分别设置为已被访问,接着将入队顶点C分别指向他们的前置顶点F。并分别判断顶点C是不是为目的顶点I,不是则进入下1步7。

⑦判断队列是不是为空,如果不是则顶点H出队,同时判断顶点H的邻接顶点I是不是已被访问,如果没有,则将顶点I入队,并分别设置为已被访问,接着将入队顶点I指向他们的前置顶点H,并分别判断顶点I是不是为目的顶点I,可以判断顶点I就是目的顶点,将顶点I入堆栈,进入下1步8。

⑧判断I的前置顶点是不是为空,如果不是则将前置顶点入堆栈,循环判断前置顶点的前置顶点,如果不为空,则入堆栈,直到循环判断到空为止。这样堆栈中的所有顶点出堆栈,出堆栈的顶点A->E->H->I就是查询出来最短路径。

最短路径算法相应的程序(利用广度优先遍历算法查找最短路径):

 4.4 公交系统添加模块

4.4.1 添加车次

添加车次功能主要是增加1个车次详细信息,其中包括:车次号,出发点站,终点站,票价,汽车档次,票价类型。需要注意,在添加出发点站和终点站的时候,数据都是从站点库取得然后添加到出发点站和终点站中去。由于添加车次它只触及到车次的详细信息,如果要想添加站点,则需要在添加站点功能页面中进行相应的操作。

添加车次页面(如图4.12)

 

图4.12 添加车次

 

4.4.2 添加站点

添加站点功能:(1)在添加站点的文本框中输入要添加的站点名称。(2)提供了1个站点重名的查找功能,该功能可以对你输入添加的站点名称进行名称查重,通过查询站点编码表,显示这个站点是不是已存在。如果不存在,则将此新增站点名称插入到站点编码表中,如果存在,则不需将此站点名称插入到站点编码表中。(3)通过下拉选择框选择新增站点所对应的车次号。(4)如果查询站点总数在文本框中显示为“0”,则需要将出发点站和终点站同新增的站点1起插入车次和站点的关系表中。如果查询站点总数在文本框中显示不为“0”,则只需将新增的站点插入车次和站点关系表中便可。

添加站点页面(如图4.13)

 

图4.13 添加站点

4.5 公交系统删除模块

4.5.1 删除车次

删除车次功能:分页列出车次信息表中所有的车次信息,选择操作中的删除,就能够将对应的车次信息删除,但是在删除车次信息的时候需要先删除车次与站点关系表中所有对应当车次的信息。如果不先删除就会出现违背数据库完全性。

删除车次页面(如图4.14)

 

图4.14 删除车次

 

4.5.2 删除站点

删除站点功能:通过车次的下拉选择框选择车次,进行查询列出该车次的所有站点信息,然后点击删除操作就能够删除该站点。需要注意:由于在车次中从出发点站到终点站计算,其所有的站点是1个有次序的排列,所以删除1个站点,则它的下个站点次序号顺次减少1位。

删除站点页面(如图4.15)

 

图4.15 删除站点

4.6 公交系统更新模块

更新站点功能:通过车次的下拉选择框选择车次,进行查询列出该车次的所有站点信息,然后点击更新操作就能够更新该站点。需要注意的是,在更新出发点站(或是终点站)的时候,也要同时更新车次表中的出发点站(或是终点站)。

更新站点页面(如图4.16)

 

图4.16 更新站点

4.7 公交系统留言板模块

4.7.1 发表留言

发表留言是公交查询系统的1个新增的功能,主要是搜集用户的留言信息,可以根据用户提供的留言信息或是提出的建议,对系统进行修改和完善。使得系统更加趋于成熟完全。注册的用户登录到发表留言的板块当中,系统会自动提取用户名称,用户只需添上自己的邮箱,发表的主题和内容便可。

发表留言页面(如图4.17)

 

图4.17 发表留言

 

4.7.2 查看留言

查看留言很简单为用户提供了1个查看自己的发表的留言,而其它用户是不能看见的。由于系统是1个管理方面的功能较多,所以不会将用户留言信息提供其它的用户查看。

查看留言(如图4.18)

 

图4.18 查看留言

 

4.7.3 删除留言

删除留言功能只有管理员才能查看并操作,在删除的显示页面中会将所有的用户留言信息及用户名显示出来。这样也为管理员提供查看哪些用户是非法的发布留言内容。针对这类情况删除该用户。

删除留言页面(如图4.19)

 

图4.19 删除留言

5 系统测试与分析

设计完成系统的各个模块以后,需要对全部系统进行全面的测试。目的是让全部系统能够快速、稳定、安全的运行。在进行系统测试进程中出现以下几种情况:

(1)对页面提交的过来的数据进行空指针异常捕捉。凡是遇到无效或是空值数据都需要用程序进行操作处理。

(2)及时的捕捉数据库连接和关闭异常。以避免数据库连接资源及时释放,提供下1次要求调用。

(3)对数据库查询操作异常进行捕捉。

(4)对数据库查询操作异常进行捕捉。

(5)对数据库更新操作异常进行捕捉。

(6)对数据库添加操作异常进行捕捉。

(7)对数据库删除操作异常进行捕捉。

(8)权限控制,通过session会话变量对管理员和用户的权限进行控制。

(9)页面的编码方式不同,需要的对字符串进行转码操作。

结    论

通过对J2EE知识的认真学习,理论联系实践,终究完成了基于J2EE公交查询系统的设计与实现。经过量次测试,运行效果良好。对该系统,加强后台管理,就能够单独作为大型公交管理系统的1个模块,也能够将它的功能更加完善后放置于城市公共场所,为人们提供快捷、方便的查询。这样不但体现出1个城市的公交查询系统的发展水平,更可以显示出城市的数字化和信息化水平。公交查询系统的开发利用也势必促使城市公交更好的服务于人们。

在完成这次毕业设计的进程中,自己查阅了大量的书籍,并且通过互联网也查阅了许多相干资料,开发出具有B/S结构模式的公交系统,从而使我的编程能力和自学能力得到了很大程度的提高,对网站设计有了更深地了解。

但是,由于全部系统完全都是由个人设计的,有关J2EE许多知识都要靠自己去摸索,加上自己水平有限,未能完全地理解J2EE的强大功能,因此,系统还存在着许多不足的地方。

参考文献

[1] 刘晓华.J2EE企业级利用开发[M].北京:飞思科技产品研发中心,2003。

[2] 赛奎春,陈威.JSP工程利用与项目实践[M].北京:清华大学出版社,2004。

[3] Cay S.Horstmann,Gary Cornell.java核心技术卷2高级特性[M].北京:机械工业出版社,2003。

[4] Frank M.Carrano,Walter Savitch.数据结构与抽象:Java语言版[M].北京:清华大学出版社,2005。

[5] 孙卫琴,李洪成.Tomcat与Java Web开发技术详解[M].北京:电子工业出版社,2004。

[6] 高铁杠,顾巧论.智能公交查询系统[J].新技术利用,2005,(7):31⑶2。

[7] 王宏.MSSQL 数据库管理[M].北京:人民邮电出版社,2001

 

 

 


 

10

· 南菜园到鼓楼大街

· 南菜园到长陵

· 南菜园到永定门东街

· 南菜园到华联商城大兴店

· 南菜园到丰台路口西

· 航天桥东到9龙山

· 航天桥东到史各庄(S216)

· 航天桥东到岔道口

· 航天桥东到土桥村

· 航天桥东到北京华侨城北站

 

 

11路:

 

 

 

 

 

 

11路上行所有公交车站

 (共20站)

· 1大北窑东站

· 28王坟南站

· 3北京东站北站

· 49龙山站

· 5珠江帝景站

· 6大郊亭桥西站

· 7大郊亭桥东站

· 8东石门站

· 9唐家村站

· 10小海子站

· 114根旗杆站

· 12方家村站

· 13朝阳半壁店站

· 14观音堂北站

· 15观音堂站

· 16古塔公园站

· 17王4营站

· 18王4营桥东站

· 19孛罗营村北站

· 20孛罗营站

 

 

 

 

12路

· 15间楼站

· 2横7条站

· 3刘家窑桥东站

· 4方庄南口站

· 5芳星园站

· 68里河站

· 7左安门外站

· 8左安门内站

· 9龙潭湖游泳池站

· 10龙潭公园站

· 11龙潭湖站

· 12光明楼站

· 13夕照寺站

· 14夕照寺街北口站

· 15广渠门内站

· 16安化楼站

· 17培新街站

· 18南花市大街站

· 19羊市口站

· 20花市路口北站

· 21崇文门东站

· 22北花市大街站

· 23小市口站

· 24东花市大街站

· 25白桥大街站

· 26夕照寺街北口站

· 27夕照寺站

· 28光明楼站

· 29龙潭湖站

· 30龙潭公园站

 

 

想要源码和完全文档的请联系QQ:1329331182


生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生