
软件工程课程设计
设计说明书
| 停车场管理系统的设计与开发 |
| 学生姓名 | 胡冰洋 |
| 学号 | 0718014071 |
| 班级 | 计本073 |
| 成绩 | |
| 指导教师 | 高虎 |
2010年 12 月 31 日
软件工程课程设计 课程设计评阅书
| 题目 | 停车场管理系统的设计与开发 | ||
| 学生姓名 | 胡冰洋 | 学号 | 0718014071 |
| 指导教师评语及成绩 指导教师签名: 年 月 日 | |||
| 答辩评语及成绩 答辩教师签名: 年 月 日 | |||
| 教研室意见 总成绩: 室主任签名: 年 月 日 | |||
课程设计任务书
2010 — 2011 学年第 一 学期
专业: 计算机科学与技术 学号: 0718014071 姓名: 胡冰洋
课程设计名称: 软件工程课程设计
设计题目: 停车场管理系统的设计与开发
完成期限:自 2010 年 12 月 19 日至 2010 年 12 月 31 日共 2 周
设计依据、要求及主要内容(可另加附页):系统功能需求分析
每进入一辆车,必须登记。1汽车型号,2进入时间,3停车编号,4停车车位。当汽车离开时,记录离开时间,计算停车费用(小型车1元每小时,中型车2元每小时,大型车3元每小时,可以随时查询某辆车的停车情况。)
要求:
1、自选语言实现系统;
2、严格按照软件工程的流程来完成。
2、函数功能要划分好,可以采用面向对象或者结构化程序设计,需要给出系统的功能结构图或UML图,图形用Visio画。
3、界面友好(良好的人机交互),加必要的注释;
4、要提供程序测试方案,程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。
指导教师(签字): 教研室主任(签字):
摘 要
随着现代社会的快速发展,人民生活水平快速提高,汽车的数量飞速增加,与此同时停车问题也越来越受到人们的关注,为了实现对停车场进行有效的管理,结合一些停车场的模式和现状开发出本停车场管理系统。
停车场管理系统是典型的信息管理系统,本停车场管理系统设计的主要功能包括场内车辆管理和后台数据库管理,其中场内车辆管理又分为出入场管理模块、收费模块、用户管理模块、停车场参数、停车场数据管理模块、系统管理模块等。我们从系统的设计和功能实现方面阐述了管理系统软件的开发过程。
系统采用了C/S架构,基于J2EE标准、MyEclipse6.0开发环境,数据库采用Microsoft SQL Server 2000。试运行结果表明,该系统具有良好的性能和扩展性,较高的响应速度和效率,该系统符合实际的停车场管理系统,为停车场管理供一个快速,简单规范的管理平台。这对提高信息化程度,降低人力成本有着重要的意义。
关键词:停车场管理系统,J2EE,C/S
第一章 绪论
1.1 选题背景
近年来,随着我国经济的快速发展,人们生活水平的不断提高,物质需求和生活方式也发生着深刻的变化,以前属于奢侈品的汽车己经逐步走入了市民的日常生活。伴随汽车消费大众化和各种机动车辆大范围内的迅速普及,车辆对其配套设施特别是停车场提出了更高的要求。停车是"速度为零的交通”,停车场及附属相关设施是静态交通的重要组成部分。停车场收费管理系统是伴随着公用收费停车场这一新生事物而诞生的。
目前的多数停车场存在着以下几个问题,管理漏洞、系统的可靠性、性强、收费过程比较繁琐、劳动强度高、停车场利用率低下、票款易流失等。针对这些问题该停车场系统从以下方面进行设计。针对管理进行了优化,采用划卡消费和现金支付相结合,系统计时计费。采用Java高级编程语言和相关技术开发设计管理系统软件,优化后的系统使用方便、服务高效、收费透明、防止票款的流失,提高可靠性同时也提高了操作者的工作效率。
1.2 主要相关技术
1.2.1 J2EE介绍
J2EE(Java 2 Platform, Enterprise Edition)是SUN公司定义的一个开放式企业级应用规范,他提供了一个多层次的分布式应用模型和一系列开发技术规范,多层次分布式应用模型是根据功能把应用逻辑分成多个层次,每个层次支持相应的服务器和组件.组件在分布式服务器的组件容器中运行,如Servlet组件在Servlet容器上运行,EJB组件在EJB容器上运行,容器间通过相关的协议进行通讯,实现组件的相互调用。遵从这个规范的开发者将得到行业的广泛支持,使企业级应用的开发变得简单、快速。
1.2.2 构建本系统J2EE开发工具
Java虚拟机:J2SDK1.6;Java开发工具:MyEclipse6.0;WEB服务器采用:Tomcat 6.0。环境配制过程:安装好J2SDK1.6后。在MyEclipse6.0中选择新建J2EE Project->Web Project,并在Web Project中Add Struts和Hibernate3.1。
1.2.3 MVC
MVC的英文全称为Model-View-Controller,即把一个应用程序的输入层、业务处理层、控制流程按照View、Model、Controller的方式进行分离,这样一个应用程序就被划分成相对而又协同工作的3个层,即视图层、模型层、控制层。在MVC设计模式中,客户端WEB浏览器会提交各种不同的用户请求,这些请求由控制器进行处理,控制器根据时间的类型来改变模型或视图,视图也可以接受模型层发出的数据更新通知,依据数据更新的结果调整视图效果,并呈现给用户。而模型也可以通过视图所获得的用户提交的数据进行具体业务逻辑的处理。
第二章 系统分析
2.1 系统分析
2.1.1 功能需求分析
根据停车场管理系统的需求,确定了该系统的用例图如下图所示。
图2-1 停车场管理系统用例图
图2.2 客户用例图
图2.3 系统管理员用例图
图2.4 操作员用例图
如图2-1所示,该系统主要有超级管理员、管理员和操作员三种角色,不同角色的基本任务如下所述。
超级管理员具有最高的权限,即对本系统所有的权限操作权。超级管理员授权给管理员赋予管理员应有的权限。
管理员可根据需要来维护角色信息,并授权给相应的操作员。进行系统的设置,权限设置,数据管理,操作员档案的管理。
操作员行使管理员给与的权限,行使档案管理(车辆档案、卡档案管理、用户档案管理),入场的管理,收费管理,以及出场的管理。
根据用例图得到的部分类图,如图 2-5
图 2-5 类图
2.1.2 系统流程分析
停车场管理系统分为入场停车和出场取车两部分。如图2-3所示。
图 2-6 系统流程图
A.入场停车流程
(1)入场
根据系统提示的停车场的现有信息控制车辆的入场,停车场在有车位的情况下方能停车。
(2)停车
指定停车位置提示给用户
B.出场取车流程
(1)收费
根据车辆信息,卡类型以及停车的时间等依据收费标准计算收费额度实施收费环节。
(2)出场
交费之后在出场的相关信息提示下完成停车管理过程。
2.2 技术可行性分析
停车场管理系统设计中,MVC(Model-View-Control)分层设计模式贯穿了整个设计流程,系统开发框架采用Struts1.2 +Hibernate3.1组合结构。
模型层
模型层主要包括数据逻辑和业务逻辑。 在本系统中,Hibernate提供处理数据持久化,JavaBean对业务逻辑Service封装。
视图层
系统用Java application实现视图层。
控制层
采用Dao处理前台请求与Service业务逻辑的调用。
2.3 系统数据模型层的分析与设计
MVC设计模式中的M(Model),主要包括了数据逻辑与业务逻辑。
数据逻辑
数据逻辑作为Model层面中的主要组成部分,其设计的优劣会对系统得整体性能表现产生至关重要的影响。
业务逻辑
业务逻辑是业务系统实现的主要组成部分,业务逻辑层主要负责以下几个方面的实现。
(1)管理应用的业务逻辑和业务校验。
(2)管理业务级对象之间的依赖性。
(3)管理与其他层进行交互的接口。
(4)事物代理。
(5)错误管理。
第三章 系统总体设计
3.1 系统设计
3.1.1 总体设计
首先判断登录的身份,进入相应的操作页面通过需要的操作,最终完成目的操作的功能。本系统UML活动图如图3-1所示。
他们在内在关系由数据库和程序来控制。
图3-1 UML活动图
3.1.2 业务流程分析
本系统的的使用者是停车场的工作人员,为了便于管理并借鉴现有停车场的管理模式,划分成三个角色的用户。工作人员首先登陆系统,经过一系列的身份验证,登陆成功之后进入相应的操作界面,实现各自的管理功能。总体功能分析业务流程图。如图 3-2业务流程图
图3-2 业务流程图
其中各模块有对应的添加、修改及删除功能。
3.1.2 系统功能模块
如图 3-3 系统功能模块划分
图 3-3 系统功能模块划分
3.1.3 系统模块设计
(1)授权管理模块 具有最高管理权限超级管理员对该模块进行操作,对管理员进行授权,添加删除修改管理员。
(2)系统设置 由超级管理员授权的管理员行使该功能,主要是对停车场的参数进行设置。
(3)操作员档案管理 由管理员行使改功能,停车场业务操作员进行管理,添加、删除、修改操作员的信息。
(4)数据管理模块 该模块显示了停车场日常运行所产生的数据,场内车辆,进出数据,收费金额以及记录的相关信息。
(5)档案管理 该部分功能为操作员所使用,主要是对停车场发放的卡进行管理、车档案的管理以及停车场顾客的信息档案管理。他们都有自己的添加、删改、修改的功能。
(6)入场管理 该模块是本系统的一个重要的功能模块,主要采集汽车入场时候的一些必要的参数,对参数进行处理和判断,这些获得的参数提交到后台进行相关的处理。
(7)出场管理 汽车离场之前对其进行的离场验证和停车时间的数据收集,为下一收费模块提供数据。
(8)收费管理 该模块是本系统最重要的一个模块,根据出入场提供的参数结合该模块收费标准的设置计算出收费的金额,完成收费并打印出收费清单。
3.2 数据库设计与实现
3.2.1 数据库的需求分析
数据库设计的ER图。如图 3-4系统数据库ER图,制定一个收费标准要卡的类型以及收费的标准(时收费或次收费)来确定。停车场的顾客用户有唯一的一条卡信息与自己的车信息绑定。停车场的总车位数决定了车位表的总车位,一个车位只能存放一部车。收费的根据时入场时的信息和出场时的信息以及收费标准的综合得出。记录要记下该员工在工作时间内的所有的操作记录,上下班时间以及在这段时间内的操作。
图 3-4 系统数据库ER图
根据系统需求,本系统需要设计13张表。
卡信息表:存放卡的相关信息。
停车场参数表:存放停车场的基本参数。
用户表:存放用户的基本信息。
车信息表:存放车的基本信息。
权限表:存放对应的权限信息和对应的行使该权限人员的相关信息。
时收费表:存放按时收费的时间段。
次收费表:存放按次收费的时间段。
入场表:存放入场时候的一些信息。
出场表:存放出场时的相关信息。
表:存放操作员交的相关信息。
收费表:存放停车一段时间的收费信息。
车位表:用于存放每一个车位上的停车状态。
收费标准表:存放收费的统一标准。
3.2.2 数据库的逻辑设计
下面给出各个表的详细结构。
表3-1 卡信息表
| 字段名 | 描述 | 类型 | 长度 | 是否为空 | 是否主键 |
| id | 自增 | int | 4 | 否 | 是 |
| cardid | 卡编号 | varchar | 20 | 是 | 否 |
| cardno | 卡号 | varchar | 20 | 是 | 否 |
| cardtype | 卡类型 | varchar | 20 | 是 | 否 |
| cardmoney | 余额 | money | 8 | 是 | 否 |
| sendtime | 发卡时间 | datetime | 8 | 是 | 否 |
| activetime | 有效时间 | datetime | 8 | 是 | 否 |
| sendflag | 已发 | tinyint | 1 | 是 | 否 |
| loseflag | 挂失 | tinyint | 1 | 是 | 否 |
| 字段名 | 描述 | 类型 | 长度 | 是否为空 | 是否主键 |
| id | 自增 | int | 4 | 否 | 是 |
| parkname | 停车场名字 | varchar | 20 | 是 | 否 |
| parktotal | 总车位 | int | 4 | 是 | 否 |
| entertotal | 入口车道数 | int | 4 | 是 | 否 |
| exittotal | 出口车道数 | int | 4 | 是 | 否 |
| parktel | 停车场电话 | varchar | 20 | 是 | 否 |
| parkadd | 停车场地址 | varchar | 20 | 是 | 否 |
| 字段名 | 描述 | 类型 | 长度 | 是否为空 | 是否主键 |
| id | 编号 | varchar | 20 | 否 | 是 |
| name | 用户名 | varchar | 20 | 是 | 否 |
| sex | 性别 | char | 2 | 是 | 否 |
| tel | 电话 | varchar | 20 | 是 | 否 |
| cardno | 卡号 | varchar | 20 | 是 | 否 |
| carno | 车牌 | varchar | 20 | 是 | 否 |
| address | 地址 | varchar | 20 | 是 | 否 |
| 字段名 | 描述 | 类型 | 长度 | 是否为空 | 是否主键 |
| id | 自增 | int | 4 | 否 | 是 |
| carid | 编号 | varchar | 20 | 否 | 是 |
| carno | 车牌号 | varchar | 20 | 是 | 否 |
| cartype | 车类型 | varchar | 20 | 是 | 否 |
| 字段名 | 描述 | 类型 | 长度 | 是否为空 | 是否主键 |
| id | 自增 | int | 4 | 否 | 是 |
| poperatorid | 编号 | varchar | 20 | 否 | 是 |
| poperatorname | 姓名 | varchar | 20 | 是 | 否 |
| poperatorsex | 性别 | char | 10 | 是 | 否 |
| poperatorpsw | 密码 | varchar | 20 | 是 | 否 |
| poperatorright | 权限 | varchar | 20 | 是 | 否 |
| 字段名 | 描述 | 类型 | 长度 | 是否为空 | 是否主键 |
| id | 自增 | int | 4 | 否 | 是 |
| timeno | 时间号 | int | 4 | 否 | 是 |
| starttime | 开始时间 | char | 10 | 是 | 否 |
| endtime | 结束时间 | char | 20 | 是 | 否 |
| 字段名 | 描述 | 类型 | 长度 | 是否为空 | 是否主键 |
| id | 自增 | int | 4 | 否 | 是 |
| times_no | 时间号 | int | 4 | 否 | 是 |
| starttime | 开始时间 | char | 10 | 是 | 否 |
| endtime | 结束时间 | char | 10 | 是 | 否 |
| 字段名 | 描述 | 类型 | 长度 | 是否为空 | 是否主键 |
| id | 自增 | int | 4 | 否 | 是 |
| encardid | 入场编号 | varchar | 20 | 否 | 否 |
| encardno | 卡号 | varchar | 20 | 是 | 否 |
| encarno | 车牌 | varchar | 20 | 是 | 否 |
| enway | 入场车道 | varchar | 20 | 是 | 否 |
| entime | 入场时间 | datetime | 8 | 是 | 否 |
| enposition | 指定车位 | varchar | 20 | 是 | 否 |
| 字段名 | 描述 | 类型 | 长度 | 是否为空 | 是否主键 |
| id | 自增 | int | 4 | 否 | 是 |
| exited | 出场编号 | varchar | 20 | 否 | 否 |
| excardno | 卡号 | varchar | 20 | 是 | 否 |
| excarno | 车牌 | varchar | 20 | 是 | 否 |
| exway | 出场车道 | varchar | 20 | 是 | 否 |
| extime | 出场时间 | datetime | 8 | 是 | 否 |
| 字段名 | 描述 | 类型 | 长度 | 是否为空 | 是否主键 |
| id | 自增 | int | 4 | 否 | 是 |
| tnoperator | 操作员 | varchar | 20 | 否 | 否 |
| tnlogintime | 登录时间 | datetime | 8 | 是 | 否 |
| tnturntime | 时间 | datetime | 8 | 是 | 否 |
| entimes | 进场次数 | int | 4 | 是 | 否 |
| extimes | 出场次数 | int | 4 | 是 | 否 |
| totalmoney | 金额总计 | money | 8 | 是 | 否 |
| 字段名 | 描述 | 类型 | 长度 | 是否为空 | 是否主键 |
| id | 自增 | int | 4 | 否 | 是 |
| chargeid | 收费编号 | varchar | 20 | 否 | 否 |
| chcardno | 卡号 | varchar | 20 | 是 | 否 |
| chcarno | 车牌 | varchar | 20 | 是 | 否 |
| chmoney | 收费金额 | money | 8 | 是 | 否 |
| 字段名 | 描述 | 类型 | 长度 | 是否为空 | 是否主键 |
| id | 自增 | int | 4 | 否 | 是 |
| cpcarno | 车牌 | varchar | 20 | 是 | 否 |
| positionstate | 车位状态 | varchar | 20 | 是 | 否 |
| 字段名 | 描述 | 类型 | 长度 | 是否为空 | 是否主键 |
| id | 自增 | int | 4 | 否 | 是 |
| chargestid | 标准编号 | int | 4 | 是 | 否 |
| cardtype | 卡类型 | varchar | 20 | 是 | 否 |
| cartype | 车类型 | varchar | 20 | 是 | 否 |
| chargetype | 收费类型 | varchar | 20 | 是 | 否 |
| timeno | 时间编号 | int | 4 | 是 | 否 |
| unittime | 单位时间 | int | 4 | 是 | 否 |
| unitsum | 单位金额 | int | 4 | 是 | 否 |
| mostsum | 最大金额 | int | 4 | 是 | 否 |
3.2.3 数据库的实现脚本
1 卡信息表
CREATE TABLE [dbo].[pcard] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[cardid] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[cardno] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[cardtype] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[cardmoney] [money] NULL ,
[sendtime] [datetime] NULL ,
[activetime] [datetime] NULL ,
[sendflag] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[loseflag] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
2 停车场参数表
CREATE TABLE [dbo].[parkparameter] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[parkname] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[parktotal] [int] NULL ,
[entertotal] [int] NULL ,
[exittotal] [int] NULL ,
[parkadd] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[parktel] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
3 用户表
CREATE TABLE [dbo].[users] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[userid] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[username] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[usersex] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[usertel] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[u_carid] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[u_cardid] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[useradd] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
4 车信息表
CREATE TABLE [dbo].[car] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[carid] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[carno] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[cartype] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
5 权限表
CREATE TABLE [dbo].[rateright] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[poperatorid] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[poperatorname] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[poperatorsex] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[poperatorright] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[poperatorpsw] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
6 时收费表
CREATE TABLE [dbo].[ptime] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[timeno] [int] NOT NULL ,
[timestart] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[timeend] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
7 次收费表
CREATE TABLE [dbo].[ptimes] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[timesno] [int] NOT NULL ,
[timesstart] [char] (8) COLLATE Chinese_PRC_CI_AS NULL ,
[timesend] [char] (8) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
8 入场表
CREATE TABLE [dbo].[entrance] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[encardno] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[encardtype] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[encarno] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[encartype] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[enway] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[entime] [datetime] NULL ,
[enposition] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[enchargetype] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[enoperator] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
9 出场表
CREATE TABLE [dbo].[pexit] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[excardno] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[excarno] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[exway] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[extime] [datetime] NULL
) ON [PRIMARY]
10 表
CREATE TABLE [dbo].[turn] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[tnoperator] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[tnlogintime] [datetime] NULL ,
[tnturntime] [datetime] NULL ,
[entimes] [int] NULL ,
[extimes] [int] NULL ,
[totalmoney] [money] NULL
) ON [PRIMARY]
11 收费表
CREATE TABLE [dbo].[charge] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[cardid] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[cardtype] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[cartype] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[carno] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[money] [money] NULL
) ON [PRIMARY]
12 车位表
CREATE TABLE [dbo].[carposition] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[cpcarno] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[positionstate] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
13 收费标准表
CREATE TABLE [dbo].[standardcharge] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[chargestid] [int] NOT NULL ,
[cardtype] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[cartype] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[chargetype] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[timeno] [int] NULL ,
[unittime] [int] NULL ,
[unitsum] [int] NULL ,
[mostsum] [int] NULL
) ON [PRIMARY]
第四章 系统详细设计与实现
4.1 登录模块
图4-1 登录界面图
登陆页面需要用户名、密码,进入后根据管理的级别,行使不同的功能。登陆时进行验证,首先进行页面级的验证输入的信息,用户名和密码不能为空。其次进行数据库的验证,当系统中没有该管理员的信息时将把错误信息抛出到页面,提示用户出错原因。当同一个用户已经登录时,使用同一账号和密码将不能登陆该系统,在一定程度上提高了系统的安全性。
4.2 系统设置模块
图 4-2 系统设置界面
主要是根据管理员输入的停车场的参数,这些参数是由管理员对停车场的参数进行初始化,通过查询停车场参数显示停车场的参数信息。
4.3 入场管理模块
图 4-3 入场管理界面
图 4-4 入场管理界面
图 4-3 入场
图 4-5 寻找停车区a
图 4-6 寻找停车区b
图 4-7 寻找停车区c
图 4-8 进入停车区a
图 4-9 进入停车区b
图 4-10多辆车入场
如果有车入场,首先要检测一下是否还有空闲的车位,如果没有空闲车位,入场不成功。这一过程的实现通过设置每个车位的状态来进行实现,每个车位的信息都存储在车位信息表中。入场管理需要手动输入一些信息,提交之后要进行必要的判断之后按照指定车位进入停车场,在指定车位的时候是根据车位在车位表中的顺序来进行指定的。
4.4 出场管理
图 4-11 离开停车区
图 4-12 成功离开停车区
图 4-15出场管理界面
结 论
本文对C/S架构的停车场管理系统的设计和实现做了阐述和分析。探讨了在MyEclipse6.0的开发环境分析和开发该停车场管理系统。实现基于J2EE平台开发C/S版停车场管理系统,基本实现一般规模停车场的应用管理。
该系统设计采用了MVC开发设计模式,把整个系统的应用分成三个模块:模型、视图和控制器,让他们分担不同的任务,使整个系统在结构上看起来思路清晰,易于系统的改进和维护。系统使用时,只需要开启服务器,在浏览器中即可完成对该系统的操作。停车场管理系统的收费功能是该系统的主要功能模块,在利用在程序设置的收费标准进行计算收费金额实施收费。出入场的管理,实现卡与车的一一对应关系,在安全防盗车方面有一定作用。由于本系统只做了软件管理方面的实现,所以在采集数据方面还需要手动输入。由于开发能力和时间所限,本系统目前还需要在一定程度上进行改进和完善,根据以后系统在运行过程中出现的问题,主要是在系统性能、功能完善方面进一步加强。
参考文献
[1] 章立民.Visual C# 2005文件IO与数据存取秘诀[M].机械工业出版社,2007.
[2] 成嘉.UML系统建模与分析设计[M].机械工业出版社,2007.
[3] 金雪云,周新伟,王雷.Visual C# 2005 [M].高等教育出版社,2002.
[4] 马海军,景丽.Java编程原理与实践[M].清华大学出版社,2005.
附录
carThread.java
private void jbtnLeftStopActionPerformed(ActionEvent evt) {//GEN-FIRST:event_jbtnLeftStopActionPerformed
// TODO 将在此处添加您的处理代码:
//离开停车场,交存车卡
JOptionPane.showMessageDialog(null, "停车卡收回,再见!");
/* jbtnEnterStop.setEnabled(true);
jbtnLookUpArea.setEnabled(false);
jbtnLookupPosition.setEnabled(false);
jbtnLeftArea.setEnabled(false);
jbtnLeftStop.setEnabled(false);
*/
this.setVisible(false);
this.removeNotify();
}//GEN-LAST:event_jbtnLeftStopActionPerformed
private void jbtnLeftAreaActionPerformed(ActionEvent evt) {//GEN-FIRST:event_jbtnLeftAreaActionPerformed
// TODO 将在此处添加您的处理代码:
//离开停车区
int confirm = JOptionPane.showConfirmDialog(null, "确定要离开 " + chooseArea + " 号停车区?", "离开停车区", JOptionPane.YES_NO_OPTION);
if (confirm == JOptionPane.YES_OPTION) {
mainFram.m_apare[chooseArea - 1]++;
// mainFram.setInfor(mainFram.getStopStatus());
jbtnLeftArea.setEnabled(false);
jbtnLookUpArea.setEnabled(true);
jbtnLeftStop.setEnabled(true);
} else if (confirm == JOptionPane.NO_OPTION) {
JOptionPane.showMessageDialog(null, "您已放弃了离开该车区!");
jbtnLookUpArea.setEnabled(true);
}
}//GEN-LAST:event_jbtnLeftAreaActionPerformed
private void jbtnLookupPositionActionPerformed(ActionEvent evt) {//GEN-FIRST:event_jbtnLookupPositionActionPerformed
// TODO 将在此处添加您的处理代码:
//进入停车区,寻找停车位
int confirm = JOptionPane.showConfirmDialog(null, "您已经选择了" + chooseArea + " 号停车区, " + "确定要进入该停车区?", "进行停车区寻找车位", JOptionPane.YES_NO_OPTION);
if (confirm == JOptionPane.YES_OPTION) {
mainFram.m_apare[chooseArea - 1]--;
// mainFram.setInfor(mainFram.getStopStatus());
jbtnLookUpArea.setEnabled(false);
jbtnLookupPosition.setEnabled(false);
jbtnLeftArea.setEnabled(true);
jbtnLeftStop.setEnabled(false);
} else if (confirm == JOptionPane.NO_OPTION) {
JOptionPane.showMessageDialog(null, "您已放弃了进入该车区!");
jbtnLookUpArea.setEnabled(true);
jbtnLookupPosition.setEnabled(false);
}
}//GEN-LAST:event_jbtnLookupPositionActionPerformed
private void jbtnLookUpAreaActionPerformed(ActionEvent evt) {//GEN-FIRST:event_jbtnLookUpAreaActionPerformed
// TODO 将在此处添加您的处理代码:
//进入停车场,寻找停车区
int[] freeArea = getFreeArea();
Object[] freeAreas = new Object[freeArea.length];
for (int i = 0; i < freeArea.length; i++) {
freeAreas[i] = freeArea[i];
}
Integer choose = (Integer)JOptionPane.showInputDialog(null, "当前停车场状况: \\n" + mainFram.getStopStatus() + "\\n请选择一个空闲车区:", "当前可先空闲车区: ", JOptionPane.PLAIN_MESSAGE, icon, freeAreas, (Integer)freeAreas[0]);
if (choose != null) {
JOptionPane.showMessageDialog(null, "您选择了进入" + choose.intValue() + "车区");
chooseArea = choose.intValue();
jbtnLookUpArea.setEnabled(false);
jbtnLookupPosition.setEnabled(true);
} else {
JOptionPane.showMessageDialog(null, "您没有选择车区!");
}
}//GEN-LAST:event_jbtnLookUpAreaActionPerformed
private void jbtnEnterStopActionPerformed(ActionEvent evt) {//GEN-FIRST:event_jbtnEnterStopActionPerformed
// TODO 将在此处添加您的处理代码:
//领卡,进入停车场
boolean isFull = true;
for (int i = 0; i < mainFram.m_areaCount; i++) {
if (mainFram.m_apare[i] > 0) {
isFull = false;
}
}
if (isFull) {
JOptionPane.showMessageDialog(null, "当前车场无空闲车区,请稍后再试!");
} else {
jbtnEnterStop.setEnabled(false);
jbtnLookUpArea.setEnabled(true);
jbtnLookupPosition.setEnabled(false);
jbtnLeftArea.setEnabled(false);
jbtnLeftStop.setEnabled(false);
JOptionPane.showMessageDialog(null, "成功领取停车卡,请进去车场寻找停车区位!");
}
}//GEN-LAST:event_jbtnEnterStopActionPerformed
private void formWindowClosing(WindowEvent evt) {// GEN-FIRST:event_formWindowClosing
// TODO 将在此处添加您的处理代码:
int confirm = JOptionPane.showConfirmDialog(null, "确定退出?", "退出停车区", JOptionPane.YES_NO_OPTION);
if (confirm == JOptionPane.YES_OPTION) {
if (chooseArea > 0) {
mainFram.m_apare[chooseArea - 1]--;
}
this.setVisible(false);
this.removeNotify();
} else {
this.setVisible(true);
}
}// GEN-LAST:event_formWindowClosing
public int[] getFreeArea() {
int count = 0;
for (int i = 0; i < mainFram.m_areaCount; i++) {
if (mainFram.m_apare[i] > 0) {
count++;
}
}
int[] freeArea = new int[count];
for (int i = 0, j = 0; i < mainFram.m_areaCount; i++) {
if (mainFram.m_apare[i] > 0) {
freeArea[j++] = i + 1;
}
}
return freeArea;
}
}
