1、2014 2015 学年第 二 学期毕业设计(论文)课题: 物流管理系统 姓名: 王静 系部: 电子与信息工程学院 专业: 计算机应用技术 班级: 11计算机(1) 学号: 1403380127 指导教师: 周丰老师 2016年11月15日目录【KEY WORDS】 B/S MODE;WULIU INFORMATION MANAGEMENT SYSTEM;5引言61相关技术突破61.1.系统存在技术问题61.1.2系统开发目标71.1.3 意义71.1.4 可行性分析71.1.5经济上可行性71.1.6技术上可行性81.1.7运行上可行性82.1.1系统开发环境82.1.2系统软件架构8.2.
2、1.3系统硬件结构92.2功能分析102.3模块分析103系统设计113.1三层体系结构113.2系统结构与设计113.2.1系统总体结构113.2.2订单管理133.2.3车辆信息管理133.2.4客户信息管理143.2.5账户信息管理144.数据库设计154.1.1表设计概述154.1.2表设计154.1.3数据库备份恢复策略164.1.4数据库运行日常维护165.页面设计175.1.1页面设计176系统实现216.1.1数据实现(部分)216.1.2类实现(部分)246.1.2.1通用类:Utilities.cs267.编译与测试297.1.1部分测试用例287.1.2测试结果与发现29
3、8发布299结束语2910参考文献30物流管理系统设计与实现.摘要本系统是基于B/S模式的web物流管理系统,使用了MySQL、Myeclipse等开发工具。依据开发要求主要应用于物流管理系统,完成对日常的物流配送的管理。开发本系统可使物流公司的员工减轻工作压力,比较系统地对各项服务和信息进行管理,同时,可以减少劳动力的使用,加快下单、查询、配送速度、加强管理。可以实现以下功能:1.在系统首页实现简单的使用用户名和密码来进入管理界面。如果输入的用户名和密码有一项为空或者输入的用户名和密码是错误的,会提示错误信息,且不能进入系统。2.实现系统对物流信息的操作,包括查询,添加,删除,修改等。关键词
4、 B/S模式;物流管理系统;MySQL;MyeclipseLogistics management system design and implementation【Abstract】This system is web logistics management system based on B/S mode, use the MySQL, Myeclipse development tools, etc. Accordance with the requirements of development is mainly used in the logistics management sy
5、stem, complete the daily management of logistics distribution. To develop this system can make the logistics company staff can reduce the work pressure, systematically to manage various services and information, at the same time, can reduce the use of labor, speed up the order, query, distribution,
6、strengthening the management.Can realize the following functions:1. The system implement a simple home page using the username and password to enter the management interface. If the input user name and password with a null or input user name and password is wrong, will prompt error message, and cant
7、 enter the system.2. To realize the operation of logistics information system, including the query, add, delete, modify, etc【Key words】 B/S mode; Logistics management system;30引言随着计算机技术的发展,特别是计算机网络技术与数据库技术的发展,使用人们的生活与工作方式发生了很大的改观。网络技术的应用使得计算机之间通信、信息共享成为可能,而数据库技术的应用则为人们提供了数据存储、信息检索、信息分析等功能,从而使得工作更高效地
8、进行。数据库始于20世纪60年代,经过40多年的发展,现在已经形成了理论体系,成为计算机软件的一个重要分支。数据库技术体现了当代先进的数据管理方法,使计算机的应用真正渗透到国民经济各个部门,在数据处理领域发挥着越来越大的作用。而互联网技术的出现,更是进一步丰富的人类生活,数字化生存已经一步步走进我们的生活与工作。互联网技术与数据库技术的结合为计算的在人类生活中的应用带来了巨大的影响。产业信息化,管理现代化,科学化已经成为行业发展的重要课题,这不仅是企业提高自身竞争力,甚至是国家提高综合国力,走向国民富强的重要手段。只有在大城市中发展较早、规模较大的企业中才使用计算机进行大规模操作,从各方面提高
9、工作效率,取得良好的社会和经济效益,而一些新兴的、规模较小的企业公司还没有全部具备这种功能。因此可见,随着我国经济的迅速发展,信息技术在其上的应用会更加地广泛和深入。1相关技术突破1.1. 系统存在技术问题在我国,各大物流公司的物理信息管理系统并非一个新的课题,但也有的公司根本就没有任何信息管理系统,所有的工作几乎还是手工操作来完成。计算机技术在日新月异的发展,但是有的很多公司,特别是在小型物流公司,物流信息的管理都依然由手工操作来完成,这十分落后,效率极低,成本很大,而且极异出错。随着社会的发展,信息化是社会进程的必然趋势,物流管理只有只有快,准,精才能发挥其价值。所以机器代替人力是必然的历
10、史发展趋势,只有领导的重视和支持才能从人工操作改为计算机的自动化系统。人工操作必将被计算机代替。有些公司虽使用了计算机,甚至管理系统,但是仍然存在很多问题,问题一日不解决,效率就一日提不上去。还有,有的系统很不完善到处是漏洞,可以说是千疮百孔,这样极不完善的系统对管理来说是没有任何保障的。1.1.2系统开发目标 本系统是将现代化的计算机技术和传统的工作相结合,按照学校的工作流程设计完成的。为了使系统在物流公司的管理中发挥更大的作用,实现工作过程的计算机化,提高工作效率和工作质量,现提出如下的系统开发目标:1).系统应具有实用性、可靠性和适用性,同时注意到先进性。2).对各个数据库进行动态管理,
11、防止混乱。3).能够按照用户选择的不同的条件进行简单查询、添加、修改、删除。4).方便用户的操作,尽量减少用户的操作。1.1.3 意义 在各大中小物流公司,用计算机管理物流信息已经越来越普遍了。用计算机不但可以提高工作效率,而且还节省了许多人力物力,增强了客户信息资料的安全性。提高了物流公司的管理能力,为此,用计算机来管理物流信息,是非常必要的。1.1.4 可行性分析 可行性研究的目的是用最小的代价在尽可能的时间内确定问题是否能够解决。1.1.5经济上可行性:现在,计算机的价格已经十分低廉,性能却有了长足的进步。而本系统的开发,为物流公司工作效率带来了一个质的飞跃,为此主要表现有以下几个方面:
12、1).本系统的运行可以代替人工进行许多繁杂的劳动;2).本系统的运行可以节省许多资源;3).本系统的运行可以大大的提高物流公司的工作效率;4).本系统可以使客户信息更加安全等等。所以,本系统在经济上是可行的。1.1.6技术上可行性:本系统的开发利用MySQL作为本系统的数据库,它是一个较小型的数据库,适用于中等规模的数据量需求。系统服务器/客户端的结构提供了硬件的支持。使用myeclipse作为系统开发的开发环境,它提供完善的指令控制语句、类与对象的支持及丰富的数据类型,给开发高性能系统提供的保障为开发满足用户要求的系统,保证了代码的模块化要求,而代码模块化的提高,非常有利于以后对新系统的扩展
13、与修改。综上所述,本系统的设计与开发在技术上和硬件设备上的条件都是满足的,因此,它在技术上是可行的。1.1.7运行上可行性 本系统为一个小型的物流管理系统,所耗费的资源非常的小,物流公司的电脑无论是硬件还是软件都能够满足条件,因此,本系统在运行上是可行的。2 .需求分析2.1.1系统开发环境根据本系统的基本功能需求,以及使用者的信息系统环境,本系统采用B/S模式来构建管理系统,这样方便维护和使用。具体的硬件环境要求如下:1)硬件环境:采用普通个人计算机作为服务器即可。2)操作系统:可以采用windows XP以上系统。3)数据库系统:采用MySQL数据库。4)web服务器:采用tomcat5以
14、上系统。5)Java运行环境:采用JRE1.5以上版本。6) 客户端:采用浏览器等工具即可。2.1.2系统软件架构系统采用了B/S结构,三层运行模式。此架构无须安装客户端软件,便于软件的分发和维护升级,以及平时的日常运行和维护需求。系统包含如下各层:表示层 PresentationWeb 层为管理员提供对应用程序的访问。Web 层由Java Web 窗体和代码隐藏文件组成。Web 窗体只是用 JSP页面提供用户操作,而代码隐藏文件实现各种控件的事件处理。 业务逻辑层 Business Logic业务逻辑层为 Web 层提供处理、用户帐户管理、物流信息管理、客户信息管理、车源信息管理、发货信息管
15、理等功能的界面。业务外观层用作隔离层,它将用户界面与各种业务功能的实现隔离开来。除了低级系统和支持功能之外,对数据库服务器的所有调用都是通过此程序集进行的。 以及包含各种业务规则和逻辑的实现。业务规则完成如用户账户和用户安全性的核查这样的任务。 数据访问层 Data MySQL数据访问层为业务逻辑层提供数据服务。.2.1.3系统硬件结构为了使本系统获得更好的安全性、扩展性和更高的执行效能,我们建议整个系统采取分布式部署的方案,该方案系统架构示意图2所示:将承载关键业务逻辑的应用程序服务器(或应用程序服务器集群)和承载业务数据的数据库服务(或数据库服务器集群)隔离开来,有以下好处:l l有利于安
16、全性的提高;l 将系统负载分摊到应用程序服务器和数据库服务器中,有利于提高系统运行的速度;l 当公司业务量持续提升,该部署方案具有更加灵活可靠的扩展性。图 1硬件架构图2.2功能分析物流管理系统主要提供的功能如图所示:图2功能概要2.3模块分析a) 订单管理(1)管理员:得到客户提交的订单 一车辆查询一车辆确认 一填写发货单 一回执单确认b) 车辆信息管理(2)管理员:查询车辆信息一修改车辆信息(修改、删除等)c) 客户信息管理(3)管理员:查询客户信息一修改客户信息(修改、删除等) d) 账户信息管理(4)管理员:修改账户密码3系统设计3.1三层体系结构本系统二层架构设计,其包括:表现层、业
17、务层和数据层。l 表现层是用户和服务器交互的接口,也是应用系统中用户唯一能够访问到的部分。l 业务数据访问层是数据层与表现层之间的纽带,它向上为表示层提供带有业务逻辑的封闭数据,向下对数据层进行数据访问。l 数据层为数据训的物理实现。三层体系的关系如图3所示。图3三层架构关系图3.2系统结构与设计3.2.1系统总体结构系统结构设计图如图4所示。回执发货单填写发货单发货单查询订单管理车辆信息修改车辆信息管理车辆信息删除管理员车辆信息查询车辆信息修改客户信息管理车辆信息修改账户信息管理账户密码修改图4 系统结构图3.2.2订单管理的设计流程图订单管理根据设计思想,系统结构设计图如图5所示。客户提交
18、订单回执单确认发货货物到达管理员车辆确认填写发货单车辆查询图5订单管理的设计流程图3.2.3车辆信息流程图车辆信息管理根据设计思想,系统结构设计图如图6所示。管理员车辆信息修改车辆信息删除车辆信息查询图6车辆信息流程图3.2.4客户信息流程图客户信息管理根据设计思想,系统结构设计图如图7所示。管理员客户信息添加客户信息删除客户信息查询图7客户信息流程图3.2.5账户信息流程图账户信息管理根据设计思想,系统结构设计图如图8所示。管理员账户密码修改图8账户信息流程图4.数据库设计4.1.1表设计概述数据库将针对学生信息管理,配合 MySQL数据库系统中提供的数据管理功能,实现物流信息的查询、修改、
19、删除等业务功能。由于物流管理应用程序的分布式架构,系统将包括一个数据库:l db_wlgldb_wlgl数据库设计主要包括以tb_admin; tb_car; tb_carlog; tb_customer; tb_operationgoods 表为主4.1.2表设计(1) 表tb_admin: 用于管理员字段类型可否为空备注idINT否编号admin_userVARCHAR(50)否用户名admin_passwordVARCHAR(50)否密码(2) 表tb_car用于车辆信息字段类型可否为空备注idint否车辆编号usernameVARCHAR(50)否车主姓名user_numberVARC
20、HAR(50)否身份证号car_numberVARCHAR(50) 否车牌号telVARCHAR(50)否手机号码addressVARCHAR(50)否地址car_roadVARCHAR(50)否运输区间car_contentVARCHAR(50)否车辆类型(3) 表tb_carlog用于送货记录字段类型可否为空备注idint否编号goods_idVARCHAR(50)否发货单号car_idint否车辆编号startTimeVARCHAR(50)否开始日期endTimeVARCHAR(50)否结束日期describerVARCHAR(50)否货物描述(4) 表tb_customer用于客户信息
21、字段类型可否为空备注customer_idint否客户编号customer_userVARCHAR(50)否客户名customer_telVARCHAR(50)否客户电话customer_addressVARCHAR(80)否客户地址(5) 表tb_operationgoods用于发货单字段类型可否为空备注idInt否编号car_idVARCHAR(50)否车辆编号customer_idVARCHAR(50)否客户编号goods_idVARCHAR(50)否发货单号goods_nameVARCHAR(50)否收货人姓名goods_telVARCHAR(50)否收货人电话goods_addres
22、sVARCHAR(50)否收货地址goods_sureInt否确认是否收货4.1.3数据库备份恢复策略数据库的大小和数据修改的频率决定了采用何种数据库备份恢复策略。如果数据库较小或修改的频度非常低,则可以只实施完全数据库备份,不过此时要定期清理数据库的事务日志,防止数据库的事务日志被填满。其他情况则需要使用差异备份。由于本案例教学涉及的数据库规模较小,建议每周做一次完全备份,中间间隔两天做一次差异备份。4.1.4数据库运行日常维护MySQL的一个优势就是对日常维护的要求比较低,但为了追求更高的可用性和安全性,建议每周做备份,同时注意将备份放在不同的备份媒体中,如多个硬盘。5.页面设计5.1.1
23、页面设计a)登录页b)首页c)客户管理c)车源信息管理d)发货单f)发货单查询 g)回执发货单图9功能页设计6系统实现6.1.1数据实现(部分)CREATE DATABASE db_wlgl;USE db_wlgl;/* 管理员表 tb_admin */DROP TABLE IF EXISTS tb_admin;CREATE TABLE tb_admin ( id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY, admin_user VARCHAR(50) NOT NULL, admin_password VARCHAR(50) NOT NULL)DE
24、FAULT CHARSET=gb2312;/*插入数据*/INSERT INTO tb_admin VALUES (1,admin,123456);/* 车辆信息表 tb_car */DROP TABLE IF EXISTS tb_car;CREATE TABLE tb_car ( id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, user_number VARCHAR(50) NOT NULL, car_number VARCHAR(50) NOT NULL, tel VARCHAR(
25、50) NOT NULL, address VARCHAR(80) NOT NULL, car_road VARCHAR(50) NOT NULL, car_content VARCHAR(50) NOT NULL)DEFAULT CHARSET=gb2312;/*插入数据*/INSERT INTO tb_car VALUES (1,王一,11111111,鄂A-123456,12345678,武汉市,武汉-上海,大货车);INSERT INTO tb_car VALUES (2,王二,11111111,鄂A-123456,12345678,武汉市,武汉-昆明,大货车);INSERT INTO
26、 tb_car VALUES (3,王三,3333333,鄂A-45678,1232456,武汉市,武汉-长沙,货车);INSERT INTO tb_car VALUES (4,王四,555555,鄂A-121212,1111111,武汉市,武汉-北京,货车);INSERT INTO tb_car VALUES (5,王五,222222,鄂A-11111,454544,武汉市,武汉-广州,大货车);INSERT INTO tb_car VALUES (6,王六,11111111,豫A-123456,12345678,武汉市,武汉-郑州,大货车);/*送货记录表 tb_carlog*/DROP
27、TABLE IF EXISTS tb_carlog;CREATE TABLE tb_carlog ( id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, goods_id VARCHAR(255) NOT NULL, car_id INT(11) NOT NULL, startTime VARCHAR(255) NOT NULL, endTime VARCHAR(255) NOT NULL, describer VARCHAR(255) NOT NULL)DEFAULT CHARSET=gb2312;/*插入数据*/INSERT INTO tb_ca
28、rlog VALUES (3,1207885210187,1,2016-08-01,2016-08-03,两箱啤酒);INSERT INTO tb_carlog VALUES (4,1207892821734,3,2016-10-02,2016-10-05,两箱啤酒);/* 客户表 tb_customer */DROP TABLE IF EXISTS tb_customer;CREATE TABLE tb_customer ( customer_id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY, customer_user VARCHAR(50) N
29、OT NULL, customer_tel VARCHAR(50) NOT NULL, customer_address VARCHAR(80) NOT NULL)DEFAULT CHARSET=gb2312;/*插入数据 */INSERT INTO tb_customer VALUES (13,张四,0110-123456145,上海市);INSERT INTO tb_customer VALUES(4,张三,0110-36925810,昆明市);INSERT INTO tb_customer VALUES(5,张五,0110-12345678,上海市);INSERT INTO tb_cus
30、tomer VALUES(6,张六,0110-45612378,郑州市);INSERT INTO tb_customer VALUES(7,张七,0434-56666233,广州);INSERT INTO tb_customer VALUES(8,张八,0431-46454541,武汉);INSERT INTO tb_customer VALUES(9,张九,0231-78787888,长沙市);INSERT INTO tb_customer VALUES(10,张十,0131-33333333,北京市);INSERT INTO tb_customer VALUES(11,张零,0021-12
31、345678,上海市);INSERT INTO tb_customer VALUES(12,李明,027-879925634,武汉市);/* */DROP TABLE IF EXISTS tb_operationgoods;CREATE TABLE tb_operationgoods ( id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, car_id INT(11) NOT NULL, customer_id INT(11) NOT NULL, goods_id VARCHAR(255) NOT NULL, goods_name VARCHAR(2
32、55) NOT NULL, goods_tel VARCHAR(255) NOT NULL, goods_address VARCHAR(255) NOT NULL, goods_sure INT(11) NOT NULL)DEFAULT CHARSET=gb2312;/* 插入数据 */INSERT INTO tb_operationgoods VALUES (4,3,11,1207892821734,潘一,0121-12345678,上海市,1);INSERT INTO tb_operationgoods VALUES (3,1,10,1207885210187,潘二,0321-45612
33、356,武汉市,1);SELECT * FROM tb_admin;SELECT * FROM tb_car;SELECT * FROM tb_carlog;SELECT * FROM tb_customer;SELECT * FROM tb_operationgoods;6.1.2类实现(部分)6.1.2.1 通用类: AdminActionpackage com.webtier;import com.dao.AdminDao;import com.form.AdminForm;public class AdminAction extends AdminForm private static
34、AdminDao adminDao = null;staticadminDao=new AdminDao();/ 对登录用户的表单验证是否为空public void validateIndex() if (null = admin_user | admin_user.equals() this.addFieldError(admin_user, | 请您输入用户名);if (null = admin_password | admin_password.equals() this.addFieldError(admin_password, | 请您输入密码);/ 对登录用户的表单验证public
35、 String index() String query_password = adminDao.getAdminPassword(admin_user);if (query_password.equals() this.addActionError(| 该用户名不存在);return INPUT;if (!query_password.equals(admin_password) this.addActionError(| 您输入的密码有误,请重新输入);return INPUT;session.put(admin_user, admin_user);return SUCCESS;/ 对修改
36、管理员密码表单验证是否为空public void validateUpdatePassword() if (null = admin_password | admin_password.equals() this.addFieldError(admin_password, 请输入原密码);if (null = admin_repassword1 | admin_repassword1.equals() this.addFieldError(admin_repassword1, 请输入新密码);if (null = admin_repassword2 | admin_repassword2.eq
37、uals() this.addFieldError(admin_repassword2, 请输入密码确认);if (!admin_repassword1.equals(admin_repassword2) this.addActionError(您输入两次密码不相同,请重新输入!);public String updatePassword() String query_password = adminDao.getAdminPassword(admin_user);if (!admin_password.equals(query_password) this.addFieldError(adm
38、in_password, 您输入的原密码有误,请重新输入);String sql = update tb_admin set admin_password= + admin_repassword1+ where admin_user= + admin_user + ;if (!adminDao.operationAdmin(sql) this.addActionError(修改密码失败!);return INPUT; else request.setAttribute(editPassword, 您修改密码成功,请您重新登录!);return SUCCESS; 6.1.2.2 获取当前系统时间
39、:CurrentTimepackage com.tools;import java.text.DateFormat;import java.util.Date;public class CurrentTime public String currentlyTime() Date date = new Date();DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL);return dateFormat.format(date);public long autoNumber() Date date = new Da
40、te();long autoNumber = date.getTime();return autoNumber;6.1.2.3 实现分页:MyPaginationpackage com.tools;import java.util.ArrayList;import java.util.List;public class MyPagination public List list=null;private int recordCount=0;private int pagesize=0;private int maxPage=0;public List getInitPage(List list
41、,int Page,int pagesize)List newList=new ArrayList();this.list=list;recordCount=list.size();this.pagesize=pagesize;this.maxPage=getMaxPage();tryfor(int i=(Page-1)*pagesize;i=recordCount)break;catch(Exception e)newList.add(Object)list.get(i);catch(Exception e)e.printStackTrace();return newList;public List getAppointPage(int Page)List newList=new ArrayList();tryfor(int i=(Page-1)*pagesize;i=recordCount)break;cat