Java实践课程设计附源码和sql脚本(物流管理系统)
声明:本课程设计比较简陋,系统功能模块也相较简单,仅供参考学习哦。
源码和SQL脚本我放在GitHub上,需要的自取哦:
- 课程选题:
物流管理系统:定义相关类,通过类的方法实现车辆、物品管理,查询和统计功能等;数据库可选Access、Mysql和SqlServer。
- 课程设计报告包含内容(论文结构)
- 实习目的:通过XX(具体设计的题目)课程设计实习过程,进一步巩固《Java程序设计》课程所学的理论知识,增强学生利用所学内容获取相关知识,以解决实习过程中所面临的问题(详细论述所选题目中需要解决的问题)和技术难点(详细论述所选题目中存在的技术难点),以提高利用Java语言实际动手进行程序设计的能力。
- 实验内容:分析设计背景和现有系统的优缺点,说明进行系统设计的必要性。站在用户的角度,详细分析系统的功能需求。
- 总体设计方案
- 总统功能结构图
- 各子功能的主要算法流程图
- 系统实现:主要程序代码及注释,程序运行截图及测试结果
- 总结
- 参考文献
目录
1.实习目的
开发一个物流管理系统即可以提高管理的现代化程序,加强管理的信息化手段,提高工作效率,增加企业效益,还可以实时掌握库存最新动态,方便查询。本系统旨在从物流管理的普遍特点出发,有针对性地解决物流管理的日常管理等方面的问题,为此编写一套能够通用于各大企业中的物流管理系统。
通过信大物流管理系统课程设计实习过程,进一步巩固《Java程序设计》课程所学的理论知识,增强学生利用所学内容获取相关知识,定义相关类,通过类的方法以解决实习过程中实现管理员的创建和管理,车辆、物品管理,查询和统计功能等。以提高利用Java语言实际动手进行程序设计的能力。
2.实验内容
2.1 设计背景分析
当今世界是经济快速发展的世界,也是信息化的世界,随着各行各业对信息的需求越来越大,从而激发的物流企业也随之高速发展。经济全球化与信息化的现状下,人们对物流行业的要求也越来越高。随着技术的发展,物流行业快速、方便的特性无疑可以让更多商家以及消费者钟爱。而物流信息管理系统,为企业以及客户提供了方便的信息查询与发布,方便企业决策,提高了经济效益与社会效益。
2.2 现有物流系统优缺点
现如今人工的管理已经不能满足企业的发展,网络化、智能化、信息化、自动化、柔性化成为了现代物流的特征。传统物流行业的操作过程比较复杂,信息量冗杂,手续特别麻烦,对于信息的处理也比较困难。物流行业的激烈竞争,就是体现在对信息的共享速度以及物品的流动速度上。所以对于数据处理以及整体的控制和协调就变得尤为重要。
物流行业蓬勃发展让物流的信息化日益被广大从业者和信息的系统提供商重视。物流网络及时、准确、便捷性完全满足了物流企业对行业信息的要求。而物流信息网站的出现,让物流信息可以高速传达,也使各种商品可以实现高速的流动。这实现了客户与企业之间信息的快速交流从而加速了资源的交换,可以短时间里最大限度的满足客户的需求。
物流管理信息系统是从这个行业的实际需求出发,从物流行业的发展以及未来展望的理念与流程作为参照。整个系统从信息的基础设置,查询、生成的报表等,加上非常清晰的业务流程。工作人员可以简洁明了的进行实际操作,来保证物流有序又高效的运作。
2.3 可行性分析
2.3.1 技术可行性
计算机的配置比较高,可以有足够的空间用来安装运行平台、各类编程工具和数据库等,在编程的环境上提供了有力的支持;在编程的人员技术方面,可以运用所学过的开发软件的计算机知识和管理知识,加上不断的探索研究讨论等等,为系统的开发提供了的技术保障。
2.3.2 社会可行性
目前已经出现了很多成功产品物流网络平台的设计的先例。首先,物流网络平台的设计、开发和运行没有违背任何国家的政策法规。另外,物流管理系统的设计所采用的工作方式和操作方式符合工作人员的日常习惯,系统操作灵活便利,且管理便捷,可行性很高。
2.3.3 经济可行性
本系统开发软件主要采用eclipse,无需支付任何费用,使用方便快捷。
2.4 开发涉及的技术
2.4.1 MySQL
MySQL是关系型数据库管理系统,由瑞典的MySQL AB公司开发,目前属于Oracle旗下产品。它是目前最流行的关系型数据库管理系统之一。MySQL使用的是SQL语言,SQL语言是用于访问数据库的最常用标准化语言,开发者使用 C和 C++编写SQL语言,因此可移植性较高。和其他大型数据库如Oracle、DB2等相比,MySQL有自身不足,但是对于个人使用者、中小型企业而言、其功能已经相形见绌。更因为是开放源码软件,能大大降低成本,所以仍然受大众欢迎。
2.4.2 JSP
JSP(Java Server Pages)是建立在Servlet规范之上的动态网页开发技术,其实质是一个简化的Servlet。在JSP文件中,HTML和Java代码共同存在,其中,HTML代码用于实现网页中静态内容的显示,Java代码用于实现网页中动态内容的实现。
2.4.3 Servlet
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
2.4.4 Tomcat
Tomcat是由Apache公司推出的一款免费开源Servlet容器,可实现Java Web程序的实现,是配置JSP和JAVA系统必备的环境。Tomcat 是一个免费开放源代码的Web 服务器,属于轻量级服务器。它在程序运行时占用系统资源少,可拓展,支持邮件服务和负载平衡等常用的功能,因而广受java爱好者的喜爱。
2.4.5 DRUID连接池
Druid是阿里巴巴开发的号称为监控而生的数据库连接池,Druid是目前最好的数据库连接池。在功能、性能、扩展性方面,都超过其他数据库连接池,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况。
2.5 功能需求分析
- 注册功能:在进入系统之前,首先要创建用户名,设置密码,然后登录。
- 登录功能:为了阻止非法用户的访问及信息安全的保护,因此管理需要权限,登录模块只有特定的管理员能登录并使用,且管理员需要输入正确的账号、密码才能成功进入后台系统。若登录账号与密码不匹配则无法登录。
- 添加物流信息功能:物流管理系统中重要的一项功能就是添加物流信息。物流信息包括物流订单号、车辆车牌号、车辆拉货物品、 始发地、目的地、运费、发货时间、快递员。
- 删除物流信息功能:执行删除操作可以将对应的该行物流信息删除。
- 修改物流信息功能:执行修改操作可以对对应的该行物流信息进行修改。
- 查询物流信息功能:点击查询按钮,可以查询全体物流信息功能,也可以在查询按钮上方输入物流订单号,查询特定的物流信息。
- 物流信息统计功能:在用户界面上方会自动统计当前物流信息的数目。
3. 总体设计方案
3.1 总统功能结构图
基于servlet的物流管理系统包含用户注册与登录、车辆及物品管理,物流查询和统计功能。功能结构图如图1所示:
图1 功能结构图
3.2 数据库设计
(1)建立db_express数据库,车辆物品表(express表),表结构如表1所示:
表1 车辆物品表
字段号 |
字段名称 |
字段类型 |
字段大小 |
索引 |
字段说明 |
1 |
id |
int |
11 |
主键 |
序号 |
2 |
eno |
varchar |
45 |
非空 |
物流订单号 |
3 |
carno |
varchar |
45 |
非空 |
车辆车牌号 |
4 |
goods |
varchar |
45 |
非空 |
车辆拉货物品 |
5 |
isStartLocation |
varchar |
45 |
非空 |
始发地 |
6 |
isEndLocation |
varchar |
45 |
非空 |
目的地 |
7 |
createTime |
datetime |
|
非空 |
发货时间 |
8 |
expresser |
varchar |
45 |
非空 |
快递员 |
9 |
price |
double |
10,2 |
非空 |
运费 |
(2)user表,表结构如下表2所示:
表2 登录管理用户表结构
字段号 |
字段名称 |
字段类型 |
字段大小 |
索引 |
字段说明 |
1 |
id |
int |
11 |
主键 |
序号(自增) |
2 |
username |
varchar |
45 |
非空 |
用户名 |
3 |
password |
varchar |
45 |
非空 |
用户密码 |
4. 系统实现
4.1 登录界面设计
用户可以在登录界面自行注册并登录数据库,用户信息保存在数据库中user表中。可在数据库中创建用户提供给管理员登录并管理物流信息。本项目只是简单创建个用户注册与登录模块,数据库中没有的用户或者密码输入错误就会显示“用户不存在”和“密码错误”信息。
4.1.1 主界面设计
主界面设计如图2所示:
图2 主界面设计
核心代码如下:
//注册
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
String usename=request.getParameter("username");
String password=request.getParameter("password");
UserDao dao=new UserDao();
User user=new User();
user.setUsername(usename);
user.setPassword(password);
boolean b=dao.registe(user);
if(b==true){
request.setAttribute("message", "<script> alert('注册成功!')</script>");
request.getRequestDispatcher("register.jsp").forward(request, response);
}else{
response.sendRedirect("register.jsp");
}
}
4.1.2 用户登录界面设计
用户登录界面设计如图3所示:
图3 用户登录界面
核心代码如下:
//登录
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Object attribute= request.getParameter("method");
String method = "";
if(attribute != null){
method = attribute.toString();
}
if("LoginAct".equals(method)){
String username=request.getParameter("username");
String password=request.getParameter("password");
UserDao dao = new UserDao();
User user=dao.findUser(username);
if(user==null){
request.setAttribute("error", "<script> alert('用户不存在!')</script>");
request.getRequestDispatcher("login.jsp").forward(request, response);
}else if(!user.getPassword().equals(password)){
request.setAttribute("error", "<script> alert('密码错误!')</script>");
request.getRequestDispatcher("login.jsp").forward(request, response);
}else {
HttpSession session=request.getSession();
session.setAttribute("username", user.getUsername());
//request.getRequestDispatcher("").forward(request, response);
response.sendRedirect("ExpressServlet?method=ExpressListAct");
}
return;
}
4.1.3 后台首页界面设计
管理员登录后台系统后,便进入系统首页。不同的管理员登录,右上角会显示当前用户为不同的管理员。后面的界面设计如图4所示:
图4 后台界面设计
核心代码如下:
<html>
<head>
<meta charset="utf-8">
<title>信大物流管理系统</title>
<link rel="stylesheet" href="<%=basePath%>css/index.css" />
</head>
<body>
<div ng-controller="headerController" class="header stark-components navbar-fixed ng-scope">
<nav class="white nav1">
<div class="nav-wrapper">
<a href="<%=basePath%>goods/homeGoods" class="logo">
<em class="em1">信大</em>
<em class="em2">物流管理系统</em>
<em class="em3" style="color:red;">总共:${count}条物流信息</em>
<li> <a href="addExpress.jsp">添加物流信息</a></li>
<li> <a href="javascript:void(0)">欢迎${username}登陆</a></li>
<li><a href="<%=path %>/UserServlet?method=LoginOutAct" target="_blank">退出登陆</a></li>
<a href="ExpressServlet?method=ExpressListAct" class="btn btn-success">返回主界面</a>
<th>序号</th>
<th>物流订单号</th>
<th>车辆车牌号</th>
<th>车辆拉货物品</th>
<th>始发地</th>
<th>目的地</th>
<th>运费</th>
<th>发货时间</th>
<th>快递员</th>
<th>操作</th>
</div>
<script>
4.2 物流信息的查询、删除与修改
4.2.1 物流信息信息查询
查询界面如图5所示:
图5 查询界面
核心代码如下:
public class ExpressDao {
Connection c=null;
//根据id查询
public Express queryById(int id){
try{
c=JDBCUtils.getConnection();
String sql="select * from express where id=?";
PreparedStatement pst=c.prepareStatement(sql);
pst.setInt(1, id);
ResultSet rs=pst.executeQuery();
if(rs.next()){
Express record =new Express();
record.setId(rs.getInt("id"));
record.setEno(rs.getString("eno"));
record.setCarno(rs.getString("carno"));
record.setGoods(rs.getString("goods"));
record.setPrice(rs.getDouble("price"));
record.setIsStartLocation(rs.getString("isStartLocation"));
record.setIsEndLocation(rs.getString("isEndLocation"));
record.setCreateTime(rs.getDate("createTime"));
record.setExpresser(rs.getString("expresser"));
return record;
}else{
return null;
}
}catch(Exception e){
e.printStackTrace();
return null;
}finally{
try {
c.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//全局查询物流信息
public List<Express> findAll(){
List<Express> list =new ArrayList<Express>();
try{
c=JDBCUtils.getConnection();
String sql="select * from express order by id asc";
PreparedStatement pst=c.prepareStatement(sql);
ResultSet rs=pst.executeQuery();
while(rs.next()) {
Express record =new Express();
record.setId(rs.getInt("id"));
record.setEno(rs.getString("expressno"));
record.setCarno(rs.getString("carno"));
record.setGoods(rs.getString("goods"));
record.setPrice(rs.getDouble("price"));
record.setIsStartLocation(rs.getString("isStartLocation"));
record.setIsEndLocation(rs.getString("isEndLocation"));
record.setCreateTime(rs.getDate("createTime"));
record.setExpresser(rs.getString("expresser"));
list.add(record);
}
return list;
}catch(Exception e){
e.printStackTrace();
return null;
}finally{
try {
c.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4.2.2 删除物流信息
具体如图6所示:
图6 删除物流信息
核心代码如下:
public boolean deleteExpress( int id) {
Connection c=null;
try{
c=JDBCUtils.getConnection();
String sql="delete from express where id=?";
PreparedStatement pst=c.prepareStatement(sql);
pst.setInt(1,id);
pst.execute();
return true;
}catch(Exception e){
e.printStackTrace();
return false;
}finally{
try {
c.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4.2.3 修改物流信息
具体如图7所示:
图7 修改物流信息
核心代码如下:
public boolean update(Express express,int id) {
Connection c=null;
try{
c=JDBCUtils.getConnection();
PreparedStatement pst=c.prepareStatement(sql);
pst.setString(1,express.getEno());
pst.setString(2, express.getCarno());
pst.setString(3, express.getGoods());
pst.setDouble(4, express.getPrice());
pst.setString(5, express.getIsStartLocation());
pst.setString(6, express.getIsEndLocation());
pst.setString(7, String.valueOf(express.getCreateTime()));
pst.setString(8, express.getExpresser());
pst.setInt(9, id);
pst.execute();
return true;
}catch(Exception e){
e.printStackTrace();
return false;
}finally{
try {
c.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4.2.4 全局查询并分页
具体如图8所示:
图8 全局查询分页
核心代码:
public List<Express> ListExpress(int pageNo){
PreparedStatement pstmt=null;
ResultSet rs=null;
List<Express> list=new ArrayList<Express>();
int pageSize=5;
int page=(pageNo-1)*
Connection c=null;
try {
c=JDBCUtils.getConnection();
String sql="select * from express order by id limit ?,?";
pstmt=c.prepareStatement(sql);
pstmt.setInt(1, page);
pstmt.setInt(2, pageSize);
rs=pstmt.executeQuery();
while(rs.next()) {
Express record =new Express();
record.setId(rs.getInt("id"));
record.setEno(rs.getString("eno"));
record.setCarno(rs.getString("carno"));
record.setGoods(rs.getString("goods"));
record.setPrice(rs.getDouble("price"));
record.setIsStartLocation(rs.getString("isStartLocation"));
record.setIsEndLocation(rs.getString("isEndLocation"));
record.setCreateTime(rs.getDate("createTime"));
record.setExpresser(rs.getString("expresser"));
list.add(record);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
c.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return list;
}
//获取页码及记录数
public int getPage(){
int recordCount=0,t1=0,t2=0;
PreparedStatement pstmt=null;
ResultSet result=null;
Connection c=null;
String sql="select count(*) from express";
try {
c=JDBCUtils.getConnection();
pstmt=c.prepareStatement(sql);
result=pstmt.executeQuery();
result.next();
recordCount=result.getInt(1);
t1=recordCount%5;
t2=recordCount/5;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
c.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(t1 != 0){
t2=t2+1;
}
return t2;
}
4.3 添加物流信息
具体如下图9所示:
图9 插入数据
核心代码如下:
public boolean insert(Express express){
Connection c=null;
try{
c=JDBCUtils.getConnection();
Stringsql="insert_into_express(eno,carno,goods,price,isStartLocation,isEndLocation,createTime,expresser)_values (?,?,?,?,?,?,?,?)";
PreparedStatement pst=c.prepareStatement(sql);
pst.setString(1,express.getEno());
pst.setString(2, express.getCarno());
pst.setString(3, express.getGoods());
pst.setDouble(4, express.getPrice());
pst.setString(5, express.getIsStartLocation());
pst.setString(6, express.getIsEndLocation());
pst.setString(7, String.valueOf(express.getCreateTime()));
pst.setString(8, express.getExpresser());
pst.execute();
return true;
}catch(Exception e){
e.printStackTrace();
return false;
}finally{
try {
c.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4.4 统计物流信息
这个统计物流信息实现很简单,只是简单的统计物流信息的条数。具体如图10所示:
图10 统计物流信息
核心代码:
public int getCount() {
int count =0;
PreparedStatement pstmt=null;
ResultSet result=null;
Connection c=null;
String sql="select count(*) from express";
try {
c=JDBCUtils.getConnection();
pstmt=c.prepareStatement(sql);
result=pstmt.executeQuery();
result.next();
count=result.getInt(1);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
c.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return count;
}
5. 总结
………………………………
6. 参考文献
[1] 张海藩.软件工程导论[M].清华大学出版社,2013.
[2] 林龙,刘华贞. JSP+Servlet+Tomcat应用开发从零开始学.清华大学出版社,2019.4.
[3] 马素霞,方国. Java应用系统的设计与实现(第2版).清华大学出版社,2018.3.1.
[4] 丁宝康,汪卫.数据库系统教程[M].高等教育出版社,2013.
[5] 虞益诚.SQL Server 2000[M].中国铁道出版社,2014.
[6] 段爱玲,杨丽华.数据库原理与应用[M].北京邮电大学出版社,2010.