博主介绍:专注于Java(springboot ssm 等开发框架) vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作
☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟
我的博客空间发布了1500+毕设题目 方便大家学习使用
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人
更多项目地址 介绍 翰文编程CSDN博客
文末下方有源码获取地址 翰文编程-CSDN博客
4.1系统的总体设计
本系统是以B/S开发结构为基础进行设计和实现的,并且通过关键的开发技术,比如Java语言、SSM框架、MySQL数据库等技术,对系统的功能模块、后台管理模块等进行实现,系统功能实现后,用户可以通过使用浏览器,运行和使用系统。通过需求分析的相关内容,可以确定用户对于本系统的具体使用需求,进而规划出系统基本需要具备的功能模块。基于web的物流配送管理系统的使用对象主要分为管理员角色和用户角色,主要的功能需求包括用户管理、车辆信息管理、货物订单管理等。系统总体功能设计图如图4-1所示。
图4-1系统总体功能设计图
4.2数据库设计
4.2.1概念设计
MySQL数据库是免费的面向使用对象,其源代码对外也是公开发布的,也就是说设计人员在经过源代码设计人员的同意之后,就可以根据自身的一定需求,对相关代码进行使用和修改,由此极大的节约了软件开发成本[15]。而且,MySQL数据库占用极少的内存资源,系统与用户之间的交互性强,响应速度和运行速度也比较快,非常适用于中小型系统的开发和设计。从一定意义上说,MySQL数据库的使用价值是非常高的,其相关的语法语义也比较容易理解和掌握,因此本人使用MySQL数据库完成对相关的系统数据的存储和管控。数据库设计过程主要包括概念设计和逻辑设计两个阶段。其中,概念设计是逻辑设计的基础依据,逻辑设计是概念设计的具体实现。
概念设计阶段主要目的是将真实世界的工作任务转化为抽象世界的概念模型,通过设计实体-联系图(E-R图)的方式,来表示实际生活中的工作功能中的实体和属性[16]。这样一来,在物流配送管理系统中,就可以对每一个工作流程进行设计,进而实现对相关的用户信息传递和共享,并由此构建出与系统有关的实体及其属性。本阶段的设计内容是将现实世界中用户对系统的相关功能需求,描述成为便于数据库设计人员理解的概念模型。系统的各实体E-R图设计如图4-2、图4-3、图4-4、图4-5、图4-6、图4-7、图4-8、图4-9、图4-10、图4-11所示,总体E-R图设计如图4-12所示。
图4-2管理员信息E-R图
图4-3员工信息E-R图
图4-4客户信息E-R图
图4-5字典信息E-R图
图4-6车辆信息E-R图
图4-7货物信息E-R图
图4-8货物订单信息E-R图
图4-9出入库信息E-R图
图4-10出入库详情信息E-R图
图4-11公告信息E-R图
图4-12系统的总体E-R图
4.2.2逻辑设计
逻辑设计阶段主要的目的是将概念设计中已经构建好的概念数据模型,转变成数据库能够识别和存储的二维数据表格的形式[17]。本阶段的设计内容是数据库设计人员将理解好的概念模型,描述成为MySQL数据库能够识别的数据表格。本阶段具体的实现方式是将上一阶段设计的E-R图转变成方便数据库进行存储和管理的数据表格,具体的数据表格设计如表4-1、表4-2、表4-3、表4-4、表4-5、4-6、表4-7、表4-8、表4-9、4-10所示。
表4-1 管理员信息表
序号 |
列名 |
数据类型 |
说明 |
允许空 |
1 |
id |
Int |
编号 |
否 |
2 |
username |
String |
用户名 |
是 |
3 |
password |
String |
密码 |
是 |
4 |
role |
String |
角色 |
是 |
5 |
addtime |
Date |
新增时间 |
是 |
表4-2 员工信息表
序号 |
列名 |
数据类型 |
说明 |
允许空 |
1 |
id |
Int |
编号 |
否 |
2 |
yonghu_uuid_ number |
String |
工作证号 |
是 |
3 |
username |
String |
账户 |
是 |
4 |
password |
String |
密码 |
是 |
5 |
yonghu_name |
String |
员工姓名 |
是 |
6 |
yonghu_photo |
String |
头像 |
是 |
7 |
sex_types |
Integer |
性别 |
是 |
8 |
bumen_types |
Integer |
部门 |
是 |
9 |
yonghu_phone |
String |
联系方式 |
是 |
10 |
yonghu_id_number |
String |
员工身份证号 |
是 |
11 |
yonghu_email |
String |
邮箱 |
是 |
12 |
yonghu_address |
String |
居住地址 |
是 |
13 |
yonghu_time |
date |
出生年月 |
是 |
14 |
yonghu_delete |
Integer |
假删 |
是 |
15 |
create_time |
Date |
创建时间 |
是 |
表4-3 客户信息表
序号 |
列名 |
数据类型 |
说明 |
允许空 |
1 |
id |
Int |
编号 |
否 |
2 |
kehu_uuid_number |
String |
客户编号 |
是 |
3 |
kehu_gongshi |
String |
公司名称 |
是 |
4 |
kehu_address |
String |
公司地址 |
是 |
5 |
sex_types |
Integer |
性别 |
是 |
6 |
kehu_name |
String |
联系人 |
是 |
7 |
kehu_phone |
String |
联系方式 |
是 |
8 |
kehu_email |
String |
邮箱 |
是 |
9 |
kehu_delete |
Integer |
假删 |
是 |
10 |
create_time |
Date |
创建时间 |
是 |
表4-4 字典信息表
序号 |
列名 |
数据类型 |
说明 |
允许空 |
1 |
id |
Int |
编号 |
否 |
2 |
dic_code |
String |
字段 |
是 |
3 |
dic_name |
String |
字段名 |
是 |
4 |
code_index |
Integer |
编码 |
是 |
5 |
index_name |
String |
编码名字 |
是 |
6 |
super_id |
Integer |
父字段编号 |
是 |
7 |
beizhu |
String |
备注 |
是 |
8 |
create_time |
Date |
创建时间 |
是 |
表4-5 车辆信息表
序号 |
列名 |
数据类型 |
说明 |
允许空 |
1 |
id |
Int |
编号 |
否 |
2 |
cheliang_uuid_number |
String |
车辆编号 |
是 |
3 |
cheliang_name |
String |
车辆名称 |
是 |
4 |
cheliang_types |
Integer |
车辆类型 |
是 |
5 |
cheliang_number |
Integer |
车辆数量 |
是 |
6 |
cheliang_content |
String |
车辆详情 |
是 |
7 |
create_time |
Date |
创建时间 |
是 |
表4-6 货物信息表
序号 |
列名 |
数据类型 |
说明 |
允许空 |
1 |
id |
Int |
编号 |
否 |
2 |
goods_name |
String |
货物名称 |
是 |
3 |
goods_types |
Integer |
货物类型 |
是 |
4 |
goods_photo |
String |
货物图片 |
是 |
5 |
goods_kucun_number |
Integer |
货物数量 |
是 |
6 |
goods_money |
BigDecimal |
货物价格 |
是 |
7 |
goods_content |
String |
货物详情 |
是 |
8 |
create_time |
Date |
创建时间 |
是 |
表4-7货物订单信息表
序号 |
列名 |
数据类型 |
说明 |
允许空 |
1 |
id |
Int |
编号 |
否 |
2 |
goods_name |
String |
货物订单号 |
是 |
3 |
goods_id |
Integer |
货物 |
是 |
4 |
kehu_id |
Integer |
购买客户 |
是 |
5 |
cheliang_id |
Integer |
车辆 |
是 |
6 |
goods_order_number |
Integer |
购买数量 |
是 |
7 |
goods_order_shouhuoren |
String |
收货人 |
是 |
8 |
goods_order_phone |
String |
联系方式 |
是 |
9 |
goods_order_address |
String |
送货地点 |
是 |
10 |
goods_order_types |
Integer |
订单状态 |
是 |
11 |
create_time |
Date |
创建时间 |
是 |
表4-8出入库信息表
序号 |
列名 |
数据类型 |
说明 |
允许空 |
1 |
id |
Int |
编号 |
否 |
2 |
goods_churu_inout_uuid_number |
String |
出入库流水号 |
是 |
3 |
goods_churu_inout_name |
String |
出入库名称 |
是 |
4 |
goods_churu_inout_types |
Integer |
出入库类型 |
是 |
5 |
goods_churu_inout_content |
String |
备注 |
是 |
6 |
insert_time |
Date |
添加时间 |
是 |
7 |
create_time |
Date |
创建时间 |
是 |
表4-9出入库详情信息表
序号 |
列名 |
数据类型 |
说明 |
允许空 |
1 |
id |
Int |
编号 |
否 |
2 |
goods_churu_inout_ id |
Integer |
出入库 |
是 |
3 |
goods_id |
Integer |
货物 |
是 |
4 |
goods_churu_inout_list_number |
Integer |
操作数量 |
是 |
5 |
insert_time |
Date |
操作时间 |
是 |
6 |
create_time |
Date |
创建时间 |
是 |
表4-10公告信息表
序号 |
列名 |
数据类型 |
说明 |
允许空 |
1 |
id |
Int |
编号 |
否 |
2 |
news_name |
String |
公告标题 |
是 |
3 |
news_types |
Integer |
公告类型 |
是 |
4 |
news_photo |
String |
公告图片 |
是 |
5 |
insert_time |
Date |
公告时间 |
是 |
6 |
news_content |
String |
公告详情 |
是 |
7 |
create_time |
Date |
创建时间 |
是 |
第五章 系统实现
5.1个人中心
个人中心模块设计的主要目的是方便用户对个人信息进行管理,用户可以根据自己的实际需求,选择每隔一段时间,对个人账户的密码等相关信息进行更新操作,修改密码界面设计如图5-1所示,个人信息界面如图5-2所示。
图5-1修改密码界面
图5-2个人信息界面
5.2管理员管理
管理员管理模块设计的主要目的是方便管理用户对相关的管理员信息进行管理,管理用户可以选择查看管理员的用户名,修改管理员的密码,管理员管理界面设计如图5-3所示。
图5-3管理员管理界面
5.3员工管理
员工管理模块设计的主要目的是方便管理用户对相关的员工信息进行管理,管理用户可以选择查看员工的邮箱,修改员工的手机号码,员工管理界面设计如图5-4所示。
图5-4用户管理界面
5.4客户管理
客户管理模块设计的主要目的是方便管理用户对相关的客户信息进行管理,管理用户可以选择查看客户的邮箱,修改客户的手机号码,客户管理界面设计如图5-5所示。
图5-5客户管理界面
5.5车辆信息管理
车辆信息管理模块设计的主要目的是方便用户对相关的车辆信息进行管理,用户可以选择查看车辆的详细信息,修改车辆的名称,车辆信息管理界面设计如图5-6所示。
图5-6车辆信息管理界面
主要代码:
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){
logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永不会进入");
else if("员工".equals(role))
params.put("yonghuId",request.getSession().getAttribute("userId"));
if(params.get("orderBy")==null || params.get("orderBy")==""){
params.put("orderBy","id");
}
PageUtils page = cheliangService.queryPage(params);
//字典表数据转换
List<CheliangView> list =(List<CheliangView>)page.getList();
for(CheliangView c:list){
//修改对应字典表字段
dictionaryService.dictionaryConvert(c, request);
}
return R.ok().put("data", page);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id, HttpServletRequest request){
logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
CheliangEntity cheliang = cheliangService.selectById(id);
if(cheliang !=null){
//entity转view
CheliangView view = new CheliangView();
BeanUtils.copyProperties( cheliang , view );//把实体数据重构到view中
//修改对应字典表字段
dictionaryService.dictionaryConvert(view, request);
return R.ok().put("data", view);
}else {
return R.error(511,"查不到数据");
}
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody CheliangEntity cheliang, HttpServletRequest request){
logger.debug("save方法:,,Controller:{},,cheliang:{}",this.getClass().getName(),cheliang.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
if(false)
return R.error(511,"永远不会进入");
Wrapper<CheliangEntity> queryWrapper = new EntityWrapper<CheliangEntity>()
.eq("cheliang_uuid_number", cheliang.getCheliangUuidNumber())
.eq("cheliang_name", cheliang.getCheliangName())
.eq("cheliang_types", cheliang.getCheliangTypes())
.eq("cheliang_number", cheliang.getCheliangNumber())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
CheliangEntity cheliangEntity = cheliangService.selectOne(queryWrapper);
if(cheliangEntity==null){
cheliang.setCreateTime(new Date());
cheliangService.insert(cheliang);
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
/**
* 后端修改
*/
@RequestMapping("/update")
public R update(@RequestBody CheliangEntity cheliang, HttpServletRequest request){
logger.debug("update方法:,,Controller:{},,cheliang:{}",this.getClass().getName(),cheliang.toString());
String role = String.valueOf(request.getSession().getAttribute("role"));
// if(false)
// return R.error(511,"永远不会进入");
//根据字段查询是否有相同数据
Wrapper<CheliangEntity> queryWrapper = new EntityWrapper<CheliangEntity>()
.notIn("id",cheliang.getId())
.andNew()
.eq("cheliang_uuid_number", cheliang.getCheliangUuidNumber())
.eq("cheliang_name", cheliang.getCheliangName())
.eq("cheliang_types", cheliang.getCheliangTypes())
.eq("cheliang_number", cheliang.getCheliangNumber())
;
logger.info("sql语句:"+queryWrapper.getSqlSegment());
CheliangEntity cheliangEntity = cheliangService.selectOne(queryWrapper);
if(cheliangEntity==null){
cheliangService.updateById(cheliang);//根据id更新
return R.ok();
}else {
return R.error(511,"表中有相同数据");
}
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Integer[] ids){
logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
cheliangService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 批量上传
*/
@RequestMapping("/batchInsert")
public R save( String fileName, HttpServletRequest request){
logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
List<CheliangEntity> cheliangList = new ArrayList<>();//上传的东西
Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段
Date date = new Date();
int lastIndexOf = fileName.lastIndexOf(".");
if(lastIndexOf == -1){
return R.error(511,"该文件没有后缀");
}else{
String suffix = fileName.substring(lastIndexOf);
if(!".xls".equals(suffix)){
return R.error(511,"只支持后缀为xls的excel文件");
}else{
URL resource = this.getClass().getClassLoader().getResource("../../upload/" + fileName);//获取文件路径
File file = new File(resource.getFile());
if(!file.exists()){
return R.error(511,"找不到上传文件,请联系管理员");
}else{
List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
dataList.remove(0);//删除第一行,因为第一行是提示
for(List<String> data:dataList){
//循环
CheliangEntity cheliangEntity = new CheliangEntity();
// cheliangEntity.setCheliangUuidNumber(data.get(0)); //车辆编号 要改的
// cheliangEntity.setCheliangName(data.get(0)); //车辆名称 要改的
// cheliangEntity.setCheliangTypes(Integer.valueOf(data.get(0))); //车辆类型 要改的
// cheliangEntity.setCheliangNumber(Integer.valueOf(data.get(0))); //车辆数量 要改的
// cheliangEntity.setCheliangContent("");//详情和图片
// cheliangEntity.setCreateTime(date);//时间
cheliangList.add(cheliangEntity);
//把要查询是否重复的字段放入map中
//车辆编号
if(seachFields.containsKey("cheliangUuidNumber")){
List<String> cheliangUuidNumber = seachFields.get("cheliangUuidNumber");
cheliangUuidNumber.add(data.get(0));//要改的
}else{
List<String> cheliangUuidNumber = new ArrayList<>();
cheliangUuidNumber.add(data.get(0));//要改的
seachFields.put("cheliangUuidNumber",cheliangUuidNumber);
}
}
//查询是否重复
//车辆编号
List<CheliangEntity> cheliangEntities_cheliangUuidNumber = cheliangService.selectList(new EntityWrapper<CheliangEntity>().in("cheliang_uuid_number", seachFields.get("cheliangUuidNumber")));
if(cheliangEntities_cheliangUuidNumber.size() >0 ){
ArrayList<String> repeatFields = new ArrayList<>();
for(CheliangEntity s:cheliangEntities_cheliangUuidNumber){
repeatFields.add(s.getCheliangUuidNumber());
}
return R.error(511,"数据库的该表中的 [车辆编号] 字段已经存在 存在数据为:"+repeatFields.toString());
}
cheliangService.insertBatch(cheliangList);
return R.ok();
}
}
}
}catch (Exception e){
e.printStackTrace();
return R.error(511,"批量插入数据异常,请联系管理员");
}
5.6基础数据管理
基础数据管理模块设计的主要目的是方便用户对相关的部门、货物类型、公告类型信息进行管理,用户可以选择查看部门、货物类型、公告类型的详细信息,修改部门、货物类型、公告类型的名称,部门管理界面设计如图5-7所示,货物类型管理界面设计如图5-8所示,公告类型管理界面设计如图5-9所示。
图5-7部门管理界面
图5-8货物类型管理界面
大家点赞、收藏、关注、评论啦 其他的定制服务 下方联系卡片↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 或者私信作者