• java毕业设计—— 基于java+JPA+jsp的进销存管理系统设计与实现(毕业论文+程序源码)——进销存管理系统


    基于java+JPA+jsp的进销存管理系统设计与实现(毕业论文+程序源码)

    大家好,今天给大家介绍基于java+JPA+jsp的进销存管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。

    文章目录:

    1、项目简介

    1. 网络及电子商务的迅猛发展突破了时间、空间的局限性,给中小企业带来了更多的发展机会,同时也增大了企业之间的竞争强度。这就要求中小企业必须改变企业的经营管理模式,提高企业的运营效率。随着技术发展,电脑操作及管理日趋简化,电脑知识日趋普及,同时市场经济快速多变,竞争激烈,企业采用电脑管理进货、库存、销售等诸多环节也已成为必然趋势。

    2、资源详情

    项目难度:中等难度
    适用场景:相关题目的毕业设计
    配套论文字数:25111个字69页
    包含内容:整套源码+完整毕业论文+答辩PPT+辅导视频+运行截图
    资源文件目录简图如下:
    请添加图片描述


    3、关键词:

    进销存管理系统;B/S结构;mysql数据库;JSP;spring;springMVC;spring boot;JPA

    4、毕设简介

    提示:以下为毕业论文的简略介绍,项目源码及完整毕业论文下载地址见文末。

    第一章 绪论
    1.1 研究背景和意义
    省略

    1.2 研究目标
    实现一个进销存管理系统,实现对企业运作过程中的进货、销售、仓储的电子化操作,可以节省大量人力物力,可以说对企业的运作带来不可限量的好处。实现一个简单实用,操作界面友好的进销存管理系统是首要解决的任务。然后一是要实现对库存数据进行分析,对接下来的进货进行一些指导;二是实现对销售数据的采集分析,对企业决策者对下一个季度或者年份的销售计划提供一个参考的功能。系统肯定要具备对进销存的一些基本的增删改查操作。

    1.3 论文结构
    第一章绪论:主要叙述了进销存管理系统开发的缘由和意义,也就是开发这个系统的背景。开发这个系统有哪些优点,开发的这个系统具备哪一些功能,或者说能开发出哪些功能,对这些功能进行了一个概述。

    第二章相关技术和方法:本章节首先是概述了系统的结构,用那些技术搭建的开发环境;接下来是简单介绍了一下关键功能和是怎么实现这些关键功能;最后是介绍了用到的开发工具。

    第三章系统分析:本章节的重点系统分析,主要从可行性分析和需求分析两方面入手。可行性分析从技术可行性、经济可行性、操作可行性三个方面进行综合分析,最终得出系统开发的可行;需求分析从两个方面分析:系统总体需求和用例图分析,从这两个方面确定系统是可行的。

    第四章系统设计:本章节主要分为系统类设计、关键业务设计、数据库设计三个模块。系统类设计主要是用类图来呈现系统中类的一些属性和功能;关键业务设计主要是用顺序图来直观的呈现这些功能的处理流程和处理步骤;数据库设计首先是用了ER图来直观的把数据库表的一些属性表示出来,其次对涉及到的每一张表都进行了分析和介绍。

    第五章系统实现:本章节主要是对核心功能介绍,首先是功能描述,然后附上实现的界面,接下来详细描述功能的实现过程并且附上实现这些功能的核心代码。

    第六章系统测试:本章是说明测试目标和测试计划,对测试目标给出测试用例,并分析测试结果是否达到系统预期,如未达到提出改进的措施。

    第七章总结:本章主要是对进销存系统的设计的整个过程做一个总结,说明本论文的结构组成,从绪论开始到总结结束,对每一个大的章节内容进行简单的叙述。并且阐述了自己的收获与不足,给出不足的解决方案。

    1.4 本章小结
    本章从研究的背景开始,叙述了进销存管理系统开发的整个流程,为什么要开发这个系统,开发这个系统有啥优势。其次就是描述了本系统需要开发出什么的功能,需要具备什么样的功能,能否开发出这些功能。最后对正文的每个章节进行了一个简单的描述。

    第二章 相关技术与方法
    2.1 架构概述
    本系统设计采用的是MAVEN + SPRING BOOT+ JPA 的架构来搭建的项目。Maven是一个不错的项目管理工具,它包含了一个项目对象模型,一组标准集合,一个项目生命周期,一个依赖管理系统,和用来运行定义在生命周期阶段中插件目标的逻辑。由于 Maven 的缺省构建规则具有不错的可重用性,因此用Maven 可以快速的构建项目。Spring Boot是由Pivotal团队提供的全新框架,设计这个框架目的就是用来简化Spring应用的初始搭建以和开发过程。这个框架使用了特定的方式做配置,因此开发人员不需要和传统的Spring应用一样写大量的配置文件。Springboot具有以下优势:创建的Spring应用程序是独立的;本身嵌入了Tomcat,无需部署WAR文件;Maven配置作了简化;自动配置Spring。因此用maven加上spring boot可以让我们快速的搭建起项目来,可以省去很多繁琐的步骤。

    JPA全称为Java Persistence API,是通过注解或者XML来描述对象-关系表的映射关系,并且可以将在运行的Entity类对象存储到数据库中去。使用JPA可以打破一般简单持久化框架的局限,在我们开发企业级应用中发挥更大作用,因为JPA支持容器级事务:大数据集、事务、并发等。使用JPA创建实体非常简单,就和我们平常创建一个JAVA类一样,不存在任何的约束和限制,我们只需要在对应的实体上标注javax.persistence.Entity注解即可;开发人员很容易就可以掌握JPA,因为JPA没有特殊的规则和太多的设计模式,框架和接口都很简单。JPA采用的原则是非侵入式原则,因此对其他框架的兼容性很好,易于和其他框架集成。JPA中定义了和Hibernate HQL相似的QL:JPQL,它是EJB QL的一种拓展,操作的对象是实体,而不是关系数据库的一张表。而且能够正常的支持SQL才能够提供的高级查询特性:批量修改和更新、JOIN、GROUPBY、HAVING等,并且支持子查询功能。最重要的是JPA也支持面向对象的高级特性,这样的话开发者在开发企业级应用时能够最大化的使用面向对象的模型来设计,而不用自己来处理这些特性的持久化。

    用这三个技术搭建项目框架,可以快速完成,省去许多简单繁杂的步骤,对于我们快速开发是有非常大的优势的。

    2.2 关键技术简介
    作为一个进销存管理系统,其最根本的功能还是在对采购管理、销售管理和库存管理上面,其他的功能都是在这个的基础上才能够开发出来。基础功能也就是对进货、销售和库存的增删改查。其中对进货订单的添加和销售订单的添加,每个订单都含有一个或者多个商品,因此订单生成时做了跟购物车类似,我们可以把商品一个一个添加到这个购物车上,等我们商品添加完成,此时可以提交订单,这样就产生 了一个进货订单或者销售订单。跟数据库打交道肯定少不了连接数据库的技术,在本系统用到的是JPA,JPA本身有许多默认的增删改查的方法,并且不用写配置文件,而且可以自己个性化定制sql语句,只需要写一个接口继承JPARepository接口,然后在这个接口里写抽象方法,在方法上写注解就可以了,很方便。

    首先是数据分析功能,因为我们本身数据库里存有大量的销售数据库,所以我们就不用去收集数据了,直接对数据库里的数据进行分析即可。第一阶段:探索性数据分析,因为数据库里的数据是杂乱无章的,因而看不出规律。因此我们需要通过作图、表格、用各种形式的方程拟合、计算某些特征量等手段来找出某些可能的关联或某些隐含在数据中的规律。第二阶段:选定模型进行分析,接下来我们通过前面的初步操作,在探索性分析的基础上提出一种或几种可能的模型,然后通过进一步分析从里面挑选最符合当前发展的几个模型。第三阶段:推断分析,使用数理统计方法对第二阶段所定的模型做出以下判断:估计的可靠程度,精确程度作出推断。选定最终的模型。

    其次是数据备份功能,企业在运转中,系统难免会出现一些突发情况导致数据的丢失、损坏。因此当出现这些情况时,我们就需要把备份的数据恢复到数据库中去。备份数据时会占用较大的IO资源的,因此我们需要选择一个对系统影响尽可能地小的时段来进行数据的备份;对重要的数据,要保证在极端情况下的数据都可以正常恢复。在选择备份方案时要考虑到实施方案的可操作性和经济性,因此选择了逻辑备份,此方法不需要数据库运行在归档模式下,不但备份简单,而且可以不需要依赖外部存储设备。

    2.3 开发工具
    系统前段页面采用jsp + JavaScript + css的组合技术开发,其中JavaScript使用了jQuery和bootstrap框架,这两个前段框架让我们能更友好的使用JavaScript。省去了许多步骤,简化了我们的使用。数据库使用的是MySQL数据库,MySQL 是现阶段最流行的关系型数据库之一,因为它的体积小、运行速度快、免费,尤其是开放源码这一特点,一般中小型网站的开发都会选择MySQL作为网站数据库。考虑到系统设计的用户群体以及MySQL数据库的这些优点,于是选择了MySQL数据库作为开发数据库。开发使用的IDE工具是:Spring tool suit,这个IDE工具是Spring官网推荐的开发工具,在使用Spring体系的框架开发应用是,这个IDE工具具有很多优势。Web服务器是使用的Spring boot内置的Tomcat服务器。根据以上选择的框架、工具,选择了JDK1.8作为开发、编译环境。

    2.4 本章小结
    本章主要简单叙述了系统使用了的框架、用了哪些开发工具。重点介绍如何实现系统的核心功能,还有实现这些功能用到了哪些技术,对这些方面进行了阐述。

    第三章 系统分析
    3.1 可行性分析
    3.1.1 技术可行性
    基于本项目用到的spring boot、JPA、mysql、jQuery等技术都已经是成熟的开发技术了,完全可以满足本项目的开发需求。项目主要功能所涉及的一些技术都能是能够实现的,因此在技术上是可行的。

    3.1.2 经济可行性
    省略

    3.1.3 操作可行性
    省略

    3.2 需求分析
    3.2.1 系统总体需求
    系统需要具备以下功能:
    ⑴一般企业人员的计算机知识掌握的不多,因此要求有良好的人机交互界面,这样对操作这个系统的企业人员比较友好。
    ⑵对于本系统使用对象的不同,需要给予不同的权限。
    ⑶支持多条件语句查询,方便进销存数据的查询。
    ⑷基础信息管理与查询(包括商品信息、客户信息、供应商信息)。
    ⑸一键点击,能够直接查看仓库所有商品的库存信息。
    ⑹方便、健全的账单统计功能。
    ⑺图表分析年销售状况。
    ⑻商品销售排行统计。
    ⑼当停电、网络病毒的原因损坏本系统数据时,系统可以还原系统的数据。
    ⑽各种数据的统计计算自动完成,尽可能的减少人工干预。
    ⑾系统退出。

    表3-1 质量要求
    在这里插入图片描述

    3.2.2 用例图分析
    在这里插入图片描述

    图3-1系统管理用例图

    系统管理用例有配置系统、管理部门、管理员工、管理权限,这里主要介绍一下管理权限,具体说明见表3-1:

    表3-1管理权限
    在这里插入图片描述

    在这里插入图片描述

    图3-2财务用例图

    财务用例有查询应收款项、记录应收应付款项、管理发票,这里主要介绍一下记录应收应付款项,具体说明见表3-2:

    表3-2记录应收应付款项
    在这里插入图片描述
    在这里插入图片描述

                               图3-3 采购部分用例图
    
    • 1

    采购部分用例有两个角色采购员和采购经理。采购员用例有采购单、管理供应商、管理商品信息;采购经理用例有审批采购单、管理商品分类。具体说明见表3-3至表3-4:

    表3-3采购单
    在这里插入图片描述

    表3-4审批采购单
    在这里插入图片描述

    在这里插入图片描述

                             图3-4库存部分用例图
    
    • 1

    库存部分总共有质检员、库存管理员、仓库经理三个角色,涉及到的用例比较多,这里具体介绍一下出入库单、确认入库单、开出库单、统计库存信息、出调拨单,具体说明见表3-5至表3-9:

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    3.3 本章小结
    本章主要是进行了系统的分析,首先第一节是可行性分析,从技术可行性、经济可行性、操作可行性三个角度对系统分析是否是可行的,最终得出本系统是可行的。第二节是需求分析分析了系统所具备的一些的功能,然后重点介绍了一些特色功能。接着第二节是需求分析,第一小节阐述了系统的总需求,应该具备哪些功能;第二小节通过用例图对需求主要功能进行了具体分析。

    第四章 系统设计
    4.1 系统类分析
    经分析,该系统核心业务类见下图:

    在这里插入图片描述

    图4.1 系统核心类

    4.1.1 MANAGER类
    MANAGER类用于记录系统的用户信息,并完成登陆和注销的操作。
    表4-1 MANAGER类功能表
    在这里插入图片描述

    4.1.2 GOODS类
    GOODS类用于记录商品的信息,并且实现对商品的增删改查等功能。

    表4-2 GOODS类功能表
    在这里插入图片描述

    4.1.3 SALEORDER类
    SALEORDER类用于记录销售订单的信息,并且实现对销售订单的增删改查等功能。

    表4-3 SALEORDER类功能表
    在这里插入图片描述

    4.1.4 PURCHASEORDER类
    PURCHASEORDER类用于记录采购订单的信息,并且实现对采购订单的增删改查等功能。

    表4-4 PURCHASEORDER类功能表
    在这里插入图片描述

    4.1.5 STOCK类
    STOCK类用于记录库存的信息,并且实现对库存的增删改查等功能。

    表4-5 STOCK类功能表
    在这里插入图片描述

    4.2 关键业务设计
    关键业务与用例图之间存在一定的对应关系,原则上用例图中所提出的用例应该在关键业务分析中体现,每一个用例对应一个时序图,每个时序图后面应当有一段简短的说明,时序图用WORD绘制比较难,可以借用其他工具,但复制过来时应尽量只有黑白颜色,下面以登录为例说明关键业务的说明方法。
    4.2.1 添加商品

    在这里插入图片描述

    图4.2 添加商品顺序图
    采购业务员通过UI界面选择添加商品菜单,此时后台controller会判断该操作用户是否有权限;权限检查通过,操作员进入到商品添加表单,输入商品信息提交,后台controller会调用service的add方法,service中的方法add在调用database中的板寸方法。成功后返回成功提示。
    4.2.2 查询商品
    在这里插入图片描述

    图4.3 查询商品顺序图
    采购业务员通过UI界面输入查询条件,此时后台controller会检查查询条件;controller会调用service里面的find方法,find方法会调用database中具体的查询方法;把查询到的结果显示到UI界面。
    4.2.3 添加库存

    在这里插入图片描述

    图4.4 添加库存顺序图
    库存业务员通过UI界面选择商品菜单,输入该商品的库存信息,此时后台controller检查输入商品库存信息;controller会调用service中的add方法,add方法调用database中的具体添加方法处理,添加成功返回功能提示。
    4.2.4 添加销售订单

    在这里插入图片描述

    图4.5 添加销售订单顺序图
    销售业务员通过UI界面选择添加订单菜单,输入订单信息,此时后台controller会检查订单信息;controller会调用service中的update方法,update方法会调用database中的具体更新方法,更新成功后会返回成功提示。

    4.3 数据库设计
    4.3.1 概念设计
    (一)总的E-R图
    在这里插入图片描述

    图4.6 系统ER图

    (二)分E-R图

    在这里插入图片描述

    图4.7 商品ER图

    在这里插入图片描述

    图4.8 顾客ER图

    在这里插入图片描述

    图4.9 供应商ER图

    在这里插入图片描述

    图4.10 管理员ER图

    日志用于记录用户的日常行为,通过用户编号与用户实体之间存在一对多关系。
    4.3.2 数据库表
    系统中使用到数据库基本如表4-1所示。
    表4-1 系统数据库表
    在这里插入图片描述

    (1) 顾客表
    顾客表用于记录顾客信息,顾客表的具体字段如表4-2所示。
    表4-2 顾客表
    在这里插入图片描述

    字段顾客编号为本表的主键,用来标识一个顾客,字段顾客名称非空字段,字段顾客地址、邮编、联系电话、联系人、联系人号码、开户银行、银行账号、邮箱是顾客的一些详细信息。
    (2) 部门表
    部门表用于记录部门的信息,部门表的具体字段如表4-3所示。
    表4-3 部门表
    在这里插入图片描述

    字段部门编号为本表的主键,用来标识一个部门,字段部门名称为非空字段。

    (3) 员工表
    员工表用于记录员工的信息并且用于员工登录系统,员工表的具体字段如表4-4所示。
    表4-4 员工表
    在这里插入图片描述

    字段员工编号为本表的主键,用来标识一个员工,员工名字和员工密码为非空字段,部门ID为外键,引用自部门表;字段性别、年龄和手机号码为员工的一些基本信息。
    (4) 商品表
    商品表用于记录商品的信息,商品表的具体字段如表4-5所示。
    表4-5 商品表
    在这里插入图片描述

    字段商品编号为本表的主键,用来标识一个商品,字段商品名称不为空,字段供应商编号为外键,引用自供应商表,字段单位、商品产地、批准文号和生产批号为商品的一些属性。
    (5) 管理员表
    管理员表用于记录管理员的信息并且用于管理员登录系统,管理员表的具体字段如表4-6所示。
    表4-6 管理员表
    在这里插入图片描述

    字段管理员编号为管理员表的主键,用来标识一个管理员,字段管理员名字和密码是不能为空的,部门编号是一个外键,引用自部门表,字段性别、年龄和手机号码是管理员的一些个人信息。
    (6) 采购单明细表
    采购单明细表用于记录采购单信息,采购单明细表的具体字段如表4-7所示。
    表4-7 采购单明细表
    在这里插入图片描述

    字段采购单明细编号为采购单明细表的主键,用来标识一个采购订单明细,其中字段采购单编号和商品名称是外键,分别引用自采购订单表和商品表,字段单价和数量是采购单明细表的属性。
    (7) 采购订单表
    采购订单表用于记录采购单信息,采购订单细表的具体字段如表4-8所示。

    表4-8 采购订单表
    在这里插入图片描述

    字段采购单编号为采购订单表的主键,用来标识一个采购订单,其中字段采购商编号为外键,引用自采购商表,字段支付方式、采购日期和总金额为采购订单的信息。
    (8) 采购退货明细表
    采购退货明细表用于记录采购退货单信息,采购退货明细表的具体字段如表4-9所示。
    表4-9 采购退货明细表
    在这里插入图片描述

    字段采购退货单明细编号是采购退货明细表的主键,用来标识一个采购退货明细,其中采购退货单编号和商品名称是外键,分别引用自采购退货表和商品表。字段单价和数量为采购明细表的属性。
    (9) 采购采购退货表
    采购采购退货表用于记录采购采购退货信息,采购采购退货表的具体字段如表4-10所示。
    表4-10 采购采购退货表
    在这里插入图片描述

    字段采购退货单编号是采购退货表的主键,用来标识一个采购退货,其中字段采购商编号为外键,引用自采购商表,字段支付方式、退货日期和总金额为采购退货表的属性。
    (10) 销售订单明细表
    销售订单明细表用于记录销售订单明细信息,销售订单明细表的具体字段如表4-11所示。
    表4-11 销售订单明细表
    在这里插入图片描述

    字段销售订单明细编号是销售订单明细表的主键,用来标识一个销售明细,其中字段销售订单编号和商品名称是外键,分别引用自销售订单表和商品表,字段单价和数量是销售订单明细的属性。
    (11) 销售订单表
    销售订单表用于记录销售订单信息,销售订单表的具体字段如表4-12所示。
    表4-12 销售订单表
    在这里插入图片描述

    字段销售单编号是销售订单表的主键,用来标识一个销售订单,字段顾客编号是外键,引用自顾客表,字段支付方式、销售日期和总金额是销售订单表的属性。
    (12) 销售退货明细表
    销售退货明细表用于记录销售退货明细信息,销售退货明细表的具体字段如表4-13所示。
    表4-13 销售退货明细表
    在这里插入图片描述

    字段销售退货订单明细编号是销售退货明细表的主键,用哪个来标识一个销售退货明细,字段销售退货订单编号、商品名称为外键,分别引用自销售退货表和商品表,字段单价和数量为销售退货明细表的属性。
    (13) 销售退货表
    销售退货表用于记录销售退货信息,销售退货表的具体字段如表4-14所示。
    表4-14 销售退货表
    在这里插入图片描述

    (14) 库存表
    库存表用于记录库存信息,库存表的具体字段如表4-15所示。
    表4-15 库存表
    在这里插入图片描述

    字段库存编号是库存表的主键,用来标识一个库存,字段商品编号是外键,引用自商品表,字段商品库存数量不为空,字段存放地方为库存表的属性。
    (15) 供应商表
    供应商表用于记录供应商信息,供应商表的具体字段如表4-16所示:
    表4-16 供应商表
    在这里插入图片描述

    字段供应商编号是供应商表的主键,用来标识一个供应商,字段供应商名称不为空,字段顾客地址、邮编、联系电话、联系人、联系人号码、开户银行、银行账号和邮箱是供应商表的属性。

    4.4 本章小结
    本章主要分为三个小节来介绍系统设计。第一节是系统类分析,主要是通过类图的方式来介绍系统设计到的类,介绍类里的属性和设计到的方法。第二节是关键业务设计,主要是通过顺序图的方式来介绍核心业务的设计和处理过程。第三节是数据库设计,首先是通过ER图的方式介绍设计到的模块和模块的一些字段(分为总ER图和分ER图),其次是数据库表,介绍了所设计到的表,详细的介绍了表中的字段和字段对应的关系。

    第五章 系统实现
    5.1 用户登录
    (1) 功能描述
    登录是对用户使用系统功能进行身份验证的过程,登录也是可以很好的控制用户的权限问题,登录界面要求简明易懂。每一用户都有自己的独有的账号和密码,用户在系统的每一个操作都有日志进行记载,可以有效保证数据可追溯性,做到责任到人,界面如下图。

    在这里插入图片描述

    图5.11 用户登录
    (2) 实现流程
    在登陆按钮添加监听事件,在用户输入账号密码点击登录后,终端先判断是否满足JS中的验证方法,此方法是防止当账号密码为空时登录的提示,如果为空跳出一个对话框来提示用户账号和密码需要填。如果不为空,后台会把接受的用户名密码与数据库数据库中用户信息比较核对,如果是一致则顺利登录到用户权限所对应的界面中,否则出现账号密码错误的提示,登录失败。登录流程如图5-12所示。实现代码如下:

    if("manager".equals(user)){
    	Managers managers = null;
    	try {
    			managers = managerService.login(name, password);
    	} catch (ServiceException e) {
    		e.printStackTrace();
    	}
    	if(managers!=null){			
    		logger.info(name+"登录成功!!!");
    		ServletContext app = req.getSession().getServletContext();
    		app.setAttribute("user",managers);
    		req.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(req, resp);
    	}else{
    		logger.info("登录失败,用户名或者密码错误");
    		HttpSession session = req.getSession();
    		session.setAttribute("msg","用户名或者密码错误");
    		resp.sendRedirect("login.html");
    	}
    }else if("employee".equals(user)){
    	Employee employee = null;
    	try {
    		employee = managerService.employeelogin(name, password);
    	} catch (ServiceException e) {
    		e.printStackTrace();
    	}
    	if(employee!=null){			
    		logger.info(name+"登录成功!!!");
    		ServletContext app = req.getSession().getServletContext();
    		app.setAttribute("user",employee);
    		req.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(req, resp);
    	}else{
    		logger.info("登录失败,用户名或者密码错误");
    		HttpSession session = req.getSession();
    		session.setAttribute("msg","用户名或者密码错误");
    		resp.sendRedirect("login.html");
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    在这里插入图片描述

    图5.12 用户登录
    5.2 采购管理
    (1) 功能描述
    采购管理是对需要采购的订单的综合管理,在这个模块里包含采购订单、收货入库、采购退货三个子模块。其中采购订单是员工用来生成采购单的,还有对采购单的一些处理;收货入库是对已经提交的采购单进行入库操作;采购退货是把我们已经提交的采购单进行退货处理的操作。主要界面如下图:

    在这里插入图片描述

    图5.13 采购管理
    (2) 实现流程
    点击采购订单按钮会跳转到采购订单首页,在首页可以看到所有已经提交的采购单信息;当我们想添加新的采购订单的时候,首先点击添加商品按钮,会跳转到商品添加页面,我们把商品信息输入进去之后点击提交,后台方法会把商品信息暂时存起来,当我们把所有商品添加完成,我们可以再点击添加订单按钮,此时会把我们添加的所有的商品都提交生成一个采购订单,并且把数据存进对应的数据库表中保存起来。对已经提交的订单当我们点击退货按钮时,后台会接收到要退货的订单ID,并且根据ID到数据库中订单表把数据删除,同时在退货表中把数据插进去。当我们点击入库按钮时,后台会接收到需要入库的订单的ID,并且把订单表中的flag字段的值修改为已入库,同时在库存表中会新加一条数据。主要实现代码如下:

    		Long suppliersId = Long.parseLong(request.getParameter("suppliersId"));
    		String name = request.getParameter("name");
    		Double price = Double.parseDouble(request.getParameter("price"));
    		Long count =Long.parseLong(request.getParameter("count"));		
    		String unit = request.getParameter("unit");
    		String space = request.getParameter("space");
    		Long supplierId = Long.parseLong(request.getParameter("supplierId"));
    		String approveId = request.getParameter("approveId");
    		String batchId = request.getParameter("batchId");		
    		purchaseItem = new PurchaseItem();
    		purchaseItem.setCount(count);
    		purchaseItem.setPrice(price);
    		purchaseItem.setName(name);
    		purchaseItem.setSupplierId(suppliersId);
    		list.add(purchaseItem);
    		model.addAttribute("list", list);
    		logger.info("成功添加商品");
    logger.info("提交采购订单");
    		String pay = request.getParameter("pay");
    		purchaseOrder = new PurchaseOrder();
    		purchaseOrder.setPay(pay);
    		purchaseOrder.setInDate(new Date());
    		purchaseOrder.setFlag("未入库");
    		try {
    			int i = managerService.addPurchaseOrder(purchaseOrder, list);
    			if(i==1){
    				list.removeAll(list);
    				/*orderList.removeAll(orderList);*/
    				orderList = managerService.findPurchaseOrderByPage(0);
    				count = managerService.findPurchaseOrderCount();
    				currentPage = 1L;
    				totalPage = managerService.getTotalPage();
    				model.addAttribute("currentPage", currentPage);
    				model.addAttribute("totalPage", totalPage);
    				model.addAttribute("orderList", orderList);
    				model.addAttribute("count", count);
    				logger.info("提交采购订单成功");
    			}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    5.3 库存管理
    (1) 功能描述
    库存管理是对仓库里的商品的综合管理,包括商品入库、商品出库、某种商品的库存查询、商品移库和库存盘点。商品入库是对新的商品需要入库的管理;商品出库是根据销售订单到库存里拿出对应数量的商品并且库存进行相应的减少;库存查询是输入想查询的商品会返回该商品的库存数量;商品移库是输入商品ID和需要移动到的仓库号就可以更改商品的存放仓库;最后一个是库存盘点,该功能是返回仓库里所有商品的库存信息。主要界面如下图:
    在这里插入图片描述

    图5.31商品出库
    在这里插入图片描述

    图5.32库存查询
    在这里插入图片描述

    图5.33商品移库
    (2) 实现流程
    首先是商品入库,点击商品入库按钮跳转到对应商品添加页面,填入对应商品信息,后台首先会判断该商品在商品表里是否已经存在,如果存在,则更新该商品的库存即可,如果不存在,则先在商品表里添加一条商品的信息,再到库存表里添加一条库存信息。商品出库,首先是输入需要出库的商品ID和该商品出库的数量,后台根据接收的商品ID和数量到数据库库存表去更新该商品的库存数量。库存查询,输入需要查询库存的商品ID,后台会根据商品的ID去库存表里查询该商品的库存数量,并且返回到对应的前台页面。商品移库,输入商品ID和移动到的仓库号,后台会根据商品ID号到数据库库存表中更新该商品的库存地方。库存盘点,这个功能是会显示所有商品的库存信息。主要实现代码如下:
    商品入库:

    public int stockAdd(Stock stock, Goods goods) throws ServiceException {
    	Goods gods = goodsRepository.findGoodsByName(goods.getName());
    	if(gods==null){			
    		gods = goodsRepository.save(goods);
    	}
    	stock.setGoodsId(gods.getId());
    	Stock stok = findStockByGoodsId(gods.getId());
    	if(stok==null){			
    		stockRepository.save(stock);
    	}else{
    stockRepository.updateStockCountByGoodsId(stok.getCounts()+stock.getCounts(),stock.getGoodsId());
    	}
    	return 1;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    商品出库:

    @RequestMapping("/update")
    public String UpdateStock(HttpServletRequest request,Model model){	
    	logger.info("库存信息更新开始");
    	Long goodsId = Long.parseLong(request.getParameter("goodsId"));
    	Long count = Long.parseLong(request.getParameter("count"));
    	try {
    		stockService.updateStock(goodsId,count);
    		outList = stockService.findStockByPage(0);
    		model.addAttribute("outList", outList);
    		logger.info("库存信息更新完成");
    	} catch (ServiceException e) {
    		e.printStackTrace();
    	}
    	return "outStock";		
    }
    商品移库:
    @RequestMapping("updateArea")
    public String upDateArea(HttpServletRequest request,Model model){
    	logger.info("存放仓库信息更新开始");
    	Long goodsId = Long.parseLong(request.getParameter("goodsId"));
    	String area = request.getParameter("area");
    	try {
    		stockService.updateStockAreaByGoodsId(area,goodsId);
    		List<Stock> list = stockService.findAllStock();
    		model.addAttribute("outList", list);
    		logger.info("存放仓库信息更新完成");
    	} catch (ServiceException e) {			
    		e.printStackTrace();
    	}
    	return "updateArea";		
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    5.4 销售管理
    (1) 功能描述
    销售管理对销售订单的综合管理,包含销售订单、发货出库和销售退货。销售订单,将销售的信息形成销售订单并且存入到数据库销售订单表中;发货出库,将提交的销售订单的flag状态改为已发货,并且对应的库存表中的库存数量也相应的减少;销售退货,对已经销售的订单进行退货处理。主要界面如下图:
    在这里插入图片描述

    图5.41 销售管理

    (2) 实现流程
    首先是销售订单,第一步是点击添加商品,然后输入对应的商品信息点击提交,后台接收到数据,会暂时将商品信息存储起来,当商品添加完毕,点击添加订单按钮,可以将刚才添加的所有订单信息提交到后台,后台在将这些订单信息持久化到数据库中去。发货出库,对提交销售的订单可以进行发货操作,后台会根据订单ID对订单表中的flag字段值修改为已发货,并且会到库存表中去,将该订单对应的商品的库存数作相应的改变。销售退货,对已经提交的订单可以进行退货操作,点击退货按钮,后台会根据订单ID到数据库销售订单表中把对应订单信息删除,并且在销售退货表中加入相应的退货记录,与此同时会根据flag字段,如果flag字段值是未发货,则不用去库存表跟新库存数据,如果flag字段的值为已发货,则需要到库存表中把订单对应的商品的库存数加回去。主要实现代码如下:

    @RequestMapping("/addSaleOrder")
    public String saveSaleOrder(HttpServletRequest request,Model model){
        String pay = request.getParameter("pay");
        SaleOrder saleOrder = new SaleOrder();
        saleOrder.setFlag("未发货");
        saleOrder.setPay(pay);
        saleOrder.setSaleDate(new Date());
        try {
    		int i = saleService.addSaleOrder(saleOrder,itemList);
    		if(i==1){
    			itemList.clear();
    			saleorderList = saleService.findSaleOrderByPage(0);
    			cunt = saleService.findSaleOrderCount();
    			crrentPage = 1L;
    			ttalPage = saleService.getTotalPage();
    			model.addAttribute("crrentPage", crrentPage);
    			model.addAttribute("ttalPage", ttalPage);
    			model.addAttribute("saleorderList", saleorderList);
    			model.addAttribute("cunt", cunt);
    		}
    	} catch (ServiceException e) {
    		e.printStackTrace();
    	}
    	return "sale";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    5.5 备份与恢复
    (1) 功能描述
    备份与恢复,顾名思义就是对系统的重要数据进行备份,以备不时之需,备份是可以设定每天在一个固定的时间自动进行备份;当系统数据损坏时我们可以自由选择恢复哪一天的数据。主要界面如下图:
    在这里插入图片描述

    图5.51 数据备份与恢复
    (2) 实现流程
    备份功能,首先当系统启动的时候已经设定了一个自动备份的时间点,每天到这个时间点都会自动把数据库的数据备份一次,但是我们也可以手动备份,我们只需要点击数据备份就可以了;数据恢复,当某个时候系统数据损坏或者丢失的时候,此时我们就可以用到数据恢复功能了,我们可以选择恢复到一个时间点的数据文件。主要实现代码如下:

    public static void backup() {
         try {
             Runtime rt = Runtime.getRuntime();
             // 调用 调用mysql的安装目录的命令
             Process child = rt.exec(backuppath);
             // 设置导出编码为utf-8。这里必须是utf-8
             // 把进程执行中的控制台输出信息写入.sql文件,即生成了备份文件。注:如果不对控制台信息进行读出,则会导致进程堵塞无法运行
             InputStream in = child.getInputStream();// 控制台的输出信息作为输入流
             InputStreamReader xx = new InputStreamReader(in, "utf-8");
             // 设置输出流编码为utf-8。这里必须是utf-8,否则从流中读入的是乱码
     
              String inStr;
              StringBuffer sb = new StringBuffer("");
              String outStr;
              // 组合控制台输出信息字符串
              BufferedReader br = new BufferedReader(xx);
              while ((inStr = br.readLine()) != null) {
                  sb.append(inStr + "\r\n");
              }
              outStr = sb.toString();
              // 要用来做导入用的sql目标文件:
              SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmm");
              FileOutputStream fout = new FileOutputStream("D:\\jxc\\backup\\"+sdf.format(new Date())+".sql");
              OutputStreamWriter writer = new OutputStreamWriter(fout, "utf-8");
              writer.write(outStr);
              writer.flush();
              in.close();
              xx.close();
              br.close();
              writer.close();
              fout.close();
          } catch (Exception e) {
              e.printStackTrace();
          }
      }
    	/**
    	 * 备份数据恢复
    	 * @param databaseName
    	 */
    public static void restore(String fileName) {
           try {
               Runtime runtime = Runtime.getRuntime();
               Process process = runtime .exec(restorepath);
               OutputStream outputStream = process.getOutputStream();
               BufferedReader br = new BufferedReader(new InputStreamReader(
                      new FileInputStream("D:\\jcx\\backup\\"+fileName), "utf-8"));
               String str = null;
               StringBuffer sb = new StringBuffer();
               while ((str = br.readLine()) != null) {
                   sb.append(str + "\r\n");
               }
               str = sb.toString();
               // System.out.println(str);
               OutputStreamWriter writer = new OutputStreamWriter(outputStream,
                        "utf-8");
               writer.write(str);
               writer.flush();
               outputStream.close();
               br.close();
               writer.close();
           } catch (UnsupportedEncodingException e) {
               e.printStackTrace();
           } catch (FileNotFoundException e) {
               e.printStackTrace();
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    5.6 本章小结
    本章主要是介绍了系统实现,重点介绍了系统的用户登录、采购管理、库存管理、销售管理、备份与恢复五个模块。这五个模块首先分别介绍了他们的功能,并且附上界面图,然后再从实现流程上对这些功能进行详细的描述,最后附上实现这些功能的主要代码。

    第六章 系统测试
    6.1 系统测试综述
    系统完成后,对系统的测试是非常重要的一环。首先在系统的每个模块完成后对这个模块做的单元测试,另外一个是在系统整体完成了后对整个系统做的综合测试。
    用户登录模块,当用户输入正确的用户名和密码时,能正常登录;当用户输入错误的用户名或者错误的密码或者不存在的用户名的时候,系统应当输出响应用户名或者密码错误;当用户没有输入用户名或者没用输入密码或者两者都没有输入的时候,系统应当响应用户名、密码项是必填项。

    采购管理模块,当天如对应的商品信息时,后台新系统能够接收到商品信息,并且在提交订单的时候能够顺利把这些信息都持久化到数据库中去,并且在出错的时候能正确返回对应的错误码;对采购订单入库时,能正常的把flag标志改为已入库,并且在库存表中更新响应的商品库存信息;销售退货,后台能根据订单ID将采购订单表中的数据删除,并且把数据插入到采购退货表中去。

    库存管理模块,商品入库功能,当用户把商品信息输入正确的时候,后台能够真确的收到数据,并且正确的持久化到数据库中去;商品出库,当用户输入出库的商品和数量时,后台能够正确到数据库库存表把对应的商品的数量相应的减少;库存查询,当输入商品的ID时,后台能根据这个ID查出该商品的库存信息,并且能正确的返回到用户界面;商品移库,当输入商品ID和移库的信息后,后台能正确地更新数据库中对应商品的库存信息。
    销售管理模块,销售模块,当前段把销售订单的信息都正确输入的时候,后台能正确的接收到订单信息,并且把订单信息正确持久化到数据库中去,在产生错误时,能够返回对应的错误码;发货出库,当销售订单的信息提交之后,我们可以对这些的订单做发货操作,点击发货后,后台要把相应商品的库存信息进行更新,并且把订单表中的flag字段的值改为已发货;销售退货,点击退货按钮,后台能正常的把销售订单表中的对应订单信息删除,并且在销售退货表中把退货信息存进去,并且要把商品的数量加回到库存表中去。

    备份与恢复模块,首先是系统每天能够在固定时间产生一个备份数据库的文件,然后在我们手动点击备份按钮的时候也能够产生一个备份数据库的文件;当点击恢复按钮时,会把我们选择的数据库文件恢复到数据库中去。

    6.2 测试用例
    6.2.1 用户登录模块
    表6-1 用户登录
    在这里插入图片描述

    6.2.2 采购管理模块
    表6-2 采购管理
    在这里插入图片描述

    6.2.3 库存管理模块
    表6-3 库存管理
    在这里插入图片描述

    6.2.4 销售管理模块
    表6-4 销售管理
    在这里插入图片描述

    6.2.5 备份与数据恢复模块
    表6-5 备份与数据恢复
    在这里插入图片描述

    6.3 测试分析
    经过这些测试,整个系统的大部分功能都已经能够正常的运行,达到了我们预想的结果。对于采购管理、库存管理和销售管理三个模块先阶段的功能都能达到预期效果,但是还可以加入一些其他的支持(对Excel表格的支持),能够直接导入Excel表格的数据,并且可以直接导出为Excel表格,这个功能暂时还没达到预期效果,因此需要把这个功能加上;在一个就是对权限的控制方面做的不是特别完善,因此接下来,在权限方面还应该加强。对于备份和数据恢复功能,现在和预期的结果是一致的,比较符合。实力和时间的限制,在代码的编写上面,存在许多的冗余代码,因此这方面需要改进,把重复的代码封装成方法,减少冗余度。

    6.4 本章小结
    本章主要是对已完成的功能做系统测试,分模块的进行测试,测试这些功能是否能达到预期的结果;为什么没有达到预期。对于每一个模块都写了相应的测试用例,通过这些测试用例的分析,整个系统的功能基本上达到了预期的效果,但是还有进一步改进的地方,让整个系统更完善。
    第七章 总结
    省略

    参考文献
    [1] 辛运帏等. java语言程序设计[M].北京:人民邮电出版社,2009
    [2] (美)(Nicholas C.Zakas)扎卡斯. JavaScript高级程序设计[J].人民邮电出版社2006
    [3] 姜承尧. MySQL技术内幕:InnoDB存储引擎[M].机械工业出版社 2011-1
    [4] 张海藩;吕云翔.软件工程[M]. 人民邮电出版社 2013-09-01
    [5] Roger S.Pressman, 郑人杰, 马素霞等. 软件工程:实践者的研究方法(原书第7版)[M]. 北京: 机械工业出版社, 2011
    [6] 李兴华, 王月清. 名师讲坛:Java Web开发实战经典基础篇(JSP, Servlet, Struts, Ajax)[M].北京: 清华大学出版社, 2010
    [7] 成先海.数据库基础与应用[M].北京:机械工业出版社,2008.
    [8] 张艳.基于工作过程的物流信息系统与管理课程的重构[J].辽宁高职学报,2010, 12(2):45-47.
    [9] 李小娜,董绍华.物流信息技术在现代物流中的应用[J].中国科技信息,2008,(21):140-143.
    [10] 隋英琴.供应链管理环境下的物流管理创新[J].科技创业,2008,14(03):123-125.
    [11] 陈雄华 Spring 企业级应用开发详解[M] 北京:电子工业出版社 2009
    [12] 王寅田. 基于Hadoop的交通物流大数据处理系统设计与实现[D]. 上海交通大学 2014
    [13] 李海峰. MVC模式架构的应用研究[J]. 自动化与仪器仪表. 2013(01)
    [14] 陈凤琴.基于B/S模式的中小饲料企业进销存系统设计与实现[D].南昌大学2014
    [15] 黄沙.企业物流成本管理存在问题及对策[J].物流技术与应用,2011,13(2):101-102.

    致 谢
    省略


    5、资源下载

    本项目源码及完整论文如下,有需要的朋友可以点击进行下载

  • 相关阅读:
    【前端素材】推荐优质后台管理系统网页Star admin平台模板(附源码)
    华为数通方向HCIP-DataCom H12-831题库(多选题:81-100)
    安卓NDK开发
    概念理论类: TCP/IP、Http、Socket之间的区别
    常用的实体类转换方式 - BeanUtil | MapStruct
    TikTok运营做不起来?IP如何选择?
    java_日期时间API
    数据结构之-队列实现
    微信小程序——实现动画循环播放
    [nlp] 索引:正向索引&倒排索引
  • 原文地址:https://blog.csdn.net/m0_66238867/article/details/125621590