基于java swing停车场管理系统GUI
Java 语言实验报告
一.功能演示:基于Java swing+sqlserver停车场管理系统 二·实验内容:实现停车场管理系统,应用于车辆的出、入管理。 三·功能要求:包括车辆进出管理与系统管理等功能模块,可根据车辆停放时间及收费标准自动收费。用户需要事先办理停车卡并充值,停车卡分优惠卡和普通卡两类。 车场管理:车辆入场、车辆出场; 信息查询:某时间段的出入场信息,当前在场信息,车辆历史停车记录及收费信息; 信息维护:用户及停车卡信息维护、充值等; 系统管理:车位信息,计费标准等。 系统包含两类用户:管理员用户和普通用户。 管理员可以使用系统所有功能,普通用户只能查询车辆历史记录、用户信息、停车卡充值,查询计费标准。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
四·实验环境:Windows JDK 1.6 Eclipse SQL Server 备注:
SQL建立数据库 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
五·需求分析与设计:1·需求分析:功能划分与功能描述 本软件具有如下主要功能: 本系统包括两类用户:管理员用户和普通用户。管理员可以使用系统所有功能,普通用户只能查询车辆历史记录、用户信息(只限于个人信息)、查询计费标准、查询当前在场信息、查询出入场信息、当前可用车位信息、口令修改。具体模块划分为如下模块:车场管理模块、信息查询模块、信息维护模块、系统管理模块。 车场管理模块:(应该分为车辆入场和车辆出场两部分) 车辆入场 功能描述:车辆进入停车场时进行登记,记录入场时间并指定车位。只有具有停车卡的车辆才可进场,没有办理停车卡的车辆,应先办理车卡。如果没有相应车位,不能入场;如果卡中余额低于100元,应先充值后再入场。满足条件的车辆,为其指定车位并记录入场时间。车卡分两种类型普通型和优惠型。 车辆出场 功能描述:车辆开出停车场时进行登记,记录出场的时间并进行自动收费(从卡上扣除)。 根据车辆进场时间,出场时间及收费标准自动计算车主应该缴纳的费用。如果停车时间包含不足一小时的时间,超过30分钟按一小时计算,不足三十分钟不计算。如果卡上余额足够则直接扣除;如果卡上余额不足,则应先充值后再扣除相应费用。 信息查询模块: 在这个模块里用户可以查询出入场信息、当前在场信息、用户个人信息、用户历史记录、收费标准以及当前可用车位信息 查询出入场信息 功能描述: 查询当前在场信息户可以在这里查询到两种车位的总量及当前可有的车位数量。 查询用户个人信息 功能描述:登录的管理员可以根据卡号和名字查询用户信息。登陆的普通用户只可以查到自己的信息。 查询用户历史记录 功能描述:用户可以输入卡号查询相应卡号的历史记录,包括车位号、开始停车时间、结束停车时间、停车总时间、相应收取的费用。 收费标准 功能描述:用户可以在这里查询不同种类的车位和不同卡的计费标准。 当前在场信息: 功能描述:用户可以在这里查询到当前在场的车辆信息,包括卡号,车位号,开始停车时间。 当前可用车位信息 功能描述:在这里用户可以查询当前可用的车位的信息,包括车位号、车位类型。 信息维护模块: 在这个模块里用户可以实现用户注册、用户修改及用户充值 用户注册 功能描述:在这里管理员可添加新的用户(普通用户)。 用户修改 管理员在这里可以修改用户。这里会以表的形式显示所有的用户信息,包括用户的停车卡信息维护,充值信息等。管理员点击相应的一行用户信息,这行信息会自动填充到表下的面板里,用户可以在面板里修改用户信息,面板下面有两个按钮,修改、删除,点击相应的按钮可以实现相应的功能。 用户充值 功能描述:用户可以再这里查到自己的余额,并且可以在这里完成充值。 系统管理模块: 在这个模块里可以修改相应的车位信息计费标准、注册管理员、更改用户口令以及查看系统声明信息。 管理员注册: 功能描述:管理员可以在这里添加新的管理员。 更改口令: 功能描述:用户可以在这里更该自己的密码。注:操作员只可以修改自己的密码。 计费标准管理 功能描述:管理员可以在这里不同车位类型、不同车卡类型的收费标准。 关于: 功能描述:用户可以在这里看到系统声明。 2·界面设计登陆界面 主界面 车辆入场界面: 计费标准界面: 当前在场信息界面: 用户历史信息界面: 用户个人信息界面: 出入场信息界面: 当前可用车位信息界面: 用户注册界面: 用户修改界面: 用户充值界面: 管理员注册界面: 更改口令界面: 计费标准管理界面: |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
六·数据库设计:数据库关系图: 完成系统中数据表的结构设计。 例如:用户表
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
七·关键技术介绍:
实现方法:在LoginFrame类中设置两个静态方法,在其他类中只需要引入LoginFrame类,然后调用他的静态方法即可。方法体如下: public staticusers getUser() { return user; } public static voidsetUser(users user) { LoginFrame.user= user; }
可以定义静态方法disMenu().当用户是普通用户时,调用disMenu()方法即可。具体实现如下: public voiddisMenu() { mnuPark.setEnabled(false); mnuSever.setEnabled(false); mnuManZhuCe.setEnabled(false); mnuManCharge.setEnabled(false); } if(user.getUserstype().equals("管理员")) { MdiFrame frame1 = newMdiFrame();//创建一个主窗体 frame1.setVisible(true);//设置其可见 LoginFrame.this.setVisible(false);//设置登录窗体为不显示 } else{//判断用户名是否为null MdiFrame frame = newMdiFrame();//创建一个主窗体 frame.disMenu(); frame.setVisible(true);//设置其可见 LoginFrame.this.setVisible(false);//设置登录窗体为不显示 }
SimpleDateFormat myfmt=newSimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String a4 = myfmt.format(newjava.util.Date()).toString();
try{ java.util.Date now = myfmt.parse(a3);//a3是系统当前时间(即出场时间) java.util.Date date=myfmt.parse(a7);//a7是入场时间 intl=(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;
使用布局管理器;GridBagLayout,以更改密码界面为例: getContentPane().setLayout(newGridBagLayout()); setBounds(234, 129, 285, 223); finalJLabel label_5 = newJLabel(); label_5.setText("登 录 名:"); finalGridBagConstraints gridBagConstraints_11 = newGridBagConstraints(); gridBagConstraints_11.gridy = 2; gridBagConstraints_11.gridx = 0; getContentPane().add(label_5, gridBagConstraints_11); 6、 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
八·系统实现:此处介绍你实际代码开发阶段的情况,如功能流程,一些关键代码 功能流程: 用户登录: public voidactionPerformed(finalActionEvent e) { user= Dal.check(username.getText(),newString(password.getText())); if(user.getName()!=null) { if(user.getUserstype().equals("管理员")) { MdiFrame frame1= newMdiFrame();//创建一个主窗体 //frame1.setEnabled(true);//设置其可见 LoginFrame.this.setVisible(false);//设置登录窗体为不显示 } else{//判断用户名是否为null MdiFrame frame = newMdiFrame();//创建一个主窗体 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 voidactionPerformed(finalActionEvent e) { //第一步:得到单价 = a6 inta1 = Integer.parseInt(cardidjtextfield.getText()); inta2 = Integer.parseInt(stationidtextfield.getText()); SimpleDateFormat myfmt=newSimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String a3 = myfmt.format(newjava.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+"'"); inta6 = 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 inta8,a9; try{ java.util.Date now = myfmt.parse(a3); java.util.Date date=myfmt.parse(a7); intl=(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、更该余额 inta10 = user.getOverage(); inta11 = 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; |
基于java swing停车场管理系统GUI相关推荐
- 基于java Web停车场管理系统源码和论文
开发工具:idea (eclipse) 环境:jdk1.8 mysql5.7 tomcat 随着时代的发展与科技的进步,停车场信息管理的方式也随之改变.譬如,以前的纸质记录数据并管理数据,到现在 ...
- 基于java小区停车场管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
基于java小区停车场管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 基于java小区停车场管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 本源码技术栈 ...
- (java毕业设计)基于java智能停车场管理系统源码
基于java智能停车场管理系统 智能停车费管理系统是基于java编程语言和mysql开发的,bs架构的系统.系统只有管理人员对车位信息,IC卡信息,固定车主停车信息,汽车入场出场管理等功能.本设计功能 ...
- 基于JAVA智能停车场管理系统计算机毕业设计源码+系统+数据库+lw文档+部署
基于JAVA智能停车场管理系统计算机毕业设计源码+系统+数据库+lw文档+部署 基于JAVA智能停车场管理系统计算机毕业设计源码+系统+数据库+lw文档+部署 本源码技术栈: 项目架构:B/S架构 开 ...
- 基于JAVA智能停车场管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
基于JAVA智能停车场管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署 基于JAVA智能停车场管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署 本源码技术栈: 项目 ...
- 基于java的停车场管理系统代码分享
源码编号:F-B01 项目类型:Java web项目 (开源免费) 项目名称:基于JSP+Servlet的智能智能停车场管理系统 源码作者:未知 项目架构:B/S架构 开发语言:Java语言 前端技术 ...
- 基于JAVA的停车场管理系统
源码及论文下载: http://www.byamd.xyz/tag/java/ 第一章 概述 1.1 项目背景 车辆越来越多的今天,停车场只靠人工管理显然难度已经是提高很多,所以应该开发出便于管理记录 ...
- 停车场管理系统 java_课内资源 - 基于JAVA的停车场管理系统
第一章 概述 1.1 项目背景 车辆越来越多的今天,停车场只靠人工管理显然难度已经是提高很多,所以应该开发出便于管理记录的停车场管理系统来帮助对停车场进行管理. 1.2 软件定义 一款帮助停车场管理员 ...
- 基于Java Swing 的万年历
一.项目概要: 基于Java Swing 万年历,可以查看当前日期.下个月.下一年的信息,以及星期信息. 二.源码获取: 有需要可以直接点击下载.点击下载 如有技术咨询可联系QQ:5 ...
最新文章
- 王者争雄服务器维护,王者争雄_王者争雄官网_攻略-第一手游网
- basler相机参数简要中文说明_Basler嵌入式视觉解决方案- 现推出首款适用于NXP(恩智浦)i.MX 8应用处理器系列的产品...
- DHCP服务器是什么?-Vecloud
- 【干货】接地气的产品设计流程
- Git错误non-fast-forward的解决方法
- QT的QDesignerCustomWidgetCollectionInterface类的使用
- .NET (c#)序列化和反序列化
- 信息学奥赛C++语言:调整试题顺序
- iOS 开发线程 gcd
- Jmeter接口测试实战分享,你一定要知道的问题总结!
- .NET对存储过程的调用抽象封装
- uni-app - 改变 <switch> 组件大小(开关太大)
- 手机浏览器点击标签出现蓝色背景解决方法
- 数学不好学python难吗_英语和数学不好的人能学会Python编程吗?
- 新浪微博php实习生电面
- d类数字功放芯片音质怎么样?
- git版本更迭的原理
- 超星计算机应用基础,计算机应用基础_超星_题库2020
- Graph Theory 离散数学第六章
- 基于php的外卖订餐系统开题报告_基于PHP的餐厅微信点餐支付小程序设计开题报告...