基于SSH的物流配送管理系统的设计与实现

摘 要

当今社会,物流配送已成为影响经济发展的显著因素。而随着社会信息化发展,建立有效的物流配送管理体系不仅能够减少物流成本,更能够提升工作人员的工作效率与客户的满意度。而基于B/S架构的物流配送管理体系,不仅具有良好的分布性,可以随时随地进行业务的浏览、查询和处理,而且部署维护方便,易于扩展。本文设计的物流配送管理系统正是基于B/S架构实现的JavaWeb项目,具备以上优点。
本文讨论了B/S架构与C/S结构之间的优缺点,介绍了进行JavaWeb项目开发的相关技术、所应用的MVC设计模式和开源集成框架SSH (Struts+Spring+Hibernate)以及使用的MySQL数据库,对开发的物流配送管理系统进行了详细的可行性研究与需求分析,并细致的介绍了系统的总体设计,包括系统的架构设计、功能模块划分及业务逻辑的实现。
本文设计的物流配送管理系统是利用Java语言和Eclipse编程工具编写而成的。系统集客户管理、仓库货物管理、配送管理、权限管理等功能于一体,前端页面设计采用ExtJS进行布局,界面简洁且具有良好的兼容性,业务逻辑简单,易于操作,为用户提供了一个友好的信息管理系统。

关键词:物流配送;B/S架构;设计模式;SSH;ExtJS

Design and Implementation of Logistics Distribution Management System Based on SSH

Abstract
In recent days, the logistics distribution has become the most important fact to affect the development of economic. And with the coming of information age, establishing an effective logistics distribution management system not only can reduce the logistics cost, but also can improve the working efficiency of the staff and customer satisfaction. The logistics distribution management system based on B/S model has good distribution capability. People can browse, query, and process of business at any time and place. In addition, it is convenient to develop and maintain, and it is easy to extend. This article describes a Java Web project that is based on B/S model.
This article describes the advantages and disadvantages of the B/S structure and C/S structure, and introduces the related technology of developing JavaWeb project, the application of MVC design pattern, the opening source SSH(Struts+Spring+Hibernate) framework and the technology of MySQL. In addition, the feasibility study and demand analysis of the logistics distribution management system are carried out in detail. The paper detailed describes the overall design of the system, including the system architecture design, function module division and business logic.
The logistics distribution management system designed in this paper is written by Java language and Eclipse programming tools. The system is consisted of customer management, warehouse and cargo management, distribution management, rights management and others functions. The layout of front page uses ExtJS. The interface is simple and has good compatibility. The business logic is easy for user to understand and operate. In short, a friendly management system is provided for the user.

Key Words:Logistics Distribution;B/S Model;Design Pattern;SSH;ExtJS

目 录

摘 要 I
Abstract II
引 言 1
1 项目背景及相关技术介绍 2
1.1 项目背景 2
1.2 项目目的 2
1.3 开发环境介绍 2
1.3.1 Tomcat服务器 2
1.3.2 MySQL数据库 2
1.4 相关技术介绍 3
1.4.1 B/S架构和C/S架构 3
1.4.2 JSP介绍 4
1.4.3 ExtJS介绍 5
1.4.4 JavaWeb开发框架 5
1.5 论文结构 8
2 系统分析 9
2.1 可行性分析 9
2.1.1 社会可行性分析 9
2.1.2 经济可行性分析 9
2.1.3 技术可行性分析 9
2.2 需求分析 9
3 总体设计 14
3.1 系统架构设计 14
3.2 业务流程设计 15
3.3 系统功能模块图 15
3.4 系统配置文件 16
3.4.1 Web工程配置文件 16
3.4.2 Struts配置文件 18
3.4.3 Spring配置文件 18
3.4.4 Hibernate配置文件 19
4 详细设计 21
4.1 登陆及权限管理的设计 21
4.2 客户服务中心 21
4.3 调度中心 22
4.4 中心仓库管理 23
4.5 配送中心 24
4.6 分站管理 25
4.7 数据库设计 26
4.7.1 设计原则 26
4.7.2 关系设计 26
4.7.3 基本表的设计 27
5 功能实现 33
5.1 登陆及权限管理的实现 33
5.2 客户服务中心 35
5.3 调度中心 39
5.4 中心仓库管理 40
5.5 配送中心 42
5.6 分站管理 45
6 系统测试 48
结 论 50
参 考 文 献 51
致 谢 52

引 言

随着社会信息化发展的速度不断加快,互联网的覆盖面积不断扩大,计算机的不断普及,人们对互联网的认知也不断加深,对互联网的要求也越来越高。随着人们访问互联网的便捷程度不断提升,以互联网为基础的网上办公已成为提升办公效率、提高办公规范的首要工作方式,因此,采用计算机来管理公司的各种业务已成为必然趋势。
管理信息系统(MIS)是一个以人为主导,利用计算机硬件、软件、网络通信设备以及其他办公设备,进行信息的收集、传输、加工、储存、更新、拓展和维护的系统。通过调查了解一个企业的人力、物力、财力、设备、技术等资源,建立正确的业务逻辑及数据信息,并对其进行加工处理形成一整套的业务处理体系,提供给管理人员使其便捷、高效地做出决策,能够不断地提高企业的管理水平和经济效益。伴随信息化浪潮的兴起,企业办公必然向着快捷、高效的无纸化方向发展。使用MIS系统进行系统决策,更能够使管理人员及时了解企业现状,把握企业的未来发展道路。
本项目开发的物流配送管理系统是针对物流配送行业的相关业务需要建立起来的现代管理信息系统。该系统是基于B/S结构实现的Java Web项目,能够满足基本的物流配送业务流程,其基本功能如下:
(1)客户服务中心:实现客户的增删改查管理,并能为客户生成订单;实现订单信息查询;
(2)调度中心:实现对缺货订单状态的修改以及对生成的订单进行调度管理;
(3)投递分站管理:面向客户提供服务,实现对已完成调度的任务单进行查询分配,并对已完成配送的任务单进行回执录入;对中心仓库的调拨货物入库,配送员按照配送任务单进行领货;
(4)中心仓库管理:仓库分为中心仓库与分站仓库,实现中心仓库对外进货并将货物入库,将货物调拨到投递分站的仓库;
(5)配送中心管理:实现商品、供应商、仓库的增删改查管理,对缺货商品安排进货;同时可查询客户订购的货物排行及配送员配送情况。
(6)权限管理:实现用户分权限管理,不同权限的用户可进行的管理操作不同。程序在设计和开发实现后,对其进行了详尽的测试,经测试证实其业务逻辑和性能满足设计需求。但由于开发时间短,故界面美观性及具体的功能还有待增加完善,今后会对其持续完善。

1 项目背景及相关技术介绍

1.1 项目背景
由信息化带来的世界发展趋势必然是全球化和市场化,而物流配送正是这两者的结合,并且物流配送也进一步促进了世界经济和贸易的发展。自1996年11月的中国第一宗网络购物的发生到现在,网络购物依然成为人们生活中不可或缺的一部分。各大网络购物平台的兴起,更是使得网购在人们消费方式中占据了相当大的比重,由此也带来了物流配送行业蓬勃兴起。随着物流企业的规模和业务不断扩展,单靠传统的管理模式已无法满足其工作需求,因此一个高效便捷的业务决策系统就显得尤为重要。
1.2 项目目的
物流配送系统的主要目标是能够高效、快速的调配企业的各种资源,使企业的各部门分工协作,以求为客户提供满意、高效的配送服务。本项目的目的是开发一款可以高效便捷处理物流配送业务的管理信息系统,界面简洁,操作简单。
本项目是基于B/S结构的JavaWeb项目,能够将传统物流配送管理中繁琐的管理工作清晰化,透明化,实现物流配送信息的系统化、规范化、信息化,从而达到提高物流配送管理效率的目的。
1.3 开发环境介绍
1.3.1 Tomcat服务器
Web容器是一种为应用程序组件(如JSP、Servlet)提供一个运行时环境(Runtime Environment),这样就可以不再关注其他的系统问题。现在主流的Web容器有Tomcat、Weblogic、WebSphere等,而本设计采用Tomcat的原因为相较于其他的Web容器,Tomcat具备了很多优点使其非常适合用来开发中小型系统,如开源免费、技术性能稳定、轻量级、具有良好的扩展性等,除此之外,Tomcat的部署简单方便,不像Weblogic等需要单独创建Weblogic域和数据源,而且Tomcat在运行时占用的系统资源小,启动速度快,其功能和性能的全面性使其非常适合快速开发调试Web程序。
1.3.2 MySQL数据库
MySQL是一个开源的关系型数据库管理系统。关系型数据库,是指采用了关系模型来组织数据的数据库。简单来说,可以将关系理解为“表格”,而一个关系型数据库就是由一个或者多个表格及其表格之间的关系组成的。
虽然相比于Oracle、Sybase、DB2等大型商业数据库,MySQL存在一些不足,如功能不够强大、没有提供自身的存储引擎、仅提供简单的可编程支持等,但整体而言,其功能完全可以满足通用的需求。MySQL支持多线程,并为多种编程语言提供了API,非常适合用来开发JavaWeb项目;使用标准的SQL数据语言形式,使得查询、存储信息更加容易。此外,MySQL作为一个开源的软件,不仅成本低,而且其易用性、性能及可靠性方面具有很大优势。排在全球前10位的大型网站里面,大部分网站都有部分业务是运行在MySQL数据库环境上的,如Facebook、Yahoo、Google等。
1.4 相关技术介绍
1.4.1 B/S架构和C/S架构
现在软件开发的整体架构主要分为B/S架构和C/S结构。B/S架构全称为Browser/Sever,即浏览器/服务器架构;C/S架构全称为Client/Sever,即客户端/服务器架构。B/S架构中,B指的是Web浏览器,主要事物逻辑是在S端(即服务器端)实现的,极少数的事物逻辑在前端实现;另外,B/S架构中的显示逻辑交给了Web浏览器,事物处理逻辑交给WebApp完成,这样能够减少客户端的压力,避免了庞大的胖客户端,故也被称为瘦客户端。如图1.1为B/S架构图。而且现在任何操作系统中都带有浏览器,故基于B/S架构的软项目具有良好的普适性。
在这里插入图片描述

图1.1 B/S架构图

相较于C/S架构,B/S架构具有很多优点,客户端无需安装,有Web浏览器即可;具有良好的分布性,可以随时进行业务的查询、浏览与处理;业务扩展方便,增加服务器功能只需要增加网页即可;维护简单,改变页面即可实现所有用户的同步更新;开发简单,成本低,且共享性强;数据可以存储在云端,不必担心数据丢失[1]。同时B/S也有安全性相对较差,实现复杂功能较为困难,跨浏览器适应性较差等缺点。但是随着编程语言的不断发展,B/S架构的这些缺点也在不断改善中。我们可以通过一个B/S架构与C/S架构的对比来更加深入的了解它们之间的差异,如表1.1所示:

表1.1 B/S架构与C/S架构对比
项目 B/S架构 C/S架构
硬件环境 适用于广域网,范围广 适用于专用局域网
安全性 面向不可知人群,安全性较弱 面向固定人群,安全性强
重用性 多重结构,重用性强 注重整体性,重用性弱
可维护性 可维护性强 可维护性弱
工作原理 浏览器通过WEB服务器向数据库服务器发送数据请求,是多对多通信 客户端与服务器直接相连,是点对点通信
数据库连接类型 JDBC连接,用户不保持对数据库的连接,用户数无限制 ODBC连接,用户保持对数据库的连接,用户数有限制
响应速度 依赖数据库服务器,高并发时响应速度慢 响应速度快
信息流 信息流向可变化,交互性高 典型的中央集权式机械处理,交互性低

随着PC机的诞生与应用,计算机模式从集中式(数据和应用程序在一台主机上)转向了分布式(数据和应用程序跨越多个节点机),尤为典型的是C/S架构。近来,随着网络技术的不断发展,尤其是基于Web的信息发布和检索技术、Java计算技术以及网络分布式对象技术的飞速发展,导致了很多应用系统的体系结构从C/S结构向更加灵活的多及分布结构演化,即B/S体系架构。对于分布式系统,B/S架构相较于C/S架构而言具有更高的适用性,故本文设计的物流配送管理系统是基于B/S架构的。
1.4.2 JSP介绍
JSP(Java Server Pages)是一种动态网页技术标准,实现了与用户的交互,是基于B/S架构的动态网页。作为一种动态网页技术,JSP具备了很多静态网页(.htm,.html)所不具备的优点。由于其是在静态网页(.htm,.html)中嵌入Java程序段(JavaScript)和JSP标记(tag),本质就是Java程序,继承了Java的一切优点,具有严格的Java语法和丰富的Java类库支持,且使用JSP技术开发出来的Web项目是平台无关性的,可以在Windows、Linux等不同操作系统上运行;JSP具有九大内置对象,在编写代码时无需声明即可直接使用,大大方便了软件开发人员的开发过程。JSP技术发展到今天已经变得相当成熟完备,并且其前景非常广阔。在这样的背景之下,利用该技术来进行管理信息系统的开发非常具有意义。
1.4.3 ExtJS介绍
ExtJS的前身来自于YUI(Yahoo!UI Library),经过不断地发展和改进,目前已成为网络上UI界面最丰富、绚丽的JavaScript基础库之一。ExtJS库提供了大量的UI组件,可以大大缩短软件的开发周期;使用更加标准的形式展示数据,降低了开发难度;对浏览器没有任何要求,兼容性好;与后台代码无关。虽然ExtJS也存在一些缺点,但其强大的功能及其适应性,使其成为开发Web项目的首选。
1.4.4 JavaWeb开发框架
本系统采用SSH(Struts+Spring+Hibernate)开源集成框架进行开发,属于传统的MVC设计模式。接下来将对其进行介绍。
(1)MVC设计模式
MVC全名为Model View Controller,是模型-视图-控制器的缩写,是一种软件设计典范,它将业务逻辑、数据、界面显示的代码分离开来,将业务逻辑聚集到一个组件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。下面将详细说明MVC中的各个组成部分。
模型,也称为数据模型,是应用程序的主体部分,用于处理应用程序的数据逻辑,封装相关数据并定义处理数据的方法。控制器依据I/O的需要来调用这些操作过程。模型还为视图获取显示数据提供了访问其数据的操作。
视图是呈现给用户的,用户与之产生交互。视图向用户显示相关的数据,并能接收用户的输入数据。视图可以查询业务状态,但并不进行任何的业务处理,且不能改变模型。视图还能接受模型发出的数据更新事件,从而实现对自身功能的同步更新。
控制器是应用程序中处理用户交互的组件。通常控制器负责从视图中读取数据,控制数据在视图上展示,处理逻辑,并向模型发送数据,调用其处理业务的请求。如图1.2所示描述了MVC组件间的关系与功能:
其事件发生过程如下:
① 用户通过视图和应用发生交互,并向控制器发送请求。
② 控制器的事件处理器被触发。
③ 控制器从模型中请求数据,并将其交给视图。
④ 视图将数据呈现给用户。
在这里插入图片描述

图1.2 MVC组件类型的关系和功能

MVC的工作模式具有很多优点,使其很受开发者的喜爱。如,MVC具有低耦合性,实现了视图层与业务层的分离,可以不用重新编译模型和控制器的代码就更改视图层的代码。同样地,如果应用程序的业务规则或业务流程发生了改变,只需要更改其模型层的代码即可。另外,MVC也具有较高的重用性。移动终端的发展与普及,给Web应用程序带来了新的挑战与更高的要求,而MVC的高重用性允许以各种不同的视图来访问同一个服务器,满足了Web应用程序不论通过Web浏览器还是无线浏览器(wap)都能实现其功能的需求。此外,MVC还具有开发成本低,部署快,可维护性高等优点。
(2)SSH集成框架
SSH为Struts+Spring+Hibernate的一个集成框架,是一种Web应用程序开源框架,用于构建灵活、易于扩展的多层Web应用程序。
Struts本身是使用经典的MVC结构实现的,它将Servlet、JSP、自定义标签和信息资源(message resource)整合在一个统一的框架中,为Web应用提供了通用的框架,让开发人员专注于解决实际的业务逻辑,实现了代码的重用,使开发人员从繁杂的工作中解放出来,从而可以快速的开发出具有很强扩展性的Web应用程序。
Spring是一种基于MVC结构的轻量级业务服务层开发框架,其所耗费的系统资源开支比较少,而且Spring是非侵入式的,具体的对象并不依赖于Spring的API。Spring通过IoC(控制反转)和AOP(面向切面)这两种核心技术,统一了对象的配置、查找和生命周期的管理,从而实现了业务层中不同基础服务的分离,简化了企业应用开发的复杂性。在IoC中,对象之间的依赖关系是在统一的配置文件中进行描述,而不会在程序中用代码直接调用其他类的对象,这样就实现了由框架或容器掌握程序的控制权,而不是应用程序代码本身,大大降低了代码间的耦合程度。AOP是OOP(面向对象编程)的延续,不同于OOP对实体及其属性和行为进行封装,AOP是面向动词领域的,它将影响到多个类的行为封装到可重用的模块中,能够通过预编译的方式和运行期间动态代理的方式在不修改源代码的前提下实现程序功能的统一维护,提高了程序的可重用性。
Hibernate是一个基于Java的对象/关系数据库映射工具,它将对象模型表示的数据映射到用SQL表示的关系模型上去,减少了应用开发过程中数据持久化的编程任务。
集成SSH框架的系统从职责上分为表示层、业务逻辑层、数据持久层和实体层(域模块层)四层。表示层是由Struts框架实现的,业务逻辑层采用Spring框架实现,数据持久层采用Hibernate框架建立Java对象模型的持久对象。Struts是系统的整体基础架构,负责MVC的分离。在SSH集成框架中,Struts主要起控制作用,用于控制业务的跳转;Hibernate框架实现对数据持久层的支持;Spring作为一个轻量级的IoC容器,使Struts框架和Hibernate框架有效的结合起来,主要负责查找、定位、创建和管理对象及对象之间的依赖关系。
基于SSH集成框架构建而成的系统的基本业务流程如图1.3所示,

在这里插入图片描述

图1.3 架构图
①在表示层中,JSP页面为交互界面,实现用户与Web程序之间的交互,负责传送Request(请求)和接收Response(响应),然后根据配置文件(struts-config.xml)进行表单验证,并将ActionServlet接收到的Request分派给相应的Action来处理。
②在业务逻辑层中,Spring IoC容器提供给Action所需要的Model组件及其协作DAO组件来完成业务逻辑的处理。
③在数据持久层中,依赖于Hibernate的对象关系数据库映射查询数据库,并处理DAO组件请求的数据,返回处理结果。
采用SSH集成框架不仅实现了MVC的分离,而且实现了业务逻辑层和数据持久层的分离,降低了不同层之间的耦合度,大大提高了系统的可复用性。
1.5 论文结构
本文共分为六章,其内容安排如下所示。
第一章为项目背景及相关技术介绍,介绍了开发本项目的背景和目的,所用到的JSP、ExtJS、SSH开发框架、Tomcat Web容器及MySQL数据库概况和论文结构。
第二章为物流配送管理系统的分析,分别从社会、经济、技术三个方面分析了设计本项目的可行之处,同时还进行了需求分析。
第三章为系统的总体设计,描述了该系统的功能模块划分、架构设计及其配置文件设计。
第四章对本系统进行了详细设计,包括系统的登陆及权限管理的实现设计、各功能模块的详细功能设计和数据库设计。
第五章介绍了系统功能模块的实现过程以及使用方法。
第六章通过测试用例测试了该系统从创建订单到交付订单货物的整个流程,说明了该系统的可用性与完整性。

2 系统分析

系统分析是管理信息系统的一个主要阶段和关键阶段,本节将对物流配送管理系统做较为全面的可行性分析与需求分析。
2.1 可行性分析
本项目的可行性分析将分别从社会可行性、经济可行性以及技术可行性三个方面进行分析研究,说明开发本系统的可行性。
2.1.1 社会可行性分析
该项目不会对社会稳定性产生不利的影响,不存在任何妨碍政策方针的因素,也不存在侵犯法律道德的行为,不管从任何角度都不会成为一款对社会产生不良影响的系统。
2.1.2 经济可行性分析
该系统的设计和开发使用的是开源的集成框架SSH、ExtJS库、Web容器Tomcat、MySQL数据库、开发工具Eclipse,无需开发资金,仅仅需要投入开发时间即可,所以本系统的开发成本远远低于它的经济效益。另外,该系统是一个小型Web项目,进行部署所需要的软件环境要求很低,并且系统投入工作后能够节省劳动力,提高工作效率,促使经济效益的提高。
2.1.3 技术可行性分析
开发该系统的编程语言为Java语言,另外采用了现在非常流行的SSH开源集成框架及ExtJS库,并与简单、易学的MySQL数据库相结合。本系统主要涉及数据库的操作为增、删、改、查等重复性操作。系统分层明确清晰,
2.2 需求分析
用例图是指由参与者(Actor)、用例(Use Case)以及它们之间的关系构成的用于描述系统功能的静态视图。本节将通过用例图对该系统的功能需求进行分析。
作为一个MIS(管理信息系统),必须具备完整的功能以处理相应的业务需求。本文设计的物流配送管理系统共分为五个模块,分别为客户服务中心、调度中心、中心仓库管理、配送中心、分站管理,并实现了相应的权限管理。如图2.1为该系统的总体用例图。

在这里插入图片描述

图2.1 系统总体用例图

(1)客户服务中心
该模块主要实现与客户相关的功能,包括客户管理和订单信息查询两个子功能模块。其中客户管理必需的功能为添加客户、删除客户、查询客户以及选择相应客户进行新订单的创建;订单查询则需要根据条件进行订单信息的查询并可查看订单的详细信息。其用例图如下图2.2所示。

在这里插入图片描述

图2.2 客户服务中心用例图

(2)调度中心
该模块主要实现与订单相关的功能,包括对新创建的订单进行调度处理并产生任务配送单和货物调拨单,修改缺货订单在来货后的订单状态,查询订单在调度后产生的配送任务单。如图2.3为该模块的用例图。

在这里插入图片描述

图2.3 调度中心用例图

(3)中心仓库管理
仓库主要分为中心仓库和分站仓库,该模块的功能为查询购货单,对缺货商品进行进货入库处理,修改入库货物的实际入库数量,将货物调拨到相应的投递分站仓库并产生分发单,查询调拨详情。其用例图如下图2.4所示。

在这里插入图片描述

图2.4 中心仓库管理用例图
(4)配送中心
该模块包括商品管理、供应商管理、仓库管理、进货管理四个子模块。其中商品管理的功能为商品一级分类、二级分类的添加与删除,商品的添加与删除;供应商管理的功能为供应商的添加与删除;仓库管理的功能为仓库的添加与删除,仓库存储量的设置,仓库出入货物单查询;进货管理的功能为生成相应的进货单与入库单。其用例图如下图2.5所示。
在这里插入图片描述

图2.5 配送中心用例图

(5)分站管理
该模块的功能为将中心仓库的货物调拨入库,配送员领取货物,分配给配送员配送任务,根据相关条件查询配送任务单,根据配送员的配送信息进行回执录入。其用例图如下图所示。

在这里插入图片描述

图2.6 分站管理用例图

3 总体设计

在进行了系统分析后,已经明确了本系统的功能。在本章中将进行该系统的总体设计,分析研究如何实现该系统。
3.1 系统架构设计
该系统是基于B/S架构的Java Web项目,界面采用开源ExtJS库进行布局,总体架构为SSH,该系统的集成架构如图3.1所示。
在这里插入图片描述

图3.1 ExtJS+SSH集成架构图

编写JSP文件及JavaScript脚本,进行前端界面的布局。JSP文件在编译后会生成“类servlet”,而Web.xml文件可以实现Servlet、JSP文件的URL定制,然后通过Struts-config.xml文件将URL请求映射到对应的Action类。然后Action类调用相应的Service类进行业务逻辑的处理,Service通过DAO类调用bean来访问数据库,进行相应数据的查询与处理。
3.2 业务流程设计
本系统的业务流程是以客户为中心的,实现了客户从订单请求到订单交付的全过程,其流程如下图3.2所示。

在这里插入图片描述

图3.2 物流配送业务流程图

(1)客户发起订单请求,客户服务中接收到该请求后创建订单;
(2)调度中心收到订单后查询库存信息,生成相应的货物调拨单及配送任务单,其中货物调拨单用于调拨仓库中货物,配送任务单分配给配送员以完成货物配送任务;
(3)中心仓库收到货物调拨单后,将相应的订单货物分发到对应分站仓库;
(4)分站收到任务配送单后,将其分配给合适的配送员;
(5)配送员到相应的分站仓库领取货物,将货物配送给客户;
(6)分站根据配送员的配送回馈信息进行回执录入。
3.3 系统功能模块图
对物流管理系统的功能性需求分析,可以按照功能及权限管理将系统划分为如图3.3所示的功能模块。

在这里插入图片描述

图3.3 系统功能模块图

3.4 系统配置文件
在进行系统开发时,最重要的是选择合适的系统架构以及搭建该系统架构。在确定了本系统的架构为SSH集成框架后,本节将介绍如何设计搭建该系统框架。
3.4.1 Web工程配置文件
每个JavaWeb工程都有Web.xml配置文件,但Web.xml文件并不是必需的,即Web工程可以没有该文件。该文件的作用是初始化配置信息,接下来将详细介绍该系统的架构配置文件用到的一些标签及其功能。
(1)指定欢迎页面
如下所示,指定了网站的欢迎页面为login.jsp。

login.jsp

所谓欢迎页面,就是指访问一个网站时默认看到的第一个页面,在一般情况下是将网站的首页作为欢迎页面。
(2)加载Struts配置文件
① 命名Servlet
如下所示为将org.apache.struts.action.ActionServlet命名为action。此外,此处还定义了该Servlet的初始化配置文件为WEB-INF根目录下的struts-config.xml配置文件。

action
org.apache.struts.action.ActionServlet

config
/WEB-INF/struts-config.xml


② 定制Servlet的URL
如下所示,当发起URL请求时,如果符合*.do格式,则该请求由action处理,即action会截获该请求,这时可以在action中进行相应的处理。

action
.do

(3)加载Spring配置文件

contextConfigLocation
classpath:applicationContext-.xml

org.springframework.web.context.ContextLoaderListener

在Web项目启动时,Web容器(本系统采用的是Tomcat容器)会读取配置文件Web.xml的和,创建监听。
(4)设置过滤器
如下所示,分别设置了Spring和Hibernate的过滤器,并监听所有的URL请求,过滤所有的资源。

Spring character encoding filter
org.springframework.web.filter.CharacterEncodingFilter

encoding
utf-8



Spring character encoding filter
/


hibernateFilter
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter


hibernateFilter
/

3.4.2 Struts配置文件
Struts框架的配置文件为struts-config.xml,下面将介绍进行SSH框架整合所进行的配置设置。
(1)配置ActionForm
ActionServlet则将URL请求参数传递赋值给ActionForm bean实体,然后将该bean实体传递到相应的Action类中。如下所示则是将其传递给了LoginForm类。




(2)配置ActionMapping
该配置的作用为将URL请求映射到相应的Action类,并将Action类与ActionForm bean实体相关联,控制框架内部的流程。如下所示将URL请求/index.jsp转发到了applicationContext-actions.xml配置文件中的id=“/login”。



3.4.3 Spring配置文件
Spring框架的配置文件为ApplicationContext.xml,在进行本系统的框架整合过程中,为了便于区分及编写,将该配置文件按照其功能分为了ApplicationContext-common.xml、ApplicationContext-actions.xml、ApplicationContext-services.xml和ApplicationContext-daos.xml四个文件。其中ApplicationContext-actions.xml文件实现了Action注入给Service,ApplicationContext-services.xml文件实现了Service注入给DAO,ApplicationContext-daos.xml实现了DAO注入给SessionFactory,ApplicationContext-common.xml文件实现了将数据源(hibernate.cfg.xml文件)注入给SessionFactory和将SessionFactory注入给HibernateTransactionManager事务管理器。其详细配置信息如下所示。
(1)配置ApplicationContext-actions.xml



实现了将struts-config.xml配置文件中的/index.jsp映射到LoginAction类,并实现Action注入给Service。
(2)配置ApplicationContext- services.xml



实现了ApplicationContext-actions.xml中的bean实体映射到Service类,并实现Service注入给DAO。
(3)配置ApplicationContext- daos.xml



实现了ApplicationContext- services.xml中的bean实体映射到DAO类,并实现DAO注入给SessionFactory。
(4)配置ApplicationContext- common.xml
① 将数据源(hibernate.cfg.xml文件)注入给SessionFactory,如下所示。


classpath:hibernate.cfg.xml


② 将SessionFactory注入给HibernateTransactionManager事务管理器,如下所示。





③ 设定参与事务的方法,如下所示。
<aop:config proxy-target-class=“true”>
<aop:pointcut id=“interceptorPointCuts”
expression="execution(com.logistics.service....(…))" />
<aop:advisor advice-ref=“txAdvice” pointcut-ref=“interceptorPointCuts” />
</aop:config>
3.4.4 Hibernate配置文件
Hibernate框架的配置文件为hibernate.cfg.xml及*.hbm.xml,其详细配置如下所示。
(1)配置hibernate.cfg.xml

com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/test1
root
123456
org.hibernate.dialect.MySQLDialect
true
update


该文件包含数据库驱动、数据库地址、数据库用户名及密码和*.hbm.xml文件映射。
(2)配置*.hbm.xml
该文件将Java持久化对象bean映射到MySQL数据库中的数据库,如下所示,将com.logistics.bean.AllocationOrder实体映射到数据库test1的L_ALLOCATIONORDER表。








4 详细设计

本章将介绍本系统的登陆及权限管理的设计、功能模块的详细设计及数据库设计。
4.1 登陆及权限管理的设计
本系统的前端页面主要分为两个界面,分别为登录页面(login.jsp)和首页(index.jsp),其中首页(index.jsp)定义了一个iframe,通过首页的菜单将相关的业务操作页面显示在iframe中,并且通过首页的菜单栏实现了权限控制,如下图4.1所示。

在这里插入图片描述

图4.1 登陆时序图

用户进入登陆页面(login.jsp),填写登录信息,发起登陆请求;然后由监听该请求的Java后台程序获取登录信息并进行信息的验证,若验证成功则根据登陆用户的权限获取相应权限的操作菜单列表,跳转到首页并显示操作菜单列表;登陆用户通过点击操作菜单列表发起相关操作的请求,跳转到相应的业务操作页面,显示在首页(index.jsp)的iframe中,这样,用户就可以进行相应的业务处理了。
4.2 客户服务中心
客户服务中心主要实现与客户相关的功能,包括客户的添加删除,订单的添加查询。其时序图如下图4.2所示。
管理员用户通过点击首页(index.jsp)的菜单进入客户管理界面,进入客户管理界面时发送查询全部客户的请求,然后通过配置文件由相应的Action类截获该请求,并执行相应的方法调用Service类进行逻辑处理,最后查询数据库并返回查询结果到前端,前端获取到后台返回的客户列表后进行加载显示。添加订单与添加客户操作的不同之处为,当执行添加订单时,需要满足一个前提才能够进行订单的创建,即需要选择创建订单的客户。
在这里插入图片描述

图4.2 客户管理时序图

4.3 调度中心
调度中心是本系统的控制枢纽,实现了从创建订单到交付订单的过渡,其主要功能是对客户服务中心创建的订单进行调度处理。
在这里插入图片描述

图4.3 订单调度流程图
其流程如上图4.3所示。当客户服务中心创建订单时,会查询订单中货物在仓库中的储存量信息,若满足订单要求,则设置该订单的状态为可分配;若不满足订单要求,则订单状态为缺货。调度中心只能够将订单状态为可分配的订单进行调度处理。当缺货状态的订单进行了进货处理后,即缺货订单已满足订单要求,这时可以通过修改订单状态操作将缺货状态修改为可分配状态,进而进行调度处理。
4.4 中心仓库管理
仓库包括中心仓库和分站仓库,其中只有一个中心仓库,是所有分站仓库的父节点。
当配送中心发起进货请求时,会产生缺货单;执行中心仓库购货入库操作,录入购货信息,并可更改货物的实际到货数量;执行完入库操作后,原本为缺货状态的订单变为可分配状态,这时调度中心发起货物调度请求,中心仓库执行调拨出库操作将货物调拨到相应的投递分站仓库,其详细流程图如下4.4所示。

在这里插入图片描述

图4.4 货物调度流程图

4.5 配送中心
配送中心主要实现与商品货物相关的功能,包括供应商管理、商品管理、仓库管理、进货管理、业务统计查询。
(1)供应商管理、商品管理、仓库管理的详细功能均为增、删、改、查操作,且业务统计查询的功能为商品订购排行查询和客户满意度查询两个查询操作,所以为避免赘述,在这里只介绍商品管理这个子模块的相关功能及其操作,其时序图如下图4.5所示。
在这里插入图片描述

图4.5 商品管理时序图

管理员点击菜单进入商品管理页面,进入该页面时会向后台程序发起查询全部商品的请求,然后前端页面获取返回结果并进行加载显示;当管理员发起添加商品请求时,即点击添加商品按钮,跳转到添加商品页面,进入该页面后,填写要添加的商品信息,当进行商品分类、供应商信息的添加时,需要获取数据库中的商品分类和供应商信息;完成商品信息的录入后,点击保存按钮,发送请求给后台程序,完成添加操作,并返回结果。
(2)进货管理是对库存量不足的商品发起进货请求,其时序图如下图4.6所示。

在这里插入图片描述

图4.6 进货管理时序图

4.6 分站管理
分站管理的主要功能为调配配送员及回执单的录入,其具体流程如下图4.7所示。
在这里插入图片描述

图4.7 任务配送泳道图
4.7 数据库设计
4.7.1 设计原则
数据库设计是进行软件详细设计的重要环节,一个好的数据库设计可以避免很多隐患,如输出错误数据、系统性能差、后期维护繁杂等。如果发生了问题后再进行数据库的修改或者优化,就相当于推翻了之前所有的设计。由此可以看出,数据库就如同一个建筑的地基,若没有一个坚实的地基,就算是再豪华牢固的“建筑”也会变得岌岌可危,甚至转瞬间就会倾塌。
为了能够设计出关系合理良好、性能较高的数据库,在进行数据库设时遵循了以下基本原则:
(1)数据完整性
数据完整性主要体现在以下四个方面
①实体完整性:表的字段是唯一的、不重复的;
②参照完整性:表的外键数据应该与其参照的其他表的主键的数据保持一致;
③域完整性:表的字段应该具有某种约束条件,如规定长度、精度等;
④用户自定义完整性:表或表的某一个字段需要满足其具体的场景要求,如在本设计中定义的CUSTOMER表的ZIPCODE(邮政编码)字段必须满足全部为数字的要求。
(2)数据一致性
数据一致性是指当数据库完成了某一个事务后,该事务涉及到的数据应该保持一致,如在本设计中将货物从中心仓库调拨到分站仓库,在数据库执行完这一事务后,应保持中心仓库的货物数量的减少量是分站仓库货物数量的增加量,保证其数据的一致性。
(3)数据命名规范性
命名规范包括表明名规范、表字段命名规范、主键和外键命名规范。规范的命名可以方便理解,有利于程序开发和后期维护。
4.7.2 关系设计
在进行关系设计时,使用了PowerDesigner工具。如图4.8所示,展示了本系统的数据库表的关系。

在这里插入图片描述

图4.8 实体关系示意图

在本系统的详细设计阶段,就确定了通过菜单栏的管理来实现权限管理,为了达到这个目的,在数据库设计时采用了一个中间表(ROLE角色表)来实现这一功能。在ROLE表中定义用户组,FUNCTION表中定义了用户组的可操作功能菜单。故用户的权限管理通过访问其所属的用户组的权限来实现,如下图4.9所示。

在这里插入图片描述

图4.9 用户管理权限E-R图

4.7.3 基本表的设计
参照以上设计原则及E-R图进行了本系统的数据库表设计,如下表4.1至4.21所示。

表4.1 ROLE角色表
字段名称 数据类型 是否可为空 说明
ROLEID INT(10) 否 主键
ROLENAME VARCHAR(20) 否 角色名称

表4.2 USER用户表
字段名称 数据类型 是否可为空 说明
USERID INT(10) 否 主键
ROLEID INT(10) 否 外键,参照ROLE表的ROLEID字段
USERNAME VARCHAR(20) 否 用户姓名
PASSWORD VARCHAR(20) 否 登陆密码

表4.3 FUNCTION功能菜单表
字段名称 数据类型 是否可为空 说明
FUNCTIONID INT(10) 否 主键
ROLEID INT(10) 否 外键,参照ROLE表的ROLEID字段
PARENT INT(10) 否 父功能菜单ID,作为外键,参照本表的FUNCTIONID字段
FUNCTIONNAME VARCHAR(20) 否 功能菜单名称
ISLEAF VARCHAR(20) 否 是否为叶子节点(1为是,0为否)
ICONCLS VARCHAR(20) 是 功能菜单图标样式名称

表4.4 CUSTOMER客户表
字段名称 数据类型 是否可为空 说明
CUSTOMERID INT(10) 否 主键
CUSTOMERNAME VARCHAR(20) 否 客户姓名
IDCARD VARCHAR(20) 否 身份证号
PHONE VARCHAR(20) 否 电话号码
ADDRESS VARCHAR(40) 否 地址
ZIPCODE VARCHAR(20) 否 邮编

表4.5 SUPPLIER供应商表
字段名称 数据类型 是否可为空 说明
SUPPLIERID INT(10) 否 主键
SUPPLIERNAME VARCHAR(20) 否 供应商姓名
ADDRESS VARCHAR(40) 否 供应商地址
PHONE VARCHAR(20) 否 电话号码

表4.6 CATEGORY商品类别表
字段名称 数据类型 是否可为空 说明
CATEGORYID INT(10) 否 主键

续表4.6 CATEGORY商品类别表
字段名称 数据类型 是否可为空 说明
PARENT INT(10) 是 商品类别父节点ID,作为外键,参照本表的CATEGORYID字段
CATEGORYNAME VARCHAR(20) 否 商品类别名称

表4.7 PRODUCT商品表
字段名称 数据类型 是否可为空 说明
PRODUCTID INT(10) 否 主键
PRODUCTNAME VARCHAR(20) 否 商品名称
CATEGORYID INT(10) 否 商品类别ID,作为外键,参照CATEGORY表的CATEGORYID字段
SUPPLIERID INT(10) 否 供应商ID,作为外键,参照SUPPLIER表的SUPPLIERID字段
ORIGINALPRICE FLOAT 否 原价

表4.8 WAREHOUSE仓库表
字段名称 数据类型 是否可为空 说明
WAREHOUSEID INT(10) 否 主键
WAREHOUSENAME VARCHAR(20) 否 仓库名称
WAREMANAGER INT(10) 否 仓库管理员ID,作为外键,参照USER表的USERID字段
TYPE VARCHAR(20) 否 仓库类型(中心仓库或分站仓库)

表4.9 SUBSTATION分站表
字段名称 数据类型 是否可为空 说明
SUBSTATIONID INT(10) 否 主键
WAREHOUSEID INT(10) 否 仓库ID,作为外键,参照WAREHOUSE表的WAREHOUSEID字段
SUBSTATIONMANAGER INT(10) 否 分站管理员ID,参照USER表的USERID字段
ADDRESS VARCHAR(40) 否 地址

表4.10 STORAGEINFO库存信息表
字段名称 数据类型 是否可为空 说明
STORAGEINFOID INT(10) 否 主键

续表4.10 STORAGEINFO库存信息表
字段名称 数据类型 是否可为空 说明
PRODUCTID INT(10) 否 商品ID,作为外键,参照PRODUCT表的PRODUCTID字段
WAREHOUSEID INT(10) 否 仓库ID,作为外键,参照WAREHOUSE表的WAREHOUSEID字段
REMAINQUANTITY INT(10) 否 现有库存量

表4.11 ORDER订单表
字段名称 数据类型 是否可为空 说明
ORDERID INT(10) 否 主键
CUSTOMERID INT(10) 否 客户ID,作为外键,参照CUSTOMER表的CUSTOMERID字段
ORDERSTATE VARCHAR(20) 否 订单状态
OPERATOR INT(10) 否 操作员ID,作为外键,参照USER表的USERID字段
DELIVERSUBSTATION INT(10) 否 配送分站ID,作为外键,参照SUBSTATION的SUBSTATIONID字段
ORDERTYPE VARCHAR(20) 否 订单类型
RECEIVEPERSON VARCHAR(20) 否 收货人
RECEIVEADDRESS VARCHAR(40) 否 收货地址
RECEIVEPERSONPHONE VARCHAR(20) 否 收货人电话号码

表4.12 ORDERITEM订单商品条目表
字段名称 数据类型 是否可为空 说明
ORDERITEM INT(10) 否 主键
PRODUCTID INT(10) 否 商品ID,作为外键,参照PRODUCT表的PRODUCTID字段
ORDERID INT(10) 否 订单ID,作为外键,参照ORDER表的ORDERID字段
AMOUNT FLOAT 否 数量

表4.13 SHORTAGEORDER缺货单表
字段名称 数据类型 是否可为空 说明
SHORAGEORDERID INT(10) 否 主键
PRODUCTID INT(10) 否 商品ID,外键

续表4.13 SHORTAGEORDER缺货单表
字段名称 数据类型 是否可为空 说明
SHORAGEORDERID INT(10) 否 主键
PRODUCTID INT(10) 否 商品ID,外键

表4.14 PURCHASEINSTORAGEORDER购货入库表
字段名称 数据类型 是否可为空 说明
PURCHASEINSTORAGEORDERID INT(10) 否 主键
PRODUCTPEUCHASESTATE VARCHAR(20) 否 购货入库单状态(完全到货、未到货)
WAREHOUSEID INT(10) 否 仓库ID,作为外键,参照WAREHOUSE表的WAREHOUSEID字段

表4.15 PURCHASEINSTORAGEORDERITEM购货入库商品条目表
字段名称 数据类型 是否可为空 说明
PURCHASEINSTORAGEORDERITEMID INT(10) 否 主键
PRODUCTID INT(10) 否 商品ID,作为外键,参照PRODUCT表的PRODUCTID字段
PURCHASEINSTORAGEORDERID INT(10) 否 购货入库单ID,外键
QUANTITY FLOAT 否 数量

表4.16 OUTSTORAGEORDER调拨出库表
字段名称 数据类型 是否可为空 说明
OUTSTORAGEORDERID INT(10) 否 主键
WAREHOUSEID INT(10) 否 仓库ID,作为外键,参照WAREHOUSE表的WAREHOUSEID字段
OUTSTORAGEDATE DATETIME 否 出库日期
REMARK VARCHAR(40) 是 备注

表4.17 OUTSTORAGEORDERITEM调拨出库商品条目表
字段名称 数据类型 是否可为空 说明
OUTSTORAGEORDERITEMID INT(10) 否 主键
PRODUCTID INT(10) 否 商品ID,外键
续表4.17 OUTSTORAGEORDERITEM调拨出库商品条目表
字段名称 数据类型 是否可为空 说明
OUTSTORAGEORDERID INT(10) 否 调拨出库单ID,外键
QUANTITY FLOAT 否 数量

表4.18 DISPATCHORDER分发单表
字段名称 数据类型 是否可为空 说明
DISPATCHORDERID INT(10) 否 主键
WAREHOUSEID INT(10) 否 仓库ID,外键
OPERATOR INT(10) 否 操作人员ID,外键
OUTSTORAGEORDERID INT(10) 否 调拨出库单ID,外键

表4.19 DISPATCHORDERITEM分发单商品条目表
字段名称 数据类型 是否可为空 说明
DISPATCHORDERITEMID INT(10) 否 主键
DISPATCHORDERID INT(10) 否 分发单ID,外键
PRODUCTID INT(10) 否 商品ID,外键
PRODUCTQUANTITY INT(10) 否 商品数量

表4.20 TASKORDER配送任务表
字段名称 数据类型 是否可为空 说明
TASKORDERID INT(10) 否 主键
ORDERID INT(10) 否 订单ID,外键
DELIVERMAN INT(10) 否 配送员ID,外键
OPERATOR INT(10) 否 操作人员ID,外键
TASKORDERSTATE DATETIME 否 任务单状态

表4.21 FEEDBACKORDER回执录入表
字段名称 数据类型 是否可为空 说明
FEEDBACKORDERID INT(10) 否 主键
TASKSTATE VARCHAR(20) 否 任务状态(完成或失败)
STATISFACTION VARCHAR(40) 是 客户满意度
TASKORDERID INT(10) 否 配送任务单ID,作为外键,参照TASKORDER表的TASKORDERID字段

5 功能实现

本章将详细介绍本系统的实现过程。由于本系统涉及大量的增删改查操作,为避免赘述,故只会在第二节客户服务中心的实现描述中对增删改查进行详细的介绍。
5.1 登陆及权限管理的实现
(1)登陆
该系统是为管理员处理业务流程而设计的,故进入该系统需要登录,若不登陆,则无法浏览业务处理流程并进行处理。其登陆界面如下图5.1所示。

在这里插入图片描述

图5.1 登陆界面

用户填写登录信息,点击登陆按钮时,会发送URL请求“/login.do?actionType=doLogin”。struts-config.xml和ApplicationContext-actions.xml配置文件设置了监听该请求的Action类,如下面代码所示,com.logistics.action.LoginAction类会截获所有格式为“/login”的URL请求。LoginAction类截获该请求后,执行其doLogin方法。






进入LoginAction.doLogin方法后,通过request.getParameter()获取前端传递过来的登陆参数(账号为name,密码为pass);然后调用业务逻辑层,最后调用userDAO在数据库中查询该登陆用户,并返回该用户在数据库中USER表的信息。
User user=queryUserService.findUserByNameAndPassword(Integer.parseInt(name), pass);
若该用户不存在,则user为空,登陆失败;若该用户存在,则user不为空,登陆成功,并跳转到首页(index.jsp)。
(2)权限管理
进入首页(index.jsp)时加载执行js脚本,发送URL请求“*/dynamicTree.do?actionType=doTree”。通过设置配置文件,由DynamicTreeAction类截获该请求,并执行doTree()方法。在该方法中通过request.getParameter()获取user实体(在登陆时就已经取得了当前的user实体类),并判断user是否为空。若为空,则说明当前无用户登录,通过response.sendRedirect(“http://localhost:8080/logistics/login.jsp”)重定向到login.jsp页面;若不为空,则用户已登录,获取用户的权限组即roleid的值,通过DynamicTreeService类调用DAO查询数据库中FUNCTION表,并返回该权限下的菜单列表。
① 当登陆用户为全站管理员(roleid=0),即可执行所有的操作时,执行以下代码。其中parentID为根节点的FUNCTIONID。
List results = (List) functionDAO.findByParent(functionDAO.findById(parentID));
② 当登陆用户不是全站管理员时,就需要根据该用户的roleid获取菜单列表,代码如下。其中parentID的值可以通过约束FUNCTION表中的ISLEAF(是否为叶子节点)字段的值来获得。
List results = functionDAO.findByParentidRoleid(parentID, roleId);
获得菜单列表后,通过调用一个生成动态树的封装方法将results转化为需要的格式。前端获得菜单数据后通过Ext.tree.TreePanel()设置菜单树并设置每个节点的click事件。如下图所示,为物流配送管理系统的首页,菜单栏位于首页的左侧。
在这里插入图片描述

图5.2 系统首页
5.2 客户服务中心
客户服务中心含有两个子菜单:客户管理和订单信息查询。
(1)客户管理
当管理员点击客户管理菜单时,进入菜单管理界面,如下图5.3所示。

在这里插入图片描述

图5.3 客户管理页面

点击客户管理菜单时,发送“*/customerInfo.do?actionType=doSearch”URL请求,通过配置文件将该请求映射到CustomerInfoAction类,执行doSearch()方法查找所有的客户信息并返回给前端。
在该页面,可以进行查询客户、添加客户、删除客户及新建订单的操作。
① 查询客户
填写所要查询的客户姓名、联系方式或身份证等信息,点击查询按钮,可对客户进行模糊查询。执行该操作也是调用CustomerInfoAction类的doSearch()方法,只是URL请求中包含了客户的姓名、联系方式、身份证号等数据,在进行数据库查询时根据所传递事务参数数据进行模糊查询,并返回查询结果给前端页面。若不输入查询条件进行查询,则是查询全部客户。如下图所示,在客户姓名一栏输入“测试”所查询到的客户信息。
在这里插入图片描述

图5.4 模糊查询客户

② 添加客户
点击添加客户按钮,进入添加客户页面,如下图所示。

在这里插入图片描述

图5.5 添加客户页面

在该页面填写要添加的客户信息,其中红色字体表示必填内容。JavaScript脚本会对填写的信息进行数据验证,如格式、是否为空等。如上图所示为邮箱格式不符合要求。
点击保存,发送URL请求“*/customerInfo.do?actionType=addCustomer”,调用CustomerInfo.addCustomer()方法实现数据的添加操作,然后前端获得返回结果后重新加载客户信息列表,达到刷新的效果。如下图所示为添加客户成功,红框中的客户为新添加的客户。

在这里插入图片描述

图5.6 成功添加客户

③ 删除客户
在进行删除客户时,需要选中所要删除的客户,若不选中客户,则会弹出提示信息来提示管理员选择要删除的客户。若删除的客户有过订单历史,则会提示“有订单”而无法进行删除。如下图所示。
在这里插入图片描述

图5.7 删除客户出现问题的两种情景

若没有选中客户而进行删除操作,该情景的处理过程是由JavaScript脚本实现的,只需要判断是否选中行即可,无需调用后台程序,其代码实现如下所示。
var row = Ext.getCmp(“CustomerManageGrid”).getSelectionModel().getSelections();
if (row.length == 0) { Ext.Msg.alert(“提示”, “请选择要删除的客户。”); }
若选中有订单的客户进行删除操作,则会发送“*/customerInfo.do?actionType=delCustomer&customerid=选中客户id”请求,调用CustomerInfo.delCustomer()方法,该方法会获取请求中customerid的参数,通过该参数在数据库ORDER订单表中查询订单记录,若记录的数量不为0,则弹出提示信息。如下代码为客户id为customerid的订单记录数。
customerInfoService.findOrderByCustomer(customerId).size();
⑤ 添加订单
进行添加订单操作时同样需要选中提出订单请求的客户。当选中客户后,进入添加订单页面选择要购买的商品,如下图5.8所示。
在这里插入图片描述

图5.8 添加订单页面
进入该页面时,发送请求“orderProductInfo.do?actionType=doSearch”,查询商品信息列表并进行加载。在添加订单页面,可以根据商品分类查询商品,同时实现了根据一级分类联级查询二级分类。然后选中要购买的商品,并在该商品的“详细信息”栏中填写购买数量,点击确定后该商品就添加到“客户购买的商品”栏中。一个订单可购买多种商品,重复添加商品即可。添加完要购买的商品,选择生成日期及要求完成的日期,此处投递分站为选填项,若不选择投递分站,可由调度中心进行处理,最后点击生成订单,发送addOrder请求到OrderProductInfoAction类,完成添加订单的操作,并返回添加结果给前端显示,其流程如下图所示。

在这里插入图片描述

图5.9 添加订单流程图

(2)订单信息查询
管理员点击订单信息查询按钮进入订单信息查询页面,该页面加载时会发送“orderInfo.do?actionType=findOrderInfo”请求调用OrderInfoAction类的findOrderInfo方法查询全部的订单信息,并返回结果给前端进行显示,如下图所示为订单信息查询页面。

在这里插入图片描述

图5.10 订单信息查询页面
在订单信息查询页面可以通过条件查询订单,也可以选择订单查看其详细的商品信息。如下图所示为查看订单号为22的订单的详细订购商品信息。

在这里插入图片描述

图5.11 订单详细信息页面

5.3 调度中心
调度中心主要实现对满足商品要求的订单进行调度生成配送任务单和货物调拨单,分为订单状态修改、调度、任务单查询三个子功能模块。
(1)订单状态修改
在客服生成订单时会查询商品的库存信息,若订购的商品小于库存量,则订单状态为缺货;当对该商品进货并完成入库操作后,进行本操作,将订单的“缺货”状态修改为“可分配”。其页面如下图5.12所示。
在这里插入图片描述

图5.12 修改订单状态页面
双击订单的订单状态栏,可将缺货状态修改为可分配,这时发送doUpdate请求到OrderProductInfoAction类,执行doUpdate()方法更新订单状态。
(2)调度
调度主要实现了分配订单到投递分站和调度订单生成配送任务单和货物调拨单的功能,其页面如下图所示。
在这里插入图片描述

图5.13 调度页面及分配投递分站图

可点击调度页面右上角的调度按钮对状态为“可分配”及已分配投递分站的订单进行调度,生成配送任务单及货物调拨单。该操作由AllocationAction类监听,并由其saveAllocationOrder()方法调用业务逻辑层AllocationServiceImpl.saveAllocationOrder()方法实现将订单状态更新为“已调度”及添加配送任务数据、货物调拨数据到相应的数据库。
(3)任务单查询
实现对调度生成的配送任务单进行查询,其页面如下。
在这里插入图片描述

图5.14 任务单查询页面

5.4 中心仓库管理
中心仓库管理实现了两个功能,分别为购货入库和调拨出库。
(1)中心仓库购货入库
当配送中心生成进货单并完成购货任务时,由中心库房执行货物入库处理,将缺货商品存入仓库中,其页面如下图所示。
在这里插入图片描述

图5.15 中心仓库购货入库页面
点击入库按钮执行入库操作,在填写购货单信息页面录入购货信息,如下图所示,点击保存按钮即可实现货物入库操作,其页面如下所示。
在这里插入图片描述

图5.16 填写购货单信息页面

(2)中心仓库调拨出库
货物入库后,调度中心将相应的缺货订单的订单状态修改为可分配并选择相应的投递分站完成调度,然后由中心仓库将订单中的商品调拨出库到投递分站,完成货物由仓库到投递点的流程。在调拨出库页面也可以查询相应的订单详情等,其页面如下图所示。
在这里插入图片描述

图5.17 中心仓库调拨出库页面

点击调拨出库按钮,发送“AllocationOrderStore.do?actionType=saveAllocation”请求,通过AllocationOrderStoreAction的saveAllocation()方法调用OutStorageServiceImpl. saveAllocation()方法,进行业务逻辑的处理,并将出库数据通过OutStorageOrderDAO.save()方法添加到数据库的OutStorageOrder(出库单)表和OutStorageOrderItem(出库单条目)表中。
5.5 配送中心
配送中心主要实现商品、供应商、仓库的添加删除,对缺货商品进行进货处理,以及客户满意度、订购排行查询等,下面将介绍其具体实现的功能。
(1)商品管理
该功能实现了商品分类以及商品的添加、修改、删除等操作,商品分类分为两级,一级分类是二级分类的父节点,添加二级分类必须选择其所属的一级分类,如下图所示为添加商品一级、二级分类的页面。

在这里插入图片描述

图5.18 添加商品一级、二级分类页面

在商品管理页面点击添加商品按钮进入添加商品页面,在该页面填写要添加的商品的信息,并且需要选择其所属的商品分类,在该页面实现了商品二级分类根据一级分类的级联查询,如下图所示,点击保存按钮发送请求“productInfo.do?actionType=add”,由ProductInfoAction类截获该请求,并进入add()方法进行添加商品的处理。

在这里插入图片描述

图5.19 添加商品页面
(2)仓库管理
仓库管理实现了仓库添加、删除,库存量修改、查询以及仓库出入单查询的功能。
如下图5.20所示为仓库设置页面,使用了Ext.grid.GroupingView()实现按照仓库管理员对仓库进行分组显示,在该页面可以实现添加仓库和删除仓库的操作。

在这里插入图片描述

图5.20 仓库设置页面

当新添加一个仓库时,需选择仓库管理员及仓库类型,该仓库的储备信息是默认值,可在仓库储备设置页面进行修改,如图5.21所示。
在这里插入图片描述

图5.21 仓库储备设置页面

出入单查询顾名思义,实现了对仓库入库出库操作的查询,其页面如下所示。

在这里插入图片描述

图5.22 出入单查询页面

(3)供应商管理
供应商管理实现了商品供应商的添加删除等操作,其页面如下所示。

在这里插入图片描述

图5.23 供应商管理页面

(4)进货管理
当订购的货物数量大于库存量时,订单状态为缺货,这时需要进行进货处理,对库存量不足的商品进货,其页面如下所示。

在这里插入图片描述

图5.24 进货管理页面

进入该页面时需要获取缺货商品的信息,发送“purchaseProduct.do?actionType=doSearch”请求,PurchaseProductAction类截获该请求,并进入其doSearch()方法,该方法会调用业务逻辑层PurchaseProductService.getShortProductTotal()方法进行相关业务逻辑的处理;首先通过订单状态定位缺货订单,然后根据缺货订单的ORDERID到ORDERITEM表(订单商品条目表)中获取订购的缺货商品数量;然后再查询该商品在仓库中的存量信息,这样就获得了库存量不足的商品信息,然后将该信息生成为进货单。
(5)业务统计查询
①订购排行榜分析
实现了对一定时间内的商品订购数量的统计,有助于管理员进行分析。
在这里插入图片描述

图5.25 订购排行榜分析页面

②客户满意度分析
配送员完成配送时的回执单记录客户的满意度(满分为5),该功能为统计客户对配送服务的满意度,其页面如下所示。

在这里插入图片描述

图5.26 客户满意度分析页面

5.6 分站管理
该模块实现将仓库调拨到的商品货物配送给客户的流程。
(1)调拨入库
实现了对从中心仓库调拨出的货物进行入库到分站仓库的操作,其页面如下所示。
在这里插入图片描述

图5.27 分站仓库调拨入库操作
选择相应的分发单,点击“确定入库”按钮进行入库时,会发送“substationInto.do?actionType=doSubstationInto”请求,由SubStationInfoAction类截获该请求并执行doSubstationInto()方法,保存相关信息到数据库。
(2)任务分配
将配送任务单分配给配送员,只有任务状态为“可分配”的配送任务单才可进行分配,其页面如下所示。

在这里插入图片描述

图5.28 任务分配页面

(3)领货
实现了配送员根据配送任务单领取相关商品货物的操作,其页面如下图所示
在这里插入图片描述

图5.29 领货页面

选中任务单,点击领取货物按钮,录入领取人信息即可完成领货操作,并会更新配送任务单的状态为“已领货”。
(4)回执录入
管理员按照配送任务单进行回执录入,只有状态为已领货的配送任务单才可进行领货,此时“已领货”意味着配送员已将货物送达至客户完成了配送任务。选中任务单,点击回执录入按钮,进入“添加回执信息”页面,录入相关信息,点击保存,则会根据回执中的完成状态更新相关订单状态,完成配送的整个流程,其回执录入及添加回执信息的页面如下图所示。
在这里插入图片描述

图5.30 回执录入及添加回执信息页面

6 系统测试

测试是软件开发过程中的重要一环,通过测试,可以说明系统的功能是否满足需求,性能是否达到要求等等。本章将通过测试用例来测试从创建订单到订单交付给客户的整个流程,说明本系统的可用性。

表6.1 测试用例
测试用例 测试模块 测试用例目的 测试步骤 测试结果 结论
测试用例一 登陆 非法账号密码无法登陆 输入错误的账号或错误的密码 提示账号或密码错误,无法登陆 功能正常
测试用例二 登陆 正常账号能够正常登录 输入正确的账号及密码 登陆成功 功能正常
测试用例三 客户服务中心 添加订单需要选择客户 不选择客户执行添加订单操作 提示“请选择客户”信息 功能正常
测试用例四 客户服务中心 删除客户需要选择客户 不选择客户执行删除客户操作 提示“请选择客户”信息 功能正常
测试用例五 客户服务中心 添加订单时能否正确设置订单状态 添加订单选择购买的商品的数量大于库存量 成功添加订单,且订单状态为“缺货”,缺货商品的数量为库存量与订购量的差值 功能正常
测试用例六 客户服务中心 添加订单时能否正确设置订单状态 添加订单选择购买的商品的数量小于或等于库存量 成功添加订单,且订单状态为“可分配” 功能正常
测试用例七 配送中心 能否对缺货商品进行进货处理 选中缺货商品,点击生成进货单按钮 正确生成进货单和购货入库单 功能正常
测试用例八 调度中心 能否修改已进货的缺货订单状态 选择缺货订单修改其状态为“可分配” 提示保存成功 功能正常
测试用例九 调度中心 能否对“可分配”状态的订单进行调度 选择状态为“可分配”状态的订单进行调度操作 正确生成配送单和货物调拨单 功能正常
测试用例十 中心仓库管理 测试入库功能是否正常 点击入库按扭,填写入库单信息,保存 提示入库成功,中心仓库中该类商品数增加了入库数,且在配送中心的出入单查询中查到入库信息 功能正常

续表6.1 测试用例
测试用例 测试模块 测试用例目的 测试步骤 测试结果 结论
测试用例十一 中心仓库管理 测试能否更改商品实际入库数量 选择相应入库单,双击其实际入库数,进行修改 提示修改成功,且仓库中该类商品数变更正确 功能正常
测试用例十二 中心仓库管理 测试出库功能是否正常 选择未调拨的调拨单进行调拨出库操作 提示调拨成功,且在相应分站收到分发单 功能正常
测试用例十三 中心仓库管理 测试出库功能是否正常 选择已调拨的调拨单进行调拨出库操作 提示“已调拨,无法再次进行调拨” 功能正常
测试用例十四 分站管理 测试入库功能是否正常 选择未入库分发单,点击确定入库按钮 提示入库成功,且仓库中相应商品数量增加了入库数 功能正常
测试用例十五 分站管理 测试领货功能 选择任务单,点击领货按钮,输入数据库中不存在的配送员id 提示失败信息 功能正常
测试用例十六 分站管理 测试领货功能 选择任务单,点击领货按钮,输入该任务单的配送员id 提示成功信息 功能正常
测试用例十七 分站管理 测试回执录入功能 选择状态为“已完成”的任务单,点击回执录入 提示“只能对已领货状态的任务单进行回执录入”信息 功能正常
测试用例十八 分站管理 测试回执录入功能 选择状态为“已领货”的任务单,点击回执录入,录入绘制信息,点击保存 提示成功信息,且任务单和订单状态更新为“已完成” 功能正常

结 论

本文主要对物流配送管理系统进行了详细的需求分析,介绍了使用到的技术、集成框架及开发工具,业务功能模块的设计实现和系统开发框架的设计搭建过程。描述了系统的界面设计,权限管理,客户服务中心、调度中心、仓库管理、配送中心和分站管理五个功能模块及其数据库的详细设计。最后进行了系统测试,确保了该系统的切实可行性。
其主要完成的工作为:
(1)对本设计使用到的架构、框架及相关开发工具进行了介绍,并将其与当前流行的其他架构、框架做了简单的对比,分析了它们的优势;
(2)对本系统进行了详尽的系统分析,阐明了本系统的要做什么。在需求分析阶段使用用例图对各功能模块进行了分析,明确系统功能,有利于后期的系统设计。
(3)在进行总体设计时,首先对使用的ExtJS和SSH进行了集成说明,并描述了系统的功能框架以及各模块的功能划分,最后设计搭建了集成框架。该集成框架实现了系统的分层,且层次明确,结构的耦合性低,便于功能拓展与维护。
(4)在详细设计阶段分别通过时序图或流程图介绍了系统的界面设计及权限管理的设计、五个功能模块的设计,并参照数据库的设计原则设计了表及其之间的关系;
(5)参照设计文档,最后对系统进行了编码实现与测试。其实现的功能基本符合设计要求,并能够完成完整的订单处理流程,包括从创建订单到完成配送。
虽然本系统已经实现基本功能,但由于开发设计的时间较短,所以其功能不够全面,还有一些需要改进的缺陷和需要添加的功能,如:
(1)系统中存在许多订单调度处理,没有实现对满足要求的订单进行自动调度,不够智能;
(2)系统设计了很多表单,但没有提供相关表单生成报表的功能,不方便管理员进行业务分析,而且客户、商品等信息的添加需要手动录入,没有实现上传表单进行识别的功能;
(3)只设计了订单配送的相关功能,而没有提供退货、换货等功能,系统功能不够完善。
在今后的学习和工作中,本人将继续完善优化该系统的功能,希望将其打造成能够投入正式的企业运营中的能够创造经济效益的软件项目。

参 考 文 献

[1] 樊银亭,何鸿云.基于客户机/服务器体系的二层与三层结构研究[J].计算机应用研究,2001, 18(12):23-24.
[2] 孙卫琴.精通STRUTS–基于MVC的JAVA WEB设计与开发[M].电子工业出版社,2005.
[3] 计文柯.Spring技术内幕:深入解析Spring架构与设计原理[M].机械工业出版社,2010.
[4] 徐会生.深入浅出Ext JS[M].人民邮电出版社,2009.
[5] 陆荣幸,郁洲,阮永良,王志强.J2EE平台上MVC设计模式的研究与实现[J].计算机应用研究, 2003,20(3):91-93.
[6] 朱彬,王安保,王娜.用Struts框架建立JavaWeb应用程序[J].计算机辅助工程,2005, 14(2):45-49.
[7] 李天鸣,何月顺.基于ExtJS技术与SSH框架的权限管理研究[J].计算机应用与软件,2011, 28(5):165-167.
[8] 温立辉.SSH框架在软件工程J2EE三层架构体系中的应用[J].科技资讯,2009(31):79-79.
[9] 刘志强.物流配送系统设计[M].清华大学出版社,2004.
[10] 邹欣.构建之法[M].人民邮电出版社,2014.
[11] 谢星星.UML基础与Rose建模实用教程[M].清华大学出版社,2011.
[12] (美)梅耶(Myers,G.J.).软件测试的艺术[M].机械工业出版社, 2012.
[13] Koskela L.Koskela:Test Driven TDD and Acceptance TDD for Java Developers[J]. Pearson Schweiz Ag,2007.
[14] 边清刚,潘东华.Tomcat和Apache集成支持JSP技术探讨[J].计算机应用研究,2003, 20(6):12-14.
[15] 王珊,萨师煊.数据库系统概论(第5版)[J].中国大学教学,2014(9).

致 谢

论文写到这里已经即将结束了,也意味着人生中最美好的四年大学时光已经迈入尾声,回想度过的大学生涯,心中感触颇多。
首先要感谢的人,毫无疑问就是我的指导老师,正是因为老师孜孜不倦的指导和一丝不苟的态度,我才能在规定的时间内保质保量的实现项目的功能并完成论文的撰写,老师谢谢你。还要感谢的自然是父母,是你们培养了我,让我走进了高等教育的殿堂,不仅如此,你们的以身作则培养了我正确的价值观,让我知道付出才有回报,努力才有收获。最后还要感谢的就是我的同学们,大学四年有你们的陪伴才是完整的、丰富的、多彩的,一起的嬉笑怒骂,一起的考前抱佛脚,会是我一生当中最宝贵的回忆,有了你们青春无悔。可能还有一个人需要感谢,那就是我自己吧,在人生这一阶段中,努力过,所以时间没有被浪费,疯狂过,所以青春没有被浪费,大学四年,活的充实,值得感谢。
还有太多太多的人在方方面面给予我帮助,由于篇幅有限,不能在此一一列出表示感谢实在是遗憾,但是不管怎样,一句谢谢你,献给所以帮助过我的人。
大学生活即将画上圆满的句号,是结束也是开始,我依然会把“学无止境,青春永驻”萦绕心头,继续坚实的走下去。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/454106.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT提问技巧:受控生成提示

ChatGPT提问技巧&#xff1a;受控生成提示 受控生成提示是一种可以高度控制输出结果的文本生成技术。 具体做法是为模型提供一组特定的输入&#xff0c;如模板、特定词汇或一组约束&#xff0c;用于指导生成过程。 通过为模型提供一组可用于指导生成过程的特定输入&#xff…

Linux 动态库和静态库 【详解】

动静态库的基本原理 静态库&#xff08;.a&#xff09;&#xff1a;程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库动态库&#xff08;.so&#xff09;&#xff1a;程序在运行的时候才去链接动态库的代码&#xff0c;多个程序共享使用库的…

解决ipconfig不是内部或外部命令,也不是可运行的程序或批处理文件

问题所示&#xff1a;ipconfig不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 解决办法如下: 1.右击此电脑&#xff0c;点击属性设置&#xff1a; 2.点击高级系统设置 3.点击进入环境变量 4.在系统变量中进行设置&#xff0c;双击PATH进行配置 5.点击新建&am…

yum安装mysql、数据库tab自动补全,快来浅了解下 ?

centos7上面没有mysql&#xff0c;它的数据库名字叫做mariadb [rootlocalhost ~]#yum install mariadb-server -y [rootlocalhost ~]#systemctl start mariadb.service [rootlocalhost ~]#systemctl stop firewalld [rootlocalhost ~]#setenforce 0 [rootlocalhost ~]#ss -na…

Kotlin:泛型

点击查看泛型中文文档 点击查看泛型英文文档 简介 与 Java 类似&#xff0c;Kotlin 中的类也可以有类型参数&#xff1a; class Box<T>(t: T) {var value t }一般来说&#xff0c;要创建这样类的实例&#xff0c;我们需要提供类型参数&#xff1a; val box: Box<…

SpringBoot项目中出现不同端口跨域问题,如何解决?

方法一&#xff1a;比较繁琐&#xff0c;适合少量Controller控制器类 方法二 &#xff1a;需要写一个全局的配置文件即可 在如图所示的common目录下新建一个CorsConfig的class文件 具体代码展示&#xff1a; import org.springframework.context.annotation.Bean; import o…

淘宝客必看:微信公众号如何快速接入抖音本地团购并提高CPS收益

抖音已经成为社交媒体新的流量高地&#xff0c;抖音团购完全复刻了美团的模式&#xff0c;外卖、到店、吃喝玩乐全覆盖。很多淘宝客一直在寻找通过微信公众号实现营销变现的有效途径&#xff1f;是否对于如何将抖音团购转变为自己的佣金收入感到困惑&#xff1f;微信公众号接入…

Eslint + Prettier 配置

setting.json {"eslint.autoFixOnSave": true, // 保存文件时自动修复可修复的问题"eslint.validate": [// 定义哪些文件类型应该由 ESLint 验证"javascript","javascriptreact","vue" // 如果你正在使用 Vue&#xff0c;确…

基于单片机的GPS定位信息显示系统

基于单片机的GPS定位信息显示系统 摘 要 在当今信息时代的发展中&#xff0c;GPS全球定位系统是一个重要的组成部分&#xff0c;其具有精度很高、应用广泛、性能强大的特点&#xff0c;因此在实际生活中GPS全球定位显示系统被广泛运用于各类领域当中。它也是至今为止最好的定…

HarmonyOS 发送系统通知 基础通知

harmonyos中 提供了 各种不同功能的通知 来满足我们不同的业务需求 本文呢 我们先来看 最基本的通知 它的场景和使用方式 最基本的 是 当应用被切入后台 而应用内部发生了一些变化 就可以用通知的方式 来提醒用户 就比如 我们微信 被切到了后台 而这时 别人发消息过来了 那么…

2014

1,写出计算Ack(m,n)的递归算法 #include<iostream> using namespace std; int A(int m,int n){if(m0){return n1;}else if(m>0&&n0){return A(m-1,1);}else{return A(m-1,A(m,n-1));} }int main(){int m,n;cout<<"please input two number"&l…

【深度学习笔记】7_7 AdaDelta算法

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 7.7 AdaDelta算法 除了RMSProp算法以外&#xff0c;另一个常用优化算法AdaDelta算法也针对AdaGrad算法在迭代后期可能较难找到有用解的…

分享一个国内可用的AIGC网站,PC/手机端通用|免费无限制,支持Claude3 Claude2

背景 AIGC作为一种基于人工智能技术的自然语言处理工具&#xff0c;近期的热度直接沸腾&#x1f30b;。 作为一个AI爱好者&#xff0c;翻遍了各大基于AIGC的网站&#xff0c;终于找到一个免费&#xff01;免登陆&#xff01;手机电脑通用&#xff01;国内可直接对话的AIGC&am…

Aigtek:衡量基准电压源的技术指标有哪些

基准电压源在电子领域中扮演着至关重要的角色&#xff0c;它为各种应用提供了稳定、可靠的电压。为了确保电路的准确性和可靠性&#xff0c;工程师需要关注和评估基准电压源的技术指标。衡量基准电压源的技术指标有很多&#xff0c;下面将详细介绍其中几个重要的指标。 首先是输…

全面解析unityplayer.dll丢失的5种解决方法,轻松搞定dll丢失

在使用Unity开发的游戏或应用过程中&#xff0c;如果发现系统提示“找不到unityplayer.dll”文件&#xff0c;可能会引发一系列的问题与不便。这将直接导致游戏或应用程序无法正常启动运行&#xff0c;因为unityplayer.dll是Unity引擎的核心组件之一&#xff0c;负责处理关键的…

基于Web的论文管理系统设计

目 录 目 录 III 摘 要 V 关键词 V Abstract VI Key Word VI 第一章 绪论 6 1.1系统设计背景 1 1.2系统设计目的与意义 1 1.3国内外现状 2 1.4本文结构 3 第二章 需求分析 3 2.1系统需求分析 4 2.2系统角色设计 4 第三章 系统开发技术 4 3.1 PHP语言简介和特点 5 3.2 Mysql数据…

免费视频背景素材下载

找免费视频素材、背景就上这6个网站&#xff0c;高质量&#xff0c;无版权可商用。 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库虽然是个设计素材网站&#xff0c;但除了设计类素材之外还有很多视频、音频、办公类等素材&#xff0c;视频素材就有上…

5款可以免费使用的 UI 设计软件

在我们分享五个有用的原型工具之前&#xff0c;完成原型并优化界面。这是 UI 设计师的任务。UI 设计软件对设计师来说非常重要。UI 设计工具的使用是否直接影响最终结果&#xff0c;然后有人会问&#xff1a;UI 界面设计用什么软件&#xff1f;一些 UI 设计师和对 UI 设计感兴趣…

使用Docker管理linux容器

文章目录 一、使用docker管理镜像 二、使用docker管理容器 一、使用docker管理镜像 1、安装操作系统&#xff0c;我安装的是centOS 7 &#xff0c;因为centos7有着非常丰富的软件仓库&#xff0c;方便后续安装与docker相关的软件。 2、初始化设置&#xff0c; 关闭防火墙 关闭…

反爬虫技术:如何保护你的网站数据安全

在数字化时代&#xff0c;数据的价值日益凸显&#xff0c;而爬虫技术则成为了获取这些数据的重要手段之一。然而&#xff0c;对于网站运营者来说&#xff0c;非法爬虫不仅会导致数据泄露&#xff0c;还可能给网站带来巨大的流量压力和安全隐患。因此&#xff0c;本文将探讨如何…