医药销售管理系统说明.docx

上传人:b****6 文档编号:5661686 上传时间:2022-12-30 格式:DOCX 页数:32 大小:894.39KB
下载 相关 举报
医药销售管理系统说明.docx_第1页
第1页 / 共32页
医药销售管理系统说明.docx_第2页
第2页 / 共32页
医药销售管理系统说明.docx_第3页
第3页 / 共32页
医药销售管理系统说明.docx_第4页
第4页 / 共32页
医药销售管理系统说明.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

医药销售管理系统说明.docx

《医药销售管理系统说明.docx》由会员分享,可在线阅读,更多相关《医药销售管理系统说明.docx(32页珍藏版)》请在冰豆网上搜索。

医药销售管理系统说明.docx

医药销售管理系统说明

医药销售治理系统

1系统分析

随着计计算机技术的不断进展,应用软件迅速普及,大到厂矿校企,小到图书、餐饮、医药治理等,随处都可看到它的身影。

在以往依靠人工为主的医药销售治理方面,计算机和计算机系统逐步唱起了主角,凭借省时、省力、低误差等优点,从全然上改变了医药治理的传统模式,节约了物理资源,提高了工作效率。

1.1开发背景

XX医药抄手坐落于XX小区内,多年来本着经济、实惠、高质量服务的宗旨,赢得了小区百姓的信赖,药品供应量特不大。

面对庞大的信息量,经常出现统计失误、药量供应不足的情况,医药超市经理决定使用一套合理、有效、使用的治理系统,对医药超市进行统一的治理。

笔者受医药超市经理托付,开发一个医药销售治理系统,其宗旨是实现医药超市治理的系统化、规范化、有用化,对药品进行统一治理。

1.2需求分析

在日常医药治理中,面对众多的药品和众多不同需求的顾客,每天都会产生大量的数据信息。

以传统的手工方式来处理这些信息,操作比较繁琐,且效率低下。

现在,一套合理、有效、有用的医药销售治理系统就显得十分必要。

利用其提供的药品查询、统计功能,能够进行高效的治理,更好地为顾客服务。

笔者通过对医药超市的实地考察,从经营者和消费者的角度动身,以高效治理、快速满足消费者为原则,要求本系统具有以下特点。

★具有良好的系统性能、友好的用户界面。

★较高的处理效率,便于用户使用。

★采纳成熟的技术开发,全系统具有较高的技术水平和较长的生命周期。

★对销售信息进行统计排行

★尽可能地简化药品治理员的重复工作,提高工作效率。

2系统设计

2.1系统目标

依照医药超市的治理要求,指定医药销售治理系统目标如下。

★灵活的人机交互界面,操作简单方便、界面简洁美观。

★系统提供中、英文语言,实现国际化

★药品分类治理,并提供类不统计功能。

★实现各种查询,如多条件查询、模糊查询等。

★提供创建治理员账户及修改口令功能。

★可对系统销售信息进行统计分析。

★系统运行稳定、安全可靠。

2.2系统功能结构

医药销售治理系统提供了四大功能,分不为“差不多信息治理”、“进货/需求治理”、“药品治理”、“系统治理”,具体结构如图1.1所示

图1.1医药销售治理系统功能结构图

2.3系统流程图

医药销售治理系统流程如图1.2所示。

治理员登录

图1.2医药销售治理系统流程图

3软件架构

在开发项目前,首先要对软件的结构进行设计,也称之为软件架构。

此过程是对软件整体结构的设计,如软件的逻辑分层结构、结构的实现、数据库等,特不是在Java的大型项目中,还需要设计出程序中的包结构及接口等,特不复杂,需要程序员进行全面的考虑。

关于医药销售治理系统的整体涉及如下:

3.1逻辑分层结构设计

医药销售治理系统由4层结构组成,并遵循MVC结构进行设计。

4层结构分不为表示层、业务逻辑层、持久层与数据库层,如图1.3所示。

图1.3逻辑分层

其中,表示层与业务逻辑层均由Struts框架组成,表示层用于提供程序与用户交互的界面,项目中要紧通过JSP、ActionForm及Struts标签库进行展现;业务逻辑层用于处理程序中的各种业务逻辑,项目中通过Struts框架的中央操纵器及Action对象对业务请求进行处理;持久层由Hibernate框架组成,负责应用程序与关系型数据库之间的操作;数据库层为应用程序所使用的数据库,本实例中为MySQL数据库。

关于4层结构的具体实现如图1.4所示。

图1.4逻辑分层实现

3.2系统文件夹组织结构

规范系统的整体架构是一个项目开发的标准,特不是在团队开发项目中,在编写代码之前,必须定制好项目的系统文件夹组织结构,以使程序条理清晰,利于后期的项目整合。

在Java项目中能够将不同作用、功能相类似的文件放置于同一个包中,如此既能够保证团队开发的一致性,又能够将系统的整体结构规范化。

创建完系统中可能用到的文件夹或Java包之后,在开发时只需将所创建的类文件或资源文件保存到相应的文件夹即可。

医药销售治理系统的文件夹组织结构如图1.5所示。

图1.5医药销售治理系统的文件夹组织结构

3.3实体对象设计

在应用Hibernate框架的项目中,实体对象的确立是其中的关键。

实体对象与数据库中的数据表相对应,并通过O/R映射建立实体与数据库的联系,Hibernate完全通过操作实体来操作数据库,因此首先要确定项目中的实体对象。

在医药销售治理系统中,实体对象及关系如图1.6所示。

图1.6医药销售治理系统中的实体对象及其关系

从图1.6中能够看到,药品实体对象为Medicine类,药品类不实体对象为Category类,销售明细实体为SellDetail类,操作用户实体为User类,这4个实体对象为医药销售治理系统的核心实体对象,它们所对应的映射文件均为“类名+hbm.xml”文件。

其中,药品信息与药品类不为多对一关联关系,一个类不中包含多个药品对象;药品信息与销售明细为一对多关联关系,多个销售明细对应一个药品对象;销售明细与用户之间为多对多的关联关系,多个销售明细信息对应多个操作用户。

3.4定义ActionForm

ActionForm是简单的JavaBean,要紧用来保存用户所输入的表单数据,Action要猎取这些数据需要通过ActionForm对象进行传递。

ActionForm对表单的数据进行了封装,在JSP页面与Action对象中提供了交互访问的方法。

在使用过程中,可通过继承org.apache.struts.action.ActionForm对象来创建需要的ActionForm对象,项目中所涉及到的ActionForm对象如图1.7所示。

图1.7项目中所涉及到的ActionForm对象

3.5持久层结构设计

持久层结构通过Hibernate框架进行设计。

由于Hibernate对不同对象的增、删、改、查等操作具有一定的共性,如添加数据使用save()方法、删除数据使用delete()方法等,项目中将这些具有共性的操作抽取出来,封装成一个类,其他数据库操作对象可继承此类来拥有这些方法,从而减少程序中的多余代码,如图1.8所示。

图1.8持久层结构

SupperDao类为所有数据库操作对象的父类,在此类中定义了对数据库进行操作的常用方法,具体方法及讲明如表1.1所示。

表1.1SupperDao方法及讲明

方法

讲明

save()

用于保存一个对象

saveOrUpdate()

用于保存或更新一个对象

delete(Objectobj)

用于删除一个对象,入口参数为Object类型

findByHQL()

通过HQL语句查询数据,入口参数为String类型的HQL语句

deleteByHQL()

通过HQL语句删除数据,入口参数为String类型的HQL语句

uniqueResult()

单值检索数据,入口参数hql为HQL查询语句、where为查询条件

findPaging()

分页查询数据,入口参数hql为HQL查询语句、offset为结果集的起始位置、length为返回结果集的条目数、where为查询条件

这些方法均为数据库操作的常用方法,因此将其封装在单独的一个类中,关于各个对象的数据库相关操作,可通过继承此类来猎取这些常用方法。

其子类对象有CategoryDao类、MedicineDao类、SellDao类、UserDao类,其功能分不介绍如下。

CategoryDao类:

药品类不数据库操作对象,用于封装与药品类不相关的数据库操作方法。

MedicineDao类:

药品信息数据库操作对象,用于封装与药品信息相关的数据库操作方法。

SellDao类:

药品销售数据库操作对象,用于封装与药品销售相关的数据库操作方法。

UserDao类:

用户数据库操作对象,用于封装与治理员及系统相关的数据库操作方法。

3.6业务层结构设计

业务层结构要紧通过Struts框架进行设计,由Struts的中央操纵器对各种操作请求进行操纵,并通过相应的Action对其进行业务处理,项目中所用到的Action对象及关系如图1.9所示。

图1.9Action对象及关系

Action、DispatchAction与LookUpDispatchAction为Struts封装的Action对象,具有不同的特点及作用,项目中通过继承这几个对象实现对不同业务请求的处理。

除这3个对象外,图1.9中其余的Action对象均为自定义的Action对象。

在这些自定义的Action对象中,LanguageAction与LoginAction用于处理国际化语言及用户登录操作。

由于二者不涉及过多的业务逻辑,它们都直接继承于Action对象。

BaseAction对象与DeleteAction对象为重要的Action对象,二者都继承了DispatchAction对象。

项目中封装这两个对象的目的在于简化程序中的业务逻辑、提高程序的安全性。

在这两个对象中均对用户登录身份做出了严格的验证,其子类对象通过继承不必再考虑用户登录的安全问题,而更专注于业务逻辑,同时通过继承还能够减少程序的代码量。

其中BaseAction对象的子类及作用如表1.2所示。

表1.2BaseAction对象的子类及其作用

子类

作用

SellAction

封装药品销售的相关操作,处理封装药品销售请求

SystemAction

封装系统相关操作,处理系统级的请求

CategoryAction

封装药品类不相关操作,处理药品类不相关操作

MedicineAction

封装药品信息相关操作,处理封装药品信息的相关请求

RequireAction

封装药品需求及库存相关操作,处理药品需求相关请求

DeleteAction对象继承了LookUpDispatchAction对象,此类通过重写getKeyMethodMap()方法对数据进行批量删除操作,其子类对象及其作用如表1.3所示。

表1.3DeleteAction对象的子类及其作用

子类

作用

DeleteMedicineAction

封装药品信息删除操作,用于批量删除药品信息

DeleteReqMedAction

封装药品需求信息删除操作,用于批量删除药品需求信息

3.7页面结构设计

医药销售治理系统的页面结构采纳框架进行设计,通过HTML语言中的标签及标签将页面分成3个部分,分不为页面头部、页面导航及内容页面,如图1.10所示。

图1.10页面布局

此种布局方式将每一个页面单独置于一个框架之中,其中“页面头部”和“页面导航”在登录之后是固定不变的,关于用户的操作将在“内容页面”显示结果。

使用这种方式的有点在于:

(1)幸免了JSP页面中大量引用动作标签。

(2)幸免扫瞄器反复加载“页面头部”及“页面导航”等同样的内容,加快扫瞄器速度。

4配置文件

在编写代码之前,需要做一些预备工作,如项目环境的搭建、项目所涉及到的第三方类库的支持、web.xml的配置等。

在医药销售治理系统中,要紧涉及到Struts框架、Hibernate框架及JFreeChart组件的应用,因此在项目开发之前,需要添加其类库支持。

4.1配置web.xml

web.xml文件是Web项目的配置文件,在医药销售治理系统中,此文件需要配置Struts框架、JFreeChart组件和过滤器等信息。

4.2配置struts-config.xml

Struts框架实现了MVC模式,web.xml和struts-config.xml文件是其两个重要的配置文件,其中web.xml文件实现了Struts的初始化加载,而struts-config.xml是它的核心配置文件。

Struts-config.xml所做的工作比较多,包括ActionForm对象的定义、用户请求和Action之间的映射、异常处理等重要的配置。

其中标签用于注册实例中所涉及到的ActionForm对象,标签用于设置全局跳转,标签配置用户请求Action对象的映射。

4.3配置hibernate.cfg.xml

Hibernate.cfg.xml文件是Hibernate的配置文件,在项目中,此文件配置了数据库的方言、数据库链接信息、自动建表属性和打印SQL语句等属性。

5实体及映射

Hibernate是一个ORM产品,它完全能够操作对象的方式进行数据库操作,事实上体对象与数据表之间通过映射文件建立映射关系。

因此,在医药销售治理系统中需要建立实体对象与数据表之间的映射。

5.1药品实体映射

药品实体对象的持久化类为Medicine类,此类封装了药品相关属性提供相应的getXX()和setXXX()方法。

药品对象与药品类不对象为多对一关联关系,因此在Medicine类中加入了药品类不属性category,其关联关系通过映射文件Medicine.hbm.xml进行映射。

映射文件Medicine.hbm.xml将实体对象Medicine映射为tb_medicine表,主键的生成策略采纳自动生成方式。

此映射文件中,关于数据表的部分字段还通过not-null、length、unique等属性映射字段的属性,其中not-null用于映射字段的非空属性、length用于映射字段的长度、unique用于映射字段是否唯一。

映射后的数据表如图1.11所示。

图1.11tb_medicine表

5.2药品类不实体映射

药品类不实体用于封装药品类不属性信息,其持久化类为Category类,与药品对象存在一对多关联关系。

药品对象与药品类不对象为多对一关联关系,但从药品类不一端来看,药品类不对象与药品对象又是一对多的关系,因此程序中采纳了多对一双向关联进行映射。

药品类不实体对象的映射文件为Category.hbm.xml。

Category类所映射的数据表为tb_category,其中标签用于映射药品类不实体与药品实体间的一对多关联关系,此种映射方式将在药品数据表中添加categoryId字段。

映射后的数据表tb_category如图1.12所示。

图1.12tb_categoy表

5.3销售明细实体映射

销售明细用于描述药品销售时的具体情况,如销售时刻、销售人员、销售数量等。

这些信息十分重要,需要记录到数据库中,实例中将其封装为SellDetail类。

为了方便查看销售明细的总额信息,在SellDetail类中加入了sellTotal()属性,此属性并不进行数据表的映射,它只有一个与之对应的get()方法,在此方法中通过单价与数量的运算对sellTotal进行赋值,并将其返回。

销售明细实体的映射文件为SellDetail.hbm.xml,此映射文件中映射了两个多对一关联关系,分不为与药品对象的多对一关系及操作用户间的多对一关系。

销售明细实体映射的数据表为tb_selldetail。

在映射文件SellDetail.hbm.xml中,通过两个标签分不映射与药品对象及操作用户的多对一关联关系,并配置了级联操作类型为save-update。

映射后的数据表结构如图1.13所示。

图1.13tb_selldetail表

5.4用户实体映射

在医药销售治理系统中,用户实体用于封装治理员的差不多信息,如登录的用户名、密码等属性,其类名为User。

User类中属性相对较少,其映射过程也相对简单。

其映射文件为User.hbm.xml。

用户实体所映射的数据表为tb_user,其结构如图1.14所示。

图1.14tb_user表

6公共类设计

在Java程序开发中,假如一个功能反复被调用,则可将该功能抽取出来封装为一个类作为公共类,在需要此功能的地点通过此类进行实现。

公共类实质是代码的重用的一种方式,在面向对象的开发模式中经常使用它来简化程序中的代码,提高程序的可读性。

下面是医药销售治理系统找那个的公共类设计。

6.1Hibernate过滤器

在没有使用Spring治理Hibernate的情况下,对Hibernate的治理仍然存在一定的难度,特不是在J2EE开发中,线程安全、SessionFactory对象、Session对象、Hibernate缓存及延迟加载等是程序设计中的难题,治理不当将会对程序造成极为严峻的阻碍。

在医药销售治理系统中,将SessionFactory对象、Session对象置于过滤器中,由过滤器对其进行治理,从而解决了这些问题。

在Web项目中,以一般方式使用Hibernate将无法解决Hibernate延迟加载,如图1.15所示。

当有一个业务请求查询数据时,首先要开启Session对象,然后Hibernate对数据进行查询。

在关闭Session对象,最后通过JSP页面来显示数据。

在这一过程中,假如查询数据时使用了延迟加载,当JSP页面显示数据信息时,Hibernate将抛出异常信息,因为现在Session对象差不多关闭,Hibernate不能再对数据进行操作。

图1.15一般方式

通过过滤器治理Hibernate的Session对象则能够幸免此问题,事实上现过程如图1.16所示。

业务请求

Init()方法

初始化SessionFactory

doFilter()

过滤处理

业务处理

destroy()方法

销毁SessionFactory

JSP页面

SessinFactory

关闭Session

Response

Response

Request

Request

图1.16Hibernate过滤器

在Web容器启动时,过滤器被初始化,它将执行init()方法,在后续的操作中可不能再次被执行;而当容器关闭时,过滤器将执行destroy()方法。

这两个方法恰好符合SessionFactory对象的生命周期,在运行期间只执行一次操作,可用于实例化及销毁SessionFactory对象。

关于Session对象的关闭操作,能够在业务逻辑处理结束后、response请求转发大View层之前进行。

实例将其封装在HibernateFilter类中,此类继承了Filter类,它是一个过滤器。

为了保证线程的安全性,实例中将Session对象存放与ThreadLocal对象中,当用到一个Session对象时,首先从ThreadLocal中猎取,在无法猎取的情况下才会开启一个新的Session对象。

同时,为了保证Session对象能在resopnse请求转发到View层之前被关闭,实例采取了try…finally语句对Session对象进行关闭。

6.2SupperDao类

SupperDao类为项目中所有数据库操作类的父类,此类封装了数据库操作的常用方法。

在此类中,由于Hibernate对数据的操作都需要用到Session接口,类中定义了一个protected类型的Session对象,为其子类提供了方便。

save()方法及savaOrUpdate()方法都用于保存一个对象,其入口参数均为Object类型。

其中saveOrUpdate()方法比save()方法更智能一些,能够依照实体对象中的标识值来推断保存依旧更新操作。

SupperDao类中使用这两个方法对实体对象进行保存及更新操作。

删除操作的方法为delete(),入口参数为Object类型,此方法通过Session接口的delete()方法进行实现。

SupperDao类为项目中所有数据库操作类的父类,在设计时应当考虑全面。

Hibernate的HQL查询语言提供了更为灵活的查询方式,在那个超类之中应该加入HQL的操作方法,其中findByHQL()方法用于依照指定的HQL查询语句查询结果集,deleteByHQL()方法用于依照指定的HQL查询语句进行删除操作。

Hibernate单值检索在查询后返回单个对象,当返回的结果包含多条数据时,Hibernate将抛出异常。

此种操作可用于查询单条数据,如聚合函数count()等。

在SupperDao类中,单值检索的方法为uniqueResult()。

此方法的入口参数为HQL查询语句及查询条件,其中查询条件为Object[]数组类型,用于装载查询语句中的参数。

例如HQL语句“fromMedicinemwherem.id=?

”,现在即可通过参数where对其进行动态赋值。

分页查询在程序开发中经常用到,不但方便查看,还能够减少结果集的返回数量,提高数据访问效率。

使用Hibernate的分页查询方法极为简单,只需要传入几个参数即可,但在SupperDao类中对其进行了扩展,加入了HQL语句的动态赋值,其方法名为findPaging()。

此方法入口参数有4个,其中参数hql为HQL查询语句,它同意传入参数中带有占位符“?

”的HQL语句;参数offset为查询结果集对象的起始位置;参数length为查询结果的偏移量,也是返回数据的条目数;参数where为查询条件,属于Object[]数组类型,用于装载HQL语句中的参数。

通过上述这几个参数差不多能够满足项目中所有的分页查询,因此遇到专门情况时,能够通过子类对象重写此方法。

6.3BaseAction类

BaseAction类是业务层,有一个超类对象,它继承了Struts的DispatchAction类,同时还为子类对象提供公用方法。

此类首先定义了3个protected类型的变量,分不用于设置每页的记录数、本地语言信息及国际化消息资源。

Struts的DispatchAction类继承了Action类,此类处理请求时首先要执行execute()方法,然后通过操纵器再转发到相应的方法进行业务处理。

依照这一分析,能够在execute()方法中对用户的身份作出验证,事实上现过程如图1.17所示。

业务请求一

业务请求三

业务请求二

业务请求四

业务处理二

业务处理三

业务处理一

业务处理四

Execute()方法

验证用户身份

错误处理

验证失败

验证成功

验证成功

图1.17用户身份验证

假如对系统中涉及到的Action均编写一个验证方法,则程序代码的重复性太高,不能体现出面向对象的设计模式,因此需将其单独封装在BaseAction类中,此类通过重写Action类的execute()方法对用户身份进行验证。

由于分页查询的应用比较多,因此在业务层将其封装在BaseAction类中,通过getPage()方法进行实现,子类对象能够通过继承来猎取此方法。

getPage()方法返回一个Map集合对象,该集合用于装载结果集及分页条。

其中,结果集对象为一页中的所有数据集合,它是一个List对象;分页条为分页查询后在JSP页面所显示的分页信息,如记录数、页码、上一页、下一页的超链接等,它是一个String类型的字符串。

getPage()方法的入口参数有四个,其中参数hql为分页查询的HQL语句,此语句不能够包括select子句,它从from子句开始,能够传入带有占位符的HQL,但需要通过查询条件参数where传递占位符的值,当HQL语句没有参数时,where参数能够设置为null;参数recPerPage为每一页的记录数;currPage为当前的页码;action为分页所请求的Action地址。

getPage()方法提供这些参数的目的在于提高程序代码的重用性,因为在医药销售治理系统中,通过这些参数,ge

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1