基于java swing停车场管理系统GUI

Java 语言实验报告

一.功能演示:

基于Java swing+sqlserver停车场管理系统

二·实验内容:

实现停车场管理系统,应用于车辆的出、入管理。

三·功能要求:

包括车辆进出管理与系统管理等功能模块,可根据车辆停放时间及收费标准自动收费。用户需要事先办理停车卡并充值,停车卡分优惠卡和普通卡两类。

车场管理:车辆入场、车辆出场;

信息查询:某时间段的出入场信息,当前在场信息,车辆历史停车记录及收费信息;

信息维护:用户及停车卡信息维护、充值等;

系统管理:车位信息,计费标准等。

系统包含两类用户:管理员用户和普通用户。

管理员可以使用系统所有功能,普通用户只能查询车辆历史记录、用户信息、停车卡充值,查询计费标准。

四·实验环境:

Windows 

JDK 1.6

Eclipse 

SQL Server

备注:

  • 在XP平台开发
  • JDK(Java Development Kit)是Sun Microsystems针对Java开发员的产品。
  • Eclipse进行前台和程序设计,开发图形用户界面和停车收费功能实施

SQL建立数据库

五·需求分析与设计:

1·需求分析:

功能划分与功能描述

本软件具有如下主要功能:

本系统包括两类用户:管理员用户和普通用户。管理员可以使用系统所有功能,普通用户只能查询车辆历史记录、用户信息(只限于个人信息)、查询计费标准、查询当前在场信息、查询出入场信息、当前可用车位信息、口令修改。具体模块划分为如下模块:车场管理模块、信息查询模块、信息维护模块、系统管理模块。

车场管理模块:(应该分为车辆入场和车辆出场两部分)

车辆入场

功能描述:车辆进入停车场时进行登记,记录入场时间并指定车位。只有具有停车卡的车辆才可进场,没有办理停车卡的车辆,应先办理车卡。如果没有相应车位,不能入场;如果卡中余额低于100元,应先充值后再入场。满足条件的车辆,为其指定车位并记录入场时间。车卡分两种类型普通型和优惠型。

车辆出场

功能描述:车辆开出停车场时进行登记,记录出场的时间并进行自动收费(从卡上扣除)。

根据车辆进场时间,出场时间及收费标准自动计算车主应该缴纳的费用。如果停车时间包含不足一小时的时间,超过30分钟按一小时计算,不足三十分钟不计算。如果卡上余额足够则直接扣除;如果卡上余额不足,则应先充值后再扣除相应费用。

信息查询模块:

在这个模块里用户可以查询出入场信息、当前在场信息、用户个人信息、用户历史记录、收费标准以及当前可用车位信息

查询出入场信息

功能描述: 

查询当前在场信息户可以在这里查询到两种车位的总量及当前可有的车位数量。

查询用户个人信息

功能描述:登录的管理员可以根据卡号和名字查询用户信息。登陆的普通用户只可以查到自己的信息。

查询用户历史记录

功能描述:用户可以输入卡号查询相应卡号的历史记录,包括车位号、开始停车时间、结束停车时间、停车总时间、相应收取的费用。

收费标准

功能描述:用户可以在这里查询不同种类的车位和不同卡的计费标准。

当前在场信息:

功能描述:用户可以在这里查询到当前在场的车辆信息,包括卡号,车位号,开始停车时间。

当前可用车位信息

功能描述:在这里用户可以查询当前可用的车位的信息,包括车位号、车位类型。

信息维护模块:

在这个模块里用户可以实现用户注册、用户修改及用户充值

用户注册

功能描述:在这里管理员可添加新的用户(普通用户)。

用户修改

管理员在这里可以修改用户。这里会以表的形式显示所有的用户信息,包括用户的停车卡信息维护,充值信息等。管理员点击相应的一行用户信息,这行信息会自动填充到表下的面板里,用户可以在面板里修改用户信息,面板下面有两个按钮,修改、删除,点击相应的按钮可以实现相应的功能。

用户充值

功能描述:用户可以再这里查到自己的余额,并且可以在这里完成充值。

系统管理模块:

在这个模块里可以修改相应的车位信息计费标准、注册管理员、更改用户口令以及查看系统声明信息。

管理员注册:

功能描述:管理员可以在这里添加新的管理员。

更改口令:

功能描述:用户可以在这里更该自己的密码。注:操作员只可以修改自己的密码。

计费标准管理

功能描述:管理员可以在这里不同车位类型、不同车卡类型的收费标准。

关于:

功能描述:用户可以在这里看到系统声明。

2·界面设计

登陆界面

主界面

车辆入场界面:

计费标准界面:

当前在场信息界面:

用户历史信息界面:

用户个人信息界面:

出入场信息界面:

当前可用车位信息界面:

用户注册界面:

用户修改界面:

用户充值界面:

管理员注册界面:

更改口令界面:

计费标准管理界面:

六·数据库设计:

数据库关系图:

完成系统中数据表的结构设计。

例如:用户表

用户表:users

字段名称

数据类型

可空

默认值

说明

cardid

int

不可

主键,用户的停车卡号

name

Nvarchar(20)

不可

用户姓名

password

Nvarchar(20)

用户密码

cardtype

Nvarchar(20)

停车卡类型

userstype

Nvarchar(20)

用户类型

carid

int

用户车牌号

tel

int

用户电话号码

overage

int

用户余额

车位信息表:sit_infor

字段名称

数据类型

可空

默认值

说明

stationid

int

不可

主键,车位号

stationtype

Nvarchar(20)

不可

车位类型

停车收费卡收费表:charger

字段名称

数据类型

可空

默认值

说明

cardtype

Nvarchar(6)

车卡类型

stationtype

Nvarchar(20)

车位类型(车卡类型与车位类型一起作为主键)

charge

int

价格

停车表:park

字段名称

数据类型

可空

默认值

说明

cardid

int

车卡号(外键)

stationid

int

车位号(外键)

parkid

int

1,每次增加一

停车号,主键

startpark

datetime

停车开始时间

endpark

 datetime

停车结束时间

fee

int

停车的收费

sumpark

int

停车总时间

七·关键技术介绍:

  1. 在其他类中得到当前登录用户对象

实现方法:在LoginFrame类中设置两个静态方法,在其他类中只需要引入LoginFrame类,然后调用他的静态方法即可。方法体如下:

public static users getUser() {

return user;

}

public static void setUser(users user) {

LoginFrame.user = user;

}

  1. 实现用户类型不同,主界面不同的功能。

可以定义静态方法disMenu().当用户是普通用户时,调用disMenu()方法即可。具体实现如下:

public void disMenu() {

mnuPark.setEnabled(false);

mnuSever.setEnabled(false);

mnuManZhuCe.setEnabled(false);

mnuManCharge.setEnabled(false);

}

if(user.getUserstype().equals("管理员")) {

MdiFrame frame1 = new MdiFrame();//创建一个主窗体

frame1.setVisible(true);//设置其可见

LoginFrame.this.setVisible(false);//设置登录窗体为不显示

}

else {//判断用户名是否为null

MdiFrame frame = new MdiFrame();//创建一个主窗体

frame.disMenu();

frame.setVisible(true);//设置其可见

LoginFrame.this.setVisible(false);//设置登录窗体为不显示

}

  1. 怎么得到系统时间

SimpleDateFormat myfmt=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

String a4 = myfmt.format(new java.util.Date()).toString();

  1. 怎么计算时间差值

try {

java.util.Date now = myfmt.parse(a3);//a3是系统当前时间(即出场时间)

java.util.Date date=myfmt.parse(a7);//a7是入场时间

int l=(int) (now.getTime()-date.getTime());//计算毫秒差值

day=l/(24*60*60*1000);//获取天数

hour=(l/(60*60*1000)-day*24);//获得小时

min=((l/(60*1000))-day*24*60-hour*60);//获得分钟

}

catch (Exception e1)

{

JOptionPane.showMessageDialog(null,"消费计算错误");

}

if(min < 30)//如果分钟小于30分钟

a8 = day*24+hour;

else //如果分钟大于30分钟

a8 = day*24+hour+1;

  1. 怎么让布局更优美

使用布局管理器; GridBagLayout,以更改密码界面为例:

getContentPane().setLayout(new GridBagLayout());

setBounds(234, 129, 285, 223);

final JLabel label_5 = new JLabel();

label_5.setText("登  录  名:");

final GridBagConstraints gridBagConstraints_11 = new GridBagConstraints();

gridBagConstraints_11.gridy = 2;

gridBagConstraints_11.gridx = 0;

getContentPane().add(label_5, gridBagConstraints_11);

6、

八·系统实现:

此处介绍你实际代码开发阶段的情况,如功能流程,一些关键代码

功能流程:

用户登录:

public void actionPerformed(final ActionEvent e) {

user = Dal.check(username.getText(),new String(password.getText()));

if(user.getName()!=null) {

if(user.getUserstype().equals("管理员")) {

MdiFrame frame1 = new MdiFrame();//创建一个主窗体

//frame1.setEnabled(true);//设置其可见

LoginFrame.this.setVisible(false);//设置登录窗体为不显示

}

else {//判断用户名是否为null

MdiFrame frame = new MdiFrame();//创建一个主窗体

frame.disMenu();

//frame.setEnabled(true);//设置其可见

LoginFrame.this.setVisible(false);//设置登录窗体为不显示

}

}

else {

JOptionPane.showMessageDialog(null,"请输入正确的用户名和密码!");//弹出提示框

username.setText("");//设置用户名输入框为空

password.setText("");//设置密码输入框为空

}

}

主窗口:

package whsdu.se.UI;

import java.awt.BorderLayout;

import java.awt.Dimension;

import java.awt.FlowLayout;

import java.awt.SystemColor;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.ComponentAdapter;

import java.awt.event.ComponentEvent;

import javax.swing.ImageIcon;

import javax.swing.JFrame;

import javax.swing.JInternalFrame;

import javax.swing.JLabel;

import javax.swing.JMenu;

import javax.swing.JMenuBar;

import javax.swing.JMenuItem;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.border.LineBorder;

import whsdu.se.Common.*;

import whsdu.se.UI.*;

import whsdu.se.DAO.*;

public class MdiFrame extends JFrame implements ActionListener {

//关键!MDIDesktopPane(该类实际继承了 JDesktopPane) 用来容纳子窗体

//即使子窗体最大化也仅仅限制在该容器的范围之内

private MDIDesktopPane desktop = new MDIDesktopPane();

//菜单条

private JMenuBar menuBar = new JMenuBar();

//菜单

private JMenu mnuPark = new JMenu("车场管理");

private JMenu mnuQuery = new JMenu("信息查询");

private JMenu mnuSever = new JMenu("信息维护");

private JMenu mnuManSes = new JMenu("系统管理");

//菜单项

private JMenuItem munParkIn = new JMenuItem("车辆入场");

private JMenuItem mnuParkOut = new JMenuItem("车辆出场");

private JMenuItem munCharge = new JMenuItem("计费标准");

private JMenuItem mnuNowInfo = new JMenuItem("当前在场信息");

private JMenuItem mnuHistory = new JMenuItem("用户历史信息");

private JMenuItem mnuComUsersInfo = new JMenuItem("用户个人信息");

private JMenuItem mnuInOut = new JMenuItem("出入场信息");

private JMenuItem mnuComZhuCe = new JMenuItem("用户注册");

private JMenuItem mnuComIdentity = new JMenuItem("用户修改");

private JMenuItem mnuManZhuCe = new JMenuItem("管理员注册");

private JMenuItem mnuManIdentity = new JMenuItem("口令修改");

private JMenuItem mnuManCharge = new JMenuItem("计费标准管理");

private JMenuItem mnumancharge = new JMenuItem("用户充值");

private JMenuItem mnunowstation = new JMenuItem("当前可用车位信息");

private JMenuItem mnuabout = new JMenuItem("关于");

private JMenuItem mnuduichu = new JMenuItem("退出");

private JScrollPane scrollPane = new JScrollPane();

private users user = LoginFrame.getUser();

//主窗体构造方法

public MdiFrame() {

desktop.setOpaque(false);  //JPanel 透明模式

ImageIcon img = new ImageIcon("E:/java练习/carsituation_man/res/main.jpg");  //创建一个图片路径

JLabel background = new JLabel(img);  //创建个带背景图片的JLabel

background.setIcon(img);

this.getLayeredPane().add(background,new Integer(Integer.MIN_VALUE));

background.setBounds(0, 0, img.getIconWidth(), img.getIconHeight());

desktop.add(background);

setMenu();

setTitle("停车场管理系统");

scrollPane.getViewport().add(desktop);

getContentPane().setLayout(new BorderLayout());

getContentPane().add(scrollPane, BorderLayout.CENTER);

this.setDefaultCloseOperation(EXIT_ON_CLOSE);

this.setBounds(280,119,800, 600);

this.setVisible(true);

}

/**

 * 为窗体添加菜单并注册监听器

 * 只写了部分菜单

 */

private void setMenu(){

//车场管理菜单

mnuPark.add(munParkIn);

munParkIn.addActionListener(this);

mnuPark.add(mnuParkOut);

mnuParkOut.addActionListener(this);

//信息查询菜单

mnuQuery.add(munCharge);

munCharge.addActionListener(this);

mnuQuery.add(mnuNowInfo);

mnuNowInfo.addActionListener(this);

mnuQuery.add(mnuHistory);

mnuHistory.addActionListener(this);

mnuQuery.add(mnuComUsersInfo);

mnuComUsersInfo.addActionListener(this);

mnuQuery.add(mnuInOut);

mnuInOut.addActionListener(this);

mnuQuery.add(mnunowstation);

mnunowstation.addActionListener(this);

//信息维护菜单

mnuSever.add(mnuComZhuCe);

mnuComZhuCe.addActionListener(this);

mnuSever.add(mnuComIdentity);

mnuComIdentity.addActionListener(this);

mnuSever.add(mnumancharge);

mnumancharge.addActionListener(this);

//系统管理菜单

mnuManSes.add(mnuManZhuCe);

mnuManZhuCe.addActionListener(this);

mnuManSes.add(mnuManIdentity);

mnuManIdentity.addActionListener(this);

mnuManSes.add(mnuManCharge);

mnuManCharge.addActionListener(this);

mnuManSes.add(mnuabout);

mnuabout.addActionListener(this);

mnuManSes.add(mnuduichu);

mnuduichu.addActionListener(this);

//添加到菜单栏

menuBar.add(mnuPark);

menuBar.add(mnuQuery);

menuBar.add(mnuSever);

menuBar.add(mnuManSes);

//菜单栏添加到主窗体

setJMenuBar(menuBar);

}

//如果是普通用户,将不允许使用的菜单项禁止使用

public void disMenu() {

//将车场管理、信息维护、系统管理对普通用户都不可用

mnuPark.setEnabled(false);

mnuSever.setEnabled(false);

mnuManZhuCe.setEnabled(false);

mnuManCharge.setEnabled(false);

}

//点击菜单项出现相应的子窗体

public void actionPerformed(ActionEvent ae) {

//如果允许同时打开多个子窗口,可以用该方法获得所有子窗口对象数组

JInternalFrame[] jiFrame = desktop.getAllFrames();  

//如果只允许同时打开一个,可以用该方法移除现有窗口

//desktop.removeAll();  

//获得点击的菜单名称

String mnuName = ae.getActionCommand();

//根据菜单名称决定显示的子窗口,可以按下面的格式为每一个子菜单指定显示的子窗口

if(mnuName.equals("车辆入场")) {

//MdiFrame.addIFrame(new ParkInFrame(),BorderLayout.CENTER);

desktop.add(new ParkInFrame(),BorderLayout.CENTER);

}

else if(mnuName.equals("车辆出场")) {

desktop.add(new ParkOutFrame(),BorderLayout.CENTER);

}

else if(mnuName.equals("计费标准")) {

desktop.add(new ChargeFrame(),BorderLayout.CENTER);

}

else if(mnuName.equals("当前在场信息")) {

desktop.add(new NowInfoFrame(),BorderLayout.CENTER);

}

else if(mnuName.equals("用户个人信息")) {

if(user.getUserstype().equals("管理员"))

desktop.add(new ComUsersInfoFrame(),BorderLayout.CENTER);

else

desktop.add(new ComUsersInfoFrame1(),BorderLayout.CENTER);

}

else if(mnuName.equals("用户历史信息")) {

desktop.add(new HistoryFrame(),BorderLayout.CENTER);

}

else if(mnuName.equals("出入场信息")) {

desktop.add(new InOutFrame(),BorderLayout.CENTER);

}

//

else if(mnuName.equals("用户注册")) {

desktop.add(new ComZhuCeFrame(),BorderLayout.CENTER);

}

else if(mnuName.equals("用户修改")) {

desktop.add(new ComIdentityFrame(),BorderLayout.CENTER);

}

else if(mnuName.equals("用户充值")) {

desktop.add(new chongzhiFrame(),BorderLayout.CENTER);

}

else if(mnuName.equals("管理员注册")) {

desktop.add(new ManZhuCeFrame(),BorderLayout.CENTER);

}

else if(mnuName.equals("口令修改")) {

desktop.add(new GengGaiMiMa(),BorderLayout.CENTER);

}

else if(mnuName.equals("当前可用车位信息")) {

desktop.add(new nowstationFrame(),BorderLayout.CENTER);

}

else if(mnuName.equals("关于")) {

desktop.add(new aboutFrame(),BorderLayout.CENTER);

}

else if(mnuName.equals("退出")) {

System.exit(0);

}

else

desktop.add(new ManChargeFrame(),BorderLayout.CENTER);

}

}

刷卡消费:

public void actionPerformed(final ActionEvent e) {

//第一步:得到单价 = a6

int  a1 = Integer.parseInt(cardidjtextfield.getText());

int a2 = Integer.parseInt(stationidtextfield.getText());

SimpleDateFormat myfmt=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

String a3 = myfmt.format(new java.util.Date()).toString();

user = Dal.searchcominfo("select * from users where cardid =" + a1);

String a4 = user.getCardtype();

sit = Dal.chewei("select * from  sit_infor   where stationid ="+ a2 ) ;

String a5 = sit.getStationtype();

charger = Dal.searchcharge("select * from charger where cardtype = '"+a4 +"'and stationtype = '"+a5+"'");

int a6 = charger.getCharge();

//第二步:得到startpark

park = Dal.parkout("select startpark from park where cardid = "+a1 +"and stationid ="+ a2 +"and endpark is null");

String a7 = park.getStartpark();

//计算sumpark = a8

int a8,a9;

try {

java.util.Date now = myfmt.parse(a3);

java.util.Date date=myfmt.parse(a7);

int l=(int) (now.getTime()-date.getTime());

day=l/(24*60*60*1000);

hour=(l/(60*60*1000)-day*24);

min=((l/(60*1000))-day*24*60-hour*60);

}

catch (Exception e1)

{

JOptionPane.showMessageDialog(null,"消费计算错误");

}

if(min < 30)

a8 = day*24+hour;

else

a8 = day*24+hour+1;

//计算费用fee = a9

a9 = a8*a6;

//更新出场信息 endpark(a3)  fee(a9)  sumpark(a8)

Dal.Updatepark(a3,a9,a8,a1,a7);

//更新用户信息的余额1\先得到余额2、更该余额

int a10 = user.getOverage();

int a11 = a10 - a9;

if(a11 <0)

JOptionPane.showMessageDialog(null,"余额不足,请先充值!");

else{

Dal.Updateoverage(a1,a11);

sumparkjtextfield.setText(String.valueOf(a8));

feejtextfield.setText(String.valueOf(a9));

JOptionPane.showMessageDialog(null,"消费成功,欢迎你下次再来");

}

}

九·系统测试:

测试用例、结果,存在的问题,修改后的情况等

问题1:从数据库中查询到的多个对象信息。

解决方法:

如果是查询到一个对象,可以让函数返回相应的对象即可。如果是查询到多个对象,可以使用arraylist(),将多个对象放在里面,返回arraylist即可。

问题2:刷卡消费时,有不足半个小时的部分,该怎么办?

解决方法:

将总时间表示成多少天多少小时多少分钟,如果分钟>30,总的停车时间=天数*24+小时数+1,否则,总的停车时间=天数*24+小时数。

问题3:入场时怎么判断一个车位是否被占了

解决方法:

可以在查询中添加当前可用车位信息查询,用户在入场时可以根据当前可用车位信息,选择相应的车位入场。

问题3:删除不了用户

解决方法:涉及到数据库的级联操作。所以可以更改约束:

alter table park

add constraint cardid_delete foreign key(cardid) references users(cardid) on delete cascade;

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
java写的停车场管理系统,只要运用swing 初始化停车场(确定停车区个数n,每个停车区的停车位,且初始时,停车场为空),说明:使用一个共享数组(临界资源)存储每个停车区中空闲停车位的个数,每一个停车区使用一个共享缓冲区可容纳一辆车,停车场公共通道允许通过两辆车通过。 停车场入口检查是否有空闲停位,如果有发放相关停车区的停车卡,允许停车。如果不存在空闲车位,等待到有空闲车位止。注,入口处应尽量发放不同停车区的停车卡,以获得更高的效率。停车场过 道允许两辆车同时通过。 停车场出口,回收停车卡,并修改相关停车区空闲车位数。注:同一时刻只能有一个车出停车场。 每一个停车区,有一个待车位,供进入停车区车辆进入停车区。停车区只能有一辆车进或出。 每辆车每进入下一环节皆应停留一定时间。每一个用户建立一个窗口,于窗口中显示当前将态。将状态转换可由人工确定亦可自动完成,但进入下状态时需要停留学生一定的时间,以保证多个用户“并行”工作。 本框架由四个类组成,这四个类分别是:InitFrame、WotkFram、carJFrame及carThread,由InitFrame启动。类InitFrame提供停车场初始化功能,完成初始任务后启动类WotkFram界面,执行停车场模拟程序,点击命令按扭“进入停车场”,建立一个线程(线程类名为carThread),线程建立一个carJFrame窗口(车辆进入、离开停车场操作程序)模拟车辆进入或离开停车场

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一棵猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值