版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.z..--可修编-理工大学琴岛学院毕业设计(论文)专业计算机科学与技术专业 班级专升本〔11-21〕学生际斌学号课题客户信息管理系统指导教师王世广2013年5月30日-.z.-可修编-摘要 当今社会,随着计算机的的领域不断扩,人们越来越离不开计算机的同时,对计算机软件的需求也不断提高。以往生活中软件都是在大的企业中得到应用,现在却大不一样了,因为互联网在现实生活中的不断扩展,人们的知识领域的增加,同样伴有的就是中小型企业的成长,例如现在电子商务的普遍,中小卖家就会应用到大小不一的ERP系统。ERP是针对物资资源管理〔物流〕、人力资源管理〔人流〕、财务资源管理〔财流〕、信息资源管理〔信息流〕集成一体化的企业管理软件。它将包含客户/效劳架构,使用图形用户接口,应用开放系统制作。除了已有的标准功能,它还包括其它特性,如品质、过程运作管理、以及调整报告等。既然如此,则这些方面的提高必定对我们现有生活发挥大的作用。同样现在面临的ERP系统价钱都是相当高昂的,对于小型企业来讲这样的负担还是相当重的,紧迫中开发一款简单而又实际结合中小企业需求的这样一款软件也是迫在眉睫,而对于Java简易的开发模式势在必行。关键词:JavaERP人力资源管理客户管理电子商务AbstractNowadays,withthecontinuouse*pansionofthefieldofputer,moreandmorepeoplecannotdowithouttheputeratthesametime,theputersoftwarerequirementsisalsorising.Pastlifeofsoftwareisappliedinlargeenterprises,nowisnotthesame,becausetheInternetinreallife,toincreasepeople'sknowledge,alsowithisthegrowthofsmallandmedium-sizedenterprises,suchase-merceisnowgenerally,smallsellerswillbeappliedtothedifferentsizesoftheERPsystem.
ERPisforthematerialresourcemanagement(logistics),humanresourcemanagement(people),themanagementoffinancialresources(financialflows),informationresourcesmanagement(informationflow)integrationofenterprisemanagementsoftware.Itwillincludetheclient/serverarchitecture,usingagraphicaluserinterface,makinguseofopensystem.Inadditiontothee*istingstandardfeatures,italsoincludesothercharacteristics,suchasquality,processoperationsmanagement,andregulatoryreporting.Ifso,thentheseaspectstoimproveoure*istinglifeisboundtoplayabigrole.ThepriceofERPsystemalsofacesarequitehigh,forsmallbusinessesthatburdenisheavy,theactualbinationisimminentneedsofSMEsinthedevelopmentofsuchasoftwarepressingasimpleyet,butforsimpleJavadevelopmentmodelbeimperative.
Keywords:JavaERPhumanresourcemanagementcustomermanagemente-merce目录第1章绪论11.1系统开发背景11.2系统现实价值1第2章需求分析32.1用例图32.2相关用例4第3章概要设计73.1流程图73.2数据构造7第4章数据库设计104.1信息表104.2ER图11第5章界面设计135.1软件界面135.2界面跳转关系14第6章详细设计与实现166.1系统执行流程166.2编码规24总结:30致:31参考文献:32-.z.-可修编-第1章绪论1.1系统开发背景ERP是EnterpriseResourcePlanning〔企业资源方案〕的简称,是上个世纪90年代美国一家IT公司根据当时计算机信息、IT技术开展及企业对供给链管理的需求,预测在今后信息时代企业管理信息系统的开展趋势和即将发生变革,而提出了这个概念。现如今,ERP是针对物资资源管理〔物流〕、人力资源管理〔人流〕、财务资源管理〔财流〕、信息资源管理〔信息流〕集成一体化的企业管理软件。而现如今的ERP系统已经在企业中占据了相当重要地位,其中我们今天开发的客户信息管理系统也是ERP系统中的一局部。在我们企业中,现在由于人际交往的复杂已经面临的多重问题,客户的地位在一家企业中是尤为重要的,而更多的人为了效劳好顾客,甚至会为顾客很多工作以外的事情,比方在顾客的生日上送上祝福和礼物,在这样的根底上,客户可能会跟这家企业走的更近,这就是效劳型企业的到位之处。同样面临的问题就是,仅凭一个人的脑子去记忆如此庞大的信息系统那是不够的,所以我们就紧迫需要一款这样的记忆系统来帮助我们整理客户的信息,更重要的是在必要的时间弹出窗口来提醒我们,是顾客的生意了,则我们就要提前做好准备给我们的顾客一个意外的惊喜。在这样的鼓励下,就有了我们客户新管理系统这一款软件的诞生。1.2系统现实价值客户信息管理系统实际应用中更重要的是应该表达其“管理工具〞的本质。系统主要宗旨是对企业所有客户、信息、时间和空间等综合资源进展综合平衡和优化管理,所以,该系统首先是一个软件,同时是一个管理工具。该软件是IT技术与管理思想的融合体,系统也就是先进的管理思想借助电脑,来达成企业的管理目标。它具有整合性,把所有可能的潜在客户备份到系统当中来,所以在量上实现了整合,同样具备便利性,因为凡属有客户在本月或者在近几日生日,则系统就会自动弹出提醒框来加以提示,所以远比我们去单个查找要来的方便,所以在这一点上也表达出了它的实时性。对个人来讲,客户是使我们有工作的人,客户不必依赖我们,我们却必须依赖客户;对企业来讲,客户购置企业提供的产品和专业效劳,是企业是最重要的资源,是企业赖以生存的根本。客户对所进展的交易总有所期望,比方花的钱最值得,得到的效劳最满意,如果期望得不到满足,客户就会寻找其他渠道以满足需要。因为客户有选择的权利。据国外一位知名心理医生统计,对一段不愉快的经历,平均每个人会告诉他身边的20个人,假设是一段愉快的经历,则平均会告诉5个人。由此看来,只要赶走了一个客户,就等于赶走了潜在的20个客户。如果你一天遇到了50个客户,其中有两个客户对你的效劳产生了不愉快的感受〔这也许是我们企业常见的事情〕,则一年后,由于连锁反响,可能有5000个人再也不愿意与我们打交道。而失去的客户,则成为竞争对手得到的客户。试想这样的企业,将何以在市场中立足?!联系到我们公司,该怎样来为客户提供物有所值甚至物超所值的产品和效劳呢?接待人员是企业的第一个窗口,据调查客户不满意的原因有36%是由受到的接待引起的。我们要把自己置身于客户的角度,准确了解客户的需要,真正做到将“无微不至的关心〞送给客户。要和客户保持良好的关系,还要做好跟踪效劳。由于这样那样的原因,我们的工作中难免会出现失误而引起客户的不满。有关资料显示,当我们主动与客户联系并解决问题时,客户的满意程度就会提高30%。定期对客户进展回访,根据反响的信息迅速做出回应,让客户时刻感受到体贴和关心,一定会有良好的收效。所以一款好的客户管理系统,跟客户之间拉近距离是我们首选的。第2章需求分析2.1用例图图2-1系统用例图根据我们系统的需求分析,Admin需要通过见客户建立关系,则我们系统的运行最初端口MainLoad.java开场,通过我们的输入的用户名和密码直接跳转我们的系统主界面,即InSystem.java。当然进入系统之前系统是需要判断的,比方我们的用户名和密码错误或者是其它异常等等,这里我们采用的方式就是Label提醒,就是改变Label的文字容和其颜色来提示我们的信息错误,一旦填写错误并且提交之后,系统就会做出相应的提示,并且重新输入用户名和密码。用户名和密码正确我们的系统Progress进程块运行完毕正常跳转InSystemn.java.进入我们的系统之后,从菜单栏文件开场,则点击“注册〞将会直接跳转到RegWindow.java,即我们的注册用户窗口。因为注册窗口我们关闭之后我们的接下来的程序就是重新登录,则我们就重新回到了MainLoad(),如此循环到主系统界面,我们进入切换窗口。切换窗口的功能就是登录不同账号,点击切换按钮后,我们又关闭了当前的系统,即dispose(),然后重new一个MainLoad(),则同样的还是回到MainLoad,这里我们可以更改不同的账号进展登录。添加账户信息:直接跳转AddInform.java,这里将会填入相关的客户信息,添加之后关闭添加的界面,回到主主界面。搜索:跳入的是NameSearchInform.java,这里确定后是检索的过程,然后通过主界面的表格来显示,所以关闭当前的搜索窗口。最近生日:跳入BirthInform.java,统计最近生日列表。最近生日:跳入的是BirthInform.java,这里只需要在工具栏上点击“最近生日〞即可生成最近生日的窗口。并且该窗口是定时出现的,即使我们现时间关闭了。我们的用户具有的管理模块如下:权限管理:实现我们一些低级管理员的权限修正,比方我们的高级管理员具有一切管理权限,我们的普通管理员具有添加但不具备删除和修改功能,而信息阅览的管理员是只能阅览的。添加客户:添加客户相关信息这个也是最直观的的了,当然该模块只能在高级管理和普通管理下操作。客户备注:客户备注就是添加信息中的一个信息块,主要为备注客户生日时所要做的事情,以提醒的用途。查询信息:完成对客户信息的检索功能,直接输入客户的,我们可以通过该功能直接搜索客户所有信息。注册管理员:该管理功能只有在高级管理员下方可执行的,可以为高级管理员、普通管理员和信息阅览实现与用户注册。2.2相关用例表2-2系统登录用例名称系统登陆功能简述管理员提供正确的用户名和密码登陆前置条件用户名存在后置条件登陆成功 根本流1用户在登录页面中输入用户名和密码,并提交;2系统判断用户名和密码是否合法;3根据用户的类型显示不同的主页面 备注如果用户名或密码错误,Label将会更改为红色字体系统登陆模块是在我们系统首次运行所要输入的密钥界面,即我们需要提供已经在数据库中存在的用户名和密码,数据库中核对存在并且正确后,将会登陆成功;如果不成功,界面中Label将会显示为红色字体以提示密码错误。如表2-2系统登录所示。表2-3添加客户信息用例名称添加客户信息 功能简述用户添加客户的生日信息以及备注信息前置条件无 后置条件添加成功根本流1用户在添加窗口中输入客户信息,并提交2系统将相关信息存入到客户数据库备注如果无法存入将会弹出相关异常信息添加客户信息模块,我们会需要在我们系统数据库中的所有信息,比方客户、生日、产品、成交信息和备注信息等等。我们需要填写用户的相关信息提交就可以了,前提是该客户信息不存在,否则将会有相关的异常信息,同样地、如果提交成功,我们的数据库将会新增一条客户信息,同样地,我们也会通过showMessageDialog来做出成功添加信息提示。如表2-3所示。表2-4搜索客户信息用例名称搜索客户信息功能简述输入客户或月份信息查询客户相关信息前置条件客户信息已经存在后置条件系统列表显示相关客户信息根本流1输入客户,并提交2列表单独显示查询的客户信息备注不存在的情况下,列表即为空搜索客户信息,我们需要提供两种途径,分别是通过和月份,通过直接输入查询出客户信息即可通过系统列表显示出相应搜索名的信息列表。或者输入在*几个月份之的所有客户信息,我们可以输入多个月份,例如输入“1-12〞,意思就是显示当前客户列表中生日在1-12个月的信息,意思就是显示所有客户信息了。也可以输入一个月份的信息,同样提交就会显示相应的客户提示信息列表。如果相关信息不存在,列表显示为空,如表2-4搜索客户信息所示。表2-5注册用户用例名称注册用户功能简述添加用户和密码,提交前置条件该用户名不存在后置条件注册成功根本流1输入用户名和密码提交2用户名和密码注册到数据库备注如果用户存在将会弹出异常对话框 注册用户,在注册用户之前我们要确定用户不存在,否则我们无法提交用户信息到数据库。成功提交用户信息,将会在数据库中存储,并提示“注册成功〞 这样的提示信息。如表2-5注册用户所示。表2-6删除客户信息用例名称删除客户信息 功能简述用户删除客户的生日信息以及备注信息前置条件数据库已经存在该客户的信息后置条件删除成功根本流1用户在客户信息列表中选择要删除的行2列表息被删除,数据库中该条信息被删除备注如果无法删除将会弹出相关异常信息 删除客户信息只需要选中我们列表中的*一条信息,点击“删除〞按钮即可删除的,如果无法删除将会有系统提示信息。如表2-6删除客户信息所示。-.z.-可修编-第3章概要设计3.1流程图图3-1系统流程图 图3-1系统的全程流程图描述了系统的各个模块,以及操作的执行顺序,我们后面将根据我们的需求和描述安排,对系统设计和开发。3.2数据构造数据构造是指数据相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。 系统模块包括多个信息元素,其中包括系统的登陆、用户注册、修改密码、切换用户、添加客户信息、删除客户信息、搜索客户信息、最近生日和切换用户等等,如图3-2所示:图3-2系统构造图表3-3描述了系统的数据构造表组成关系和属性信息,其中包括用户、添加、删除、注册和搜索信息。如表3-3所示:表3-3数据构造表数据构造名 关系 属性用户用户是软件登陆控制中心的主体数据构造,定义了系统的登陆用户的相关信息用户名、密码、权限ID添加以inf的主体构造,添加客户的相关信息添加客户、成交商品、年月日、来源和备注新删除以inf的主体构造,删除客户的相关信息删除客户、成交商品、年月日、来源和备注新注册以用户信息为主体构造,添加用户信息添加用户名、密码和权限搜索以inf客户信息为主体将构造,检索客户信息选择客户、成交商品、年月日、来源和备注新第4章数据库设计4.1信息表表4-1reguser字段名称字段名数据类型长度用户名userChar20密码passwordChar20权限idChar5 reguser表是我们注册用户的数据库表格,存储信息即为我们所有注册用户信息。其中包括user、password和id。其中这里id是char类型的,但是这里我们的选项只有1、2和3,其中1将会代表高级权限、2代表普通权限和3代表我们的信息阅览用户。如表4-1reguser所示;表4-2inf字段名称字段名数据类型长度nameChar20年yearint8月monthint6日dayint4产品proChar20客户来源sourceChar20达成交易saleChar20 表inf的存储容是我们客户的信息存储一栏,其中字段包括name、year、month、day、pro、source、sale;分别对应的字段名称是、年、月、日、产品、客户来源和达成交易。其中年月日的类型是使用的int类型,其中在此因为涉及到判断月份信息,所以int是必不可少的。如表4-2inf所示;4.2ER图管理员管理员账号密码拥有客户**年-月—日产品客户来源达成交易权限n m图4-3ER图系统设定了两个表格,数据库db,包括reguser和inf两个表格。其中reguser为我们的注册用户表,而inf就是我们的客户信息管理表格。两个表格对应的关系就是用户可以查看inf的信息,并可以对用户信息作出修改。Reguser包括的字段分别为:账号、密码和ID。ID实现了用户的权限管理,我们这里使用的1代表我们的最高权限即我们的“高级管理〞、2代表我们的普通管理权限即我们的“普通管理〞,最后是我们的“信息阅读〞也就是3了,它只能够实现我们的普通阅读的功能。如图4-3ER图所示。 每个用户都可以访问我们的客户信息。客户信息字段包括:、年月日、达成交易、客户来源和产品、数据库分别对应的是:name、year、month、day、sale、source和pro。第5章界面设计5.1软件界面登陆界面:为了表达界面的美观度,对于登陆窗口的设计采用了分层面板,普通的contentPane是无法实现背景图片的展现,而在这里我们就采用了分从面板,这样子我们很容易的将我们登陆面板参加了美观的背景图片;布局方式则采用的是FlowLayout,即我们默认的布局方式,这里的好处是可以按照SetBounds来随意调整其想要安排的位置,相对而言也是表达一种美观和数据的准确度上。对于我们标题“客户信息管理系统〞我们采用的是"Dialog"字体类型,并且设置大小为26,因为标题都是比拟大的,所以我们设置的相对较大,而其它的选填框则采用的是默认的字体大小。在这里大家都知道,我们要输入的是用户名和密码,则不可防止地,我们经常会碰到用户名或密码错误的提示,则在这里也是一样的,只是我们采用的风格不太一样,如果我们的密码或者是用户名错误,则我们的Label也就是我们的“用户名:〞和“密码:〞都会变成红色,并且显示的相关信息则是“用户名!〞和“密码!〞,并且是红色的字体,这样做的好处是变得醒目和加以提示。而当通过时,其字体将会恢复到最初的状态,即“用户名:〞和“密码:〞。系统中心界面:系统界面的布局就相对要复杂一些了,上面的菜单栏、工具栏和下面的Frame都是默认方式,也就是FlowLayout,则下面的Frame里面的容也就是一个表格和一个Te*t文本的排序newGridLayout(2,1),并且一分为二,则其中一局部是我们的表格信息,另一局部则是我们的系统显示和本月生日框信息,我们的字体都是默认字体大小。我们在系统上添加了很多的功能,其中就包括注册账户、添加信息等等。我们的字体统一的都是系统默认字体大小,如果在系统遇到异常信息或者是*些需要提醒时我们采用的显示方式均为JOptionPane.showMessageDialog(null,"**")这样的方式,**就是我们提示的信息容。添加客户信息界面:添加界面相比照拟简单,我们的布局模式就是默认的FlowLayout,所以这样添加的每一个控件都会被按照顺序相应地添加进来,其中我们包括的模块如下:JTe*tFieldnameField,JTe*tFieldyearField,JTe*tFieldmonthField,JTe*tFielddayField,JTe*tFieldproductField,JTe*tFieldsourceField和JTe*tFieldsaleField,分别对应的关系为:"","年-月-日","产品","客户来源","达成交易"。以及我们后面添加的两个按钮uttonaddButton=newutton("添加");uttoncancelButton=newutton("取消");两个按钮就已经显而易见了,实现的操作就是当我们输入相关的信息,添加按钮将会触发事件actionListener,然后通过或许相关信息添加到数据库中。搜索界面:搜索只需要两个控件,分别是选框和搜索按钮,这里还是比拟容易实现的。系统搜索会检索我们所输入的,数据库中的SQL语句如下:"select*frominfwherename='"+s+"'",这样我们就获得了我们需要的搜索信息,并且我们会将我们搜索的信息捕捉并新建一个InSystem的类,而这个类中table中所显示的列表信息就是我们所搜索的信息了。最近生日界面:intw=(int)(scrSize.getWidth()-260);inth=(int)(scrSize.getHeight()-235);setBounds(w,h,260,190);这是我们的边界设计,窗口的大小是根据我们不同计算机显示器的分辨率不同来计算的,其中显示的位置坐标的起始位置是(scrSize.getWidth()-260)和(scrSize.getHeight()-235),即也就是长和高的位置了。另外我们固定的大小分别是260*190的尺寸。我们起始位置的设定也是有根据的,因为我们希望我们的系统提醒的窗口是在我们计算机的右下角显示的,所以我们需要根据不同的计算机分辨率来设计其固有的位置,所以我们就要获取系统的分辨率值,这也是我们所有界面中唯一考虑到计算机分辨率大小的一点。5.2界面跳转关系MainLoadMainLoad.java登陆重新登录InSystem.javaRegWindow.javaBirthInform.javaAddInform.javaNameSearchInfrom.java注册提醒添加搜索返回新建图5.2界面跳转关系我们系统的运行最初端口MainLoad.java开场,通过我们的输入的用户名和密码直接跳转我们的系统主界面,即InSystem.java。当然进入系统之前系统是需要判断的,比方我们的用户名和密码错误或者是其它异常等等,这里我们采用的方式就是Label提醒,就是改变Label的文字容和其颜色来提示我们的信息错误,一旦填写错误并且提交之后,系统就会做出相应的提示,并且重新输入用户名和密码。用户名和密码正确我们的系统Progress进程块运行完毕正常跳转InSystemn.java.进入我们的系统之后,从菜单栏文件开场,则点击“注册〞将会直接跳转到RegWindow.java,即我们的注册用户窗口。因为注册窗口我们关闭之后我们的接下来的程序就是重新登录,则我们就重新回到了MainLoad(),如此循环到主系统界面,我们进入切换窗口。切换窗口的功能就是登录不同账号,点击切换按钮后,我们又关闭了当前的系统,即dispose(),然后重new一个MainLoad(),则同样的还是回到MainLoad,这里我们可以更改不同的账号进展登录。添加账户信息:直接跳转AddInform.java,这里将会填入相关的客户信息,添加之后关闭添加的界面,回到主主界面。搜索:跳入的是NameSearchInform.java,这里确定后是检索的过程,然后通过主界面的表格来显示,所以关闭当前的搜索窗口。最近生日:跳入BirthInform.java,统计最近生日列表。最近生日:跳入的是BirthInform.java,这里只需要在工具栏上点击“最近生日〞即可生成最近生日的窗口。并且该窗口是定时出现的,即使我们现时间关闭了。如图5.2界面跳转关系。第6章详细设计与实现6.1系统执行流程6.1.1登陆模块 系统的运行是从MainLoad开场执行的,执行显示的就是我们的初始登录界面,我们需要在这里输入我们数据库中已经存在的用户名和密码。如果用户名和密码的信息是正确的,则将会跳转到系统管理界面,并且会弹出“最近生日提醒〞.同样地,如果是用户名和密码错误,系统将会显示相应的提醒信息,我们这里的提醒信息比拟直观,我们直接将“用户名〞和“密码〞的te*t文本显示为红色和“用户名!〞,〞密码!〞这样的格式,在重新输入后,我们的系统将会对其进展检测,如果正确,则之前的红色文字“用户名!〞,“密码!〞将会恢复原有的“用户名〞和“密码〞。并且跳转。 图6-1登陆模块if(userTe*t.getTe*t().trim().equals("")||passWord.equals("")){JOptionPane.showMessageDialog(this,"您尚未输入用户名或密码");}else{try{while(rs.ne*t()){if(userTe*t.getTe*t().trim() .equals(rs.getString("user")) &&passWord.equals(rs.getString("password"))){userLabel.setTe*t("用户名:");userLabel.setForeground(Color.black);passLabel.setTe*t("密码:");passLabel.setForeground(Color.black);grant=rs.getString("id"); timer.start();break; }else{if(userTe*t.getTe*t().trim() .equals(rs.getString("user"))){passLabel.setTe*t("密码错误");passLabel.setForeground(Color.red); }else{userLabel.setTe*t("用户名!");userLabel.setForeground(Color.red);passLabel.setTe*t("密码!");passLabel.setForeground(Color.red); }}} }catch(SQLE*ceptione1){ e1.printStackTrace();}} 该方法的独特之处在于改变了Label的相关显示方式,以往我们更多采用的是ShowMessageDialog这样的显示方式,而在这里,我们直接利用我们的显示信息做出改变,这样是不是会变得更加直观呢,是的,下面介绍其工作的流程和方式。 首先if(userTe*t.getTe*t().trim().equals("")||passWord.equals(""))该条语句实现的是判断我们的用户名和密码的输入是否为“〞空,如果为空,后面就有了语句JOptionPane.showMessageDialog(this,"您尚未输入用户名或密码"),当然看到这里的语句提示,其实我们就大概知道了,这条语句就是为了提示我们输入用户名和密码,因为我们之前的操作一定是有用户名或密码没有填写。则除了为空,还有其它的可能,比方说输入的密码错误或者用户名错误或者是我们干脆登陆成功了,则else后面将一一解释。 下一步自然就是通过我们的数据库来检索了,利用rs.getString("user")来获得我们数据库中的用户名信息,userTe*t.getTe*t().trim()而这里是获得我们输入的用户名信息,以及passWord.equals(rs.getString("password"))来判断我们输入的密码和我们检索到的用户名密码是否对应。userLabel.setForeground(Color.black);passLabel.setForeground(Color.black);而这里之所以用到就是为了密码错误后,Label被修改为不同字体和颜色了,此处为恢复正常,虽然我们还没到密码错误的状态,但是这里是必须的,否则一旦密码错误后,这里就颜色就是红色了,红色的实现在这下面的操作的,下面介绍: if(userTe*t.getTe*t().trim().equals(rs.getString("user"))),这里我们将会判断我们的用户名信息,同样和我们的数据库来做比照,如果是正确的,则这里将会设置passLabel.setTe*t("密码错误"),密码Label显示为密码错误,颜色设置passLabel.setForeground(Color.red);这里为什么是用户名和数据库用户名对应正确后还显示密码错误呢?因为我们前面判断了,如果系统无常登陆,并且我们的用户名正确的话,很显然就是我们的密码错误了。同样地,如果用户名有问题则就是设置userLabel.setTe*t("用户名!");这里的用户名文字被修改为了“用户名!〞,而userLabel.setForeground(Color.red);将会设置用户名的颜色为红色,passLabel.setTe*t("密码!");passLabel.setForeground(Color.red);同样的password也要被设置为红色和“密码!〞的形式,因为用户名错误密码就更不用说了。 则回过头来前面流程中我们之所以设置器恢复默认的颜色就是在这里了,因为我们这次可能出现了问题,则颜色设置了红色并且不同的文字,则下次登录的时候如果还是现实密码错误等等之类的文字的话那就不太直观和人性化了,所以我们让这里默认重新设置一次,即使上次没有过这样的密码错误问题,则在初始化的同时也做了一次这样的操作,其实这样在程序优化上就可以有的操作了,当然,对于我们的小程序,这简短的操作还是可以忽略的。6.1.2密码修改模块图6-2密码修改模块密码修改的模块是在系统控制中心的文件菜单栏里进入的,进来之后,直接输入用户名和新的用户密码就可以修改的,这里为了减少繁琐就省去了检测原有密码的成分。只要输入的用户名正确,这里我们就可以用过我们的新密码直接修正成功。则修改之后,我们的系统会转入“登陆界面〞,这里将会实现重新登录,因为我们修改密码后系统所在的状态如果还是原有的密码状态下是不平安的,所以我们要重新登陆以确认密码的修改无误。如图6-2所示;6.1.3注册用户模块图6-3注册用户模块注册用户模块相对也是比拟直观和简单的。注册模块也是通过系统控制中心通过菜单栏的“注册用户〞进来的。输入用户名和密码,确认。前提是用户名不存在,如果用户名已经存在,则就会报错的,系统的提示就是“用户名已经存在,请更换用户名〞,所以就会再次清空用户名和密码,这时我们要做的就是更换用户名,并输入密码,确认,则数据库中就有了我们新的用户名信息,下次登录就可以直接使用了。如上图如图6-3注册用户模块所示: 6.1.4切换用户模块切换用户的原理就更简单了,其实我们只需要将我们当前的系统控制中心dispose()掉,然后重新new一个MainLoad那我们就实现了用户的切换,这时候其实就是相当于再输入一个其它的用户名和密码,那我们就登陆进了系统控制中心,那我们就已经完成了系统的用户切换。切换用户点击,直接登陆窗口,如图6.2.4切换用户模块。图6-4切换用户模块6.1.5添加客户信息端模块图6-5添加客户信息端模块添加客户信息端设计的文本框要多一些,但是这些还是统一的,所以相对而言也是比拟简易的。其实在添加模块的建立之前,系统就已经自动为我们好了数据库,这个是由类的构造方法最初调用的connect()方法。我们的信息将会在输入框过field方法nameField.getTe*t()获取到,同样地,我们还会利用insertintoinfvalues(",",",",",",")来插入数据到数据库,这时候我们的数据库将会检索我们的信息是否已经在数据库中存在,以及信息的数据长度和类型等等进展判断,如果是错误的将会相应的异常信息来提醒,如果正确的,就会直接添加到我们的数据库,这时候系统就已经添加成功了。不过在我们的系统界面中我们不能在第一时间就能看到新添加的数据信息,系统是不能够再次自动刷新系统的,所以我们添加了一个按钮“更新〞,其实这里更新不是更新软件系统,而是更新我们的数据信息,在我们添加信息后,我们可以通过“更新〞来实现信息的事实展现。如图6-5添加客户信息端模块。6.1.6最近生日模块图6-6最近生日模块 最近生日模块是由BirthInform.java实现的,其实该模块的调用是通过多种途径的,其中之一就是系统开启的第一时间就会有“最近生日〞模块自动弹出的,这样的设计就是方便我们的实时提醒。同时“最近生日〞模块还有在工具栏上有所表达,因为我们平常的开机后系统是自动运行的,不同的时间我们可能有兴致想要查看则可以通过“最近生日〞按钮直接点击查看;而另外一种方式就是自动间隔提醒了,可以设置几个小时提醒一次或者多久。系统进入之后通过最近生日,系统就会在数据库中检索最近3日生日的客户信息,最后返回到最近生日窗口中。6.1.7删除模块图6-7删除模块 删除模块更多的技术重点就是我们在列表中需要选中*一行数据,而选中的这行数据,在我们点击“删除〞按钮后就会被删除掉,所以我们就从table的相关方法入手了。introw=jt.getSelectedRow(),我们是通过该条语句获得的我们的系统行,获得的系统行,我们会通过数据库的检索来查询该行语句的相关容,然后再数据库中继续检索该条信息,并利用语句“deletefrominfwherename="andsale="〞实现对相关选中项信息的删除搜索,我们的判断条件是加上了“name〞和“sale〞两个字段属性,我们之所以用两个字段的目的就是为了防止同名的信息被误删除,所以该处我们用了两个字段。6.1.8搜索模块搜索模块的路径是有多条的,其中可以通过工具栏直接进入,当然也可以通过菜单栏。我们这里的搜索只需要输入我们要查找的客户,确认之后会通过系统连接数据库检索数据库中是否存在该,如果存在的话,则信息将会显示在我们的系统可控制中的列表中,假设此时我们搜索的是客户“际斌〞,则系统列表中将会展现有关客户“际斌〞的信息。如果我们所搜索的客户信息是不存在的,则同样的列表中也会展现,只是展现的容为空。如图6.2.7搜索模块:图6-8搜索模块6.1.9刷新模块图6-9刷新模块 系统中的数显模块主要为刷新我们的数据显示,因为我们有时候更新了数据,系统不能实时更新显示在我们的当前列表中,所以我们就要通过我们的手动操作来实现我们的数据更新操作。我们这里采用的方法也是比拟傻瓜式的,那就是新建一个类,这个类就是InSystem(),则系统就重新检索数据库了,所以我们这里的数据就一定会被显示出来的。操作很简单,直接点击工具栏上的“更新〞按钮即可实现系统显示数据的操作功能,此时我们可能会发现有两个系统类的窗口同时出现。6.2编码规6.2.1变量命名 变量名的命名我们都是采用首个单词利用小写,后面单词利用大写首字母的方式。这样的有利于更加直观地表现我们该个变量到底是用作在什么用的表现方式上。比方我们的logButton,其实我们可以通过Button知道我们的这个变量一定是一个按钮,而log就是登录的意思,则很显然,这个变量要操作的就是登录按钮。而在以上的代码中第一块中我们实现的是我们系统的登陆页面。登陆页面的变量有load,logButton,regButton,userTe*t,passTe*t,grant,userLabel,passLabel,sysLabel,authorLabel,timer,timer2,timer3,timer4;其中load我们是进度条的类别,我们用来检测系统的进度情况,进度条完成到100%,系统加载成功,则将会实现new一个新的InSystem实现系统控制中心的登陆操作。这里的label也是比拟有特色的,按照以往的定义Label就是规定的定义,并且不会有怎样特殊的变动,而这次在我们这里,我们的Label也会根据我们的相关条件和异常而变动,比方说当我们在输入用户名和密码的时候,我们可能会遇到密码或者用户名错误的情况,则为了更好地提示用户具体发生了什么,则我们会因用户名或密码错误而改变我们这里的Label变量,让它们在原有的文字或者颜色上发生了变动,比方“用户名〞会直接变成“用户名!〞,并且后者的颜色是红色的,而原有的是黑色。则在我们登陆成功以后,则我们的变量名还会回到原有的字体和颜色,这是不是很奇妙的哦。nameField,yearField,monthField,dayField,productField,sourceField以上关键词主要实现了我们的文本选框,同样的命名方式也是一样的,我们的添加客户信息框的信息就主要应用到了这里的相关变量信息。该段对应的相关变量分别为:、年-月-日、产品、客户来源和搭建成交易。系统中心构造方法publicInSystem(Stringsql){if(!sql.equals("select*frominf"))this.dispose();timer1=newTimer();now_timerTask1=newE*Timer1();timer1.schedule(now_timerTask1,60*1000,360*1000);connect();con.setLayout(newBorderLayout(0,1)); menuBar(); toolBar();area(sql);con.add(panel[0]); setTitle("客户信息管理系统——Albin.Sun"); setBounds(360,100,620,560); setDefaultCloseOperation(JFrame.E*IT_ON_CLOSE); setVisible(true); } 另外InSystem是我们系统管理中心一个至关重要的构造方法,该方法的加载是需要传递参数的,我们默认的参数是"select*frominf",如果不是该参数的话,则我们的系统再次将不会被加载。另外我们设置了定时器timer,timer的使用是为了我们“最近生日〞窗口的定时跳出而设置的。因为我们的系统会定时提醒我们的用户*一个客户就要生日了,也有可能会在无视掉,所以在我们开机的阶段中可以根据我们个人的习惯或配置来设计跳出的时间,1000为一秒,60*1000就是一分钟了,在这里这个60的参数其实是在第一次系统执行时该窗口在什么时间会跳出第一次,我们默认的设置就是1分钟了。而我们后面的360*1000其实为的就是我们系统的跳出时间间隔所设计的了,这里的360就是6分钟了。也就是说,在我们的系统运行后,我们的系统会根据最近生日情况在6分钟一个间隔不断地提醒,当然6分钟就有点频繁了,这里完全可以设置时间为几个小时,这样更利于我们的方便和操作。 connect()方法在这里就直接被应用起来了,系统在调用该构造方法的初始阶段我们就调用了connect()方法,也就是我们上面最初介绍的方法,则这个时候不出意外,我们的系统就与我们的db数据库建立了,后面如果需要,就可以随时使用了。 con.setLayout(newBorderLayout(0,1))设置我们的系统空中中心界面的布局模式,我们使用的BoderLayout。 紧接着我们的menuBar()就上场了,我们系统设置之初除了最后后台的工作外就是配置我们的前台界面了。因为我们的菜单栏的设置是在我们系统的最上端的,所以我们让我们的构造方法先调用了我们的menuBar()方法,系统调用menuBar()方法会在该方法中实现相应的菜单模式和属性,在这里就已经生成了我们的菜单栏,接下来呢,我们要操作的就是工具栏了。 工具栏就是我们的toolBar()方法了,该方法跟上面的menuBar()一样,在调用后就自动生成了我们的工具栏,其中我们的工具栏包括:〞添加〞,〞删除〞,〞保存〞,〞最近生日〞,〞搜索〞,〞退出〞和〞更新〞。其中我们可以介绍一下相应的功能,添加、删除和保存就不用介绍了。我们来简单地说一下我们的“最近生日〞、“搜索〞和我们的“更新〞功能。 最近生日是响应了一个事件,在我们该按钮被点击的时候,监听事件会相应的new一个新的类,而这个类就是我们的BirthInform,我们这个类的初始化就会直接检索我们最近3日生日的客户,如果存在,我们的BirthInform窗口将会列出相应的客户生日信息。如果该信息是不存在的,则我们的系统默认值是〞最近没有客户生日〞,我们这里的方法调用是这样实现的:newBirthInform(birthPeople),birthPeople的最初值是“最近没有客户生日〞,但是在new类BirthPeople的之前,我们事先对birthPeople=bo*Name+bo*Year+"-"+bo*Month+"-"+bo*Day+"\n"做了工作,如果bo*Name不存在,也就是我们最近没有过生日,则birthPeople=bo*Name+bo*Year+"-"+bo*Month+"-"+bo*Day+"\n"根本不会被执行,则birthPeople的默认值还是〞最近没有客户生日〞,所以在这里就实现了,如果存在则会显示,如果不存在,则会显示〞最近没有客户生日〞,这样就相比照拟人性化了。 搜索也是new一个新的类NameSearchInform,则在这里我们直接输入我们的,我们的系统将会在数据库中开场检索我们的是否存在,如果存在,我们的系统将会new一个新的InSystemn,而我们这个新的客户信息列表将会显示的是我们的刚刚搜索出的信息,如果搜索“际斌〞,则也就是会显示“际斌〞的相关信息了。同样地,如果我们的系统不存在所搜索的生日信息,则我们这个新的操作窗口列表也就是显示为空了。 更新实质上的宗旨就是刷新我们的数据显示,因为我们有时候更新了数据,系统不能实时更新显示在我们的当前列表中,所以我们就要通过我们的手动操作来实现我们的数据更新操作。我们这里采用的方法也是比拟傻瓜式的,那就是新建一个类,则系统就重新检索数据库了,所以我们这里的数据就一定会被显示出来的。 setTitle("客户信息管理系统——Albin.Sun")对我们的系统标题设置为"客户信息管理系统——Albin.Sun",这个设置是在系统初始化时,即在我们的构造方法中时出现的,如果其它情况下将不会有效了。 setBounds(360,100,620,560)设置我们的布局大小,其中左边开场的距离是360,上面的距离是100,另外我们的系统的界面大小是620*560,这里实现了我们的大小定义。 setDefaultCloseOperation(JFrame.E*IT_ON_CLOSE)当然也很明了了,在java窗口开发中如果缺乏了该条语句,我们的窗口通过右上角的关闭按钮是无常关闭的,所以我们会借用系统已经拥有的该方法来实现右上角关闭功能的生效,所以现在我们点击关闭按钮即可正常关闭窗口。 setVisible(true),系统可见的,如果是false的话,则理所当然,这个窗口也就不会被正常显示了。添加客户信息模块监听器publicvoidactionPerformed(ActionEvente){ if(e.getSource()==addButton){ if(nameField.getTe*t().equals("")){ nameField.setTe*t("尚未填写呢~"); nameField.setCaretColor(Color.red); }else{ try{ StringsqlIn="insertintoinfvalues(",",",",",",")"; PreparedStatementstmt=conn.prepareStatement(sqlIn); stmt.setString(1,nameField.getTe*t()); stmt.setString(2,yearField.getTe*t()); stmt.setString(3,monthField.getTe*t()); stmt.setString(4,dayField.getTe*t()); stmt.setString(5,productField.getTe*t()); stmt.setString(6,sourceField.getTe*t()); stmt.setString(7,saleField.getTe*t()); stmt.e*ecuteUpdate(); JOptionPane.showMessageDialog(this,"添加成功"); //super.dispose(); this.dispose();// this.dispose(); newInSystem("select*frominf"); }catch(SQLE*ceptione*){ e*.printStackTrace(); }catch(NumberFormatE*ceptione*){// JOptionPane.showMessageDialog(null,"添加失败"); } } }else this.dispose(); } actionPerformed方法使我们的监听器,监听器执行的开端首先要判断该事件的来源是哪里,所以我们if(e.getSource()==addButton)的目的就是为了判断事件来源是否为“添加〞按钮,如果判断正确的话我们将会执行下面的语句if(nameField.getTe*t().equals(""))这里是为了判断我们的客户名是否为空,如果没有填写的话,我们的nameField的文本信息将会显示“尚未填写呢~〞,其实这里的目的就是为了提示用户没有填写客户名,因为客户名是所必需的,并且我们还有设置了nameField为红色。其它情况下我们默认都是正确的,我们执行StringsqlIn="insertintoinfvalues(",",",",",",")"和PreparedStatementstmt=conn.prepareStatement(sqlIn),其实我们这里就是要插入信息,而问号的容就在后面通过stmt.setString(2,yearField.getTe*t())这样的设置,有几个问号就设置到了几个,最后通过stmt.e*ecuteUpdate()开场执行插入操作,这个时候会有添加成功的提示,添加成功后我们希望在一个新的列表中能够显示我们刚刚添加的客户信息,所以这里我们new了一个新的InSystem("select*frominf");如果我们的添加过程中遇到了异常信息,很显然就是添加失败的,我们的通过JOptionPane.showMessageDialog(null,"添加失败")提示错误信息。6.2.4KeyEvent.VK_ENTER的使用 系统的设计我们都依赖于鼠标的操作和执行命令的下达,而我们的实际生活中可能会更多应用键盘来操作,因为当我们在进展键盘操作的时候我们不习惯再去拿起鼠标和放下鼠标继续键盘这样的操作,所以在我们的软件系统中,我们在很多模块中就已经参加了回车执行以上命令的操作。 其实参加“Enter〞执行的模块包括如下:登陆按钮、添加客户按钮和搜索客户信息按钮。我们的Enter操作是建立在该模块最终选框的事件之上的,现在举例说明如下: 在我们的登陆模块中,我们输入完用户名就是密码了,密码之后就是确认登陆的按钮,则我们就在密码这个文本框上做工作,添加了密码.addKeyListener(newKeyAdapter(),添加这个监听器后,我们在这里面添加了一个新的方法叫做publicvoidkeyPressed(KeyEvente),这个方法就是用来坚硬回车键的操作,则监听到的按键将会被e.getKeyCode()获取,然后与我们的系统回车键,也就是KeyEvent.VK_ENTER来做比拟,if(e.getKeyCode()==KeyEvent.VK_ENTER)也就是说明我们当前的操作键是“Enter〞,好了,我们将会执行这样的操作,logButton.doClick()。logButton是我们的登陆按钮,通过doClick()方法实现了我们的登陆按钮的自动点击,言外之意就是说明我们按下回车键的操作就相当于用鼠标点击了我们的logButton,所以回车执行我们的操作。 添加客户按钮的回车操作,我们是在saleField 文本框中添加了addKeyListener(newKeyAdapter(),同样地操作,添加这个监听器后,我们在这里面添加了一个新的方法叫做publicvoidkeyPressed(KeyEvente),这个方法就是用来坚硬回车键的操作,则监听到的按键将会被e.getKeyCode()获取,然后与我们的系统回车键,也就是KeyEvent.VK_ENTER来做比拟,if(e.getKeyCode()==KeyEvent.VK_ENTER)也就是说明我们当前的操作键是“Enter〞,好了,我们将会执行这样的操作,addButton.doClick()。 搜索客户信息的search,我们是在nameField文本框中添加了addKeyListener(newKeyAdapter(),同样地操作,添加这个监听器后,我们在这里面添加了一个新的方法叫做publicvoidkeyPressed(KeyEvente),这个方法就是用来坚硬回车键的操作,则监听到的按键将会被e.getKeyCode()获取,然后与我们的系统回车键,也就是KeyEvent.VK_ENTER来做比拟,if(e.getKeyCode()==KeyEvent.VK_ENTER)也就是说明我们当前的操作键是“Enter〞,好了,我们将会执行这样的操作,searchButton.doClick()。6.2.5关于getLayeredPane()方法的使用 我们在大局部你学习和教程中更多地接触到的或许是getContentPane()方法,ContentPane应该是最简易的一种获取当前面板的方式了,不过大多情况下如果我们需要在我们面板上参加背景再参加控件可能就无法实现了,那是因为我们是在同一个层次上添加的,一个层次上一个面板上如果背景已经够大了再添加其它的肯定是看不到的,所以我们就引入了多层次面板。即可以利用getLayeredPane()来获取到了。具体实现方法如下: 这里我们通过getLayeredPane()添加(logButton),然后继续通过getLayeredPane()添加(backlabel),其实这里是之前已经定义好的ImageIc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 船闸课程设计地板计算
- 中医执业医师考试-中医基础理论练习题
- 职业体验课程设计与实施
- 药物新剂型与新技术课程讲稿2
- 药店销售活动课程设计
- 群桩计算 课程设计
- 自动扫雷课程设计
- 物业管理行业采购工作总结
- 2024年秋季学期新人教版地理七年级上册课件 第三章 陆地和海洋 3.3 海陆的变迁
- 美容美发行业前台接待总结
- 反思单元 沈括的“海陆变迁”说(习题教学设计)2023-2024学年三年级上册科学(大象版 河南专用)
- 2023-2024届高考语文复习-阅读与训练主题+工匠精神(含答案)
- 装表接电培训课件
- 新苏教版五年级上册科学全册期末复习知识点(彩版)
- 部编版小学一年级上册道德与法治教学设计(第三、第四单元)
- CJJT 164-2011 盾构隧道管片质量检测技术标准
- 2023年甘肃省定西市中考政治真题 (含解析)
- 中医科诊疗指南及技术操作规范学习试题
- 胃肠减压的护理措施要点课件
- 6.2《青纱帐-甘蔗林》教学设计-【中职专用】高一语文(高教版2023·基础模块下册)
- 25王戎不取道旁李公开课一等奖创新教学设计
评论
0/150
提交评论