1、上海海洋大学信息学院软件工程作业报告设计题目:停车场管理系统学院:信息学院专 业:空间信息与数字技术班 级:1、2班学生姓名:代 雪1353247(组长) 魏梓桐1353204、刘亚松1353147 刘 花1353209、吴 仪1353113 程梦雪1353115 1.引言21世纪以来,当代化产业高速发展,汽车作为寻常交通工具已经普及社会每一种角落,给人们寻常生活带来了极大便利。但是随着汽车拥有量急剧增长,车辆停放问题随之而来,如果没有合理停放规则和秩序,势必引起许多不必要麻烦,反而给生活带来不便。停车场作为交通设施构成某些,随着交通运送繁忙和不断发展,人们对其管理规定也不断提高,都但愿管理可
2、以达到以便、快捷以及安全效果。然后当前许多停车场还处在一种纯人工管理模式,在车辆管理上效率低下,并且十分容易出错。因而需要一种适当管理系统来解决这些问题,达到高效,简易效果,给广大人民出行带来以便。本论文旨在设计一种简朴、高效且实用停车场管理系统,但愿能解决当前管理上存在某些问题。系统设计过程通过了需求分析阶段、概念设计阶段、逻辑构造设计阶段、数据库物理设计阶段、数据库实行和维护以及系统调试与测试,最后完毕了一种比较完善收费停车场管理系统。2.需求分析需求分析是设计数据库起点,需求分析成果与否精确地反映了顾客实际规定,将直接影响到背面各个阶段设计,并影响到设计成果与否合理和实用。当前停车场管理
3、方式比较落后,已经不能适应当代社会实际需求,本系统开发能给管理上带来新鲜活力,提高管理效率,具备较高实用性和开发价值。通过调查理解分析停车管理现状,弄清顾客对开发数据库应用系统确切规定,以及停车场管理流程,系统详细功能和数据库中数据信息。2.1解决对象系统解决对象涉及车辆信息、固定车位信息、自由车位信息、停车车辆信息以及收费记录等五个方面。即固定车位信息:车位编号、车位位置、车牌号码、车主姓名、车辆品牌、车辆颜色、车辆照片、联系地址、联系方式、车位余额;自由车位信息:车位编号、车位位置;车辆信息:车牌号码、车辆品牌、车辆颜色;停车信息:车位编号、车牌号码、进入时间、离开时间、时间段、车位类型、
4、在位状况、收费费率;收费记录:车位编号、车牌号码、停车时间、停车费用、发票编号。2.2功能规定整个系统详细涉及三个子系统,分别为:停车解决子系统、车位综合管理子系统以及收费子系统。解决功能涉及:车辆信息查询以及更新;空闲车位信息查询;固定车位信息查询;进出车辆记录更新和收费信息查询与更新等。2.3业务流程图 2.4数据流图2.5数据字典数据项:表2-1数据项阐明数据项编号数据项名数据项含义与其他数据项关系存储构造别名DI-1Cwno车位编号char(10)编号DI-2Carno车牌号码char(10)车牌DI-3Carname车主姓名char(10)姓名DI-4Carcolor车辆颜色char
5、(4)颜色DI-5Carpho车辆照片bit照片DI-6Caradd联系地址char(20)地址DI-7Cartel联系方式char(20)电话DI-8Carat在位状况char(4)DI-9Carin进入时间datetimeDI-10Carout离开时间datetimeDI-11Carmon车位余额float余额DI-12Montime收费费率float费率DI-13Moneypay停车费用float收费DI-14Cwtype车位类型char(4)DI-15Cartime停车时间float时间DI-16Piece发票编号char(20)Dl-17Carsb车辆品牌char(10)车名Dl-1
6、8Cwpace车位位置char(10)位置Dl-19Timetype时间段char(6)2.6逻辑描述表2-3解决逻辑描述解决编号解决功能解决过程PR-1判断顾客查询涉及功能模块固定车位信息模块、自由车位信息模块、停车车辆信息模块、进出车辆记录信息模块、收费记录模块:先拟定查询所涉及功能模块;然后,拟定要查询内容,拟定查询数据流向;最后显示查询成果。PR-2判断顾客修改要涉及模块,同步把相应修改数据传到相应模块之中固定车位信息模块、自由车位信息模块、停车车辆信息模块、进出车辆记录信息模块、收费记录模块:先拟定更新所涉及功能模块;然后,把更新信息传送到相应模块中;最后,进行相应更新操作。3.概念
7、设计3.1目的概念构造设计师是将需求分析得到顾客需求抽象为信息构造即概念模型过程。它是整个数据库设计核心。概念构造设计环节分为两步:第一步是抽象数据并设计局部视图,第二步是集成局部视图,得到全局概念构造。3.2设计过程(1)选取中层数据流为切入点,普通选取实际系统中子系统;(2)设计分E-R图,即各子模块E-R图;(3)生成初步E-R图,通过合并办法,做到各子系统实体、属性、联系统一;(4)生成全局E-R图,通过消除冲突等方面。通过度析系统业务流图与数据流图,得到系统环绕“车辆”与“车位”之间互有关系。3.3阶段成果分E-R图:全局E-R图:4.逻辑设计4.1目的逻辑构造设计任务是把概念构造设
8、计阶段设计好基本E-R图转换为与选用DBMS产品所支持数据模型相符合逻辑构造。逻辑构造设计时普通要分为3步进行:将概念构造转换为普通关系、网状、层次模型;将转换来关系、网状、层次模型向特定DBMS支持下数据模型转换;对数据模型进行优化。4.2任务与成果4.2.1数据组织(1)将E-R模型转换为关系模型转换原则是:一种实体型转换为一种关系模式。实体属性就是关系属性,实体码就是关系码。对于实体间联系则有如下不同状况:一种1:1联系可以转换为一种独立关系模式,也可以与任意一端相应关系模式合并。三个或三个以上实体间一种多元联系可以转换为一种关系模式。与该多元联系相连各实体码以及联系自身属性均转换为关系
9、属性,而关系码为各实体码组合。一种1:n联系可以转换为一种独立关系模式,也可以与n端相应关系模式合并。如果转换为一种独立关系模式,则与该联系相连各实体码以及联系自身属性均转换为关系属性,而关系码为n端实体码。 一种m:n联系转换为一种关系模式。与该联系相连各实体码以及联系自身属性均转换为关系属性,而关系码为各实体码组合。 3个或3个以上实体间一种多元联系可以转换位一种关系模型。与该多元联系相连各实体码以及联系自身属性均转换为关系属性,各实体码构成关系码或关系码一某些。4.2.2功能模块图图9.系统功能模块图5.物理设计5.1目的物理设计就是为一种给定逻辑数据构造模型选用一种最适当应用规定物理构
10、造过程。物理设计普通分为两步:拟定数据库物理构造,在关系数据库中重要指存取办法和存储构造;对物理构造进行评价,评价重点是时间和空间效率。如果评价成果满足原设计规定,则可进入到物理实行阶段,否则,就需要重新设计或修改物理构造,有时甚至要返回逻辑设计阶段修改数据模型。物理设计内容涉及:为关系模型选取存取办法;设计关系、索引等数据库文献物理存储构造。5.2任务5.2.1数据存取方面由于经常需要判断与否有空余车位,因此要经常查询停车信息,因而在Stop表Cwno上建立聚簇索引以提高查询效率。为了以便查询各个车辆收费记录,在Moneynote表Carno上建立聚簇索引以提高查询效率5.2.2功能模块图(
11、1)车位信息查询及更新模块图:图10.车位信息查询及更新模块图(2)停车信息查询及更新模块图:图11.停车信息查询及更新模块图(3)收费费率查询及更新模块图: 图12.收费费率查询及更新模块图6.某些功能代码实现系统界面车辆进场信息查询出场结算/* 用于实现登录界面*/package com.view;import com.model.LoginModel;import com.model.SellModel;import com.mytools.*;import com.sun.awt.AWTUtilities;import java.awt.*;import java.awt.event.
12、ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.event.MouseMotionAdapter;import javax.imageio.ImageIO;import javax.swing.*;import javax.swing.border.MatteBorder;import java.io.*;i
13、mport java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.Map;import java.util.Vector;SuppressWarnings(serial)public class Park extends JFrame implements MouseListener /全局位置变量,用于表达鼠标在窗口上位置static Point origin = new Point();/ 定义组件Image
14、Panel bkim = null;JButton min,close,loginqueding,carIn,carOut,Search,Exit;JComboBox user;JPasswordField password;JPanel contentPane=new JPanel( );String allparas = 1;int count = ParkPojo.getCarCount();String indate = null;static String userId = getRandomString(8);SuppressWarnings(unused)public stati
15、c void main(String args) / TODO Auto-generated method stubPark login1 = new Park();public void setbutton(JButton jb) jb.setContentAreaFilled(false);jb.setBorderPainted(false);jb.setFocusPainted(false);jb.addMouseListener(this);jb.setOpaque(false);/ 窗口操作控制菜单public void windowsmenu() min = new JButton
16、(new ImageIcon(image/Loginmin.png);min.setBounds(346,0,27,21);min.setRolloverIcon(new ImageIcon(image/LoginminC.png);setbutton(min);min.setToolTipText(最小化);close = new JButton(new ImageIcon(image/Loginclose.png);close.setBounds(370,0,29,21);close.setRolloverIcon(new ImageIcon(image/LogincloseC.png);
17、setbutton(close);close.setToolTipText(关闭);/bkim.add(min);/bkim.add(close);/ 构造函数public Park() / 设立窗体样式为当前系统样式try UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName(); catch (Exception e) / TODO:handle exceptionImage loginbk = null; try loginbk = ImageIO.read(new File(image/pc1.jpg); ca
18、tch (IOException e) / TODO:handle exceptione.printStackTrace();/ 窗口背景面板bkim = new ImagePanel(loginbk);bkim.setLayout(null);carIn = new JButton(new ImageIcon(image/carin.png);carIn.setBounds(100,36,180,60);carIn.setRolloverIcon(new ImageIcon(image/carin.png);setbutton(carIn);carIn.setToolTipText(车辆进场
19、);carOut = new JButton(new ImageIcon(image/carout.png);carOut.setBounds(100,100,180,60);carOut.setRolloverIcon(new ImageIcon(image/carout.png);setbutton(carOut);carOut.setToolTipText(出场结算);Search = new JButton(new ImageIcon(image/infoquery.png);Search.setBounds(100,160,180,60);Search.setRolloverIcon
20、(new ImageIcon(image/infoquery.png);setbutton(Search);Search.setToolTipText(信息查询);Exit = new JButton(new ImageIcon(image/exit.png);Exit.setBounds(100,220,180,60);Exit.setRolloverIcon(new ImageIcon(image/exit.png);setbutton(Exit);Exit.setToolTipText(退出);bkim.add(carIn);bkim.add(carOut);bkim.add(Searc
21、h);bkim.add(Exit); windowsmenu();this.setUndecorated(true);WindowMove();setOpacity();this.add(bkim);this.setSize(400,290);this.setVisible(true);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/ 窗体移动函数public void WindowMove() /设立没有标题窗口可以拖动this.addMouseListener(new
22、 MouseAdapter() public void mousePressed(MouseEvent e) /按下(mousePressed 不是点击,而是鼠标被按下没有抬起) origin.x = e.getX(); /当鼠标按下时候获得窗口当前位置 origin.y = e.getY(); );this.addMouseMotionListener(new MouseMotionAdapter() public void mouseDragged(MouseEvent e) Point p =getLocation(); /当鼠标拖动时获取窗口当前位置 /设立窗口位置 /窗口当前位置 +
23、 鼠标当前在窗口位置 - 鼠标按下时候在窗口位置 setLocation(p.x + e.getX() - origin.x,p.y + e.getY() - origin.y); );Overridepublic void mouseClicked(MouseEvent e) / TODO Auto-generated method stubif(e.getSource() = min) setState(JFrame.ICONIFIED);if(e.getSource() = close) dispose();if(e.getSource() = loginqueding) String
24、userid = user.getSelectedItem().toString().trim();String upassword = new String(this.password.getPassword();if (userid.equals() JOptionPane.showMessageDialog(this,请输入顾客再登录);return;if (upassword.equals() JOptionPane.showMessageDialog(this,请输入密码再登录);return;if (userid.equals(admin) | upassword.equals(4
25、18218) new UserMainWindows();this.dispose();return;if (!LoginModel.checkid(userid) JOptionPane.showMessageDialog(this,抱歉 +userid+ 没有登录此系统权限);return;if (LoginModel.checkpassword(userid,upassword) new UserMainWindows();else JOptionPane.showMessageDialog(this,密码不对的,请重新输入密码);this.password.setTex
26、t();return;else if(e.getSource() = carIn)if(count0)if(indate = null)count-;ParkPojo.setCarCount(count);Date date=new Date();DateFormat format=new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);String time=format.format(date);indate = time;JOptionPane.showMessageDialog(this,车辆已停入,剩余车位+count+,当前时间:+time);elseJ
27、OptionPane.showMessageDialog(this,您已停入);elseJOptionPane.showMessageDialog(this,已无车位);else if(e.getSource() = carOut)Date date=new Date();DateFormat format=new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);String time=format.format(date);if(indate = null)JOptionPane.showMessageDialog(this,未停入车辆);elsecount+;P
28、arkPojo.setCarCount(count);int thour = Integer.parseInt(dateDiff(indate,time,yyyy-MM-dd HH:mm:ss).get(hour).toString()+1;JOptionPane.showMessageDialog(this,共停放+thour+小时,费用是:+(thour*ParkPojo.getA()+元);indate = null;else if(e.getSource() = Search)if(indate = null)JOptionPane.showMessageDialog(this,未停入
29、车辆);elsenew ParkQuery(indate);else if(e.getSource() = Exit)dispose();Overridepublic void mouseEntered(MouseEvent e) / TODO Auto-generated method stubOverridepublic void mouseExited(MouseEvent e) / TODO Auto-generated method stubOverridepublic void mousePressed(MouseEvent e) / TODO Auto-generated met
30、hod stubOverridepublic void mouseReleased(MouseEvent e) / TODO Auto-generated method stub/ 窗口淡入淡出函数public void setOpacity() / 窗口设立淡入淡出代码段AWTUtilities.setWindowOpacity(Park.this,0f);ActionListener lisener = new ActionListener() float alpha = 0;Overridepublic void actionPerformed(ActionEvent e) / TODO
31、 Auto-generated method stubif (alpha 0.9) AWTUtilities.setWindowOpacity(Park.this,alpha+=0.1);else AWTUtilities.setWindowOpacity(Park.this,1);Timer source = (Timer) e.getSource();source.stop();/ 设立线程控制new Timer(50,lisener).start();/* 计算两个日期相差几天 * author ym * date Nov 12, 2:30:38 PM * param startTime
32、 * param endTime * param format 格式 */private Map dateDiff(String startTime,String endTime,String format) / TODO Auto-generated method stub/ 按照传入格式生成一种simpledateformate对象SimpleDateFormat sf = new SimpleDateFormat(format);long nd = 1000 * 24 * 60 * 60;/ 一天毫秒数long nh = 1000 * 60 * 60;/ 一小时毫秒数long nm =
33、1000 * 60;/ 一分钟毫秒数long ns = 1000;/ 一秒钟毫秒数long diff;Map diffMap = new HashMap();try diff = sf.parse(endTime).getTime() - sf.parse(startTime).getTime();long day = diff / nd;/ 计算差多少天long hour = diff % nd / nh;/ 计算差多少小时long min = diff % nd % nh / nm;/ 计算差多少分钟long sec = diff % nd % nh % nm / ns;/ 计算差多少秒/
34、 输出成果System.out.println(时间相差: + day + 天 + hour + 小时 + min + 分钟+ sec + 秒。);diffMap.put(day,String.valueOf(day);diffMap.put(hour,String.valueOf(hour);/diffMap.put(min,String.valueOf(min);/diffMap.put(sec,String.valueOf(sec); catch (Exception e) / TODO Auto-generated catch blocke.printStackTrace();retu
35、rn diffMap;public static String getRandomString(int length) String str=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ; java.util.Random random = new java.util.Random(); StringBuffer sb = new StringBuffer(); for(int i = 0 ;i length;+i) int number = random.nextInt(62);/0,62) sb.append(str.charAt
36、(number); return sb.toString(); public static String getRandomString2(int length) java.util.Random random = new java.util.Random(); StringBuffer sb = new StringBuffer(); for(int i = 0;i length;+i) int number = random.nextInt(3); long result = 0; switch(number) case 0: result = Math.round(Math.random() * 25 + 65); sb.append(String.valueOf(char)result); break; case 1: result = Math.round(Math.random() * 25 + 97); sb.append(String.valueOf(char)result); break; case 2: sb.append(String.valueOf(new java.util.Random().nextInt(10); break; return sb.toString();