食品进销存管理系统_第1页
食品进销存管理系统_第2页
食品进销存管理系统_第3页
食品进销存管理系统_第4页
食品进销存管理系统_第5页
已阅读5页,还剩73页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

页第1章课题简介1.1开发背景在我国数量众多的食品批发公司中,中小食品批发公司占了绝大多数,这些食品批发公司也不可避免地要加入国际化食品批发公司的竞争行列,而实现食品批发公司信息化是参与竞争的必要条件,但是中小食品公司的多样性及其灵活多变的经营方式,加上其资金投入量的限制,使得很多中小食品批发公司没能进行信息化建设。实际上大部分中小食品批发公司需要的只是能解决食品进、销、存管理和财务管理等的基础软件。因此,开发基于中小食品批发公司应用的进销存管理系统尤为重要。而随着社会的不断发展,计算机被广泛应用于各行各业之中。用计算机管理软件对公司业务进行管理更是一种行业发展趋势,也是衡量一个国家技术发展水平的标志。利用计算机管理不但可以提升工作效率,还可以节省人力物力,增强数据准确性、实时性和有效性。因此在食品批发公司使用计算机管理软件进行进货、销售、库存等管理是非常必要的。当前,随着经济的全球化以及中国经济改革的逐渐深入,食品批发业面临着越来越激烈的竞争,改善公司内部以及整个供应链各个环节的管理、调度及资源配置,具备迅速适应客户的新需求和市场新机遇的能力,是中国公司赢得竞争胜利的决定性因素。为了适应发展需要设计本系统。1.2研究内容高科技的发展,软件管理系统成为工作的得力助手。今天,计算机价格越来越大众化,管理软件性能越来越优秀,逐渐被应用于众多领域。管理软件广泛普及应用的原因主要有以下几个方面:第一,计算机行业本身发展迅速;第二,计算机可以代替人工进行繁杂和重复性的工作;第三,管理软件可以节省许多资源;第四,管理软件可以提高人们的工作效率;第五,管理软件便于管理人员的管理。本食品进销存管理系统是基于先进的软件和高速、大容量的硬件基础上的新的进销存管理模式,做到通过集中式的信息数据库,将公司的进货、销售、存储等经营业务有机的结合起来,大大减少公司管理部门的劳动量,改善公司内部以及整个供应链各个环节的管理、调度及资源配置,使得管理合理规范。系统尽量合理的控制物流,尤其是食品库存的控制,将食品数量控制到只在需要的时候向需要的部门按需要的数量提供所需要的食品,也就是说,它既防止食品供应滞后于对他们的需求,也防止食品过早地进货,以免增加库存,造成物资和资金的积压,实现食品销售的全方面管理。通过系统实现从基础数据维护、进货直到销售后利润统计的一系列功能。简化手工劳动的繁杂性、降低人工劳动强度、提高数据的时效性、提高工作效率、降低经营成本,为管理层决策提供强有力的支持。本系统还要考虑到经济、技术和运行环境等方面的条件,来确定系统的总体结构和系统各组成部分的技术方案,把系统用户与订单、食品的关系确定好。将系统用户的权限限制为单一独立的,这样可以让权限在分配的时候互不干扰。第2章需求分析根据对一般中小食品批发公司的调查研究,其对系统的日常经营管理需求分析为:批发公司准备进货时由进货员制作进货订单,制单时先选择食品,输入食品数量,之后选择食品供应商,最后确认制单。进货的食品到货后仓库员再入库,并对食品数量进行调整,然后财务员付款完成交易。食品订货商予订购食品时,通过电话与批发公司的销售员联系,由销售员制作销售订单,制单时先选择食品、输入数量,之后选择订货商确认制单。制单完成后仓库员发货,发货后对食品数量进行调整,之后销售员送货并收款,最后财务员确认收款完成交易。仓库管理中,对食品库存、食品库存金额进行记录。记录供应商及订货商中消费金额或积分。1.具体任务根据调查分析,该系统完成如下具体任务:(1)系统用户管理:系统用户信息管理、分配系统用户角色。(2)进货订单流程:进货员选择食品,选择供应商,仓库管理员入库,制单员确认完成交易。(3)销售订单流程:销售员选择订货商,选择食品、仓库管理员发货、分销员确认付款、收款员确认收款、交易完成。(4)食品管理:管理食品类别信息、食品品牌信息、食品名称、食品数量和食品单价信息、食品库存(5)订货商管理:用于维护订货商的编号、名称、联系人、地址、电话、积分额度等基本信息。(6)供应商管理:用于维护供应商的编号、名称、地址、电话、消费金额等的基本信息。2.系统用例模型用例模型是面向对象分析与设计的概念模型,一般用于前期的需求研究以及项目范围的控制、功能的分析,主要描述系统用户可以对哪些模块或者子模块进行操作[1]。根据上面的任务分析,绘制本系统用例模型,本系统的用例模型如图2—1所示。图2—1食品进销存管理系统用例模型第3章总体设计经过需求分析之后,进入总体设计阶段。总体设计其目标是产生一个模块化的程序结构,根据需求分析阶段的工作,从用例模型得出可行方案,同时确定系统中每个程序由哪些模块组成及其相互关系[2]。经分析,系统共分为RBAC管理菜单、进货订单管理、销售订单管理、客户管理、仓库管理5大模块。以上各模块按层次划分子模块,每个子模块完成相应功能,且每个子模块具有单独入口单独出口。3.1系统模块设计1.RBAC管理菜单模块包括用户管理一个子模块。实现对系统用户登录账号、密码、用户姓名、性别、激活状态信息进行增加、修改、删除、查询、设置用户角色功能。此模块中封装角色权限。RBAC管理菜单模块功能结构图如图3—1所示。RBACRBAC管理菜单用户管理图3—1RBAC管理菜单模块功能结构图进货订单管理经理操作入库管理进货订单2.进货订单管理经理操作入库管理进货订单图3—2进货订单模块功能结构图3.销售订单管理模块包括订单管理、订单发货管理、确认订单交易、经理操作四个子模块。订单管理实现创建销售订单、修改订单、查询个人订单、确认付款功能。创建销售订单时需要操作员选择食品、输入食品数量,之后选择分销商完成订单创建。订单发货管理实现销售订单查询、发货确认。确认订单交易实现订单检索、确认此订单交易完成。经理操作实现所有销售订单查询、确认订单交易完成。销售订单管理模块功能结构图如图3—3所示。销售订单管理销售订单管理经理操作订单发货管理订单管理确认订单交易图3—3销售订单管理模块功能结构图客户管理订货商管理供应商管理4.客户管理模块包括供应商管理和订货商管理两个子模块。其中供应商管理实现查询供应商、修改供应商信息、新增供应商、删除供应商。订货商管理实现查询订货商、修改订货商信息、新增订货商、删除订货商。客户管理模块功能结构图如图客户管理订货商管理供应商管理图3—4客户管理模块功能结构图5.仓库管理模块包括食品管理、食品销售记录、食品类别、食品品牌四个子模块。食品管理实现对食品的查询、新增、删除、编辑、食品明细,食品明细实现查询显示该食品的进货订单信息。食品销售记录实现对该食品的销售订单查询。食品类别实现食品类别的查询、新增、修改、删除功能。食品品牌实现食品品牌的查询、新增、修改、删除功能。仓库管理模块功能结构图如图3—5所示。仓库管理仓库管理食品品牌食品销售记录食品管理食品类别图3—5仓库管理模块功能结构图3.2数据库设计数据库系统的使用过程是将现实世界的数据经过人为加工和计算机处理之后,又为现实世界提供信息的过程[3]。根据前面的分析,对本系统进行如下数据库设计。1.PURCHASEORDERDETAILSID(进货订单详细信息表):用于存储进货订单详细信息,表结构如表3—1所示。表3—1PURCHASEORDERDETAILSID字段名字段类型长度小数位数是否允许空字段说明PURDETAILSIDNUMBER38—否详细进货订单idPURCHASERIDNUMBER38—否进货商PRODUCTNUMBER38—否食品PRODUCTQUERYNUMBER38—否订货数量PRODUCTPRICENUMBER72否食品单价PRODUCTMONEYNUMBER72否订单总价SFRKVARCHAR26—否是否入库PURCHASEORDERIDNUMBER38—否进货订单编号QRRKYNUMBER38—是入库员JHYNUMBER38—否进货员JYZTNUMBER38—否订单状态2.PRODUCT(食品信息表):用于存储食品基本信息,表结构如表3—2所示。表3—2PRODUCT字段名字段类型长度小数位数是否允许空字段说明PRODUCTIDNUMBER38—否食品idPRODUCTNUMVARCHAR220—否食品编号PRODUCTSELLPRICENUMBER72否销售单价PRODUCTSURPLUSNUMBER38—是库存量CATEGORYNUMBER38—否类别PRODUCTNAMEVARCHAR250—否食品名称3.ORDER(销售订单信息表):用于存储销售订单信息,表结构如表3—3所示。表3—3ORDER字段名字段类型长度小数位数是否允许空字段说明ORDERIDNUMBER38—否订单idORDERNUMVARCHAR216—否订单编号ORDERTIMEDATE——否制单时间ORDERMONEYNUMBER92否订单总价CUSTOMNAMENUMBER38—否订货商ORDERACTIVATEVARCHAR26—否订单状态ORDERCONSIGNORNUMBER38—否发货员PAYMONEYVARCHAR26—否是否付款EMPLOYEENUMBER38—否制单员ORDERTIMEDELIVERYDATE——否发货时间ORDERACTUALCOSTMONEYNUMBER92否实际付款金额PAYMONETEMPNUMBER38—否确认收款员JYZTVARCHAR26—否交易状态4.ORDERDETAILSID(销售订单详细信息表):用于存储销售订单详细信息,表结构如表3—4所示。表3—4ORDERDETAILSID字段名字段类型长度小数位数是否允许空字段说明ORDERDETNUMBER38—否详细订单idORDERNUMNUMBER38—否订单编号PRODUCTNAMENUMBER38—否食品PRODUCTQUERYNUMBER38—否订货数量PRODUCTPRICENUMBER72否食品单价PRODUCTMONEYNUMBER72否订单总价CATEGORYNUMBER38—否食品类型BRANDNUMBER38—否食品品牌PRODUCTBRANDNUMBER38—否食品品牌5.PURCHASEORDER(进货订单信息表):用于存储进货订单信息,表结构如表3—5所示。表3—5PURCHASEORDER字段名字段类型长度小数位数是否允许空字段说明PURCHASEIDNUMBER38—否进货订单idPURCHASEIDVARCHAR216—否进货订单号PURCHASEMONEYNUMBER92否订单总额PURCHASETIMEDATE——否制单时间PURCHASERNUMBER38—否进货商PURCHASERACTIVATEVARCHAR26—否订单状态PUREMPLOYEENUMBER38—否制单员JYZTVARCHAR26—否交易状态QUERENEMPNUMBER38—否确认人6.EMPLOYEE(系统用户表):用于存储系统用户信息,表结构如表3—6所示。表3—6EMPLOYEE字段名字段类型长度小数位数是否允许空字段说明IDNUMBER38—否用户idEIDVARCHAR217—否用户登录名ENAMEVARCHAR216—-否用户名PASSWORDVARCHAR212—-否密码BIRTHDAYDATE—否出生日期GENDERVARCHAR2—否性别ACTIVATENUMBER1—否用户状态VISITDATE6—否上次登录时间WORKBIRTHDAYDATE6—否入职时间YJNUMBER82是业绩DEPTVARCHAR230—否部门ROLEVARCHAR230—否角色AUTHVARCHAR230—否权限7.PURCHASER(供应商信息表):用于存储供应商的基本信息,表结构如表3—7所示。表3—7PURCHASER字段名字段类型长度小数位数是否允许空字段说明PIDNUMBER38—否供应商idPURNAMEVARCHAR250—否供应商名称PURUSERVARCHAR210—是联系人PURTELVARCHAR250—是电话PURADDVARCHAR2200—是地址8.CUSTOMER(订货商信息表):用于存储订货商的信息,表结构如表3—8所示。表3—8CUSTOMER字段名字段类型长度小数位数是否允许空字段说明CUSTOMIDNUMBER38—否订货商idCUSTOMNAMEVARCHAR250—否姓名CUSTOMTELVARCHAR250—是电话CUSTOMADDVARCHAR250—是地址JFNUMBER38—是积分XYNUMBER3—是信用评价9.BRAND(食品品牌信息表):用于存储食品品牌信息,表结构如表3—9所示。表3—9BRAND字段名字段类型长度小数位数是否允许空字段说明BIDNUMBER38—否食品品牌idBRANDNAMEVARCHAR250—否食品品牌名称10.GATEGORY(食品类别表):用于存储食品的类别,表结构如表3—10所示。表3—10GATEGORY字段名字段类型长度小数位数是否允许空字段说明CATEGORYIDNUMBER38—否食品类别idCATEGORYNAMEVARCHAR250—否食品类别名称第4章详细设计4.1系统登录界面设计系统设计过程中采用了jsp技术,jsp技术是目前企业级应用网络管理系统最流行的技术之一[4]。登录界面的设计过程是先创建一个名为login.jsp的页面,然后在页面中添加一个表格,在表格中添加两个文本框用于输入用户名和密码,将文本框的id和name属性分别设置为loginname和password,并提供一个登录按钮用于让用户提交表单。在后台,创建个LoginAction的Struts2控制器类,用于处理用户登录,通过struts2功能,取出loginname和password的值,之后把值添加到hql语句中去数据库查询,在LoginAction中设置一个名为error的域成员,用于登录失败时提示用户,如果登录,将用户的id,及用户拥有的权限全部存入到session中,用于权限分配。系统登录界面如图4—1所示。图4—1系统登录界面4.2系统主界面设计系统主界面是系统用户登录后进入的界面,设计过程是先新建一个名为main.jsp的页面,通过框架对界面进行设计。左面引用的界面为menu.jsp,用于显示当前登录用户名称的标签,及本系统的各个功能模块的入口链接。当用户单击左侧各个功能模块时,架框右则会通过超链接跳转到各自相应的操作界面。系统主界面如图4—2所示。图4—2系统主界面4.3功能模块设计系统后台设计过程中采用了java语言设计,java语言的优点是一次编译到处运行,可移植能力非常强,只需开发人员在自己的计算机上编译后,在其它计算机上就可以运行[5]。1.进货订单管理界面进货订单管理界面为purorder/list.jsp。在页面中插入一个表格,用于显示进货订单相应信息,每一行提供“修改”、“完成”和“配置”的超链接按钮以进行相对应操作。后台创建PurchaseOrderAction的Struts2控制器类,该类定义了检索、修改、创建订单、配置订单的供应商功能。条件检索功能由PurchaseOrderAction中的域成员对应检索条件,单击“检索”时ddbh(订单编号)、dddate(制单日期)、wcdate(完成日期)通过struts2进行赋值,之后把值添加到hql语句中去数据库检索,可进行单一条件或多条件检索。系统中进货订单编号是由后台PurOrderAction类完成的,前两位“jh”表示进货订单,之后八位为当天日期,最后四位为当日订单个数。进货订单管理界面如图4—3所示。图4—3进货订单管理界面2.进货订单经理操作界面进货订单经理操作界面为purorder/jlcz.jsp。在页面中插入一个表格,用于显示所有进货订单相应信息,每行提供“修改”、“完成”和“配置”的超链接按钮以进行相对应操作。后台创建PurchaseOrderAction的Struts2控制器类,该类定义了检索、修改、创建订单,配置订单的供应商等。条件检索功能由PurchaseOrderAction中的域成员对应检索条件,单击“检索”时ddbh(订单编号)、dddate(制单日期)、wcdate(完成日期)通过struts2进行赋值,之后把值添加到hql语句中去数据库检索,可进行单一条件或多条件检索。进货订单管理经理操作界面如图4—4所示。图4—4进货订单管理经理操作界面3.进货订单创建界面单击进货订单管理界面中的“创建订单”进入进货订单创建界面。进货订单创建界面为purorder/table.jsp。使用ajax技术实现选择食品,每行提供“删除”按钮,通过ajax技术实现异步刷新,单击“删除”后该行直接删除。单击“保存”按钮,执行PurchaseOrderAction中的save方法,来确认保存订单食品。进货订单创建界面如图4—5所示。图4—5进货订单创建界面4.进货食品选择界面单击进货订单创建界面中的“选择食品”进入进货食品选择界面。进货食品选择界面为purorder/selectTable.jsp。在页面中插入一个表格,表格显示食品的相应信息,通过ajax来传递到进货订单创建界面,并且用PurchaseOrderAction中的productIds域成员来保存食品id,将选过的食品框变为不可选,防止用户重复选择食品。之后通过PurchaseOrderDetailsAction中save方法保存订单。进货食品选择界面如图4—6所示。图4—6进货食品选择界面5.销售订单管理界面销售订单管理界面为order/list.jsp。在页面中插入一个表格,表格显示销售订单相应信息。条件检索功能由OrderAction中的域成员对应检索条件,单击“检索”时ddbh(订单编号)、dddate(制单日期)、wcdate(发货日期)、customId(订货商)、employeeId(发货员)通过struts2进行赋值,之后把值添加到hql语句中去数据库查询,可单一条件伙伴多条件检索。销售订单编号是由后台OrderAction的类完成的,“dd”表示销售订单,之后八位是当天日期,最后四位是当日销售订单个数,在查询时,OrderAction中获取session中的登录id,只查询该id创建的订单。销售订单管理界面如图4—7所示。图4—7销售订单管理界面6.销售订单编辑界面系统设计过程中采用了Ajax技术,其作用是提供网页浏览者与网页内容的交互,并可以进行信息验证,可实现异步刷新页面[6]。单击销售订单管理界面中的“编辑”进入销售订单编辑界面,销售订单编辑界面为order/table.jsp。在页面中插入一个表格,表格显示销售订单明细信息。当输入购买数量时使用ajax技术自动取出食品单价与食品数量的值并算出所需金额。单击“保存”时通过OrderDetailsAction中的save方法来保存该订单,保存订单时从session中取出该用户id。销售订单编辑界面如图4—8所示。图4—8销售订单编辑界面7.订单发货管理界面订单发货管理界面为dispathorder/list.jsp。在页面中插入一个表格,表格显示销售订单相关信息。上方检索功能由后台DispathOrderAction中的域成员对应检索条件,单击“检索”时ddbh(订单编号)、dddate(制单日期)、custom(订货商)、employee(发货员)、activate(订单状态)、paymoney(付款状态)、wczt(交易状态)条件通过struts2功能自动对其赋值。单击每行订单时,DispathOrderAction的类中的orderList域成员的信息可在其下面显示,再次单击则隐藏。订单发货管理界面如图4—9所示。图4—9订单发货管理界面8.销售订单经理操作界面销售订单经理操作界面为dispathorder/jlcz.jsp。在页面中插入一个表格,表格显示所有销售订单相应信息。上方检索功能由后台DispathOrderAction中的域成员对应检索条件,单击“检索”时ddbh(订单编号)、dddate(制单日期)、custom(订货商)、employee(发货员)、activate(订单状态)、paymoney(付款状态)、wczt(交易状态)、fdate(发货日期)、fxyId(分销员)、skyId(收款员)条件通过struts2功能自动对其赋值。可按单一或多条件进行检索。单击每行订单时,检索其明细在下面显示,再次单击则隐藏。销售订单经理操作界面如图4—10所示。图4—10销售订单经理操作界面9.供应商管理界面供应商管理界面为purchaser/list.jsp。在页面中插入一个表格,表格显示供应商信息。后台使用PurchaserAction类中的add、edit、list、delete等方法来实现对供应商的新增、修改、删除、检索。供应商管理界面如图4—11所示。图4—11供应商管理界面10.新增供应商界面单击供应商管理界面中的“新增供应商”进入新增供应商界面,新增供应商界面为purchaser/edit.jsp。在页面中插入一个表格插入三个文本框,设置其id和name属性,单击“保存”按钮时purchasername(供应商名称)、purchasertel(供应商电话)、purchaseradd(供应商地址)通过struts2的功能赋值,将值传到后台PurchaserAction类中的相对应域成员中,之后用save方法保存供应商。新增供应商界面如图4—12所示。图4—12新增供应商界面11.订货商管理界面订货商管理界面为custom/list.jsp。在页面中插入一个表格,表格显示供应商信息。后台使用CustomAction类中的add、edit、delete、list方法来实现对订货商的新增、修改、删除、检索。订货商管理界面如图4—一三所示。图4—一三订货商管理界面12.新增订货商界面单击订货商管理界面中的“新增订货商”进入新增订货商界面,新增订货商界面为custom/edit.jsp。在页面中插入一个表格插入三个文本框,设置其id和name属性,单击“保存”按钮时customname(订货商名称)、customtel(订货商电话)、customadd(订货商地址)通过struts2的功能赋值,将值传到后台CustomAction类中的相对应域成员中,之后用save方法保存订货商信息。新增订货商界面如图4—14所示。图4—14新增订货商界面一三.食品管理界面食品管理界面为product/list.jsp。在页面中插入一个表格,表格显示食品信息。在后台建立ProductAction的类,使用里面的list、add、edit、mingxi、delete方法来实现对食品信息的检索、新增、编辑、明细查询、删除操作。上方检索功能由后台ProductAction中的域成员对应检索条件,单击“检索”时productname(商品名称)、category(食品类型)、brand(食品品牌)、productquery(商品数量)条件通过struts2功能自动对其赋值。可按单一或多条件进行食品检索。食品管理界面如图4—一五所示。图4—一五食品管理界面14.食品销售记录界面食品销售记录界面为product/profit.jsp。在页面中插入一个表格,表格显示食品销售信息。单击每行时,在后台使用ProductAction类中的spxiaoshou的方法在该行下方显示该食品的销售订单,再单击则隐藏。上方检索功能由后台ProductAction中的域成员对应检索条件,单击“检索”时productname(商品名称)、category(食品类型)、brand(食品品牌)、pxff(排序方法)条件通过struts2功能自动对其赋值。可按单一或多条件进行食品检索。食品销售记录界面如图4—16所示。图4—16食品销售记录界面一五.员工管理界面员工管理界面为employee/list.jsp。在页面中插入一个表格,表格显示员工信息。在后台使用EmployeeAction类中的list、edit、save、delete、saverole方法来实现对员工的检索、编辑、保存、删除、设置角色操作。上方检索功能由后台EmployeeAction中的域成员对应检索条件,单击“检索”时empname(员工名)条件通过struts2功能自动对其赋值。最后访问时间是在退出登录的时候通过后台的logoutAction类来修改的。员工管理界面如图4—17所示。图4—17员工管理界面16.员工新增界面单击员工管理界面中的“增加员工”进入员工新增界面,员工新增界面为employee/edit.jsp。单击“新增员工”按钮时通过Employee类中的edit方法弹出该界面。在页面中插入一个表格三个文本框、一个单选按钮和一个select下拉列表,并且分别设置其id和name属性。手动输入用户信息单击“保存”时,通过struts2功能将值传入后台EmployeeAction类中的loginname、password、empname、gender、activate域成员,再调用save方法来保存员工信息。员工新增界面如图4—一八所示。图4—一八员工新增界面第5章测试系统测试的重要性体现在它是保证系统质量与可靠性的最后关口,是对整个系统开发过程包括系统分析、系统设计和系统实现的最终审查。系统测试的对象显然不仅仅是源程序,而应是整个软件,它把系统分析、系统设计、以及程序设计各阶段的开发文档,都作为测试的对象。软件测试不等于程序测试,它是根据软件开发各个阶段的规格说明和程序的内容结构而精心设计的一批测试用例,并利用这些用例去运行程序,以发现程序错误的过程[7]。单元测试是指程序中的一个模块或一个子程序,是程序运行的最小单元,或是程序最小的独立编译单位。单元测试是软件开发过程中进行的最低级别的测试活动,其目的是要检测程序模块中有无故障。1.创建销售订单测试测试数据:可口可乐的购买数量5,统一绿茶的购买数量不填。测试界面如图5—1所示。图5—1创建销售订单测试界面测试结果:可口可乐购买数量下方提示“此货物购买数量不能大于库存量”,统一绿茶购买数量下方提示“食品个数必须填写”,测试结果与预期结果相符。2.新增用户测试测试数据:所有数据全部正确填写、全部不填写或部分填写。测试结果:所有数据全部正确填写后单击“提交”可以成功新增加一新用户,全部不填写或部分填写不能成功增加用户,并给出相应的提示信息,与预期结果相符。数据均不填写的测试界面如图5—2所示。图5—2新增员工测试界面3.用户登录测试测试数据:填写正确用户名和密码,错误用户名和错误密码。测试结果:正确时点击登录,进入系统主界面。用户名密码错误时,密码下方提示“登录失败”。登录失败提示界面如图5—3所示。图5—3登录失败提示界面本系统对所有模块都进行了单元测试,经测试各模块均可以完成预期的相应功能。总结短暂的毕业设计结束了,我在这次设计过程中实现了对过去所学知识的回顾、总结和应用。本管理系统能够实现数据的输入、查询、修改、删除、统计等功能,能够追朔到数据的始终,完成了食品进销存管理系统从需求方面的开发和应用,达到预期的目的。不可否认,该系统的功能还不完善,仍存在许多的缺点和不足,例如,在计算利润时,是以平均价格来进行计算利润,用库存金额除以库存数量,之后用售出单价减去平均进价来计算,正规方法应该是在食品进货订单中加标注,卖出的食品到相对应的进货订单中检索出进货价格,进行计算利润;还有用户部门没有进行分配,这个缺点是在需求分析时没有写进去,之后总体设计的时候也没有考虑到,导致用户没有部门的缺陷,但是此缺陷可以在今后升级中修复;另外在选择供应商时候,应该可以查询出该供应商都能供应哪些食品,这个缺陷是当时调研时未考虑到,经过老师指点才发现的,此缺陷也可在升级程序过程中修复。参考文献[1]张俊兰,王文发,冯伍,软件工程(第一版)[M],西安:西安交通大学出版社,(2009):41—44[2]刘竹林,软件工程案例开发与实践[M],北京:清华大学出版社,(2009):26—29[3]王立福,数据库系统概论(第三版)[M],北京:北京大学出版社,(2009):8—9[4]刘晓华,JSP应用开发详解[M],北京:电子工业出版社,(2007):6—7[5]赵毅,跨平台程序设计语言—Java[M],西安:西安电子科技大学出版社,(2006):一五[6]阮文江,Ajax程序设计应用[M],北京:人民邮电出版社,(2010):356-359[7]宫云战,软件测试教程[M],北京:\o"上海科学普及出版社"机械工业出版社,(2008):9—11附录1核心源代码1.application.xml(Spring配置文件,这个文件主要是用来配置系统数据库连接等信息)<beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xmlns:tx="/schema/tx"xmlns:aop="/schema/aop"xsi:schemaLocation=" /schema/beans/schema/beans/spring-beans-3.0.xsd/schema/context/schema/context/spring-context-3.0.xsd/schema/aop /schema/aop/spring-aop-3.0.xsd/schema/tx/schema/tx/spring-tx-3.0.xsd"default-autowire="byName"> <!--配置jdbc数据源--><beanid="myDataSource"class="org.apachexmons.dbcp.BasicDataSource" destroy-method="close"> <propertyname="driverClassName"value="oracle.jdbc.driver.OracleDriver"/> <propertyname="url"value="jdbc:oracle:thin:x:一五21:liufei"/> <propertyname="username"value="ddgl"/> <propertyname="password"value="ddgl"/> </bean> <!--配置hibernate抽象工厂--> <beanid="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <propertyname="dataSource"ref="myDataSource"/> <propertyname="mappingLocations"><!--如果你有很多hbm写起来很累--> <list> <value>classpath:/com/material/hbm/*.hbm.xml</value> </list> </property> <propertyname="hibernateProperties"> <value> hibernate.dialect=org.hibernate.dialect.OracleDialect hibernate.show_sql=true hibernate.cache.use_second_level_cache=true hibernate.cache.use_query_cache=true vider_class=org.hibernate.cache.EhCacheProvider </value> </property> </bean> <!--配置事务管理器ref应该和上面的jdbc数据源的id相同--> <beanid="txManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <propertyname="dataSource"ref="myDataSource"/> </bean> <!--配置Aop--> <aop:config> <!--配置切入点,即拦截哪些方法,执行表达式改成当前的--> <aop:pointcutid="entryPointMethod"expression="execution(*com.material..*Service.*(..))"/> <!--在aop中配置引用通知--> <aop:advisor advice-ref="txAdvice" pointcut-ref="entryPointMethod" order="2"/> <!--配置切面(删掉around)执行表达式同上--> <aop:aspectid="profilingAspect"ref="profiler"> <aop:pointcutid="serviceMethodWithReturnValue" expression="execution(*com.material..*Service.*(..))"/> </aop:aspect> </aop:config> <!--配置参考通知--> <tx:adviceid="txAdvice"transaction-manager="txManager"> <tx:attributes><!--以get开头的方法,只读(即不开启事务)--> <tx:methodname="get*"read-only="true"/> <tx:methodname="*"/> </tx:attributes> </tx:advice> <!--配置注解--><context:component-scanbase-package="com.material"/><context:annotation-config/></beans>2.Struts.xml(Struts2配置文件,这个文件主要是用来配置页面转发)<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.1//EN""/dtds/struts-2.2.dtd"><struts><packagename="default"extends="struts-default"> <actionname='*Action'class='{1}Action'> <resultname='login'>/main/master.jsp</result> <resultname='dist'>/orders/list.jsp</result> <resultname='list'>/{1}/list.jsp</result> <resultname='edit'>/{1}/edit.jsp</result> <resultname='add'>/{1}/add.jsp</result> <resultname='ordersEdit'>/orders/uptable.jsp</result> <resultname='purchEdit'>/purchaseOrder/uptable.jsp</result> <resultname='orderDetails'>/orders/table.jsp</result> <resultname='selectProuduct'>/{1}/selectTable.jsp</result> <resultname='bccg'>/purchaseOrder/bccg.jsp</result> <resultname='spbccg'>/{1}/bccg.jsp</result> <resultname='xiaoshou'>/{1}/profit.jsp</result> <resultname='PurOrd'>/purchaseOrder/table.jsp</result> <resultname='auth'>/modules/auth.jsp</result> <resultname='roleAuth'>/role/roleAuth.jsp</result> <resultname='empRole'>/employee/empRole.jsp</result> <resultname='distRole'>/distributor/distRole.jsp</result> <resultname='czcg'>/operateResult/czcg.jsp</result> <resultname='ddcg'>/operateResult/ddcg.jsp</result> <resultname='jycg'>/operateResult/jycg.jsp</result> <resultname='dlsb'>/login.jsp</result> <resultname='fhcg'>/operateResult/fhcg.jsp</result> <resultname='jywc'>/dispatchOrder/jywcList.jsp</result> <resultname='xiaoshoujlcz'>/dispatchOrder/jinglicaozuo.jsp</result> <resultname='notAlreadyOrder'>/dispatchOrder/notAlreadyList.jsp</result> <resultname='qhlist'>/{1}/qhlist.jsp</result> <resultname='autoOrder'>/product/autoOrder.jsp</result> <resultname='logout'>/login.jsp</result> <resultname='paymoney'>/orders/selectOD.jsp</result> <resultname='mingxi'>/orders/mingxi.jsp</result> <resultname='peizhi'>/purchaseOrder/peizhitable.jsp</result> <resultname='queren'>/purchaseOrder/queren.jsp</result> <resultname='wancheng'>/purchaseOrder/wancheng.jsp</result> <resultname='ruku'>/purchaseOrder/ruku.jsp</result> <resultname='rukucg'>/purchaseOrder/rukucg.jsp</result> <resultname='jhjlcz'>/purchaseOrder/jlcz.jsp</result> <resultname='spjhmx'>/product/jhxq.jsp</result> <resultname='spjhmx2'>/product/jhxq2.jsp</result> </action> <actionname='main'> <result>/login.jsp</result> </action></package></struts>3.LoginAction.java(用户登录验证)packagecom.material.action;xScope("prototype")xControllerpublicclassLoginActionextendsActionSupport{ privateLoginServiceloginService; privateServiceservice; publicvoidsetService(Serviceservice){ this.service=service; } publicvoidsetLoginService(LoginServiceloginService){ this.loginService=loginService; } publicStringexecute(){ Stringpath="dlsb"; Map<String,List<String>>authMap=newHashMap<String,List<String>>(); id=loginService.get(loginname,password,type,id,authMap); if(id!=null){ user=(Employee)commonDao.get(Employee.class,Integer.parseInt(id)); path="login"; }else{ err="登录失败"; } ActionContext.getContext().getSession().put("user",user); ActionContext.getContext().getSession().put("AUTHS",authMap); ActionContext.getContext().getSession().put("id",id); returnpath; } privateStringid; privateStringtype; privateEmployeeuser; privateStringloginname; privateStringpassword; privateStringsavepasswd; privateStringerr; privateCommonDaocommonDao; /*订货商集合*/ privateList<Custom>customList=newArrayList<Custom>(); /*发货员集合*/ privateList<Employee>fhyList=newArrayList<Employee>(); publicList<Employee>getFhyList(){ returnfhyList; } publicvoidsetFhyList(List<Employee>fhyList){ this.fhyList=fhyList; } publicList<Custom>getCustomList(){ returncustomList; } publicvoidsetCustomList(List<Custom>customList){ this.customList=customList; } publicCommonDaogetCommonDao(){ returncommonDao; } publicvoidsetCommonDao(CommonDaocommonDao){ thisxmonDao=commonDao; } publicLoginServicegetLoginService(){ returnloginService; } publicServicegetService(){ returnservice; } publicStringgetId(){ returnid; } publicvoidsetId(Stringid){ this.id=id; } publicStringgetType(){ returntype; } publicvoidsetType(Stringtype){ this.type=type; } publicStringgetErr(){ returnerr; } publicvoidsetErr(Stringerr){ this.err=err; } publicStringgetLoginname(){ returnloginname; } publicvoidsetLoginname(Stringloginname){ this.loginname=loginname; } publicStringgetPassword(){ returnpassword; } publicvoidsetPassword(Stringpassword){ this.password=password; } publicStringgetSavepasswd(){ returnsavepasswd; } publicvoidsetSavepasswd(Stringsavepasswd){ this.savepasswd=savepasswd; } publicEmployeegetUser(){ returnuser; } publicvoidsetUser(Employeeuser){ this.user=user; }}4.login.jsp(用户登录页面)<%xpagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%><%xtagliburi="/struts-tags"prefix="s"%><!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><html><head><title>MyJSP'login.jsp'startingpage</title> <metahttp-equiv="pragma"content="no-cache"> <metahttp-equiv="cache-control"content="no-cache"> <metahttp-equiv="expires"content="0"> <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3"> <metahttp-equiv="description"content="Thisismypage"> <!-- <linkrel="stylesheet"type="text/css"href="styles.css"> --><linkhref="<s:urlvalue='/order/css/main.css'/>"rel="stylesheet"type="text/css"media="all"/><scriptsrc="<s:urlvalue='/order/js/jquery-1.4.2.min.js'/>"type="text/javascript"></script></head><bodybgcolor="skyblue"><divalign="center"> <h2>食品进销存管理系统</h2><br/><br/><br/><br/><br/><br/><br/><formaction="loginAction.action"method='post'> <tablewidth="50%"border="0"cellpadding="0"cellspacing="2"align="center"> <tr> <td>用户名</td> <td><inputtype="text"name='loginname'value=''/></td> </tr> <tr> <td>密码</td> <td><inputtype="password"name='password'value=''/></td> </tr> <tr> <td><h3><fontcolor="red">${err}</font></h3></td> </tr> <tr> <tdcolspan="2"align="center"> <inputtype="checkbox"name='savePasswd'value='a'>记住密码 <inputtype="submit"value='登录'/> </td> </tr> </table></form></div></body></html>5.order/list.jsp(销售订单及发货页面)<%xpagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%><%xtagliburi="/struts-tags"prefix="s"%><%xtagliburi="xlfthdd.lft.hdd/tags"prefix="hdd"%><%xpageimport="java.text.*"%><%Stringdatetime=newSimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime());//获取系统时间Stringdate=newSimpleDateFormat("yyyyMMdd").format(Calendar.getInstance().getTime());%><%Stringpath=request.getContextPath();StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html><head><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/><metahttp-equiv="X-UA-Compatible"content="IE=7"/><title>库存管理业务系统</title><linkhref="orders/css/main.css"rel="stylesheet"type="text/css"media="all"/><linkrel="stylesheet"type="text/css"href="css/style.css"><scriptsrc="order/js/jquery-1.4.2.min.js"type="text/javascript"></script><scripttype="text/javascript"> functionadd1(){ vardistId=document.getElementById('distId').value; location.href='<s:urlvalue="/ordersAction.action?method=add&distId="/>'+distId; } functionadd(){ location.href='<s:urlvalue="/orderControl.do?method=getlist"/>'; } functionedit(orderid){ if(confirm("确定此订单要发货?")){ location.href='dispatchOrderAction.action?method=edit&orderid='+orderid; returntrue; } } functionchangecolor(tr){ //改变鼠标指定行的颜色 tr.style.backgroundColor='#666699'; } functionoutColor(tr,color){ //改变鼠标指定行的颜色 tr.style.backgroundColor=color; } </script> <scripttype="text/javascript"> functiontoggle(span){ //找出span的父节点 varul=span.parentNode; //取出所有ul子节点 varlis=ul.childNodes; //判断是否是li节点 for(vari=0;i<lis.length;i++){ varnode=lis[i]; //这里li必须大写LI if(node.nodeName=='UL'){ //判断当前状态block是显示 if(node.style.display!='block'){ node.style.display='block'; }else{ node.style.display='none'; } } } } </script></head><bodyclass="contents-body"><divclass="contents-wrap"> <divclass="commonTitle"> <h2>>>订单管理 >> 订单列表</h2> <ahref='<s:urlvalue="/logoutAction.action"/>'class="btnLong"title="安全登出">安全登出</a> </div> <s:formid="form-search"name="orderForm"action="dispatchOrderAction.action?method=list"method="post"theme="simple"> <tablewidth="100%"border="0"cellspacing="0"cellpadding="0"class="commonTableSearch"> <tr> <thalign="right">订单编号:</th> <td><s:textfieldname="ddbh"class="inputTextNormal"id="ddbh"/></td> <th>制单日期:</th> <td><s:textfieldname="dddate"class="inputTextNormal"id="dddata"/></td> <th>发货日期:</th> <td><s:textfieldname="fhdate"class="inputTextNormal"id="fhdata"/></td> <tdalign="left"><s:select label="选择订货商" list="customList" name="customId" listKey="customid" listValue="customname" emptyOption="false" value="customId" headerKey=""headerValue="-选择订货商-" id='bid' /></td> <tdalign="left"><s:select label="选择发货商" list="fxyList" name="fxyId" listKey="id" listValue="ename" emptyOption="false" value="fxyId" headerKey=""headerValue="-仓库员-" id='bid' /></td> </tr> <tr> <tdalign="right">订单状态:</td> <td> <s:radioname="activate"list="%{#{'已发货':'已发货','未发货':'未发货','2':'全部'}}"theme="simple"></s:radio> </td> <tdalign="right">付款状态:</td> <td> <s:radioname="pm"list="%{#{'已付款':'已付款','未付款':'未付款','2':'全部'}}"theme="simple"></s:radio> </td> <tdalign="right">交易状态:</td> <tdalign="left"> <s:radioname="jyzt"list="%{#{'已完成':'已完成','未完成':'未完成','2':'全部'}}"theme="simple"></s:radio> </td> <tdalign="right"colspan=""> <inputtype="submit"value='检索'class="btnLong"/> </td> </tr> </table></s:form><!--//commonTableSearch--><tablewidth="101%"border="0"cellpadding="0"cellspacing="1"><trclass="commonTable"><thwidth="6%">序号</th><thwidth="10%">订单编号</th><thwidth="8%">制单日期</th><thwidth="8%">制单员</th><thwidth="8%">订货商</th><thwidth="8%">订单状态</th><thwidth="8%">是否付款</th><thwidth="8%">订单金额</th><thwidth="8%">实际付款</th><thwidth="8%">发货时间</th><thwidth="6%">发货员</th><thwidth="8%">交易状态</th><thwidth="6%">发货</th></tr></table><s:iteratorvalue='orderList'var='ord'status="s"><divid="audi"align="center"> <spanonclick='toggle(this)'> <divid="t${orderid}"style="width:1065px;height:30px;float:left"class='${s.count%2==0?"even":"odd"}'> <divid="1c${orderid}"style="width:6%;height:30px;float:left;vertical-align:middle;line-height:30px;"><s:propertyvalue='#s.count'/></div> <divid="2c${orderid}"style="width:10%;height:30px;float:left;vertical-align:middle;line-height:30px;"><s:propertyvalue='ordernum'/></div> <divid="3c${orderid}"style="width:8%;height:30px;float:left;vertical-align:middle;line-height:30px;"><s:propertyvalue='ordertime'/></div> <divid="4c${orderid}"style="width:8%;height:30px;float:left;vertical-align:middle;line-height:30px;"><s:propertyvalue

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论