小型档案管理系统设计分析

项目地址:Haroxa/File-Management-System

1 项目目的

运用Java语言,以迭代方式逐步编程实现一个小型档案管理系统。由此了解软件开发的一般过程,深入理解面向对象语言的基本概念和基本原理,理解和掌握继承与多态、异常处理、输入输出流、GUI设计、JDBC数据库操作、网络编程、多线程等技术;熟练掌握在Java语言环境下,上述技术的具体实现方法。

2 系统功能与描述

2.1 用户相关

本次实验设置了Browser、Operator和Administrator三种类型的用户,Browser类型只能进行下载文件、文件列表、修改密码操作,Operator类型在Browser类型基础上新增了上传文件功能,Administrator类型在Browser类型基础上增加了新增用户、删除用户、修改用户和用户列表功能。

2.1.1 新增用户

输入用户名、密码与角色名,进行格式检查,对于用户名和密码要求是长度为2-10、只包含数字字母的字符串,对于角色名要求是给定的角色类型对应的编号,只有符合上述格式要求的用户信息,才能成功执行新增用户操作。

2.1.2 用户登录

设置用户名为唯一标识,输入用户名与密码,经过查找验证后,才能成功执行用户登录操作。

2.1.3 修改用户

非管理员用户的修改操作是修改自身的密码,输入原密码与新密码,对原密码进行验证并对新密码进行格式检验之后,才能成功执行修改密码操作,成功修改密码后,需要进行重新登录;管理员用户还可以对其它用户的信息进行修改,输入用户名,新密码,新角色,进行格式验证,然后根据用户名查找到用户后,才能成功执行修改用户信息;任何用户都不能修改自身的角色。

2.1.4 删除用户

输入用户名,进行格式检查,然后根据用户名查找到用户后,才能成功执行删除操作。这里允许用户进行删除自身的操作,但为了防止所有用户都被删除,添加了一个super作为超级管理员,并设置任何人都不能删除和修改该用户。

2.1.5 用户列表

获取所有用户信息后,进行逐个读取,按指定格式输出,实现用户列表功能。

2.2 文档相关

2.2.1 上传文件

输入文件路径、档案编号和档案描述,进行格式检验,对于档案编号要求长度为4的全数字字符,对于档案描述要求长度为2-1024的字符,符合上述要求后,需要验证文件是否能够上传成功,上传成功再进行档案信息的添加,添加失败则会删除已删除的文件信息。

2.2.2 下载文件

设置档案编号为唯一标识,输入档案编号,如果查找到对应的档案信息,获取其上传路径,然后下载到指定的路径中,这里的上传和下载本质上都是属于文件的复制,在console层中使用自定义方法CopyFile进行实现。

2.2.3 档案列表

获取所有档案信息后,进行逐个读取,按指定格式输出,实现档案列表功能。

2.3 GUI相关

本次实验主要设计了五个GUI界面,分别是登录界面、主界面、用户管理界面、档案管理界面以及个人信息管理界面。

2.3.1 登陆界面

用户输入用户名和密码,点击登录按钮,会开始登录验证,如果成功会弹出登陆成功的弹窗,并进入主界面,如果失败,则会弹出登录失败的弹窗,点击取消按钮,则会退出应用。

2.3.2 主界面

主界面包含用户管理、档案管理、个人中心和退出登录四个按钮,只有管理员用户才可以使用用户管理,点击退出登录按钮会回到主界面,点击其它按钮会打开对应的子页面,此处设置了一次只能打开一个子界面,如果已经打开了一个子界面,再点击其它按钮时,相当于再次点击这个子界面。如果关闭了主界面,已经打开的子界面也会被关闭。

2.3.3 用户管理

用户管理界面会获取到所有的用户,以表格的形式显示出来,下面有四个按钮对应查询、新增、修改和删除操作。点击查询按钮会弹出查询界面,输入用户名,如果查找到用户会在表格中滑动到对应的行并突出显示;点击新增按钮,输入相关信息,成功添加后会在表格中新增一行;点击修改按钮,需要提前选中一行,然后才能进行修改,并更新表格数据,如果修改了当前用户密码,则需要重新登录;点击删除按钮,也需要先选中行,然后进行删除操作。

2.3.4 档案管理

档案管理界面会获取到所有的档案,以表格形式显示出来,下面有四个按钮对应查询、上传、下载和删除操作。点击查询操作会弹出查询界面,输入档案号,如果查找到档案会在表格中滑动到对应的行并突出显示;点击上传按钮,输入相关信息,并选择上传的文件,进行文件上传操作;点击下载按钮,需要先选中一行,然后下载到选择的文件夹下;点击删除操作,也需要先选择一行,然后验证是否为当前用户上传,只有是当前用户上传的文件,才能成功进行删除。

2.3.5 个人中心

个人中心界面会显示当前用户的相关信息,下面有修改密码和关闭窗口的操作按钮。点击修改密码按钮,会弹出窗口,需要输入原密码和两次新密码,成功修改后需要重新进行登录。

2.4 数据库

本次实验使用MySQL数据库,所有与用户、档案相关的增删改查操作都通过数据库语句来实现,为了防止SQL注入,此处使用预编译语句,通过 ? 占位符进行占位,然后再填充相应的数据,以此完成对应操作。

2.5 网络编程

本次实验使用Socket进行网络通信,设计了一个公共类Info作为通信协议,Info类包含操作信息msg和传输数据data两个部分,客户端执行指定操作时,会传输对应的操作信息与相关数据;服务端在接受到数据后,根据传输的操作信息选择对应的操作方法来处理数据与请求,然后返回对应的请求结果。

对于文档传输操作,这里以上传档案为例,客户端会先传输档案的编号和文件名,告知服务端要开始档案上传操作,然后客户端继续从要上传的文件中按指定长度的字节读取字节数据,并同时传输此次读取的字节个数,如果服务端接受到的字节个数为-1,表明文件读取完成,服务端会结束读取,然后向数据库中插入对应的档案信息,如果上传失败,则会删除已上传部分的文件。

2.6 多线程

本次实验通过继承Thread类的方式来实现多线程。首先,启动一个主服务,注册端口,然后开始等待客户端连接,连接成功后,将客户端交给对应的socket通信管道,并开启一个独立线程进行处理。这里设置了一个自增编号来标识每一个客户端,方便进行观察。然后为了保证程序的健壮性,在客户端的发送数据方法中,添加了重新连接一次的功能,防止服务端断开连接后,再次启动时需要重启客户端的操作,也可以一定程度应对其它的未知错误。

3 模块设计

3.1 控制台应用程序

3.1.1 用户登录

由于用户登录是每个用户必备的功能,所以在AbstractUser类中设计一个方法Login,用户输入用户名和密码后,调用数据处理层DataProcessing中的验证用户方法VerifyUser,进行用户验证,验证成功,返回对应的用户对象,验证失败返回空值,实现相关代码如下:

DataProcessing类中:

AbstractUser类中:

这里对于可能出现的SQL异常都是发生即时处理,出现异常就返回空值。实际效果图如下:

3.1.2 用户列表

由于只有管理员才能查看用户列表,所以在Administrator中定义了方法listUserShow,其会调用数据处理层DataProcessing中的获取用户列表方法listUser,从数据库中获取所有数据存储到vector中返回,然后在listUserShow中获取其所有元素,逐个的进行输出,实现代码与运行结果如下:

3.1.3 档案上传

档案上传只有管理员才能进行,在Operator类中定义fileUpload方法,其会先调用copyFile方法,成功后在执行数据处理层DataProcessing中的insertDoc方法,最终完成整个档案上传操作,实现代码与结果如下:

3.2 GUI应用程序

3.2.1 主界面

主界面创建时会同时创建其三个子界面(用户管理界面、档案管理界面和个人中心管理界面),然后每次点击一个对应界面按钮都会开启选择一个子界面显示,如果子界面已经显示,则突出整个子界面,部分实现代码与效果图如下:

3.2.2 用户管理界面

用户管理界面创建时会同时创建其三个子界面(查询界面、新增界面和修改界面),然后每次点击一个对应界面按钮都会开启选择一个子界面显示,如果子界面已经显示,则突出整个子界面,部分实现代码与效果图如下:

3.2.3 档案管理界面

档案管理界面创建时会同时创建其三个子界面(查询界面、上传界面和下载界面),然后每次点击一个对应界面按钮都会开启选择一个子界面显示,如果子界面已经显示,则突出整个子界面,部分实现代码与效果图如下:

4 开发难点与体会

4.1 开发难点

4.1.1 GUI开发

设计GUI时,没有使用IDEA自带的UI Designer,全部是采用硬编码的方式实现的。所以在开始设计时,感觉到很困难。在参考网上的GUI相关代码后,才勉勉强强完成了登录界面的设计,然后根据登录界面的代码不断调整修改,最终完成了其它界面的相关设计,大致掌握了这一类界面设计的流程。

在进行界面的跳转调用时,主窗口和子窗口都是独立静态创建的。一旦退出当前用户登录其它用户时,子窗口的部分数据还未实现更新,而且管理各窗口的当前用户相对比较复杂。然后转变了一种设计思路,在自定义窗口类中添加父窗口和子窗口,让主窗口和子窗口联系起来,便于用户的更新,并且也取消了静态操作,每次重新登录则重新创建窗口,保证数据能够正常更新。

4.1.2 网络编程

设计好传输协议后,由于传输数据data设置为Object类型,每次读取数据,对需要进行类型转换,而且客户端和服务端的都要保证同一类型才能成功转换。参考其他同学的思路,将原来的console层打包成jar包,添加到项目中,让客户端和服务端调用相同的类型,解决类型不匹配问题。

在实现文件传输时,如果只是按一定长度字节传输数据,则另一方无法判断文件是否传输完成,会一直陷入等待中。这里将每次传输的数据使用Info类包装,并添加这次读取成功的字节长度,如果字节长度为-1,则表明输出结束,这样另一方就可以继续执行后续操作,避免了阻塞问题。

4.2 未完成功能

4.2.1 分页查询

由于本次实验的测试数据较少,故没有实现分页查询的功能。如果测试数据较多,每次传输所有的数据会给服务器传输带来较大的压力,可以通过分页查询来减轻压力。而且分页查询也可以通过上下页切换,更方便的查询观察数据。

4.2.2 多条件查询

多条件查询,可以通过多个条件,更加精准的查询匹配数据,甚至在此基础上可以添加模糊匹配的功能,来显示接近匹配条件的数据,不过由于数据的相关信息较少,多条件查询的作用不大明显,故此处没有进行实现。

5 实验总结

本次实验是一个全面的Java编程实践,涵盖了面向对象编程、异常处理、输入输出流、GUI设计、数据库操作、网络编程和多线程等多个方面。通过实现一个小型档案管理系统,我获得了以下方面的学习和经验:

1. 面向对象编程的应用: 在这个实验中,我深刻理解了如何将实际问题抽象成对象,以及如何通过面向对象的编程思想来组织和管理代码。通过创建用户、文档等类,我成功地将问题领域的实体转化为程序中的对象,实现了更清晰、可维护的代码结构。

2. 异常处理与程序稳定性: 在用户输入、文件操作、数据库交互等过程中,我经常使用异常处理机制。这不仅提高了程序的健壮性,使其能够更好地处理错误情况,同时也使得代码更加容易调试和维护。

3. 输入输出流和文件操作: 通过实现文件的上传和下载功能,我深入了解了输入输出流的使用以及文件操作的细节。这对于一个档案管理系统来说是非常重要的,因为系统需要能够存储和检索文件。

4. GUI设计和用户交互: 通过设计登录界面、主界面以及其他相关界面,我学到了如何通过GUI为用户提供友好的界面,使用户能够更直观地操作系统。这方面的经验对于开发用户友好的应用程序非常有帮助。

5. 数据库操作和数据持久化: 使用JDBC与MySQL数据库交互,我了解了如何通过数据库来存储和检索用户信息以及档案信息。这种数据持久化的方式对于长期保存和管理数据是至关重要的。

6. 网络编程的基础应用: 通过Socket实现了客户端与服务端的通信,设计了通信协议,我掌握了一些基础的网络编程技能。这对于今后开发涉及网络通信的应用程序具有实际应用价值。

7. 多线程处理: 实现了服务端的多线程处理,能够同时处理多个客户端请求。这让我更好地理解了多线程编程的必要性和应用场景,同时提高了系统的并发性能。

通过这次实验,我不仅学到了各种Java技术的应用,也提高了对整个软件开发过程的理解,从需求分析、设计到编码实现,再到测试和调试,全方位地体验了软件开发的全过程。这次实验是一个很好的实践机会,让我更自信地应对未来更复杂的软件开发任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Haroxa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值