当前位置:文档之家› 高校固定资产管理系统方案

高校固定资产管理系统方案

邮电大学理学院信息与计算科学专业集中实践报告题目:《高校固定资产管理系统》指导老师:永红________________ 专业:数理科学与信息技术_____班级: 1121302、1121301______学号: 2013213055、2013213058_姓名:何锐、周海渝___________成绩:________________________20 16 年 06 月 16 日一、需求分析随着社会的发展,人们的生活节奏不断加快。

为了节约宝贵的时间,高校固定资产管理系统应运而生。

在管理固定资产的过程中,需要修改、更新大量的表单。

如果使用计算机来辅助填写及保存相应的记录,则能大大提高固定资产管理的效率。

因此,需要开发一个固定资产管理系统。

该系统应该支持快速录入关键信息,例如,固定资产的借出、归还等。

这些信息需要被保存在数据库中以便以后查看。

通过对程序需要实现的功能进行分析,完成数据库和程序界面的设计。

通过对高校固定资产管理系统的了解,要求其具备如下功能。

1.登录系统登录系统可以有效地保障系统的安全性,防止非法用户使用系统。

只有输入合法的用户名和密码才能够正常登录,否则不能进行登录。

2.添加信息用户进入系统后,通过对“资产信息管理”菜单中的“类别管理”菜单项,可以进行大类(总的分类)的添加。

同样,在其他几个菜单中也可进行信息添加。

3.删除信息用户进入系统后,通过对“账户管理”菜单中的“删除”菜单项,可以进行的删除。

同样,在其他几个菜单中也可进行信息删除。

4.修改信息考虑到操作人员录入的失误,需要提供信息的修改功能。

通过“职员管理”菜单中的“修改职员”菜单项,可以对职员信息进行修改。

同样,在其他几个菜单中也可进行信息修改。

5.查询信息用户进入系统后,可以通过“按编号查”、“按类别查”、“按使用者查”的不同类别进行信息查询。

6.添加用户进入系统后,可以通过“账户管理”菜单的“添加用户”菜单项添加新的用户,并为其指定密码。

一旦新用户添加成功,以后就可以通过该用户进入系统进行操作。

7.修改密码为了提高系统的安全性,通常建议管理员定期修改密码。

使用“账户管理”菜单的“修改密码”菜单项可以进行密码的修改。

二、总体设计1.通过对系统进行深入的分析得知,本系统需要实现以下目标。

⑴系统管理⑵资产信息管理⑶账户管理⑷职员管理⑸资产还借管理⑹帮助⑺查询按编号查询:按类别查询:按使用者查询:⑻资产信息分类显示⑼显示当前时间2.构建开发环境⑴操作系统:windows7⑵JDK版本:jdk1.8.0_31⑶IDE版本:Eclipse⑷开发语言:Java⑸后台数据库:SQL Server 2008三、控制类设计(部分类代码)在cn.tsc.asset.contrl包中1.ConnectionManager控制类作用:数据库连接代码:package.tsc.asset.contrl;import java.sql.DriverManager;import java.sql.Connection;import java.sql.CallableStatement;import java.sql.ResultSet;import java.sql.SQLException;import javax.swing.JOptionPane;/*** 控制类--数据库连接管理**//*** author pengwenfu**/public final class ConnectionManager {// 驱动类private static final String DRIVER_CLASS = ".microsoft.jdbc.sqlserver.SQLServerDriver";// 数据库地址private static final String DATABASE_URL = "jdbc:microsoft:sqlserver://127.0.0.1:1433;databaseName = Assets";// 数据库登录名private static final String USER_NAME = "sa";// 密码private static final String PASSWORD = "1234";/*** 构造方法禁止实例化*/private ConnectionManager() {}/*** 取得数据库连接** return*/public static Connection getConnection() {try {Class.forName(DRIVER_CLASS);Connection con = DriverManager.getConnection(DATABASE_URL,USER_NAME, PASSWORD);return con;} catch (ClassNotFoundException e) {e.printStackTrace();JOptionPane.showMessageDialog(null, "没有找到连接数据库所需的驱动类!", "错误",JOptionPane.ERROR_MESSAGE);return null;} catch (SQLException e) {e.printStackTrace();JOptionPane.showMessageDialog(null, "数据库连接错误!请核实配置文件是否有误!", "错误",JOptionPane.ERROR_MESSAGE);return null;}}/*** 关闭数据库连接** param conn*/public static void closeConnection(Connection con) {try {if (con != null && !con.isClosed()) {con.close();}} catch (SQLException e) {e.printStackTrace();}}/*** 关闭数据库操作对象** param cst*/public static void closeStatement(CallableStatement cst) { try {if (cst != null) {cst.close();}} catch (SQLException e) {e.printStackTrace();}}/*** 关闭记录集** param rs*/public static void closeResultSet(ResultSet rs) { try {if (rs != null) {rs.close();rs = null;}} catch (SQLException e) {e.printStackTrace();}}}2.DBWorker控制类作用:数据库操作代码:package.tsc.asset.contrl;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.Collection;import.tsc.asset.entity.Asset;import.tsc.asset.entity.Category;import.tsc.asset.entity.Employee;import.tsc.asset.entity.Lent;import.tsc.asset.entity.Operator;import.tsc.asset.entity.Returned;import.tsc.asset.entity.Subcate;/*** 控制类--数据库操作**//*** author pengwenfu**/public class DBWorker {/*** 查找管理员信息** param name* 名称* param pwd* 密码* return*/public static Collection selOperator(String name, String pwd,OperatorSelType inNamePwd) {// 连接数据库Connection con = ConnectionManager.getConnection();CallableStatement cst = null;ResultSet rs = null;// 建一个操作员列表Collection<Operator> opc = new ArrayList<Operator>();try {String proc = "{call proc_selOperator '" + name + "','" + pwd+ "','" + inNamePwd + "'}";// 取得操作员表数据cst = con.prepareCall(proc);rs = cst.executeQuery();while (rs.next()) {Operator op = new Operator();op.setName(rs.getString("Oname"));op.setPwd(rs.getString("Opwd"));opc.add(op);}} catch (SQLException ex) {ex.printStackTrace();} finally {ConnectionManager.closeResultSet(rs);ConnectionManager.closeStatement(cst);ConnectionManager.closeConnection(con);}return opc;}/*** 查找职员信息** param param* 或职务* param selType* 查找类型* return*/public static Collection selEmp(String param, EmployeeSelType selType) {// 连接数据库Connection con = ConnectionManager.getConnection();CallableStatement cst = null;ResultSet rs = null;// 建一个职员列表Collection<Employee> empc = new ArrayList<Employee>();try {String proc = "{call proc_selEmp '" + param + "','" + selType+ "'}";// 取得职员表数据cst = con.prepareCall(proc);rs = cst.executeQuery();while (rs.next()) {Employee emp = new Employee();emp.setId(rs.getInt("Eid"));emp.setName(rs.getString("Ename"));emp.setSex(rs.getString("Esex"));emp.setAge(rs.getInt("Eage"));emp.setPosition(rs.getString("Eposition"));emp.setRemark(rs.getString("Eremark"));empc.add(emp);}} catch (SQLException ex) {ex.printStackTrace();} finally {ConnectionManager.closeResultSet(rs);ConnectionManager.closeStatement(cst);ConnectionManager.closeConnection(con);}return empc;}/*** 查找大类信息** param name* 大类名* param selType* 查找类型* return*/public static Collection selCate(String name, CateSelType selType) { // 连接数据库Connection con = ConnectionManager.getConnection();CallableStatement cst = null;ResultSet rs = null;// 建一个类别列表Collection<Category> cc = new ArrayList<Category>();try {// 取得类别表数据cst = con.prepareCall("{call proc_selCate '" + name + "','"+ selType + "'}");rs = cst.executeQuery();while (rs.next()) {Category c = new Category();c.setId(rs.getInt("Cid"));c.setName(rs.getString("Cname"));cc.add(c);}} catch (SQLException ex) {ex.printStackTrace();} finally {ConnectionManager.closeResultSet(rs);ConnectionManager.closeStatement(cst);ConnectionManager.closeConnection(con);}return cc;}/*** 查找子类信息** param param* 存储过程参数* param selType* 查找类型* return*/public static Collection selSubcate(String param, SubcateSelType selType) {// 连接数据库Connection con = ConnectionManager.getConnection();CallableStatement cst = null;ResultSet rs = null;// 建一个子类列表Collection<Subcate> scc = new ArrayList<Subcate>();try {// 取得子类表数据cst = con.prepareCall("{call proc_selSubcate '" + param + "','"+ selType + "'}");rs = cst.executeQuery();while (rs.next()) {Subcate sc = new Subcate();sc.setId(rs.getInt("Sid"));sc.setName(rs.getString("Sname"));sc.setCateId(rs.getInt("SCid"));scc.add(sc);}} catch (SQLException ex) {ex.printStackTrace();} finally {ConnectionManager.closeResultSet(rs);ConnectionManager.closeStatement(cst);ConnectionManager.closeConnection(con);}return scc;}/*** 查找资产信息** param procName* 存储过程名* param param* 存储过程参数* return*/public static Collection selAsset(String proc, String param) {// 连接数据库Connection con = ConnectionManager.getConnection();CallableStatement cst = null;ResultSet rs = null;// 建一个资产信息列表Collection<Asset> ac = new ArrayList<Asset>();try {// 取得资产信息表数据cst = con.prepareCall("{call " + proc + " '" + param + "'}");rs = cst.executeQuery();while (rs.next()) {Asset a = new Asset();a.setId(rs.getInt(1));a.setName(rs.getString(2));a.setCateName(rs.getString(3));a.setSubcateName(rs.getString(4));a.setModel(rs.getString(5));a.setPrice(rs.getDouble(6));a.setPurDate(rs.getString(7));a.setStatus(rs.getString(8));a.setUseBy(rs.getString(9));a.setRemark(rs.getString(10));ac.add(a);}} catch (SQLException ex) {ex.printStackTrace();} finally {ConnectionManager.closeResultSet(rs);ConnectionManager.closeStatement(cst);ConnectionManager.closeConnection(con);}return ac;}/*** 查找借出资产信息** param param* 存储过程参数* param selType* 查找类型* return*/public static Collection selLent(String param, LentSelType selType) {// 连接数据库Connection con = ConnectionManager.getConnection();CallableStatement cst = null;ResultSet rs = null;// 建一个借出记录列表Collection<Lent> lc = new ArrayList<Lent>();try {// 取得借出记录表数据cst = con.prepareCall("{call proc_selLent '" + param + "','"+ selType + "'}");rs = cst.executeQuery();while (rs.next()) {Lent l = new Lent();l.setId(rs.getInt("Lid"));l.setAssetId(rs.getInt("LAid"));l.setEmpId(rs.getInt("LEid"));l.setOperatorName(rs.getString("LOname"));l.setDate(rs.getString("Ldate"));l.setPurpose(rs.getString("Lpurpose"));l.setRemark(rs.getString("Lremark"));l.setAssetName(rs.getString("Aname"));l.setModel(rs.getString("Amodel"));l.setSubcateName(rs.getString("Sname"));l.setUseBy(rs.getString("Ause_by"));lc.add(l);}} catch (SQLException ex) {ex.printStackTrace();} finally {ConnectionManager.closeResultSet(rs);ConnectionManager.closeStatement(cst);ConnectionManager.closeConnection(con);}return lc;}/*** 查找归还记录** return*/public static Collection selReturned() {// 连接数据库Connection con = ConnectionManager.getConnection();CallableStatement cst = null;ResultSet rs = null;// 建一个归还记录列表Collection<Returned> rc = new ArrayList<Returned>();try {// 取得归还记录表数据cst = con.prepareCall("{call proc_selReturned}");rs = cst.executeQuery();while (rs.next()) {Returned r = new Returned();r.setId(rs.getInt("Rid"));r.setAssetId(rs.getInt("RAid"));r.setAssetName(rs.getString("RAname"));r.setUser(rs.getString("Ruse_by"));r.setLentDate(rs.getString("RLdate"));r.setReturnDate(rs.getString("Rdate"));r.setLentOname(rs.getString("RLOname"));r.setReturnOname(rs.getString("RROname"));r.setRemark(rs.getString("Rremark"));rc.add(r);}} catch (SQLException ex) {ex.printStackTrace();} finally {ConnectionManager.closeResultSet(rs);ConnectionManager.closeStatement(cst);ConnectionManager.closeConnection(con);}return rc;}/*** 修改记录:包括添加、删除、修改** param strProcInvoke* 调用存储过程的字符串* return*/public static int modifyRecord(String strProcInvoke) {Connection con = ConnectionManager.getConnection();try {return con.prepareCall("{call " + strProcInvoke + "}").executeUpdate();} catch (SQLException e) {e.printStackTrace();return 0;} finally {ConnectionManager.closeConnection(con);}}/*** 子类别查找类型** author Tom*/public enum SubcateSelType {BY_NAME, BY_CATE_NAME}/*** 大类别查找类型** author Tom*/public enum CateSelType {BY_NAME, BY_HAVE_SUBCATE, ALL}/*** 管理员名查找类型** author Tom**/public enum OperatorSelType {IN_NAME, IN_NAME_PWD}/*** 借出记录查找类型** author Tom**/public enum LentSelType {BY_OPERATOR_NAME, BY_EMPLOYEE_ID, BY_ASSET_ID, ALL }/*** 职员查找类型** author Tom**/public enum EmployeeSelType {BY_NAME, BY_POSITION, ALL}}四、实体类设计(部分类代码)在cn.tsc.asset.entity包中1.Asset实体类作用:定义资产信息代码:package.tsc.asset.entity;/*** 实体类--资产信息**/public class Asset {private int id;private String name;private String cateName;private String subcateName;private double price;private String model;private String purDate;private String status;private String useBy;private String remark;public String getCateName() {return cateName;}public void setCateName(String cateName) {this.cateName = cateName;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getModel() {return model;}public void setModel(String model) {this.model = model;}public String getName() {return name;}public void setName(String name) { = name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public String getPurDate() {return purDate;}public void setPurDate(String purDate) { this.purDate = purDate;}public String getRemark() {return remark;}public void setRemark(String remark) { this.remark = remark;}public String getStatus() {return status;}public void setStatus(String status) { this.status = status;}public String getSubcateName() {return subcateName;}public void setSubcateName(String subcateName) { this.subcateName = subcateName;}public String getUseBy() {return useBy;}public void setUseBy(String useBy) {eBy = useBy;}}2.Employee实体类作用:定义职员信息代码:package.tsc.asset.entity;/*** 实体类--职员信息**/public class Employee {private int id;private String name;private String sex;private int age;private String position;private String remark;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) { = name;}public String getPosition() {return position;}public void setPosition(String position) {this.position = position;}public String getRemark() {return remark;}public void setRemark(String remark) {this.remark = remark;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}五、用户界面类设计(部分类代码)在erinterface包中1.MM用户界面类作用:生成主界面代码:erinterface;// download by import java.awt.BorderLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import ponentAdapter;import ponentEvent;import java.io.File;import java.util.Collection;import java.util.Timer;import javax.swing.BorderFactory;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode;import.tsc.asset.contrl.DBWorker;import.tsc.asset.contrl.DateTimeView;import.tsc.asset.contrl.ImageGetter;import.tsc.asset.contrl.MenuFactory;import.tsc.asset.contrl.WindowCenter;/*** 用户界面类--主界面**/public class MM extends JFrame {private static final long serialVersionUID = 1L;// 树的要根结点public DefaultMutableTreeNode root = null;// 树面板public CategoryTreeView trp = null;// 表格面板public AssetTableView tap = null;// 表头public String[] head = { "资产编号", "资产名称", "大类名称", "子类名称", "资产型号", "价格","购入日期", "状态", "使用者", "备注" };// 查询面板private QueryView qp = null;// 左上面板:放查询面板private JPanel pnlCTop = null;// 左下面板:放树面板private JPanel pnlCBottom = null;// 右面板:放表格面板private JPanel pnlCRight = null;// 高度偏移量(和菜单栏和状态栏的高度之和有关)private final int HEIGHT_OFFSET = 80;// 显示当前时间private DateTimeView dtv = null;/*** 构造方法** param title* 窗口标题*/public MM(String title) {super(title);try {setDefaultCloseOperation(EXIT_ON_CLOSE);init();} catch (Exception e) {e.printStackTrace();}}/*** 初始化窗口** throws Exception*/private void init() throws Exception {JPanel pnlCenter = new JPanel();JLabel lblStatusBar = new JLabel(" ");dtv = new DateTimeView(lblStatusBar);Timer timer = new Timer();qp = new QueryView(220, 220);tap = new AssetTableView(570, 520);root = new DefaultMutableTreeNode("高校固定资产管理系统--类别");pnlCTop = new JPanel();pnlCBottom = new JPanel();pnlCRight = new JPanel();trp = new CategoryTreeView(220, 300);pnlCenter.setLayout(null);pnlCBottom.setLayout(null);pnlCRight.setLayout(null);pnlCTop.setBounds(0, 0, qp.getWidth(), qp.getHeight());pnlCBottom.setBounds(0, qp.getWidth(), trp.getWidth(),trp.getHeight());pnlCRight.setBounds(qp.getWidth(), 0, tap.getWidth(),tap.getHeight());// 设置trp面板的宽高等于pnlCBottom面板的宽高trp.setBounds(0, 0, pnlCBottom.getWidth(),pnlCBottom.getHeight());// 设置tap面板的宽高等于pnlCRight面板的宽高tap.setBounds(0, 0, pnlCRight.getWidth(),pnlCRight.getHeight());// 添加大类结点trp.addNodes(trp.tree, root, trp.getNodes());// 设置树模型trp.setTreeModel(trp.tree, root);// 设置表模型tap.setTableModel(tap.table, DBWorker.selAsset("proc_selAsset", "all"),head);setIconImage(ImageGetter.getImage("AMSConfiguration" +File.separator+ "img" + File.separator + "mainlogo.gif"));pnlCTop.add(qp);pnlCBottom.add(trp);pnlCRight.add(tap);pnlCenter.add(pnlCTop);pnlCenter.add(pnlCBottom);pnlCenter.add(pnlCRight);setJMenuBar(new MenuFactory(this).buildMenuBar());lblStatusBar.setBorder(BorderFactory.createEtchedBorder());lblStatusBar.setFont(new java.awt.Font("Dialog",java.awt.Font.PLAIN,12));// 开始每隔一秒显示时间一次timer.scheduleAtFixedRate(dtv, 0, 1000);getContentPane().add(pnlCenter, BorderLayout.CENTER);getContentPane().add(lblStatusBar, BorderLayout.SOUTH);setSize(800, 600);// 居中显示窗口WindowCenter.showCenter(this);/* 树事件处理 */trp.tree.addTreeSelectionListener(new TreeSelectionListener() {public void valueChanged(TreeSelectionEvent e) {DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.getPath().getLastPathComponent();if (node.isRoot()) {// 如果用户单击根结点,显示所有资产信息tap.setTableModel(tap.table,DBWorker.selAsset("proc_selAsset", "all"), head);} else if (node.isLeaf() && node.getParent() == node.getRoot()) {// 如果用户单击了根结点下的叶了结点(大类结点),显示指定子类别的资产信息,并且给其添加子结点// 给node添加子结点trp.addNodes(trp.tree, node,trp.getSubNodes(node.toString()));// 显示指定大类别的资产信息tap.setTableModel(tap.table,DBWorker.selAsset("proc_selAssetInCate", node.toString()), head);} else {// 如果用户单击子类结点// 显示指定子类别的资产信息tap.setTableModel(tap.table,DBWorker.selAsset("proc_selAssetInCate",node.toString()), head);}}});/* 窗口宽高改变事件处理 */addComponentListener(new ComponentAdapter() {// 窗口改变大小时public void componentResized(ComponentEvent e) {// pnlCTop的宽高保持不变pnlCTop.setBounds(0, 0, pnlCTop.getWidth(), pnlCTop.getHeight());// pnlCBottom的宽度保持不变,高度由窗口高度而定pnlCBottom.setBounds(0, pnlCTop.getHeight(), pnlCBottom.getWidth(), getHeight() - pnlCTop.getHeight());// pnlCRight的宽高由窗口宽高而定(到底为什么要减10还没弄出来)pnlCRight.setBounds(pnlCTop.getWidth(), 0, getWidth()- pnlCTop.getWidth() - 10,getHeight() - HEIGHT_OFFSET);// trp随着pnlCBottom宽高的改变而改变trp.setBounds(0, 0, pnlCBottom.getWidth(), pnlCBottom.getHeight());// tap随着pnlCRight宽高的改变而改变tap.setBounds(0, 0,pnlCRight.getWidth(), pnlCRight.getHeight());// trp.scp随着trp宽高的改变而改变宽高trp.scp.setBounds(trp.WIDTH_OFFSET / 2, 0, trp.getWidth()- trp.WIDTH_OFFSET, trp.getHeight()- trp.HEIGHT_OFFSET);// 改变trp.tree的状态trp.tree.setBounds(0, 0, 0, 0);// tap.scp随着tap宽高的改变而改变宽高tap.scp.setBounds(0, 0, tap.getWidth(),tap.getHeight());// 改变tap.table的状态tap.table.setBounds(0, 0, 0, 0);/* 待解决方案:当窗口缩小到一定宽高时限制继续缩小*/}});/* 按编号查按钮事件处理 */qp.btnById.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {// 获得用户输入的编号String id = qp.txtId.getText().trim();if (id.equals("")) {// 如果输入为空showTip(2, "请先填写编号!");} else {// 如果输入不为空Collection ac =DBWorker.selAsset("proc_selAssetInAid", id);if (ac.size() > 0) {// 如果查到tap.setTableModel(tap.table, ac, head);} else {// 如果没有查到showTip(2, "没有查到任何信息!");}}}});/* 按类别查按钮事件处理 */qp.btnByCate.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {// 获得用户输入的类别名String cate = qp.txtCate.getText().trim();if (cate.equals("")) {showTip(2, "请先输入部分或完整的类别名!");} else {Collection ac =DBWorker.selAsset("proc_selAssetInCate",cate);if (ac.size() > 0) {// 如果查到tap.setTableModel(tap.table, ac, head);} else {// 如果没有查到tap.clearTable(tap.table);showTip(2, "没有查到任何信息!");}}}});/* 按使用者查按钮事件处理 */qp.btnByUser.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {// 获得用户输入的使用者String name = qp.txtUser.getText().trim();if (name.equals("")) {// 如果输入为空showTip(2, "请先填写使用者!");} else {// 如果输入不为空Collection ac =DBWorker.selAsset("proc_selAssetInUser",name);if (ac.size() > 0) {// 如果查到tap.setTableModel(tap.table, ac, head);} else {// 如果没有查到showTip(2, "没有查到任何信息!");}}}});}/*** 弹出提示窗口** param type* 提示类型:0错误,1警告,2提示* param mess* 提示信息*/private void showTip(int type, String mess) {switch (type) {case 0:JOptionPane.showMessageDialog(this, mess, "错误",JOptionPane.ERROR_MESSAGE);break;case 1:JOptionPane.showMessageDialog(this, mess, "警告",JOptionPane.WARNING_MESSAGE);break;case 2:JOptionPane.showMessageDialog(this, mess, "提示",RMATION_MESSAGE);break;default:break;}}}六、界面截图1.登陆界面2.主界面3.资产信息管理大类:子类:4.账户管理5.职员管理6.资产还借管理。

相关主题