基于Springboot和Redis实现的快递代取系统
1.项目简介
本项目基于springboot框架开发而成,前端采用bootstrap和layer框架开发,系统功能完整,界面简洁大方,比较适合做毕业设计使用。
本项目主要实现了代取快递的信息管理功能,使用角色有三类:一是客户可以直接访问系统下单,输入代取快递的相关信息,并可以在系统中查询订单的完成进度,也可以对系统进行相应的反馈并查询反馈的回复情况。也可以直接在线支付代取费用。二是接单员,可以登陆系统进行接单,并根据自己的订单完成情况修改订单状态,查询自己的订单等。三是系统管理员,可以实现对人员和订单信息的管理,对反馈信息的回复等操作。
1.1 开发运行环境
-
开发工具 :IDEA / ECLIPSE
-
MYSQL : 5.7
-
JDK :1.8
-
Maven : 3.3.9
-
后台技术 :Spring boot+ SpringMVC + MyBatisPlus,连接池采用 Druid,安全框架使用 Shiro,缓存使用redis
-
前台技术 :Bootstrap + layer 实现
1.2 需求分析
学生下订单,代领人员接单,以学生给的取货码、姓名、电话、宿舍号等信息,代领人代领快递后送至宿舍,学生付款,代领人收款,结束订单。
-
学生需要填写订单,包括姓名、电话、取货码、宿舍号、快递单号等。需要方便的查看自己的订单信息,包括下单时间、订单价格、签收时间、快递单号、快递内容、代领信息、付款方式等。同时能够确认每一单是否收到等问题,如果包裹出现问题,可以及时联系到代领人
-
代领人需要接订单,并且知道订单的信息,包括姓名、电话、取货码、宿舍号、快递单号等。需要方便的查看自己完成的订单情况,包括每一单的收入及时间、下单信息等,同时能够确认每一单是否正常收款,如果未收到付款,可以及时联系到下单的学生
1.3 数据流图
-
1数据项名 :学生姓名;类型:字符型;长度:20
-
2数据项名 :学生电话号码;类型:字符型;长度:11
-
3数据项名 :学生宿舍号;类型:字符型;长度:10
-
4数据项名 :订单号;类型:字符型;长度:20
-
5数据项名 :付款方式;类型:字符型;长度:20
-
6数据项名 :备注;类型:字符型;长度:100
-
7数据项名 :代领人姓名;类型:字符型;长度:20
-
8数据项名 :代领人电话号;类型:字符型;长度:11
-
9数据项名 :收款方式;类型:字符型;长度:20
-
10数据项名 :快递单号;类型:字符型;长度:20
-
11数据项名 :下单时间;类型:字符型;长度:20
-
12数据项名 :签收时间;类型:字符型;长度:20
-
13数据项名 :取货码;类型:字符型;长度:10
-
14数据项名 :价格;类型:字符型;长度:3
-
15数据项名 :快递内容;类型:字符型;长度:100
2.数据库设计
2.1 表结构
用户表
订单表
2.2 E-R图
3.项目开发
3.1 工具类
java
@Data
public class JedisWrapper {
public String host;
public int port;
public Jedis jedis = null;
public Jedis getJedis(){
if(jedis==null){
jedis = new Jedis(host,port);
}
return jedis;
}
}
C3P0连接池配置
java
@Component
public class C3P0DataSourceFactory implements DataSourceFactory {
@Qualifier("ds2")
@Autowired
DataSource dbcpDS;
@Override
public void setProperties(Properties props) { }
@Override
public DataSource getDataSource() {
return dbcpDS;
}
}
3.2 业务代码
```java /* * 用户注册 * 情况1: 用户名已经被注册了 * 情况2: 正常注册 / @PostMapping(value = "/register") public Message register(@RequestBody UserDTO u, HttpServletResponse resp, HttpSession sess){ log.info("this is userDTO: {}",u); Message msg = userService.addUser(u,resp,sess); return msg; }
/* * 用户登录: 需要返回 * 情况1: 用户名不存在 * 情况2: 用户名存在, 但是密码错误 * 情况3: 正确登录, 并注册一个session / @PostMapping(value = "/login") public Message login(@RequestBody UserDTO u, HttpServletResponse resp, HttpSession sess){
log.info("请求登录的-userDTO: {}",u);
Message msg = userService.checkUser(u, resp, sess);
return msg;
} / * 添加用户: 前端发个请求看看用户是否登录 * 情况1: 没有登录 * 情况2: 已经登录 */ @RequestMapping(value = "/check") public Message check(HttpSession sess){ Message msg = userService.checkStatus(sess); return msg; } / * 添加用户: 前端发个请求注销 */ @RequestMapping(value = "/logout") public void logout(HttpSession sess){ log.info("用户:{} 已经注销",sess.getAttribute("username")); sess.invalidate(); } ```
订单业务
java
/**
* 用来测试的接口
*/
@RequestMapping(value = "/test", produces = "application/json")
public String test(@RequestBody String s){
return "hello:"+s;
}
/**
* 查询某个用户自己发起的订单
*/
@RequestMapping(value = "/own", produces = "application/json")
public List<SelfOrderVO> getOwnOrders(HttpSession sess){
String username = (String)sess.getAttribute("username");
if(username==null){
log.warn("[查看我的订单] : session中没有用户名:还未登录");
return null;
}else{
List<SelfOrderVO> orders = orderService.getOrdersByUsername(username);
return orders;
}
}
/**
* 查询自己接的单子
*/
@RequestMapping(value="/picked")
public List<SelfPickedOrderVO> getOwnPickedOrders(HttpSession sess){
String username = (String)sess.getAttribute("username");
if(username==null){
log.warn("[查看我的接单] : session中没有用户名:还未登录");
return null;
}else{
List<SelfPickedOrderVO> orders = orderService.getPickedOrdersByUsername(username);
return orders;
}
}
/**
* 提交订单
*/
@PostMapping(value = "/commit")
public Message commit(@RequestBody OrderDTO orderDTO, HttpSession sess){
log.info("新订单为:{}",orderDTO);
return orderService.addOrder(orderDTO,sess);
}
/**
* 返回全部未接单的订单,在主页上显示
*/
@CrossOrigin(origins = "*")
@GetMapping(value = "/all")
public List<CommonOrderVO> getAllUnpickOrders(){
return orderService.getAllUnpickOrders();
}
/**
* 获取订单详情
*/
@GetMapping(value = "/detail")
public DetailOrderVO getDetailOrder(@RequestParam("orderId") int orderId) throws JsonProcessingException {
log.info("请求订单号:{} 的详细信息",orderId);
return orderService.getDetailOrder(orderId);
}
/**
* 接单:只需要改订单的状态
*/
@RequestMapping(value = "/pick")
public void pickOrder(@RequestParam("orderId") int orderId, HttpSession sess){
orderService.pickOrder(orderId, sess);
}
/**
* 接单者-取消接单:只需要改订单的状态
*/
@RequestMapping(value = "/cancelPicked")
public void cancelPickedOrder(@RequestParam("orderId") int orderId){
orderService.cancelPickedOrder(orderId);
}
/**
* 接单者-确认送达
*/
@RequestMapping(value = "/confirmPicked")
public void confirmPickedOrder(@RequestParam("orderId") int orderId){
orderService.confirmPickedOrder(orderId);
}
/**
* 下单者-取消订单
*/
@RequestMapping(value = "/cancel")
public void cancelOrder(@RequestParam("orderId") int orderId){
orderService.cancelOrder(orderId);
}
/**
* 下单者-确认完成
*/
@RequestMapping(value = "/confirmCompleted")
public void confirmOrder(@RequestParam("orderId") int orderId){
orderService.confirmOrder(orderId);
}
3.3 文件上传
java
@RestController
@CrossOrigin
public class FileController {
@RequestMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file){
if (file.isEmpty()) {
return "上传失败,请选择文件";
}
String fileName = file.getOriginalFilename();
String filePath = "C:/Users/wyz/Desktop/";
File dest = new File(filePath + fileName);
try {
file.transferTo(dest);
log.info("上传成功");
return "上传成功";
} catch (IOException e) {
log.error(e.toString(), e);
}
return "上传失败!";
}
}
3.4 开发日志
3.4.1 自定义Message码
错误码
-
1 登录:用户名不存在
-
2 登录:密码错误
-
3 注册:用户名已存在
-
4 检查session:用户还未登录
正确码
-
1 登录成功
-
2 注册成功
-
3 用户已经登录
3.4.2 自定义订单状态
-
0:未接单 unpick
-
1:已接单 pick
-
2:已送达 arrived
-
3:已完成 completed
-
4:已取消 canceled
-
5:已中止 terminated
3.4.3 后端接收ajax数据
今天遇到了一个很坑爹的问题:jquery的ajax传给后端的数据springboot居然接收不到
servlet接收ajax
因为springboot本质上是基于servlet的,所以看一下servlet接收ajax是什么样子的。
用ajax的前端代码如下:
正常用表单提交的方法如下:
后端代码如下:
用ajax发数据,结果如下:(好像第二行最前面少了一个问号?不知道表单提交的有没有)
正常表单提交,结果如下:
第二行为null是因为流只能读取一次。
修改以下后端代码,看看用表单提交的话InputStream是什么样的:
输出!
fuck!我一开始还以为是最前面少了个问号的关系,结果正常用表单提交最前面也是没有问号的
这个问题我没找到解决方法(似乎只能自己解析InputStream了?)
ajax那边不管data的数据有没有加上JSON.stringify()都不行。
山穷水尽疑无路 ,柳暗花明又一村
我又回头搜了一下springboot和ajax,有了重大发现:
springboot接收ajax
==注意画红框的这个类,这个类是需要可序列化的!!!==
==前端传json时,需要加上JSON.Stringify==
3.4.4 ajax获取后端返回的数据
又碰到一个坑。。。
按理说ajax这么写就行了,我还特意加了 async:false 来取消异步
结果前端执行的是error函数。。。
后来发现:
前端设置了希望后端发来的类型(dataType:"application/json")
但是后端没有设置返回类型
把dataType删了就行!
3.4.5 mybatis一级缓存的禁用
因为mybatis有一级缓存,作同一个查询时,会复用上次的结果,自己通过cmd操作mysql(修改表中的数据),不会使缓存失效,只有通过mybatis修改数据,才会使一级缓存失效。
所以怎么禁用一级缓存呢?
配置文件
yaml
mybatis:
configuration:
cache-enabled: false #禁用二级缓存
local-cache-scope: session #一级缓存指定为session级别
local-cache-scope: statement #一级缓存指定为statement级别, 相当于禁用一级缓存
手动清除
java
session.clearCache();
4.项目展示
登录
首页
接单
发起订单
个人中心
购物车
参考文献
- 基于SpringBoot的下沉市场交易平台的设计与实现(安徽大学·贾志勇)
- 基于Spring Cloud微服务架构的乡村物流系统设计与实现(华中科技大学·江文民)
- 邮政快递包裹收寄业务管理系统的设计与实现(山东大学·卢潇)
- 基于MVC模式的仓储管理信息系统的研究与实现(吉林大学·王磊)
- 第三方物流仓储管理系统的设计与实现(国防科学技术大学·田海利)
- 物流管理系统的设计与实现(吉林大学·王琪)
- 基于B/S结构的物流企业管理信息系统的设计(电子科技大学·宋东泽)
- 邮政快递包裹收寄业务管理系统的设计与实现(山东大学·卢潇)
- 基于J2EE的库存管理系统的设计与实现(吉林大学·孟兴业)
- 邮政快递包裹收寄业务管理系统的设计与实现(山东大学·卢潇)
- 基于B/S结构的物流企业管理信息系统的设计(电子科技大学·宋东泽)
- 基于轻量级J2EE的物流信息系统的设计与实现(同济大学·詹先保)
- 基于Android的快递派送系统的研究与实现(华北电力大学(北京)·侯进斌)
- 第三方物流仓储管理系统的设计与实现(东北大学·吴梦佳)
- 第三方物流仓储管理系统的设计与实现(东北大学·吴梦佳)
本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:代码海岸 ,原文地址:https://m.bishedaima.com/yuanma/35524.html