1绪论

1.1研究背景与意义

超市属于零售业的重要形式,超市经营的好坏直接影响着人们的生活是否方便、商品流通的费用多少等问题。传统的超市是依靠人工来记录和使用电话联系的方式来销售产品的一种模式,在这期间所有的商品的信息都被记载在纸制的台帐上,还有的则是放在各种各样的电子表格内。当商品品种超过1000种的时候,手工盘点就变得费时费力了,在这样的情况下,采购决策是没有库存数据作为依据的。过期的商品如果不及时下架就会侵害消费者的权益,缺货的情况不断会出现影响到顾客的满意程度。有关的研究显示,生鲜农产品的损耗率一直很高,并且同它的信息系统的不发达有着密切联系[1]。在数字化转型的背景之下,永辉超市这样的一家大型零售企业就利用自己的供应链成本管理软件取得了很大的效果[2]。但是中小规模的超市由于资金以及技术人才等各方面的原因不能部署企业资源计划系统。现有的解决方法既过大又过重,一方面使员工工作很累,另一方面只针对收款端做事情不全面考虑进销存的协调。根据数据进行库存管理,可以减少存货量过大或者过小造成缺货、积压的现象[3]。开发出专门针对中小型超市的轻量化管理软件系统,把商品的信息、库存情况、采购和销售等各种业务的数据放入到一个平台上,并且对这个系统的使用提出新的要求。

本文所设计的系统有很好的应用价值。系统把分散的商品信息集中起来管理了,经营用户的任何时刻都可以查看到商品的价格以及库存的数量,摆脱纸质版账本带来的低效率工作局面。采购入库时自动更新库存信息,销售出库时会扣减库存量,退货流程又能够修正库存情况,形成一个闭环系统来消除由于手工记账而造成的信息不符问题。商品过期时间、剩余保质期的自动计算功能可以使得超市在临期的商品被处理掉的时候减少损失。系统给予的销售记录统计功能,能使商家清楚知道各种商品实际卖出了多少,在此基础之上作出有关采购的打算改进措施。管理员设置好经营用户操作的边界之后就不用担心会出错或者超越权限了。促使小规模的超市由过去的经验管理方式转变为现在的以数据为基础的经营方式,从而提高整个行业的信息化程度。模块化设计的思想可以应用到便利店、专卖店等其他的零售企业当中去,并且会产生比较广泛的经济社会效益。

1.2国内外研究现状

国内关于超市的管理信息化研究,是从单机软件开始发展的,并逐步走向了网络化系统的发展道路。早期阶段的小型超市都是用Excel表格来记载商品的信息以及进进出出的数据,但是随着数据的增长,在查询的时候会遇到许多问题,并且无法实现资源共享的目的。刘雅静提出用数据做库存管理的方法,根据销售历史和库存周转率改进补货计划给中小型超市作出建议[3]。贺文明对连锁超市日用品供应商管理工作进行研究时,认为创建好的供应商评价制度可以有效地节约购买费用[4]。蒙玉艳对于永辉超市的数字化转型做了研究,在供应链的成本管理效果评价上提出应该有多个维度的指标来支持[5]。陈冠中用供应链的角度来研究营运资金的管理问题,认为存货周转率和资金的占用是有关系的[6]。崔万新根据OPM战略提出营运资金管理的对策来检验信息化系统对于改善应付账款和存货周转的效果[7]。以上诸多研究给超市管理系统功能的设计赋予了理论支撑,不过大部分结果是集中于规模较大的连锁店,并没有直接对个体经营性的超市做过轻量化系统的调查。

国外的超市管理信息系统起得比国内要早,并且技术上更加成熟,数据集成方面更深一步。LuY所提超市管理信息系统结构中包括了销售终端的数据以及后台库存数据之间需要保持实时同步的情况[8]。费奥、波罗托是用社会学的角度来分析逆向超市管理中回收效益的,找到了废弃物品管理同存货控制之间的联系[9]。Zhang Y C为校园在线超市系统创建了一个网上超市管理系统,并对其进行了测试[10]。Kmiecinski和Iocco发现,对于超市的管理者来说接受了一些营养学知识的学习之后,在生鲜的品种上会做出更加合理的安排[11]。Qiang和Hong-yu对大型超市的疏散安全做出评价,在他们看来通道布置以及商品陈列都会影响到应急响应的效果[12]。国外的研究把超市的管理由原来的单纯关注进销存发展到对食品安全、顾客行为分析、供应链协同等各方面的重视。从信息化系统所取得的效果来看,不只是速度上的提高,在深层次上就是创建出依靠数据来进行精细化经营的数据驱动型组织管理模式。

1.3主要研究内容

本文主要的工作就是设计和实现一个小型超市管理系统的开源软件,这个系统使用的是SpringBoot框架来完成开发的。根据需求进行经营用户的职能和管理员的职责范围的划分,并列出商品管理、库存流转、采购销售等一系列的操作流程。系统架构设计阶段选择了前后端分离的方式,前端用的是Vue框架来实现页面的渲染以及交互的操作,而后端是通过SpringBoot来处理业务上的请求,并且对数据库进行数据存储。数据库的设计按照规范化的原则,创建了商品信息表、库存信息表、采购入库表、采购退货表、销售出库表、退货入库表、销售记录表以及经营用户表等主要的数据表。功能模块的实现分为注册登录、商品类型管理、商品信息管理、库存盘点、采购入库、退货等,销售出库和退货入库、销售记录查询等。管理员模块除了基本的功能之外,还会有一个新的角色权限管理的功能。系统测试使用的是黑盒测试的方法来检验各个功能模块的业务规则是否一致、有没有问题。本研究只关注到中小规模的超市日常经营中所存在的状况,对于像大超市这样有多个分店,并且会涉及到供应链金融服务之类的大型企业,则是不在其考察范围之内的。最后形成一个可以运行的系统原型、数据库的设计说明书和测试报告。整个研究的过程是按照需求分析,架构设计,详细设计,编码实现和系统测试这样一条线路展开的。

2相关技术介绍

2.1SpringBoot框架

SpringBoot是在Spring生态的基础上创建的,有着自动配置的功能从而使得项目的初期设置变得简单化了。开发人员在项目中添加了某种场景的启动依赖后,框架就会依照类路径里存在哪个依赖库就产生哪段配置代码的方式,自动创建起来。这样就使得使用spring来构建系统变得简单了。库存管理场景下,SpringBoot端收到前端传入的入库信息之后会进行业务逻辑的处理并调用数据访问接口来进行数据库操作。框架内含有Servlet容器,打包出来的JAR文件可以直接运行。控制层的组件用注解来标识请求映射路径,服务层的组件实现主要的业务规则,数据访问层的组件给出数据库的操作方法[13]。三层结构的划分让代码的责任范围清楚了。SpringBoot自动配置原理就是通过条件化的注解来实现的,当框架启动的时候会去扫描类路径上的配置类,在判断之后才会产生具体的Bean实例。属性配置文件可以进行多个环境的切换,在开发的时候用application-dev.yml,正式发布的时候用application-prod.yml。它还有健康检查和监控端点可以用来看系统的运行情况。SpringBoot在请求响应的时候会把前端传过来的json自动绑定到控制器方法的参数上,然后处理完之后就会把结果转成json格式并加以输出。

2.2Vue框架

Vue是构建用户界面的一种渐进式框架,主要的库是用来处理视图层的。这个框架使用的是依赖追踪的方式进行响应式的系统,当数据的状态发生改变的时候,就会由视图层来完成更新并进行渲染。组件化的开发方式把页面分成了一个个可以复用的小块,每一个小块都是一个独立的组件包含自己的模板样式和交互逻辑。Vue 在销售记录查询的时候会去渲染商品列表、绑定筛选条件的输入框以及查询按钮被点击时触发的操作。框架的指令系统具有声明式的数据绑定能力,并且使用双花括号语法把数据对象的属性写入到了DOM节点里,利用v-bind指令可以动态地改变HTML属性的值。虚拟DOM减少了对真实的DOM节点进行直接操作的次数,在内存中存有一棵虚拟的DOM树,并用差分算法来计算最小化的修改区间[14]。路由管理用到的是Vue Router库来定义路径和组件之间的对应关系,使单个页面应用可以进行视图的切换。状态管理使用了Vuex的方案,把各个组件所要使用的数据都放在一个store中进行统一的管理。Vue生命周期钩子函数使得开发人员可以在组件创建时,挂载的时候,在更新的时候,在销毁之前都去执行我们的自己想做的事情。框架学习曲线比较平坦,小规模项目的开发速度有较大的优势。

2.3MySQL数据库

MySQL是种关系型的数据库管理软件,是以2维表格的形式把数据存入到其中。表格是由行和列组成的,每列都有一定的数据类型及其对应的取值范围。结构化的查询语言可以进行数据的插入,修改和删除以及检索。事务机制保证一组数据库操作是并行执行的或者不执行,如果其中有一项失败就都取消[15]。超市管理系统的数据库MySQL是用来存放商品信息、库存记录、采购单据等业务数据的。数据库的设计符合范式理论的要求,可以避免数据的重复出现以及更新的时候出现问题。主键约束保证了每一行都有唯一的标识,外键约束保证了表之间有参照完整性的关系。索引可以加快查询的操作速度,B+树索引来解决范围查询和精确匹配的问题。InnoDB存储引擎是行级锁,多个写操作并发执行的时候冲突小。连接查询是从多个关联的表中获取数据,比如查询某一经营用户的所有的采购入库记录,则要联系上经营用户和采购入库这两个表。视图可以把复杂的查询变成一个虚拟表,从而使得应用程序的查询变得简单化。触发器是在一定的数据操作事件出现的时候,就自动地去执行一个事先预定好的逻辑的机制,在这种情况下可以进行自动的更新库存统计字段。备份和恢复可以防止由于数据丢失所造成的损失。

2.4MyBatis框架

MyBatis是种持久层框架,把JDBC操作的细粒度抽象出来。开发人员创建XML映射文件或者用注解的方式把数据访问接口的方法和对应的SQL语句联系起来。框架在执行SQL语句的时候会自动对参数进行设置,在查询结果集被映射成Java对象的时候也会有相应的操作进行[16]。把数据库的操作和业务逻辑的代码解耦了。在商品信息管理功能里,MyBatis发出的条件查询语句是从数据库当中过滤出那些满足了这些条件的商品,并且把结果呈现成一组商品信息的对象实体。框架可以创建动态的SQL语句,当传入的参数中不包含某个查询条件时才会拼接上这个条件。结果映射机制对数据库字段名和实体类属性名之间的映射关系进行处理,使用下划线命名风格的字段名会被转换成驼峰命名风格的属性名。一级缓存默认开启,在一个SqlSession里面执行相同的查询语句就会得到缓存的结果,避免了多次到数据库去取数据。二级缓存通过 SqlSession 共享,在映射文件中开启即可。批量操作就是把多个SQL语句组合成一条然后发送到数据库里去提高数据的插入速度。当项目使用MyBatis和SpringBoot进行集成的时候,只要添加了MyBatis Spring Boot Starter的依赖之后就会默认创建好SqlSessionFactory并且自动扫描到所有的mapper类。插件机制可以使得在SQL执行时加入一些自定义的拦截代码,分页插件是在SQL外面加上一个计数查询和分页限制的语句。

3系统分析

3.1可行性分析

3.1.1技术可行性

系统使用SpringBoot框架来创建后端服务,此框架具有自动配置和依赖注入的特点,从而降低了项目的创建难度。前端使用vue框架做页面的交互,采用组件化的开发方式可以提高代码的复用性。MySQL数据库完成数据的存储工作,并且能够进行事务处理以及复杂的查询。这三者已经在不少中小规模的WEB项目中得到了证实,而且具有比较成熟的生态体系以及活跃的社区。开发环境采用的是IntelliJ IDEA集成的工具,Maven用来对项目做构建以及依赖方面的管理。系统的运行环境只有Java的运行环境以及MySQL的服务,没有其他的中间件。技术选型与目前主流的开发方式相符合,开发人员有相应的开发经验,遇到的问题不大。

3.1.2操作可行性

系统界面设计符合一般的web应用交互标准,在左侧的导航栏中列出所有的功能菜单,在右侧的内容区里是操作界面。经营用户注册审核通过之后就可以登录使用了,新用户不需要特别的培训就懂得基本的操作逻辑。商品信息管理用表单提交的方式进行,输入的字段都有相应的文字说明。库存管理模块有根据商品名称和类型进行查询的功能,并以表格的形式按照页数的方式呈现出来。采购入库和销售出库的操作使用了独立的页面,数量、日期字段分别用数值输入法或者日期选择器组件来实现。系统对重要的操作设置了二次确认的弹窗来避免用户因为不小心而造成的错误。管理员角色主要是进行用户的审核和角色的分配,其操作过程也很简单明了。

3.1.3经济可行性

系统开发所用到的软件工具都是免费或者社区版的,IntelliJ IDEA使用社区版的授权,MySQL和Navicat可以以免费途径得到。硬件上使用的是可以完成基本功能的个人计算机,不需要购买专门的服务器设备。系统部署的时候可以租用云服务器,一开始选用低配的也可以满足小型超市的正常使用。维护成本主要是域名续费和云服务器的费用,每个月都在合理的范围内。与每年数万到十几万元的授权费相比,使用自己建立起来的系统进行经营的运营成本要低得多。开发投入的人力成本是单位时间内的一种固定成本,系统一上线就可以为多家超市的各个门店提供服务。

3.2功能需求分析

UML用例图是一种用于描述系统功能和用户交互的建模工具,通过角色与用例的关系展示系统在不同场景下的行为。用例图能够直观表现系统边界,明确外部参与者与系统之间的交互方式。参与者代表不同用户群体或外部系统,用例则体现系统提供的功能或服务。该图在需求分析阶段具有重要作用,能够帮助开发者识别核心功能,避免遗漏关键需求。通过图形化表示,用例图便于沟通与理解,为后续的系统设计与实现提供依据。本文将对系统按照角色模块进行需求分析。

3.2.1经营用户功能需求

经营用户在注册并登录之后,就会进入到系统的主界面当中。商品类型管理可以添加新的商品分类、已有的类型也可以进行编辑或者删除。商品信息管理模块用来录入商品的名称和售价,在采购、销售的过程中会用到这些信息。库存信息管理显示出了所有的商品现在的库存量、过期日期以及剩余的保质期等状况,并且可以针对各种商品进行检索或者依据商品名称及种类来进行寻找。采购入库操作中选择商品后输入采购数量和日期,系统会自动把该商品的库存量加上采购的数量。采购退货操作是对已经入库的货物进行退货扣减处理,退货的数量不得大于实际的采购量。销售出库操作扣减商品库存的同时也产生销售记录。退货入库操作是对已经销售出去的商品进行退货,使库存增加的一种操作。根据输入的时间区间可以得到之前所有的销售明细。经营用户的用例图如图3-1所示。

图3-1 经营用户用例图

3.2.2管理员功能需求

管理员在此基础上增加了一个角色管理的模块。角色管理功能维护系统用户的组信息,有管理员组的权限和用户分配。管理员对新注册的经营用户账号进行审核,设置好账号的状态是可用还是冻结。商品类型管理模块里管理员可看到所有的经营用户所创建的分类,有需要的时候会统一更改。商品信息管理、库存信息管理给出的是一个全局的视角,管理员可以浏览到所有的超市经营数据,而不是局限于某一个账号。采购入库、采购退货、销售出库、退货入库、销售记录等各模块都有跨经营用户查询的权限。管理员对系统的基础数据进行管理,保证所有的用户在使用的时候都是按照规定的操作方式进行的。管理员用例图如下图3-2所示。

图3-2 管理员用例图

3.3非功能需求分析

1.可用性需求

可用性方面,系统需要具备稳定的响应速度,保证在高并发访问场景下仍能保持界面加载的流畅性。系统需支持多平台访问,确保用户在不同终端均能获得一致的使用体验。系统需提供清晰的界面布局和直观的交互逻辑,降低操作难度。系统需支持持续的性能优化与功能扩展,保证在运行周期内保持较高的可用率。

2.可靠性需求

可靠性方面,系统需具备自动化容错机制,在出现局部故障时能够维持核心功能的正常运行。系统需支持数据备份与恢复策略,确保在异常情况下数据不丢失。系统需提供冗余设计,提高服务连续性。系统需具备运行监控与日志追踪功能,实现对运行状态的实时检测与问题定位。

3.安全性需求

安全性方面,系统需具备访问控制机制,确保不同角色用户在权限范围内进行操作。系统需提供身份认证与数据加密功能,保障传输与存储过程中的信息安全。系统需配置入侵检测与防护措施,降低潜在攻击风险。系统需支持日志审计,保证操作行为可追溯,满足合规性要求。

4系统设计

4.1系统架构设计

系统使用了前后端分离的B/S架构方式。用户用浏览器访问前端页面的时候,是由Vue框架搭建起来的一个单页面应用来完成交互的渲染工作。用户操作产生HTTP请求,后端的SpringBoot框架接收到这个请求之后就调用了业务逻辑层来完成相应的处理。业务逻辑层是商品管理、库存计算、采购入库这些核心的规则,数据访问层就是使用mybatis和mysql进行交互的。前端和后端的数据交互是以json格式进行的,接口是用restful风格来定义的。这样就减少了各个模块之间的依赖程度,使得前后端分别处理自己的部分工作。系统在Java虚拟机上运行,内部使用了Tomcat容器来响应网络请求。使用Maven来管理项目的依赖关系、控制所有的第三方库的版本号[17]。系统架构图如下图4-1所示。

图4-1 系统架构图

4.2系统结构功能设计

系统是以两种用户身份建立功能模块的。经营用户注册登录之后就可以进行商品类型的添加和编辑、商品的添加和编辑以及超市商品的基础数据维护工作了。库存信息管理模块可以查看到现在的库存数量,还有过期时间和剩余保质期这些主要的信息。采购入库会增加库存的数量,采购退货会扣减库存的数量。销售出库操作降低库存并且产生销售记录,退货入库操作当顾客退货时会重新把库存恢复。销售记录管理模块有历史交易查询的的功能。管理员在经营用户的功能上又增加了角色管理的功能,可以对用户组进行设置,并可以审核账号的创建和使用情况。管理员可以对所有的经营用户进行全局的监控,可以看到所有的超市的库存和采购、销售的情况。系统的功能结构如图4-2所示。

图4-2 系统功能结构图

4.3系统流程设计

4.3.1系统总体业务流程设计

经营用户提交注册信息后等待管理员审核。审核通过的账号可登录系统。用户首先在商品类型管理模块建立分类体系,再录入具体商品信息。采购人员办理采购入库,填写采购数量与日期,系统增加对应商品的库存量。发生退货时办理采购退货,库存数量相应减少。销售环节办理销售出库,扣减库存的同时生成销售记录。顾客退货时办理退货入库,库存数量恢复。库存信息模块实时展示各商品的库存状态与保质期数据。系统总体业务流程如图4-3所示。

图4-3 系统总体业务流程图

4.3.2采购入库流程设计

经营用户从商品列表中选择需要采购的商品。系统校验商品是否存在,不存在则提示先完成商品信息录入。用户填写采购数量与采购日期,系统检查数量是否为有效数值。采购入库操作触发库存更新机制,在库存信息表中增加对应商品的库存数量。系统记录采购入库单据,包含经营用户、超市名称、商品信息、采购数量、采购日期等数据。采购入库流程如图4-4所示。

图4-4 采购入库流程图

4.3.3销售出库流程设计

经营用户选择待销售的商品,系统展示当前库存量供参考。用户填写销售数量与销售日期,系统校验出库数量不超过当前库存。校验通过后扣减库存信息表中的商品库存字段。系统生成销售记录,记录销售数量、销售价格、销售总额。销售总额根据销售数量与售价自动计算。销售出库流程如图4-5所示。

图4-5 销售出库流程图

4.3.4采购退货流程设计

经营用户从采购入库记录中选择需要退货的单据。系统展示该次采购的原始数量与已退货数量。用户填写退货数量,系统校验退货数量不超过可退货额度。校验通过后执行库存扣减操作。系统生成采购退货记录,关联原始采购入库单据。采购退货流程如图4-6所示。

图4-6 采购退货流程图

4.3.5退货入库流程设计

经营用户从销售记录中选择需要退货的销售单据。系统展示该次销售的原始出库信息。用户填写退货数量与退货日期,系统校验退货数量不超过原始销售数量。校验通过后执行库存增加操作,恢复商品库存。系统生成退货入库记录,关联原始销售出库单据。退货入库流程如图4-7所示。

图4-7 退货入库流程图

4.4数据库设计

数据库设计是在系统规划阶段,根据业务需求将现实世界中的实体、属性及关系抽象为数据模型的过程。设计者首先识别并定义实体及其属性,确定主键与外键关联,建立符合范式要求的逻辑结构;随后结合性能目标,选择字段类型、索引策略、分区方案及存储引擎,形成可直接部署的物理结构,以保证数据完整性、查询效率与未来可扩展性[18]

4.4.1E-R图设计

实体图是一种以图形化方式呈现业务要素及其关联的数据建模工具,用于在数据库设计阶段将需求转化为结构化的可视化表达。它通过节点对应业务实体,边对应实体间的关联关系,并在节点内列出关键属性,直观展示数据模型全貌,帮助快速识别冗余、厘清依赖,为后续逻辑设计与物理实现提供清晰蓝图。以下将展示系统的全局实体图及各主要实体的属性图[19]

系经营用户实体主要包括经营用户ID、超市名称、用户姓名、用户电话等属性。实体属性图如图4-8所示。

图4-8 经营用户实体属性图

商品类型实体主要包括商品类型ID、经营用户、商品类型、创建时间等属性。实体属性图如图4-9所示。

图4-9 商品类型实体属性图

商品信息实体主要包括商品信息ID、经营用户、商品名称、商品售价等属性。实体属性图如图4-10所示。

图4-10 商品信息实体属性图

库存信息实体主要包括库存信息ID、经营用户、商品名称、商品库存、过期时间等属性。实体属性图如图4-11所示。

图4-11 库存信息实体属性图

采购入库实体主要包括采购入库ID、经营用户、商品名称、采购数量、采购日期等属性。实体属性图如图4-12所示。

图4-12 采购入库实体属性图

采购退货实体主要包括采购退货ID、经营用户、商品名称、退货数量、退货日期等属性。实体属性图如图4-13所示。

图4-13 采购退货实体属性图

销售出库实体主要包括销售出库ID、经营用户、商品名称、出库数量、出库日期等属性。实体属性图如图4-14所示。

图4-14 销售出库实体属性图

退货入库实体主要包括退货入库ID、经营用户、商品名称、退货数量、退货日期等属性。实体属性图如图4-15所示。

图4-15 退货入库实体属性图

销售记录实体主要包括销售记录ID、经营用户、商品名称、销售数量、销售总额等属性。实体属性图如图4-16所示。

图4-16 销售记录实体属性图

供应商信息实体主要包括供应商信息ID、经营用户、商品名称、供应商名称、供应商电话等属性。实体属性图如图4-17所示。

图4-17 供应商信息实体属性图

系统E-R图如图4-18所示。

图4-18 系统E-R图

4.4.2数据库表设计

数据库表设计是根据业务需求,确定数据库表的结构、字段类型及其关系。通过规范化设计,保证数据的完整性、一致性与效率,同时避免冗余数据,并为后续的数据查询、存储和维护提供清晰的框架[19]。以下是系统的数据库表设计展示。

经营用户表主要用来存储超市经营者账号信息。主要包括经营用户ID、超市名称、用户姓名、用户电话等字段。如表4-1所示。

表4-1 经营用户表

序号

字段名

类型

长度

是否非空

是否主键

备注

1

经营用户ID

int

11

经营用户ID

2

超市名称

varchar

64

超市名称

3

用户姓名

varchar

64

用户姓名

4

用户电话

varchar

64

用户电话

商品类型表主要用来存储商品分类信息。主要包括商品类型ID、经营用户、商品类型、创建时间等字段。如表4-2所示。

表4-2 商品类型表

序号

字段名

类型

长度

是否非空

是否主键

备注

1

商品类型ID

int

11

商品类型ID

2

经营用户

int

11

经营用户

3

商品类型

varchar

64

商品类型

4

创建时间

datetime

-

创建时间

商品信息表主要用来存储商品基础数据。主要包括商品信息ID、经营用户、商品名称、商品售价等字段。如表4-3所示。

表4-3 商品信息表

序号

字段名

类型

长度

是否非空

是否主键

备注

1

商品信息ID

int

11

商品信息ID

2

经营用户

int

11

经营用户

3

商品名称

varchar

64

商品名称

4

商品售价

double

-

商品售价

库存信息表主要用来存储商品实时库存数据。主要包括库存信息ID、经营用户、商品库存、过期时间等字段。如表4-4所示。

表4-4 库存信息表

序号

字段名

类型

长度

是否非空

是否主键

备注

1

库存信息ID

int

11

库存信息ID

2

经营用户

int

11

经营用户

3

商品库存

double

-

商品库存

4

过期时间

date

-

过期时间

采购入库表主要用来记录商品采购信息。主要包括采购入库ID、经营用户、采购数量、采购日期等字段。如表4-5所示。

表4-5 采购入库表

序号

字段名

类型

长度

是否非空

是否主键

备注

1

采购入库ID

int

11

采购入库ID

2

经营用户

int

11

经营用户

3

采购数量

double

-

采购数量

4

采购日期

date

-

采购日期

采购退货表主要用来记录商品退货信息。主要包括采购退货ID、经营用户、退货数量、退货日期等字段。如表4-6所示。

表4-6 采购退货表

序号

字段名

类型

长度

是否非空

是否主键

备注

1

采购退货ID

int

11

采购退货ID

2

经营用户

int

11

经营用户

3

退货数量

double

-

退货数量

4

退货日期

date

-

退货日期

销售出库表主要用来记录商品销售信息。主要包括销售出库ID、经营用户、出库数量、出库日期等字段。如表4-7所示。

表4-7 销售出库表

序号

字段名

类型

长度

是否非空

是否主键

备注

1

销售出库ID

int

11

销售出库ID

2

经营用户

int

11

经营用户

3

出库数量

double

-

出库数量

4

出库日期

date

-

出库日期

退货入库表主要用来记录顾客退货信息。主要包括退货入库ID、经营用户、退货数量、退货日期等字段。如表4-8所示。

表4-8 退货入库表

序号

字段名

类型

长度

是否非空

是否主键

备注

1

退货入库ID

int

11

退货入库ID

2

经营用户

int

11

经营用户

3

退货数量

double

-

退货数量

4

退货日期

date

-

退货日期

销售记录表主要用来存储历史销售数据。主要包括销售记录ID、经营用户、销售数量、销售总额等字段。如表4-9所示。

表4-9 销售记录表

序号

字段名

类型

长度

是否非空

是否主键

备注

1

销售记录ID

int

11

销售记录ID

2

经营用户

int

11

经营用户

3

销售数量

double

-

销售数量

4

销售总额

double

-

销售总额

供应商信息表主要用来存储供应商资料。主要包括供应商信息ID、经营用户、供应商名称、供应商电话等字段。如表4-10所示。

表4-10 供应商信息表

序号

字段名

类型

长度

是否非空

是否主键

备注

1

供应商信息ID

int

11

供应商信息ID

2

经营用户

int

11

经营用户

3

供应商名称

varchar

64

供应商名称

4

供应商电话

varchar

64

供应商电话

5系统实现

5.1经营用户角色功能实现

5.1.1注册登录功能

注册功能主要是对超市经营者身份信息进行采集与账号创建。用户填写账号、密码、昵称、邮箱、超市名称、用户姓名、用户电话等信息后提交注册请求。系统校验账号是否已被占用,检查密码与确认密码的一致性,验证邮箱格式的合法性。校验通过后系统创建用户账户记录,将账号状态设置为待审核。登录功能接收用户输入的账号与密码,系统比对数据库中的加密密码,匹配成功后生成临时访问令牌返回给前端。注册登录界面如图5-1所示。

图5-1 注册登录界面

核心代码如下:

@PostMapping("/register")

public Result register(@RequestBody RegisterDto registerDto) {

    QueryWrapper<User> queryWrapper = new QueryWrapper<>();

    queryWrapper.eq("username", registerDto.getUsername());

    if (userService.count(queryWrapper) > 0) {

        return Result.error("账号已被占用");

    }

    if (!registerDto.getPassword().equals(registerDto.getConfirmPassword())) {

        return Result.error("两次输入的密码不一致");

    }

    User user = new User();

    user.setUsername(registerDto.getUsername());

    user.setPassword(BCrypt.hashpw(registerDto.getPassword(), BCrypt.gensalt()));

    user.setNickname(registerDto.getNickname());

    user.setEmail(registerDto.getEmail());

    user.setState(0);

    userService.save(user);

    return Result.success();

}

5.1.2商品类型管理功能

商品类型管理功能主要是对商品分类信息进行维护操作。经营用户可以添加新的商品类型,输入类型名称后系统将其存储到商品类型表中。已有类型支持编辑修改操作,修改后的类型名称会同步影响该类型下商品的展示分类。删除类型时系统检查该类型下是否关联商品信息,存在关联商品时阻止删除操作并提示用户先处理关联商品。商品类型管理界面如图5-2所示。

图5-2 商品类型管理界面

核心代码如下:

@DeleteMapping("/delete/{id}")

public Result delete(@PathVariable Integer id) {

    QueryWrapper<ProductInformation> wrapper = new QueryWrapper<>();

    wrapper.eq("product_type", id);

    if (productInformationService.count(wrapper) > 0) {

        return Result.error("该类型下存在商品信息,无法删除");

    }

    boolean removed = productTypeService.removeById(id);

    return removed ? Result.success() : Result.error("删除失败");

}

5.1.3商品信息管理功能

商品信息管理功能主要是对商品基础属性进行录入与维护。经营用户填写商品名称与商品售价,商品名称在系统内保持唯一性约束。已录入的商品支持信息更新,商品售价修改后销售出库环节使用最新价格计算销售总额。商品信息列表提供分页展示与条件搜索功能,用户按商品名称模糊查询快速定位目标商品。商品信息管理界面如图5-3所示。

图5-3 商品信息管理界面

核心代码如下:

@PostMapping("/add")

public Result add(@RequestBody ProductInformation product) {

    QueryWrapper<ProductInformation> wrapper = new QueryWrapper<>();

    wrapper.eq("product_name", product.getProductName());

    if (productInformationService.count(wrapper) > 0) {

        return Result.error("商品名称已存在");

    }

    product.setCreateTime(LocalDateTime.now());

    productInformationService.save(product);

    InventoryInformation inventory = new InventoryInformation();

    inventory.setNameOfCommodity(product.getProductName());

    inventory.setProductInventory(0.0);

    inventoryService.save(inventory);

    return Result.success();

}

5.1.4库存信息管理功能

库存信息管理功能主要是对当前库存状态进行查询与监控。经营用户按商品名称或商品类型筛选库存记录,系统以表格形式展示商品库存数量、过期时间、剩余保质期等数据。剩余保质期由系统根据过期时间与当前日期自动计算并展示。商品库存低于预设阈值时系统在列表中高亮显示,提醒用户及时补货。库存信息管理界面如图5-4所示。

图5-4 库存信息管理界面

核心代码如下:

@GetMapping("/list")

public Result list(@RequestParam(required = false) String productName) {

    List<InventoryInformation> list = inventoryService.list();

    for (InventoryInformation item : list) {

        if (item.getExpirationTime() != null) {

            LocalDate now = LocalDate.now();

            LocalDate expire = item.getExpirationTime();

            long days = ChronoUnit.DAYS.between(now, expire);

            item.setRemainingShelfLife((double) days);

            if (days <= 3 && days > 0) {

                item.setProductStatus("临期预警");

            }

        }

    }

    return Result.success(list);

}

5.1.5采购入库管理功能

采购入库管理功能主要是对商品采购过程进行记录与库存更新。经营用户从商品列表中选择需要采购的商品,系统自动带出商品名称与商品类型信息。用户填写采购数量与采购日期,系统校验采购数量为大于零的有效数值。提交后系统保存采购入库单据,同步增加库存信息表中对应商品的库存数量。采购入库管理界面如图5-5所示。

图5-5 采购入库管理界面

核心代码如下:

@Transactional

@PostMapping("/add")

public Result add(@RequestBody ProcurementAndWarehousing procurement) {

    if (procurement.getPurchaseQuantity() <= 0) {

        return Result.error("采购数量必须大于零");

    }

    procurement.setCreateTime(LocalDateTime.now());

    procurementAndWarehousingService.save(procurement);

    QueryWrapper<InventoryInformation> wrapper = new QueryWrapper<>();

    wrapper.eq("name_of_commodity", procurement.getNameOfCommodity());

    InventoryInformation inventory = inventoryService.getOne(wrapper);

    if (inventory != null) {

        Double newQuantity = inventory.getProductInventory() + procurement.getPurchaseQuantity();

        inventory.setProductInventory(newQuantity);

        inventoryService.updateById(inventory);

    }

    return Result.success();

}

5.1.6采购退货管理功能

采购退货管理功能主要是对已采购商品执行退货操作。经营用户从采购入库记录列表中选择需要退货的单据,系统展示该次采购的原始数量与已退货数量。用户填写退货数量,系统校验退货数量不超过可退货额度。校验通过后系统保存退货记录,在库存信息表中扣减对应商品的库存数量。采购退货管理界面如图5-6所示。

图5-6 采购退货管理界面

核心代码如下:

@Transactional

@PostMapping("/add")

public Result add(@RequestBody PurchaseReturns returns) {

    QueryWrapper<PurchaseReturns> wrapper = new QueryWrapper<>();

    wrapper.eq("source_id", returns.getSourceId());

    Double returnedTotal = purchaseReturnsService.list(wrapper).stream()

        .mapToDouble(PurchaseReturns::getReturnQuantity).sum();

    ProcurementAndWarehousing original = procurementService.getById(returns.getSourceId());

    Double remaining = original.getPurchaseQuantity() - returnedTotal;

    if (returns.getReturnQuantity() > remaining) {

        return Result.error("退货数量超过可退货额度");

    }

    returns.setCreateTime(LocalDateTime.now());

    purchaseReturnsService.save(returns);

    InventoryInformation inventory = inventoryService.getOne(

        new QueryWrapper<InventoryInformation>().eq("name_of_commodity", returns.getNameOfCommodity()));

    inventory.setProductInventory(inventory.getProductInventory() - returns.getReturnQuantity());

    inventoryService.updateById(inventory);

    return Result.success();

}

5.1.7销售出库管理功能

销售出库管理功能主要是对商品销售过程进行记录与库存扣减。经营用户选择销售的商品,系统展示当前库存量供用户参考。用户填写销售数量与销售日期,系统校验出库数量不超过当前库存量。校验通过后系统扣减库存信息表中的商品库存字段,同时生成销售记录。销售总额根据销售数量与商品售价自动计算并存储。销售出库管理界面如图5-7所示。

图5-7 销售出库管理界面

核心代码如下:

@Transactional

@PostMapping("/add")

public Result add(@RequestBody SalesOutbound outbound) {

    InventoryInformation inventory = inventoryService.getOne(

        new QueryWrapper<InventoryInformation>().eq("name_of_commodity", outbound.getNameOfCommodity()));

    if (outbound.getOutboundQuantity() > inventory.getProductInventory()) {

        return Result.error("库存不足,当前库存为:" + inventory.getProductInventory());

    }

    outbound.setCreateTime(LocalDateTime.now());

    salesOutboundService.save(outbound);

    inventory.setProductInventory(inventory.getProductInventory() - outbound.getOutboundQuantity());

    inventoryService.updateById(inventory);

    ProductInformation product = productInformationService.getOne(

        new QueryWrapper<ProductInformation>().eq("product_name", outbound.getNameOfCommodity()));

    SalesRecords record = new SalesRecords();

    record.setNameOfCommodity(outbound.getNameOfCommodity());

    record.setSalesQuantity(outbound.getOutboundQuantity());

    record.setSalesPrice(product.getProductPrice());

    record.setTotalSales(outbound.getOutboundQuantity() * product.getProductPrice());

    record.setDateOfSale(outbound.getOutboundDate());

    salesRecordsService.save(record);

    return Result.success();

}

5.1.8退货入库管理功能

退货入库管理功能主要是对顾客退货商品执行库存恢复操作。经营用户从销售记录中选择需要退货的单据,系统展示该次销售的原始出库信息。用户填写退货数量与退货日期,系统校验退货数量不超过原始销售数量。校验通过后系统保存退货入库记录,在库存信息表中增加对应商品的库存数量。退货入库管理界面如图5-8所示。

图5-8 退货入库管理界面

核心代码如下:

@Transactional

@PostMapping("/add")

public Result add(@RequestBody ReturnGoodsReceipt returnGoods) {

    QueryWrapper<ReturnGoodsReceipt> wrapper = new QueryWrapper<>();

    wrapper.eq("source_id", returnGoods.getSourceId());

    Double alreadyReturned = returnGoodsReceiptService.list(wrapper).stream()

        .mapToDouble(ReturnGoodsReceipt::getReturnQuantity).sum();

    SalesOutbound original = salesOutboundService.getById(returnGoods.getSourceId());

    Double remaining = original.getOutboundQuantity() - alreadyReturned;

    if (returnGoods.getReturnQuantity() > remaining) {

        return Result.error("退货数量超过原始销售数量");

    }

    returnGoods.setCreateTime(LocalDateTime.now());

    returnGoodsReceiptService.save(returnGoods);

    InventoryInformation inventory = inventoryService.getOne(

        new QueryWrapper<InventoryInformation>().eq("name_of_commodity", returnGoods.getNameOfCommodity()));

    inventory.setProductInventory(inventory.getProductInventory() + returnGoods.getReturnQuantity());

    inventoryService.updateById(inventory);

    return Result.success();

}

5.1.9销售记录管理功能

销售记录管理功能主要是对历史销售数据进行查询与展示。经营用户按销售日期范围筛选记录,系统以表格形式展示每次销售的商品名称、销售数量、销售价格、销售总额等数据。销售记录支持按商品名称排序,方便用户分析不同商品的销售表现。销售记录管理界面如图5-9所示。

图5-9 销售记录管理界面

核心代码如下:

@GetMapping("/list")

public Result list(@RequestParam(required = false) String startDate,

                   @RequestParam(required = false) String endDate) {

    QueryWrapper<SalesRecords> wrapper = new QueryWrapper<>();

    if (StringUtils.hasText(startDate) && StringUtils.hasText(endDate)) {

        wrapper.between("date_of_sale", startDate, endDate);

    }

    wrapper.orderByDesc("date_of_sale");

    List<SalesRecords> list = salesRecordsService.list(wrapper);

    return Result.success(list);

}

5.2管理员角色功能实现

5.2.1角色管理功能

角色管理功能主要是对系统用户组与权限进行配置。管理员查看所有注册用户的列表,包括经营用户与管理员账号。系统支持设置用户账号状态为可用或冻结,冻结状态的账号无法登录系统。管理员分配用户组角色,不同用户组对应不同的功能菜单访问权限。角色管理界面如图5-10所示。

图5-10 角色管理界面

核心代码如下:

@PutMapping("/updateState")

public Result updateState(@RequestParam Integer userId, @RequestParam Integer state) {

    User user = userService.getById(userId);

    if (user == null) {

        return Result.error("用户不存在");

    }

    user.setState(state);

    userService.updateById(user);

    return Result.success();

}

5.2.2商品类型管理功能

管理员商品类型管理功能主要是对全部经营用户的商品分类进行全局浏览。管理员查看每个经营用户创建的商品类型列表,了解各超市的分类体系。必要时管理员可以修正异常的分类名称或删除冗余的分类条目。商品类型管理界面如图5-11所示。

图5-11 商品类型管理界面

核心代码如下:

@GetMapping("/listAll")

public Result listAll(@RequestParam(required = false) Integer operateUsers) {

    QueryWrapper<ProductType> wrapper = new QueryWrapper<>();

    if (operateUsers != null) {

        wrapper.eq("operate_users", operateUsers);

    }

    List<ProductType> list = productTypeService.list(wrapper);

    return Result.success(list);

}

5.2.3商品信息管理功能

管理员商品信息管理功能主要是对全部经营用户的商品数据进行统一管理。管理员浏览任意超市的商品信息列表,监控商品售价的合理性。对于异常的商品数据,管理员执行编辑修正或删除操作。商品信息管理界面如图5-12所示。

图5-12 商品信息管理界面

核心代码如下:

@GetMapping("/listAll")

public Result listAll(@RequestParam(required = false) Integer operateUsers) {

    QueryWrapper<ProductInformation> wrapper = new QueryWrapper<>();

    if (operateUsers != null) {

        wrapper.eq("operate_users", operateUsers);

    }

    List<ProductInformation> list = productInformationService.list(wrapper);

    return Result.success(list);

}

5.2.4库存信息管理功能

管理员库存信息管理功能主要是对全部经营用户的库存状态进行集中监控。管理员查看各超市的库存数据,识别库存过低或商品过期的异常情况。系统展示所有商品的库存数量、过期时间、剩余保质期等关键指标。库存信息管理界面如图5-13所示。

图5-13 库存信息管理界面

核心代码如下:

@GetMapping("/listAll")

public Result listAll() {

    List<InventoryInformation> list = inventoryService.list();

    for (InventoryInformation item : list) {

        if (item.getExpirationTime() != null) {

            long days = ChronoUnit.DAYS.between(LocalDate.now(), item.getExpirationTime());

            item.setRemainingShelfLife((double) days);

        }

    }

    return Result.success(list);

}

5.2.5采购入库管理功能

管理员采购入库管理功能主要是对全部经营用户的采购记录进行审计。管理员查看每笔采购入库单据的详细信息,包括采购商品、采购数量、采购日期、操作时间等。对于异常的采购记录,管理员执行删除或标记无效操作。采购入库管理界面如图5-14所示。

图5-14 采购入库管理界面

核心代码如下:

@Transactional

@DeleteMapping("/delete/{id}")

public Result delete(@PathVariable Integer id) {

    ProcurementAndWarehousing procurement = procurementAndWarehousingService.getById(id);

    if (procurement == null) {

        return Result.error("记录不存在");

    }

    procurementAndWarehousingService.removeById(id);

    InventoryInformation inventory = inventoryService.getOne(

        new QueryWrapper<InventoryInformation>().eq("name_of_commodity", procurement.getNameOfCommodity()));

    if (inventory != null) {

        inventory.setProductInventory(inventory.getProductInventory() - procurement.getPurchaseQuantity());

        inventoryService.updateById(inventory);

    }

    return Result.success();

}

5.2.6采购退货管理功能

管理员采购退货管理功能主要是对全部经营用户的采购退货记录进行监督。管理员浏览各超市的采购退货列表,核对退货数量与原始采购数量的逻辑关系。发现异常退货记录时管理员介入处理,必要时联系经营用户核实情况。采购退货管理界面如图5-15所示。

图5-15 采购退货管理界面

核心代码如下:

@GetMapping("/listAll")

public Result listAll() {

    List<PurchaseReturns> list = purchaseReturnsService.list();

    for (PurchaseReturns item : list) {

        ProcurementAndWarehousing original = procurementService.getById(item.getSourceId());

        if (original != null) {

            item.setExtra("原始采购数量:" + original.getPurchaseQuantity());

        }

    }

    return Result.success(list);

}

5.2.7销售出库管理功能

管理员销售出库管理功能主要是对全部经营用户的销售出库记录进行审查。管理员查看各超市的销售出库明细,监控销售数量与销售价格的合理性。销售出库记录按时间倒序排列,方便管理员查看最近的销售活动。销售出库管理界面如图5-16所示。

图5-16 销售出库管理界面

核心代码如下:

@GetMapping("/listAll")

public Result listAll() {

    QueryWrapper<SalesOutbound> wrapper = new QueryWrapper<>();

    wrapper.orderByDesc("create_time");

    List<SalesOutbound> list = salesOutboundService.list(wrapper);

    return Result.success(list);

}

5.2.8退货入库管理功能

管理员退货入库管理功能主要是对全部经营用户的退货入库记录进行核查。管理员浏览各超市的退货入库列表,验证退货数量与原始销售数量的对应关系。系统在列表中标注退货日期与创建时间,便于管理员追溯操作历史。退货入库管理界面如图5-17所示。

图5-17 退货入库管理界面

核心代码如下:

@GetMapping("/listAll")

public Result listAll() {

    List<ReturnGoodsReceipt> list = returnGoodsReceiptService.list();

    for (ReturnGoodsReceipt item : list) {

        SalesOutbound original = salesOutboundService.getById(item.getSourceId());

        if (original != null) {

            item.setExtra("原始销售数量:" + original.getOutboundQuantity());

        }

    }

    return Result.success(list);

}

5.2.9销售记录管理功能

管理员销售记录管理功能主要是对全部经营用户的销售数据进行统计分析。管理员按超市名称或销售日期筛选销售记录,系统以表格形式集中展示所有超市的销售明细。销售总额字段支持排序功能,管理员快速识别销售额较高的经营用户。销售记录管理界面如图5-18所示。

图5-18 销售记录管理界面

核心代码如下:

@GetMapping("/listAll")

public Result listAll(@RequestParam(required = false) String supermarketName) {

    QueryWrapper<SalesRecords> wrapper = new QueryWrapper<>();

    if (StringUtils.hasText(supermarketName)) {

        wrapper.like("supermarket_name", supermarketName);

    }

    wrapper.orderByDesc("total_sales");

    List<SalesRecords> list = salesRecordsService.list(wrapper);

    return Result.success(list);

}

6系统测试

6.1测试目的

系统测试就是检查小型超市管理系统所实现的功能和它应该具有的业务规则是否一致。关注的是采购入库之后库存数量是否准确增加、销售出库之后库存扣减是否及时到位、退货过程中库存恢复的处理方式是否合理。边界条件测试针对的是采购退货数量大于可退额度的情况和销售出库数量超出当日报存库存的情况,二者均是用到截断来完成检测。数据一致性检验就是保证采购入库单据的存取和库存的增减不能同时进行。交互准确度测试就是用前端表单提交数据和后端接收的内容是否完全一样来检验的。通过进行测试活动来发现业务流程中存在的隐患,并且保证系统上线之后不会出现大的问题。经过系统的测试来判断模块之间是否存在低耦合的设计,在一个模块被改动的时候不会导致其它模块出现连锁故障的情况之下才算是符合要求的[20]。

6.2测试方法

系统测试使用黑盒测试的方法,测试人员并不知道内部的代码实现逻辑,只是根据用户的操作来检验功能是否符合要求。测试用例的编写依照第三章需求分析文档的规定来开展,包含正常的业务操作过程和出乎意料的情况。功能测试是单独地运行每一个模块,看其输入输出是否正确。集成测试关心的是各个模块之间数据的交换情况,看采购入库之后库存信息模块能不能显示出来被新数变更的数量了。回归测试是在缺陷改正之后再重复进行相应的用例的测试,以保证更改不会产生新的问题。测试环境搭建在本地的开发机上,操作系统是Windows,数据库使用MySQL,后端服务用SpringBoot集成到Tomcat容器里运行,前端用npm启动开发服务器。测试的数据是模拟的经营用户的购物信息和商品数据,并没有使用真实的超市运营数据。

6.3测试内容

经营用户注册功能测试如表6-1所示。

表6-1 经营用户注册功能测试表

测试内容

测试步骤

预期结果

实际结果

账号重复校验

使用已存在的账号提交注册

系统提示账号已被占用

符合预期

密码一致性校验

两次输入的密码不同

系统提示密码不一致

符合预期

必填项校验

超市名称字段留空提交

系统提示该字段不能为空

符合预期

商品信息管理功能测试如表6-2所示。

表6-2 商品信息管理功能测试表

测试内容

测试步骤

预期结果

实际结果

商品添加

填写商品名称与售价后提交

列表中显示新商品记录

符合预期

商品编辑

修改商品售价后保存

列表中售价信息更新

符合预期

商品删除

执行删除操作并确认

列表中不再显示该商品

符合预期

采购入库功能测试如表6-3所示。

表6-3 采购入库功能测试表

测试内容

测试步骤

预期结果

实际结果

正常入库

选择商品填写数量后提交

库存数量增加相应数值

符合预期

负数校验

采购数量填写负数提交

系统提示数量无效

符合预期

关联商品

选择未录入的商品入库

系统提示先录入商品信息

符合预期

销售出库功能测试如表6-4所示。

表6-4 销售出库功能测试表

测试内容

测试步骤

预期结果

实际结果

正常出库

选择商品填写数量后提交

库存数量减少相应数值

符合预期

超额拦截

出库数量超过当前库存

系统提示库存不足

符合预期

记录生成

出库操作完成后查询销售记录

显示本次销售记录

符合预期

采购退货功能测试如表6-5所示。

表6-5 采购退货功能测试表

测试内容

测试步骤

预期结果

实际结果

正常退货

选择入库单据填写数量后提交

库存数量减少相应数值

符合预期

超额拦截

退货数量超过可退额度

系统提示超过可退货数量

符合预期

记录保存

退货操作后查询退货列表

显示本次退货记录

符合预期

6.4测试结论

经过功能测试与集成测试的全面验证,小型超市管理系统各项功能均达到预期设计目标。注册登录模块通过账号唯一性校验与密码加密机制保障账户安全。商品信息管理模块支持完整的增删改查操作。库存信息管理模块准确展示各商品的实时库存数据。采购入库与销售出库模块在操作后正确更新库存数量,采购退货与退货入库模块实现了库存的反向调整逻辑。边界条件测试中系统能够拦截超出库存的出库请求与超过可退额度的退货请求。销售记录模块自动记录每次销售明细。测试结果表明系统业务规则匹配度较高,数据一致性得到有效保障,各模块间耦合度符合设计预期。

7总结

本文设计并实现了一个小型超市管理系统,主要针对中小型超市在日常经营过程中所遇到的各类商品管理工作、库存管理以及采购及销售工作等内容。传统的手工管理模式在商品种类增多之后就存在效率低、数据不一致等问题,而本系统是用信息化的方法把零散的业务数据集中起来。系统完成经营用户的注册登录、商品类型和商品信息的添加删除、库存实时监控、采购入库退库、销售出库退库、销售记录查询等模块的功能,管理员另外有角色权限设置的能力。根据实验的结果可以看出,本系统可以满足小型超市的信息管理系统的要求。

系统实现的过程按照软件工程的规定来进行,从需求分析开始整理出用户的角色和功能范围,再以前后端分离的方式搭建起整个系统的架构。SpringBoot负责处理后端的业务逻辑,Vue创建前端与用户进行交互的界面,MySQL用来存放业务数据。技术选择以轻量、易维护为主,使得中小规模超市也能够采用。在测试的时候就检查了所有的采购入库库存增加,销售出库库存减少和退货回货等关键环节上的各种业务逻辑是否准确无误。系统实现的简捷化操作方式,保证了数据的一致性以及达到了所设计的要求。

系统有以下几处不足。用户的界面比较简单,没有用到数据的可视化图谱来呈现库存的变化和销售的数量。采购入库、销售出库的操作没有批量处理的功能,逐条进行操作的效率不高。系统没有集成了条码扫描的功能,商品的选择依靠名称的查找,而当需要输入具体的条形码的时候就会出现增加的操作时间的问题。多超市门店之间数据的共享比较容易做到,但是不能完成连锁超市间跨店调拨的要求。这样就会造成系统不能用到更广阔的空间当中去。

以后的改良会加入数据可视化的元素,在折线图和柱状图里显示出库存周转率和销售额的变化状况。开发批量导入、导出的功能,可以使用excel文件一次性进行很多种商品的入库。集成条码扫描接口,用扫把快准地找东西的名堂来搜寻货物状况。建立分店间库存调拨和销售数据共享的机制,进行分店之间库存调配以及销售数据汇总的工作。本系统对于中小零售企业有推广应用的价值,经过不断的更新以后可以为其他的超市业态所使用。

参考文献

  1. 李诗慧.超市生鲜农产品供应链管理优化研究[D].华东交通大学,2025.DOI:10.27147/d.cnki.ghdju.2025.000656.
  2. 窦雨芊.永辉超市数字化转型下的供应链成本管理研究[D].天津工业大学,2025.DOI:10.27357/d.cnki.gtgyu.2025.001656.
  3. 刘雅静.基于数据驱动的A零售超市库存管理方案优化[D].中南林业科技大学,2025.DOI:10.27662/d.cnki.gznlc.2025.001377.
  4. 贺文明.R连锁超市日用品供应商管理策略研究[D].大连理工大学,2024.DOI:10.26991/d.cnki.gdllu.2024.006213.
  5. 蒙玉艳.数字化转型下永辉超市的供应链成本管理效果评价研究[D].兰州财经大学,2024.DOI:10.27732/d.cnki.gnzsx.2024.000300.
  6. 陈冠中.供应链视角下永辉超市营运资金管理研究[D].山西师范大学,2024.DOI:10.27287/d.cnki.gsxsu.2024.000471.
  7. 崔万新.基于OPM战略的永辉超市营运资金管理对策研究[D].天津财经大学,2024.DOI:10.27354/d.cnki.gtcjy.2024.000853.
  8. Lu Y . Supermarket Management Information System[J].Computer Software and Media Applications,2018,1(1):DOI:10.24294/csma.v1i1.295.
  9. Feo D G ,Polito R A . Using economic benefits for recycling in a separate collection centre managed as a “reverse supermarket”: A sociological survey[J].Waste Management,2015,3812-21.DOI:10.1016/j.wasman.2015.01.029.
  10. Zhang Y C . The Design of Campus Online Supermarket Management System[J].Advanced Materials Research,2014,3227(945-949):3316-3318.DOI:10.4028/www.scientific.net/AMR.945-949.3316.
  11. Kmiecinski E ,Iocco C B . Benefits of Teaching Nutrition Principles Applied to the Mediterranean Diet to Supermarket Managers[J].Journal of the Academy of Nutrition and Dietetics,2013,113(9S):A74-A74.DOI:10.1016/j.jand.2013.06.255.
  12. Qiang L ,Hong-yu J . The Study on Safety Evaluation of Evacuation in a Large Supermarket[J].Procedia Engineering,2011,11273-279.DOI:10.1016/j.proeng.2011.04.657.
  13. 朱书彪.中职《Java程序设计》项目课程开发与实践[D].桂林:广西师范大学,2025:1-120.
  14. 王子豪,陈涛,李茂斌.Vue云管理平台Web前端性能优化设计[J].数字技术与应用,2024,42(7):212-214.
  15. 周德伟.MySQL数据库基础实例教程[M].北京:人民邮电出版社,2024:222.
  16. 杨开振.深入浅出Spring Boot 3.x[M].北京:人民邮电出版社,2024:408.
  17. 吴迁.基于uni-app与Spring Boot框架的Web应用开发平台的设计与实现[D].西安:西安石油大学,2025:1-120.
  18. 杨沁.基于分布式数据库的图书资料管理系统设计[J].自动化应用,2024,65(14):229-231.
  19. 林育蓓,汤德佑,汤娜.数据库技术及应用[M].北京:机械工业出版社,2024:302.
  20. 窦万峰,蒋锁良,杨俊.软件工程实验教程[M].北京:机械工业出版社,2023:624.

 项目分享:大家可自取用于参考学习,获取方式见文末!

更多推荐