聲明:本課程設計比較簡陋,系統功能模塊也相較簡單,僅供參考學習哦。
源碼和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.