引言
本次的系统开发是银行卡管理系统,这个系统是对一些基础银行卡基础业务的管理,是面向所有群体以及银行的管理员。接下来分析此次银行卡管理系统的研究意义以及研究设想。
传统的人工管理已经被社会证明为效率极低的管理方式,对于一些企业来说,信息交流沟通如果不能及时回应,往往会带来很负面的影响。然而对于银行的管理者来说,及时的了解资产负债等重要信息,将非常有利于管理层人员及时制定有效的应对措施,避免一些多余的损失。
随着计算机的流行,经济社会的发展。手机支付代替了货币的交易,网上购物代替了实体店的购物,就连原来的课堂学习都变成了线上的网络学习。因此,许多人工的工作会慢慢被计算机网络代替。例如本次的系统,人工的存款取款操作十分消耗人力和物力,工作效率也很低。这时,银行以及用户都追求更高的效率,并且还要求做到种类的丰富以及复杂度的提高。银行卡管理系统的出现解决了这个问题,这是一种新型的管理系统,可以降低操作复杂度和出错率从而提高工作效率。如今处于信息时代,互联网使得整个世界成为一个联系日益紧密的群体。银行想要在这个领域里站稳脚跟,就必须跟随时代的发展不断创新。管理信息系统便是实现这一目标的有效手段之一。
作为一个毕业设计,本次设计的管理系统在完成的功能上还有些欠缺。最初需要建立的用户表格只有四个,但是表与表之间的联系还是很密切的,这个就需要对数据库有熟悉的了解和应用。所以完成这个项目,要不断提高数据库设计的标准和编程能力,这两个基本功缺一不可。选择这个题目可以不断训练在这两方面知识的表达。本信息管理系统是利用网络技术,实现对银行卡的管理。本系统致力于减少银行内人员的工作量,便于与银行客户的交流,不再是通过语言口头形式的传达,而是计算机的操作。及时反映出用户需求,提高在人工管理上的效率低的问题,银行工作人员也能节省人力。减少了工作量上的要求,银行工作人员可以解决计算机做不全面的业务,使银行经营管理更近一步的简单快捷。
1系统分析
1.1需求分析
本系统的开发主要面对的群体是普通去银行办理业务的人和银行的内部人员。这个系统的开发对于这两个群体是十分必要的。一方面,提高存取款效率,将原本的人工代替。另一方面,追随时代发展的一种趋势,管理系统的不断研发和跟进是十分必要的。
对于一般去办理业务的人员来说,要求做到新建和删除用户,在操作过程中可以更改用户信息。在账户业务部分,可以查询用户的信息,包括各种基本信息、余额、账单等。在操作完成之后依旧可以存储相应的操作纪录并能够查询操作纪录等功能;在信息操作部分,有修改个人信息和查询密码的操作。
对于银行业务管理人员来说,能够操作所有账户信息并修改密码。在账户信息部分,可以进行某些账户的开户及冻结等;在信息操作部分,有修改和查询的功能。
1.2可行性分析
系统的可行性分析可以分成三个方面的问题。
首先是技术可行性分析,运用到的工具是IDEA,需要掌握的是java语言的编写以及对数据库的了解。在校期间,我校开设的课程在Java和数据库运用方面已经有了学习,可以充分利用到本次项目中。然而,学习所学的学术性已经掌握,我还缺乏了开发经历。在大四下学期,我去驰星进行了三周的实训,小组完成了一个购物车管理系统。这个项目从接触到完成,我学会了很多课本上接触不到的知识,有简单的软件变更,不再是简单的Eclipe,还有其他的IDEA和python。也有在代码书写中的规范性问题。因此,这个项目的开发在知识需求上我是具备的。开发系统的计算机硬件已经十分普及,在一般的电脑上都能够实现,同时还要求存储空间的要求,这两个要求达到的话,硬件方面运行以及编写代码是完全没有问题的。用到的工具是IDEA,这是一款与Eclipe十分相似的工具,在使用方面我请教了周围的一些朋友,最后可以编写此次项目开发的代码。以上几个要求都能完成,那本系统的开发是可以执行的。
其次是经济可行性分析,需要考虑到的是投资和收益。投资的定义就是前期需要找到开发系统以及代码编写等。收益的定义就是提高银行的办公效率,用操作系统代替人工的服务。一般收益是商业化的,这里只是对用户满意度的一个体现。在本系统中,我们并没有涉及到收益和投资,因此这个经济可行性是不予考虑的。这个项目的开发是可以执行的。
最后是运行可行性分析,需要考虑到面向的群体。开发的系统操作要非常简单,所面对的用户是各类人群,有一些高学历的或者低学历的或者是老人等,因此要考虑到是方便简单的操作。其次还需要有专业的人员指导,可以在这个系统运行时在银行配备工作人员,当用户遇到操作困难是可以得到正确的答复。
1.3功能分析
随着银行存款数量的不断增加,整体的工作需求需要不断提高。银行需要在各个方面提高效率,首先需要改进的就是人工的功能办理。使用计算机来管理银行卡可以大大增加管理的效率,还可以利用计算机管理丰富在各个方面功能上的多样化。
在总体功能实现方面应达到以下目标:
(1)用户可以进行简单的转账、取款、存款以及密码修改等功能;
(2)管理员可以进行账号的冻结和解冻以及密码修改等功能。
接下来,经过了一系列的对功能上的分析,可以简单列出数据库的构建:
(1)用户信息表:包括编号,密码,姓名,余额,启用状态以及扮演的角色等。
(2)个人信息表:包括用户编号,姓名,年龄,性别,地区,电话,卡号等。
(3)菜单表:包括编号,功能名,所在界面位置,用户权限管理等。
(4)转账交易表:包括编号,转账或者是存款操作,操作对象,时间,金额等。
在新系统开发中,应达到以下目标:
(1)有详细的设计说明书;
(2)模块在功能上的流程图要很清晰,即使是不懂代码的人看到流程图也能知晓这个项目的主要功能;
(3)系统能正常运行;
(4)系统在界面设计上,要有简洁的界面,用户和管理员都方便操作。
1.4开发步骤
管理信息系统的建立与运用可以划分成三个步骤。第一个步骤的要求是对系统在各个方面的可行性进行分析,主要分析本次项目的进行完成度,确保在软件和硬件以及知识储备上达到开发的要求;第二个步骤的要求是概要设计,主要实现取款子系统,个人信息子系统,管理员系统和用户系统四个部分,主要从四个方面实现对银行卡的管理;第三个步骤的要求是详细设计,在分析了系统的需求后,能够确定开发应用到的软件和硬件,准备好数据库的建立以及整个界面开发的美观和简洁性。这里确定了系统的主要功能,需要反复核对和确认。每一个步骤都不能马虎,要做到为下面系统的开发运行做准备。
2系统设计
2.1概述
本项目为银行提供了银行卡客户的一些存取款、取款、转账的基本业务的处理,还有对银行卡的一些信息,通过后台对数据的处理将有用信息反馈给给银行或普通办理业务的客户。这个系统在各个方面都能超越人工的处理效率。银行卡一种普遍的支付工具,日常生活中这是必不可少的额,例如,我们可以在银行进行存款取款以及转账等功能。随着网络以及计算机的不断发展,银行卡依旧占据了很重要的地位,一些老年人更愿意使用银行卡而不是网上交易。因此,对于银行卡的管理还是十分重要的,它需要做到基本的查询以及存取款服务。如果是单纯以的自己的知识来看,银行对每个用户的交易信息的处理量是一个十分复杂的问题,但是如今便捷的网络条件为银行卡的管理提供了有利的技术条件。这些快捷的方法使得这个系统的运行更加必要。
2.2系统的数据流图
首先要确定整个系统的流程,就要清楚的分析系统中数据的产生和处理,为此,在开始设计数据库之前,可以将总的数据流图整理出来,如图1所示。

图1系统数据流图
2.3系统的功能
经过了对知识进行理解和整个系统应该要具备的功能进行初步的规划后,本系统应具备开户,存款,取款,转账,查询交易,修改密码等功能,得出结构如图2所示。

图2银行卡管理系统功能结构图
2.4数据库设计
数据库的基本步骤就是:创建数据库、创建各个所需要的表、附加约束条件(有字符类型的约束和字符的限制)、创建需要登录的账户信息。数据库需要设计的功能有增、删、改、查,这些基本的功能在本次项目中都有充分的表达。由此看来,数据库的创建的好与坏是十分重要的,好的数据库创建完成后,可以将整个系统的功能进行连接并且实现所需信息的页面跳转。在设计数据库系统时,要不断更新各个方面用户的不同需求,可以进行一个简单的调查后确定所需要实现的功能。在调查时也应该注意到人群的分布,不同群体的需求是不同的。只有了解数据库创建过程中的这些问题和要求,才能够实现功能强大的查询以及复杂的业务规则。
2.4.1数据库需求分析
在需求分析阶段,主要任务是分析客户的业务和数据处理需求。首先要判断用户有哪些需求,在本项目中,主要是银行管理员和普通操作人员。整个系统可以进行查询、保存、更新和查询。这里就牵涉到我们需要先收集一些基本的数据,如个人信息,姓名,电话等等。接着可以对数据进行处理,形成一份全面的并且完整的数据字典。数据字典是一个为后续数据库创建提供便利的工具,在这个阶段如果仔细完成,后面的工作将更加的简洁。
2.4.2概念设计
在对项目的概念设计阶段,作为一个开发者,要从用户的不同角度来看对数据的处理,在处理数据之后会有一个概念模式的产生,利用这个概念模式可以对整个系统再一次进行分析,最终的目的是把它转化成在项目中体现的概念。如果这样,将概念设计从设计中独立开来,使各阶段的任务变得更加简单化,表现为由粗到精、由模糊到清晰、由抽象到具体的不断跟进。在本项目中,初步可以设置数据库的E-R模型图,保证各个信息是正确并完整的。首先要做的就是设计好局部的E-R模式,然后把各局E-R模式,综合转换成一个全局模式,最后优化修改得到最终概念模式。
对整个概念图和数据进行整理后,就可以设计出能够满足需求的各种实现,以及实体之间的关系。在实际应用中,我用到了MySql的数据库环境。首先将实体-关系图转换成关系模型,然后根据上面建立的银行卡管理系统的特点转换成指定的数据模型,最后优化。这些实体包含各种具体信息,一共有四个,在各个阶段能够相互流动。本项目中出现的实体有:菜单信息实体,转账信息实体,个人信息实体和系统用户信息实体。各个实体E-R图及总E-R图如图3、图4、图5。
图2
图3个人信息实体图
-3个人信息的实体ER图
图2-
图4用户信息实体图
4用户信息的实体ER图
图5总体的实体ER图
2.4.3数据库逻辑结构设计
数据库概念结构设计完成后,可以将E-R图转换成多张表格,进行逻辑设计。可以将上面的数据库概念转化为某种数据库系统所支持的实际数据类型。在银行卡管理系统中使用的各个数据表的字段设置如表1、表2、表3、表4:
字段名类型长度可否为空小数点说明
id varchar 255否0主索引字段
accountid varchar 255 0
age int 4 0
realname varchar 255 0
sex varchar 8 0
address varchar 255 0
tel varchar 255 0
cardid varchar 255 0
表1个人信息表(personinfo)
字段名类型长度可否为空小数点说明
Id varchar 255否0主索引字段
name varchar 100 0
parent_id varchar 255 0
action varchar 255 0
is_parent int 20 0
checked int 20 0
open int 20 0
icon varchar 225 0
menutype varchar 20 0
表2菜单表(f_menu)
字段名类型长度可否为空小数点说明
id varchar 225否0主索引字段
username varchar 225 0
password varchar 225 0
balance decimal 18 2
status varcharv 20 0
role varchar 50 0
表3用户表(account)
字段名类型长度可否为空小数点说明
id varchar 225否0主索引字段
accountid varchar 225 0
otherid varchar 225 0
tr_money decimal 18 2
datetime datetime 0 0
type varchar 225 0
表4转账信息表(transaction)
2.5用户界面设计
用户界面是指软件系统与用户之间交互的重要阶段,一般是用来登录,通常包括输出,输入的界面与方式等。由于本系统的最终用户是各种各样的群体,有老人和精通设计的专业人员,因此本系统需要简洁。所以在本系统上,采用了直接登录和点击的方式。
2.5.1系统安全性验证用户界面设计
用户登录窗口界面是进入系统之前必须经历的过程,这是用户最直观的对系统的判断。因此,考虑到的风格要简洁、实用、友好。
登录本系统,用户将看到如下画面(如图6所示):
图6用户登录界面图
2.5.2系统主屏幕的区域设计
在对主屏幕进行设计时,可以把界面划分成几个不同的区域,其中有工作区,状态信息区以及主菜单区,如表5所示:
状态信息区主要有锁屏、登录名、注销等
主菜单区
主要有执行的业务工作区
记录当前执行业务的进度以及历史记录
中间是具体的业务的工作流程
右下角显示页数
表5区域设计表
3系统编码与实现
3.1硬件的选择
在硬件的选择上,我们选择了Windows平台作为开发、测试和运行的平台。和其他操作平台相比,因为Window操作系统的应用是十分广泛的。它的操作十分简单,没有复杂化的操作,这让用户在体验度上大大加分。在本项目的设计与开发中,我们使用Windows已经足够使用了。同时,在后台数据库的配合下能够完成与Windows系统的紧密集成。其次有着许多的多媒体功能,在为了方便的前提下,大多数人还是会选择Windows。如果选用它作为开发平台,在这个项目需要功能的添加上会更加方便,如果软件更新时也会比较节约时间。
3.2软件的选择
在学校我们学习使用eclipse操作并管理数据库,但是我发现它也有缺点。在实习的这段时间,我接触到了IDEA,最后经过认真分析两者的不同,结合银行卡管理系统的需要和目前的硬件环境,我们选用Intelij IDEA作为软件开发工具。IDEA相比eclipse有以下几方面的优点:
(1)在项目管理上十分便捷。IDEA中的Project类似于eclipe中的workspace,而Module类似于eclipse中的project。IDEA在建立工程时是十分方便快捷的。在其他人的帮助下,我了解到,代码的工程化会使项目在运行上更通俗化。简而言之就是,就算是外行来运行,可以在一个总的apply下写一串代码,只需执行这一串便可以运行整个代码,这就是工程化的优点。IDEA中的Project是一个工程的意思,它把各个模块的信息连接到一起,最后要做的就是用一段简单的语句划分,使得项目做到工程化。IDEA拥有的强大的整合能力,在框架的选取上,Git、Maven、Spring等都支持,与此同时它的提示功能快捷,范围广。
(2)在开发效率上十分快速。IDEA可以在任意的代码界面提示相关值,遇到棘手的情况也能快速解决。在一些基本的单词和语法上,计算机会自动提示所在的语法行或者位置,而且可以实现在代码进行刷新时,界面自动更新的功能。撇开这些,在IDEA中还有很多的快捷键便于使用,首字母的提示就是一个简单的体现。在代码编写的过程中速度是十分快捷的,并且能做到准确报错。如果不小心将单词输入错误,将不会出现下一步的提示,这就说明在前面的代码中出现了语法错误。
3.3系统的主要文件及目的
系统主要文件及目的如表6所示。
文件作用
.ftl(html)发送一个请求,将用户执行的操作数据发送给前端,主要的是进行页面的设计
controller用来寻找在类下面的函数的具体实现,可以找到具体运行的方法
service声明几个对应数据库的类,利用私有方法对.xml页面下的操作进行实现和部分调用
mapper对应xml文件执行,这里面是在sql语言执行的情况下,给出具体的函数并且执行
.xml增删改查的sql语句,执行完成之后,一层层返回,最后返回给ftl,ftl根据返回的信息作相应的处理
表6系统文件目的表
3.4创建普通用户系统管理模块
3.4.1创建“系统登录”
系统登录的界面主要由一个“登录”按钮构成,运行界面如上一章图2-6所示。【登录】按钮实现过程为:
(1)输入用户和密码信息。
(2)在登录界面中,当账号密码不为空时,对后台发送一个请求,将账号密码以及角色发送给后台数据,执行的是login()函数的调用,对应后台controller的logincontroller类,使用findByUser()方法,对应判断是否密码账户的正确性,最后进入系统。
(3)在密码的输入上需要正确才能进入系统。
(4)其中角色方面可以选择是普通用户和管理员。
3.4.2创建“功能菜单”
普通用户管理界面主要由“存款”、“取款”、“转账”、“交易记录”、“余额查询”、“个人信息”和“密码修改”按钮构成,界面如图7所示。
图7功能菜单图
菜单的主要实现:首先执行getAll方法,返回类型为list,list里面以menu存储,通过对菜单里面个人信息的查找,判断为管理员还是普通用户,然后通过一个私有类进行列表存储和打印。
3.4.3创建“存款功能”
【存款】按钮实现过程为:首先声明一个TransactionConttoller的公共类,然后赋予它一个depoist的值,利用ajax找到里面两个参数,判断是否符合大于0的存款要求,符合就将这个trmoney传给所在name,显示操作成功,否则操作失败。(如图8)
图8存款功能图
3.4.4创建“取款功能”
【取款】按钮实现过程为:首先声明一个TransactionConttoller的公共类,然后赋予它一个在withdrawals的值,找到这个文件下的函数,可以看到使用了save()方法,定义两个变量,一个是时间,一个是金额,如果没有接收到trmoney的话,就会提示取款。下面就是和存款一样的用ajax找到对应参数,判断取款要求需要大于0并且小于等于余额里的值,否则取款失败。(如图9所示)。
图9取款功能图
3.4.5创建“转账功能”
【取款】按钮实现过程为:首先声明一个TransactionConttoller的公共类,然后赋予它一个在transfer的值,找到这个文件下的函数,可以看到使用了result()方法,定义两个变量,利用findbalance()方法,判断是否符合转账条件,如果statue==0,则执行转账功能,否则转账失败。(如图10所示)。
图10转账功能图
3.4.6创建“交易记录查询”和“余额查询”
【交易记录】【余额查询】按钮实现过程为:首先声明一个TransactionConttoller的公共类,然后赋予它一个在allTrans的值,找到这个文件下的records函数,这里是根据session找到所有交易记录,返回Trans列表,列表中可以查到具体的记录以及余额。(如图11,图12所示)。
图11交易记录查询图
图12余额查询图
3.4.7创建“个人信息”和“密码设置”
【个人信息】【密码设置】按钮实现过程为:执行allTrans,寻找到所有数据,点击修改后,修改数据,连接后台的数据库,利用增删改查的sql语句,执行完成之后,一层层返回,最后返回给ftl,ftl根据返回的信息作相应的处理。密码修改时,用到一个changepassword方法判断修改的密码是否符合规范,全空则提示不能为空;新密码和输入密码不一样时则提示两次密码不一致;符合规范则提示密码修改成功。(如图13所示)。
图13密码设置图
3.5创建管理员的登录模块
3.5.1创建“管理员的登录”
同普通用户的登录过程一样,如图14所示。
图14管理员登录表
3.5.2创建“功能菜单”
管理员管理界面主要由“所有账户”、“已冻结账户”、“已启用账户”、“开户”和“密码修改”按钮构成,实现过程和普通用户执行过程一样。界面如图15所示。
图15创建的功能菜单图
3.5.3创建“冻结,删除功能”
【冻结】按钮实现过程为:首先声明一个PersonController的公共类,然后赋予它一个在Allperson的值,找到这个文件下的StopPerson函数。执行的是获取所有人员信息,转换成一个list,将所选的一行进行删除,并修改statue的值。(如图16所示)。
图16冻结、删除功能图
3.5.4创建“查询冻结和启用账户功能”
【查询】按钮实现过程为:声明一个PersonController的公共类,然后赋予它一个在Allperson的值,找到这个文件下的OpenPerson函数。将其中的内容赋值叫map,最后输出到界面。(如图17、图18所示)。
图17查询冻结图
图18启用账户图
3.5.5创建“开户功能”
【开户】按钮实现过程为:首先声明一个SubmitInfo的公共类,将它设置在一个叫personvo的对象里面,对里面的用户名设置权限,其中i=0为初始值,i<=4000,名字可以用中文和英文,其他约束条件还有:
personVO.setCardid("47546119930457"+(1000+i));
personVO.setTelephone("1557594"+(1000+i));
int rd=Math.random()>0.5?1:0;
personVO.setSex(rd+"");
personService.submitInfo(personVO);
如果没有达到条件,则显示数据插入失败,具体实现界面如图19所示。
图19开户功能图
3.6工具栏
【注销】的功能:退出信息管理,连接到login界面。
【锁屏】【解锁】按钮的实现过程:锁屏时使用getlock()方法,将页面不可实现跳转。解锁时使用unlockSubmit()方法,首先判断获得一个close的命令,出现解锁提示,跳转并使用getuserName()方法,连接到登录界面,输入密码后,查询对应表单的密码是否正确,正确则解锁成功,否则需要输入密码才能重新进入系统。(如图20和图21所示)
图20工具栏展示图
图21解锁界面图
4系统运行与调试
4.1系统的配置
(1)硬件配置要求:内存:8G以上,硬盘:8G以上,WINDOWS10操作系统
(2)软件配置要求:IDEA软件,MySQL数据库,前端使用到了jQuery、css3、html5,后端
使用到了Tomcat8.5,、spring mvc、mysql、mybatis等。在整个实现中,利用的是基于javascript的开发框架。
4.2系统的运行
在计算机上找到IDEA图标,在程序目录双击可执行文件即可。如果发现找不到文件可以重新导入,找到所在路径就可以打开运行。
4.3系统的调试
程序调试是在程序运行之前,利用人工的方法,例如手动编译的方法对代码进行修改,可以修正代码在逻辑和语法上的一些错误。在这个过程中可以完善程序的可读性,将程序出现错误的地方进行修改,要保证运行和调试时都不会出错。程序对于语法和逻辑的要求是非常高的,就算运行成功,但是一旦出现问题,整个系统就会崩溃。例如游戏的一些服务器卡顿瞬间,都是代码的不完善导致的。如果可以根据测试时所发现的错误,进一步诊断,找出出错的原因和具体的错误位置进行修正,那么就能减少后期会出现的风险问题。修改代码是十分复杂的,因此要在代码完成时立刻进行检测。在常见的调试中,我们通常会出现不同的问题,主要有:语法错误、运行错误和逻辑错误。在本设计中我归纳了以下几点方法:
(1)在程序中插入简单的测试语句或者打印。这样方便对源程序进行调试,但是缺点是效率低,再每一次的打印后会生成一些无关的数据,这个过程是十分复杂的,因此不可取。当然,我们依旧可以做到在每一个语句后面加入一个return测试,例如:
public String toLogin(){
return"login";
}
这里就可将login工程化,然后再打印,如果不报错就是没有问题,报错的话可以在所在行找到。
(2)运行部分程序。有时只是一段代码的的问题,如果整个程序运行的话十分消耗时间和精力,因此我们可以运行部分代码,以此提高效率。第一步在这里显然就有些复杂了,因为打印的效率低,我们需要将每一个语句一遍遍打印,所有后面的我实行了一次性的运行,将一个版块的程序写完后就运行一次,这样提高第一步骤中效率低的问题。其中最突出的问题就是大小写的问题,多次报错,因为一个函数的调用所用到的名称要一致,所以需要十分注意。例如Map的首字母大写,我们可以直接等软件提示,因为每一个正确的代码,他都会提示所有调用的函数。借助自带的调试工具。一般来说,程序设计语言都有专门的调试工具,调试的人员可以用这些工具来分析程序的动态行为。Java可以利用debug来进行最后的调试。由于本项目最后的运行十分顺利所以没有用到调试工具。
结论
本次的毕业设计完成了用户存款和取款的一系列银行卡最基本的功能,基本上满足了银行对于银行卡小部分功能的管理系统的需求。
通过本次的毕业设计,我对Java和数据库技术的相关知识有了更深刻的了解,现在的我已经能够运用sql语言和使用Java程序来访问Access数据库。在计算机流行的时代,掌握Java技术是十分令人羡慕的。在技术上,一个炫酷的技能会令人敬佩。在工作上,这也是个受欢迎的岗位。当然,我们所学的知识还是远远不够的。在课余之际,我也看了很多关于java语言的知识,学好一门计算机语言并不是那么简单的。该设计还是存在着很多问题的,比如在设计程序的过程中,由于开始使用的数据库是MYSQL,在使java程序在和MYSQL数据库连接时会抛出截断字符流的异常,在上网查询后才发现是数据库里设置数据字段是数据长度小或者大了,在实际的场景中,不需要把所有字段都设置的非常长,这会造成短暂的资源浪费,导致输入的字符被截断,可以在捕捉异常后,修改数据库来解决这个问题。期间我还把管理员的数据删除了导致不能登录,因此要检查管理员的登录状态,或者唯一甚至多个管理员的信息状态。如果出现密码正确,用户名正确的情况下,依旧登录不了,那一定是信息冻结的原因。只有不断完善整个功能,这个代码才完整。
在接下来的系统调试阶段,单独运行程序时背景图片还存在,但是打包后运行文件时就没有图片了,经过咨询后发现图片不仅要放在当前文件夹下,还要放在另外的文件夹中,再重新打包后图片就显示了。调试阶段的一些语法错误也给我留下了深刻的印象,在编写代码时要细心。
在最后阶段,我还学会了附加数据库文件,如果该系统被使用在数据库中,就可以使得数据库文件随身携带,从别的数据库分离,直接附加到自己的数据库。在所有功能创建完成后,我还考虑到了用户的问题,在操作上,我没有设置很多复杂的键位以及阅读障碍的文字,使得该系统可以被客户使用的更加得心应手。
致谢
在老师和同组成员的帮助下,大学的毕业设计算是完成了,在此过程中虽然有困难,但是都得以解决。因此,我要感谢老师不厌其烦的讲解和帮我纠错,改错;感谢同组成员认真的帮我解决一些程序上的错误,还要感谢论文组对毕业论文的审核与验收。
本论文是在导师指导下完成收尾,由于疫情的影响,他多次在还需要上网课的情况下抽出时间给我们开会。交代了下一个阶段需要完成的任务,并细心修改查阅了四遍论文稿。其中在知道我们第二个阶段任务时,不厌其烦的将修改几次的文案帮我审查,使我掌握了基本的研究方法,在以后的生活中也有一个准则。最后有同学因为考研不能修改时,老师还特意亲子修改,这是一位值得尊敬的老师。本论文从选题到完成,都少不了导师的帮忙。在此,向导师表示崇高的敬意和衷心的感谢。
参考文献
[1]埃克尔(美).Java编程思想[M].北京:机械工业出版社,2007.4
[2]钟启泉.学习环境设计:框架与课题[J].教育研究,2015.1
[3]李东海.Access 2007数据库办公应用[M].北京:科海电子出版社,2010.1
[4]张永常.Java程序设计实用教程[M].北京:电子工业出版社,2006.8
[5]耿祥义,张跃平.Java2实用教程[M].北京:清华大学出版社,2006.8
[6]赵文靖.Java程序设计基础与上机指导[M].北京:清华大学出版社,2006.6
[7]朱福喜.Java语言程序设计[M].北京:清华大学出版社,2005.1
[8]李兴华.Java开发实战经典[M].北京:清华大学出版社,2009.8
[9]张帆.Java范例开发大全[M].北京:清华大学出版社,2010.6
[10]陈佛敏.Access 2003数据库应用教程[M].湖北:华中科技大学出版社,2010.1
[11]邵丽萍,邵光亚,张后扬.Java语言程序设计[M].北京:清华大学出版社,2008.8
[12]谭浩强.c程序设计[M].北京:清华大学出版社,2010.6
[13]严蔚敏,吴伟民.数据结构[M].北京:清华大学出版社,1999.2
[14]雷景生.数据库原理及应用[M].北京:清华大学出版社,2012.1
[15]宝玉,杨洁,贺志强,王晓湘.信息论基础[M].北京:人民邮电出版社,2008.8
附录部分核心代码
package tk.mybatis.springboot.conf;
Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter{
Override
public void addResourceHandlers(ResourceHandlerRegistry registry){
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
}
package tk.mybatis.springboot.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
Controller
public class InitController{
RequestMapping(value="/toIndex")
public String toIndex(){
return"index";
}
RequestMapping(value="/toLogin")
public String toLogin(){
return"login";
}
}
package tk.mybatis.springboot.controller;
Controller
RequestMapping("/user")
public class LoginController{
Autowired
private LoginService loginService;
//跳转到密码修改页面
RequestMapping("/showPassword")
public String showPassword(){
return"/personinfo/password";
}
//跳转到个人信息页面
RequestMapping("/showPerson")
public String showPerson(){
return"/personinfo/info";
}
//跳转到余额查询页面
RequestMapping("/showBalance")
public String showBalance(){
return"/bank/balance";
}
package tk.mybatis.springboot.controller;
Controller
RequestMapping("/menu")
public class MenuController{
Autowired
private MenuService menuService;
RequestMapping
ResponseBody
public List<MenuVo>getAll(Menu menu,HttpSession session){
Account account=(Account)session.getAttribute("account");
List<MenuVo>menuList=menuService.getAll(menu,account);
return menuList;
}
}
package tk.mybatis.springboot.controller;
Controller
RequestMapping("/person")
public class PersonController{
Autowired
private PersonService personService;
//跳转所有账户页面
RequestMapping("/showAllPerson")
public String showAllPerson(){
return"/user/person";
}
//跳转冻结账户页面
RequestMapping("/showStopPerson")
public String showStopPerson(){
return"/user/personStop";
}
//跳转开户页面
RequestMapping("/newPerson")
public String newPerson(){
return"/user/newPerson";
}
//跳转启用账户页面
RequestMapping("/showOpenPerson")
public String showOpenPerson(){
return"/user/personOpen";
}
//获取所有人员信息
RequestMapping(value="/getAllPerson")
ResponseBody
public Map<String,Object>getAllPerson(PersonVO personVO){
List<PersonVO>personVOList=personService.getAllPerson(personVO);
int total=personService.countAllPerson(personVO);
Map<String,Object>map=new HashMap<>();
map.put("rows",personVOList);
map.put("total",total);
return map;
}
//修改状态信息
RequestMapping(value="/changeStatus")
ResponseBody
public JsonResult<Integer>changeStatus(HttpServletRequest request){
String id=(String)request.getParameter("id");
String status=(String)request.getParameter("status");
int result=personService.changeStatus(id,status);
return new JsonResult<Integer>(result);
}
//删除个人信息
RequestMapping(value="/deleteInfo")
ResponseBody
public JsonResult<Integer>deleteInfo(HttpServletRequest request){
String id=(String)request.getParameter("id");
int result=personService.deleteInfo(id);
return new JsonResult<Integer>(result);
}
//获取所有人员信息
RequestMapping(value="/getStopPerson")
ResponseBody
public Map<String,Object>getStopPerson(PersonVO personVO){
personVO.setStatus("冻结");
List<PersonVO>personVOList=personService.getPerson(personVO);
int total=personService.countAllPerson(personVO);
Map<String,Object>map=new HashMap<>();
map.put("rows",personVOList);
map.put("total",total);
return map;
}
//获取所有人员信息
RequestMapping(value="/getOpenPerson")
ResponseBody
public Map<String,Object>getOpenPerson(PersonVO personVO){
personVO.setStatus("启用");
List<PersonVO>personVOList=personService.getPerson(personVO);
int total=personService.countAllPerson(personVO);
Map<String,Object>map=new HashMap<>();
map.put("rows",personVOList);
map.put("total",total);
return map;
}
//添加开户人员信息
RequestMapping(value="/submitInfo")
ResponseBody
public JsonResult<Integer>submitInfo(PersonVO personVO){
try{
/*for(int i=0;i<4000;i++){
personVO.setUsername("qcc"+i);
personVO.setRealname("秦菜菜"+i);
personVO.setCardid("47546119930457"+(1000+i));
personVO.setTelephone("1557594"+(1000+i));
int rd=Math.random()>0.5?1:0;
personVO.setSex(rd+"");
personService.submitInfo(personVO);
}*/
int result=personService.submitInfo(personVO);
if(result==1){
return new JsonResult<>(result);
}else{
return new JsonResult<>(1,"数据插入失败");
}
}catch(Exception e){
return new JsonResult<>(e);
}
}
RequestMapping(value="/exportInfo")
public JsonResult<Integer>downLoginLogExcel(HttpServletResponse response){
try{
List<PersonVO>personVOs=personService.getPersonList();
FileUtil.downloadFile(response,personService.getExcel(personVOs));
return new JsonResult<>(0);
}catch(Exception e){
return new JsonResult<>(e);
}
}
RequestMapping("/exportExcel")
ResponseBody
public String exportExcel(String description,MultipartFile file,HttpServletResponse response)throws Exception{
//判断文件是否为空
if(file==null){
String errDetails="文件是空的!";
return errDetails;
}
//获取文件名
String name=file.getOriginalFilename();
if(name==null||!WDWUtil1.validateExcel(name)){
String errDetails="文件格式不正确!请使用.xls或.xlsx后缀文档。";
return errDetails;
}
ImportExecl importExecl=new ImportExecl();
List<List<String>>list=importExecl.read(file.getInputStream(),false);
try{
int i=personService.importExcel(list);
}catch(Exception e){
return"数据上传失败";
}
return"SUCCESS";
}
}
package tk.mybatis.springboot.controller;
Controller
RequestMapping("/trans")
public class TransactionController{
Autowired
private TransactionService transactionService;
//显示存款页面
RequestMapping(value="/showDeposit")
public String showDeposit(){
return"bank/deposit";
}
//显示取款页面
RequestMapping(value="/showWithdrawals")
public String showWithdrawals(){
return"bank/withdrawals";
}
//显示转账页面
RequestMapping(value="/showTransfer")
public String showTransfer(){
return"bank/transfer";
}
//显示交易记录页面
RequestMapping(value="/showAllTrans")
public String showAllTrans(){
return"bank/records";
}
//存款
RequestMapping(value="/save",method=RequestMethod.POST)
ResponseBody
public JsonResult<Integer>saveMoney(Transaction transaction,HttpSession session){
JsonResult<Integer>jsonResult=new JsonResult<Integer>();
Account account=(Account)session.getAttribute("account");
//临时存放Sesion
Account temp=(Account)session.getAttribute("account");
try{
int n=transactionService.saveMoney(transaction,account);
if(n>0){
jsonResult.setState(0);
jsonResult.setMessage("操作成功");
jsonResult.setData(n);
}else{
jsonResult.setState(1);
jsonResult.setMessage("操作失败");
}
account=temp;
}catch(Exception e){
return new JsonResult<Integer>(e);
}
return jsonResult;
}
//查看交易记录
//根据session找到所有的交易记录,返回trans列表
RequestMapping(value="/getAllTrans")
ResponseBody
public Map<String,Object>getAllTrans(Transaction transaction,HttpServletRequest request){
String beginTime=request.getParameter("beginTime");
String endTime=request.getParameter("endTime");
//String type=request.getParameter("type");
Map<String,Object>map=new HashMap();
Account account=(Account)request.getSession().getAttribute("account");
List<Transaction>transactions=transactionService.getAllTrans(transaction,account,beginTime,endTime);
PageInfo<Transaction>pagelist=new PageInfo<Transaction>(transactions);
map.put("rows",pagelist.getList());
map.put("total",pagelist.getTotal());
return map;
}
}
package tk.mybatis.springboot.mapper;
import tk.mybatis.springboot.model.Account;
import tk.mybatis.springboot.util.MyMapper;
public interface AccountMapper extends MyMapper<Account>{
Account selectByUser(String name);
}
package tk.mybatis.springboot.mapper;
import tk.mybatis.springboot.model.Account;
import tk.mybatis.springboot.util.MyMapper;
public interface LoginMapper extends MyMapper<Account>{
Account selectUserByUsernameAndPassword(String username,String pasword);
}
package tk.mybatis.springboot.mapper;
import tk.mybatis.springboot.model.Menu;
import tk.mybatis.springboot.util.MyMapper;
public interface MenuMapper extends MyMapper<Menu>{
}
package tk.mybatis.springboot.mapper;
public interface PersoninfoMapper extends MyMapper<Person>{
List<PersonVO>getAllPerson( Param("rows")int rows, Param("page")int page);
int countAllPerson( Param("status")String status);
List<PersonVO>getPerson( Param("rows")int rows, Param("page")int page, Param("status")String status);
List<PersonVO>getPersonList();
}
package tk.mybatis.springboot.mapper;
import org.apache.ibatis.annotations.Param;
import tk.mybatis.springboot.model.Transaction;
import tk.mybatis.springboot.util.MyMapper;
import java.util.Date;
import java.util.List;
public interface TransactionMapper extends MyMapper<Transaction>{
List<Transaction>listTransaction( Param("type")String type, Param("beginTime")Date beginTime,
Param("endTime")Date endTime, Param("accountid")String accountid,
Param("otherid")String otherid);
}
package tk.mybatis.springboot.service;
public class LoginService{
Autowired
private LoginMapper loginMapper;
Autowired
private PersoninfoMapper personinfoMapper;
public Account findByUser(Account userInfo)throws Exception{
userInfo.setBalance(null);
Account account=loginMapper.selectOne(userInfo);
//Account account=loginMapper.selectUserByUsernameAndPassword(userInfo.getUsername(),userInfo.getPassword());
if(account==null){
throw new Exception("用户名或密码错误");
}
if("冻结".equalsIgnoreCase(account.getStatus())){
throw new Exception("该账户已被冻结");
}
/*if(!account.getRole().equalsIgnoreCase(userInfo.getRole())){
throw new Exception("角色错误");
}*/
return account;
}
public Integer changeUser(Account account){
return loginMapper.updateByPrimaryKey(account);
}
public Person findByPerson(Person person)throws Exception{
Person persons=personinfoMapper.selectOne(person);
if(persons!=null){
return persons;
}else{
throw new Exception("找不到该用户信息");
}
}
public int updatePerson(Person person){
return personinfoMapper.updateByPrimaryKey(person);
}
}
package tk.mybatis.springboot.service;
Service
public class MenuService{
Autowired
private MenuMapper menuMapper;
public List<MenuVo>getAll(Menu selmenu,Account account){
if("管理员".equalsIgnoreCase(account.getRole())){
selmenu.setMenutype("1");
}else{
selmenu.setMenutype("0");
}
/*Example example=new Example(Menu.class);
Example.Criteria criteria=example.createCriteria();
if(selmenu.getMenutype()==1||selmenu.getMenutype()==0){
criteria.andLike("menutype","%"+selmenu.getMenutype()+"%");
}*/
List<Menu>list=menuMapper.select(selmenu);
List<MenuVo>mainList=new ArrayList<>();
List<MenuVo>subList=new ArrayList<>();
for(Menu menu:list){
if("".equalsIgnoreCase(menu.getParentId())||menu.getParentId()==null){
mainList.add(new MenuVo(menu));
}else{
subList.add(new MenuVo(menu));
}
}
parseParentAndChilren(mainList,subList);
return mainList;
}
private void parseParentAndChilren(List<MenuVo>mainList,List<MenuVo>subList){
for(MenuVo main:mainList){
List<MenuVo>list=new ArrayList<>();
for(MenuVo sub:subList){
if(main.getId().equalsIgnoreCase(sub.getParentId())){
list.add(sub);
}
}
main.setChildren(list);
}
}
下载提示:
1、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“文章版权申述”(推荐),也可以打举报电话:18735597641(电话支持时间:9:00-18:30)。
2、网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
3、本站所有内容均由合作方或网友投稿,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务。
原创文章,作者:写文章小能手,如若转载,请注明出处:https://www.447766.cn/chachong/14753.html,