1、第三章 系统设计 3.1系统需求分析 鉴于高校设备管理的现状以及设备管理信息化的要求,开展计算机辅助设备管理,并在此基础上为上级部门进行决策分析提供帮助,极大地提高了设备管理的工作水平和信息化水平。 系统分析阶段开展的主要工作包括:收集和分析系统需求、提供系统说明书 等。系统需求分析就是通过系统调查,了解用户实际需求,进行系统分析,提炼 出系统需求。 业务流程是系统设计的关键,要开发一个系统,必须确定系统的功能需求, 这就必须先了解实际的业务流程,从业务流程中分析系统的需求。 设备信息是系统进行管理的主线,它描述了设备的基本情况,主要包括:设 备名称、设备编号、分类号、型
2、号、规格等;编码设计应完全符合国家信息标准。 系统工作流程主要是用户进行设备信息的入库以及维护处理;对设备信息的 查询统计、打印报表,检核设备信息、上传设备信息,以及采集信息等。不同权 限的用户进行不同的工作操作,具有不同的工作流程。 通常信息管理系统按照对信息的操作,将系统划分为:数据采集、数据处理、 数据传输以及系统维护等功能组成部分。所以,通过综合分析,本系统主要需求有: 1.设备基本信息的收集与处理; 2.设备基本信息的存储与维护; 3.能方便、快捷地上报设备信息; 4.能进行查询统计并形成各种有价值的信息; 5.具有一定的报表处理功能; 6.将共享的设备信息对外
3、发布,实现浏览查询; 7.有辅助系统进行系统的管理与维护。 3.2 系统设计 3.2.1系统设计的目标与内容 高校设备管理系统的开发,其目的是要将先进的管理技术运用到高校设备的管理中来。设备管理系统不但能完成高校设备的日常管理工作,还可以及时向各级领导、上级主管部门提供报表、数据信息,为领导的决策提供一定的参考。通过该系统的实施,逐步把高校设备信息统一规化,使之能更好地为教育事业服务。 具体包括: 1.上级主管部门可以对所采集的设备进行汇总、统计、查询等,并形成各种有价值的信息,实现高校设备信息宏观和微观的动态管理; 2.高校能方便、快捷地上报
4、设备信息,以便上级主管部门可及时了解、汇总各高校设备信息的情况。 3.共享的设备信息可通过web对外发布,实现浏览查询。 4.系统应该具有一定伸缩性,能有效地集成其他系统;而且系统后台可采用 不同操作系统和多种数据库系统。 5.系统数据安全,具有良好的权限管理机制。 6.应该具有一定的通用性、灵活性、实用性和可靠性,以满足高校对设备信息管理的要求。 3.2.2系统总体设计 系统的总体设计包括运行网络结构、功能模块设计等。运行网络结构,确定软件运行的软硬件环境;功能模块设计,确定系统的功能模块,将整个系统划分为多个相对独立的模块,确定每个模块的功能。 3.2.2.1系统运行
5、网络结构 由于网站采用的是B/S结构服务体系即客户端——应用服务器——数据库服务器三层体系结构。在这种结构中,Web浏览器作为客户层,提供图形用户界面,负责与用户进行交互。它通过HTTP协议从应用层的HTTP月及务器下载超文本页面,同时下载并执行内嵌在页面中的客户端程序或中间代码(如JAVA字节码)。这些客户端程序能通过内部通信机制向应用服务器中有关服务对象发出请求。服务对象封装了相关的业务逻辑,它们之间可通过内部协议彼此通信,并能访问数据层的数据库对象或其它的应用程序,以协同完成客户请求。 设备管理系统采用的网络运行结构如图2.l所示: 图3.1 网络运行结构 3.2.2.2 系
6、统的功能设计 在充分分析设备管理需求的基础上,结合信息系统所要达到的目标,以设备 日常管理、数据采集与上报需求为重点,确定了系统的总体功能结构。系统主 要由设备信息管理、数据采集与上报、信息发布、系统管理等四个子系统组成。 每个子系统又由多个模块构成,各模块之间相对独立实现不同的处理功能,但相 互之间又能很好地联系起来。下面简单介绍各子系统功能设计。 1.设备信息管理子系统 信息管理子系统主要包括信息录入、信息修改、信息查询、信息统计、打印 报表等模块。 数据录入模块:主要包括设备数据的录入,采取灵活、简捷、快速的输入方 式来减轻用户繁重的输入数据的工作。如对具有相同属性的
7、多条记录可通过成批 录入方式一次录入完成;对一些数据项可进行实时校验。 数据修改模块:对所有录入的数据均可进行修改,其主要特色如下:只有拥 有相应权限的用户才能修改数据,从而保证了重要数据的安全性;为了保持数据 的一致性,对于一些关键参数不能直接修改,系统应自动保持其正确性。 数据查询模块:根据用户权限查询所需数据,主要包括固定查询和自定义查 询两部分。 固定查询:用户通过选择设备信息的某一个字段,并输入相关关键字内容即可查询出结果。大概有:1.名称.2分类号.3型号4.规格5.编号等。 自定义查询:用户可以把以上几个查询的条件结合起来,提供一定灵活性的 组合查询。 此外,
8、可以对查询结果进行范围限制,也可以对查询结果按照某个字段值行 排序。在查询的过程中,系统还可根据用户的要求,在验证用户的身份后,为其 提供部分修改功能。 数据统计模块:信息统计是按各字段值进行统计并自动生成报表;以数据库 中存储的数据为基础,进行设备信息的查询、统计;进行数据的职能分析,生成 直观的柱图、饼图、折线图,为各级设备管理与经营决策提供数据依据。 打印报表模块:主要是打印设备信息以及各种统计报表。该模块具有生成和 打印报表的功能,可打印多种报表,包括:系统基础数据、设备、人员、上报报 表等报表,操作简单、使用方便。 2.数据采集与上报子系统 上报数据按教育部统一规
9、定的上报格式提供的基础数据,并可实现集中式管理。按上级部门的要求形成标准的上报数据,在形成上报数据时,应具有数据查 错功能,并能提供方便、快捷的数据传送功能。 3.信息发布子系统 主要包括信息浏览和信息查询;主要是对共享信息进行网络提交,对外发布, 实现共享。以数据库中存储的数据为基础,进行人员信息、设备信息等方面的信 息发布,以Web页面的形式进行。被授权访问的有关人员可从办公室或任何地方 通过Internet访问,浏览或查询各种相关信息。 4.系统管理子系统 系统管理子系统主要负责系统的管理和维护工作,包括单位管理、用户管理、 日志管理、数据备份与恢复等。 用户管理:管
10、理系统的用户,提供对系统角色和用户的管理。具体完成用户 的管理、用户的权限设置;通过该模块,可以有效屏蔽非授权用户的各种操作; 日志管理:主要完成记录用户对系统的重要操作(如删除、修改等)及其结 果的记录、查询和统计,以确保系统操作的可追述性; 数据备份与恢复:提供数据备份恢复功能,根据设置,备份系统中的数据库。严格定期备份,保证己有数据的安全性,在数据库崩溃和硬件系统瘫痪时不会造成大的损失。为了保证系统的安全性,只有系统管理员才能使用该模块。 系统的功能图如下所示: 设备管理系统 登陆/注销 用户管理 类别管理 设备管理 台账管理 台账报表
11、动态信息 系统维护 JDK+TOMCAT运行平台 数据库 图3.2 系统功能图 系统的用例图如下所示: 登陆系统 动态信息查询 设备信息查询 系统帮助查询 报表查询 退出系统 图3.3 普通用户用例图 查看用户信息 修改用户信息 查询动态信息 登录系统 查询设备信息 修改设备信息 查看报表信息 修改动态信息 退出系统 帮助栏目管理 修改报表信息 图3.4 管理员用例图 系统流程图如下所示: 开始 选
12、定登陆模块 登入普通用户模块 否 是 否 登入管理员模块? 普通用户模块 是 管理员界面 设备查询 动态信息 用户管理 设备报表 台账管理 系统帮助 设备查询 动态信息 设备报表 系统帮助 退出 图3.5 系统流程图 第四章 数据库设计 数据库是信息系统的核心组成部分。数据库系统将数据信息以某种数据模型
13、 组织起来进行存储,通过数据库管理系统能够方便有效地完成数据信息的插入、 删除、修改、查询等操作,并保持数据信息的完整性、一致性和安全性。一个数 据库由若干张表组成,一张表是若干相关数据信息的集合。表的一行就是一条数 据信息记录,而一列就是一个字段(也就是一条数据信息内容的一项),每一个字 段都有相应的数据类型和数据宽度。在本系统中使用的是SQL Server2000数据库系统,在数据库中各表的创建如下所述。 4.1 总体表的设计 系统共创建了4个数据表,依次为: (1)yh表:用户信息,含数据项有用户名、真姓名、密码、部门、角色等。 (2)lb表:类别信息,含数据项
14、有编号、名称。 (3)sb表:设备信息,含数据项有编号、名称、购置日期、型号、购置价格、备注等。 (4)dt表:动态信息,含数据项有编号、名称、日期、备注。 4.2 数据库概念结构设计 得到上面的数据项和数据结构后,就可以设计出满足用户需求的各种实体,以及它们之间的关系,为后面的逻辑结构设计打下基础。 根据上面的描述,本系统的实体有:类别信息实体、用户信息实体、设备信息实体、动态信息实体。 用户信息实体的E-R图如图4.1所示 密码 姓名 用户 用户名 角色 图4.1 用户信息实体E-R图 类别信息实体的E-R图
15、如图4.2所示 名称 编号 类别 图 4.2 类别信息实体E-R图 设备信息实体的E-R图如图4.3所示 备注 编号 购置日期 型号 名称 设备信息 图 4.3 设备信息实体E-R图 动态信息实体的E-R图如图4.4所示 动态信息 内容 编号 类别 标题 图 4.4 动态信息实体的E-R图 4.3 数据库的链接 在系统中,用户通过WEB方式来使用系统,完成相关的操作,而系统涉及到的大量数据都是存储在数据库中,系统在使用
16、过程中需要频繁地访问数据库。 数据库连接池是数据访问中的重要技术,在某些情况下对访问数据库的性能 有巨大的提高。它的核心思想是连接复用,通过建立一个数据库连接池以及一套 连接使用、分配、管理策略,使得一个数据库连接可以得到高效、安全的复用, 避免了数据库连接频繁建立、关闭的系统开销。连接池对JDBC中的原始连接进行了封装,从而方便了数据库应用对于连接的使用,提高了开发效率。数据库的连接与关闭,并不是真正意义上的数据库连接与建立,当数据库连接的时候,它是从连接池中取得的一个连接,而关闭的时候,实际上是将连接返回到连接池中, 连接池是与数据库保持常连接的。也正是因为这个封装层的存在,隔离
17、了应用本 身的处理逻辑和具体数据库访问逻辑,使应用本身的复用成为可能。 本系统使用Tomcat应用服务器中自带的DBCP(DataBase Connection pool)来建立数据库连接池。利用DBCP,我们无须再进行复杂的相关代码开发,而且安全性和效率等性能更有保证。其中主要是进行了一些配置工作和编写连接池类(ConnPool class)。分别是,在$CATALINA_HOME/conf/server.xml里设置数据库连接池,在系统应用程序目录下的WEB-INF文件夹中的web.xml里设置被引用的资源,其中要合理地设置相关参数,以便保证连接池的性能,比如最小和最大数据库连接数,r
18、emoveAbandoned参数(用于回收被遗弃的数据库连接到连接池中)等;在ConnPool类中,我们使用了Singleton单例模式来保证返回唯一的连接池管理器实例,避免了每次实例化时重复创建。 链接数据库的代码为: package sbgl.util; import java.sql.*; public class DataBase { public Connection conn; public Statement stmt; public ResultSet rs=null; public String sqlStr=""; public D
19、ataBase() { this.connect(); } public boolean connect(){ try{ //sql 2000数据库 //Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); DriverManager.registerDriver (new com.microsoft.jdbc.sqlserver.SQLServerDriver()); String url="jdbc:microso
20、ft:sqlserver://localhost:1433;DatabaseName=sbgl"; conn=DriverManager.getConnection(url,"sa",""); stmt = conn.createStatement (); }catch(Exception ee){ System.out.println("connect db error:"+ee.getMessage()); return false; } return true; }
21、 public Connection getConn(){ try { DriverManager.registerDriver (new com.microsoft.jdbc.sqlserver.SQLServerDriver()); String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=sbgl"; Connection conn=DriverManager.getConnection(url,"sa",""); //stmt =
22、 conn.createStatement (); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; } //用于执行查询数据库的操作 //返回查询结果集 public ResultSet execQuery(String sql) { //sql2000数据库 String url="jdbc:microsoft:sqlserver
23、//localhost:1433;DatabaseName=sbgl"; ResultSet rs=null; try { //sqlserver数据库 conn=DriverManager.getConnection(url,"sa",""); Statement stmt = conn.createStatement(); rs = stmt.executeQuery(sql); } catch(SQLException ex) { System.err.println("DataBase.execQuery(
24、): " + ex.getMessage()); } return rs; } //sql执行 public void execute(String sql){ //sql2000数据库 String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=sbgl"; try{ conn=DriverManager.getConnection(url,"sa",""); Statement stmt = conn.createStatement(); s
25、tmt.execute(sql); }catch(SQLException e){ e.printStackTrace(); } } public void closeStmt(){ try{ stmt.close(); }catch(SQLException e){ e.printStackTrace(); } } public void closeConn(){ try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); } }
26、 public static void main(String[] args) { DataBase db=new DataBase(); System.out.println(db.getConn()); } } 第五章 系统的实现 5.1 共用模块设计的实现 为了提高代码的重用性,把共用部分做成独立的文件保存,保存在inc目录里。这些文件都是纯HTML代码。 调用方式: <%@ include file="../inc/gs.inc"%> 页面格式 <%@i
27、nclude file="../inc/session.inc"%> 变量文件 5.2 主登陆界面 系统设置了两个不同的权限,登陆时首先对权限进行判断,然后对所属权限范围内的用户进行用户名和密码验证,验证成功才进入相应的功能界面。 主登陆界面图如下: 图5.1 主登陆界面 当输入用户名和密码时,系统对用户角色及密码进行判断和验证,无误时方能进图相应的界面。 登陆的代码为: public boolean getOneyh(int newid ) throws Exception { DataBase db = new
28、DataBase(); db.connect(); stmt =db.conn.createStatement (); try { sqlStr="select * from yh where Id = " + newid ; rs = stmt.executeQuery(sqlStr); if (rs.next()) { yhlist = new Vector(1);
29、 yh yh = new yh(); yh.setId(rs.getLong("id")); yh.setdlm(rs.getString("dlm")); yh.setyhbh(rs.getString("yhbh")); yh.setname(rs.getString("name")); yh.setdh(rs.getString
30、"dh")); yh.setyj(rs.getString("yj")); yh.setmima(rs.getString("mima")); yh.setacl(rs.getString("acl")); yhlist.addElement(yh); } else { rs.close(); return false;
31、 } rs.close(); db.closeConn(); db.closeStmt(); return true; } catch (SQLException e) { return false; } } 5.2 普通用户
32、界面 普通用户经过验证后进入此页面: 图5.2 普通用户界面 普通用户进入页面,系统在右上角显示角色的相关信息。普通用户界面有些功能是受限查询的,如台账管理功能,当普通用户点击台账管理时系统会显示: 图5.3 权限显示 5.3普通用户功能的实现 进入设备查询页面: 图5.4设备查询页面 点击“详细”就看到所选设备的额相关信息,如点击“电脑-详细”,系统显示为: 图5.5 设备详情 在查询页面,用户可按编号、名称等查询设备,如按编号查询,显示为: 图5.6 查询设备信息 查询功能的代码为
33、 public boolean getOnesb(int newid ) throws Exception { DataBase db = new DataBase(); db.connect(); stmt =db.conn.createStatement (); try { sqlStr="select * from sb where Id = " + newid ; rs = stmt.executeQuery(sqlStr); if
34、 (rs.next()) { sblist = new Vector(1); sb sb = new sb(); sb.setId(rs.getLong("id")); sb.setsbbh(rs.getString("sbbh")); sb.setsbmc(rs.getString(
35、"sbmc")); sb.setsblb(rs.getString("sblb")); sb.setsbxh(rs.getString("sbxh")); sb.setsbgg(rs.getString("sbgg")); sb.setscdw(rs.getString("scdw")); sb.setccrq_n(rs.getString("ccrq_n")); sb.setccrq_y(rs.getString("ccrq_y")); sb.setccrq_r(rs
36、getString("ccrq_r")); sb.setsbjg(rs.getString("sbjg")); sb.setsbsl(rs.getString("sbsl")); sb.setsyzh(rs.getString("syzh")); sb.setsybm(rs.getString("sybm")); sb.setgzrq_n(rs.getString("gzrq_n")); sb.setgzrq_y(rs.getString
37、"gzrq_y")); sb.setgzrq_r(rs.getString("gzrq_r")); sb.setzxrq_n(rs.getString("zxrq_n")); sb.setzxrq_y(rs.getString("zxrq_y")); sb.setzxrq_r(rs.getString("zxrq_r"));
38、 sb.setfjmc(rs.getString("fjmc")); sb.setfjjs(rs.getString("fjjs")); sb.setfjje(rs.getString("fjje")); sb.setyzjl(rs.getString("yzjl")); sb
39、setsynx(rs.getString("synx")); sb.setbz(rs.getString("bz")); sblist.addElement(sb); } else { rs.close(); db.closeConn(); db.closeStmt(); return
40、false; } rs.close(); return true; } catch (SQLException e) { return false; } } 进入帮助页面: 图5.7 系统帮助界面 用户进入此界面查看相关的系统描
41、述。 5.4 管理员界面功能的实现 管理员通过身份验证后进入此界面: 图5.8 管理员模块界面 进入用户管理界面: 图5.9 用户管理页面 管理员可以对用户信息进行添加、修改和删除操作,删除功能的代码为: public boolean delete( int aid ) throws Exception { sqlStr = "delete from yh where id = " + aid ; try { DataBase db = n
42、ew DataBase(); db.connect(); stmt =db.conn.createStatement (); stmt.execute(sqlStr); db.closeConn(); db.closeStmt(); return true; } catch (S
43、QLException e) { System.out.println(e); return false; } } 进入类别管理页面: 图5.10 类别管理页面 管理员可以对类别信息进行添加、修改和删除,添加功能的代码为: public boolean insert() throws Exception { sqlStr = "insert into lb(lbbh,lbsm) v
44、alues ('"; sqlStr = sqlStr + dataFormat.toSql(albs.getlbbh()) + "','"; sqlStr = sqlStr + dataFormat.toSql(albs.getlbsm()) + "')"; try{ System.out.print(sqlStr); DataBase db = new DataBase();
45、 db.connect(); stmt =db.conn.createStatement (); stmt.execute(sqlStr); db.closeConn(); db.closeStmt(); return true; }catch (SQLException sqle){ System.out.print(sqle
46、getMessage()); return false; } } 进入台账管理页面: 图5.11 台账管理页面 管理员可以对台账信息进行添加、编辑、删除和查询等操作,点击功能键产生相应的功能页面,如: 图5.12 台账编辑页面 在此页面,管理员可以对设备的相关信息进行编辑。 进入设备查询页面: 图5.13 设备查询页面 管理员在此界面查询设备信息,在相应设备的“详细”功能键中可添加、修改、删除设备信息。修改设备信息功能的代码为: p
47、ublic boolean update() throws Exception { sqlStr = "update sb set "; sqlStr = sqlStr + "sbbh = '" + dataFormat.toSql(asbs.getsbbh()) + "',"; sqlStr = sqlStr + "sbmc = '" + dataFormat.toSql(asbs.getsbmc()) + "',"; sqlStr = sqlStr + "sblb = '" + dataFormat.toSql(asbs.getsblb()) + "',";
48、sqlStr = sqlStr + "sbxh = '" + dataFormat.toSql(asbs.getsbxh()) + "' ,"; sqlStr = sqlStr + "sbgg = '" + dataFormat.toSql(asbs.getsbgg()) + "',"; sqlStr = sqlStr + "scdw = '" + dataFormat.toSql(asbs.getscdw()) + "',"; sqlStr = sqlStr + "ccrq_n = '" + dataFormat.toSql(asbs.getccrq_n()) + "',"
49、 sqlStr = sqlStr + "ccrq_y = '" + dataFormat.toSql(asbs.getccrq_y()) + "',"; sqlStr = sqlStr + "ccrq_r = '" + dataFormat.toSql(asbs.getccrq_r()) + "',"; sqlStr = sqlStr + "sbjg = '" + dataFormat.toSql(asbs.getsbjg()) + "',"; sqlStr = sqlStr + "sbsl = '" + dataFormat.toSql(asbs.getsbsl()
50、) + "',"; sqlStr = sqlStr + "syzh = '" + dataFormat.toSql(asbs.getsyzh()) + "',"; sqlStr = sqlStr + "sybm = '" + dataFormat.toSql(asbs.getsybm()) + "',"; sqlStr = sqlStr + "gzrq_n = '" + dataFormat.toSql(asbs.getgzrq_n()) + "',"; sqlStr = sqlStr + "gzrq_y = '" + dataFormat.toSql(asbs.get






