随着计计算机技术的不断发展,应用软件迅速普及,大到厂矿校企,小到图书、餐饮、医药管理等,随处都可看到它的身影。在以往依靠人工为主的医药销售管理方面,计算机和计算机系统逐步唱起了主角,凭借省时、省力、低误差等优点,从根本上改变了医药管理的传统模式,节省了物理资源,提高了工作效率。
XX医药抄手坐落于XX小区内,多年来本着经济、实惠、高质量服务的宗旨,赢得了小区百姓的信赖,药品供应量非常大。面对庞大的信息量,经常出现统计失误、药量供应不足的情况,医药超市经理决定使用一套合理、有效、使用的管理系统,对医药超市进行统一的管理。
在日常医药管理中,面对众多的药品和众多不同需求的顾客,每天都会产生大量的数据信息。以传统的手工方式来处理这些信息,操作比较繁琐,且效率低下。此时,一套合理、有效、实用的医药销售管理系统就显得十分必要。利用其提供的药品查询、统计功能,可以进行高效的管理,更好地为顾客服务。笔者通过对医药超市的实地考察,从经营者和消费者的角度出发,以高效管理、快速满足消费者为原则,要求本系统具有以下特点。
在开发项目前,首先要对软件的结构进行设计,也称之为软件架构。此过程是对软件整体结构的设计,如软件的逻辑分层结构、结构的实现、数据库等,特别是在Java 的大型项目中,还需要设计出程序中的包结构及接口等,非常复杂,需要程序员进行全面的考虑。对于医药销售管理系统的整体涉及如下:
其中,表示层与业务逻辑层均由Struts框架组成,表示层用于提供程序与用户交互的界面,项目中主要通过JSP、ActionForm及Struts标签库进行展现;业务逻辑层用于处理程序中的各种业务逻辑,项目中通过Struts框架的中央控制器及Action对象对业务请求进行处理;持久层由Hibernate框架组成,负责应用程序与关系型数据库之间的操作;数据库层为应用程序所使用的数据库,本实例中为MySQL数据库。对于4层结构的具体实现如图1.4所示。
规范系统的整体架构是一个项目开发的标准,特别是在团队开发项目中,在编写代码之前,必须定制好项目的系统文件夹组织结构,以使程序条理清晰,利于后期的项目整合。在Java项目中可以将不同作用、功能相类似的文件放置于同一个包中,这样既可以保证团队开发的一致性,又可以将系统的整体结构规范化。创建完系统中可能用到的文件夹或Java包之后,在开发时只需将所创建的类文件或资源文件保存到相应的文件夹即可。医药销售管理系统的文件夹组织结构如图1.5所示。
在应用Hibernate框架的项目中,实体对象的确立是其中的关键。实体对象与数据库中的数据表相对应,并通过O/R映射建立实体与数据库的联系,Hibernate完全通过操作实体来操作数据库,所以首先要确定项目中的实体对象。在医药销售管理系统中,实体对象及关系如图1.6所示。
从图1.6中可以看到,药品实体对象为Medicine类,药品类别实体对象为Category 类,销售明细实体为SellDetail类,操作用户实体为User类,这4个实体对象为医药销售管理系统的核心实体对象,它们所对应的映射文件均为“类名+hbm.xml”文件。其中,药品信息与药品类别为多对一关联关系,一个类别中包含多个药品对象;药品信息与销售明细为一对多关联关系,多个销售明细对应一个药品对象;销售明细与用户之间为多对多的关联关系,多个销售明细信息对应多个操作用户。
ActionForm是简单的JavaBean,主要用来保存用户所输入的表单数据,Action要获取这些数据需要通过ActionForm对象进行传递。ActionForm对表单的数据进行了封装,在JSP页面与Action对象中提供了交互访问的方法。在使用过程中,可通过继承org.apache.struts.action.ActionForm对象来创建需要的ActionForm对象,项目中所涉及到的ActionForm对象如图1.7所示。
持久层结构通过Hibernate框架进行设计。由于Hibernate对不同对象的增、删、改、查等操作具有一定的共性,如添加数据使用save()方法、删除数据使用delete()方法等,
uniqueResult() 单值检索数据,入口参数hql为HQL查询语句、where为查询条件findPaging() 分页查询数据,入口参数hql为HQL查询语句、offset为结果集的起
这些方法均为数据库操作的常用方法,所以将其封装在单独的一个类中,对于各个对象的数据库相关操作,可通过继承此类来获取这些常用方法。其子类对象有CategoryDao类、MedicineDao类、SellDao类、UserDao类,其功能分别介绍如下。
业务层结构主要通过Struts框架进行设计,由Struts的中央控制器对各种操作请求进行控制,并通过相应的Action对其进行业务处理,项目中所用到的Action对象及关系如图1.9所示。
Action、DispatchAction与LookUpDispatchAction为Struts封装的Action对象,具有不同的特点及作用,项目中通过继承这几个对象实现对不同业务请求的处理。除这3个对象外,图1.9中其余的Action对象均为自定义的Action对象。
在这些自定义的Action对象中,LanguageAction与LoginAction用于处理国际化语言及用户登录操作。由于二者不涉及过多的业务逻辑,它们都直接继承于Action对象。
BaseAction对象与DeleteAction对象为重要的Action对象,二者都继承了DispatchAction对象。项目中封装这两个对象的目的在于简化程序中的业务逻辑、提高程序的安全性。在这两个对象中均对用户登录身份做出了严格的验证,其子类对象通过继承不必再考虑用户登录的安全问题,而更专注于业务逻辑,同时通过继承还可以减少程序的代码量。其中BaseAction对象的子类及作用如表1.2所示。
RequireAction 封装药品需求及库存相关操作,处理药品需求相关请求DeleteAction对象继承了LookUpDispatchAction对象,此类通过重写getKeyMethodMap()方法对数据进行批量删除操作,其子类对象及其作用如表1.3所示。
DeleteMedicineAction 封装药品信息删除操作,用于批量删除药品信息DeleteReqMedAction 封装药品需求信息删除操作,用于批量删除药品需求信息