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

基于Springboot+RabbitMQ+redis实现的超市订单管理系统 1 系统需求分析 超市订单管理系统是一个专为连锁店,超市等商业场所提供订单管理平台的系统

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

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

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 功能实现

部分代码

java @Controller public class Page_jump { //表示方法与请求URL的映射,这里映射/index请求 @RequestMapping(value="/billadd",method = {RequestMethod.POST, RequestMethod.GET}) public String billadd(){ return "billadd"; } @RequestMapping(value="/pwdmodify",method = {RequestMethod.POST, RequestMethod.GET}) public String pwdmodify(){ return "pwdmodify"; } @RequestMapping(value="/provideradd",method = {RequestMethod.POST, RequestMethod.GET}) public String provideradd(){ return "provideradd"; } @RequestMapping(value="/useradd",method = {RequestMethod.POST, RequestMethod.GET}) public String useradd(Model model){ model.addAttribute("user", new User());//这里给视图层提供了数据的对象,用来数据绑定 return "useradd"; } @RequestMapping(value="/pwdmodify.do",method = {RequestMethod.POST,RequestMethod.GET}) public String index(){ return "pwdmodify"; } @RequestMapping(value="/pwdmodify.do",method = {RequestMethod.POST,RequestMethod.GET}) public String index(){ return "pwdmodify"; } @RequestMapping(value="/pwdmodify.do",method = {RequestMethod.POST,RequestMethod.GET}) public String index(){ return "pwdmodify"; } @RequestMapping(value="/pwdmodify.do",method = {RequestMethod.POST,RequestMethod.GET}) public String index(){ return "pwdmodify"; } @RequestMapping(value="/pwdmodify.do",method = {RequestMethod.POST,RequestMethod.GET}) public String index(){ return "pwdmodify"; } //@RequestMapping(value="/test2",method = {RequestMethod.POST,RequestMethod.GET}) @RequestMapping(value="/index1") public ModelAndView index1(@RequestParam(value="username",required = false) String username){ ModelAndView mav= new ModelAndView(); mav.addObject("username",username); mav.setViewName("index"); return mav; } @RequestMapping(value="/index2") public String index2(@RequestParam(value="username",required = false) String username, Model model){ model.addAttribute("username",username); return "index2"; } @RequestMapping(value="/index3") public String index3(@RequestParam(value="username",required = false) String username, Map<String,Object> model){ model.put("username",username); return "index2"; } }

```java @Controller @Api("Provider验证接口") public class ProviderServlet { @Autowired BillServiceImpl billService; @Autowired ProviderServiceImpl providerService; @Autowired UserServiceImpl userService;

@RequestMapping(value="/provider.do",method = {RequestMethod.POST, RequestMethod.GET}) public String doPost(HttpServletRequest request, HttpServletResponse response, @RequestParam(value="method",required = false) String method) throws ServletException, IOException { if(method != null && method.equals("query")){ return this.query(request,response); }else if(method != null && method.equals("add")){ return this.add(request,response); }else if(method != null && method.equals("view")){ return this.getProviderById(request,response,"providerview"); }else if(method != null && method.equals("modify")){ return this.getProviderById(request,response,"providermodify"); }else if(method != null && method.equals("modifysave")){ return this.modify(request,response); }else if(method != null && method.equals("delprovider")){ this.delProvider(request,response); } return "error"; } private void delProvider(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String id = request.getParameter("proid"); HashMap resultMap = new HashMap (); if(!StringUtils.isNullOrEmpty(id)){

     int flag = providerService.deleteProviderById(id);
     if(flag == 0){//删除成功
        resultMap.put("delResult", "true");
     }else if(flag == -1){//删除失败
        resultMap.put("delResult", "false");
     }else if(flag > 0){//该供应商下有订单,不能删除,返回订单数
        resultMap.put("delResult", String.valueOf(flag));
     }
  }else{
     resultMap.put("delResult", "notexit");
  }
  //把resultMap转换成json对象输出
  response.setContentType("application/json");
  PrintWriter outPrintWriter = response.getWriter();
  outPrintWriter.write(JSONArray.toJSONString(resultMap));
  outPrintWriter.flush();
  outPrintWriter.close();

} private String modify(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String proContact = request.getParameter("proContact"); String proPhone = request.getParameter("proPhone"); String proAddress = request.getParameter("proAddress"); String proFax = request.getParameter("proFax"); String proDesc = request.getParameter("proDesc"); String id = request.getParameter("id"); Provider provider = new Provider(); provider.setId(Integer.valueOf(id)); provider.setProContact(proContact); provider.setProPhone(proPhone); provider.setProFax(proFax); provider.setProAddress(proAddress); provider.setProDesc(proDesc); provider.setModifyBy(((User)request.getSession().getAttribute(Constants.USER_SESSION)).getId()); provider.setModifyDate(new Date()); boolean flag = false; flag = providerService.modify(provider); System.out.println("--------flag="+flag); if(flag){ return "redirect:/provider.do?method=query"; }else{ return "providermodify"; } } private String getProviderById(HttpServletRequest request, HttpServletResponse response, String url) throws ServletException, IOException { String id = request.getParameter("proid"); System.out.println("-------------"+id); if(!StringUtils.isNullOrEmpty(id)){ Provider provider = null; provider = providerService.getProviderById(id); request.setAttribute("provider", provider); System.out.println("-------------"+id); return url; } return "error"; } private String add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String proCode = request.getParameter("proCode"); String proName = request.getParameter("proName"); String proContact = request.getParameter("proContact"); String proPhone = request.getParameter("proPhone"); String proAddress = request.getParameter("proAddress"); String proFax = request.getParameter("proFax"); String proDesc = request.getParameter("proDesc"); Provider provider = new Provider(); provider.setProCode(proCode); provider.setProName(proName); provider.setProContact(proContact); provider.setProPhone(proPhone); provider.setProFax(proFax); provider.setProAddress(proAddress); provider.setProDesc(proDesc); provider.setCreatedBy(((User)request.getSession().getAttribute(Constants.USER_SESSION)).getId()); provider.setCreationDate(new Date()); boolean flag = false; flag = providerService.add(provider); if(flag){ return "redirect:/provider.do?method=query"; }else{ return "provideradd"; } } private String query(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String queryProName = request.getParameter("queryProName"); String queryProCode = request.getParameter("queryProCode"); if(StringUtils.isNullOrEmpty(queryProName)){ queryProName = ""; } if(StringUtils.isNullOrEmpty(queryProCode)){ queryProCode = ""; } List providerList = new ArrayList (); providerList = providerService.getProviderList(queryProName,queryProCode); request.setAttribute("providerList", providerList); request.setAttribute("queryProName", queryProName); request.setAttribute("queryProCode", queryProCode); return "providerlist"; } } ```

5 实训总结

5.1 所遇困难

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

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

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

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

5.2 实验心得

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

参考文献

  • 基于SSM框架的订制农产品流通平台的设计与实现(华中科技大学·李鹏)
  • 基于J2EE的网上生鲜超市系统设计与实现(北京工业大学·孙媛媛)
  • 基于SSM框架的订制农产品流通平台的设计与实现(华中科技大学·李鹏)
  • 基于Spring Cloud微服务架构的乡村物流系统设计与实现(华中科技大学·江文民)
  • 基于SSM框架的订制农产品流通平台的设计与实现(华中科技大学·李鹏)
  • 基于J2EE的订单管理系统的设计与实现(北京邮电大学·周伟)
  • 基于Spring Cloud微服务架构的乡村物流系统设计与实现(华中科技大学·江文民)
  • 超市信息管理系统设计与实现(山东大学·王一君)
  • 基于J2EE的订单管理系统的设计与实现(北京邮电大学·周伟)
  • 基于J2EE与JBPM的物流管理系统的设计与实现(北京工业大学·谷江帆)
  • 重客隆连锁超市商贸管理信息系统的设计与实现(电子科技大学·吕丁)
  • 基于SSM框架的订制农产品流通平台的设计与实现(华中科技大学·李鹏)
  • 基于SSM的宠物店信息系统的设计与实现(吉林大学·杨华)
  • 基于SSM框架的订制农产品流通平台的设计与实现(华中科技大学·李鹏)
  • 基于Java的超市管理软件系统的设计与实现(黑龙江大学·聂兆慈)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:代码项目助手 ,原文地址:https://m.bishedaima.com/yuanma/35529.html

相关推荐

发表回复

登录后才能评论