软件工程课程设计实验室设备管理系统.doc
软件工程课程设计实验室设备管理系统实验室设备管理系统目录一、 系统的开发背景与目标1、开发背景2、开发目标二、 可行性分析与初步开发计划1、技术可行性2、经济可行性3、法律可行性4、初步开发计划三、 需求分析1、系统功能列表2、数据流图3、数据字典4、数据加工的描述5、性能需求四、 系统设计1、系统结构图2、输出设计3、数据库结构设计4、模块详细设计五、 课程设计总结六、 代码七、 参考文献一、系统的开发背景与开发目标1、系统的开发背景现代社会的校园网络环境,已经大大发生了变化,除了个人笔记本电脑,各种计算机、语音实验室机房也成为了使用频率颇高的场所,我们不能仅仅把它理解为提供上机的环境,而是应该完善此处的各种相关工作,如考勤,收费等,同 时最大限度的降低机房的运营成本,提高使用率。通过建设“实验室设备管理系统”, 运用先进的技术手段和设备,满足以上应用需求。实验室设备管理系统是一个功能比较完善的数据管理软件, 具有数据操作方便高效 迅速等优点,具有很好的可移植性,可在 WINDOWS 系列等操作系统上使用。2、系统的开发目标a 提高人员的工作效率,提高设备的利用率b实验室的设备管理更加便捷有效c减少设备管理的费用,节省开支d提高决策效率e能够准确的控制生产二、可行性分析与初步开发计划1技术可行性1.1对系统的简要描述在原来的手工系统之上创建,利用计算机实现对实验室设备的管理,包括借出、购入、修理仪器、归还仪器等各种功能1.2采用建议系统可能带来的影响在建立所建议系统时,预期会带来的影响包括以下几个方面。(1)对设备的影响由于所建议系统是基于WINDOWS操作系统和互联网的,所以需要配备足够符合以上列出的各种软硬件条件的计算机和通信线路。系统失效后,服务器端需要利用备份的数据库恢复数据信息,要求要有足够的数据备份空间。(2)对软件的影响需要落实是否有符合本报告所列出的正版的软件环境,如果没有则需要购买。(3)对用户单位机构的影响投入使用前还需改进现有的管理模式。(4)对开发的影响管理员只要输入简单的数据就可以完成设备管理。(5)对经费开支的影响除了需要支付开发单位的有关费用外,每年还需要一定的运行维护费用(见经济可行性分析)。1.3技术可行性评价本系统是一个基于局域网、互联网和WINDOWS操作的系统,现有技术已较为成熟,利用现有技术完全可以实现系统开发目标。同时,开发期限较为宽裕,预计可以在规定期限内完成开发任务。2经济可行性2.1支出(1)一次性支出1)系统开发、建立费用3.4万元。其中:本系统开发期为3个月,需要开发人员3人(不一定都是参加满3个月)。根据软件系统的规模估算,开发工作量月为3人2个月即6人月,每人月的人工费按5000员计算,开发费用为3万元。实验室设备等基本信息建立需要2人1个月即2人月,每人月的人工费用按2000员计算,需0.4万元。2)硬件设备费共4.6万元,其中:微机1台约0.6万元;服务器1台及网络等设备费4万元。3)外购开发工具、软件环境费用共4万元。4)其他费用共2万元。一次性支出总费用:14万元。(2)经常性费用主要是系统的运行费用,假设本系统运行期10年,每年的运行费用(包括系统维修、设备维护等)5万元,按年利率5%计算运行费用见 表A-1 系统投资成本总额为:14+38.6082=52.6082 万元2.2效益假设投入本系统,效率可以提高50%,以现有的工作人员10人计算,可减少5人,每人每月平均工资按2500元计算,每年节约人员工资5×12×0.25=15万元/年。按年利率5%计算,效益计算如下表。系统收益总额为:115.8279万元。2.3收益/投资比在10年期内,系统总成本52.6082万元,系统总收益115.8279万元。投资回报率:×(即为52.6082=15 /(1+j)+15/(1+j)2+15/(1+j)10的方程解i×100)纯收益:115.827952.608263.21975万元从经济上考虑,开发本系统完全可行的。2.4投资回收周期投资回收期:3+(52.608240.8489)/12.3406=3.95年2.5敏感性分析生命周期为10年,需要30人左右。3法律可行性3.1法律因素侵犯专利权:有 侵犯版权:有 为了能够解决在使用实验设备出现的一些问题,需要建立一个安全完善的管理平台,能够使设备信息能够快速完整地自动记录在案,并自动更新3.2用户使用可行性适用于实验室设备管理,系统操作简单,便于管理人员使用。4初步开发计划任务计划时间人员开发背景与目标2天可行性分析3天需求分析10天系统设计20天编码15天调试5天三、需求分析1、系统功能列表(Function List)需求标号需求名称需求来源需求描述需求等级1统计查询用户查询设备的信息如购买日期,型号类别低2维修用户维修的情况,维修员,维修日期,维修状况中3购买用户购买的情况和信息,购买日期,价格高4报废用户报废设备的信息,报废日期和型号数量高2、数据流图0层数据流图:1层数据流图:2层数据流图:3、数据字典1.数据流条目登陆信息输入:设备管理员输出:身份验证描述:登陆信息=用户名+密码+登陆权限查询信息输入:合法人员对设备的查询操作输出:设备信息表描述:查询信息=设备名|型号|类别|购置日期维修信息输入:所需维修设备的信息输出:确定维修设备的记录描述:维修信息=修理日期+设备名+编号+修理厂家+修理费用+责任人购买设备输入:购买设备的信息输出:确定购买的新设备的记录描述:新设备=类别+设备名+编号+型号+规格+单价+数量+购置日期+生产厂家+保质期+经办人等报废设备输入:所需报废的设备的信息输出:报废的设备记录 描述:报废设备=类别+设备+型号等审核信息输入:审核输出:上级领导描述:审核信息=报废设备信息/新设备购买信息2加工条目身份验证,统计查询,维修,购买,报废,生产报表,审核。3.文件条目登陆表输入:身份验证输出:身份验证数据结构:用户名+密码+登陆权限设备基本信息表输入:统计查询数据结构:类别+设备名+型号+规格等维修记录表输入:统计查询,维修输出:统计查询数据结构:修理日期+设备名+编号+修理厂家+修理费用+责任人购买设备表输入:统计查询,购买输出:统计查询数据结构:类别+设备名+编号+型号+规格+单价+数量+购置日期+生产厂家+保质期+经办人等报废记录表输入:报废,统计查询,生产报表输出:统计查询,生产报表数据结构:类别+设备名+型号等申请表输入:统计查询,生产报表输出:统计查询,生产报表,购买数据结构:类别+设备名+型号+规格+数量4数据加工处理的描述登陆用例简要说明: 本用例说明用户如何登录到系统。 角色: 管理员、实验员、学生 前置条件: 启动程序,进入登录界面 基本事件流: 1.用户输入基本信息(登录名和密码),点击确定按钮 2.系统查找数据库,看该用户是否在数据库中。若存在则进入主页面。 备选事件流: 1.输入无效的用户名或密码,提示用户名或密码不能为空或者提示用户名或密码不正确。 后置条件: 登录成功 特殊需求: 没有和本用例有关的特殊需求。 扩展点: 没有和本用例有关的扩展点。 购买设备用例 简要说明: 本用例说明管理员如何购买设备并记录进入系统。 角色: 管理员 前置条件: 已经成功登陆到系统。 基本事件流: 1.管理员填写设备各种信息,确定添加。 2.系统把对应信息写入数据库,更新数据库。 备选事件流: 输入了已存在的设备编号,系统提示编号中已存在。 后置条件: 购买成功。 特殊需求: 没有和本用例有关的特殊需求。 扩展点: 没有和本用例有关的扩展点。 报废设备用例 简要说明: 本用例说明管理员如何从入系统中删除报废的设备记录。 角色: 管理员 前置条件: 已经成功登陆到系统。 基本事件流: 1.管理员根据设备编号,找到需要删除的设备记录,确定删除。 2.系统把从数据库中删除对应信息,更新数据库。 备选事件流: 输入了不存在的设备编号,系统提示未找到记录。 后置条件: 删除成功。 特殊需求: 没有和本用例有关的特殊需求。 扩展点: 没有和本用例有关的扩展点。 设备查询用例简要说明: 本用例说明管理员如何查询系统中已记录的实验设备。 角色: 管理员 前置条件: 已经成功登陆到系统。 基本事件流: 1.管理员选择设备查询功能,根据名称、编号、添加时间等方式,填写信息并查询。 2.系统查找数据库,找到符合条件的信息。 3.返回找到的信息。 备选事件流: 输入不存在的设备信息,系统提示未找到该设备信息。 后置条件: 查询成功。 特殊需求: 没有和本用例有关的特殊需求。 扩展点: 没有和本用例有关的扩展点。 5性能需求5.1数据精确度该软件计算设备时以“台”、“件”等为实物计件单位,报表输出中的金额保证到0.01的精度。5.2时间特性查询在3秒内完成,表项输出在8秒内完成5.3适应性考虑到工作人员有时候办公地点的移动性,在设计时应该注意软件的适应性,对于查询功能应尽可能独立方便地将其移植到笔记本、掌上电脑等硬件平台6运行需求6.1用户界面采用Windows的通用图形界,对用户友好,且必须对鼠标和键盘提供支持。6.2硬件接口支持一般x86系列微机和Windows CE,即一般的PC机。四、系统设计1状态图2输出设计输入:a. 输入数据数字信息符合输入精度要求b. 输入可选信息完全使用下拉框完成输出:a. 输出数据符合输出精度要求输出数据格式字体大小统一3数据库结构设计(1) 实体表【1】 用户表(UserInfo)字段类型备注uIdVarchar(15)用户名,主键uNameVarchar(15)姓名uPasswdVarchar(15)密码uPositionVarchar(15)身份,主键【2实验室管理员表(StoreManagerInfo)字段类型备注uIdVarchar(15)用户名,主键lIdVarchar(15)仓库编号,外键约束于实验室表【3实验室表(LabInfo)字段类型备注lIdVarchar(15)实验室编号,主键lNameVarchar(15)实验室名称lPlaceVarchar(15)所在校区【4设备表(EquipInfo)字段类型备注eIdVarchar(15)设备编号,主键eNameVarchar(15)设备名称eStandardVarchar(15)规格型号eProCompanyVarchar(15)生产厂商eTypeVarchar(15)设备类型 (2) 关系表【1】 入库登记表(InInfo)字段类型备注eIdVarchar(15)设备编号,主键,外键约束于设备表sIdVarchar(15)仓库编号,主键,外键约束于仓库表iDateDateTime入库时间,主键iNumint入库数量 (3) 记录表【1】购买申请表(BuyApplyInfo)字段类型备注baIdVarchar(15)序列号,主键eIdVarchar(15)设备编号,外键约束于设备表smNameVarchar(15)申请人,外键约束于仓库管理员表baDateDateTime申请时间baNumInt申请数量【2】维修申请表(MaintainInfo)字段类型备注maIdVarchar(15)序列号,主键pIdVarchar(15)固定资产编号,外键约束于固定资产表lmNameVarchar(15)申请人,外键约束于实验室管理员表maDateDateTime申请时间【3】购买登记表(BuyInfo)字段类型备注bIdVarchar(15)序列号,主键eIdVarchar(15)设备编号,外键约束于设备表bPriceMoney购买单价bDateDateTime购买时间bNumInt购买数量【4】维修记录表(MaintainInfo)字段类型备注mIdVarchar(15)序列号,主键pIdVarchar(15)固定资产编号,外键约束于固定资产表mDateDateTime维修时间【5】报废记录表(DiscardInfo)字段类型备注dIdVarchar(15)序列号,主键pIdVarchar(15)固定资产编号,外键约束于固定资产表dDateDateTime报废时间【6】 购买审核表(BuyCheckInfo)字段类型备注bcIdVarchar(15)序列号,主键baIdVarchar(15)申请序列号,外键约束于购买申请表olNameVarchar(15)审核人,外键约束于上级领导表bcDateDateTime审核时间【7】维修审核表(MaintainCheckInfo)字段类型备注mcIdVarchar(15)序列号,主键maIdVarchar(15)申请序列号,外键约束于维修申请表olNameVarchar(15)审核人,外键约束于上级领导表mcDateDateTime审核时间4模块详细设计设备管理员操作模块设备管理员五、课程设计总结六、代码1、用户登录界面:package com.niit.gui_event;import com.niit.logical.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Login extends JFrame /* * */private static final long serialVersionUID = 1L;/ 控件声明private JLabel lPosition, lName, lPasswd, lTitle;private JComboBox cbPosition, cbName;private JPasswordField pfPasswd;private JButton bConfirm, bCancel;private Container con;private JPanel pCon;private User info;public Login() super("用户登录");/ 控件初始化con = getContentPane();lPosition = new JLabel("身 份:");lName = new JLabel("用户名:");lPasswd = new JLabel("密 码:");lTitle = new JLabel("实验室设备管理系统");lTitle.setForeground(Color.RED);pfPasswd = new JPasswordField();bConfirm = new JButton("确定");bCancel = new JButton("取消");String aPosition = new String "系统管理员", "仓库管理员", "实验室管理员","购买登记员", "上级领导" ;cbPosition = new JComboBox(aPosition);int index = cbPosition.getSelectedIndex();if (index = 0) info = new Administration(); else if (index = 1) info = new StoreManager(); else if (index = 2) info = new LabManager(); else if (index = 3) info = new BuyManager(); else info = new OverLeader();/ 数组初始化pCon = new JPanel5;String cName = info.getIdByPosition(info);cbName = new JComboBox(cName);for (int i = 0; i < pCon.length; i+)pConi = new JPanel();public void launch() / 控件添加con.setLayout(new GridLayout(5, 1);pCon0.add(lPosition);pCon0.add(cbPosition);pCon1.add(lName);pCon1.add(cbName);pCon2.add(lPasswd);pCon2.add(pfPasswd);pCon3.add(bConfirm);pCon3.add(bCancel);pCon4.add(lTitle);add(pCon4);for (int i = 0; i < pCon.length - 1; i+)con.add(pConi);/ 控件设置pfPasswd.setEchoChar('*');pfPasswd.setColumns(10);setBounds(400, 100, 400, 400);setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/ 添加监听器cbPosition.addActionListener(new ListenAction();bConfirm.addActionListener(new ListenAction();bCancel.addActionListener(new ListenAction();pfPasswd.addKeyListener(new ListenKey();/ 定义按钮,下拉框处理器class ListenAction implements ActionListener public void actionPerformed(ActionEvent e) if (e.getSource() = bConfirm) /点击确定按钮info.setuId(cbName.getSelectedItem().toString();info.setuPasswd(new String(pfPasswd.getPassword();info.setuPosition(cbPosition.getSelectedItem().toString();if (info.login(info) new Main(info).launch();setVisible(false);pfPasswd.setText(null); else JOptionPane.showMessageDialog(new Login(), "用户名,密码或身份错误");pfPasswd.setText(null); else if (e.getSource() = cbPosition) /身份下拉框改变时int index = cbPosition.getSelectedIndex();if (index = 0) info = new Administration(); else if (index = 1) info = new StoreManager(); else if (index = 2) info = new LabManager(); else if (index = 3) info = new BuyManager(); else info = new OverLeader();String cName = info.getIdByPosition(info);/刷新用户名列表cbName.removeAllItems();for (int i = 0; i < cName.length; i+)cbName.addItem(cNamei); else System.exit(0);pfPasswd.setText(null);/定义键盘处理器class ListenKey extends KeyAdapter SuppressWarnings("static-access")public void keyPressed(KeyEvent e) if (e.getKeyText(e.getKeyCode().compareToIgnoreCase("ENTER") = 0) bConfirm.doClick();2、主界面:package com.niit.gui_event;import javax.swing.*;import com.niit.logical.*;import java.awt.event.*;public class Main extends JFrame /* * */private static final long serialVersionUID = 1L;private JTabbedPane tp;private JPanel p;private User info;public Main() super("实验室设备管理系统");tp = new JTabbedPane();p = new JPanel8;public Main(User info)this();this.info=info;p0 = new UserManage();p1 = new EquipIn();p2 = new EquipOut();p3 = new Register(info);p4 = new Apply(info);p5 = new Checks(info);p6= new Search();p7=new PasswdModyfy(info);public void launch() tp.addTab("用户管理", p0);tp.addTab("设备入库", p1);tp.addTab("设备出库", p2);tp.addTab("设备登记", p3);tp.addTab("设备申请", p4);tp.addTab("审核申请", p5);tp.addTab("统计查询", p6);tp.addTab("个人信息维护", p7);if(info instanceof Administration)tp.setEnabledAt(1, false);tp.setEnabledAt(2, false);tp.setEnabledAt(3, false);tp.setEnabledAt(4, false);tp.setEnabledAt(5, false);tp.setEnabledAt(6, false);else if(info instanceof StoreManager)tp.setEnabledAt(0, false);tp.setEnabledAt(3, false);tp.setEnabledAt(5, false);tp.setSelectedIndex(1);else if(info instanceof LabManager)tp.setEnabledAt(0, false);tp.setEnabledAt(1, false);tp.setEnabledAt(2, false);tp.setEnabledAt(5, false);tp.setSelectedIndex(3);else if(info instanceof BuyManager)tp.setEnabledAt(0, false);tp.setEnabledAt(1, false);tp.setEnabledAt(2, false);tp.setEnabledAt(4, false);tp.setEnabledAt(5, false);tp.setSelectedIndex(3);else if(info instanceof OverLeader)tp.setEnabledAt(0, false);tp.setEnabledAt(1, false);tp.setEnabledAt(2, false);tp.setEnabledAt(3, false);tp.setEnabledAt(4, false);tp.setSelectedIndex(5);getContentPane().add(tp);setSize(1280, 780);setVisible(true);addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e)System.exit(0););3、购买设备:package com.niit.gui_event;import javax.swing.*;import com.niit.logical.*;import java.awt.*;import java.awt.event.*;import com.niit.data.*;import java.sql.*;public class MaintainApply extends JPanel /* * */private static final long serialVersionUID = 1L;private JLabel lpId;private JTextField tf;private JButton bApply, bAgain, bDelete;private JPanel pUp, pDown;private JTable t;private JScrollPane jsp;private User user;private LabManager lm;private MaintainApplyData maInfo;public MaintainApply(User user) super(new BorderLayout();this.user = user;lpId = new JLabel("固定资产编号");tf = new JTextField();tf.setColumns(15);bApply = new JButton("申请");bAgain = new JButton("重置");bDelete = new JButton("取消申请");pUp = new JPanel();pDown = new JPanel();lm = new LabManager();maInfo = new MaintainApplyData();String head = new String "序列号", "固定资产编号", "申请人", "申请时间" ;Object data = lm.getMaintainApplyAll();t = new JTable(data, head);t.setRowHeight(25);jsp = new JScrollPane(t);pUp.add(lpId);pUp.add(tf);pUp.add(bApply);pUp.add(bAgain);pDown.add(bDelete);add(pUp, BorderLayout.NORTH);add(jsp, BorderLayout.CENTER);add(pDown, BorderLayout.SOUTH);/ 添加监听器bApply.addActionListener(new ListenButton();bAgain.addActionListener(new ListenButton();bDelete.addActionListener(new ListenButton();/ 处理器class ListenButton implements ActionListener public void actionPerformed(ActionEvent e) if (e.getSource() = bApply) / 申请按钮maInfo.setpId(new Integer(tf.getText();maInfo.setuId(user.getuId();maInfo.setDate(new Date(System.currentTimeMillis();lm.add(maInfo);bAgain.doClick(); else if (e.getSource() = bAgain) / 重置按钮tf.setText(null); else if (e.getSource() = bDelete) / 删除按钮int selectedIndex = -1;for (int i = 0; i < t.getRowCount(); i+) if (t.isRowSelected(i) = true)selectedIndex = i;if (selectedIndex = -1) JOptionPane.showMessageDialog(null, "请先选择某一项!");return;