基于javaEE+Mybatis的WEB仓库管理系统设计与实现(毕业论文+程序源码)

大家好,今天给大家介绍基于javaEE+Mybatis的WEB仓库管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。
需要下载开题报告PPT模板及论文答辩PPT模板等的小伙伴,可以进入我的博客主页查看左侧最下面栏目中的自助下载方法哦

文章目录:

1、项目简介

  1. 仓库物品的管理是与我们的日常生活息息相关的一个重大问题。随着我国经济飞速的发展,改革开放的不断深入,企业要想在激烈的市场竞争中立于不败之地,要想继续的发展与生存,没有现代化的管理方式与方法是万万不行的,仓库管理的全面信息化、自动化则是在其中占有极其重要的地位。仓库管理信息系统则是在此需求背景下开始研制并开发的。

  2. 在此篇文章中严格按照软件工程思想,设计并实现了一个仓库信息管理系统。介绍了系统从需求分析,逻辑设计,总体设计,详细设计以及系统测试、实施各阶段的主要内容和成果,包括系统结构图、业务流程图数据流程图、物理表实现及其关系、功能模块算法流程、界面设计等等。

  3. 基于WEB的仓库管理系统主要用于实现仓库的出入库管理,基本功能包括:入库模块、出库模块、商品查看模块、用户注册模块、个人信息管理模块等。本系统结构如下:
    入库模块:入库新商品,或者是入库已有商品。
    出库模块:对已经入库的商品进行出库操作。
    商品查看模块:查看目前的库存商品信息。
    用户注册模块:进行帐号密码的注册,包括用户其他信息。
    个人信息管理模块:查看或者修个个人信息。


2、资源详情

项目难度:中等难度
适用场景:相关题目的毕业设计
配套论文字数:31062个字
包含内容:整套源码+完整毕业论文+答辩PPT+开题报告+任务书+辅导视频+运行截图


3、关键词:

javaEE;Mybatis;仓库管理系统;WEB;Eclipse;Oracle

4、毕设简介:

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

1. 绪论
仓库是每个企业都必须谨慎管理的地方,一个企业的最基本是货物,所以一个企业的货物必须得得到很好的保管,在这片竞争激烈的土地上面才能谋得一块生地。本课题正是根据这一理念,开发了一个功能比较完善,基本能满足企业要求的仓库管理系统。
省略

1.1 系统背景
一个企业所拥有的商品是他所生存发展的根本,而仓库是企业用来保存商品的所在。所以说,一个好的仓库对于企业来说占有举足轻重的地位。总而言之,一个成功的企业必定会有一个好的仓库,但是一个好的仓库没有一个合理的管理系统是不完美的[7]。
省略

1.2 开发目的
仓库是所有企业都不可缺少的部分,对于一个成功的企业来说,想要在未来的市场中获得发展得优势,拥有一个完善的仓库管理系统是十分重要的。可是企业中的商品总是在不断地流动的,仓库中的商品也随之不断变化。所以,商品就需要不停的被记录保存。在使用传统的人工记录时存在着各种各样的问题,查询的效率低下,而且保密性不高。因此,对于一个想要不断发展的企业来说,这种人工记录的方式必须淘汰。
省略

1.3 开发工具
1.3.1 Eclipse
Eclipse 开发工具是一款源代码完全开放的、主要用于可扩展性开发Java语言的一种开发工具。对Eclipse本身来说,他仅仅只是一种服务和框架,主要是通过一些插件与组件来组成开发的环境。主要的优势有Eclipse自身带有一种标准化的组件集合,含有Java的主要开发工具JDK。Eclipse具有十分丰富的开发环境,主要包括有超强的编码能力、拥有玩备的调试功能、发布能力与测试功能等,全部支持了Hibernet、Struts、Mybatis、JSP、Spring、SQLPlus等等的一系列的框架。

1.3.2 Oracle
oracle是一家公司的名字(甲骨文公司),世界上屈指可数的,是国际上非常大的巨型IT公司,是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989年正式进入中国市场。2013年,甲骨文已超越 IBM ,成为继 Microsoft 后全球第二大软件公司最有名的产品是DB,database,RDBMS,关系型数据库系统。

1.3.3 PowerDesigner
在数据库的设计过程中,运用Power Designer作为数据库模型的主要的建模工具。

在庞大的赛贝斯公司旗下的主要的CASE开发工具集之一就是PowerDesinger,运用这个工具的最大看点是更加快捷并且方便的对仓库管理系统进行开发,数据库开发所需要的模型与需要的经历基本全部都能实现。例如数据流程图、概念数据模型、物理数据模型等一系列的模型都可以通过使用PowerDesigner来实现,可以生产出各种各样的PC端开发出来的应用软件,也可以给系统的设计制作出系统的结构模型,也能够为一些开发团队的系统模型进行调控。

Power Designer还可以跟各种现如今使用比较多的用来设计数据库的软件,比如:Power Builder,StartUML,VB等相互配合来使用,以便于用来减少开发的时间与优化系统的设计。

1.4 相关技术介绍
1.4.1 JSP技术
JSP技术使用起来是非常灵活的,可以用来便携JAVA程序的。本技术还可以用来对一些编程的动态的网页来进行封装。网页还可以访问一些在服务器端的各种资源的一些逻辑应用。JSP技术还可以将一些网页的逻辑与网页的设计和还有显示进行分离,对于一些可重用的基础的组件的开发进行支撑,更加容易的对基于Web的应用程序进行设计。

JSP技术的优点:
(1)能够一次性完成编写,到处运行。不包括系统在内,代码基本不需要在写。

(2)系统的多平台支持。通常情况下,能够在所有情况下的全部平台上进行设计,能够安排在任一情况中,也能够在所有的情况下进行发展。相比ASP/.net来说,优点是十分明显的。

(3)强大的可塑性。通过一个不大的Jar程序能够对Servlet/JSP进行运行,也能够通过很多服务器进行集群和负载平衡,甚至能够通过多台Application解决问题。单个的服务器到多个的服务器,Java展示了一个强大的功能。

(4)Java已经有了很多的设计方法,何况大部分工具都是没有花费的,这中间有很多都在多种平台之下顺畅的进展。

(5)支持服务器端组件。只有很有力的服务器端组件才能支撑web运行,因此开发者可以在调用web页面时通过另外的开发工具来达成纷乱效用的组件,来加强系统的可操作性。JSP可以通过完善的JAVA BEANS 组件来达成纷乱的商务功能。

JSP 与ASP(Active Server Page) 的区别
从上面的基本介绍中,乍一看觉得JSP 与微软的ASP 十分相似,但事实上,两者有着本质的不同,我们主要从以下几个方面对其进行比较:
1、Web 服务器的支持
大部分的支持WEB的服务器段例如:Apache、IE、Netscape 和Microsoft IIS 等一系列服务器都可以运行JSP 。ASP的却很难再除了微软之外的平台上继续的运行与移植。

2、平台的支持
平台具有一定的独立性,所有的能够支持java程序的平台,都可以支持JSP的运行。Windows 平台可以很好的支持ASP, 但ASP 难于移植到其它平台上。

3、组件模型
JSP 所在的平台是建立在跨平台的、这上面的所有的组件都是可是重新利用的。而ASP 使用的平台却是建立在Win32的COM 组件模型之上的,所使用的组件没有JSP的灵活。

4、脚本语言
JSP是比较万能的能够灵活的使用JAVA语言或着与其他的脚本语言如javascript相互配合使用。可是ASP使用起来比较局限,只能使用Jscript 或者是VBScript两种语言来作为脚本语言,不够灵活。

5、安全
JSP的安全模式是使用Java 的安全模型,但是ASP的安全模式使用的是Windows NT的安全模式两者各不相同。

6、与Access数据库的连接
Access 数据库在与JSP 相连接的时候使用的连接方式是JDBC连接,而Access 数据库与ASP相连接的时候使用的是Data Active Objects。

7、用户定制的标签
JSP有一个很好的功能是用户可以自己定义一个属于自己的标签库,并且可以灵活运用。然而ASP 中用户却不能自己定制标签库,原因是在 ASP 中用户是不可以对标签库进行扩充的。

8、JSP 与Servlet 的区别
从某种意义上讲,JSP 并不是一种新技术,因为JSP 可以完成的工作,都可以通过编写Servlet 程序来实现。而且,JSP 页面中动态的、交互的部分最终也都是需要再编译为相对应的Servlet程序来实现。所以,可以说,JSP其实是Servlet 的一种抽象,它提供了更加方便有效的方式来编写Servlet。

9、JSP 与CGI 的区别
JSP 与CGI 两者之间有一个很明显的最大的差异点,JSP在编写时与编译HTML时是很相似的两者的差异不大,在语法上有些不同只要了解JSP的语法即可,不需要对JAVA、JScripety等语言有过多的了解。而编写CGI 程序要求对脚本语言十分熟悉,因为CGI 程序基本上是用脚本语言直接写的。

除此之外,在使用CGI 程序的时侯,对每一次的访问他都会进行处理,可是这样的结果会造成在多个用户的请求被处理时,会造成力不从心的局面,不会得到满意的结果。可是JSP在编译时只能编译一次,在此之后会驻留在内存中,再次调用时,不必重新处理,适于应付多用户情况。

省略

1.4.2 JavaScript技术
JavaScript语言是脚本语言中直译式的一种,属于动态类型、弱种类型、原型为基础的语言,支持类型的语言。

省略

JS技术特征:1、脚本语言2、解释性语言3、弱类型语言4、事件驱动5、动态性6、安全性7、跨平台性(兼容性)。

1.4.3 Tomcat
Tomcat 从一定的意义上面来说他并不只是一个APP Server, 它仅仅只是一个可以支持并且运行Serlvet/JSP 的Web 的容器,而且他还具有一些传统的Web 服务器所具有的一系列的功能。可是他跟Apache 相对比,Tomcat处理静态的HTML 的能力就比不上Apache。 因此,我们可以把Tomcat与Apache 集成到一块,然后运用Apache 处理静态HTML, 最后在利用Tomcat 处理JSP 还有Servlet。这几种技术之间相互配合。这种集成只需将Apache 和Tomcat 的配置文件作出修改就可以了。

Tomcat 也扩展了一些App Server 的功能,如JNDI, 数据库连接池,用户事务处理等等。Tomcat 被非常广泛的应用在中小规模的Java Web 应用中。在Tomcat5中,在Servlet2.3 中拥有一些事件监听器的功能我们可以利用这些功能来对事应用或者Session 等进行一些列的实行监听。Tomcat 还有好多其他的一些特征,如与SSL 集成到一块,实现安全传输。很多中小应用不需要采用EJB 等技术,JSP 和Servlet 已经足够,这时如果用应用服务器就有些浪费了,我们自然会选择Tomcat。

省略

1.4.4 软硬件需求
硬件需求:
CPU:Pentium以上计算
内存: 512M以上

软件需求:
操作系统版本:Windows XP /vista/Win7
开发工具:MyEclipse 6.0.1
后台服务器:Apache Tomcat 6.0
开发语言:Java
浏览器:F6.0

1.5 可行性研究分析
可行性分析能够让系统用最低的开发成本来获得最高的经济效益。可行性分析目的是根据所开发系统的用户需求,明确研究方向,明确目标[1] 。
省略

1.5.1 系统目标可行性分析
本系统可以用最小的时间、经费充分帮助仓库管理人员进行仓库货品的数量进行管理,可以对商品的类型、出入库时的数目、还有时间方面进行查询。也可以对客户使用货物查看货物,货物与供应商之间进行辅助。

1.5.2 系统的经济可行性
仓库管理系统是基于JSP技术来开发,采用的软件都是开源的,这样能够削减很多的精力和资源,降低开发成本,同时也能够提升设计的作用,所以系统在开发人力、财力要求不高,具有经济可行性。

1.5.3 系统的技术可行性
在本系统的开发包含有前端的程序开发与后台的数据库的连接与数据库的维护。对于应用程序的开发则是要使用起来比较简单上手而且要兼具各方面的功能,而对于数据库的建立和维护必须要求有一套完整的数据库、数据必须要安全稳定。

本系统开发的重点就是对数据库的设计和操作。在大学对软件工程,软件测试,UML统一建模语言等课程进行过系统的了解,也能够对这些课程进行开发,能让我们能够进一步辨别、开发与检验系统。所以,本仓库管理系统系统的开发在技术方面必定是高效的。

仓库管理系统是一个数据库的管理查询系统,要求运行环境、硬件、软件不高,操作简单,完全可以运用我们的技术实现系统的功能。

1.5.4 系统的法律可行性
本系统完全是自己设计的管理系统,对于本人来说具有重大的实际意义。开发环境软件和使用的数据库都是开源代码,因此对这个系统进行开发与普通的系统软件设计存在很大不同,没有侵权等问题,在法律上完全具有可行性。
综上所述,设计一个仓库管理系统具有效率高,操作简便,降低成本等优点,是必要可行的。

2 软件需求分析
软件需求分析是开发的第一个阶段,也是软件开发周期中的一个非常重要的阶段,根本任务是确定用户对软件系统的需求。它是项目开发的基础,它确定软件系统做什么,具有什么功能性能,有什么约束条件等。在软件的需求分析阶段所得到的结果在后期的软件开发的过程中是十分重要的,经过严格评审并得到用户确认是必须经过的。

2.1 需求分析
需求分析是系统开发的首要步骤,直接影响系统整体性能和功能的最主要的步骤。系统的需求分析最重要的是对系统的可行性、性能和功能等方面进行具体地分析。不合理的需求分析,会使系统的开发环节出现许多错误和走许多弯路,导致系统开发时间长,效率低,系统质量受到影响[8]。

2.1.1 用例图
仓库管理系统分为系统管理员和客户等不同种类的用户角色。在本系统的整个的用例功能模块包括管理员管理、用户管理等模块,管理员模块的主要功能包括查看库存信息,修改信息,用户管理,产品入库,产品出库等功能,如图2-1所示为仓库管理员用例图。
在这里插入图片描述

图2-1 管理员用例图

用户模块的功能主要包括有库存信息的查找,用户信息的修改,用户管理等功能,如图2-2所示为客户用例图。
在这里插入图片描述

图2-2 客户用例图

2.1.2 类图
仓库管理系统中有管理员、客户、还有货物三大类。如图2-3所示为仓库管理系统的三大类之间的类图关系。
在这里插入图片描述

图2-3 系统类图

2.2 功能需求分析
1、登录验证功能:为了保证仓库管理系统信息的安全性,进入系统时需要对用户身份进行验证,如果验证无误可成功进入系统,如果用户名或者密码不正确将返回错误提示要求重新输入。

2、管理员管理功能:此功能属于系统的管理员功能,他实现了对所有用户的管理操作,可以添加一个新的用户,也可以对已经添加的业务员进行删除的操作。

3、用户的查询功能模块:此项功能属客户管理员功能,用户可以根据条件查询客户信息,也可以对客户信息进行修改。

4、仓库存储的查询管理功能:此功能属系统管理员与客户共有的功能,客户可以实现查看、入库以及出库等功能,两者都可以查看库存信息。

5、用户的信息管理模块:此项功能属于用户管理员的功能,业务员可以对自己的客户信息进行管理与修改。

2.3 业务流程分析
仓库管理系统主要分为两大用户功能,两种功能所实现的功能流程如下所示。

2.3.1 管理员模块业务流程
仓库的管理员可以通过帐号和密码验证之后进行登录,登录到系统之后主要的功能是对商品与用户的信息进行管理,主要流程如图 2-4 所示。
在这里插入图片描述

图2-4 管理员程序流程图

2.3.2 客户模块业务流程分析
管理员可以通过帐号和密码进行登录,登录后的主要功能是对用户与品信息的管理,主要的功能包括查看用户信息、修改用户信息、对库存商品进行查看等。主要业务流程图如图 2-5 所示。
在这里插入图片描述

图2-5 客户程序流程图

2.4 数据流程分析
基于对业务流程的分析,对数据流分析。

2.4.1 顶层数据流
现行的顶层数据流图如图2-6所示。
在这里插入图片描述

图2-6 顶层数据流图

2.4.2 一层数据流图
具体分析第一层数据流图,包括有商品的管理、用户信息的管理。商品管理,主要包括用户对产品的入库操作、查询操作、出库操作等一系列的处理以及管理员对产品的管理。用户管理,管理员能对用户的信息来操作。详细流程图如图2-7所示。
在这里插入图片描述
在这里插入图片描述

图2-7 一层数据流程图

2.4.3 二层数据流图
具体分析第二层数据流图,包括的功能信息有用户注册、用户登录,产品入库,产品查询,产品出库等功能。
用户注册模块数据流图如图2-8所示:
在这里插入图片描述

图2-8 用户注册功能的数据流图

用户登录功能的数据流图如图2-9所示:

在这里插入图片描述

图2-9 用户登录功能模块的数据流图

商品入库功能模块的数据流图如图2-10所示:
在这里插入图片描述

图2-10 商品入库模块
如图2-11所示为商品查询功能模块的数据流图:
在这里插入图片描述

图2-11 商品查询模块

如图2-12所示为商品出库模块的数据流图:
在这里插入图片描述

图2-12 商品入库模块

2.5 数据字典分析
2.5.1 数据存储条目
文件名:用户信息表
组成:本次刚刚注册用户 + 之前注册过的用户
组织方式:索引类型的文件,以用户名为索引
文件名:商品库存表
组成:本次新入库商品+以前入库商品
组织方式:索引文件,以商品编号为索引

2.5.2 加工条目

加工名:商品存储处理
编号:无
输入:商品信息
输出:库存信息表

加工名:商品入库处理
编号:无
输入:商品信息
输出:库存信息表

加工名:商品出库
编号:无
输入:商品信息
输出:库存信息表

加工名:用户信息存储
编号:无
输入:用户信息
输出:用户信息表

加工名:用户查询处理
编号:无
输入:用户名
输出:用户信息表

加工名:用户信息验证
编号:1.1
输入:用户信息
输出:用户信息表

加工名:验证用户是否存在
编号:1.2
输入:用户名
输出:用户信息表

加工名:录入用户信息
编号:1.3
输入:用户信息
输出:用户信息表

加工名:登陆系统时的信息验证
编号:2.1
输入:用户名、密码
输出:用户信息表

加工名:个人信息查询
编号:2.2
输入:用户名
输出:用户信息表

加工名:审查商品信息
编号:3.1
输入:商品名称
输出:商品信息表

加工名:验证是否为新商品
编号:3.2
输入:商品名称
输出:库存信息表

加工名:录入商品
编号:3.3
输入:商品信息
输出:库存信息表

加工名:查询商品
编号:4.2
输入:商品名称
输出:库存信息表

3 软件总体设计
软件系统的设计是在整个系统在实现软件开发过程中的十分重要的一个环节。本章将主要介绍一下仓库管理系统的总体结构与系统的架构[2]。总体设计的结构实际上介绍了各个模快相互产生的关系,数据库的设计主要说明了表的建立与数据之间的关系。
省略

3.1 软件结构设计原则
软件总体设计的任务是软件的结构体系设计与软件的模块化设计。为了提高软件设计质量,人们在长期的计算机软件开发过程中积累了丰富经验,对这些经验做出总结会进一步得出一下软件设计准则。

3.1.1 软件的结构体系
软件的体系结构是在整个软件系统中最基层的。设计准则如下:

  1. 体系结构是一种抽象的结构。
  2. 软件的体系结构能够保持一定时间的稳定。
  3. 良好的体系结构意味着普通、高校和稳定。

3.1.2 软件模块设计原则
在软件开发过程中,软件的模块化式设计关键,软件模块化设计需要遵循的总则如下:

  1. 模块的耦合性降低,模块的内聚性要提高。
  2. 模块的作用范围需要能够控制。
  3. 模块接口设计要简单,以便降低复杂程度和冗余度。
  4. 设计功能可预测并能得到验证的模块。
  5. 适当划分模块规模,已保持其独立性。

3.1.3 软件的模块化
模块是软件结构的基础,是软件元素,是能够单独命名、独立完成一定功能的程序语句的集合,如高级语言中的过程、函数、子程序等。广义的将,在面向对象的方法学中其中的对象也属于模块,模块是构成程序的基本构件,在程序设计中有很重要的地位。

模块化是使得软件能够对付复杂问题所具备的属性。使用模块化是为了使软件的复杂性能够降低,能简单的操作软件的设计、维护、还有测试。模块化技术的运用还可以防 止错误蔓延,从而可以提高系统的可靠性。关于模块可以降低软件复杂性的事实。

3.2 系统任务概述
省略
在仓库管理系统系统的实现时首先我们要考虑下面几点:

安全性。现在社会是一个信息的社会,信息就是宝贵的财富,保证信息的安全,特别是个人信息更加的需要安全性。

先进性。结合当前流行趋势,开发要符合用户的需求,适合用户进行网上预约挂号的系统。本系统采用的这些技术完全基于微软平台进行开发,从来有效的降低了系统的运营成本,大大提高了该医院预约挂号系统的稳定性和易维护性。

可扩展性。本系统给用户带来了极大的便利,提高了网站的管理效率,因此在开发系统的功能过程中,我们要考虑到系统的可扩展性,便于将来系统的升级、更新。

有效性。实际上这里所说的有效性包括了两个方面的意思,即有用性和可用性。其中有用性是指的是站点能满足用户需求的潜在功能,而可用性指的是能够通过站点来操作实现系统的体现功能。所以实现在仓库管理系统的功能时一定要尽最大的可能满足用户的需求。

3.2.1 系统的功能设计
仓库管理系统主要分为两个个用户角色,主要是管理员角色与用户角色,其功能如下:
1.管理员
管理员可以通过帐号和密码进行登录,登录到系统后主要功能是对库存信息的管理,主要包括个人信息管理、商品进行入库、出库、查询操作、客户的信息进行查看修改、退出系统等功能。

2.用户
用户可以注册登录成为会员,其中的系统功能包括系统首页,查询库存,注册登录,我的信息,退出系统等一些功能。

3.2.2 系统功能结构
根据上述分析,得出的功能结构图有,如图3-1所示。
在这里插入图片描述

图 3-1 系统总体结构图

3.3 系统架构
B/S系统由以下三层构成,三层是相对独立又相互关联,在这里我们在三个层面上做一个介绍:
1.表示逻辑层提出一个服务请求到网络上的Web服务器,并且开始验证身份,主页信息被HTTP给传送给客户端,主页文件会被客户机收到,并将主页文件信息显示在Web浏览器上。

2.用户的数据请求会被控制逻辑层接受到,数据库与程序相互连接,并进行数据处理请求的数据库服务器,然后Web服务器开始接受数据库服务器的数据处理的结果,最后再返回给客户端。

3.数据表示层接受Web服务器请求的数据库操作,以实现对数据库操作的一系列的功能, Web服务器来接收操作结果。

3.4 系统主要子模块设计
在对系统的功能设计进行分析,在对系统的小模块在进行划分,即系统的模块化。建立系统的整体的结构了解模块之间的关系如何。系统的功能需求分析和企业仓库管理的有各自不同的特点。

3.4.1 用户登录子模块设计
系统中用户登录验证相对比较简单,可以将其流程概括如下:

在用户登录时,系统要求在用户名的输入框与密码的输入框输入相应的信息,然后再由系统将其传送至相应的服务器端。服务器端处理程序时,服务器会根据提交的内容将用户名中的内容以及密码框的内容进行分离,再与数据库中的数据进行比对判断。如果输入的内容能够相互匹配会进入到登录首页;若不能正常匹配则系统会跳转到报错界面。

3.4.2 商品入库子模块设计
首先,入库申请人需要向仓库管理员提交一份入库申请单和相应的货物,仓库管理员会根据所提交的清单进行对比。如果发现货物与入库申请单中的数据有所差异,那么则拒绝货物入库操作;如果发现库存中有该商品存在,还需考虑入库货物的数量加上现有的库存量是不是超过了该仓库的最大库存量,若超过则暂时禁止入库。没有超过的话,仓库的管理员进行入库操作。

如果该库存中没有该商品存在,则需要重新添加该商品,计算该商品可在库存中所能存放的最大库存量,重新考虑入库货物的数量加上现有的库存量是不是超过了该仓库的最大库存量,若超过则暂时禁止入库。货物存入仓库之后,该仓库管理员需要给入库申请人开具一份货物入库单,入库单中的内容必须严谨。至此该系统的入库流程全部完成。

3.4.3 商品出库子模块设计
在进行出库操作时,首先,出库申请人需要向仓库管理员提交一份申请单。若申请单不真实,则取消出库操作,不再继续进行出库。对真实有效的出库单,仓库管理员再对照其要求出库的货物名称查询该货物的信息和库存量。如果此货物的库存量达未到所需要数量则取消出库操作。如果此货物的库存量达到所需要数量,可以执行出库操作并且记录。随后仓库管理员给该申请人开出库单据,仓库管理系统出库流程全部完成。

3.4.4 用户注册子模块设计
系统中用户登录验证相对比较简单,可以将其流程概括如下:
在用户注册时,需要在注册的页面各框中输入用户名、密码、姓名、性别、年龄、联系方式、email、联系地址等一系列信息,系统将其提交至服务器端。

服务器端处理程序时,服务器根据提交的内容将用户名与其他信息进行分离判断。如果没有找到所注册的用户名,系统会进一步进行注册;当在注册的过程中有空的情况下系统会有相应的提示。在进行email注册时,在注册的栏中输入的不正确时,系统会提示出错误。当输入的内容符合要求时会继续注册。还可以选择清空,从头开始在注册一遍内容。

4 数据库设计
概念模式的设计方法是在需求分析的基础上,通常使用E-R模型来表示数据以和数据之间的联系,开发出能够解决用户信息要求和处理要求的数据库的模式。

4.1 数据库概念
省略

4.2 数据库分析
省略

4.2.1 数据库的完整性分析
省略

4.2.2 数据库的安全性分析
省略

4.3 数据库的设计
4.3.1 概念结构设计
在次结构的设计过程当中,E-R模型法是最常见的设计方法。

在次结构设计当中中,有以下几种方法方法:
自下往上、从上往下、逐步扩张、相互结合,以这种方式为模型然后烦别实现各个结构的模型。

在物理结构设计阶段首先分两步走:
确定数据库的物理结构,是用来说明数据在数据库中怎么样存储的。

选取正确的关系模式存取方法有好多种方法进行选择。
概念设计通常是从系统的需求出发,常常将对象使用数据流的形式表达成为完整的抽象实体。而与模块内部的细节无关。E-R图为主要的工具,如下图4-1。
在这里插入图片描述

图4-1 系统E-R图

4.3.2 逻辑结构设计
(1) 管理员信息关系模式,里面的主键是管理员ID。
管理员(管理员ID、用户名、email、密码、联系方式、姓名、联系地址、性别)

(2) 客户信息关系模式,里面的关系主键是客户ID。
客户(客户ID、用户名、email、密码、联系方式、姓名、联系地址、性别)

(3) 商品信息关系模式,里面的关系主键是商品编号。。
商品(商品编号、商品价格、商品名、类别、生产产地、商品数量)

表3-1 管理员信息表
列名 数据类型 可否为空 说明
id number NOT NULL 管理员编号
account varchar NOT NULL 帐号
Password varchar NOT NULL 密码
name varchar NOT NULL 姓名
sex varchar NOT NULL 性别
age varchar NOT NULL 年龄
phone varchar NOT NULL 联系方式
email varchar NOT NULL E-mail
address varchar NOT NULL 地址

表3-2 客户信息表
列名 数据类型 可否为空 说明
id number NOT NULL 客户编号
account varchar NOT NULL 帐号
password varchar NOT NULL 密码
name varchar NOT NULL 姓名
sex varchar NOT NULL 性别
age varchar NOT NULL 年龄
phone varchar NOT NULL 联系方式
email varchar NOT NULL E-mail
address varchar NOT NULL 地址

表3-3 商品信息表
列名 数据类型 可否为空 说明
id number NOT NULL 库存编号
name Varchar NOT NULL 商品名称
goodsid varchar NOT NULL 商品编号
price varchar NOT NULL 商品价格
sort varchar NOT NULL 商品分类
num varchar NOT NULL 商品数量
address varchar NOT NULL 生产厂商

4.4 数据库的连接
本系统与数据库的连接方式,包括对数据库中的信息进行添加、删除、修改,都使用的数据持久化层(persistence layer)的开源框架Mybatis,它抽象了大量的JDBC冗余代码,并提供了一个简单易用的API和数据库交互。以便仓库管理人员在计算机上运行本系统时,对数据库进行必要的操作.

4.4.1 连接工具
本系统采用mybatis数据持久化层的开源框架与数据库进行连接,包括对数据库中的信息进行添加、删除、修改. MyBatis简化与实现了在变成中的数据的持久化层(persistence layer),并且它抽象出了大量的JDBC冗余代码,并提供了一个简单易用的API和数据库交互。

MyBatis通过抽象底层的JDBC代码,自动化SQL结果集产生Java对象、Java对象的数据持久化数据库中的过程使得对SQL的使用变得容易。

使用Mybatis的具有一下几点的优势:

  1. 它消除了大量的不必要的重复代码。
  2. 学习和使用起来非常简单。
  3. 能与其他的一些数据库在一起共同使用。
  4. 它可以接受SQL语句。
  5. 具有与其他的一些框架一起使用的集成支持。
  6. 提供了与第三方缓存类库的集成支持。
  7. 引入了更好的性能

4.4.2 工厂类配置文件主要内容

<Configuration>
    <settings> 
			<setting name="cacheEnabled" value="true" /> 
    </settings> 
	<typeAliases>
		<package name="com.briup.bean"/>
	</typeAliases>
	<environments default="develepment">
		<environment id="develepment">
			<transactionManager type="JDBC"></transactionManager>
			<dataSource type="POOLED">
				<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
				<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
				<property name="username" value="briup"/>
				<property name="password" value="briup"/>
			</dataSource>
		</environment>
	</environments>
	</configuration>

4.4.3 Mapper类配置文件主要代码

<mapper namespace="com.briup.bean.AdminMapper">
<select id="selectAdminByName" 
	parameterType="String" resultType="Admin">
		select * from admin
		where account=#{account}
	</select>
	<select id="selectAdminById" 
	parameterType="int" resultType="Admin">
		select * from admin
		where id=#{id}
	</select>
	<insert id="insertAdmin" parameterType="Admin">
		<selectKey keyColumn="id" keyProperty="id" order="BEFORE" resultType="int">
			select admin_seq.nextval from dual
		</selectKey>
	insert into admin values(#{id},#{account},#{password},#{name},#{sex},#{age},#{phone},#{email},#{address})
	</insert>
	<update id="updateAdmin" parameterType="Admin"> 
			update Admin set account=#{account},password=#{password}, name=#{name}, sex=#{sex}, age=#{age}, phone=#{phone}, address=#{address}, email=#{email}
			where account=#{account} 
	</update>
</mapper>

5 软件详细设计
在本次仓库管理系统说实现的这些基本功能。仓库管理的人员或者是客户在登录后可以进入系统使用主界面进行相应的操作。

5.1 登录模块
在本次的仓库管理系统中有两个不同的入口。仓库管理人员使用用户名和密码之后可以对应有相应的操作。用户的登录所需的用户名和密码已经在之前的用户信息表中建立,用户的个人信息由管理员提前录入或者自己注册。

由于用户信息需要先从所对应的数据库中进行读取,所以在读取之前需要先于数据库进行连接。在本系统当中,有两个登陆模块的入口。如下图所示确认文件审核用户提供的用户名和密码。

管理员登录图片如下:
在这里插入图片描述

图5-1 管理员登录

管理员登陆模块主要逻辑代码如下:

AloginServlet.java文件主要代码如下:
   String  account  = request.getParameter("in_be");
	String  password = request.getParameter("pass");
	HttpSession session = request.getSession();
	session.setAttribute("account", account);
	AdminService adminService = new AdminService();
	SqlSession sqlSession = MybatisSessionFactory.getSession();
	AdminDaoImp aDaoImp = new AdminDaoImp();
		try {
		   List<Admin> fadmin = aDaoImp.findAdminByName(account);
		    sqlSession.clearCache();
		    sqlSession.commit();
		//session.close();
		System.out.println("用户名不存在,ADS开始注册"+fadmin);
        for(Admin fAdmin2:fadmin)	
        {   
	      if( password.equals(fAdmin2.getPassword()))
	      {
	      response.sendRedirect("AFirstLog.jsp");
	      session.setAttribute("Admin", fAdmin2);
	      //System.out.println("帐号密码正确!");
	          find=true;
		  }
        }
		 if (fadmin.size()==0) {
			 System.out.println("用户名不存在,ADS开始注册"+fadmin);
			 response.sendRedirect("AloginFail.html");
			 throw new AdminServiceException("用户名不存在!");
			}

		 else {
			 if(find==false){
				 response.sendRedirect("AloginFail.html");
				 throw new AdminServiceException("密码错误!");
			 }
		       }
			   
		 } catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		 }

5.2 入库模块
商品入库模块这是系统设计得最好最完善的模块之一。系统提供两种入库方式可供选择一次是录入库存中已经录入的商品,或者录入库存中没有录入的商品,另外添加新商品。录入已存在商品方式时,可自由选择录入某种商品。

己录入的商品的信息会在相应的信息的框中显示出来。在此模块的编程中,使用了非常多的编程技巧来提供上述功能做到了与完美的配合。此种方式便于管理员掌握相应商品的情况。按商品名查询可以在选定撒谎能够品后,查询某一次或多次商品信息。

添加已有上商品模块如图5-2所示:
在这里插入图片描述

图5-2 添加已有商品图片

当有新的商品进入仓库中时,仓库管理人员需点击入库界面的“添加新商品”选项。在对现有的商品进行入库操作时,商品的信息都是重新输入的。当将新入库的商品的信息填写完毕之后,系统会自己将新入库的一些商品的信息添加到管理商品信息的数据表“goods”中。

添加新商品模块如图5-3所示:
在这里插入图片描述

图5-3 添加新商品模块

5.3 出库模块
商品出库模块这是系统设计得最好最完善的模块之一。系统提供出库方式是在库存表中已经储存有商品基础上才能可以出库的。若是在库存中商品品的数量小于所要出库的输了时,系统会显示出库存数量不足。

在进行出库的操作过程时,若是出库的商品在库存中的数量小于0时,系统会报出出库商品出错。此时都不可以正常出库。在正常出库之后,库存中商品的数量会发生改变。
在这里插入图片描述

图5-4 出库管理模块图片
在出库商品的管理模块中的主要逻辑代码如下:

 GoodsDaoImp goodsDaoImp = new GoodsDaoImp();

	      OutGoodsDaoImp outGoodsDaoImp = new OutGoodsDaoImp();
	      for(Goods goods2:goods){
	    	  String GoodsNum =  goods2.getNum();
	    	  System.out.println("goods2值为:"+goods2);
	    	  Integer IntGoodsNum = Integer.valueOf(GoodsNum);
	    	  Goods goods3 = goods2;
	    	  System.out.println("IntGoodsNum :"+IntGoodsNum);
	    	  if (IntOutNum>IntGoodsNum) {
	    		 System.out.println("出库数量不足!");
				response.sendRedirect("OutStockFail.jsp");
			   }else{

				goods2.setNum(String.valueOf(IntGoodsNum-IntOutNum));

				try {
					//goods3.setNum(String.valueOf(IntOutNum));
					goodsDaoImp.updateGoods(goods2);
					sqlSession.commit();
					goods3.setNum(String.valueOf(IntOutNum));
					outGoodsDaoImp.saveOutGoods(goods3);
					sqlSession.commit();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
				response.sendRedirect("Goods.jsp"); 
				System.out.println("出库成功!");
			   }  
	      }

5.4 用户注册模块
在用户需要访问此系统时,用户需要在登录框中输入相应的信息,然后系统在后台服务器中与数据库进行匹配。

所以在进入系统之前需要进行帐号密码的注册,在注册的过程中需要输入输入用户名、密码、姓名、性别、年龄、联系方式、email、联系地址等一系列信息,系统将其提交至服务器端。

服务器端处理程序时,服务器会获取到系统提交的内容,然后系统会将获取的信息与数据库中所存储的表格中的信息进行对比,得出相应的结果。若是输入的用户名是在数据库的库存中已经存在的,系统会终止注册,然后系统会提示用户名已经被使用,请重新注册的提示。

如果在进行继续注册的过程中出现某一项信息没有填写时,系统会发出此项信息没有填写请重新填写的提示。在进行email注册时,若输入的格式与系统定义的格式不匹配的情况下,系统会作出相应的警告在重新注册。若注册的信息不满足要求时,可以将信息清空再重新注册。
在这里插入图片描述

图5-5 用户注册系统

用户注册模块的逻辑代码如下:

String  account  = request.getParameter("in_be");
	String  password = request.getParameter("pass");
	HttpSession session = request.getSession();
	session.setAttribute("account", account);
	//System.out.println("账户为:"+account);
	//System.out.println("密码为:"+password);
	AdminService adminService = new AdminService();
	SqlSession sqlSession = MybatisSessionFactory.getSession();
	AdminDaoImp aDaoImp = new AdminDaoImp();
		try {
		   List<Admin> fadmin = aDaoImp.findAdminByName(account);
		    sqlSession.clearCache();
		    sqlSession.commit();
		//session.close();	
      //	/session.flush();
        for(Admin fAdmin2:fadmin)	
        
{   
	      if( password.equals(fAdmin2.getPassword()))
	      {
	      response.sendRedirect("AFirstLog.jsp");
	      session.setAttribute("Admin", fAdmin2);
	      //System.out.println("帐号密码正确!");
	          find=true;
		  }
 }
		 if (fadmin.size()==0) {
			 System.out.println("用户名不存在,ADS开始注册"+fadmin);
			 response.sendRedirect("AloginFail.html");
			 throw new AdminServiceException("用户名不存在!");
			}

		 else {
			 if(find==false){
				 response.sendRedirect("AloginFail.html");
				 throw new AdminServiceException("密码错误!");
			 }
		       }
			   
		 } catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		 
}}

5.5 个人信息管理模块
当管理员或用户进入到主界面之后,管理员可以选择信息管理选项,会进入到用户信息的管理模块。管理员或者用户在系统中具有两项功能,第一项功能是可以对管理员或用户的个人信息进行一些列的操作。

在此界面上面可以查询到用户全部的个人信息。第二项功能是能够管理全部的用户的信息。在进入信息管理模块对个人的信息可以进行查看,可以修改自己的信息。在点击修改之后会完成所对应的个人信息。

管理员信息模块图片如图5-6所示:
在这里插入图片描述

图5-6 管理员信息
此信息模块的主要逻辑代码如下:

request.setCharacterEncoding("UTF-8") 
response.setCharacterEncoding("UTF-8");
  	   String  account = request.getParameter("userid");
  	   String  password = request.getParameter("password");
  	   String  name = request.getParameter("name"); 
  	   String  sex = request.getParameter("sex");
  	   String  age = request.getParameter("age");
  	   String  phone = request.getParameter("phone");
  	   String  email = request.getParameter("email");
  	   String  address = request.getParameter("address");
  	   Admin admin = new Admin();
  	   admin.setAccount(account);
	   admin.setPassword(password);
	   admin.setName(name);
	   admin.setSex(sex);
	   admin.setAge(age);
	   admin.setPhone(phone);
	   admin.setEmail(email);
	   admin.setAddress(address);
	   System.out.println("AInfServlet获取的信息:"+admin);
	   SqlSession sqlSession = MybatisSessionFactory.getSession();
	   HttpSession session = request.getSession();
	   AdminDaoImp aDaoImp = new AdminDaoImp();
		try {
			aDaoImp.updateAdmin(admin);
			sqlSession.commit();
			session.setAttribute("admin", admin);
			response.sendRedirect("AInf.jsp");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

在这个模块当中,管理员可以对所有的信息进行修改,所有的用户的信息也可以被查询到。在客户的需求之下,管理员可以随意的进入到某一位客户的信息界面之下,可以对所有的信息进行管理。修改之后用户可使用最新一次更新的信息进行登录,进入主界面之后可以更新自己信息。

系统中全部的用户信息块如图5-7所示:
在这里插入图片描述

图5-7 管理员对客户信息管理

实现此模块的主要逻辑代码如下:

String  password = request.getParameter("password");
	  	   String  name = request.getParameter("name"); 
	  	   String  sex = request.getParameter("sex");
	  	   String  age = request.getParameter("age");
	  	   String  phone = request.getParameter("phone");
	  	   String  email = request.getParameter("email");
	  	   String  address = request.getParameter("address");

	  	   Customer customer = new Customer();
	  	   customer.setAccount(account);
	  	   customer.setPassword(password);
	  	   customer.setName(name);
	  	   customer.setSex(sex);
	  	   customer.setAge(age);
	  	   customer.setPhone(phone);
	  	   customer.setEmail(email);
	  	   customer.setAddress(address);

		   System.out.println("AInfServlet获取的信息:"+customer);
		   SqlSession sqlSession = MybatisSessionFactory.getSession();
		   HttpSession session = request.getSession();
		   CustomerDaoImp customerDaoImp = new CustomerDaoImp();
			try {
				customerDaoImp.updateCustomer(customer);
				sqlSession.commit();
				//response.sendRedirect("ACInf.jsp");
				session.setAttribute("customer",customer);
				response.sendRedirect("ACInf.jsp");
			} 
catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

6 系统的测试
系统测试是软件设计过程中最后的一部分,也是非常重要的一步。用于检查软件的质量、性能、可靠性等是否符合用户需求。一套严谨的、规范的、完善的测试过程将大大提高软件的质量、可信度、可靠性,降低软件的出错率,降低用户风险系数。

在测试的过程中主要需要实现一下几点要求:
1)要完成并实现在前期承诺所需要实现的功能,并且在系统中的每一项功能都需要有说明书。

2)所做出来的产品的性能要得到满足。

3)产品应该能够适应所有的用户的环境。
总之,软件测试的最终的目标是希望能够找出系统中所存在的一些不足与缺陷,而且要求与软件需求阶段所提出的要求相匹配。要注意的是:软件的测试并不能说明软件中没有错误,只能发现并尽可能的减少错误。

6.1 测试简述
省略

6.1.1 测试目的及重要性
系统的测试是一个在开发过程中十分重要的一个阶段。在系统的测试阶段找出程序的错误,并提高系统的性能是测试阶段的主要任务。主要目的是检验系统“做得怎样”。通过软件的测试会发现一系列的问题,还能找出问题的原因,然后再对这些问题进行修改。

6.1.2 测试原则
在软件测试中人们所具有的经验非常重要,但人们的心理因素也更加的很重要的。根据软件测试的目标确定一些测试原则,将一些容易被人们忽视的、实际上又是显而易见的问题作为原则来加以重视,所以测试有以下几大原则。

  1. 测试用力既要有合理的数据的输入,又需要有一定合理的输出结果。
  2. 合理的用例固然重要,但是却不能忘却一些不合理的用例。
  3. 检查程序时,需要检查程序该做的与不该做的事情。
  4. 测试的计划需要早早的开始制定。
  5. 测试计划、测试用例、测试报告需要进行长期的保存,以免以后出问题可以解决。
  6. 遵守二八原则。
  7. 软件的开发人员应该尽量避免不要亲自去进行测试。

6.2 测试方法
以下的两种方法是即为典型的测试方法。
6.2.1 黑盒测试
黑河测试,即功能测试。他的工作重点不是考虑程序应该是怎么编写的。往往将被测试的程序看成一个黑盒,只是在软件的接口处开始进行测试,根据前期制定的需求说明,来检查所做出来的程序是否满足了所有的功能要求。程序梭边写出来的每一项功能,都能不能满足用户在输入数据之后所要达到的目的与要求。并且保持外部信息的完整性。在黑盒测试中会有以下的错误。

  1. 发现一些没有实现的功能。
  2. 在接口上,数据能不能正确的别接收,结果是否合理。
  3. 性能上是否满足要求。
  4. 所做出来的界面是不是很清晰、美观。

6.2.2 白盒测试
白盒测试,即结构化的测试,主要测试程序的内部组成。白盒测试与黑盒测试法不同,测试人员将程序视为一个透明的盒子,测试人员需要检查处理过程的中一些细微的程序,要求对程序的结构性做到一定程度的覆盖,以此来检验程序内部的一些组成。

6.2.3 单元测试
单元测试(unit testing),对软件设计中的一些细小的结构单元进行测试。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的测试单元与其他部分相隔离的情况下进行测试。

6.2.4 集成测试
集成测试,即软件的联合测试。以单元测试为基础,把系统中所做出来的一些模块结合起来进行测试。

6.3系统模块的测试
6.3.1 登陆模块测试:
在首次进入系统时,首次进入的是登陆注册的界面,在输入的信息有效的情况下会进入到首界面。如图6-1所示为系统的登录界面的测试:
在这里插入图片描述

图6-1 管理员登录测试

在当帐号密码出错时,系统会自动跳转到一个报错的页面如图6-2所示:
在这里插入图片描述

图6-2 登录出错界面

6.3.2 出库模块测试
系统在进入主界面之后会有一个出库模块的入口,在进入到出库模块时,在输入的出库数量小于库存数量商品能够进行正常出库操作,查询库存结果随之更新。出库的数量比库存中的数量躲得情况下,会跳转一个出库出错的界面,提示库存数量不足。该模块之下的测试用例如下:
库存中的信息如图6-3所示:
在这里插入图片描述

图6-3 出库前库存信息
以华为手机出库为例先存量为103,出库数量20(如图6-4所示):
在这里插入图片描述

图6-4 出库信息图
在进行完出库的操作之后,如图6-5所示:
在这里插入图片描述

图6-5 出库后库存信息图

出库数量超出库存数量,以铅笔为例,出库25个如图6-6所示:
在这里插入图片描述

图6-6 铅笔出库信息图
铅笔进行出库操作后库存中的信息图如图6-7所示:
在这里插入图片描述

图6-7 库存不足出库后信息图
用户信息模块测试:
此模块的信息如图6-8所示:
在这里插入图片描述

图6-8 用户信息图
修改后信息图如图6-9所示:
在这里插入图片描述

图6-9 修改后用户信息图
6.4.3 用户信息模块测试结果
当在操作中,进入到系统中的这个模块时,可以查看到本人的所有登录信息。可以对此模块中的所有的信息都进行修改操作,然后在对所作出的操作进行更新。

总 结
基于Web的仓库管理系统在之后的市场发展中有着非常广阔的前景,会对传统的一些理念造成巨大的冲击。本文是运用了计算机学科中的两项重要的技术即计算网络技术和数据库技术出发,分析了Web数据库及JSP技术在本次仓库管理系统中的应用。本文的主要工作如下:

1、探讨了数据库应用系统所经历的主机/服务器—浏览器/服务器模式,重点讨论了三层结构的工作原理及其特点,其中有中间件技术(CGI和API), Java技术、JSP技术、JScript技术、Mybatis技术、PowerDesiner技术等,而且还从一定的方面评价分析了其中的优缺点。

2、探讨了怎么合理的运用在软件工程中所学习的一些基本原理去分析和设计实现仓库管理系统的过程。并对系统的开发原理、功能设计和模块的设计做出系统的分析。

3、论文中详尽的介绍了仓库管理系统的总体框架和使用的主要技术、以及功能的实现。

本文通过理论联系实际,对三层架构结构上的Web数据库的不同实现方法作了详尽的分析,同时使用JSP技术开发的一个仓库管理系统。

致 谢
省略

参考文献
[1] 郑人杰等编著,软件工程[M].清华大学出版社,1999
[2] DAVID A. GUSTAFSON,Schaum’s Outline Series -Theory and Problems of SOFTWARE ENGINEERING[M].McGRAW-HILL Companies.Inc,2002
[3] 唐东,《Web数据库开发进阶》,人民邮电出版社
[4] Jeffrey D.Ullman.Fundamental Course of Database System[M].TsingHua Press,2001.
[5] DAVID A. GUSTAFSON,Schaum’s Outline Series -Theory and Problems of SOFTWARE ENGINEERING[M].McGRAW-HILL Companies.Inc,2002
[6] 张海藩.软件工程导论[M]. 北京:清华大学出版社,2003.
[7] 李习文,李斌.库存控制与管理 [M].北京:机械工业出版社,2007:43-120
[8] 周之英编著,现代软件工程[M].科学出版社,2000
[9] 徐娟.网页制作实用技术[M].北京:清华大学出版社,2003:21-52.
[10] 元燕辉等,《浏览器/服务器应用开发》,科学出版社


5、源码下载:

本项目源码及论文如下,有需要的朋友可以点击进行下载。如果链接失效可点击下方卡片扫码自助下载。

序号毕业设计全套资源(点击下载)
本项目源码基于javaEE+Mybatis的WEB仓库管理系统设计与实现(源码+文档)_javaEE_Mybatis_仓库管理系统.zip
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐