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

到山东找蓝翔

发布日期: 2021-09-09 09:18:07 浏览量: 117
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

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 工具类

  1. @Data
  2. public class JedisWrapper {
  3. public String host;
  4. public int port;
  5. public Jedis jedis = null;
  6. public Jedis getJedis(){
  7. if(jedis==null){
  8. jedis = new Jedis(host,port);
  9. }
  10. return jedis;
  11. }
  12. }

C3P0连接池配置

  1. @Component
  2. public class C3P0DataSourceFactory implements DataSourceFactory {
  3. @Qualifier("ds2")
  4. @Autowired
  5. DataSource dbcpDS;
  6. @Override
  7. public void setProperties(Properties props) { }
  8. @Override
  9. public DataSource getDataSource() {
  10. return dbcpDS;
  11. }
  12. }

3.2 业务代码

  1. /**
  2. * 用户注册
  3. * 情况1: 用户名已经被注册了
  4. * 情况2: 正常注册
  5. */
  6. @PostMapping(value = "/register")
  7. public Message register(@RequestBody UserDTO u, HttpServletResponse resp, HttpSession sess){
  8. log.info("this is userDTO: {}",u);
  9. Message msg = userService.addUser(u,resp,sess);
  10. return msg;
  11. }
  12. /**
  13. * 用户登录: 需要返回
  14. * 情况1: 用户名不存在
  15. * 情况2: 用户名存在, 但是密码错误
  16. * 情况3: 正确登录, 并注册一个session
  17. */
  18. @PostMapping(value = "/login")
  19. public Message login(@RequestBody UserDTO u, HttpServletResponse resp, HttpSession sess){
  20. log.info("请求登录的-userDTO: {}",u);
  21. Message msg = userService.checkUser(u, resp, sess);
  22. return msg;
  23. }
  24. /**
  25. * 添加用户: 前端发个请求看看用户是否登录
  26. * 情况1: 没有登录
  27. * 情况2: 已经登录
  28. */
  29. @RequestMapping(value = "/check")
  30. public Message check(HttpSession sess){
  31. Message msg = userService.checkStatus(sess);
  32. return msg;
  33. }
  34. /**
  35. * 添加用户: 前端发个请求注销
  36. */
  37. @RequestMapping(value = "/logout")
  38. public void logout(HttpSession sess){
  39. log.info("用户:{} 已经注销",sess.getAttribute("username"));
  40. sess.invalidate();
  41. }

订单业务

  1. /**
  2. * 用来测试的接口
  3. */
  4. @RequestMapping(value = "/test", produces = "application/json")
  5. public String test(@RequestBody String s){
  6. return "hello:"+s;
  7. }
  8. /**
  9. * 查询某个用户自己发起的订单
  10. */
  11. @RequestMapping(value = "/own", produces = "application/json")
  12. public List<SelfOrderVO> getOwnOrders(HttpSession sess){
  13. String username = (String)sess.getAttribute("username");
  14. if(username==null){
  15. log.warn("[查看我的订单] : session中没有用户名:还未登录");
  16. return null;
  17. }else{
  18. List<SelfOrderVO> orders = orderService.getOrdersByUsername(username);
  19. return orders;
  20. }
  21. }
  22. /**
  23. * 查询自己接的单子
  24. */
  25. @RequestMapping(value="/picked")
  26. public List<SelfPickedOrderVO> getOwnPickedOrders(HttpSession sess){
  27. String username = (String)sess.getAttribute("username");
  28. if(username==null){
  29. log.warn("[查看我的接单] : session中没有用户名:还未登录");
  30. return null;
  31. }else{
  32. List<SelfPickedOrderVO> orders = orderService.getPickedOrdersByUsername(username);
  33. return orders;
  34. }
  35. }
  36. /**
  37. * 提交订单
  38. */
  39. @PostMapping(value = "/commit")
  40. public Message commit(@RequestBody OrderDTO orderDTO, HttpSession sess){
  41. log.info("新订单为:{}",orderDTO);
  42. return orderService.addOrder(orderDTO,sess);
  43. }
  44. /**
  45. * 返回全部未接单的订单,在主页上显示
  46. */
  47. @CrossOrigin(origins = "*")
  48. @GetMapping(value = "/all")
  49. public List<CommonOrderVO> getAllUnpickOrders(){
  50. return orderService.getAllUnpickOrders();
  51. }
  52. /**
  53. * 获取订单详情
  54. */
  55. @GetMapping(value = "/detail")
  56. public DetailOrderVO getDetailOrder(@RequestParam("orderId") int orderId) throws JsonProcessingException {
  57. log.info("请求订单号:{} 的详细信息",orderId);
  58. return orderService.getDetailOrder(orderId);
  59. }
  60. /**
  61. * 接单:只需要改订单的状态
  62. */
  63. @RequestMapping(value = "/pick")
  64. public void pickOrder(@RequestParam("orderId") int orderId, HttpSession sess){
  65. orderService.pickOrder(orderId, sess);
  66. }
  67. /**
  68. * 接单者-取消接单:只需要改订单的状态
  69. */
  70. @RequestMapping(value = "/cancelPicked")
  71. public void cancelPickedOrder(@RequestParam("orderId") int orderId){
  72. orderService.cancelPickedOrder(orderId);
  73. }
  74. /**
  75. * 接单者-确认送达
  76. */
  77. @RequestMapping(value = "/confirmPicked")
  78. public void confirmPickedOrder(@RequestParam("orderId") int orderId){
  79. orderService.confirmPickedOrder(orderId);
  80. }
  81. /**
  82. * 下单者-取消订单
  83. */
  84. @RequestMapping(value = "/cancel")
  85. public void cancelOrder(@RequestParam("orderId") int orderId){
  86. orderService.cancelOrder(orderId);
  87. }
  88. /**
  89. * 下单者-确认完成
  90. */
  91. @RequestMapping(value = "/confirmCompleted")
  92. public void confirmOrder(@RequestParam("orderId") int orderId){
  93. orderService.confirmOrder(orderId);
  94. }

3.3 文件上传

  1. @RestController
  2. @CrossOrigin
  3. public class FileController {
  4. @RequestMapping("/upload")
  5. public String upload(@RequestParam("file") MultipartFile file){
  6. if (file.isEmpty()) {
  7. return "上传失败,请选择文件";
  8. }
  9. String fileName = file.getOriginalFilename();
  10. String filePath = "C:/Users/wyz/Desktop/";
  11. File dest = new File(filePath + fileName);
  12. try {
  13. file.transferTo(dest);
  14. log.info("上传成功");
  15. return "上传成功";
  16. } catch (IOException e) {
  17. log.error(e.toString(), e);
  18. }
  19. return "上传失败!";
  20. }
  21. }

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修改数据,才会使一级缓存失效。

所以怎么禁用一级缓存呢?

配置文件

  1. mybatis:
  2. configuration:
  3. cache-enabled: false #禁用二级缓存
  4. local-cache-scope: session #一级缓存指定为session级别
  5. local-cache-scope: statement #一级缓存指定为statement级别, 相当于禁用一级缓存

手动清除

  1. session.clearCache();

4.项目展示

登录

首页

接单

发起订单

个人中心

购物车

上传的附件 cloud_download 设计文档.docx ( 974.30kb, 1次下载 ) cloud_download DeliveryTakiingSystem-master.zip ( 8.29mb, 1次下载 )
error_outline 下载需要12点积分

发送私信

会冒泡的可乐

107
文章数
12
评论数
最近文章
eject