基于Springboot和Redis实现的快递代取系统

基于Springboot和Redis实现的快递代取系统 1,项目简介 本项目基于springboot框架开发而成,前端采用bootstrap和layer框架开发

本文包含相关资料包-----> 点击直达获取<-------

基于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://bishedaima.com/yuanma/35524.html

相关推荐

发表回复

登录后才能评论