基于Java GUI的资产管理系统的设计与实现

目 录

目 录 1

  1. 功能描述 2
  2. 小组成员及分工 2
  3. 系统设计 2
  4. 系统实现 6
  5. 存在问题及解决方法/方案 7
  6. 心得体会 17
    致谢 18
    参考文献 19
    评语及成绩 20

1.功能描述
1.资产信息管理
管理所有资产设备的基本信息,包括添加、修改、删除等,可以根据各种条件查询出需要的信息。
2.人员信息管理
管理设备的使用人员信息,包括添加、修改、删除等,可以根据各种条件查询出需要的信息。
3.资产借还管理
1)领用资产:进入领用资产界面前会检测是否有可领用的资产信息,有则弹出领用资产界面。用户领用资产需要选择要领用的资产并填写相关信息,比如领用人、用备注等等信息。
2)归还资产:进入资产归还界面前系统会判断是否有借出的资产信息,有则弹出归还资产界面。用户归还资产需要选择要归还的资产并填写相关信息。
3)归还记录:归还记录界面会显示出所有领用资产的归还记录,以便查询。并且管理员可对归还记录进行删除操作。
4)维修资产:管理员在资产信息管理界面可对资产添加维修记录,在维修资产界面会显示出所有的资产维修记录,以便查询或他用。
5)报废资产:管理员在资产信息管理界面可对资产进行报废操作,在报废资产界面会显示出所有的 资产报废记录,以便查询或他用
4.系统管理
1.人性化:加入友好的提示信息、帮助信息,有清楚的错误提示。
2.操作简单:操作简单易上手。
3.用户界面:界面结构调理清楚,布局简洁。
4.语言和清晰度:使用正常语言而不是用专业术语、完善是觉得清晰度。

2.小组成员及分工
1.资产信息管理:
2.人员信息管理:
3.资产领用:
4.资产归还:
5.资产报废:

3.系统设计
1.系统的功能结构如图1所示:

图1 系统功能结构图

功能介绍:主界面含6个模块,分别是系统管理、资产信息管理、人员管理、资产领用、资产归还、资产报废。

系统管理:
1)类别管理:添加、修改大类、小类数据,其中编号是自动获取的。删除通过选中指定的列表删除,主要通过获取编号对齐进行处理。
2)退出:退出可执行文件。

资产信息管理:
1)增加:添加资产信息,即名称、所属类型(对应的类别)、型号、价格、购买日期、状态、备注。
2)修改:修改已添加的数据,其中编号不可变,通过编号查找已存在的数据对其进行修改。
3)删除:通过输入对应的编号将数据从数据库中删除。
4)查询所有:将添加的数据以表格的形式将数据全部打印出来。
5)按编号查询:输入对应的编号将该编号的数据以表格的形式打印出来。

人员信息管理:
1)人员信息增加:添加资产信息,即姓名、性别、部门、职位、其他、人员编号自动获取。
2)人员信息修改:修改已添加的数据,其中编号不可变,通过编号查找已存在的数据对其进行修改。
3)人员信息删除:通过输入对应的编号将数据从数据库中删除。
4)人员信息查询所有:将添加的数据以表格的形式将数据全部打印出来。
5)人员信息按编号查询:输入对应的编号将该编号的数据以表格的形式打印出来。

资产领用:
1)资产领用管理:
1.增加资产信息:其中资产类型与领用人对应的是资产类型编号和人员编号,在此基础上对数据进行添加操作类型(操作类型为可领用),时间,用途,备注。
2.修改资产信息:修改数据时,通过选中2维表格查询,然后将数据重新设置。
3.删除资产信息:选中列表中的某行数据,然后删除该行记录。
4.领用资产信息:将该行数据的操作类型修改为已领用的操作类型。

2)资产领用信息查询:查询操作数据已领用的数据。

资产归还:
1)资产归还管理:
1增加资产信息:其中资产类型与领用人对应的是资产类型编号和人员编号,在此基础上对数据进行添加操作类型(操作类型为已领用),时间,用途,备注。
2修改资产信息:修改数据时,通过选中2维表格查询,然后将数据重新设置。
3删除资产信息:选中列表中的某行数据,然后删除该行记录。
4归还资产信息:将该行数据的操作类型修改为可领用的操作类型。

2)资产归还信息查询:查询操作类型修改为已领用的数据。

资产报废:
1)资产报废管理:
1增加资产信息:其中资产类型与领用人对应的是资产类型编号和人员编号,在此基础上对数据进行添加操作类型(操作类型为可领用),时间,用途,备注。
2修改资产信息:修改数据时,通过选中2维表格查询,然后将数据重新设置。
3删除资产信息:选中列表中的某行数据,然后删除该行记录。
4归还资产信息:将该行数据的操作类型修改为可领用的操作类型。

3)资产报废信息查询:查询操作类型修改为报废的数据。

2.数据库设计
数据库中应包含4个表,即资产信息表(Assets)、人员信息表(Person)、资产操作流(AssetsTrjn)和资产类别管理表(AssetsType),设计要求如表1~表4所示。
表1 资产信息表(Assets)
名 称 字段名称 数据类型 主 键 非 空
资产编号 AssetsID INT Yes Yes
资产名称 Name varchar(20) No Yes
所属类型 TypeID varchar(10) No Yes
型号 Model varchar(30) No Yes
价格 Price varchar(20) No Yes
购买日期 BuyDate Date No Yes
状态 Status varchar(10) No Yes
备注 Other varchar(50) No No

表2 人员信息表(Person)
名 称 字段名称 数据类型 主 键 非 空
人员编号 PersonID INT Yes Yes
姓名 Name varchar(20) No Yes
性别 Sex varchar(4) No Yes
部门 Dept varchar(20) No Yes
职位 Job varchar(20) No No
其他 Other varchar(50) No No

表3 资产操作流水表
名 称 字段名称 数据类型 主 键 非 空
编号 JourNo INT Yes Yes
操作类型 FromAcc varchar(20) No Yes
资产编号 AssetsID INT No Yes
操作时间 RegDate date No Yes
领用人 PersonID INT No Yes
用途 purpose varchar(50) No Yes
备注 Other varchar(50) No No

表4 资产类别表
名 称 字段名称 数据类型 主 键 非 空
编号 TypeID INT Yes Yes
资产大类 B_Type varchar(20) No Yes
资产小类 S_Type varchar(20) No Yes

4.系统实现
(1)AssetsTrjn类:构建实体类,对必须存储的信息和相关行为建模的类。实体对象用于保存和更新一些现象的有关信息,实体类通常都是永久性的,它们所具有的属性和关系是长期需要的,有时甚至在系统的整个生存期都需要。是用来与数据库访问的桥梁,从而实现对数据库进行增删改查功能。

(2)AssetsTrjnDao类:用数据库语言对数据库进行相关的增删改查问题,然后将数据库的值通过字符串数组得到数据库的值。以及对AssetsTrjn类中的构造方法的数据进行写入到数据库中。

(3)AssetsReceiveView类:生成GUI界面,对界面进行操作,设置界面大小,标题,以及设置相关组建。界面组件分成三部分,上中下,然后使用网格包布布局管理器来设置上中下三部分,分别对应的是北中南三部分。北部是输出2维表的信息即数据库的数据,中间层是用来设置文本框以及下拉列表的,供用户操作选择,下层是按钮用来选择相关的操作。然后通过事件处理函数对各按钮进行事件处理,将文本框的数据传到指定的Dao包中的方法里。然后将数据库的信息打印到上层界面中。

结果图:
1.报废管理:

2.报废查询:

主要代码:

else if (obj == itemInvalid) {//资产报废管理
AssetsInvalid typeMan = new AssetsInvalid();
typeMan.downInit();
typeMan.pack();
typeMan.setVisible(true);
}
public class AssetsInvalid extends JFrame implements ActionListener, ListSelectionListener {

AssetsTrjnDao assetsTrjnDao;
Container contentPane;
//定义所用的面板
JPanel upPanel = new JPanel();
JPanel centerPanel = new JPanel();
JPanel downPanel = new JPanel();

//框架的大小
Dimension faceSize = new Dimension(600, 400);

//定义图形界面元素
//创建一个没有图像的JaLabel实例,标题为空字符串
JLabel jLabel1 = new JLabel();
JLabel jLabel2 = new JLabel();
JLabel jLabel3 = new JLabel();
JLabel jLabel4 = new JLabel();
JLabel jLabel5 = new JLabel();
JLabel jLabel6 = new JLabel();
JLabel jLabel7 = new JLabel();

//构造一个新的空的 TextField与指定的列数。
JTextField jTextField1 = new JTextField(15);
JTextField jTextField2 = new JTextField(15);
JTextField jTextField3 = new JTextField(15);
JTextField jTextField4 = new JTextField(15);
JTextField jTextField5 = new JTextField(15);
JTextField jTextField6 = new JTextField(15);
JTextField jTextField7 = new JTextField(15);

//创建一个没有设置文本或图标的按钮。 
JButton addInfo = new JButton();
JButton modifyInfo = new JButton();
JButton abandonInfo = new JButton();
JButton deleteInfo = new JButton();
JButton clearInfo = new JButton();
JButton saveInfo = new JButton();
JButton eixtInfo = new JButton();

//定义表格
JScrollPane jScrollPane1;
JTable jTable;  //显示和编辑单元格的常规二维表
ListSelectionModel listSelectionModel = null;
String[] colName = {"编号", "操作类型", "资产编号", "操作时间", "领用人", "用途", "备注"};

//网格包布局管理
GridBagLayout girdBag = new GridBagLayout();
GridBagConstraints girdBagCon;

public AssetsInvalid() {
    assetsTrjnDao = new AssetsTrjnDao();
    //设置框架的大小
    this.setSize(faceSize);
    //设置标题
    this.setTitle("资产报废操作表");
    this.setResizable(true);

    //设置运行时窗口的位置
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    this.setLocation((screenSize.width - 400) / 2,
            (screenSize.height - 400) / 2 + 45);
    try {
        Init();
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, "窗口初始化错误,错误原因:" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
    }
}

public void Init() throws Exception {
    contentPane = this.getContentPane();
    contentPane.setLayout(new BorderLayout()); //设置边界布局管理

    //中部面板的布局
    String[][] colValue = assetsTrjnDao.AbandonfindAll(); //获取数据库中的值
    if (colValue == null) {
        colValue = new String[1][7];
    }
    jTable = new JTable(colValue, colName); //构造一个JTable以显示二维数组中的值colValue,列的名称为colName
    jTable.setPreferredScrollableViewportSize(new Dimension(500, 300));
    listSelectionModel = jTable.getSelectionModel();
    listSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    listSelectionModel.addListSelectionListener(this);
    jScrollPane1 = new JScrollPane(jTable); //为2维列表设置滚动面板
    jScrollPane1.setPreferredSize(new Dimension(500, 300));

    upPanel.add(jScrollPane1);
    contentPane.add(upPanel, BorderLayout.NORTH);

    jLabel1.setText("编号");
    jLabel1.setFont(new Font("Dialog", 0, 12));
    centerPanel.add(jLabel1);
    centerPanel.add(jTextField1);

    jLabel2.setText("操作类型");
    jLabel2.setFont(new Font("Dialog", 0, 12));
    centerPanel.add(jLabel2);
    centerPanel.add(jTextField2);

    jLabel3.setText("资产类型");
    jLabel3.setFont(new Font("Dialog", 0, 12));
    centerPanel.add(jLabel3);
    centerPanel.add(jTextField3);

    jLabel4.setText("操作时间");
    jLabel4.setFont(new Font("Dialog", 0, 12));
    centerPanel.add(jLabel4);
    centerPanel.add(jTextField4);

    jLabel5.setText("领用人");
    jLabel5.setFont(new Font("Dialog", 0, 12));
    centerPanel.add(jLabel5);
    centerPanel.add(jTextField5);

    jLabel6.setText("用途");
    jLabel6.setFont(new Font("Dialog", 0, 12));
    centerPanel.add(jLabel6);
    centerPanel.add(jTextField6);

    jLabel7.setText("备注");
    jLabel7.setFont(new Font("Dialog", 0, 12));
    centerPanel.add(jLabel7);
    centerPanel.add(jTextField7);
    contentPane.add(centerPanel, BorderLayout.CENTER);

    jTextField1.setEditable(false);
    jTextField2.setEditable(false);
    jTextField3.setEditable(true);
    jTextField4.setEditable(true);
    jTextField5.setEditable(true);
    jTextField6.setEditable(true);
    jTextField7.setEditable(true);

}

/**
 * 下部面板的布局
 */
public void downInit() {
    addInfo.setText("增加");
    addInfo.setFont(new Font("Dialog", 0, 12));
    downPanel.add(addInfo);
    modifyInfo.setText("修改");
    modifyInfo.setFont(new Font("Dialog", 0, 12));
    downPanel.add(modifyInfo);
    deleteInfo.setText("删除");
    deleteInfo.setFont(new Font("Dialog", 0, 12));
    downPanel.add(deleteInfo);
    abandonInfo.setText("废弃");
    deleteInfo.setFont(new Font("Dialog", 0, 12));
    downPanel.add(abandonInfo);
    clearInfo.setText("清空");
    clearInfo.setFont(new Font("Dialog", 0, 12));
    downPanel.add(clearInfo);
    eixtInfo.setText("退出");
    eixtInfo.setFont(new Font("Dialog", 0, 12));
    downPanel.add(eixtInfo);

    contentPane.add(downPanel, BorderLayout.SOUTH);

    //添加事件侦听
    addInfo.addActionListener(this);
    modifyInfo.addActionListener(this);
    deleteInfo.addActionListener(this);
    abandonInfo.addActionListener(this);
    clearInfo.addActionListener(this);
    eixtInfo.addActionListener(this);

    addInfo.setEnabled(true);
    modifyInfo.setEnabled(false);
    deleteInfo.setEnabled(false);
    abandonInfo.setEnabled(false);
    clearInfo.setEnabled(true);
}

/**
 * 事件处理
 */
public void actionPerformed(ActionEvent e) {
    Object obj = e.getSource();
    if (obj == addInfo) {
        try {
            //增加
            assetsTrjnDao.add(new AssetsTrjn(jTextField2.getText(), Integer.parseInt(jTextField3.getText()), jTextField4.getText(), Integer.parseInt(jTextField5.getText()), jTextField6.getText(), jTextField7.getText()));
            JOptionPane.showMessageDialog(null, "资产信息添加成功!", "资产信息添加", JOptionPane.INFORMATION_MESSAGE);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "数据库访问错误,错误原因:" + ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
        }
        this.dispose();
        AssetsInvalid typeMan = new AssetsInvalid();
        typeMan.downInit();
        typeMan.pack();
        typeMan.setVisible(true);
    } else if (obj == modifyInfo) {
        try {
            //修改
            assetsTrjnDao.modify(new AssetsTrjn(Integer.parseInt(jTextField1.getText()), jTextField2.getText(), Integer.parseInt(jTextField3.getText()), jTextField4.getText(), Integer.parseInt(jTextField5.getText()), jTextField6.getText(), jTextField7.getText()));
            JOptionPane.showMessageDialog(null, "资产类别修改成功!", "资产类别修改", JOptionPane.INFORMATION_MESSAGE);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "数据库访问错误,错误原因:" + ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
        }
        this.dispose();

        AssetsUsing typeMan = new AssetsUsing();
        typeMan.downInit();
        typeMan.pack();
        typeMan.setVisible(true);
    }else if (obj == abandonInfo) {
        try {
            //领用
            assetsTrjnDao.AbandonTrjn(new AssetsTrjn(Integer.parseInt(jTextField1.getText())));
            JOptionPane.showMessageDialog(null, "资产废弃成功!", "资产废弃", JOptionPane.INFORMATION_MESSAGE);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "数据库访问错误,错误原因:" + ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
        }
        this.dispose();
        
        AssetsInvalid typeMan = new AssetsInvalid();
        typeMan.downInit();
        typeMan.pack();
        typeMan.setVisible(true);
        typeMan.downInit();
    }else if (obj == deleteInfo) {
        try {
            //删除
            assetsTrjnDao.delete(Integer.parseInt(jTextField1.getText()));
            JOptionPane.showMessageDialog(null, "资产删除成功!", "资产类别删除", JOptionPane.INFORMATION_MESSAGE);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "数据库访问错误,错误原因:" + ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
        }
        this.dispose();

        AssetsInvalid typeMan = new AssetsInvalid();
        typeMan.downInit();
        typeMan.pack();
        typeMan.setVisible(true);

    }  else if (obj == clearInfo) { //清空
        setNull();
    } else if (obj == eixtInfo) { //退出
        this.dispose();
    }
    jTable.revalidate();    //支持自动延迟布局
}

/**
 * 将文本框清空
 */
void setNull() {
    jTextField1.setText(null);
    jTextField2.setText(null);
    jTextField3.setText(null);
    jTextField1.setText(null);
    jTextField2.setText(null);
    jTextField3.setText(null);
    jTextField1.setText(null);
    jTextField2.setText(null);
    jTextField2.setEditable(true);
    jTextField3.setEditable(true);
    jTextField4.setEditable(true);
    jTextField5.setEditable(true);
    jTextField6.setEditable(true);
    jTextField7.setEditable(true);
    addInfo.setEnabled(true);
    modifyInfo.setEnabled(false);
    deleteInfo.setEnabled(false);
    clearInfo.setEnabled(true);
}

/**
 * 当表格被选中时的操作
 */
public void valueChanged(ListSelectionEvent lse) {
    int selectedRow = jTable.getSelectedRow();  //返回第一个选定行,如果没有选行,则返回-1
    jTextField1.setText((String) jTable.getValueAt(selectedRow, 0)); //getValuAt(int row,int column),返回行,列
    jTextField2.setText((String) jTable.getValueAt(selectedRow, 1));
    jTextField3.setText((String) jTable.getValueAt(selectedRow, 2));
    jTextField4.setText((String) jTable.getValueAt(selectedRow, 3)); //getValuAt(int row,int column),返回行,列
    jTextField5.setText((String) jTable.getValueAt(selectedRow, 4));
    jTextField6.setText((String) jTable.getValueAt(selectedRow, 5));
    jTextField7.setText((String) jTable.getValueAt(selectedRow, 6));
    //设置是否可操作
    jTextField2.setEditable(true);
    jTextField3.setEditable(true);
    jTextField4.setEditable(true);
    jTextField5.setEditable(true);
    jTextField6.setEditable(true);
    jTextField7.setEditable(true);

    addInfo.setEnabled(false);
    modifyInfo.setEnabled(true);
    deleteInfo.setEnabled(true);
    abandonInfo.setEnabled(true);
    clearInfo.setEnabled(true);
}

}
else if (obj == itemSelectInvalid) {//资产报废查询
AssetsSelectInvalid typeMan = new AssetsSelectInvalid();
typeMan.setVisible(true);
}
public class AssetsSelectInvalid extends JFrame implements ActionListener{

AssetsTrjnDao assetsTrjnDao;
Container contentPane;
//定义所用的面板
JPanel upPanel = new JPanel();

//框架的大小
Dimension faceSize = new Dimension(700, 400);

//定义图形界面元素
//创建一个没有图像的JaLabel实例,标题为空字符串
JLabel jLabel1 = new JLabel();
JLabel jLabel2 = new JLabel();
JLabel jLabel3 = new JLabel();
JLabel jLabel4 = new JLabel();
JLabel jLabel5 = new JLabel();
JLabel jLabel6 = new JLabel();
JLabel jLabel7 = new JLabel();
JLabel jLabel8 = new JLabel();

//构造一个新的空的 TextField与指定的列数。
JTextField jTextField1 = new JTextField(15);
JTextField jTextField2 = new JTextField(15);
JTextField jTextField3 = new JTextField(15);
JTextField jTextField4 = new JTextField(15);
JTextField jTextField5 = new JTextField(15);
JTextField jTextField6 = new JTextField(15);
JTextField jTextField7 = new JTextField(15);
JTextField jTextField8 = new JTextField(15);

//定义表格
JScrollPane jScrollPane1;
JTable jTable;  //显示和编辑单元格的常规二维表
ListSelectionModel listSelectionModel = null;
String[] colName = {"编号", "操作类型", "资产编号", "操作时间", "领用人", "用途", "备注"};

//网格包布局管理
GridBagLayout girdBag = new GridBagLayout();
GridBagConstraints girdBagCon;

public AssetsSelectInvalid() {
    assetsTrjnDao = new AssetsTrjnDao();
    //设置框架的大小
    this.setSize(faceSize);
    //设置标题
    this.setTitle("资产报废信息查询");
    this.setResizable(true);

    //设置运行时窗口的位置
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    this.setLocation((screenSize.width - 400) / 2,
            (screenSize.height - 300) / 2 + 45);
    try {
        Init();
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, "窗口初始化错误,错误原因:" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
    }
}

public void Init() throws Exception {
    contentPane = this.getContentPane();
    contentPane.setLayout(new BorderLayout()); //设置边界布局管理

    //中部面板的布局
    String[][] colValue = assetsTrjnDao.findByAbandon(); //获取数据库中的值
    if (colValue == null) {
        colValue = new String[1][7];
    }
    jTable = new JTable(colValue, colName); //构造一个JTable以显示二维数组中的值colValue,列的名称为colName
    jTable.setPreferredScrollableViewportSize(new Dimension(600, 400));
    jScrollPane1 = new JScrollPane(jTable); //为2维列表设置滚动面板
    jScrollPane1.setPreferredSize(new Dimension(600, 400));
    upPanel.add(jScrollPane1);
    contentPane.add(upPanel, BorderLayout.NORTH);
     //设置框架的大小
            this.setSize(faceSize);
            //设置标题
            setTitle("资产报废信息查询");
            this.setResizable(true);

            //设置运行时窗口的位置
            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
            this.setLocation((screenSize.width - 400) / 2,
                    (screenSize.height - 300) / 2 + 45);
            AssetsSearchIDView typeMan = new AssetsSearchIDView();
            typeMan.pack();
            this.dispose();
            typeMan.setVisible(true);
}
/**
 * 事件处理
 */
public void actionPerformed(ActionEvent e) {
    Assetslingyong typeMan = new Assetslingyong();
    typeMan.pack();
    typeMan.setVisible(true);
    jTable.revalidate();
}

}
5.存在问题及解决方法/方案
自动时间问题。解决方法是,通过搜索相关资料,以及询问同学。了解到自动获取时间需要通过定义一个long类型的变量来获取当前时间,然后通过Date类来调用,然后在调用数据库的类中进行引用,定义输出的时间格式,然后通过相关方法将值传入到数据库中。

6.心得体会
通过此资产管理系统的开发,做到了理论联系实际,将课本上学到的知识与具体实践充分结合,进一步明确了开发管理信息系统的方法思想;既加深了对管理系统的认识,又进一步巩固了以前所学的计算机软件开发方面的知识,提高了软件开发的水平,但还有很多是需要加强与提高的。

致谢

参考文献

[1] [美] 凯 S. 霍斯特曼. Java核心技术卷II:高级特性(原书第10版). 机械工业出版社,2017.7
[2]何宗霖.零基础学Java Web开发[M]. 北京:机械工业出版社.2010:7-9
[3]李发陵,刘志强. 软件工程[M]. 清华大学出版社.2013:46-49

最新回复(0)
/jishu9U55VrFoeKp81HlkjOsc76mkEiXC7LxvI0WpJw_3D_3D4858246
8 简首页