基于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
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
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