Bootstrap

药品管理系统

目录

第一章  概述

1.1  系统开发背景和意义

1.2  开发环境

第二章  需求分析

2.1  任务概述

2.2  功能需求

2.3  性能需求 7

2.4  数据描述(数据流图+数据字典) 8

第三章  系统总体设计 14

3.1  业务流程 14

3.2  系统功能模块图 14

3.3  系统流程图 16

第四章  详细设计 18

4.1  程序流程图 18

4.2  程序输入输出描述 23

4.2.1  用户管理模块 23

4.2.2  职员管理模块 23

4.2.3  销售管理模块 23

4.2.4  进货管理模块 23

4.2.5  货存转移模块 23

4.2.6  财务信息模块 23

4.3  数据库的设计 24

4.3.1  数据库的概念结构设计和ER 24

4.3.2  数据库的逻辑设计 26

4.3.3  数据库的物理设计 27

第五章  编码实现

5.1  用户登陆模块

5.2  用户管理模块

5.3  销售管理模块 37

5.4  进货管理模块 39

5.5  职员管理模块 43

5.6  坏货转移模块 45

第六章  测试分析报告 47

6.1  什么是软件测试

6.2 软件测试的目的

6.3  测试计划和要点

6.3.1  药品以及药品管理模块测试要点

6.3.2  销售管理测试要点

6.3.3  进货管理测试要点

6.3.4  职工信息测试要点 46

6.4  部分测试图

6.5  测试结论

总结

参考文献 51

附录:部分程序代码 52

摘要

大家只要看了新闻,就可以了解到21世纪是信息的世纪,信息化正以极快的速度取代传统的效率低下的人工作业。随着小型计算机,微型计算机的成本的不断下降,性能的不断提升,使得计算机作为当今最重要的信息产品,成为人民大众必不可缺的工具。计算机技术已经广泛应用于日常办公,企业管理,文字处理、电子报表以及进行简单的人事管理、财务管理等,大大提高了我们的工作效率,节省许多资源,使管理更加规范化,系统化,科学化。

目前随着计算机技术的发展和普及,各行各业的管理机构开始使用计算机处理大量信息。在我国药品品种繁多,规模甚大,以往的手工记载、查询操作容易出错且工作效率低,已经不能适应时代发展的要求,从管理的角度来看,对管理者会造成诸多的不便,还有可能疏忽一些细节,让不法商家逃脱罪责。所以,市场迫切需要一款简单实用的药品管理系统。 

经过前期的调研,在反复的修改和综合考量后,笔者觉定使用JAVA SWING技术,ECLIPSE J2SE 开发平台,MYSQL5.0数据库开发药品管理系统。药品管理系统的设计理念是,让企业能够拥有更高效的管理工具,使企业在21世纪异常激烈的竞争中脱颖而出。国外的管理系统有许多优秀的经验,但是并不完全符合我国的国情,我国的最广大药品销售的企业是分布在全国各地的中小型销售企业。所以,此次开发的药品管理系统功能乃是汲取了外国优秀管理工具的优秀功能,同时又创新了更符合我国用户需求的功能的一个综合信息管理系统。药品管理系统分为五大模块,分别为系统用户模块,职工信息管理模块,进货管理模块,销售管理模块,库存转移管理模块。该五大功能模块设计合理,功能全面,同时界面友好,非常符合我国各大小型药品销售企业的管理需求。但由于时间仓促以及笔者找工作实习的原因,系统还不是很完善,和市场上一些成熟的产品比较仍然有不足之处。今后笔者将利用工作休息时间,学习新的技术和设计理念,对药品管理系统进行深入的二次迭代开发,目标是在今后三个月使代码更加规范,界面更加美观,程序的可拓展性进一步增强,更加与市场接轨,然后发布到China Java World上开源供大家免费下载使用和学习。

关键词:JAVA SWING、MYSQL5.0、JDBC、药品管理管理系统、药品管理


Abstract

If you see the news, they can understand the 21st century is the century of information, Information technology is with great speed instead of traditional inefficient artificially assignments. With small computer, microcomputer cost of declining, performance, makes the computer as the most important information product, become indispensable for the masses of tools. Computer technology has been widely used in daily office, enterprise management, word processing, spreadsheets and simple personnel management, financial management, and greatly improve our work efficiency, saving many resources, make management standardization, systematization, more scientific.       

Now with the development of computer technology and popularization of the management institution, tencent started using computer processing of information. In our country, the great variety of scale, past records, query operation manual and low working efficiency error-prone, already can not adapt to the development of The Times, from management point of view, the manager will cause many inconvenience, there may be some details, let the illegal businessmen to escape. Therefore, a simple and practical drug management system is very much in line with the needs of the market.

Through the research on the modification, and comprehensive considerations repeatedly, the author determined after use JAVA SWING technology, MYSQL5.0 ECLIPSE J2SE JAVA development platform, the drug administration system database development. Drug management system is designed, make enterprise can have more efficient management tools, enterprise in the 21st century the fierce competition. Foreign management system has many excellent experience, but not completely accord with the national condition of our country, China's vast drug sales enterprise is distributed in the small and medium-sized enterprises nationwide sales. Therefore, the development of medicine management system function is absorbed foreign outstanding management tools and excellent function, the innovation of our customers demand more accord with a comprehensive functions of information management system. Drug management system is divided into five modules, respectively, the worker system user information management module, stock management module, modules, stock transfer sales management module management module. The five function module design is reasonable, comprehensive functions, and friendly interface, very large pharmaceutical sales in conformity with the requirements of the enterprise management. But due to lack of time and the practice of the job, system is not perfect, and some mature products on the market is still has some shortcomings. Future work will use the rest time, learning new technology and design concept of drug administration system, further development iteration, the second goal in the next three months are more standard code, the interface of the program can be more beautiful, expanding further strengthens, more with market, and then released to the China open for World Java on learning and using free download.

Key words:Java Swing、Mysql5.5、JDBC、MedMgrSystem、Medicine sales&mgr


 


  第一章 概述

如何利用现代信息技术使企业拥有快速、高效的市场反映能力和高度的效率,已是医药经营企业,特别是医药连锁经营企业特别关心的问题。尽快建立一个功能齐备的药品进、出库管理系统,完善现代企业的信息化管理机制,已成为医药企业生存发展的当务之急。通过开发这个药品管理系统,使药品进销存管理工作系统化,规范化,自动化,从而达到提高管理效率的目的。本系统开发设计思想是实现药品管理的数字化。

尽量采用现有软硬件环境,及先进的管理系统开发方案,提高系统开发水平和应用效果的目的。系统应符合企业管理的规定,满足日常管理的需要,并达到操作过程中的直观、方便、实用、安全等要求,系统采用模块化程序设计方法,这样既便于系统功能的各种组合,又便于未参与开发的技术维护人员补充,维护。系统应具备数据库维护功能,及时根据用户需求进行数据的添加,删除,修改等操作。

1.1  系统开发背景和意义

此次毕业设计的选题是由我校计算机学院统一选题。本次的毕业设计是一个可以充分地锻炼自己的动手实践能力以及考核四年大学所学知识的积累的机会。针对我的实际情况,结合四年来对计算机软件的熟练程度以及对数据库的了解,经过与指导老师以及小组成员的协商,我选择了药品管理系统软件设计与开发这个课题。这是一个属于实际的课题,如果顺利,我们所设计的药品管理系统将实际应用到中国最广大的售药系统中去,对于初涉社会的我们来说,无疑是一个非常好地锻炼机会。考虑到该系统属于一个规模较大、较为复杂的数据库系统,对计算机的性能要求较高,决定使用MyEclipse7.0开发此系统。

此次毕业设计选题范围是相当广泛且实用的,含盖了目前大部分计算机软件类开发的课题,给我们很大的自由发展的空间。可以每个学生挑选出最合适的课题,更适合同学们的兴趣和价值取向。选择此课题对我来说有着不同的意义,应该来说此课题更接近于实际开发的全过程。同时对编程、数据库调用、结构化查询语言STRUCTURED QUERY LANGUAGE等方面是一个比较综合的考验。让我在此过程中得到很好的锻炼。

随着医疗制度改革的进行,药品招标采购的逐年规范和扩大,药品管理已经成为药剂科乃至整个医院管理的重要内容。传统的管理模式已经跟不上顾客对快节奏生活的要求了!随着计算机的普及和计算机软件的不断发展,越来越多的医疗机构开始注视计算机这个辅助工具为自己带来的效益了。医院的售药机构需要通过计算机提高自已工作效率、对药品实现进销存管理和职工管理,提高经济效益

本次毕业设计我们秉承良好的治学之风,除了严格按照毕业设计进度表来安排我的设计情况,同时加强我与指导李老师联系和交流。同时这是一个面向实际应用的课题,和基础调研更是尤为显得重要,为最终能够成为一个成功的案例而努力。

 1.2  开发环境

开发环境的选择会影响到数据库的设计,所以在这里给出图书管理系统开发与运行环境的选择如下:

开发环境:Window 7 旗舰版

开发工具:MyEclipse7.0

数据库版本: MySql 5.0.87

数据库引擎: MyISAM

第二章  需求分析

 2.1  任务概述

药品管理系统是为了加强药品管理,以便更好地对药品进行监督和管理,对售药机构人员的工作,起到了高效性、准确性管理而开发。本系统主要包含系统用户管理模块、药品管理模块、销售管理模块、进货管理模块、存货转移管理模块。药品管理系统是以合理、全面、准确的药品编码体系为基础,提供了对药品数量、金额、有效期的全面管理,统一的药价管理机制规范了药品的价格。系统能随时提供药库的库存、药品流向和消耗,还能根据现有库存,药品有效期提供采购计划或应暂停采购的药品清单,以提高资金的利用率,避免不必要的损失,方便快捷的途径对药基本信息进行定期的更新和删除等管理。

2.2  功能需求

功能划分

药品管理系统分为系统用户管理、药品销售管理、药品库存管理、进货管理、职工管理、查询与报表分析。

功能描述

(1)系统用户管理:允许添加删除用户(只有管理员才可以修改),任意权限的用户允许更改自己的密码,添加或删除职工,修改职工,对药品进行销售和库存的控制的资料。

(2) 药品进货管理:当企业需要增加新的销售药品时,利用此模块可以添加新的药品信息,删除旧的药品信息,修改已存在的药品信息,提供所有与药品相关的各类信息,初始化库存,初始化供应商相关信息。

(3)药品销售管理:药品统一的价格销售,对已查询销售单,可以对药品的价格进行控制。

(4)库存转移管理:实际生活中容易发生药品过期和损毁,此时利用此模块对过期的药品和损毁的药品进行清理。

(6)职工管理:  对药品企业进行职工的管理,对职工进行增加,修改,删除,查询等操作。

(7)查询与报表分析:此功能并未单独作为一个模块,而是分布在各个模块中,各个模块产生业务时,可以在各模块的相应功能按钮上选择查询。

2.3  性能需求

为了保证系统能够长期、安全、稳定、可靠、高效的运行,药品管理系统应该满足以下的性能需求:

1、系统处理的准确性和及时性

系统处理的准确性和及时性是系统的必要性能。在系统设计和开发过程中,要充分考虑系统当前和将来可能承受的工作量,使系统的处理能力和响应时间能够满足学校对信息处理的需求。

2、系统的开放性和系统的可扩充性

药品管理系统在开发过程中,应该充分考虑以后的可扩充性。例如用户查询的需求也会不断的更新和完善。所有这些,都要求系统提供足够的手段进行功能的调整和扩充。而要实现这一点,应通过系统的开放性来完成,既系统应是一个开放系统,只要符合一定的规范,可以简单的加入和减少系统的模块,配置系统的硬件。通过软件的修补、替换完成系统的升级和更新换代。

3、系统的易用性和易维护性

图书管理系统是直接面对使用人员的,而使用人员往往对计算机并不时非常熟悉。这就要求系统能够提供良好的用户接口,易用的人机交互界面。要实现这一点,就要求系统应该尽量使用用户熟悉的术语和中文信息的界面;针对用户可能出现的使用问题,要提供足够的在线帮助,缩短用户对系统熟悉的过程。

4、系统的标准性

系统在设计开发使用过程中都要涉及到很多计算机硬件、软件。所有这些都要符合主流国际、国家和行业标准。

5、系统的先进性

目前计算系统的技术发展相当快,做为药品管理系统工程,在系统的生命周期尽量做到系统的先进,充分完成企业信息处理的要求而不至于落后。这一方面通过系统的开放性和可扩充性,不断改善系统的功能完成。另一方面,在系统设计和开发的过程中,应在考虑成本的基础上尽量采用当前主流并先进且有良好发展前途的产品。

6、系统的响应速度

药品管理系统系统在日常处理中的响应速度为秒级,达到实时要求,以及时反馈信息。在进行统计分析时,根据所需数据量的不同而从秒级到分钟级,原则是保证操作人员不会因为速度问题而影响工作效率。

2.4  数据描述(数据流图+数据字典)

经过调研,我们发现,一个药店最基本的工作流程是进货和销售。消费者选择药店进行购物,药店通过我们的药店管理系统进行药品的销售及销售后的库存整理。流程简介:

2.4.1 要求

A.为每种药品设置编号,输入药品的信息,以便于管理人员对药品进行管理,也便于核对修改

B.为职工设置库,便于操作员对职工进行管理

C.为供货商设置库,便于操作员及时与供货商联系货源

D.设置系统权限

E.药品价格分为进货价、零售价和批发价

2.4.2 目标

A.使药品销售的信息能及时得到统计、查询

B.方便操作员的操作,达到简单、易用的效果

C.提高操作员的工作效率

D.提高操作的正确率

E.提高系统的可靠性及安全性

图2.1 药品管理系统基本流程

以上便是我们这个药品管理系统的总体数据流程图,通过上述的这幅图片,我们可以清楚地了解到该系统的大致情况,有两个数据源/终点,分别是客户、用户。而该系统进一步地功能显示在下图中可以得到解释。

图2.2  管理人员的数据流图

销售人员通过输入药品编号,查出系统中存在的药品,通过医生看病以及配药,考虑所售药品的价格,将病人所要购买的药品列入药品清单中,最后的销售入库存系统将此次的交易数据保存到数据库中,最终完成交易,将药品交给病人手中。

经过对数据流程分析,提示出现行系统具有4个主要模块:药品信息系统、药品库存管理系统、供应商管理系统、药品销售系统。通过它们我们的药品管理系统才成为了一个能够成功的软件。

首先是药品信息系统:在这个模块中由用户或管理员输入所有药品的基本信息即药品的初始化。

第二个是药品库存管理系统:在这里这个系统有两个功能,一是查出现有药库中的所有过期药品,更新现有的数据库;二是实现药品入库,避免药品空缺造成的销售问题。

第三个是供应商管理系统:供应商是药品进货时,从何处购得的一种记录方法,通过供应商可以方便的再次进货。

最后一个是药品销售系统:在这个模块中,管理人员可以很方便地对销售情况进行查看,显示当天的销售金额并备份所有的数据库表。

药品管理系统与3个外部实体有关:顾客、药房销售人员和系统管理员。其中系统管理人员拥有所有信息资料添加、删除和修改的权限,而药房销售人员只具有普通权限不能对信息资料做任何的删除操作。以上只是整个系统的总体流程,大概显示了一次一个用户完整交易的全部过程。在这里我们还要对这个数据流程进行进一步详细的分解。

图2.3  消费者的数据流图

消费者通过选购,选购好合适的药品,到管理者处登记结账,发生销售管理。管理者通过药品编号,录入系统需要销售的数量,系统生成仓库中是否有足够的药品。发生销售之后产生销售单和销售金额,消费者付款拿货。销售管理完成。

当消费者发现购买的药品不符合要求,管理者在认真核实之后,予以退款,发生退货。此时管理者要在系统的坏货转移中,将不合格药品转移到不合格仓库中。

图2.4  系统数据流图

图2.5  详细数据流图

2.4.3  数据字典

数据流项目:

1.名字:用户信息(admin)

别名:无

流量:每天上十次

来源:用户基本信息表

去向:核对用户信息

定义:用户信息=用户名+用户密码+权限

2.名字:药品信息

别名:无

流量:每天上十次

来源:药品表

去向:核对药品库存初始化、核对出库信息、核对入库信息

定义:药品信息=药品编号 + 药品名称 + 药品建成 + 药品规格 + 药品产地 + 批号 +进价 + 批发价 + 零售价 + 供应商 + 类别 + 有效期 + 备注.

3.名字:库存信息

别名:无

流量:每天上十次

来源:库存表

去向:核对药品库存查询、核对进货单、核对销售单

定义:库存信息=ID + 药品编号 + 药品名称+供应商编号 + 单价 + 数量 + 入库日期 + 仓库类别.

4.名字:供应商信息

别名:无

流量:每天上十次

来源:供应商表

去向:反馈给用户,核对进货单

定义:供应商信息=ID+供货商编号+供货商名+地区+备注

5.名字:销售单单信息

别名:无

流量:每天上十次

来源:销售单单表

去向:反馈给用户

定义:销售单信息=ID+药品编号 + 药品名称 + 数量 + 销售日期 + 销售数量 + 销售收入

2.4.4 存储条目:

1.文件名:用户基本信息表

别名:无

存储方式:随机存储

存储频率:每天上十次

定义:用户基本信息表=用户名+用户密码 + 权限

2.文件名:药品表

别名:无

存储方式:随机存储

存储频率:每天上十次

定义:药品表=药品编号 + 药品名称 + 药品建成 + 药品规格 + 药品产地 + 批号 +进价 + 批发价 + 零售价 + 供应商 + 类别 + 有效期 + 备注.

3.数据项条目:

项名:药品类型

别名:无

描述:用户输入试题的类型

定义:药品类型=所有药品规定类型

位置:药品表

4.处理条目:

1.处理名:药品添加

处理逻辑:用户添加药品信息

执行频率:每天上十次

2.处理名:库存初始化

处理逻辑:用户初始化药品库存表

执行频率:进货上十次

3.处理名:入库

处理逻辑:用户添加进货单

执行频率:每天上十次

4.处理名:销售

处理逻辑:用户添加销售单

执行频率:每天上十次

第三章  系统总体设计

3.1  业务流程

根据需求分析的得到的现行业务处理流程,在用户反复研究后,首先确定目标系统的业务流程,其处理流程如图3.1。

登陆                        合法用户

登记后的

药品

退出登陆

图3.1  药品管理系统的业务流程

针对业务流程,现具体描述其功能如下:

1.用户登录:系统对用户合法性进行检查。

2.药品入库:对新购进的药品分类进行编号,并把药品基本信息录入计算机。

3.药品销售:对已入库的药品,销售人员可以进行销售。

4.药品进货:对已入库的药品,管理人员可以进行货存控制。

5.存货转移:对于已经过期或者损坏的药品,可以进行处理。

6.信息查询:对药品的各种变动情况的查询。

7.职员管理:对药店的职工进行管理。

3.2  系统功能模块图

药品管理系统模块是用JAVA SWING进行设计,MYSQL作为后台数据库管理系统。

系统管理模块分为用户登进货管理、销售管理、职工管理和坏货转移用户管理模块主要是新增用户,修改用户,查询用户,删除用户;进货管理模块主要有供应商创始,进货,进货单查询,药品创始;销售管理模块主要有销售,修改价目表,销售单查询;职工管理有添加职工,处理职工

系统体系结构框图如下图:

图3.2 药品管理系统功能模块图


3.3  系统流程图

依据软件工程的基本原理,综合以上分析给出系统流程图如图3.4所示。

图3.2 系统的处理流程图              

  

说明: 用户通过登陆界面登陆系统时,第一次使用系统时需要进行药品的创始,即将各个药品的详细信息依次录入系统,第一次使用系统时同样要初始化库存,将现有的药品情况录入系统,接下来通过进货模块进行进货,进货时要为每一个供应商进行供应商创始,当发生销售时销售药品,并对库存进行相应的出来,退出时推出系统。

第四章  详细设计

4.1  程序流程图

依据软件工程的基本原理,详细设计阶段的根本任务是确定应该怎样具体实现所要求的系统,也就是说,经过这个阶段的设计工作,应该得出对目标系统的精确描述,从而在系统实现阶段可以把这个描述直接翻译成用某种程序设计语言书写的程序。具体来说就是把经过总体设计得到的各个模块详细的加以描述。

本系统采用支持面向对象的Eclipse作为开发工具,运用了J2SE的SWing的技术,更加的方便了程序员的工作。程序对系统配置要求较高。在此给出软件系统的主要模块,如图4.1所示。

图4.1 主程序模块图

   根据以上主程序的模块图,我们可以得出下面的关于各个模块的程序流程图,如图4.2所示。

图4.2 总体流程图

说明:用户登陆系统时,系统判断用户的级别,如果为系统管理员,则可以进行用户的用户管理,如果是管理员,则可以进行相应的销售管理,进货管理,坏货转移,职工管理,管理员点击退出按钮时,退出系统。

      失败

操作成功

成功

图4.3 用户登陆流程

说明:用户根据已知的用户名和密码登录系统,只有登录成功才能进行系列的用户管理、库存管理、销售管理,职工管理的操作。

登陆

录入药品

失败

 成功

成功

图4.4 药品创始流程

登陆

输入库存

操作成功

操作失败

成功

图4.5 存货创始流程

     登陆

操作失败                     销售单录入

操作成功

成功

图4.6 销售流程

       登陆

             录入坏货信息

操作失败

操作成功

        成功

图4.7  坏货转移流程

说明:用户登陆后进行药品的相关管理,通过药品创始,为系统初始化一些药品及添加新的代售药品。通过存货创始将具体进货的药品录入库存中,销售成功则对库存做相应的修改。当药品损坏或者过期时,应当对库存做相应的调整。

用户

登陆

录入职员信息

操作成功

成功

失败

图4.7 职员管理

说明:管理员通过职工管理模块进行职工的管理,添加职工后,录入到职员列表中。

4.2  程序输入输出描述

4.2.1  用户登陆模块

1.输入项目:输入用户名及密码。

2.输出项目:打开系统。

4.2.2  用户管理模块

1.输入项目:与用户相关的所有信息。

2.输出项目:操作结果的显示,出错弹出对话框。

4.2.3  销售管理模块

1.输入项目:选择药品编号,药品的进销价格。

2.输出项目:操作结果的显示,出错弹出对话框。

4.2.4  进货管理模块

1.进货项目:供应商的详细信息,仓库的详细信息,药品的数量。

2.输出项目:药品的有关资料的显示,进货单列表

4.2.5  坏货管理模块

1.输入项目:发生意外无法使用的药品编号。

2.输出项目:操作结果的显示。

4.2.6  职工管理模块

1.输入项目:职工的详细信息。

2.输出项目:根据用户的输入显示相应的结果。


4.3  数据库的设计

4.3.1  数据库的概念结构设计和ER图

在需求分析阶段已完成该系统所有的数据分析。根据该阶段所建立的概念模型,已经得出满足系统设计要求的几个关系描述,该阶段的主要工作就是把前一阶段的成果转化为具体的数据库。

概念结构设计就是要找出实体和他们之间的联系,去除非本质的东西。

实体是名词,在ER 图中设计中就是所说的表。比如“药品”,“库存”。

行为是动词,在ER 图中设计时一般不考虑行为,它是业务逻辑,在详细设计才有设计,是方法。比如 “销售”,“进货”等等。

    在设计ER图时时强调的是不同实体之间关系,不是行为。比如:药品 "销售" 库存,“转移”是一种关系,不是行为。在某种情况下,“销售”是一个关系表,将“药品”和“库存”联系起来。

    在找出实体后,我们要根据分析来定义实体的属性,就是表的列。比如药品有ID,名称,进价,销价,简介等等; 库存有ID,名称,数量等等。

   “库存”可拥有 0-MANY 的“药品”,而药品同样属于0-MANY 的库存。所以是多对多的关系

根据以上的分析给出下面的概念结构设计得E-R图如图4.3所示。

图4.8 用户E-R图

                                

图4.9 药品E-R图

        

图4.10 供应商E-R图

                                

图4.11 库存E-R图

图4.12 供应商E-R图

图4.12 职员E-R图

n

1

m

m

n

n

n

1

图4.13 实体联系E-R图

4.3.2  数据库的逻辑设计

药品管理管理系统主要涉及到4个表,即:药品信息表、药品入库表、药品出库表和库存表。

药品信息表:这张表是用来存储药品信息的。药品添加以后它的信息就会储存到这张表中,其中包含:药品编号药品名称化学名称、规格、药品类别、剂型、批号及厂商。其中药品编号是主键,非空且唯一。其余信息可以为空,并在数据表建立的时候给他们相应的规定好数据类型。

药品入库表:这张表是用来存储入库表单信息的,所有入库单信息都包含在这张表中。包括:入库单号药品编号批号入库日期、有效日期、进价、预售价、数量、整量单位、散量单位及验收人。其中入库单号是主键,非空且唯一。

药品出库表:这张表是用来存储出库表单信息的,所有出库信息都包含在这张表单中。它的字段有:出库单号、药品编号、批号、数量、出库日期及验收人。其中出库单号是主键,非空且唯一。

药品库存表:这张表是用来存储库存信息的,所有初始化的库存信息和出库入库信息改变后的信息都会被记录下来。它字段有:库存号、药品编号、批号、药品名称、数量、整量单位、散量单位、入库日期、有效日期、进价、预售价、库存下限及验收人。

4.3.3  数据库的物理设计

    数据库设计有几个范式,一般我们要做到的是第三范式,即数据表中没有冗余字段以及同一个表中的字段没有函数依赖关系,冗余字段即在一个表中已经保存过的信息,在另一个表中就不应该存在,如果需要的话,可以通过表间的关联来得到,函数依赖性就是一个表中的字段间不应该有计算关系,如一个表中有单价字段、数量字段,就不应该有一个总金额字段。如果程序运行过程中需要总金额,可以实时计算。不过在一些较常用的表中,我们可以适当地保留冗余字段,这样,在程序运行过程中可以减少由于表间互相关联而使用速度降低等问题。这就是所谓的第四范式。数据表设计时,最好不要使用用户输入的信息作为主键,每一个数据表自己定义一个主键,添加信息是由程序自动添加,这样就可以减少数据更新时产生的错误。表与表相关联的外键最好是由程序自动生成的主键,这样数据库就比较规范了。另外,数据表设计时一般都应该有一些标志字段,标志字段可以定义成CHAR(1)或BIT型。建议实际应用中定义成CHAR(1)字段可以存储多种可能的状态,在最初设计时,可能我们没有考虑到的一些情况,在程序后来的开发中,可以通过设计标志字段为不同的 值来解决,这样就避免了修改数据库结构。

    数据库初期设计时一定要谨慎,把所有可能的情况都考虑进去,即使当时没有用到,也要将它留在数据库中作为备用字段以便将来扩充。

    程序一旦开始编码,就应该尽量避免再修改数据库。因为如果数据库结构一旦改变,所有与修改的数据表相关的业务都有可能受到影响,而某些影响还很难看到,这样就容易形成一个恶性循环。错误越改越多,越改越乱,最终导致程序的失败。PB的数据窗口与其他语言的数据控件不一样,它的很多东西是预编译的。即使你一个模块已经调试无误,但只要数据库结构改动。相应的模块就一定要重新修改,否则一定会出问题。

药品管理系统数据库中各个表的设计结果如下面几个表格所示。每个表格表示为数据库中的一个表。

表4.14 药品信息表

Medicine

列名

数据类型

允许空值

默认值

描述

mid(PK)

Varchar(8)

N

药品编号

mname

Varchar(40)

N

药品名称

mshortname

Varchar(10)

Y

药品建成

mnors

Varchar(4)

N

规格

marea

Varchar(40)

N

药品产地

mlot

Varchar(10)

N

批号

minpri

float

N

0

进价

mwpri

float

N

0

批发价

mpri

float

N

0

零售价

Mcon

Varchar(8)

N

供应商

Mcate

Varchar(20)

N

类别

Musetime

decimal(10,0)

N

有效期

memo

Varchar(40)

Y

备注

表4.15 用户表

User

列名

数据类型

允许空值

默认值

描述

Username(PK)

Varchar(20)

N

用户名

password

Varchar(8)

N

密码

rank

int

N

1

权限

表4.16 供应商表

Supplier

列名

数据类型

允许空值

默认值

描述

spid(PK)

Varchar(8)

N

供应商编号

spname

Varchar(8)

N

供应商名

Sparea

Varchar(8)

N

地区

Spmeno

Varchar(40)

Y

备注

表4.17 销售单表

SalesOrder

列名

数据类型

允许空值

默认值

描述

Soid(PK)

Varchar(8)

N

销售单编号

mid

Varchar(8)

N

药品编号

Mname

Varchar(40)

N

药品名

Snum

int

N

0

数量

price

double

N

0

单价

表4.18 职工表

Staff

列名

数据类型

允许空值

默认值

描述

Staffid(PK)

Varchar(8)

N

职工编号

staffname

Varchar(20)

N

职工名称

Staffsex

varchar(2)

N

性别

stafftel

varchar(12)

N

电话

staffadd

varchar(40)

Y

地址

Staffcard

varchar(40)

N

身份证

staffzip

varchar(6)

Y

备注

表4.19 货存表

Stock

列名

数据类型

允许空值

默认值

描述

Mid(PK)

Varchar(8)

N

职工编号

mname

Varchar(20)

N

职工名称

mprice

float

N

性别

mnum

int

N

电话

spid

varchar(8)

Y

地址

time

datetime

N

身份证

status

int

N

存货类别

第五章  编码实现

5.1  用户登陆模块

用户登陆界面如图5.1所示

图5.1药品登陆界面

关键代码如下:

//显示出图形界面,Login.java

        public Login(String msg) {

super(msg);

setLayout(new BorderLayout());

login_message = new JTextField("用户登陆");

login_message.setEditable(false);

login = new JButton("登陆");

regeist = new JButton("注册");

setVisible(true);

add(login_message,"North");

JPanel btn = new JPanel();

btn.setLayout(new GridLayout(1,2));

btn.add(login);

btn.add(regeist);

add(btn,"South");

JPanel input = new JPanel();

JLabel unameLabel = new JLabel("用户名:");

uname = new JTextField("",20);

JLabel pwdLabel = new JLabel("密    码 :");

pwd = new JPasswordField("",20);

input.setLayout(new GridLayout(2,2));

input.add(unameLabel);

input.add(uname);

input.add(pwdLabel);

input.add(pwd);

add(input,"Center");

login.addActionListener(new loginListener());

regeist.addActionListener(new regeistListener());

}

class loginListener implements ActionListener {

public void actionPerformed(ActionEvent event) {

UserDao ud = new UserDao();

if(ud.login(uname.getText().trim(), pwd.getText().trim())) {

new MainGui().start();

setVisible(false);

} else {

JOptionPane.showMessageDialog(null, "您的输入不正确,请重输","警告", 1);

}

}

loginListener() {

}

}   

//数据库中检查是使用UserDao.java

public boolean login(String username,String password) {

Connection conn = DB.getConn();

Statement stmt = DB.getStatement(conn);

String sql = "select * from user where username='" + username +"'";

ResultSet rs = DB.getResultSet(stmt, sql);

try {

while(rs.next()) {

String dbpassword = rs.getString("password");

if(dbpassword != null && dbpassword.equals(password))

return true;

}

} catch (SQLException e) {

System.out.println("用户登陆连接数据库异常,系统退出");

System.exit(-1);

}

return false;

}

5.2  用户管理模块

用户管理界面5.2所示。

图5.2 用户管理界面

关键代码如下:(点击“续接”时系统执行的操作)

//UserDao.java

//用户注册

public boolean regeist(User user) {

Connection conn = DB.getConn();

Statement stmt = DB.getStatement(conn);

String sql = "insert into user(username,password,rank) values('" + user.getUsername() +"','" + user.getPassword() + "',"+user.getRank()+")";

System.out.println(sql);

try {

stmt.executeUpdate(sql);

} catch (SQLException e) {

e.printStackTrace();

JOptionPane.showMessageDialog(null, "添加失败,您输入的用户已存在","警告", 1);

return false;

}

JOptionPane.showMessageDialog(null, "恭喜您,添加成功","恭喜", 1);

return true;

}

//查询用户

public String[] findUser() {

Connection conn = DB.getConn();

Statement stmt = DB.getStatement(conn);

String sql = "select * from user";

String[] userlist = new String[128];

System.out.println(sql);

try {

ResultSet rs = stmt.executeQuery(sql);

int i = 0;

while(rs.next()) {

userlist[i] = rs.getString("username");

i++;

}

} catch (SQLException e) {

e.printStackTrace();

JOptionPane.showMessageDialog(null, "查找用户失败","警告", 1);

return null;

}

return userlist;

}

//删除用户

public boolean delUser(String username) {

Connection conn = DB.getConn();

Statement stmt = DB.getStatement(conn);

String sql = "delete from user where username = '" + username + "' and rank = 0";

String[] userlist = new String[]{};

System.out.println(sql);

try {

stmt.executeUpdate(sql);

} catch (SQLException e) {

e.printStackTrace();

JOptionPane.showMessageDialog(null, "删除用户失败","警告", 1);

return false;

}

return true;

}

//修改用户

public boolean modify(User user) {

Connection conn = DB.getConn();

Statement stmt = DB.getStatement(conn);

String sql = "update user set username = '" + user.getUsername()+"',password='"+

user.getPassword()+"',rank="+user.getRank()+" where username ='"+user.getUsername()+"'";

System.out.println(sql);

try {

stmt.executeUpdate(sql);

} catch (SQLException e) {

e.printStackTrace();

JOptionPane.showMessageDialog(null, "修改失败","警告", 1);

return false;

}

JOptionPane.showMessageDialog(null, "恭喜您,修改成功","恭喜", 1);

return true;

}

//显示模块 com.ahut.frame.usermgr

用户添加核心代码:

//显示用户添加界面

JPanel editPanel = new JPanel();

editPanel.setBorder(BorderFactory.createTitledBorder("添加用户"));

editPanel.setLayout(new GridLayout(2,1));

JPanel upPanel = new JPanel();

upPanel.setBorder(BorderFactory.createTitledBorder("用户信息"));

upPanel.setLayout(new GridLayout(3,1));

JPanel jp1 = new JPanel();

JPanel jp2 = new JPanel();

JPanel jp3 = new JPanel();

jp1.add(new JLabel("用户名"));

username = new JTextField("",8);

password = new JPasswordField("",8);

password2 = new JPasswordField("",8);

jp1.add(username);

upPanel.add(jp1);

jp2.add(new JLabel("密码"));

jp2.add(password);

jp3.add(new JLabel("再次密码"));

jp3.add(password2);

upPanel.add(jp2);

upPanel.add(jp3);

editPanel.add(upPanel);

JPanel addUserSubmitPanel = new JPanel();

JButton addUserSubmitBtn = new JButton("提交");

JButton addUserCancelBtn = new JButton("取消");

addUserSubmitPanel.add(addUserSubmitBtn);

addUserSubmitPanel.add(addUserCancelBtn);

editPanel.add(addUserSubmitPanel);

addUserSubmitBtn.addActionListener(new addUserSubmitListener());

addUserCancelBtn.addActionListener(new addUserCancelListener());

add(editPanel,BorderLayout.CENTER);

//提交用户添加时执行的操作

public class addUserSubmitListener implements ActionListener {

public void actionPerformed(ActionEvent e) {

System.out.println("==="+password.getText().trim()+"====");

if (password.getText().trim().equals("") || !password.getText().trim().equals(password2.getText().trim())) {

JOptionPane.showMessageDialog(null, "输入不正确", "警告", 1);

}else {

User user = new User();

user.setUsername(username.getText().trim());

user.setPassword(password.getText().trim());

user.setRank(0);

UserDao ud = new UserDao();

ud.regeist(user);

}

}

//用户修改的核心代码:

//核心代码:

JPanel editPanel = new JPanel();

editPanel.setLayout(new GridLayout(0,2));

editPanel.setBorder(BorderFactory.createTitledBorder("修改用户"));

JPanel leftPanel = new JPanel();

leftPanel.setLayout(new GridLayout(0,1));

leftPanel.setBorder(BorderFactory.createTitledBorder("用户列表"));

UserDao ud = new UserDao();

userlist = new JList(ud.findUser());

leftPanel.add(new JScrollPane(userlist, 22, 31));

userlist.addListSelectionListener(new userlistListener());

editPanel.add(leftPanel);

JPanel rightPanel = new JPanel();

rightPanel = new JPanel(new BorderLayout());

rightPanel.setBorder(BorderFactory.createTitledBorder("用户信息"));

rightPanel.setLayout(new FlowLayout());

unfld = new JTextField("", 8);

pwdfld = new JTextField("", 8);

rankfld = new JTextField("", 8);

JPanel jPanel1 = new JPanel(new GridLayout(0, 1));

jPanel1.add(new JLabel("用户名:"));

jPanel1.add(new JLabel("密码:"));

jPanel1.add(new JLabel("权限:"));

JPanel jPanel2 = new JPanel(new GridLayout(0, 1));

jPanel2.add(unfld);

jPanel2.add(pwdfld);

jPanel2.add(rankfld);

rightPanel.add(jPanel1, "West");

rightPanel.add(jPanel2, "East");

editPanel.add(rightPanel);

add(editPanel,BorderLayout.CENTER);

JPanel modifyUserSubmitPanel = new JPanel();

JButton modifyUserSubmitBtn = new JButton("修改用户");

modifyUserSubmitPanel.add(modifyUserSubmitBtn);

add(modifyUserSubmitPanel,BorderLayout.SOUTH);

//监听器

public class modifyUserSubmitListener implements ActionListener {

public void actionPerformed(ActionEvent e) {

if(username == null || username.equals("")) {

JOptionPane.showMessageDialog(null, "未选中用户","警告", 1);

}else {

int i = JOptionPane.showConfirmDialog(null, "是否修改该用户?修改将无法恢复!","警告", 0);

if(i == 1) return;

UserDao ud = new UserDao();

User user = new User();

user.setUsername(unfld.getText().trim());

user.setPassword(pwdfld.getText().trim());

if(rankfld.getText().trim().equals("系统管理员")) {

user.setRank(1);

}else {

user.setRank(0);

}

ud.modify(user);

}

}

5.3  销售管理模块

销售管理界面如图5.3所示。

图5.3  销售界面

关键代码如下:(点击“销售”时系统执行的操作)

//DAO中的处理

public boolean sales(SalesOrder so) {

Connection conn = DB.getConn();

Statement stmt = DB.getStatement(conn);

String sql = "insert into salesorder values('" + so.getSoid() + "','"

+ so.getMid() + "','"+ so.getMname() + "','"

+ so.getNum() + "',"+ so.getPrice() + ")";

System.out.println(sql);

try {

stmt.executeUpdate(sql);

} catch (SQLException e) {

e.printStackTrace();

return false;

}

return true;}

//com.ahut.frame.salesMgr包中执行的操作

public class buyListener implements ActionListener {

public void actionPerformed(ActionEvent e) {

for(int n=0;n<order.length;n++){

if(order[n]!=null && !order[n].equals("")) {

String msg = order[n];

StringTokenizer stnizer = new StringTokenizer(msg, ",");

int i1 = Integer.parseInt(stnizer.nextToken());

String name1 = stnizer.nextToken();

String pricestr = stnizer.nextToken();

StringTokenizer stnizerprice = new                         StringTokenizer(pricestr, "元");

float price1 =                                                      Float.parseFloat(stnizerprice.nextToken());

SalesOrder sod = new SalesOrder();

sod.setSoid(name1);

sod.setMid(name1);

sod.setMname(name1);

sod.setNum(1);

sod.setPrice(price1);

SalesOrderDao sodao = new SalesOrderDao();

sodao.regeist(sod);

StockDao stockdao = new StockDao();

stockdao.modifyNum(name1);

stocklist.setListData(stockdao.findStock());

}

}

JOptionPane.showMessageDialog(null, "销售成功了", "警告", 1);

}

}

5.4  进货管理模块

图5.4 药品管理界面

核心代码:(添加药品及加入库存)

//添加药品Dao中

public boolean regeist(Medicine medicine) {

Connection conn = DB.getConn();

Statement stmt = DB.getStatement(conn);

String sql = "insert into medicine values('" + medicine.getMid() + "','"

+ medicine.getMname() + "','"+ medicine.getMshortname() + "','"

+ medicine.getMnors() + "','"+ medicine.getMarea() + "','"

+ medicine.getMlot() + "',"+ medicine.getMinpri() + ","

+ medicine.getMwpri() + ","+ medicine.getMrpri() + ",'"

+ medicine.getMcon() + "','"+ medicine.getMcate() + "',"

+ medicine.getMusetime() + ",'"+ medicine.getMemo() + "')";

System.out.println(sql);

try {

stmt.executeUpdate(sql);

} catch (SQLException e) {

e.printStackTrace();

JOptionPane.showMessageDialog(null, "您的输入不正确", "警告", 1) return false;

}

return true;

}

//添加药品frame中

public class AddMedButtonListener implements ActionListener {

public void actionPerformed(ActionEvent e) {

try{

Medicine medicine = new Medicine();

medicine.setMarea(marea.getText().trim());

medicine.setMcate(mcate.getText().trim());

medicine.setMcon(mcon.getText().trim());

medicine.setMemo(memo.getText().trim());

medicine.setMid(mid.getText().trim());

       medicine.setMinpri(Float.parseFloat(minpri.getText());

medicine.setMlot(mlot.getText().trim());

medicine.setMname(mname.getText().trim());

medicine.setMnors(mnors.getText().trim());

medicine.setMrpri(Float.parseFloat(mrpri.getText()); medicine.setMshortname(mshortname.getText()); medicine.setMusetime(Integer.parseInt(musetime.getText());

medicine.setMwpri(Float.parseFloat(mwpri.getText());

MedDao md = new MedDao();

if(md.regeist(medicine)){

JOptionPane.showMessageDialog(null, "药品添加成功", "恭喜", 1);

}

}catch(Exception e2) {

e2.printStackTrace();

JOptionPane.showMessageDialog(null, "您的输入不正确", "警告", 1);

}

}

}

//加入库存frame中

public class buyButtonListener implements ActionListener {

public void actionPerformed(ActionEvent e) {

try {

Stock stock = new Stock();

stock.setMid(mid.getText().trim());

stock.setMname(mname.getText().trim());

stock.setMnum(Integer.parseInt(num.getText().trim()));

stock.setMprice(Float.parseFloat(price.getText().trim()));

stock.setSpid(spid.getText().trim());

Calendar c = Calendar.getInstance();

c.setTimeInMillis(System.currentTimeMillis());

java.util.Date d = c.getTime();

stock.setTime(d);

StockDao sd = new StockDao();

if(sd.regeist(stock)) {

JOptionPane.showMessageDialog(null, "进货成功", "恭喜", 1);

}

} catch (Exception e2) {

e2.printStackTrace();

JOptionPane.showMessageDialog(null, "您的输入不正确", "警告", 1);

}

}

}

//加入库存DAO中

public boolean add(Stock stock) {

Connection conn = DB.getConn();

Statement stmt = DB.getStatement(conn);

String sql = "insert into stock values('" + stock.getMid() + "','" + stock.getMname() + "',"+ stock.getMprice() + "," + stock.getMnum() + ",'"+stock.getSpid()+"',curdate()"+",0)";

System.out.println(sql);

try {

stmt.executeUpdate(sql);

} catch (SQLException e) {

e.printStackTrace();

JOptionPane.showMessageDialog(null, "操作失败", "警告", 1);

return false;

}

return true;

}

5.5 职工管理模块

图5.5 药品修改界面

核心代码:(修改职工信息)

//DAO中修改职工信息

public boolean modify(Staff staff) {

Connection conn = DB.getConn();

Statement stmt = DB.getStatement(conn);

String sql = "update staff set staffid='" + staff.getStaffid() + "',staffname='"+ staff.getStaffname() + "',staffsex='"+ taff.getStaffsex() + "',stafftel='" + staff.getStafftel() + "',staffadd='"+ staff.getStaf fadd() + "',staffcard='"+ staff.getStaffcard() + "',staffzip='"+ staff .getStaffzip() + "' where staffid = '" + staff.getStaffid() +"'";

System.out.println(sql);

try {

stmt.executeUpdate(sql);

} catch (SQLException e) {

e.printStackTrace();

JOptionPane.showMessageDialog(null, "修改失败", "警告", 1);

return false;

}

JOptionPane.showMessageDialog(null, "恭喜您,修改成功", "恭喜", 1);

return true;

}

//FRAME中监听修改用户按钮的处理流程

public class modifyStfListener implements ActionListener {

public void actionPerformed(ActionEvent e) {

if (staffname == null || staffname.equals("")) {

JOptionPane.showMessageDialog(null, "未选中用户", "警告", 1);

} else {

int i = JOptionPane.showConfirmDialog(null, "是否修改该职员?修改将无法恢复!", "警告", 0);

if (i == 1)

return;

StaffDao sd = new StaffDao();

Staff staff = new Staff();

staff.setStaffid(staffid.getText().trim());

staff.setStaffname(stfname.getText().trim());

staff.setStaffsex(staffsex.getText().trim());

staff.setStafftel(stafftel.getText().trim());

staff.setStaffadd(staffadd.getText().trim());

staff.setStaffcard(staffcard.getText().trim());

staff.setStaffzip(staffzip.getText().trim());

sd.modify(staff);

}

}

}

5.6 坏货转移模块

图5.6  坏货转移界面

核心代码:(对发生以外的和过期的药品的处理)

//按钮的事件响应

public class outOfDateListener implements ActionListener {

public void actionPerformed(ActionEvent e) {

StockDao sd = new StockDao();

String[] mnamelist = sd.findOFDStock();

sd.OFDTranStock(mnamelist);

JOptionPane.showMessageDialog(null, "成功", "恭喜", 1);

stocklist.setListData(new String[]{});

}

}

//数据库DAO中的操作

public void OFDTranStock(String[] mnamelist) {

Connection conn = DB.getConn();

Statement stmt = DB.getStatement(conn);

for(int i=0;i<mnamelist.length;i++) {

if(mnamelist[i] != null && !mnamelist[i].equals("")) {

String sql = "update stock set status = 1 where mname = '" + mnamelist[i] + "'";

System.out.println(sql);

try {

stmt.executeUpdate(sql);

} catch (SQLException e) {

e.printStackTrace();

JOptionPane.showMessageDialog(null, "失败", "警告", 1);

}

}

}

第六章  测试分析报告

6.1  什么是软件测试 

软件测试就是在受控制的条件下对系统或应用程序进行操作并评价操作结果的过程,所谓控 制条件应包括正常条件与非正常条件。

   软件测试过程中应该故意地去促使错误的发生,也就是事情在不该出现的时候出现或者在应 该出现的时候没有出现。从本质上说,软件测试是“探测”,在“探测”中发现软件的毛病。

 软件测试贯穿于软件定义与开发的整个周期 ,软件的需求规格说明书 ,结构设计及程序编 码,都属于软件测试的对象。

      软件测试包含白盒测试与黑盒测试,白盒测试是针对程序代码进行正确性检验的测试工作, 黑盒测试独立于程序代码,从用户的角度,通过一定的测试步骤与测试案例,验证软件功能、 性能等指标能否满足实际应用需求的测试作。

6.2 软件测试的目的

     软件测试的目的是为了保证软件产品的最终质量,在软件开发的过程中,对软件产品进行质量控制。一般来说软件测试应由独立的产品评测中心负责,严格按照软件测试流程,制定测试计划、测试方案、测试规范,实施测试,对测试记录进行分析,并根据回归测试情况撰写测试报告。测试是为了证明程序有错,而不能保证程序没有错误。

6.3  测试计划和要点

        软件测试的本质是针对要测试的内容确定一组测试用例。在讨论之前,我先把要测试各个模块的计划和要点列出:

6.3.1  药品以及药品管理模块测试要点

           用户的登录用户名和密码的核对,药品创始信息格式的判断,防止不规范的数据和错误的数据插入数据库。例如,已经存在的用户不可被再次注册,用户的生日和email格式等。

6.3.2  销售管理模块测试要点

发生销售时,库存的变动情况,是否减少,药品为零则禁止销售。

6.3.3  进货管理模块测试要点

录入数据时对数据格式的限制,防止不正确的数据进入数据库。

6.3.4  职工信息测试要点

防止脏数据进入数据库。

6.4  部分测试图

1. 用户名或密码错误

图6.1   (登陆)用户名或密码错误提示

2.用户注册模块

图6.2   (注册) 用户已存在提示


3.药品录入数据格式的限制

图6.3    药品录入数据格式的限制

6.5  测试结论 

1. 测试目标完成 ;

2. 测试已经通过;

3. 可以进入下一阶段项目目标 


总结

不知不觉,三个月的设计结束了。在这三个月的设计,让我受益非浅。自我学计算机专业以来,始终认为一个完整的程序就相当于一个优秀的软件产品,只要程序编得精致、具体、详细,所开发的软件就绝对完美、实用。

在这次设计药品管理系统中,我积极查阅各种资料,实地调研,在李老师的帮助下完成了这个系统的全部设计。刚开始设计时遇到了一些困难,因为之前自学过的Java Swing已经忘了差不多了,再加上自己还要参加其他单位的实习,时间的安排上也很紧迫,编程的进度比较缓慢。在设计中还会遇到一些功能不知该如何实现的困难,在同学们,同事们的热情帮助下,我渐渐的复习了Java Swing控件的使用方法、Java Swing的编程语法,之后的编程过程也相对得心应手,基本完成了预期计划的要求。但是系统功能还没有完全完善,有待进一步加强。

通过这次毕业设计,我进一步加深对基础理论的理解,扩大专业知识面,对收集资料、查阅文献、方案制定等实践方面得到了很好的锻练,促进对所学知识应用能力的提高。同时,发现问题、分析归纳、综合比较的逻辑分析能力、处理问题等能力也得到了提高。但是在这次毕业设计过程中,还是发现了自己很多不足之处,也遇到了许多问题和困难,而这些困难大多是三年中不注重自己系统学习,学有所用造成的,这让我认识到系统的学习和锻炼的重要性,基础知识掌握不仅要多,而且要会运用它,那样的话设计才会更全面、更顺利、更完美。

参考文献

[1] 侯维瑞 英语语体 上海:上海外语教育出版社,1988

[2][美]Rogers Cadenhead. Java编程入门经典.梅兴文译.第4版.北京:人民邮电出版社,2007

[3]陈轶.姚晓昆编著.Java程序设计实验指导.北京:清华大学出版社,2006

[4] 吴其庆编著.Java程序设计实例教程.北京:冶金工业出版社,2006

[5]李春葆,曾慧.SQL Server 2000学习与上机指导[M]. 北京:清华大学出版社,2005.6.

[6]施霞萍等编著.Java程序设计教程 第2版.北京:机械工业出版社,2006

[7]宛延闿等编著.实用Java程序设计教程.北京:机械工业出版社,2006

[8]耿祥义,张跃平.《JSP实用教程》.清华大学出版社,2003年5月1日:1-354月.

[9]陈刚.Eclipse从入门到精通[M].北京:清华大学出版社, 2005:416-417.

[10]孙卫琴.精通Struts:基于MVC的Java Web设计与开发[M].北京:电子工业出版社,2004: 1-9.

[11](美)格罗夫 著,章小莉 等译. SQL完全手册(第二版)[M].北京:电子工业出版社,2006:12-14.

[12]王虎,张俊.管理信息系统[M].武汉:武汉理工大学出版社,2004.7.

[13]东方华人.ASP.NET数据库开发[M]. 北京:清华大学出版社, 2004.6.             

致谢

毕业设计终于结束,此为大学里最后一次考核,我在大家的鼓励、帮助和支持下,最终顺利完成。回首从零到毕业设计最终的完成,我的老师们,朋友们,同事们,亲人们对我的帮助让我受益匪浅。首先,我想感谢一下我的指导老师李乔老师,李老师做事认真负责,待人亲切和蔼,同时对我的论文和程序积极督促,耐心指导和正确引导,让我从茫然不知所错到如屡平地。此次毕业设计同时让我更加深刻的了解到大学里教的课程是多么的有用,感谢母校给了我这么多知识储备,让我能成为有一个有用的心中有底的人。

还要感谢学院领导这四年来对我的培养和关心,在这四年当中,院里领导为我们做好不少好事,对于我们的困难,院领导总是热情的帮我们解决,我除了学会大学里应该学会的课程外,还学会了怎样做人,做一个对社会有贡献的人。

同时,我还要感谢我们们学校所有的同学。他们和我共同在安工大学习生活了四年,在生活和学习上给了我很大的帮助,正是有了你们的支持,我才能顺利的完成毕业设计。

谢谢所有教过我的老师们,你们教了我很多的专业知识,还给我提供动手实践的机会,老师辛苦了!

最后我还要感谢把我培养长大,含辛茹苦的父母,谢谢你们!

;