第一个复杂项目!!!文物管理系统(论java与数据库合作的威力)

重要事项:我把源代码和帮助文档注释 图片都放在我上传的资源了,需要的同学自取,完完整整,包你学会

https://download.csdn.net/download/aliceiwill/10669417

1、设计目的

《数据库系统原理》课程设计是软件工程和计算机科学与技术专业集中实践性环节之一,旨在让同学们加深对数据库基础理论和基本知识的理解,掌握设计数据库管理系统的基本方法,锻炼运用知识解决实际问题的动手能力。

 

2文物管理项目设计

3.1 引言

 

必要性:2018年9月巴西国家博物馆失火,南美洲几千年文物付之一炬,俗话说,文物是历史的见证,既然我们无法保证文物永远不丢失销毁,我们就应该采用一定的技术来存放这些珍贵的信息。通过建立网上存储信息,第一可以实现足不出户浏览博物馆,第二可以用信息

 

化的手段保存文物,相当于另一种延续。

 

解决的问题:文物的信息化保存,可以实现全球随时随地的查看与观察文物,这是信息化社会的趋势,为了解决这个实体的存放问题,在参考了一些前辈的项目和经验之后,我独立原创了这个文物管理系统。

 

3.2需求分析

3.2.1

需求获取一般包括这几种方式:观察法、体验法、单据分析法、报表分析法、问卷调查法、访谈法、需求调研会法。因为我这次实际条件限制,只采用了第一种方法观察法。观察法即是通过观察其他管理系统的运作,分析出日常中有什么需求,并将其电子化。在此我断定一个文物管理系统需要设定管理员,谁来管理,谁来赋权限。文物的类别怎么添加,修改,删除,查询,以及实体文物现在存在于哪里。以及一些简介信息如何添加。具体到个体层次就是文物个体如何添加,如何修改,如何设置3D全景模型,如何查询以及更正最新消息。

 

 

系统安全是否可靠,是否能防止用户恶意攻击,是否能安全退出并且保存数据库中更改的数据。数据库是否具有拓展功能,添加其他模块。

 

系统的主要任务:实现文物类别的增删改查,实现文物的增删改查以及查询功能,并且关联文物与文物类别,保持动态一致性。实现防止SQL注入攻击,以及账号登陆功能。

 

数据库完整性要求:通过一定的操作防止合法的用户对数据库的修改从而破坏数据的一致性。保证数据的正确性,一致性与完整性。(一).实体完整性:每个文物与文物类别的id编号都是其的主码,每个主码唯一确定其所对应的元祖。其值不可为NULL。再插入一个新的文物实体时,不能违反上述规则。

(二).(参照完整性):存在于文物类别与文物两个表的关系,如我设置每个文物的文物类别ID(OldTypeID)与文物的编号ID为主键外键关联关系。两者要么不参照,要么被参照的对象必须存在 (三).属性约束:属性的约束取值必须来自定义的值域。不能和定义的属性不同或超出定义氛围。

 

数据库安全性要求:物理层次上,对存储信息的硬盘应该有防水防火防止各种突发情况的准备(我认为可以利用各种网络云盘)。

人际层:对用户的授权要小心,明确DBA与普通用户的权限,普通用户只有查询的权利,而没有改变或者删除的权利。

网络层:防止密码泄露导致的数据损失。

操作系统层次:对数据库进行未授权访问的一种手段

 

性能要求:存储的数据要能承担日常的存储需求。能在短时间内对操作命令做出回应。

 

一致性要求:数据库与操作界面数据保持动态一致。

 

3.2.2

 

业务流程图

第一个复杂项目!!!文物管理系统(论java与数据库合作的威力)

 

业务数据流图

 

第一个复杂项目!!!文物管理系统(论java与数据库合作的威力)

 

 

数据字典

 

字典类型表(old'type       :id,  oldtypename oldtypedesc
                                                   1      东北系文物    东北文物具体描述
                                                   2      华北系文物      华北系文物具体描述
字典项目表(dictionary_item)    : iid,  old'name ,     oldtypeid(文物类别id名)   ,  oldtypedesc
                                                       1           帽子         1                   描述1                     
                                                       2           玉佩         1                      描述2                      
                                                       3           靴子          2                      描述3                         
                                                       4            手套        2                      描述3                      
用户表(user):  user_id,user_name,user_nation, user_education
                               1          老王               1                     1             
                               2          老宋               2                     2               

 

3.2.3

 

系统功能描述

实现了文物的增删改查功能,实现了文物类别的添加和增删改查,权限的赋予与收回以及登录功能,图形化界面

 

第一个复杂项目!!!文物管理系统(论java与数据库合作的威力)

 

 

功能模块图

 

 

3.3概念设计

 

 

 

 

数据库概念设计:

  1. 采用E-R方法进行数据库概念设计,可以分成3步进行:首先设计局部E-R模式,然后把各局部E-R模式综合成一个全局的E-R模式,最后对全局E-R模式进行优化,得到最终的E-R模式,即概念模式。由整体到局部再到整体。

2.逻辑设计主要工作是将现实世界的概念数据模型设计成数据库的一种逻辑模式,即适应于某种特定数据库管理系统所支持的逻辑数据模式。与此同时,可能还需为各种数据处理应用领域产生相应的逻辑子模式。这一步设计的结果就是所谓“逻辑数据库”。

3.物理设计;根据特定数据库管理系统所提供的多种存储结构和存取方法等依赖于具体计算机结构的各项物理设计措施,对具体的应用任务选定最合适的物理存储结构(包括文件类型、索引结构和数据的存放次序与位逻辑等)、存取方法和存取路径等。这一步设计的结果就是所谓“物理数据库”。

三者关系:由上到下,先要概念设计,接着逻辑设计,再是物理设计,一级一级设计。

 

 

 

ER图

 

第一个复杂项目!!!文物管理系统(论java与数据库合作的威力)

 

3.4逻辑设计

数据库的逻辑结构设计就是把概念结构设计阶段设计好的基本实体-关系图转换为与选用的数据库管理系统产品所支持的数据模型相符合的逻辑结构。逻辑结构是独立于任何一种数据模型的,在实际应用中,一般所用的数据库环境已经给定(如SQL ServerOracle或MySql)。由于目前使用的数据库基本上都是关系数据库,因此首先需要将实体-关系转换为关系模型,然后根据具体数据库管理系统的特点和限制转换为指定数据库管理系统支持下数据模型,最后进行优化。

( 1 ) 将概念结构转换为一般的关系、网状、层次模型;

( 2 ) 将转换来的关系、网状、层次模型向指定数据库管理系统支持的数据模型转换;

( 3 ) 对数据模型进行优化。

 

关系模式

 

文物(文物ID,文物名字,文物描述,文物类别号码,文物展览地点)

文物类别(类别ID号码,类别描述,类别名字)

账户(用户名,密码,ID号)

管理(管理者,管理权限)

 

数据库优化在于有主键外键关联,通过下拉表单可以实现选定文物类别ID号码从而确定文物类别在数据库中,省时省力。

 

例如

create table t_old(

id number(10) primary key,

oldname varchar2(15),

oldtypeid char(100),

oldtypedesc varchar2(500),

foreign key(oldtypeid) references t_oldtype(id)/**两者相关联,联系了两个表

)

 

create table t_oldtype(

id number(10) primary key,

bookTypeName varchar2(50),

bookTypeDesc varchar2(500)

)

 

优化结果:

减少了代码行数,管理员进行数据添加的时候更加省力,启用了预编译的sql语句,在底层DAO中丰富了各种功能。极大的提升了数据库系统的安全性。

 

3.5物理结构设计

 

物理设计;根据特定数据库管理系统所提供的多种存储结构和存取方法等依赖于具体计算机结构的各项物理设计措施,对具体的应用任务选定最合适的物理存储结构(包括文件类型、索引结构和数据的存放次序与位逻辑等)、存取方法和存取路径等。这一步设计的结果就是所谓“物理数据库”。

 

 

 

 

 

 

create table t_old(

id number(10) primary key,

oldname varchar2(15),

oldtypeid char(100),

oldtypedesc varchar2(500),

foreign key(oldtypeid) references t_oldtype(id)/**两者相关联,联系了两个表

)

 

create table t_oldtype(

id number(10) primary key,

bookTypeName varchar2(50),

bookTypeDesc varchar2(500)

)

 

create table t_user(

    id number(15) primary key,

    userName varchar2 (20),

    password varchar2 (20)

)

主要是这三个表

第一个表对应实体文物,其底层设计DAO操作如下:

 

String sql="insert into t_old values(null,?,?,?)";

PreparedStatement pstmt=con.prepareStatement(sql);

pstmt.setString(1,old.getOldname());

pstmt.setString(2,old.getOldtypeid());

pstmt.setString(3,old.getOldtypedesc());

return pstmt.executeUpdate();

 

第二个表对应文物类别,其底层SQL语句设计如****意在这个DAO层中我实现了增删改查的数据库SQL语句设计)

 

/**

 * 添加文物类别

 *

 *@author 赵经纬

 */

 

 

 

 

 

 

 

public static int add(Connection con,OldType oldtype)throws Exception{

String sql="insert into t_oldtype values(null,?,?)";

PreparedStatement pstmt=con.prepareStatement(sql);

pstmt.setString(1, OldType.getOldTypeName());

pstmt.setString(2, OldType.getOldTypeDesc());

return pstmt.executeUpdate();

}

 

public ResultSet list(Connection con,OldType oldtype)throws Exception{

StringBuffer sb=new StringBuffer("select * from t_oldType");

if(StringUtil.isNotEmpty(oldtype.getOldTypeName())){

sb.append(" and bookTypeName like '%"+oldtype.getOldTypeName()+"%'");

}

PreparedStatement pstmt=con.prepareStatement(sb.toString().replaceFirst("and", "where"));

return pstmt.executeQuery();

}

 

public int delete(Connection con,String id)throws Exception{

String sql=" delete from t_oldtype where id=?";

PreparedStatement pstmt=con.prepareStatement(sql);

pstmt.setString(1, id);

return pstmt.executeUpdate();

}

 

public static int update(Connection con,OldType oldtype)throws Exception{

String sql="update t_oldtype set booktypename=?,booktypedesc=? where id=?";

PreparedStatement pstmt=con.prepareStatement(sql);

pstmt.setString(1, oldtype.getOldTypeName());

pstmt.setString(2, oldtype.getOldTypeDesc());

pstmt.setInt(3, oldtype.getId());

return pstmt.executeUpdate();

}

 

 

 

 

 

 

 

 

 

第三个表是用户,在这个表中记录了实体用户

 

public User login(Connection con,User user) throws Exception{

User resultUser=null;

String sql="select * from t_user where userName=? and password=?";

PreparedStatement pstmt=con.prepareStatement(sql);

pstmt.setString(1, user.getUserName());

pstmt.setString(2, user.getPassword());

ResultSet rs=pstmt.executeQuery();

if(rs.next()){

resultUser=new User();

resultUser.setId(rs.getInt("id"));

resultUser.setUserName(rs.getString("userName"));

resultUser.setPassword(rs.getString("password"));

}

return resultUser;

}

 

 

3.6数据库实施

 

 

有了物理存储结构,接着就要使用所选定的RDBMS中的各种工具来建立它。

一方面是数据库结构的建立和修改,另一方面是原始数据的采集、整理、转换以及入库过程。原始数据入库完毕后,应及时建立数据库的安全性机制和完整性约束条件,还应在提高性能上下功夫,必要时建立一些视图、索引、存储过程、触发器等其他数据库对象。

这一步还包括编制和调试应用程序、数据库的调试和试运行。在这一步完成之前,应不断地反复进行以上过程。要保证设计出的数据库系统在其生命周期内是一直有效的。

到此为止,一个数据库和数据库应用系统就可以真正投人运行了。

 

数据库表的定义

create table t_old(

id number(10) primary key,

oldname varchar2(15),

oldtypeid char(100),

oldtypedesc varchar2(500),

foreign key(oldtypeid) references t_oldtype(id)/**两者相关联,联系了两个表

)

 

create table t_oldtype(

id number(10) primary key,

bookTypeName varchar2(50),

bookTypeDesc varchar2(500)

)

 

create table t_user(

    id number(15) primary key,

    userName varchar2 (20),

    password varchar2 (20)

)

视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来*定义视图的查询所引用的表,并且在引用视图时动态生成。

 

触发器可以查询其他表,而且可以包含复杂的SQL语句。它们主要用于强制服从复杂的业务规则或要求。例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。

触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。例如,我的文物类别ID号码与文物类别实体中的Id相关联,对文物表操作时候其实相当于对另一个表也有所改动。

 

第一个复杂项目!!!文物管理系统(论java与数据库合作的威力)

第一个复杂项目!!!文物管理系统(论java与数据库合作的威力)

两张流程图

 

附主界面程序(节选)

public MainFrm() {

setTitle("文物管理系统主界面");

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setBounds(100, 100, 450, 300);

 

JMenuBar menuBar = new JMenuBar();

setJMenuBar(menuBar);

 

JMenu mnNewMenu = new JMenu("基本数据维护");

mnNewMenu.setIcon(new ImageIcon(MainFrm.class.getResource("/images/bookTypeManager.png")));

menuBar.add(mnNewMenu);

 

JMenu menu = new JMenu("文物类别管理");

menu.setIcon(new ImageIcon(MainFrm.class.getResource("/images/search.png")));

mnNewMenu.add(menu);

 

JMenuItem mntmNewMenuItem = new JMenuItem("文物类别添加");

mntmNewMenuItem.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

OldTypeAddFrm oldTypeAddFrm=new OldTypeAddFrm();

oldTypeAddFrm.setVisible(true);

table.add(oldTypeAddFrm);

}

});

mntmNewMenuItem.setIcon(new ImageIcon(MainFrm.class.getResource("/images/add.png")));

menu.add(mntmNewMenuItem);

 

JMenuItem mntmNewMenuItem_1 = new JMenuItem("文物类别维护");

mntmNewMenuItem_1.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

OldTypeManagerFrm oldTypeManagerFrm=new OldTypeManagerFrm();

oldTypeManagerFrm.setVisible(true);

table.add(oldTypeManagerFrm);

}

});

mntmNewMenuItem_1.setIcon(new ImageIcon(MainFrm.class.getResource("/images/modify.png")));

menu.add(mntmNewMenuItem_1);

 

JMenuBar menuBar_1 = new JMenuBar();

menu.add(menuBar_1);

 

JMenu mnNewMenu_2 = new JMenu("文物管理");

mnNewMenu_2.setIcon(new ImageIcon(MainFrm.class.getResource("/images/userName.png")));

mnNewMenu.add(mnNewMenu_2);

 

JMenuItem mntmNewMenuItem_2 = new JMenuItem("文物添加");

mntmNewMenuItem_2.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

AddActionPerformed(e);

}

});

mntmNewMenuItem_2.setIcon(new ImageIcon(MainFrm.class.getResource("/images/add.png")));

mnNewMenu_2.add(mntmNewMenuItem_2);

 

JMenu menu_1 = new JMenu("文物鉴赏");

menu_1.setIcon(new ImageIcon(MainFrm.class.getResource("/images/edit.png")));

mnNewMenu_2.add(menu_1);

 

JMenuItem menuItem = new JMenuItem("东北系文物");

menuItem.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

AActionPerFormed(e);

}

});

menuItem.setIcon(new ImageIcon(MainFrm.class.getResource("/images/exit.png")));

menu_1.add(menuItem);

 

JMenuItem menuItem_1 = new JMenuItem("华北系文物");

menuItem_1.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

BActionPerformed(e);

}

});

menuItem_1.setIcon(new ImageIcon(MainFrm.class.getResource("/images/login.png")));

menu_1.add(menuItem_1);

 

JMenuItem menuItem_2 = new JMenuItem("华中系文物");

menuItem_2.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

CActionPerformed(e);

}

});

menuItem_2.setIcon(new ImageIcon(MainFrm.class.getResource("/images/about.png")));

menu_1.add(menuItem_2);

 

JMenuItem menuItem_3 = new JMenuItem("华南系文物");

menuItem_3.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

DActionFormed(e);

}

});

menuItem_3.setIcon(new ImageIcon(MainFrm.class.getResource("/images/userName.png")));

menu_1.add(menuItem_3);

 

JMenuBar menuBar_2 = new JMenuBar();

mnNewMenu_2.add(menuBar_2);

 

JMenuItem mntmNewMenuItem_4 = new JMenuItem("安全退出");

mntmNewMenuItem_4.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

int result=JOptionPane.showConfirmDialog(null,"是否退出系统?" );

if(result==0) {

dispose();

}

 

}

});

3.7系统调试和测试

  • 界面登录功能的实现

要求:输入正确的账号和密码后能登入至于界面。错误的话提示错误信息。

第一个复杂项目!!!文物管理系统(论java与数据库合作的威力)

第一个复杂项目!!!文物管理系统(论java与数据库合作的威力)

这是登录界面,如果信息错误,图片如下

结果:完美满足需求

 

  • 主界面的功能完善

 

要求:应该有一个菜单栏,分为文物完善,文物类别完善,安全退出等主按钮,各级主按钮下方应该有其对应的子按钮。主界面应该有美术处理,方便用户操作,应该添加简易图表。

第一个复杂项目!!!文物管理系统(论java与数据库合作的威力)

 

结果:满足要求,具体主界面如下

第一个复杂项目!!!文物管理系统(论java与数据库合作的威力)

第一个复杂项目!!!文物管理系统(论java与数据库合作的威力)

  • 文物类别管理

要求:能有增删改查的作用

测试:分别添加 “华南系文物”,并查询结果

第一个复杂项目!!!文物管理系统(论java与数据库合作的威力)

 

第一个复杂项目!!!文物管理系统(论java与数据库合作的威力)

 

结果:满足要求

 

  • 安全退出

要求:确认是否退出数据库,并让用户再次确认

测试:debug爬虫测试返回值

第一个复杂项目!!!文物管理系统(论java与数据库合作的威力)

结果:满足要求

 

  • .关于文物

要求:弹出作者设计的界面

第一个复杂项目!!!文物管理系统(论java与数据库合作的威力)

 

  • 文物添加与文物鉴赏

要求:添加个体文物,并填充上各种属性,还应该有各个文物鉴赏功能

测试:界面上填加,并且在数据库中查询

第一个复杂项目!!!文物管理系统(论java与数据库合作的威力)

 

 

 

 

(附上我自己设计的鉴赏节选)

第一个复杂项目!!!文物管理系统(论java与数据库合作的威力)

第一个复杂项目!!!文物管理系统(论java与数据库合作的威力)

第一个复杂项目!!!文物管理系统(论java与数据库合作的威力)

第一个复杂项目!!!文物管理系统(论java与数据库合作的威力)

 

 

结果:满足文物实体添加要求,并且满足页面观赏性

 

 

 

 

 

4.系统评价

4.1 系统特色

该系统由我一人独立设计,配备图形化界面和图案提示,方便易懂

可以随意添加文物实体,文物类别与文物实体关联,一样可以随意增删改查,甚至还配有我个人设计的网页,里面有一些文物鉴赏,很是美观。

安全退出确认功能防止用户误操作保证了数据的安全性。

我在菜单栏上留有拓展空间,系统具备可维护性和可操作性。

Java后台中建立的包的类型方便,且具备注释,非常适合后期调试!

 

4.2 系统不足及改进

做这个系统的初衷是想真正的做成博物馆在线效果,可以让用户在足不出户的情况下在线浏览图书馆。在研发过程中我发现了一些不足,如如何在界面内做出链接到我的个人网站,这次只是做到了数据库和JAVA后台的连接,并没有带上网页设计,我认为如果有充足的时间,一定要做出网页,配备发送短信获取登陆动态密码的功能,与时俱进。其次,可以设置网上商城功能,卖一些文物周边,满足一些人员的就业和文物爱好者的需求。照片有3D全景效果,应该将照片通过鼠标拖拽功能使其实现360度全息多角度看图,增进现场感。文物实体的插入还应该能手动添加图片,并且与文物鉴赏功能保持动态一致。数据库应该再设置Serverlet层来增强系统的健壮性与可维护性。

 

 

5.设计心得

在系统设计时候我经常会遇到如下图这种情况

第一个复杂项目!!!文物管理系统(论java与数据库合作的威力)

经我反思,原因在于自己对数据库的一些知识点有模糊,例如,既然我也经设置了主键,那么我把null插入主键所在列显然就违反了系统完整性的实体完整原则。第二点需要注意的是,一定一定要形成自己的命名规范,否则会出现各种对应上的问题,即使使用了DEBUG模式还是觉得很浪费时间。

 

还有一种情况,主键与外键的问题,一定要遵循完整性规则,参照与被参照键一定是同一类型且定义的长度要保持一致,否则会出现匹配性错误。在设计系统时候因为粗心出现了一些bug,要调试起来很是费时费力,所以一是要在JAVA中的TRY CATCH语句中的catch中设立一点提示性语言,第二是要学会打断点和DEBUG调试

 

这应该属于我个人独立完成的第一个迷你项目吧,这两周内时间充足,我认真学习且尝试,

 

 

 

发现收获了很多,比如图形化界面如何设置? 在这里我推荐使用WINDOWBUILDER来设计,这可以极大地提高生产率,当然前提是建立在我的图形化界面语言了解的还过得去的基础上。最后说一点,一点要注重后台程序的简洁性和可维护性,方便后期维护。这次项目需求分析做的还不够好,有时间的话我要去一趟博物馆,真正的了解一下用户的痛点在哪里,来最大程度的设计贴合用户需求的程序。

具体程序我会打包生成JAR包或者贴一些源码在我的CSDN(https://blog.csdn.net/aliceiwill)上