基于JSP和MySQL的进销存管理系统的设计与实现
摘 要
进入21世纪以来,商业管理中需要处理的数据和信息越来越多。大量的数据和繁杂的数据使得古老的手工处理数据的方式渐渐显得力不从心。甚至有些信息处理的方式在手工处理的模式下是根本无法是实现的,只能利用计算机的高运行频率来进行迭代计算。而且最近国家正在提倡大众创业,中小型企业很多。中小企业在我国经济发展中具有重要地位,目前我国的中小企业数量多,地区分布广泛,行业分布跨度大。随着全球经济一体化的发展和电子商务的兴起,中小企业之间的竞争将越来越激烈。网络及电子商务的迅猛发展突破了时间、空间的局限性,给中小企业带来了更多的发展机会,同时也增大了企业之间的竞争强度。这就要求中小企业必须改变企业的经营管理模式,提高企业的运营效率。随着技术发展,电脑操作及管理日趋简化,电脑知识日趋普及,同时市场经济快速多变,竞争激烈,企业采用电脑管理进货、库存、销售等诸多环节也已成为必然趋势。
关键词 :进销存管理系统;B/S结构;mysql数据库;JSP;spring;springMVC;spring boot;JPA
ABSTRACT
Since twenty-first Century, more and more data and information are needed in business management. A large number of data and complex data makes the ancient way of manual processing of data gradually appear inadequate. Even some of the information processing in the manual processing mode can not be achieved at all, only the use of the computer's high operating frequency for iterative calculation. And recently, the country is promoting public entrepreneurship, many small and medium enterprises. Small and medium-sized enterprises play an important role in China's economic development. At present, there are a large number of small and medium-sized enterprises in china. With the development of global economic integration and the rise of e-commerce, the competition between small and medium enterprises will become more and more fierce. The rapid development of network and electronic commerce has broken through the limitation of time and space, and has brought more opportunities for the development of small and medium-sized enterprises. This requires the small and medium-sized enterprises must change the mode of operation and management of enterprises, improve the operational efficiency of enterprises. With the development of computer technology, operation and management is simplified, the growing popularity of computer knowledge, and fast changing market economy, intense competition, enterprise computer management purch asing inventory sales and many other sectors and has become an inevitable trend.
Keywords : Purchase, sales and inventory management system; B / S structure; Mysql Database; JSP; Spring;SpringMVC;spring boot;JPA
第一章 绪论
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.2.2 用例图分析
系统管理用例图
系统管理用例有配置系统、管理部门、管理员工、管理权限,这里主要介绍一下管理权限,具体说明见表3-1:
财务用例图
财务用例有查询应收款项、记录应收应付款项、管理发票,这里主要介绍一下记录应收应付款项,具体说明见表3-2:
采购部分用例图
采购部分用例有两个角色采购员和采购经理。采购员用例有采购单、管理供应商、管理商品信息;采购经理用例有审批采购单、管理商品分类。具体说明见表3-3至表3-4:
采购单
审批采购单
库存部分用例图
库存部分总共有质检员、库存管理员、仓库经理三个角色,涉及到的用例比较多,这里具体介绍一下出入库单、确认入库单、开出库单、统计库存信息、出调拨单,具体说明见表3-5至表3-9:
出入库单
确认入库单
开出库单
统计库存信息
出调拨单
销售部分用例图
销售部分用例图包括销售经理和销售员两种角色,销售经理用例有统计销售信息;销售员用例有管理客户、查询商品库存、下订单、确认订单具体说明见表3-10至表3-12:
统计销售信息
查询商品库存
下订单
3.3 本章小结
本章主要是进行了系统的分析,首先第一节是可行性分析,从技术可行性、经济可行性、操作可行性三个角度对系统分析是否是可行的,最终得出本系统是可行的。第二节是需求分析分析了系统所具备的一些的功能,然后重点介绍了一些特色功能。接着第二节是需求分析,第一小节阐述了系统的总需求,应该具备哪些功能;第二小节通过用例图对需求主要功能进行了具体分析。
第四章 系统设计
4.1 系统类分析
经分析,该系统核心业务类见下图:
4.1.1 MANAGER类
MANAGER类用于记录系统的用户信息,并完成登陆和注销的操作。
4.1.2 GOODS类
GOODS类用于记录商品的信息,并且实现对商品的增删改查等功能。
4.1.3 SALEORDER类
SALEORDER类用于记录销售订单的信息,并且实现对销售订单的增删改查等功能。
4.1.4 PURCHASEORDER类
PURCHASEORDER类用于记录采购订单的信息,并且实现对采购订单的增删改查等功能。
4.1.5 STOCK类
STOCK类用于记录库存的信息,并且实现对库存的增删改查等功能。
4.2 关键业务设计
关键业务与用例图之间存在一定的对应关系,原则上用例图中所提出的用例应该在关键业务分析中体现,每一个用例对应一个时序图,每个时序图后面应当有一段简短的说明,时序图用WORD绘制比较难,可以借用其他工具,但复制过来时应尽量只有黑白颜色,下面以登录为例说明关键业务的说明方法。
4.2.1 添加商品
采购业务员通过UI界面选择添加商品菜单,此时后台controller会判断该操作用户是否有权限;权限检查通过,操作员进入到商品添加表单,输入商品信息提交,后台controller会调用service的add方法,service中的方法add在调用database中的板寸方法。成功后返回成功提示。
4.2.2 查询商品
采购业务员通过UI界面输入查询条件,此时后台controller会检查查询条件;controller会调用service里面的find方法,find方法会调用database中具体的查询方法;把查询到的结果显示到UI界面。
4.2.3 添加库存
库存业务员通过UI界面选择商品菜单,输入该商品的库存信息,此时后台controller检查输入商品库存信息;controller会调用service中的add方法,add方法调用database中的具体添加方法处理,添加成功返回功能提示。
4.2.4 添加销售订单
销售业务员通过UI界面选择添加订单菜单,输入订单信息,此时后台controller会检查订单信息;controller会调用service中的update方法,update方法会调用database中的具体更新方法,更新成功后会返回成功提示。
4.3 数据库设计
4.3.1 概念设计
系统ER图
商品ER图
顾客ER图
供应商ER图
图4.10 管理员ER图
日志用于记录用户的日常行为,通过用户编号与用户实体之间存在一对多关系。
4.3.2 数据库表
系统中使用到数据库基本如表4-1所示。
系统数据库表
编号 | 表名 | 描述 |
---|---|---|
01 | customer | 顾客表 |
02 | dept | 部门表 |
03 | employee | 员工表 |
04 | goods | 商品表 |
05 | manager | 管理员表 |
06 | purchase_item | 采购单明细表 |
07 | purchase_order | 采购订单表 |
08 | return_item | 采购退货明细表 |
09 | return_order | 采购退货表 |
10 | sale_item | 销售订单明细表 |
11 | sale_order | 销售订单表 |
12 | sale_return_item | 退货销售明细表 |
13 | sale_return_order | 销售退货表 |
14 | stock | 库存表 |
15 | suppliers | 供应商表 |
顾客表 用于记录顾客信息,顾客表的具体字段如表4-2所示。
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
---|---|---|---|---|
customer_id | 顾客编号 | Long | PK | |
customer_name | 顾客名称 | Varchar(20) | NOT NULL | |
address | 顾客地址 | Varchar(255) | ||
zip | 邮编 | Varchar(20) | ||
telPhone | 联系电话 | Varchar(20) | ||
linkMan | 联系人 | Varchar(20) | ||
linkTel | 联系人号码 | Varchar(20) | ||
bank | 开户银行 | Varchar(20) | ||
bankAccoount | 银行账号 | Long | ||
邮箱 | Varchar(20) |
字段顾客编号为本表的主键,用来标识一个顾客,字段顾客名称非空字段,字段顾客地址、邮编、联系电话、联系人、联系人号码、开户银行、银行账号、邮箱是顾客的一些详细信息。
部门表 用于记录部门的信息,部门表的具体字段如表4-3所示。
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
---|---|---|---|---|
dept_id | 部门编号 | Long | PK | |
dept_name | 顾客名称 | Varchar(20) | NOT NULL |
字段部门编号为本表的主键,用来标识一个部门,字段部门名称为非空字段。
员工表
员工表用于记录员工的信息并且用于员工登录系统,员工表的具体字段如表4-4所示。
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
---|---|---|---|---|
employee_id | 员工编号 | Long | PK | |
employee_name | 员工姓名 | Varchar(20) | NOT NULL | |
employee_password | 密码 | Varchar(20) | NOT NULL | MD5加密 |
employee_gender | 性别 | Varchar(5) | ||
employee_age | 年龄 | Long | ||
employee_phonenumber | 手机号码 | Varchar(20) | ||
deptId | 部门ID | Long | FK |
字段员工编号为本表的主键,用来标识一个员工,员工名字和员工密码为非空字段,部门ID为外键,引用自部门表;字段性别、年龄和手机号码为员工的一些基本信息。
商品表 商品表用于记录商品的信息,商品表的具体字段如表4-5所示。
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
---|---|---|---|---|
goods_id | 商品编号 | Long | PK | |
goods_name | 商品名称 | Varchar(20) | NOT NULL | |
unit | 单位 | Varchar(20) | ||
space | 商品产地 | Varchar(255) | ||
supplierId | 供应商编号 | Varchar(20) | FK | |
approveId | 批准文号 | Varchar(20) | ||
batchId | 生产批号 | Varchar(20) |
字段商品编号为本表的主键,用来标识一个商品,字段商品名称不为空,字段供应商编号为外键,引用自供应商表,字段单位、商品产地、批准文号和生产批号为商品的一些属性。
管理员表 管理员表用于记录管理员的信息并且用于管理员登录系统,管理员表的具体字段如表4-6所示。
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
---|---|---|---|---|
manager_id | 管理员编号 | Long | PK | |
manager_name | 管理员姓名 | Varchar(20) | NOT NULL | |
manager_password | 密码 | Varchar(20) | NOT NULL | MD5加密 |
manager_gender | 性别 | Varchar(5) | ||
manager_age | 年龄 | Long | ||
manager_phonenumber | 手机号码 | Varchar(20) | ||
dept_name | 部门名称 | Varchar(255) | FK |
字段管理员编号为管理员表的主键,用来标识一个管理员,字段管理员名字和密码是不能为空的,部门编号是一个外键,引用自部门表,字段性别、年龄和手机号码是管理员的一些个人信息。
采购单明细表 用于记录采购单信息,采购单明细表的具体字段如表4-7所示。
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
---|---|---|---|---|
purchase_item_id | 采购单明细编号 | Long | PK | |
goods_name | 商品名称 | Varchar(20) | FK | |
purchase_order_id | 采购单编号 | Varchar(20) | FK | |
purchase_price | 单价 | Double | ||
purchase_count | 数量 | Long |
字段采购单明细编号为采购单明细表的主键,用来标识一个采购订单明细,其中字段采购单编号和商品名称是外键,分别引用自采购订单表和商品表,字段单价和数量是采购单明细表的属性。
采购订单表 用于记录采购单信息,采购订单细表的具体字段如表4-8所示。
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
---|---|---|---|---|
purchase_order_id | 采购单编号 | Long | PK | |
suppliersId | 采购商编号 | Varchar(20) | FK | |
purchase_order_pay | 支付方式 | Varchar(20) | ||
inDate | 采购日期 | Date | ||
purchase_order__total | 总金额 | Double |
字段采购单编号为采购订单表的主键,用来标识一个采购订单,其中字段采购商编号为外键,引用自采购商表,字段支付方式、采购日期和总金额为采购订单的信息。
采购退货明细表 用于记录采购退货单信息,采购退货明细表的具体字段如表4-9所示。
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
---|---|---|---|---|
return_item_id | 采购退货单明细编号 | Long | PK | |
returnOrderId | 采购退货单编号 | Long | FK | |
goodsName | 商品名称 | Varchar(20) | FK | |
return_item_price | 单价 | Double | ||
return_item_count | 数量 | Long |
字段采购退货单明细编号是采购退货明细表的主键,用来标识一个采购退货明细,其中采购退货单编号和商品名称是外键,分别引用自采购退货表和商品表。字段单价和数量为采购明细表的属性。
采购采购退货表 用于记录采购采购退货信息,采购采购退货表的具体字段如表4-10所示。
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
---|---|---|---|---|
return_order_id | 采购单编号 | Long | PK | |
suppliersId | 采购商编号 | Varchar(20) | FK | |
return_order_pay | 支付方式 | Varchar(20) | ||
return_order_outDate | 退货日期 | Date | ||
return_order_total | 总金额 | Double |
字段采购退货单编号是采购退货表的主键,用来标识一个采购退货,其中字段采购商编号为外键,引用自采购商表,字段支付方式、退货日期和总金额为采购退货表的属性。
销售订单明细表 用于记录销售订单明细信息,销售订单明细表的具体字段如表4-11所示。
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
---|---|---|---|---|
sale_item_id | 销售订单明细编号 | Long | PK | |
saleOrderId | 销售订单编号 | Long | FK | |
sale_item_name | 商品名称 | Varchar(20) | FK | |
sale_item_price | 单价 | Double | ||
sale_item_count | 数量 | Long |
字段销售订单明细编号是销售订单明细表的主键,用来标识一个销售明细,其中字段销售订单编号和商品名称是外键,分别引用自销售订单表和商品表,字段单价和数量是销售订单明细的属性。
销售订单表 用于记录销售订单信息,销售订单表的具体字段如表4-12所示。
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
---|---|---|---|---|
sale_order_id | 销售单编号 | Long | PK | |
customerId | 顾客编号 | Varchar(20) | FK | |
sale_order_pay | 支付方式 | Varchar(20) | ||
sale_order_saleDate | 销售日期 | Date | ||
sale_order_total | 总金额 | Double |
字段销售单编号是销售订单表的主键,用来标识一个销售订单,字段顾客编号是外键,引用自顾客表,字段支付方式、销售日期和总金额是销售订单表的属性。
销售退货明细表 用于记录销售退货明细信息,销售退货明细表的具体字段如表4-13所示。
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
---|---|---|---|---|
sale_return_item_id | 销售退货订单明细编号 | Long | PK | |
saleReturnOrderId | 销售退货订单编号 | Long | FK | |
goodsName | 商品名称 | Varchar(20) | FK | |
sale_return_item_price | 单价 | Double | ||
sale_return_item_count | 数量 | Long |
字段销售退货订单明细编号是销售退货明细表的主键,用哪个来标识一个销售退货明细,字段销售退货订单编号、商品名称为外键,分别引用自销售退货表和商品表,字段单价和数量为销售退货明细表的属性。
销售退货表 用于记录销售退货信息,销售退货表的具体字段如表4-14所示。
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
---|---|---|---|---|
sale_return_order_id | 销售退货单编号 | Long | PK | |
customerId | 顾客ID | Varchar(20) | FK | |
sale_return_order_pay | 支付方式 | Varchar(20) | ||
sale_return_order_returnDate | 退货日期 | Date | ||
sale_return_order_total | 总金额 | Double |
库存表 用于记录库存信息,库存表的具体字段如表4-15所示。
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
---|---|---|---|---|
stock_id | 库存编号 | Long | PK | |
goodsId | 商品编号 | Long | FK | |
stock_count | 商品库存数量 | Varchar(20) | NOT NULL | |
stock_area | 存放地方 | Varchar(255) |
字段库存编号是库存表的主键,用来标识一个库存,字段商品编号是外键,引用自商品表,字段商品库存数量不为空,字段存放地方为库存表的属性。
供应商表 用于记录供应商信息,供应商表的具体字段如表4-16所示:
字段名 | 字段描述 | 类型/长度 | 约束 | 备注 |
---|---|---|---|---|
suppliers_id | 供应商编号 | Long | PK | |
supplier_name | 供应商名称 | Varchar(20) | NOT NULL | |
address | 顾客地址 | Varchar(255) | ||
zip | 邮编 | Varchar(20) | ||
telPhone | 联系电话 | Varchar(20) | ||
linkMan | 联系人 | Varchar(20) | ||
linkTel | 联系人号码 | Varchar(20) | ||
bank | 开户银行 | Varchar(20) | ||
bankAccoount | 银行账号 | Long | ||
邮箱 | Varchar(20) |
字段供应商编号是供应商表的主键,用来标识一个供应商,字段供应商名称不为空,字段顾客地址、邮编、联系电话、联系人、联系人号码、开户银行、银行账号和邮箱是供应商表的属性。
4.4 本章小结
本章主要分为三个小节来介绍系统设计。第一节是系统类分析,主要是通过类图的方式来介绍系统设计到的类,介绍类里的属性和设计到的方法。第二节是关键业务设计,主要是通过顺序图的方式来介绍核心业务的设计和处理过程。第三节是数据库设计,首先是通过ER图的方式介绍设计到的模块和模块的一些字段(分为总ER图和分ER图),其次是数据库表,介绍了所设计到的表,详细的介绍了表中的字段和字段对应的关系。
第五章 系统实现
5.1 用户登录
5.1.1 功能描述
登录是对用户使用系统功能进行身份验证的过程,登录也是可以很好的控制用户的权限问题,登录界面要求简明易懂。每一用户都有自己的独有的账号和密码,用户在系统的每一个操作都有日志进行记载,可以有效保证数据可追溯性,做到责任到人,界面如下图。
5.1.2 实现流程
在登陆按钮添加监听事件,在用户输入账号密码点击登录后,终端先判断是否满足JS中的验证方法,此方法是防止当账号密码为空时登录的提示,如果为空跳出一个对话框来提示用户账号和密码需要填。如果不为空,后台会把接受的用户名密码与数据库数据库中用户信息比较核对,如果是一致则顺利登录到用户权限所对应的界面中,否则出现账号密码错误的提示,登录失败。登录流程如图5-12所示。实现代码如下:
java
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");
}
}
5.2 采购管理
5.2.1 功能描述
采购管理是对需要采购的订单的综合管理,在这个模块里包含采购订单、收货入库、采购退货三个子模块。其中采购订单是员工用来生成采购单的,还有对采购单的一些处理;收货入库是对已经提交的采购单进行入库操作;采购退货是把我们已经提交的采购单进行退货处理的操作。主要界面如下图:
5.2.2 实现流程
点击采购订单按钮会跳转到采购订单首页,在首页可以看到所有已经提交的采购单信息;当我们想添加新的采购订单的时候,首先点击添加商品按钮,会跳转到商品添加页面,我们把商品信息输入进去之后点击提交,后台方法会把商品信息暂时存起来,当我们把所有商品添加完成,我们可以再点击添加订单按钮,此时会把我们添加的所有的商品都提交生成一个采购订单,并且把数据存进对应的数据库表中保存起来。对已经提交的订单当我们点击退货按钮时,后台会接收到要退货的订单ID,并且根据ID到数据库中订单表把数据删除,同时在退货表中把数据插进去。当我们点击入库按钮时,后台会接收到需要入库的订单的ID,并且把订单表中的flag字段的值修改为已入库,同时在库存表中会新加一条数据。主要实现代码如下:
java
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("提交采购订单成功");
}
5.3 库存管理
5.3.1 功能描述
库存管理是对仓库里的商品的综合管理,包括商品入库、商品出库、某种商品的库存查询、商品移库和库存盘点。商品入库是对新的商品需要入库的管理;商品出库是根据销售订单到库存里拿出对应数量的商品并且库存进行相应的减少;库存查询是输入想查询的商品会返回该商品的库存数量;商品移库是输入商品ID和需要移动到的仓库号就可以更改商品的存放仓库;最后一个是库存盘点,该功能是返回仓库里所有商品的库存信息。主要界面如下图:
商品出库
库存查询
商品移库
5.3.2 实现流程
首先是商品入库,点击商品入库按钮跳转到对应商品添加页面,填入对应商品信息,后台首先会判断该商品在商品表里是否已经存在,如果存在,则更新该商品的库存即可,如果不存在,则先在商品表里添加一条商品的信息,再到库存表里添加一条库存信息。商品出库,首先是输入需要出库的商品ID和该商品出库的数量,后台根据接收的商品ID和数量到数据库库存表去更新该商品的库存数量。库存查询,输入需要查询库存的商品ID,后台会根据商品的ID去库存表里查询该商品的库存数量,并且返回到对应的前台页面。商品移库,输入商品ID和移动到的仓库号,后台会根据商品ID号到数据库库存表中更新该商品的库存地方。库存盘点,这个功能是会显示所有商品的库存信息。主要实现代码如下:
商品入库 :
java
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;
}
商品出库 :
java
@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";
}
商品移库 :
java
@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";
}
5.4 销售管理
5.4.1 功能描述
销售管理对销售订单的综合管理,包含销售订单、发货出库和销售退货。销售订单,将销售的信息形成销售订单并且存入到数据库销售订单表中;发货出库,将提交的销售订单的flag状态改为已发货,并且对应的库存表中的库存数量也相应的减少;销售退货,对已经销售的订单进行退货处理。主要界面如下图:
5.4.2 实现流程
首先是销售订单,第一步是点击添加商品,然后输入对应的商品信息点击提交,后台接收到数据,会暂时将商品信息存储起来,当商品添加完毕,点击添加订单按钮,可以将刚才添加的所有订单信息提交到后台,后台在将这些订单信息持久化到数据库中去。发货出库,对提交销售的订单可以进行发货操作,后台会根据订单ID对订单表中的flag字段值修改为已发货,并且会到库存表中去,将该订单对应的商品的库存数作相应的改变。销售退货,对已经提交的订单可以进行退货操作,点击退货按钮,后台会根据订单ID到数据库销售订单表中把对应订单信息删除,并且在销售退货表中加入相应的退货记录,与此同时会根据flag字段,如果flag字段值是未发货,则不用去库存表跟新库存数据,如果flag字段的值为已发货,则需要到库存表中把订单对应的商品的库存数加回去。主要实现代码如下:
java
@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";
}
5.5 备份与恢复
5.5.1 功能描述
备份与恢复,顾名思义就是对系统的重要数据进行备份,以备不时之需,备份是可以设定每天在一个固定的时间自动进行备份;当系统数据损坏时我们可以自由选择恢复哪一天的数据。主要界面如下图:
5.5.2 实现流程
备份功能,首先当系统启动的时候已经设定了一个自动备份的时间点,每天到这个时间点都会自动把数据库的数据备份一次,但是我们也可以手动备份,我们只需要点击数据备份就可以了;数据恢复,当某个时候系统数据损坏或者丢失的时候,此时我们就可以用到数据恢复功能了,我们可以选择恢复到一个时间点的数据文件。主要实现代码如下:
```java 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(); } } ```
5.6 本章小结
本章主要是介绍了系统实现,重点介绍了系统的用户登录、采购管理、库存管理、销售管理、备份与恢复五个模块。这五个模块首先分别介绍了他们的功能,并且附上界面图,然后再从实现流程上对这些功能进行详细的描述,最后附上实现这些功能的主要代码。
第六章 系统测试
6.1 系统测试综述
系统完成后,对系统的测试是非常重要的一环。首先在系统的每个模块完成后对这个模块做的单元测试,另外一个是在系统整体完成了后对整个系统做的综合测试。
用户登录模块,当用户输入正确的用户名和密码时,能正常登录;当用户输入错误的用户名或者错误的密码或者不存在的用户名的时候,系统应当输出响应用户名或者密码错误;当用户没有输入用户名或者没用输入密码或者两者都没有输入的时候,系统应当响应用户名、密码项是必填项。
采购管理模块,当天如对应的商品信息时,后台新系统能够接收到商品信息,并且在提交订单的时候能够顺利把这些信息都持久化到数据库中去,并且在出错的时候能正确返回对应的错误码;对采购订单入库时,能正常的把flag标志改为已入库,并且在库存表中更新响应的商品库存信息;销售退货,后台能根据订单ID将采购订单表中的数据删除,并且把数据插入到采购退货表中去。
库存管理模块,商品入库功能,当用户把商品信息输入正确的时候,后台能够真确的收到数据,并且正确的持久化到数据库中去;商品出库,当用户输入出库的商品和数量时,后台能够正确到数据库库存表把对应的商品的数量相应的减少;库存查询,当输入商品的ID时,后台能根据这个ID查出该商品的库存信息,并且能正确的返回到用户界面;商品移库,当输入商品ID和移库的信息后,后台能正确地更新数据库中对应商品的库存信息。
销售管理模块,销售模块,当前段把销售
参考文献
- 基于SSH的家电商场进销存系统研究与实现(浙江工业大学·蒋晓丹)
- 基于J2EE的进销存系统的设计与实现(西安电子科技大学·李秀妮)
- 基于.NET的进销存系统和客户关系管理系统的开发与研究(北京工业大学·李文化)
- 面向最优库存控制的DRP分销系统实现及可靠性分析(重庆大学·刘磊)
- 中小型建筑施工企业ERP管理系统(电子科技大学·陈巍祥)
- 基于B/S模式的分销管理系统的设计与实现(燕山大学·董晓光)
- 面向最优库存控制的DRP分销系统实现及可靠性分析(重庆大学·刘磊)
- 面向最优库存控制的DRP分销系统实现及可靠性分析(重庆大学·刘磊)
- 基于.NET的进销存系统和客户关系管理系统的开发与研究(北京工业大学·李文化)
- 基于.NET框架的进销存管理信息系统的设计与实现(电子科技大学·孙华俊)
- 基于Web的销售管理系统的设计与实现(西安电子科技大学·黄婵)
- 基于.NET框架的进销存管理信息系统的设计与实现(电子科技大学·孙华俊)
- 基于JSP技术的网络交易平台设计与实现(电子科技大学·黄华)
- 基于B/S的中小企业的进销存系统的设计与实现(电子科技大学·张振宇)
- 面向最优库存控制的DRP分销系统实现及可靠性分析(重庆大学·刘磊)
本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:毕业设计驿站 ,原文地址:https://bishedaima.com/yuanma/35245.html