一、源码特点
idea ssm 物流运输管理系统是一套完善的完整信息管理系统,结合SSM框架完成本系统SpringMVC spring mybatis ,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码和数据库,系统主要采用B/S模式开发。
前段主要技术 js css jquery
后端主要技术 SpringMVC spring mybatis
数据库 mysql
开发工具 IDEA JDK1.8 TOMCAT 8.5
最短路径算法 Dijstra算法
idea ssm物流运输管理系统1
二、功能介绍
1.登录功能
用户巨头不同角色(业务员、业务经理和超级管理员)。
2.权限控制
要求用户以不同角色登录时,能够使用的功能不同。
3.系统功能
(1)用户管理(超级管理员)
对系统的用户进行管理(增删改查)。用户注册时,用户数据表自动更新。
(2)权限管理(超级管理员)
对系统角色对应的权限进行管理(增删改查)。
(3)订单管理(业务员、业务经理、超级管理员)
对所有订单信息进行管理(增删改查)。其中,业务员仅能查看到个人负责的订单。
(4)业务管理(业务员、超级管理员)
a.添加、修改订单信息,自动计算物流费用。(自动更新订单表和客户信息表)
b.更新物流订单状态:揽件、入库、运输中、派送完成。
c.根据最短距离的订单运输建议,利用最短路径算法(Dijstra算法)进行路径规划。
(5)客户管理(业务经理、超级管理员)
对订单客户信息进行管理(增删改查)。
(6)报表管理(业务经理、超级管理员)
a.统计导出报表数据:统计订单数目、营业额、月度数据变化等报表数据
b.显示报表数据:利用图形、表格等形式展现报表数据
数据库设计
(1)权限信息表如表3.1所示:
表3.1 权限信息表
|----|------|---------|----|----|------|
| 序号 | 字段名称 | 数据类型 | 长度 | 主键 | 描述 |
| 1 | qxid | INTEGER | 11 | 是 | 权限编号 |
| 2 | qx | VARCHAR | 40 | 否 | 权限 |
(2)机构信息表如表3.2所示:
表3.2 机构信息表
|----|------|---------|----|----|------|
| 序号 | 字段名称 | 数据类型 | 长度 | 主键 | 描述 |
| 1 | jgid | INTEGER | 11 | 是 | 机构编号 |
| 2 | jgmc | VARCHAR | 40 | 否 | 机构名称 |
| 3 | lx | VARCHAR | 40 | 否 | 类型 |
(3)机构距离信息表如表3.3所示:
表3.3 机构距离信息表
|----|--------|---------|----|----|--------|
| 序号 | 字段名称 | 数据类型 | 长度 | 主键 | 描述 |
| 1 | jgjlid | INTEGER | 11 | 是 | 机构距离编号 |
| 2 | qsjg | VARCHAR | 40 | 否 | 起始机构 |
| 3 | mdjg | VARCHAR | 40 | 否 | 目的机构 |
| 4 | jl | VARCHAR | 40 | 否 | 距离 |
| 5 | yssj | VARCHAR | 40 | 否 | 运输时间 |
(4)用户信息表如表3.4所示:
表3.4 用户信息表
|----|------|---------|----|----|------|
| 序号 | 字段名称 | 数据类型 | 长度 | 主键 | 描述 |
| 1 | yhid | INTEGER | 11 | 是 | 用户编号 |
| 2 | yhm | VARCHAR | 40 | 否 | 用户名 |
| 3 | mm | VARCHAR | 40 | 否 | 密码 |
| 4 | xm | VARCHAR | 40 | 否 | 姓名 |
| 5 | jg | VARCHAR | 40 | 否 | 机构 |
| 6 | lxdh | VARCHAR | 40 | 否 | 联系电话 |
| 7 | lxdz | VARCHAR | 40 | 否 | 联系地址 |
| 8 | qx | VARCHAR | 40 | 否 | 权限 |
(5)重量价格信息表如表3.5所示:
表3.5 重量价格信息表
|----|--------|---------|----|----|--------|
| 序号 | 字段名称 | 数据类型 | 长度 | 主键 | 描述 |
| 1 | zljgid | INTEGER | 11 | 是 | 重量价格编号 |
| 2 | zl | VARCHAR | 40 | 否 | 重量 |
| 3 | jg | VARCHAR | 40 | 否 | 价格 |
(6)客户信息表如表3.6所示:
表3.6 客户信息表
|----|------|---------|----|----|------|
| 序号 | 字段名称 | 数据类型 | 长度 | 主键 | 描述 |
| 1 | khid | INTEGER | 11 | 是 | 客户编号 |
| 2 | khmc | VARCHAR | 40 | 否 | 客户名称 |
| 3 | lxdh | VARCHAR | 40 | 否 | 联系电话 |
| 4 | lxdz | VARCHAR | 40 | 否 | 联系地址 |
(7)运单信息表如表3.7所示:
表3.7 运单信息表
|----|-------|---------|----|----|-------|
| 序号 | 字段名称 | 数据类型 | 长度 | 主键 | 描述 |
| 1 | ydid | INTEGER | 11 | 是 | 运单编号 |
| 2 | dh | VARCHAR | 40 | 否 | 单号 |
| 3 | kh | VARCHAR | 40 | 否 | 客户 |
| 4 | fjrxx | VARCHAR | 40 | 否 | 发件人信息 |
| 5 | sjrxx | VARCHAR | 40 | 否 | 收件人信息 |
| 6 | qsjg | VARCHAR | 40 | 否 | 起始机构 |
| 7 | mdjg | VARCHAR | 40 | 否 | 目的机构 |
| 8 | zl | VARCHAR | 40 | 否 | 重量 |
| 9 | gs | VARCHAR | 40 | 否 | 关税 |
| 10 | zjg | VARCHAR | 40 | 否 | 总价格 |
| 11 | fzr | VARCHAR | 40 | 否 | 负责人 |
| 12 | zt | VARCHAR | 40 | 否 | 状态 |
代码设计
public String addpage(jigou bean, HttpServletRequest request){
/**
机构添加页面
*/
Map<String,Object> map= new HashMap<String,Object>();
System.out.println("addPageok");
return "jigou/jigouadd";
}
@RequestMapping(value="/add")
public String add(jigou bean, HttpServletRequest request){
/**
机构添加处理方法
**/
Map<String,Object> map= new HashMap<String,Object>();//初始变量
String jgid=(String)request.getParameter("jgid");//机构编号
String jgmc=(String)request.getParameter("jgmc");//机构名称
String lx=(String)request.getParameter("lx");//类型
jigoudao.add(bean);//调用添加方法
System.out.println("add");
request.setAttribute("msg", "<script>alert('添加成功');</script>");//操作提示
return "jigou/jigouadd";
}
/**删除 机构
*
*/
@RequestMapping(value="/del")
public String del(HttpServletRequest request,Map<String,Object> map){
// Map<String,Object> map= new HashMap<String,Object>();//初始化对象
String a=(String)request.getParameter("keyid");//request 方式获得主键id
int id=Integer.parseInt(a);
request.setAttribute("msg", "<script>alert('删除成功');</script>");
jigoudao.delete(id);//调用 删除方法
return listpage(map,request);
}
/**
* 查询jigou信息 返回list结果 前台获取
*/
@RequestMapping(value="/listpage")
public String listpage(Map<String,Object> map,HttpServletRequest request){
List<Map> list= new ArrayList<Map>();//初始化对象
Map map1= new HashMap();
String jgid=(String)request.getParameter("jgid");//机构编号
if(jgid!=null&&!jgid.equals("")){
map1.put("jgid",jgid);//机构编号
}
String jgmc=(String)request.getParameter("jgmc");//机构名称
if(jgmc!=null&&!jgmc.equals("")){
map1.put("jgmc",jgmc);//机构名称
}
String lx=(String)request.getParameter("lx");//类型
if(lx!=null&&!lx.equals("")){
map1.put("lx",lx);//类型
}
list=jigoudao.getAll(map1);//传入 方法参数 返回gly结果集
System.out.println("listsize="+list.size());
map.put("list", list);//传递参数
return "jigou/jigoulist";
}
/**
机构详情信息
*/
@RequestMapping(value="/detail")
public String detail(Map<String,Object> map,HttpServletRequest request){
String keyid=(String)request.getParameter("keyid");//request 方式获得主键id
jigou bean=new jigou();//初始化对象
bean=jigoudao.getjigouByID(Integer.parseInt(keyid));//根据id返回 jigou对象数据
request.setAttribute("jgid", bean.getJgid());//机构编号
request.setAttribute("jgmc", bean.getJgmc());//机构名称
request.setAttribute("lx", bean.getLx());//类型
return "jigou/jigoudetail";
}
/**
进入jigou修改页面
**/
@RequestMapping(value="/modifypage")
public String modifypage(Map<String,Object> map,HttpServletRequest request){
String keyid=(String)request.getParameter("keyid");//request 方式获得主键id
jigou bean=new jigou();//初始化对象
bean=jigoudao.getjigouByID(Integer.parseInt(keyid));//根据id返回 jigou对象数据
request.setAttribute("jgid", bean.getJgid());//机构编号
request.setAttribute("jgmc", bean.getJgmc());//机构名称
request.setAttribute("lx", bean.getLx());//类型
return "jigou/jigoumodify";
}
核心算法设计
public static String getJL (String qsd,String mdd){
String temp="";
sz sz=new sz();
String[] a=sz.get1sz();
int data[][]=sz.getjl();
int start=sz.getint(a,qsd);
int end=sz.getint(a,mdd);
System.out.println("start="+start);
System.out.println("end="+end);
temp=dijkstra(data, start,end);
// sj=shortPath1[end];
// System.out.println("sj="+shortPath1[end]);
System.out.println("temp="+temp);
temp=changword(temp);
System.out.println("temp=new="+changword(temp));
return temp;
}
public static int[] dijkstra(int[][] weight, int start) {
// 接受一个有向图的权重矩阵,和一个起点编号start(从0编号,顶点存在数组中)
// 返回一个int[] 数组,表示从start到它的最短路径长度
int n = weight.length; // 顶点个数
int[] shortPath = new int[n]; // 保存start到其他各点的最短路径
String[] path = new String[n]; // 保存start到其他各点最短路径的字符串表示
for (int i = 0; i < n; i++)
path[i] = new String("["+start+"]" + "-->[" + i+"]");
int[] visited = new int[n]; // 标记当前该顶点的最短路径是否已经求出,1表示已求出
// 初始化,第一个顶点已经求出
shortPath[start] = 0;
visited[start] = 1;
for (int count = 1; count < n; count++) { // 要加入n-1个顶点
int k = -1; // 选出一个距离初始顶点start最近的未标记顶点
int dmin = Integer.MAX_VALUE;
for (int i = 0; i < n; i++) {
if (visited[i] == 0 && weight[start][i] < dmin) {
dmin = weight[start][i];
k = i;
}
}
// 将新选出的顶点标记为已求出最短路径,且到start的最短路径就是dmin
shortPath[k] = dmin;
visited[k] = 1;
// 以k为中间点,修正从start到未访问各点的距离
for (int i = 0; i < n; i++) {
//如果 '起始点到当前点距离' + '当前点到某点距离' < '起始点到某点距离', 则更新
if (visited[i] == 0 && weight[start][k] + weight[k][i] < weight[start][i]) {
weight[start][i] = weight[start][k] + weight[k][i];
path[i] = path[k] + "-->[" + i+"]";
}
}
}
for (int i = 0; i < n; i++) {
System.out.println("||从" + start + "出发到" + i + "的最短路径为:" + path[i]+"");
}
System.out.println("=====================================");
return shortPath;
}
三、注意事项
1、管理员账号:admin密码:admin 数据库配置文件src\main\resources 下的 application.properties
2、开发环境为IDEA开发,数据库为mysql,使用java语言开发。
3、数据库文件名是jspssmwuliu.sql 系统名称jspssmwuliu
4、地址:login.jsp
四 系统实现
代码下载
https://download.csdn.net/download/qq_41221322/88955548
源码获取 下方联系卡片↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓