| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 开发测试 -> 图书管理系统的一些注意事项及Bug -> 正文阅读 |
|
[开发测试]图书管理系统的一些注意事项及Bug |
目录 前言? ? ? ? 花了一周左右完成了 基于文本界面,利用IO流持久化存储?的图书管理系统。本篇文章包含了我对该项目的思路对应注意事项的介绍以及我遇到的一些Bug及解决方案和我的代码文件。 ?? 正文1.项目内容? ? ? ? ①项目功能结构图? ? ? ??????????②项目功能项目功能如下: (1)读者信息管理:包括读者信息添加和读者信息查询与修改功能。用户登录成功之后,可以浏览所有读者的信息,也可以检索特定读者的信息;同时,可以对读者信息进行维护,包括增加、删除及修改。具体信息包括读者类型(读者的类型决定着他可以借到书的最大数量和最大归还天数)、读者姓名、出生日期、性别、电话、所在院系、注册日期等。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据) (2)图书信息管理:包括图书信息添加和图书信息查询与修改功能。用户登录成功之后,可以浏览所有图书信息和检索特定图书的信息;也可以对图书信息进行维护。包括添加图书、删除图书以及修改图书信息。具体信息包括:图书ISBN、图书名称、作者、出版社、出版日期、印刷次数、单价、图书类别等。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据) (3)图书借阅管理:包括图书借阅和图书归还功能。图书借阅功能,先输入读者的编号,然后输入要借阅的图书的信息,记录系统当前时间即借阅时间;图书归还功能,输入读者的编号,选择其名下已借阅的图书,判断当前日期即归还日期与借阅日期的差值是否超过了规定的期限,计算罚金,从而进行图书的归还操作。具体信息包括:借阅日期、归还日期、罚金。由于要计算罚金,故需要知道该读者的读者类型,根据类型判断其可借图书天数、可借图书数量等。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据) (4)基础信息维护:包括图书类别设置、读者类别设置及罚金设置。图书类别设置,可以对图书的类别进行增加、删除、修改和查询;读者类别设置可以对读者的类别进行增加、删除、修改和查询;罚金设置,可以指定超期一天的罚金标准。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据) (5)用户管理:包括修改密码、用户添加和删除。修改密码,是指当前用户修改自己的密码;用户添加和删除,是对新增和去除系统用户时对用户信息的维护。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据) ????????③项目注意事项
参考文献:https://blog.csdn.net/yang_best/article/details/42169549
2.项目实操中需要注意的事项????????一步步从易到难走来,对该类项目的大致流程——增、删、 改、查的操作已经很熟悉了,该项目和上一个开发团队管理系统项目比起来要多了例如lambda、IO流、集合体系、反射等知识点。在知识整合的时候一定要清楚目标知识点对应的应用场景。例如Properties只能存储<String,String>类型的键值对,我们不要试图把Properties集合的值设置为对象来寻求load()方法与store()方法的简单调用。因为对象toString容易,StringTo对象难!下面介绍一下我在项目中的思路以及对应的注意事项。 ? ? ? ? ①思路整理1.首先我根据MVC三层架构模式(Model,View,Control)不严格的创建了我的package,如下: ?只是简单的做了区分,简单来说就是把展示给读者的放在view包下,实体类以及对它们的操作类都放在model包下,一些用户输入和静态数据集和工具类放在control包下,不严格也不严谨,以后学了设计模式会有所改进,暂时以实现功能为主。 2.创建好了package以后,首先编写实体类内容。分别对Reader、Book、BookBorrowAndReturn、ReaderBorrow、Admin? 这几个实体类的成员变量以及构造器根据需求进行构造。 3.然后编写主界面展示功能。为了方便查看,我把每一个模块的主界面都单独写了类,涉及到选择的类都放在ChooseMenu类中(如下右图)。? .4.将主界面的功能选择做好以后,按顺序对每个模块进行编写,首先进入的是ReaderMenu。 ?5.在读者模块中也是将switch()对应的各个选项列出,然后会在Reader类的操作类ReaderDao类中编写对应的方法,四个模块大致都是这样的格式会比较有逻辑。 ?6.在写每个模块对应的方法之前我会给自己一些实验数据用做测试,这些数据被我放在control包下的Maplist类中。 可以看到我设置了6个静态集合,然后在static代码块中添加每个集合对应的初始数据,这会使得在该类被调用时首先运行静态代码块中的内容,用这些数据来测试。(当然啦,我们不会一开始就会想到那么多集合,我建议和我一样,写到哪个模块,需要哪个集合了我们就来创建)。 用这个的好处是什么呢?——我们可以在其他类通过Maplist.accounts?来调用我们创建好的各个集合,对它进行你需要的操作,这实现了一个类似全局变量的功能,会变得方便很多。 7.在基本方法得到完善之后我们开始考虑优化。那么优化哪些方面呢? ????????①用户体验 我们的程序要面对的不是编辑者,是使用者,也就是用户,因此在涉及到用户输入时需要加入异常体系来做判断,例如你需要的是一个固定格式的数据,例如日期(2021-08-30),而用户输入的是dadadadasda等不符合要求的数据,就需要对他做提醒并要求重新输入。 我们可以在已有的TSUtilty工具类中选择需要用户输入的数据对应的方法,也可以根据自己需要对工具类做增删改,将这些规范的输入存入工具类的方法中是极好的,因为这些是要多次调用的。 在显示编号时我们最好是以1开头,程序员的世界中一向是0为始,但用户不是,因此要注意这点,我们将显示的数据的编号加1,将用户输入的编号-1就可以。这里避免不了String到Integer类的转换。不要嫌麻烦,以后的甲方会有很多甚至更多需求的,你不能跟他说计算机是从0计算起的,这不合适。 ? ? ? ? ②IO流的使用 在本项目中,我们需要对用户对该系统的操作进行持久化存储,因此在没有学习数据库之前,IO流文件存储是可以替代的。为此我建立了对集合数据的操作类(MaplistDao),它的方法如下,是对各个集合和对应信息所在文件的传输功能。 看一下accountsTran()的方法体。 首先我们是利用反序列化流读入,为什么呢?因为我不是第一次执行。文件中已经存在了历史数据。如果我们是第一次运行该程序的话(文件中没有数据),则需要先使用对象序列化将该对象存入文件中,再反序列化读出。这里的if-else相信大家都能看懂,如果看不懂没关系,欢迎讨论。 下方有个黄色区域是因为我向下转型时没有使用泛型机制,使得该转型是未经过检查也就是不安全的,在JDK15中这是会被检测到的。我们可以把它改为? ?LinkedHashMap<String,Stirng> 就可以通过安全检查了,当然也可以避开安全检查,有兴趣的小伙伴可以下载代码去看。 ?通过以上操作就可以实现集合和文件的互传了。我们只需要在程序运行和程序结束时调用就可以不用在每次修改数据时使用IO流,而只需要在这两次使用就好,是不是觉得方便了呢哈哈。 另外还有日志功能的实现:我是通过缓冲输出流来实现追加功能的。在登录的时候创建流,这个没找到办法偷懒,只有在用户每次操作的时候都记录下来,每次调用write()、newline()、flush()这三个方法,复制粘贴N+100次就完成了,很简单吧哈哈哈。 ????????③自定义异常 我随便写两个的,没啥感想,不提了不提了。 思路整理就到这里了,下面分享一下我遇到的Bug,即将面对它的小伙伴记得关注哦,不要走老路啦! ? ? ? ? 2.Bug大赏虽然说没有截图的bug仿佛少了点味道,但是唉没办法,将就一下吧,毕竟遇到bug就焦头烂额了,满脑子想着修改,没有心思去截图啦。 ①读者模块 1.涉及到用户模块的都要把工具类用起来,try...catch用起来,if-else用起来,否则呀!测试你的艾笛老师指不定乱输啥嘞!要把它定住!定就完了! 2.添加读者时 当需要输入读者类型时要提示用户当前有哪些读者类型,因为不同类型的读者意味着不同的最大借阅数量,最大借阅天数,逾期罚金。 3.你要思考读者ID如果是按顺序来排也就是不需要用户输入的时候,增加读者的时候它的ID应该怎么设置,不要和我一样直接取读者集合长度对应的ID(我脑子想的是每次添加反正都是添加到最后一个嘛,取集合长度没毛病!) 理论上也许没有,但是如果你的用户先删除了一个读者,而被删除的那个读者的ID不是最后一个,那你想想你在添加的时候是不是就直接覆盖了最后一个读者了。 如果你有点乱,我就举个例子。假设有三个读者,那么size=3;删去了第二个读者也就是序号为1的读者,还剩0,2,这个时候我们的size=2,而我们添加的那个读者的键也是2,使用put就会把最后一个读者覆盖了是不是。所以呀你要考虑好ID应该怎么设置哦! 我的方案呢是判断——使用集合的containsKey方法判断,如果为true则说明存在该键,那么我们ID+1,如果还存在继续+1,这就需要使用递归啦!当然难不倒你们哒! 4.如果对ID做了各种各样的操作,一会转到String一会转到int,那么在get,put时一定要注意你的ID的类型是否是该集合对应的键的类型,否则查不到数据哦! ②图书信息模块 1.在和上一个模块的问题被避免之后还剩下的bug就不太多了,因为都是增删改查。。我的bug集上没有啥能让我回忆起细节的bug了,emm。跳过~~~ ③图书借阅管理模块 1.在计算借阅天数的时候可以可以用当前时间对应的毫秒值减去借阅时间对应的毫秒值,这算是个小提示吗哈哈哈。 我bug好少~~~~ ④基础信息维护 1.罚金不是统一的,我们要让用户先输入读者类型然后才能确定罚金哦。 ⑤用户管理 1.虽然但是!同为管理员居然可以查询别的管理员密码!太过分了!应该设置个超级管理员, 不过我有点懒。以后要的时候再加吧! 结言JavaSE阶段到此终于结束了,终于可以和我的队友们学习快乐的数据库知识啦!再也不用怕被diss了呜呜呜~~~真好! 那我们就? ?数据库见! 代码我已上传,不知道怎么让大家看到,以防意外,我放在百度网盘吧。 链接:https://pan.baidu.com/s/1D59LQZp3oDgfQu9K2kQLeg? |
|
开发测试 最新文章 |
pytest系列——allure之生成测试报告(Wind |
某大厂软件测试岗一面笔试题+二面问答题面试 |
iperf 学习笔记 |
关于Python中使用selenium八大定位方法 |
【软件测试】为什么提升不了?8年测试总结再 |
软件测试复习 |
PHP笔记-Smarty模板引擎的使用 |
C++Test使用入门 |
【Java】单元测试 |
Net core 3.x 获取客户端地址 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/17 22:33:14- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |