一、项目背景
随着经济的飞速发展,人们的生活质量有了较大的提高,城市居民的出行变得越来越频繁,城市交通也面临越来越多的挑战。城市公共交通具有客流量大、成本低、效率高、节约资源等优势,因此,如何大力发展公交产业,鼓励人们乘坐公交出行,进而改善交通状况,是一个值得思考和研究的问题。
目前国内外公交信息查询系统提供的只有简单的查询,不提供任意的站台查询及周边有效信息。乘客可以获得的公交信息很少,而且方式主要是常规手段。大部分系统查询的信息不提供实时查询,乘客得不到准确的查询信息。大部分公交线路修改不及时,没有专门管理员进行后台管理。
虽然一个在城市生活多年的人要求他说出不同的骑行计划,但他往往很难说出。但如果给他一张路线图,他就能很快在地图上找到不同的骑行方案。但是这样的查询效率相对而言就降低了,因此需要有一个高效率的公交查询系统,才是问题所在。基于 Dubbo 分布式智能公交查询系统,是采用 Browser/Server 结构开发的智能公交查询系统。利用数据结构中的最短路径算法,找出两个站点之间的最方便的行程,既反映城市智能公交查询系统的水平,同时也反映城市的数字化和信息化水平。
近二十年来,中国经济持续快速发展,经济的快速增长带动了汽车工业的强劲发展,交通运输条件明显改善,据统计,中国高速公路总体性能达到 130 多万公里,到 2000 年底,人均国内生产总值超过八百美元,沿海地区达到两千至三千美元,按照国家发展的惯例,当人均国内生产总值超过一千美元时,汽车消费将进入快速增长阶段,我国城镇人口约两亿,比美国的城镇人口低,且东部沿海地区大部分居民都已具备汽车购买消费能力。根据中国消费者协会千禧年的调查,未来五年,32%的消费者将准备购买家用汽车,而 30.6%的无车消费者却也已经有了驾驶证,随着个人信用体系的启动和完善,家庭汽车的快速增长将打开一个巨大的中国汽车市场。
在公交智能化方面的研究中,日本起步较早,20 世纪 70 年代,日本开始研究智能公共交通。日本在 20 世纪 70 年代开发了公共汽车定位系统。该系统的出现标志着日本智能公共交通的研究正式开始,该系统安装在公交车上,当公交车到达上一站时,可以将无线连接的车辆信息发送到调度站,这是智能公交系统的基本模式,上世纪 80 年代,日本城市公交车上安装了一种称为自动乘客计数器的装置,该装置的主要功能是测量公共汽车上下乘客的流量,该装置使公共交通能够实时捕捉公交站点的客流,通过分析公交站点的客流,为公交运营商规划出行计划提供决策帮助。到了 20 世纪 90 年代,日本研发的 CTCS 系统问世。美国从事智能公交方面的研究起源于 20 世纪 80 年代,美国城市管理局(UTMS)启动了智能公共交通系统项目,本文重点研究了以下几个方面:GIS 系统、人口自动计数系统、通信系统以及自动车辆定位系统等。欧洲国家开始从事智能公交方面研究可追溯到 20 世纪 80 年代,欧洲国家在从事公交方面的研究结合了本地区道路比较狭窄的特点,将公交发展的方向放在了建设公交专用道和公交信号优先上。
智能公交查询系统可以实时动态查询公交情况及本市交通新闻资讯,让出行者可以提前做好出行准备,避免交通拥堵,用户还可以留言信息,把当天的路况共同分享,用户可以在页面查询到公交路线图及公交路线可以提前做好出现计划,管理员可以对用户进行删除修改,对新闻进行更新,实时关注用户留言来更新完善系统。
综上所述,本系统通过运用 JAVA 语言,使用 SSM 框架和 Dubbo 分布式来搭建。将智能公交查询系统信息存入 Mysql 数据库当中,通过系统来对数据库中的站点信息、公交信息、用户信息、公交信息、用户留言信息及新闻发布信息管理等事务。
二、系统总体设计
2.1 框图技术介绍
随着经济的发展,用户数量的增长,同时接入系统的需求不断增加,系统数量不断增加,呼叫依赖关系复杂,保证了系统的高可用性和高平等性要求,系统的架构已经从单体时代逐渐转变为 SOA 服务时代,我们可以更合理地分配系统资源,最大限度地利用系统资源。而 Dubbo 则是 SOA 服务化治理方案的一个核心框架。
本系统采用的分布式服务框架是 Dubbo 框架。其功能包括:强大的 NiO 通信和多协议集成、服务动态寻址和路由、软负载平衡和容错、依赖性分析和降级等。
Dubbo 的核心部分包括:
1、远程通信:提供基于长连接的各种 NiO 框架的抽象封装,包括各种线程模型,“请求-响应”模式的串行化和信息交换模式。
2、集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及集群对软负载平衡、容错、地址重定向的支持,动态配置等。
3、自动发现:基于目录服务,服务用户可以动态找到服务提供者,使地址透明,并慢慢的增加或减少服务提供者。
Dubbo 是一个高性能、高效率的服务框架,专门提供强大并透明的 RPC 远程服务调用,以及 SOA 服务治理,应用程序可以通过强大的 RPC 实现服务的输出、输入功能,并可以与 spring 框架集成连接。
Dubbo 的主要特点是按照分层体系结构的思想构建应用服务,可以断开层(或松耦合),从服务式模型的角度来看,Dubbo 采用了一个非常简便的模型,不是提供者去提供服务,就是使用者去使用服务。因此,在这基础上,我们可以抽象出两个角色:一是服务提供者(Provider),二是服务使用者(Consumer)。
Dubbo 包含远程通讯、服务集群和服务发现与注册三个核心部分。提供透明的远程调用方法,实现与本地调用方法一样的远程调用方法,这样就具有配置简单,无 API 入侵,同时具有软负载均衡和容错机制,可替代 F5 等内网硬件负载均衡器,降低了项目的成本和个人的积分,可以实现服务的自动注册和发现,不再需要写服务提供商的地址。注册表查询服务提供者的 IP 地址以获得接口名称,并可以顺利地添加或删除服务提供者。
Dubbo 经常会和 SpringCloud 微服务架构作比较,但实际上两者侧重的领域是有很大不同的。Dubbo 侧重于服务治理即服务的注册更新、管理服务的生命周期、定制服务的遵从规则,确保服务一致性、服务监控等、服务的调用等。而 SpringCloud 则侧重于整个微服务生态,除了服务治理以外对服务网关、分布式配置、服务跟踪、消息总线、数据流、批量任务等都有很好的技术规范实现。可以看出来 Dubbo 可以作为 SpringCloud 生态的一部分和 SpringCloud 整合在一起提供服务治理方面的支持。虽然功能没有 SpringCloud 整个生态完善,但是就服务治理来讲,Dubbo 有着诸多优势:1.支持更多协议,如:rmi、hessian、http、webservice 等。2.效率更高,因为访问方式的不同 Dubbo 能有更好的表现。3.服务治理提供粒度更小的管理。
2.2 系统设计要求
本系统的设计要求和技术指标;
1、技术架构选用 Dubbo 分布式,采用 SSM 框架技术实现;
2、系统对不同的角色有不同的权限管理,具体角色分为用户及管理员;
3、系统可以实现公交路线的管理,用户留言的管理,交通新闻的管理;
4、系统可以查询所有公交情况,还能下载公交路线图;
5、智能公交查询系统:智能公交查询系统业务流程和数据流程,确定系统开发的方向与各个模块的功能;
6、智能公交查询系统功能模块设计:按车次,站点,起终点等查询;
7、系统运行:通过应用的智能公交查询系统所具有的功能,再结合用户调查报告,分析当前人们的所需,对系统进行评价,并研究如何改进智能公交查询系统;
8、查询相关资料,了解研究体系的重要性;
9、通过询问信息,我们可以知道如何实现系统以及要实现哪些功能;
10、设计了通用操作模式;
11、通过进一步了解,您可以加强对每个功能的细化和改进;
12、对设计好的程序进行调试,通过调试结果发现存在的问题并修改;
13、完成车次、车站功能;
14、完整车次和车站更新;
15、完成删除车次、车站的功能;
16、用户登录时账号密码验证功能;
17、用户注册账号时需完成的信息功能;
18、用户注销个人账号信息功能;
19、删除用户信息账号信息功能;
20、用户可以添加用户留言、管理员删除用户留言,管理员查看用户留言等功能;
21、管理员登录账号密码验证功能;
22、管理员对新闻内容的添加及新闻内容的删除等功能。
2.3 系统设计思路
目前国内外公交信息查询系统提供的只有简单的查询,不提供任意的站台查询及周边有效信息。乘客可以获得的公交信息很少,而且方式主要是常规手段。大部分系统查询的信息不提供实时查询,乘客得不到准确的查询信息。大部分公交线路修改不及时,没有专门管理员进行后台管理。
即使一个人在同一个城市里生活很多年,我们问路时,让他说出具体的不同的乘车方案时,他通常也是很难说出来,相反如果给他一张全市交通地图,他却可以很快在地图上找出不同的乘车方案,那怕找的方案不是最优的,那是一条可提供参考的备选路线方案。但是这样的查询效率相对而言就降低了,所以需要提供一个高效的查询系统,才是问题所在。而基于 Dubbo 分布式智能公交查询系统,就是利用 Browser/Server 结构开发出来的智能公交查询系统,该系统通过数据结构当中的最短路径算法,可以查出任意两个站点之间最便捷的乘车方案。该智能公交查询系统既能体现出一个城市的智能公交系统的水平,更显示出城市的数字化,信息化水平。
本公交查询系统包括,管理员对用户的注册,用户的登录、公交路线的增删改查、上传新闻、对用户留言进行删除这几个功能。登录后用户可以在界面使用查询系统查询公交路线、下载公交路线图、在线留言及查看新闻动态,同时可以修改个人账号密码功能。
2.4 系统设计框图
根据设计要求,系统功能框图如图 2.1 所示:
图 2.1 系统功能框图
三、数据库设计
3.1 数据库表设计
3.1.1 address 表(站点表)
表 3.1 站点表
站点表主要用于存储 address_id(站点 ID)、address_name(站点名称)、bus_id(公交 ID)和 bus_name(公交车名称)等信息,其中 address_id(站点 ID)和 address_name(站点名称)不能为空。
3.1.2 bus 表(公交表)
表 3.2 公交表
公交表主要是用来存放 bus_id(公交 ID)、bus_name(公交名称)、first_bus(首班车时间)、create_time(创建时间)、stop_address(经停站点)、final_bus(末班车时间)和 bus_img(公交图片),站点及公交路线图等信息,其中 bus_id(公交 ID)、bus_name(公交名称)、first_bus(首班车时间)和 create_time(创建时间)不能为空。
3.1.3 news 表(新闻表)
表 3.3 新闻表
新闻表主要是用来存放 news_id(新闻 ID)、news_info(新闻内容)、create_time(创建时间)和 news_title(新闻标题)等信息,其中 news_id(主键 ID)不能为空。
3.1.4 review 表(留言表)
表 3.4 留言表
留言表主要是存放 review_id(留言内容 ID)、review_info(留言内容)、user_id(留言人 ID)、user_name(留言人用户名)和 review_time(留言时间)等信息,其中 review_id(留言内容 ID)不能为空。
3.1.5 role 表(角色表)
表 3.5 角色表
角色表主要是存放 role_id(角色 ID)和 role_name(角色名)等信息,其中 role_id(角色 ID)不能为空。
3.1.6 user 表(用户表)
表 3.6 用户表
用户表主要是存放 user_id(用户 ID)、user_name(用户名)、user_realname(用户真实姓名)、user_sex(用户性别)、user_tel(用户电话)、user_email(用户邮箱)、password(用户密码)和 role_id(用户角色 ID)等信息,其中 user_id(用户 ID)、user_name(用户名)、password(用户密码)和 role_id(用户角色 ID)不能为空。
四、系统设计
4.1 用户注册与登录
4.1.1 功能描述
用户通过注册成为用户(如图 4.1 所示),在注册页面中,用户填写用户名、真实姓名、性别、电话、邮箱、密码这些信息,这个的设计主要是由循环和各种函数来实现的,每一个操作的实现需要层层嵌套,在这个过程中,我觉得最主要的是如何判断用户名及密码是否正确,如果输入的用户名或密码不对了,就会提示错误,需要再重新输入一次用户名和密码,只有同时输入用户名、密码都正确了,才能从登录页进入到系统,然后再进行下一步的操作。要是通过数据验证功能流程图如 4.2 所示:
图 4.1 注册页面图
图 4.2 数据验证功能流程图
4.1.2 页面部分源码
<html>
<head></head>
<body>
@RequestMapping("/login") public String login(Map map,String userName, String password,HttpSession session){ HashMap
<string, object="">
hashMap = new HashMap<>(); hashMap.put("userName",userName); List
<user>
list = userService.getList(hashMap); if (list.isEmpty()){ map.put("msg","用户名或密码错误,请修改后重试"); return "index"; } User user = list.get(0); String roleId = user.getRoleId(); HashMap
<string, object="">
roleMap = new HashMap<>(); roleMap.put("roleId",roleId); List
<role>
list1 = roleService.getList(roleMap); Role role = list1.get(0); String password1 = user.getPassword(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); String format1 = format.format(new Date()); if (password1.equals(password)){ if (roleId.equals("1")){ HashMap
<string, object="">
hashMap1 = new HashMap<>(); hashMap1.put("reviewTime",format1); List
<review>
list2 = reviewService.getList(hashMap1); List userList = userService.getList(map); List reviewList = reviewService.getList(map); List busList = busService.getList(map); List newsList = newsService.getList(map); if (userList.isEmpty()){ map.put("userSize",0); }else { map.put("userSize",userList.size()); } if (reviewList.isEmpty()){ map.put("reviewSize",0); }else { map.put("reviewSize",reviewList.size()); } if (busList.isEmpty()){ map.put("busSize",0); }else { map.put("busSize",busList.size()); } if (newsList.isEmpty()){ map.put("newsSize",0); }else { map.put("newsSize",newsList.size()); } map.put("reviewToday",list2); }else if (roleId.equals("2")){ List busList = busService.getList(map); List newsList = newsService.getList(map); HashMap
<string, object="">
hashMap1 = new HashMap<>(); hashMap1.put("userId",user.getUserId()); List reviewList = reviewService.getList(hashMap1); if (reviewList.isEmpty()){ map.put("reviewSize",0); }else { map.put("reviewSize",reviewList.size()); } if (busList.isEmpty()){ map.put("busSize",0); }else { map.put("busSize",busList.size()); } if (newsList.isEmpty()){ map.put("newsSize",0); }else { map.put("newsSize",newsList.size()); } HashMap
<string, object="">
hashMap2 = new HashMap<>(); hashMap2.put("userId",user.getUserId()); hashMap2.put("reviewTime",format1); List
<review>
list2 = reviewService.getList(hashMap2); map.put("reviewToday",list2); } session.setAttribute("userInfo",user); session.setAttribute("roleInfo",role); return "admin_main"; }else { map.put("msg","用户名或密码错误,请修改后重试"); return "index"; } } @RequestMapping("/register") public String Register(Map map,HttpServletRequest request) throws ParseException { User user = new User(); user.setRoleId("2"); String userName = request.getParameter("userName"); String password = request.getParameter("password"); String userRealName = request.getParameter("userRealName"); String userSex = request.getParameter("userSex"); String userTel = request.getParameter("userTel"); String userEmail = request.getParameter("userEmail"); user.setUserRealName(userRealName); user.setUserSex(userSex); user.setUserId(ObjectId.next()); user.setUserTel(userTel); user.setUserEmail(userEmail); user.setPassword(password); user.setUserName(userName); userService.create(user); map.put("msg","成功注册,请登录"); return "index"; }
</review>
</string,>
</string,>
</review>
</string,>
</role>
</string,>
</user>
</string,>
</body>
</html>
复制代码
4.2 用户留言
4.2.1 功能描述
用户留言模块主要是为了提高软件的适用度和要舒适度,因为设计软件是给用户用的,所以一定要考虑用户的想法,要抱有着用户至上的原则,所以为了提高用户的体验感,我特的地设计了这个模块,这个模块的主要功能是用户可以在留言板里把自己的意见或者建议留言在留言板里,当管理员看到消息时,管理员可及时在管理员界面查看留言信息及删除留言信息。这样就有了一个积极的反馈,不仅让用户提升了参与感,还使得我的软件变得更加的方便简洁,也促使我把未曾思考仔细地功能考虑进去,这不仅让我得思维更加完善,也使得我的技术得到了很好的锻炼。所以在写代码的时候,我们不能只从研发者的角度出发,还要考虑软件的实际用途和用户的使用感,尽量做到简洁、方便使用和较为齐全的的功能,所以在软件设计之初,我们也需要的得知用户的目的和想法,从目的出发,这样不仅能帮我们抓住主要矛盾、对代码的编写也有着积极的影响。(如图 4.3 至图 4.4 所示)
图 4.3 用户留言列表图
图 4.4 用户发布留言图
4.2.2 页面部分源码
<html>
<head></head>
<body>
@RequestMapping("/add_review_do") public String addReviewDo(Review review, HttpServletRequest request, HttpSession session){ User userInfo = (User) session.getAttribute("userInfo"); review.setUserId(userInfo.getUserId()); review.setUserName(userInfo.getUserName()); String reviewInfo = request.getParameter("reviewInfo"); SimpleDateFormat fo = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String format = fo.format(new Date()); review.setReviewInfo(reviewInfo); review.setReviewId(ObjectId.next()); review.setReviewTime(format); reviewService.create(review); return "redirect:/to_review_list"; } @RequestMapping("/to_review_list") public String toReviewList(Map map,HttpSession session){ User userInfo = (User) session.getAttribute("userInfo"); String roleId = userInfo.getRoleId(); if (roleId.equals("1")){ List list = reviewService.getList(map); map.put("reviewList",list); }else { HashMap
<string, object="">
hashMap = new HashMap<>(); hashMap.put("userId",userInfo.getUserId()); List
<review>
list = reviewService.getList(hashMap); map.put("reviewList",list); } return "admin_review_list"; } @RequestMapping("/deleate_review/{reviewId}") public String deleteReview(@PathVariable("reviewId")String reviewId){ HashMap
<string, object="">
hashMap = new HashMap<>(); hashMap.put("reviewId",reviewId); List
<review>
list = reviewService.getList(hashMap); Review review = list.get(0); reviewService.delete(review); return "redirect:/to_review_list"; }
</review>
</string,>
</review>
</string,>
</body>
</html>
复制代码
4.3 时讯新闻
4.3.1 功能描述
时讯新闻模块在设计之初是为了让用户得知实时的公交信息,让用户自己判断自己的时间,可以选择合适自己出行的交通方式,这是因为在生活中,有许多人因为预估的交通工具到达的时间不够准确,导致错过了很多种重要事情,所以知道公交的实时讯息极为重要,但是我在这里的设计是管理员才能增加删除新闻,而用户不可以上传新闻,这个做法的目的是为了防止用户因为自己的一点私利,发布不实信息,为了自己的利益,伤害了大部分人的利益。这个是不符合我设计软件的初衷的,这个软件的初衷是是人们能够更加方便地出行,所以这个模块至关重要。(如图 4.5 至图 4.6 所示)
图 4.5 新闻发布图
图 4.6 新闻列表图
4.3.2 页面部分源码
<html>
<head></head>
<body>
@Requ3estMapping("/to_news_list") public String toNewsList(Map map){ List list = newsService.getList(map); map.put("newsList",list); return "admin_news_list"; } @RequestMapping("/to_add_news") public String toAddNews(){ return "admin_add_news"; } @RequestMapping("/add_news_do") public String addNewsDo(News news, HttpServletRequest request){ String newsTitle = request.getParameter("newsTitle"); String newsInfo = request.getParameter("newsInfo"); news.setNewsTitle(newsTitle); news.setNewsInfo(newsInfo); news.setNewsId(ObjectId.next()); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String format = simpleDateFormat.format(new Date()); news.setCreateTime(format); newsService.create(news); return "redirect:/to_news_list"; } @RequestMapping("/to_news_detail/{newsId}") public String toNewsDetail(@PathVariable("newsId")String newsId,Map map){ HashMap
<string, object="">
hashMap = new HashMap<>(); hashMap.put("newsId",newsId); List
<news>
list = newsService.getList(hashMap); News news = list.get(0); map.put("news",news); return "admin_news_detail"; } @RequestMapping("/update_news_do") public String updateNewsDo(News news,HttpServletRequest request){ String newsId = request.getParameter("newsId"); String newsTitle = request.getParameter("newsTitle"); String newsInfo = request.getParameter("newsInfo"); news.setNewsId(newsId); news.setNewsTitle(newsTitle); news.setNewsInfo(newsInfo); newsService.update(news); return "redirect:/to_news_list" } @RequestMapping("/deleate_news/{newsId}") public String deleteNews(@PathVariable("newsId")String newsId){ HashMap
<string, object="">
hashMap = new HashMap<>(); hashMap.put("newsId",newsId); List
<news>
list = newsService.getList(hashMap); News news = list.get(0); newsService.delete(news); return "redirect:/to_news_list"; }
</news>
</string,>
</news>
</string,>
</body>
</html>
复制代码
4.4 公交查询
4.4.1 功能描述
公交查询模块分为管理员和用户,管理员主要是可以根据最新的路况上传新的公交信息及路线图,也可以因为某些意外的事件更改公交信息,这样用户就可以根据实时的路况来查询公交信息并下载路线图,以选择合适方式和路线,这个设计主要根据上一个模块来的,正是因为可以得知公交实时讯息,所以用户才可以随时随地的知道
公交的情况,这样不仅可以节约了用户的时间成本还让人的出行变得更加的方便和提高了光脚的利用率。(如图 4.7 至图 4.8 所示)
图 4.7 公交列表图
图 4.8 站点信息列表图
4.4.2 页面部分源码
<html>
<head></head>
<body>
@RequestMapping("/to_address_list") public String toAddressList(Map map){ List list = addressService.getList(map); map.put("addressList",list); return "admin_address_list"; } @RequestMapping("/to_add_address") public String toAddAddress(Map map){ List list = busService.getList(map); map.put("busList",list); return "admin_add_address"; } @RequestMapping("/add_address_do") public String addAddressDo(Address address, HttpServletRequest request,Map map){ address.setAddressId(ObjectId.next()); String busName = request.getParameter("busName"); String addressName = request.getParameter("addressName"); HashMap
<string, object="">
hashMap = new HashMap<>(); hashMap.put("busName",busName); List
<bus>
list = busService.getList(hashMap); String busId = list.get(0).getBusId(); address.setBusId(busId); address.setAddressName(addressName); address.setBusName(busName); HashMap
<string, object="">
addressMap = new HashMap<>(); addressMap.put("addressName",addressName); addressMap.put("busId",busId); addressMap.put("busName",busName); List
<address> list1 = addressService.getList(addressMap); if (list1.isEmpty()){ addressService.create(address); return "redirect:/to_address_list"; }else { map.put("msg","该公交下站点已存在,请修改后提交"); return "forward:/to_add_address"; } } @RequestMapping("/deleate_address/{addressId}") public String deleteAddress(@PathVariable("addressId")String addressId){ HashMap
<string, object="">
hashMap = new HashMap<>(); hashMap.put("addressId",addressId); List
<address> list = addressService.getList(hashMap); Address address = list.get(0); addressService.delete(address); return "redirect:/to_address_list"; } @RequestMapping("/to_address_detail/{addressId}") public String toAddressDetail(@PathVariable("addressId")String addressId,Map map){ HashMap
<string, object="">
hashMap = new HashMap<>(); hashMap.put("addressId",addressId); List
<address> list = addressService.getList(hashMap); Address address = list.get(0); map.put("address",address); HashMap
<string, object="">
hashMap1 = new HashMap<>(); List
<bus>
list1 = busService.getList(hashMap1); map.put("busList",list1); return "admin_address_detail"; } @RequestMapping("/update_address_do") public String updateAddressDo(HttpServletRequest request,Address address){ String busName = request.getParameter("busName"); HashMap
<string, object="">
hashMap = new HashMap<>(); hashMap.put("busName",busName); List
<bus>
list = busService.getList(hashMap); String busId = list.get(0).getBusId(); address.setBusId(busId); address.setBusName(busName); String addressName = request.getParameter("addressName"); address.setAddressName(addressName); addressService.update(address); return "redirect:/to_address_list"; } @RequestMapping("/to_search_address") public String toSearchBus(){ return "admin_search_address"; } @RequestMapping("/search_address_do") public String searchAddressDo(HttpServletRequest request,Map map){ HashMap
<string, object="">
hashMap = new HashMap<>(); String addressName = request.getParameter("addressName"); hashMap.put("addressName",addressName); List
<address> list = addressService.getList(hashMap); List
<bus>
buses = new ArrayList<>(); for (Address address:list){ String busId = address.getBusId(); HashMap
<string, object="">
hashMap1 = new HashMap<>(); hashMap1.put("busId",busId); List
<bus>
list1 = busService.getList(hashMap1); Bus bus = list1.get(0);buses.add(bus); } map.put("busList",buses); return "admin_bus_list"; }
</bus>
</string,>
</bus></address>
</string,>
</bus>
</string,>
</bus>
</string,></address>
</string,></address>
</string,></address>
</string,>
</bus>
</string,>
</body>
</html>
复制代码
五、项目总结
《智能公交查询系统》实现的设计原理是基于 Dubbo 分布式完成的智能公交查询系统,该系统可分为两个方向,一是用户,新用户可以在首页时通过点击注册按钮,进去信息注册中心,用户需要把用户名、用户真实姓名、用户性别、用户电话、用户邮箱和用户密码填写完毕,即可注册成功,用户注册成功后需登录验证才可进入首页,登录验证时需账号和密码同时正确才可进入,反之则报错,用户可以查看公交路线图并下载公交路线图,还可以查看各趟公交有什么站点并留言,留言功能是为了让用户拥有参与设计的感觉,可以更好的完善系统;二是管理员,管理员可以对公交路线图和公交站点情况进行查看、增加和删除等,管理员还可以发布新闻,新闻可以是天气类型的或者是交通类型的,可以方便提醒使用者本天天气或路况情况,并且管理员可以对用户信息进行管理。
六、参考文献
[1] 邵慧燕 姚春龙. 基于层次分析法的公交查询模型[D]. 大连工业大学学报, 2009.
[2] 林冬梅. 旅客出行服务设计与可靠性评价方法研究[D]. 北京交通大学, 2013.
[3] 曹诗淇. GIS在城市智能公交系统中的应用[D]. 哈尔滨师范大学地理科学学院, 2016.
[4] 兰燕 刘珊红 戴晓爱. 基于移动通信GPSGIS技术的智能公交系统技术和功能[D]. 四川测绘, 2007.
[5] 朱丽丽 陈志荣. 基于宁波市的公交出行路径选择模型[D]. 宁波工程学院学报, 2010.
[6] 宋爽 张维石. 基于最少换乘算法的公交查询系统[D]. 电脑知识与技术, 2018.
[7] 王祥. 公交车最佳乘车路径优化算法[D]. 唐山师范学院学报, 2009.
[8] 黄全舟 杜海东. 公交线路管理系统换乘算法设计[D]. 软件导刊, 2012.
[9] 张强 宋洪娟 宋静静. 公交出行查询系统的理论分析[D]. 中国城市经济, 2010.
[10] Al-Kanhal T, Abbod M. Multi-agent System for Dynamic Manufacturing SystemOptimization[M]// Computational Science–ICCS 2018. Springer Berlin Heidelberg, 2018:634-643.
复制代码
评论