ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SpringBoot超市管理系统实战:从环境搭建到功能扩展

SpringBoot超市管理系统实战:从环境搭建到功能扩展 这次我们来看一个 Java web 方向的经典练手项目基于 SpringBoot 的超市管理系统带源码、带资料适合用来学习 SpringBoot 基础整合、熟悉企业级项目分层也适合拿来当课程设计或毕业设计的底子。先说结论这类系统的技术含量不在“难点”而在“完整链路”——从前端页面到 Controller再到 Service、Mapper最后落到 MySQL 数据库一整条 CRUD 链路跑通你就把 SpringBoot 开发里最常用的东西都摸了一遍。JDK、Maven、MySQL、IDEA 装好导入项目、改下数据库连接配置就能跑起来不挑电脑8G 内存的小主机也完全能带得动不需要 GPU也不用担心显存这些问题。这篇文章会按下面的顺序来写先快速给出项目的核心能力速览再拆解功能模块和源码结构然后讲环境准备、部署启动、功能验证最后给出常见问题排查和工程化改造建议。如果你手头正缺一个能写进简历的 SpringBoot 实战项目或者马上要交课设这篇可以直接收藏。1. 超市管理系统核心能力速览在动手下载源码之前先花一分钟看下这个项目的整体画像。下面这个表是通过项目标题和常见超市管理系统需求整理出的核心能力清单方便你对照自己的需求判断“值不值得跑”能力项说明项目类型Java web 管理系统单体应用架构核心框架SpringBoot MyBatis / MyBatis-Plus MySQL前端可选 Thymeleaf 模板或 Vue 分离式主要功能商品管理、库存管理、销售管理、进货管理、供应商管理、用户登录与权限管理、数据统计适合人群Java 初学者、在校学生、SpringBoot 入门者、课设/毕设选手推荐环境JDK 8 或 17、Maven 3.6、MySQL 5.7 或 8.0、IDEA启动方式IDEA 直接运行主类或 Maven 命令行打包后 java -jar 启动是否支持接口单体 web 项目天然支持 HTTP 接口访问同时可作为前后端分离项目的基础是否支持批量任务不涉及重 IO 批量任务但商品导入、批量上下架等逻辑可以在源码上自行扩展资料完整度附源码、数据库脚本、说明文档属于“拿到手就能跑”的完整度这里要注意一点因为不同版本源码的功能点有差异后面的操作步骤我会站在“标准 SpringBoot 超市管理系统”的通用结构上展开你拿到实际源码后重点对照 Controller 层和 resources 目录下的 Mapper XML 文件做微调即可。2. 项目功能模块拆解这个超市管理系统从业务上可以拆成几个大模块。这些模块决定了你做完之后简历上怎么写、答辩时怎么讲也决定了你自己第二次打开代码时能不能快速定位文件。2.1 登录与用户管理系统一般不会把登录做成裸奔的至少要有一张用户表记录用户名、密码、角色、状态。常见的做法是使用 SpringBoot 拦截器或过滤器统一校验登录态未登录的用户跳转到登录页管理员登录后可以看到后台菜单。用户管理的核心内容是用户注册与登录密码加密存储常用 MD5 加盐或 BCrypt用户角色区分比如管理员、收银员、仓库管理员用户列表分页查询、新增、编辑、禁用从学习角度看这个模块是理解 SpringBoot 拦截器、Session 和 Cookie 的好素材。很多课设项目会把“登录后才能访问”写死在每个 Controller 里但这套系统如果用统一拦截器处理代码会干净很多。2.2 商品管理商品管理是超市系统的核心通常包括商品分类、商品信息、商品价格、商品图片等字段。常见数据表设计大致是这样CREATE TABLE product ( id int NOT NULL AUTO_INCREMENT, category_id int DEFAULT NULL COMMENT 分类ID, name varchar(100) DEFAULT NULL COMMENT 商品名称, price decimal(10,2) DEFAULT NULL COMMENT 销售单价, purchase_price decimal(10,2) DEFAULT NULL COMMENT 进货单价, stock int DEFAULT 0 COMMENT 当前库存, status tinyint DEFAULT 1 COMMENT 1上架 0下架, create_time datetime DEFAULT NULL, update_time datetime DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;业务上需要实现商品列表的分页查询、按名称模糊搜索、新增商品、编辑商品、删除商品、上下架操作。如果源码里集成了 MyBatis-Plus那么分页可以直接用分页插件来实现代码量会少很多如果用的是原生 MyBatis PageHelper效果也差不多。我在看这类源码时比较关注的一点是模糊查询是不是用like % #{name} %写的。如果是说明作者有基本的 SQL 防注入意识如果直接字符串拼接说明项目代码质量一般你拿到手后建议顺手改掉。2.3 库存管理库存管理一般包含入库和出库两张单据入库单记录商品进货数量、进货单价、供应商信息、入库时间出库单或销售单记录商品销售数量、销售单价、操作员比较完善的设计会引入“库存流水”这个概念。也就是说每一次库存变动都会往 stock_log 表里插一条记录这样后期对账和回溯都很方便。简单的系统则只会在商品表上直接修改 stock 字段。如果你打算拿这套代码当毕设底子建议优先检查是否包含库存流水。没有的话可以自己加一张stock_log表这属于一个很容易讲清楚、也很有说服力的优化点。2.4 销售管理销售管理模块通常包含“开单”操作选择商品、输入数量、计算金额、生成销售记录同时扣减库存。这里涉及数据库事务是理解Transactional注解的好机会。一个标准的销售流程前端提交商品ID和数量后端检查库存是否充足插入销售单主表记录插入销售单明细表记录更新商品库存提交事务如果第 4 步失败第 5 步不应该执行整条数据应该回滚。你可以看下源码里 Service 层是否用了Transactional如果没有这又是一个可以自己补上去的亮点。2.5 供应商管理供应商模块相对简单就是一张供应商表记录供应商名称、联系人、电话、地址、备注。一般会提供分页查询、新增、修改、删除功能。有些项目还会把供应商和进货单关联起来方便按供应商查历史进货记录。2.6 数据统计与报表部分完整一点的超市管理系统会包含首页统计图表比如今日销售额今日订单数库存预警商品数近七日销售趋势统计功能往往不是必须的但加了之后项目会显得更完整。前端可以用 ECharts 画图后端提供一个聚合查询的 SQL 接口。如果你拿到的源码没有统计模块面试前建议自己补一个这是非常加分的扩展点。3. 技术栈与源码结构分析拿到源码之后不要急着点运行先把目录结构看明白。SpringBoot 项目的标准 Maven 结构大概是这样的supermarket-system ├── pom.xml ├── src │ ├── main │ │ ├── java │ │ │ └── com/example/supermarket │ │ │ ├── SupermarketApplication.java │ │ │ ├── controller │ │ │ │ ├── ProductController.java │ │ │ │ ├── StockController.java │ │ │ │ ├── SaleController.java │ │ │ │ └── UserController.java │ │ │ ├── service │ │ │ │ ├── ProductService.java │ │ │ │ └── impl │ │ │ │ └── ProductServiceImpl.java │ │ │ ├── mapper │ │ │ │ ├── ProductMapper.java │ │ │ │ └── ProductMapper.xml │ │ │ ├── entity │ │ │ │ └── Product.java │ │ │ ├── dto │ │ │ │ └── ProductQueryDTO.java │ │ │ └── config │ │ │ └── WebConfig.java │ │ └── resources │ │ ├── application.yml │ │ ├── mapper │ │ │ └── ProductMapper.xml │ │ ├── static │ │ └── templates │ └── webapp (如果是 war 包可能在这里) ├── sql │ └── supermarket.sql └── README.md这里需要区分三种常见变体第一种是Thymeleaf 服务端渲染模式。页面放在templates目录下Controller 返回视图名称前端用 Thymeleaf 语法取数据。这种模式部署简单适合课设展示。第二种是前后端分离模式。后端只提供 JSON 接口前端单独用 Vue 或 Layui 写页面通过 Axios 请求后端接口。这种模式更接近企业实际开发但部署时需要同时启动两个服务。第三种是传统 JSP 模式。如果项目用的 SpringBoot 内嵌 Tomcat 跑 JSP需要注意依赖tomcat-embed-jasper的配置不能直接用默认的 spring-boot-starter-thymeleaf 替换。建议你拿到源码后先打开pom.xml看一眼确认用了哪些依赖。重点看三个地方!-- 1. SpringBoot 版本 -- parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.18/version relativePath/ /parent !-- 2. 持久层框架 -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3/version /dependency !-- 3. 数据库驱动 -- dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency如果看到spring-boot-starter-web、spring-boot-starter-thymeleaf、mybatis-plus-boot-starter这三个依赖都在那这个项目的运行门槛基本为零配好数据库就能启动。4. 本地部署环境准备在运行任何 SpringBoot 项目之前本地环境必须先准备好。这里列一份通用检查清单每一项都按“确认方法 常见坑”来写。4.1 JDK 版本SpringBoot 2.x 推荐 JDK 8 或 11SpringBoot 3.x 要求 JDK 17 及以上。在命令行里确认版本java -version如果电脑里装了多个 JDK建议在 IDEA 的Project Structure里指定项目的 SDK 为统一版本避免编译级别不一致导致报错。常见问题是Error: java: invalid source release: 17这说明 Maven 编译级别和当前 JDK 不匹配把 IDEA Settings 里的 Java Compiler 和 Maven Runner 的 JDK 都改成一致即可。4.2 MavenMaven 不需要单独安装也可以IDEA 自带 Maven 插件但建议自己装一个 3.6 版本。确认方式mvn -vMaven 仓库默认从中央仓库拉依赖国内网络可能很慢建议配置阿里云镜像。在settings.xml的mirrors节点里加mirror idaliyunmaven/id mirrorOfcentral/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirror这个配置能解决 80% 的依赖下载超时问题。4.3 MySQL 数据库确认 MySQL 是否安装并启动mysql -u root -p如果没安装建议直接装 MySQL 8.0 社区版。安装完需要记住用户名和密码后面要填到application.yml里。4.4 IDEA推荐使用 IDEA Ultimate 版社区版也可以运行 SpringBoot 项目但没有 Spring Initializr 和部分数据库工具写代码体验差一些。用社区版也不影响运行项目只是新建项目时不如旗舰版方便。4.5 数据库脚本导入绝大多数带源码的超市管理系统会附带一个sql目录里面有一个.sql文件比如supermarket.sql。在命令行执行导入mysql -u root -p supermarket.sql也可以先用 Navicat 或 IDEA 的 Database 工具创建一个数据库比如命名为supermarket_db然后运行 SQL 脚本初始化数据表。导入成功后会看到类似 user、product、category、supplier、sale_order、sale_order_item 之类的表。如果项目里没有提供 SQL 脚本你可以按照本文 2.2 节的建表语句自己创建基础表结构但更稳妥的做法是直接找附带完整脚本的版本因为表如果对不上代码启动时 Mapper 就会报错。5. 安装部署与启动方式环境准备好之后开始启动项目。下面给出一套通用操作流程具体路径以你实际解压后的源码目录为准。5.1 导入项目到 IDEA打开 IDEA选择File - Open选中源码根目录即包含pom.xml的那一层点击 OK。IDEA 会自动识别 Maven 项目并开始下载依赖。第一次导入建议耐心等待不要频繁重新加载。右下角会有 Maven 依赖下载进度条如果一直卡住优先检查阿里云镜像是否配置正确。5.2 修改数据库连接配置找到src/main/resources/application.yml内容大致是这样的server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/supermarket_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: root thymeleaf: cache: false mybatis-plus: mapper-locations: classpath:mapper/*.xml configuration: map-underscore-to-camel-case: true你需要修改的部分只有两个url里的数据库名以及username和password。如果数据库密码包含特殊字符注意 YAML 文件里的转义问题比如密码是123456就直接写如果是abc123推荐用引号包起来。5.3 运行主类找到SupermarketApplication.java直接运行main方法。正常启动后控制台会看到类似这样的输出Tomcat started on port(s): 8080 (http) with context path Started SupermarketApplication in 3.5 seconds然后在浏览器访问http://localhost:8080看到登录页就说明项目启动成功了。如果页面打不开先看控制台有没有报错常见的是端口被占用、数据库连接失败。5.4 Maven 命令行打包运行如果你不想用 IDEA 运行也可以直接在项目根目录执行mvn clean package -DskipTests打包成功后在target目录下会生成一个.jar文件然后执行java -jar target/supermarket-system-1.0.0.jar这种方式适合部署到服务器或写启动脚本。注意-DskipTests是跳过测试如果项目里没有测试类可以不加。5.5 修改端口如果 8080 端口被其他程序占用可以在application.yml中改端口server: port: 9090改完后重启项目访问地址变为http://localhost:9090。6. 功能测试与效果验证项目跑起来之后不要只停留在“能打开登录页”这一步。下面这组测试用例可以帮你系统验证项目是否真正完整。6.1 登录功能测试使用源码自带的管理员账号登录。如果不知道账号密码可以查看 SQL 脚本里的初始化数据一般会是admin / admin或admin / 123456。测试步骤打开登录页输入错误密码确认系统给出错误提示输入正确密码确认跳转到后台首页浏览器直接访问一个受保护的页面 URL比如/admin/index确认未登录状态下被拦截到登录页第 3 点尤其重要它验证了登录拦截器是否存在。很多练手项目的登录只是前端隐藏菜单后台接口完全没有校验直接输入 URL 就能绕过。如果你发现拦截器缺失建议自己补一个拦截器。6.2 商品管理 CRUD 测试进入后台后找到商品管理页面按以下顺序操作新增一个商品填写名称、分类、价格、库存在列表中通过关键字搜索刚添加的商品编辑商品价格确认更新生效删除测试商品这里重点观察两个问题新增和编辑时商品名称是否做了非空校验价格是否限制了范围删除操作是物理删除DELETE FROM还是逻辑删除UPDATE status 0逻辑删除比物理删除更符合真实企业开发习惯。如果源码是物理删除你可以顺便改造成逻辑删除这也是一个能写进简历的优化点。6.3 销售开单与库存联动找一个商品记录它的当前库存然后进行一次销售开单测试选择该商品、填写数量 1提交后做两件事查看销售单列表确认订单生成回到商品列表确认库存减少 1如果库存没有变化说明销售流程里缺少库存更新逻辑这是比较严重的功能缺失。如果库存变化了但销售单明细没有记录说明事务边界有问题。6.4 分页查询测试商品数量超过一页之后确认列表底部出现分页导航。测试内容点击第 2 页确认数据变化在搜索框输入关键字确认搜索结果也按分页展示多次快速点击分页确认不会出现重复数据或 500 错误分页查询是 SpringBoot 项目的高频考点。你能讲清楚 PageHelper 或 MyBatis-Plus 分页插件的原理面试时很加分。6.5 数据统计验证如果存在如果首页有统计图表可以造一些测试数据后再看图表是否更新。比如新建几笔销售额不同的订单确认今日销售额、订单数等指标发生变化。如果统计模块不存在也可以自己加一个“库存预警列表”把库存低于阈值的商品显示出来作为扩展练习。7. 接口 API 与后续扩展虽然超市管理系统是典型的服务端渲染项目但它的 Controller 层本身就是一组 HTTP 接口。如果你打算把它改造成前后端分离可以直接复用这些接口。以商品管理为例一个完整的 REST 风格接口设计应该是这样的RestController RequestMapping(/api/product) public class ProductController { Autowired private ProductService productService; GetMapping(/list) public Result list(ProductQueryDTO dto) { return Result.success(productService.pageQuery(dto)); } PostMapping(/save) public Result save(RequestBody Product product) { productService.save(product); return Result.success(); } PutMapping(/update) public Result update(RequestBody Product product) { productService.update(product); return Result.success(); } DeleteMapping(/delete/{id}) public Result delete(PathVariable Integer id) { productService.delete(id); return Result.success(); } }如果当前项目是 Thymeleaf 模式Controller 返回的是视图名称。改造时需要注意返回类型改成Result统一封装登录鉴权可以改用 JWT 拦截器前端用 Vue 或 React 抽成独立工程如果你想用 Postman 或 Apifox 测试后端接口启动项目后直接调用即可。没有单独开启 API 文档的情况下需要自己根据 Controller 代码确认请求路径和参数格式。由于系统本身没有重批量任务这里不展开队列和批处理。如果你后续想扩展“商品 Excel 批量导入”功能可以考虑引入 EasyExceldependency groupIdcom.alibaba/groupId artifactIdeasyexcel/artifactId version3.3.4/version /dependency然后写一个监听器逐行读取 Excel校验后批量写入数据库。这个功能做完项目的完整度会明显提高也是一个很容易展示的亮点。8. 资源占用与性能观察对于这种规模的单体管理系统资源占用通常很低但这不代表不用关注。运行期间可以从以下几个维度观察CPUSpringBoot 内置 Tomcat 默认线程池在处理少量后台请求时CPU 占用几乎可以忽略内存JVM 默认堆大小取决于本机物理内存启动后通常占用几百 MB 到 1GB 不等8G 内存的电脑运行毫无压力磁盘项目本身加数据库整体占用不会超过 1GB如果你把项目部署到云服务器建议启动时显式指定 JVM 参数java -Xms256m -Xmx512m -jar supermarket-system-1.0.0.jar这样可以避免 JVM 默认占满服务器内存。如果访问量变大还能在 Nginx 层做反向代理和静态资源缓存。另外观察日志时要关注两个点一是 MyBatis 是否打印了完整 SQL二是慢查询日志。开发调试阶段可以在application.yml中打开 SQL 日志logging: level: com.example.supermarket.mapper: debug看到类似这样的输出就说明 Mapper 接口正常执行了 Preparing: SELECT id, name, price, stock FROM product WHERE status ? Parameters: 1(Integer) Total: 3性能优化上超市管理系统不需要复杂缓存策略。如果商品列表访问量高可以考虑在热点查询上加 Spring Cache Redis但作为练手项目这个优先级不高先把功能跑通更重要。9. 常见问题与排查方法下面这张表整理了运行 SpringBoot 超市管理系统时最容易遇到的一批问题按频率从高到低排列问题现象可能原因排查方式解决方案启动报Access denied for user rootlocalhost数据库账号密码错误检查 application.yml 中 datasource 配置改成正确的用户名密码启动报Unknown database supermarket_db数据库名不对或未创建使用 Navicat 查看数据库列表创建同名数据库或修改 url启动报Port 8080 was already in use8080 端口被占用使用 netstat -anofindstr 8080 查看占用进程页面样式丢失静态资源路径错误或未配置静态目录浏览器 F12 查看资源加载失败项检查 templates 中静态资源引用路径中文乱码数据库编码或连接字符集不一致查看数据库表字符集建库时用 utf8mb4url 加 characterEncodingutf8依赖下载失败或超时Maven 镜像默认走国外仓库查看 IDEA 右下角提示配置阿里云镜像并重新加载启动找不到主类IDEA 未正确导入 Maven 项目检查 pom.xml 是否被识别右键 pom.xml - Add as Maven Project访问页面报 500 错误SQL 语句或Mapper映射出错查看控制台堆栈信息重点检查 Mapper XML 的 namespace 和 resultType登录成功后跳转不进去Session 或拦截器配置问题查看拦截器排除路径确认静态资源和登录接口是否放行商品删除后其他表数据残留没有处理外键或逻辑删除查看删除日志和关联表增加事务或改为逻辑删除遇到问题时第一件事是看控制台日志第二件事是确认自己的修改是否与源码结构一致。不要一上来就改动源码先跑通再优化。10. 最佳实践从“跑起来”到“讲清楚”这个项目真正的价值不是让它跑起来而是跑起来之后你能否讲清楚每一步。这里我给几组“面试官视角”的最佳实践建议。10.1 先跑通再改代码第一次接触这套源码不要大面积改代码。先把项目原封不动地跑起来确认登录、商品新增、销售开单能走通。只有原始版本能跑通你才能区分“我改坏了”和“原本就有 bug”。10.2 建立最小可运行备份在开始定制化改造之前先复制一份原始的源码压缩包。这样你改数据库字段、改页面、改依赖版本的时候随时可以回退。10.3 分目录管理资源建议把源码、SQL 脚本、README、答辩 PPT、需求文档分开存放。我自己见过太多人把 SQL 脚本随手放在桌面最后换电脑或交毕设材料时找不到了。10.4 记录调试日志在关键业务方法上打日志比如登录、销售开单、库存变更。日志是排查线上问题最重要的依据也是你在答辩时展示“工程化意识”的细节。Transactional public void createSaleOrder(SaleOrderDTO dto) { log.info(开始创建销售单参数{}, dto); // 业务逻辑 log.info(销售单创建成功单号{}, orderNo); }10.5 数据安全与合规如果拿到的源码里包含默认的测试数据尤其是有真实姓名、电话等模拟数据发布到公网或提交答辩前一定要清除掉。商户信息、员工信息、会员信息都属于隐私数据练习时不要使用真实人群数据避免泄露风险。11. 往哪个方向扩展最加分如果你需要完成课程设计或毕业设计不建议停留在“原样跑通”这一步。下面几个扩展方向都很适合 SpringBoot 超市管理系统而且难度从低到高排列。11.1 加入 RBAC 权限模型把原来的“管理员/普通用户”扩展成“用户-角色-权限”三张表实现不同角色的菜单权限不同。这个扩展涉及拦截器、注解、表关系设计是很好的数据库设计和后端设计训练。11.2 加入 Redis 缓存把商品分类、商品列表等高频查询数据缓存到 Redis并设置合理的过期时间。改造成本不高但可以展示你对缓存穿透、缓存击穿、缓存雪崩的基本理解。11.3 加入 Excel 导入导出使用 EasyExcel 实现商品批量导入、销售记录导出。这个功能非常实用也容易被答辩评委认可因为超市管理系统在实际使用中确实需要批量录入商品。11.4 前后端分离改造后端接口统一改成 JSON 返回前端抽成 Vue 项目部署时 Nginx 做静态代理。这个方向工作量略大但做出来的项目在简历上可以写“基于 SpringBoot Vue 的前后端分离管理系统”含金量会更高。12. 总结与下一步这个超市管理系统是一个典型的 SpringBoot 单体练手项目。功能不复杂但胜在链路完整从前端页面到后端接口从 Controller 到 Service、Mapper再到 MySQL 数据库每一步都有明确的代码可看。对刚学完 SpringBoot 基础的人来说把这一套跑通、看懂、改上几处比刷十道面试题更有用。上手时建议按这个顺序推进先按 4、5 节的步骤把项目跑起来按 6 节的测试用例逐项验证功能打开源码跟着断点走一遍“商品新增”的完整调用链对照 10 节的最佳实践做备份和目录管理有余力再做 11 节的扩展方向最容易踩的坑集中在数据库配置和 Maven 依赖上遇到问题不要慌先把控制台日志从头看到尾大多数答案都在里面。这个项目本身不需要高性能硬件也不用额外装乱七八糟的服务一套 JDK Maven MySQL IDEA 就能全部搞定。建议收藏备用尤其是手头正在找 Java web 课设或入门项目的人这源码拿到手消化透SpringBoot 日常开发那套基本就通了。下一步可以试着把销售报表或库存预警功能自己写一遍写不出来再对照源码看效果比单纯读代码好得多。
返回列表