基于Springboot+RabbitMQ+redis实现的超市订单管理系统

到山东找蓝翔

发布日期: 2021-09-18 11:22:54 浏览量: 118
评分:
star_border star_border star_border star_border star_border star_border star_border star_border star_border star_border
*转载请注明来自write-bug.com

1 系统需求分析

超市订单管理系统是一个专为连锁店、超市等商业场所提供订单管理平台的系统。该系统的目标是建立一个订单管理平台,为需要合理规划超市供应链、供应商以及工作人员提供的便捷的平台。该系统的主要业务需求包括记录并维护某超市的供应商信息,以及该超市与供应商之间的交易订单信息,包括三种角色,系统管理员,经理,普通员工。

1.1 系统功能分析

本系统主要的功能是实现超市订单管理功能,以便为超市、连锁店提供以及其他负责人提供订单详情、联系方式等,系统的主要功能有以下五个方面:

  • 登录/注销:管理员可以在网站上登录浏览,离开时注销并退出

  • 订单管理:管理员可以浏览所有订单信息,并且通过点击查看了解订单详情信息

  • 供应商管理:管理员可以在网站浏览所有供应商信息,并在在与其他供应商达成合作之后,添加相关供应商信息,并且通过点击查看了解他们的联系方式等

  • 用户管理:管理员可以管理所有超市员工用户,对用户进行增删改查,对于离职或其他原因的未工作用户给予注销管理

  • 密码修改:管理员可对自己的账号密码进行修改,填写对应之前的正确密码以及新密码之后,即完成相关修改密码操作

  • 搜索功能:在以上管理界面中,均允许了管理员根据关键字进行搜索,要求搜索框中输入的字段必须完全包含在物品名称中,否则无法查询

1.2 系统功能需求

根据系统功能要求,该超市订单管理系统以管理员为中心的用户角色,可以将系统分解成几个模块来分别设计应用程序界面,如图 1.1所示。

1.3 系统性能需求

超市订单管理系统的开发是在Window10平台上,以Springboot+RabitMQ为架构,采用MySQL 作为数据库管理系统管理后台数据库。本系统是超市信息管理建设中必不可少的一部分,它实现了现代管理信息系统的大部分功能需要。使用本系统可以使超市管理更加方便快捷,合理的页面设计也使得这个用户充分享受到基于Internet管理信息系统的优越。本系统开发说明:

功能完备

在开发初期,查看了大量关于电子商务,管理信息系统,J2EE等方面的资料,同时借鉴了很多其他电子商务网站和管理信息的流程。经过总结,确定了满足需求分析的基本模块。系统总体设计上实现了整个系统模块的划分,系统主要包含5大模块,分别是:订单管理信息,供应商管理,用户管理,修改密码,登陆退出系统,基本上实现了综合管理系统的所有功能。

界面友好

系统用户登陆到管理页面后,每页有导航和引领的作用。系统具有自适应的能力,同时导航条方便快捷的引导用户进行各种合理的操作。

管理科学

本系统一开始就从管理学的角度做出了详细细致的考虑,后来有参考了电子商务管理等,最后才做出了系统总体设计,因此可以讲该系统是较为科学的。

系统的性能需求主要表现在数据库中的各个表需要频繁地被插入、删除以及更新。对于用户来说,系统地响应时间不宜太长,否则会降低用户体验。为此要求我们建立良好的表结构,加上足够的存储空间以及硬件性能。

2 可行性分析

2.1 研究前提

随着我国经济情况的日新月异,飞速发展,涌现出许许多多的超市和便利店。越来越多的人喜欢到超市购物,超市里销售的商品也呈现出多种多样的变化趋势。我们开发一个超市订单管理系统,它可以对仓储各环节实施全过程控制管理,对整个进货、退货、盘点等各个环节的规范化作业,控制整个过程的正常运行。去掉了手工书写票据和送到机房输入的步骤,解决库房信息陈旧滞后的弊病,方便了仓库管理人员对物品的放置和调配,提高了工作效率。

该系统容易被接受,具有简单易学性,便于管理等功能,是对超市订单管理的一种有效工具。

2.2 设计要求

2.2.1 安全性

超市订单管理增强对产品规范的审计,重点确定该项目中需要审计的产品。买家只能针对卖家允许公开的信息进行查阅。买家只享受对自己账号内数据的查阅权,与定后处理权,订货支付权,申请退货权,不允许偷窥其他人。卖家只能针对买家允许公开的信息进行查阅。卖家只享受对自己账号内数据的查阅权,发货权,退款相应处理权,不允许偷窥其他人。

2.2.2 系统性能

管理员登录查看超市供应商与超市员工用户管理,可以进行增、删、改、查等操作。超市订单系统可以使超市的管理趋于正规化、现代化和系统化。本项目的产品可以达到以下目标:

  • 提高工作效率,减少返工

  • 业务流程的流水线化

  • 符合相关标准和规则

  • 与目前的应用产品相比较,提高了可用性或减少了失效程度

2.2.3 可扩展性

所有信息呈现,操作完全由打开的网页呈现并完成。本系统所占有的是超市市场,它追求的是简单、易学、易用,能够更好地解决管理人员的负担,能够辅助超市有效的管理物品。对于订单管理系统的用户,可满足对订单管理的需求,且此种需求被接受并且满足,其系统便可以推广。

3 数据库设计

3.1 数据库需求分析

经过对超市管理系统的调查分析,得出用户的需求大致如下:

  • 管理员可以在系统中对订单、供应商以及用户进行增、删、改、查的处理

  • 管理员需要输入账号密码登录,并且可以增添新的管理员

如下是利用数据流图方法对数据库做需求分析:

第一步:由用户的需求,可以得到顶层数据流图如图

第二步:超市订单管理系统的第1层数据流图如图所示。

第三步:超市订单管理系统的第2层数据库流图——订单管理的细化数据流图如图所示。

第四步:超市订单管理系统的第2层数据流库——供应商管理的细化数据流图如图所示。

第五步:超市订单管理系统的第2层数据流库——用户管理的细化数据流图如图所示。

根据如上的数据流程图,可以列出以下记录超市订单管理所需的数据项和数据结构:

  • 管理员:管理员ID、管理员姓名、管理员密码、管理员性别、管理员角色、管理员出生日期、管理员电话、管理员住址

  • 订单:订单编码、商品名称、供应商名称、订单金额、是否付款

  • 供应商:供应商编码、供应商名称、联系人、联系电话、微信

3.2 数据库概念结构设计

本系统一共有用户、供应商、订单、角色、地址这五个基本实体。

管理员可以对应多个订单,而一个订单只能对应于一个管理员。管理员可以管理多个供应商,而一个供应商只能对应于一个管理员。一个供应商可以对应多条订单,但一条订单只能对应于一个供应商。此外,有一个用户对应一个角色,一个角色对应多个用户;一个地址对应多个订单,一个订单对应一个地址。数据库表之间的关系如下:

  • 用户:主键ID、用户编码、用户名称、用户密码、性别、出生日期、手机、地址、用户角色、创建者、创建时间、更新者、更新时间、用户头像、工作照

  • 账单:订单编号、订单编码、商品名称、商品描述、商品单位、商品数量、商品总额、是否支付、创建者、创建时间、更新者、更新时间、供应商ID

  • 供应商:供应商ID、供货商编码、供货商名称、供应商详细描述、供应商联系人、联系电话、地址、微信、创建者、创建时间、更新时间、更新者、营业执照、组织机构代码证

  • 地址:主键ID、联系人姓名、收货地址明细、邮编、联系人电话、创建者、创建日期、修改者、修改时间、用户ID

  • 角色:角色编号、角色编码、角色名称、创建者、创建时间、修改者、修改时间

3.2 表结构

用户表

权限表

供应商表

商品表

收货地址表

3.3 逻辑结构设计

4 各功能模块的设计与实现

4.1 系统开发条件

4.1.1 开发语言

系统使用的开发语言是Java。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统应用程序等。正是因为Java语言拥有如此诸多的优秀特性,所以我们选择了它作为开发超市订单管理系统,使得整个开发、调试过程更加高效。

4.1.2 开发框架

超市订单管理系统以Springboot架构作为支撑,分为表现层、业务层和持久层三层,实现后台数据更新。该架构由Spring MVC、Spring和MyBatis三个开源框架整合而成,用于开发结构合理,性能优越,代码健壮的应用程序,其次采用了消息中间件RabbitMQ和Redis做高并发缓存处理机制。

4.1.3 前端框架

由于本系统是Web应用,所以使用了HTML5+CSS3+JavaScript的方式实现前端页面。实现过程中参考了Bootstrap前端开发框架。Bootstrap是Twitter退出的一个用于前端开发的开源工具包。在设计前端页面时,参考了Bootstrap的相关开源代码。

4.1.4 集成开发环境

编程所使用的集成开发环境是Eclipse,是著名的跨平台的自由集成开发环境(IDE)。Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。本次系统便选用了Eclipse作为开发平台。

4.1.5 Web应用服务器

Tomcat由Apache、Sun和其他一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和JSP规范可以在Tomcat中得到体现。因为Tomcat技术先进、性能稳定,因而成为目前比较流行的Web应用服务器。本次系统选用的便是Tomcat作为应用服务器。

4.1.6 数据库管理系统

本系统使用的数据库管理系统是MySQL Community。MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发。在WEB应用方面,MySQL是最好的RDBMS (Relational Database Management System,关系数据库管理系统)应用软件。

系统中的数据库以及数据库中的所有关系模式都使用MySQL进行处理。

4.2 用户界面设计

完成数据库创建和功能说明以后,我们进行下一步工作,即设计用户界面,完成了系统要求的 5 项主要功能。

我们把超市订单管理系统的窗体分成5个主要部分,如下图所示。

订单管理

供应商管理

用户管理

修改密码

登录注销

4.3 功能模块说明

4.3.1 订单信息添加、查询、修改与删除

订单信息查看

为了对订单浏览信息,能够实现浏览的功能是十分必要的。管理员输入需要搜索的相应信息,点击查看按钮后系统将寻找到的数据展示到网页中。

订单信息添加

作为超市订单管理系统,订单信息的管理是很重要的。每当采购部门增加新的订单时,订单信息就要增加。超市也可能因为其它原因增加订单信息,订单添加模块都可以做出快捷的解决方案。管理员输入相应的信息,点击提交后系统将数据保存到数据库中。

订单信息修改

根据订单编号可以查询订单详细信息,然后修改订单的所有信息。系统从数据库中读取数据并显示到页面上,管理员修改数据后,点击修改按钮,系统将更新表中的数据。

订单信息删除

根据订单编号可以删除该订单的信息。管理员选择需要删除订单名称并点击删除按钮,系统将从数据库中删除相应数据。

订单信息查询

在成千上万种商品种,如果人为寻找某一个商品肯定是不可能的,只有通过商品信息查询模块才能为用户或管理人员解决这个难题。根据订单名称可以查询该订单的信息。管理员输入订单名称并点击查询按钮,系统将从数据库中查询相应的数据并显示到页面上。

4.3.2 供应商信息添加、查询、修改与删除

供应商查询界面

供应商查询界面提供了供应商的信息,可根据供应商名称的关键字进行筛选查询,并提供了添加供应商、查看供应商详细信息、修改供应商信息、删除供应商的功能。

供应商查看详情界面

在供应商查询界面点击具体供应商操作列表的查看按钮,可以查看供应商的具体信息,包括:供货商编码、供货商名称、详细描述、联系人、联系电话、地址、微信。

供应商修改页面

若供应商信息变动,管理员可通过供应商信息修改功能对供应商信息进行更新,更新后的数据将保存到数据库中。

商品供应商信息删除

企业倒闭或者经营策略的改变,当它对超市商品的供应没有作用时,商品供应商厂家信息的删除是正常的。管理员输入供应商名称查询数据表中的数据并显示到页面上,点击删除后系统将表中的相应数据删除。

供应商添加界面

与供应商达成交易后,管理员在供应商添加页面填写供应商具体信息,填写完毕点击提交,添加后的数据将保存到数据库中。

4.3.3 用户信息添加、查询、修改与删除

用户管理页面

通过输入用户名和身份查询用户。当不记得用户名的具体名字时,只输入用户名的其中一个字,会检索出所有带这个字的用户,方便管理员查询管理。点击右边链接添加用户,会连接到相关网页添加用户信息。点击操作里的查看、修改等可以进行相应的改、删、查操作。

用户信息删除

当企业员工离职时,或者经过一段时间后,会发现用户表中一些信息时无用的,用户删除模块可以解决这样的问题。

添加用户信息

填写用户相关信息,下面有两个按钮,可以选择重置或者提交。

修改密码

为了系统的安全,用户的应该只有用户个人才能修改,这不仅保证了整个公司的利益也保护了个人隐私。用户在输入相应的用户编号,填写旧密码以及新密码后,点击提交,重置密码成功。发现输入错误时,可以手动删除或者点击重置按钮,重新填写。

修改用户密码成功后,会弹出修改用户密码成功页面,如图所示。

4.3.4 登录/注销

输入用户名以及用户密码登录进入超市订单管理界面,可以查看管理信息。管理员可以对相关数据进行增、改、查等操作,也可以注销退出系统。

4.4 功能实现

部分代码

  1. @Controller
  2. public class Page_jump {
  3. //表示方法与请求URL的映射,这里映射/index请求
  4. @RequestMapping(value="/billadd",method = {RequestMethod.POST, RequestMethod.GET})
  5. public String billadd(){
  6. return "billadd";
  7. }
  8. @RequestMapping(value="/pwdmodify",method = {RequestMethod.POST, RequestMethod.GET})
  9. public String pwdmodify(){
  10. return "pwdmodify";
  11. }
  12. @RequestMapping(value="/provideradd",method = {RequestMethod.POST, RequestMethod.GET})
  13. public String provideradd(){
  14. return "provideradd";
  15. }
  16. @RequestMapping(value="/useradd",method = {RequestMethod.POST, RequestMethod.GET})
  17. public String useradd(Model model){
  18. model.addAttribute("user", new User());//这里给视图层提供了数据的对象,用来数据绑定
  19. return "useradd";
  20. }
  21. @RequestMapping(value="/pwdmodify.do",method = {RequestMethod.POST,RequestMethod.GET})
  22. public String index(){
  23. return "pwdmodify";
  24. }
  25. @RequestMapping(value="/pwdmodify.do",method = {RequestMethod.POST,RequestMethod.GET})
  26. public String index(){
  27. return "pwdmodify";
  28. }
  29. @RequestMapping(value="/pwdmodify.do",method = {RequestMethod.POST,RequestMethod.GET})
  30. public String index(){
  31. return "pwdmodify";
  32. }
  33. @RequestMapping(value="/pwdmodify.do",method = {RequestMethod.POST,RequestMethod.GET})
  34. public String index(){
  35. return "pwdmodify";
  36. }
  37. @RequestMapping(value="/pwdmodify.do",method = {RequestMethod.POST,RequestMethod.GET})
  38. public String index(){
  39. return "pwdmodify";
  40. }
  41. //@RequestMapping(value="/test2",method = {RequestMethod.POST,RequestMethod.GET})
  42. @RequestMapping(value="/index1")
  43. public ModelAndView index1(@RequestParam(value="username",required = false) String username){
  44. ModelAndView mav= new ModelAndView();
  45. mav.addObject("username",username);
  46. mav.setViewName("index");
  47. return mav;
  48. }
  49. @RequestMapping(value="/index2")
  50. public String index2(@RequestParam(value="username",required = false) String username, Model model){
  51. model.addAttribute("username",username);
  52. return "index2";
  53. }
  54. @RequestMapping(value="/index3")
  55. public String index3(@RequestParam(value="username",required = false) String username, Map<String,Object> model){
  56. model.put("username",username);
  57. return "index2";
  58. }
  59. }
  1. @Controller
  2. @Api("Provider验证接口")
  3. public class ProviderServlet {
  4. @Autowired
  5. BillServiceImpl billService;
  6. @Autowired
  7. ProviderServiceImpl providerService;
  8. @Autowired
  9. UserServiceImpl userService;
  10. @RequestMapping(value="/provider.do",method = {RequestMethod.POST, RequestMethod.GET})
  11. public String doPost(HttpServletRequest request, HttpServletResponse response, @RequestParam(value="method",required = false) String method)
  12. throws ServletException, IOException {
  13. if(method != null && method.equals("query")){
  14. return this.query(request,response);
  15. }else if(method != null && method.equals("add")){
  16. return this.add(request,response);
  17. }else if(method != null && method.equals("view")){
  18. return this.getProviderById(request,response,"providerview");
  19. }else if(method != null && method.equals("modify")){
  20. return this.getProviderById(request,response,"providermodify");
  21. }else if(method != null && method.equals("modifysave")){
  22. return this.modify(request,response);
  23. }else if(method != null && method.equals("delprovider")){
  24. this.delProvider(request,response);
  25. }
  26. return "error";
  27. }
  28. private void delProvider(HttpServletRequest request, HttpServletResponse response)
  29. throws ServletException, IOException {
  30. String id = request.getParameter("proid");
  31. HashMap<String, String> resultMap = new HashMap<String, String>();
  32. if(!StringUtils.isNullOrEmpty(id)){
  33. int flag = providerService.deleteProviderById(id);
  34. if(flag == 0){//删除成功
  35. resultMap.put("delResult", "true");
  36. }else if(flag == -1){//删除失败
  37. resultMap.put("delResult", "false");
  38. }else if(flag > 0){//该供应商下有订单,不能删除,返回订单数
  39. resultMap.put("delResult", String.valueOf(flag));
  40. }
  41. }else{
  42. resultMap.put("delResult", "notexit");
  43. }
  44. //把resultMap转换成json对象输出
  45. response.setContentType("application/json");
  46. PrintWriter outPrintWriter = response.getWriter();
  47. outPrintWriter.write(JSONArray.toJSONString(resultMap));
  48. outPrintWriter.flush();
  49. outPrintWriter.close();
  50. }
  51. private String modify(HttpServletRequest request, HttpServletResponse response)
  52. throws ServletException, IOException {
  53. String proContact = request.getParameter("proContact");
  54. String proPhone = request.getParameter("proPhone");
  55. String proAddress = request.getParameter("proAddress");
  56. String proFax = request.getParameter("proFax");
  57. String proDesc = request.getParameter("proDesc");
  58. String id = request.getParameter("id");
  59. Provider provider = new Provider();
  60. provider.setId(Integer.valueOf(id));
  61. provider.setProContact(proContact);
  62. provider.setProPhone(proPhone);
  63. provider.setProFax(proFax);
  64. provider.setProAddress(proAddress);
  65. provider.setProDesc(proDesc);
  66. provider.setModifyBy(((User)request.getSession().getAttribute(Constants.USER_SESSION)).getId());
  67. provider.setModifyDate(new Date());
  68. boolean flag = false;
  69. flag = providerService.modify(provider);
  70. System.out.println("--------flag="+flag);
  71. if(flag){
  72. return "redirect:/provider.do?method=query";
  73. }else{
  74. return "providermodify";
  75. }
  76. }
  77. private String getProviderById(HttpServletRequest request, HttpServletResponse response, String url)
  78. throws ServletException, IOException {
  79. String id = request.getParameter("proid");
  80. System.out.println("-------------"+id);
  81. if(!StringUtils.isNullOrEmpty(id)){
  82. Provider provider = null;
  83. provider = providerService.getProviderById(id);
  84. request.setAttribute("provider", provider);
  85. System.out.println("-------------"+id);
  86. return url;
  87. }
  88. return "error";
  89. }
  90. private String add(HttpServletRequest request, HttpServletResponse response)
  91. throws ServletException, IOException {
  92. String proCode = request.getParameter("proCode");
  93. String proName = request.getParameter("proName");
  94. String proContact = request.getParameter("proContact");
  95. String proPhone = request.getParameter("proPhone");
  96. String proAddress = request.getParameter("proAddress");
  97. String proFax = request.getParameter("proFax");
  98. String proDesc = request.getParameter("proDesc");
  99. Provider provider = new Provider();
  100. provider.setProCode(proCode);
  101. provider.setProName(proName);
  102. provider.setProContact(proContact);
  103. provider.setProPhone(proPhone);
  104. provider.setProFax(proFax);
  105. provider.setProAddress(proAddress);
  106. provider.setProDesc(proDesc);
  107. provider.setCreatedBy(((User)request.getSession().getAttribute(Constants.USER_SESSION)).getId());
  108. provider.setCreationDate(new Date());
  109. boolean flag = false;
  110. flag = providerService.add(provider);
  111. if(flag){
  112. return "redirect:/provider.do?method=query";
  113. }else{
  114. return "provideradd";
  115. }
  116. }
  117. private String query(HttpServletRequest request, HttpServletResponse response)
  118. throws ServletException, IOException {
  119. String queryProName = request.getParameter("queryProName");
  120. String queryProCode = request.getParameter("queryProCode");
  121. if(StringUtils.isNullOrEmpty(queryProName)){
  122. queryProName = "";
  123. }
  124. if(StringUtils.isNullOrEmpty(queryProCode)){
  125. queryProCode = "";
  126. }
  127. List<Provider> providerList = new ArrayList<Provider>();
  128. providerList = providerService.getProviderList(queryProName,queryProCode);
  129. request.setAttribute("providerList", providerList);
  130. request.setAttribute("queryProName", queryProName);
  131. request.setAttribute("queryProCode", queryProCode);
  132. return "providerlist";
  133. }
  134. }

5 实训总结

5.1 所遇困难

在实现本系统时遇到的困难主要体现在两个方面,一是系统的前端页面的设计,二是怎样Web与数据库实现交互。

系统前端页面的设计困难的解决是通过参考著名的前端框架Bootstrap实现的。Bootstrap框架提供了许多精美的组建、布局,还开放了源代码供参考。在此基础上我们还加入了一些利用JavaScript代码实现的美化效果,使得前端设计更加美观。

实体Web与数据库交互的解决得益于SSM框架的三层Spring MVC、Spring和MyBatis,能够分离处理数据库与Web层的视图,从而达到交互的目的。

此外,在编写后端的时候,变量的大小写、系统配置也是困难重重。好在,在反复编写之后,迅速熟悉的技巧,能够让页面自由切换。系统配置更是反复在网上求证,得以解决。

5.2 实验心得

这一次合作开发超市订单管理系统,从开始选择课题的困惑到最终完成了一个我们还算满意的作品,使我学到了很多东西。从设计数据库到编写后台代码,链接数据库,在网页上显示,令人印象深刻。反复查阅资料,启动Tomcat到凌晨0点,都是藏着对这次项目的努力。其实,从一开始选择哪个题目是否用SSM框架来开发我一直也犹豫过,像国内势头正旺的ThinkPHP,易学易用,完善的中文开发文档,遇到问题或者bug可以非常容易的在中文社区得到解答。但是我最后选择了SSM框架,不仅仅因为它广泛,而是我希望能够挑战自己。经过这一个周的磨练,我最大的收获除了学到了真正可以应用的知识外,更重要的是学会了项目合作开发的经验。

上传的附件 cloud_download 超市订单管理系统.docx ( 2.45mb, 1次下载 ) cloud_download SMBMS-SpringBoot-master.zip ( 424.52kb, 1次下载 )
error_outline 下载需要12点积分

发送私信

会冒泡的可乐

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