恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

SpringBoot+Vue社区团购管理系统:前后端分离设计与部署全攻略

  • 首页
  • 资讯中心
  • /
  • SpringBoot+Vue社区团购管理系统:前后端分离设计与部署全攻略

相关资讯

VINS-Mono代码注释包深度解读:从看懂到二次开发 2026/10/22 4:45:11
2026年第40周GitHub趋势:AI开发工具与本地优先应用霸榜 2026/10/22 4:45:11
一人公司AI工具选型指南:35个赛道拆解与实操避坑 2026/10/22 4:40:11

最新资讯

数字油田AI大模型平台规划方案:数据接入、模型训练与安全落地
基于WiFi CSI的实时跌倒检测系统:从原理到部署实战
多Agent环境下Skill统一管理:同步分发与挂载绑定工具实践
PINN多输入单输出回归:物理约束与Matlab实现
XXL-AI v1.1.1桌面客户端与云本结合,重塑端云协同与隐私边界
PyTorch基础不是API手册,而是张量流、计算图与设备管理的底层认知

今日推荐

电商智能运营体系从0到1:架构设计、落地步骤与避坑指南
压缩空气储能与热网热惯性联合优化调度:热电联产系统建模与求解
若依框架AI代码生成不稳定?用Agent Skill三层结构+五步法搞定

本周热门

基于GMM的语音识别系统原理与MATLAB实现详解
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

SpringBoot+Vue社区团购管理系统:前后端分离设计与部署全攻略

发布时间:2026/10/22 4:45:11
SpringBoot+Vue社区团购管理系统:前后端分离设计与部署全攻略 前后端分离的社区团购管理系统最近在开发群里被问得挺频繁。我手上正好有一套SpringBootVueMyBatisMySQL的完整源码和部署教程前前后后完整跑过一遍还把几个容易踩的坑都填了今天直接把这套系统的整体设计、核心实现、部署流程和问题排查一起整理出来。这套项目适合想做毕设、想学习主流前后端分离技术栈或者准备接手中小型社区团购后台的人。如果你之前只写过单体应用正好借这个项目把前后端分离的协作方式、接口联调和Linux部署一次搞明白。社区团购看似是个普通的电商后台但它的业务逻辑和普通商城不太一样。管理系统涉及的商品、订单、团长、活动配送这些模块都需要围绕“预售”和“集单”这两个特点来设计。下面我先从业务拆解开始讲再逐步落到技术实现。1. 先看业务社区团购管理系统到底管什么1.1 社区团购的业务链条比普通商城复杂在哪普通电商的流程是“用户下单、商家发货、用户收货”而社区团购的玩法是“平台找团长、团长建群、用户在小程序或APP下单、平台统一集单、批量配送到小区、用户自提或团长送货”。这意味着后台管理系统不能只盯着“卖货”这一个环节它至少要覆盖几条关键主线商品主线总部发布团购商品、设置价格和库存、制定限购规则分到不同的团购活动里。订单主线用户下单后产生订单订单先进入“待成团”状态等活动成团后再进入“待配送”状态。团长主线团长需要申请入驻、平台审核、绑定小区用户下单后要把订单归属到对应团长名下方便佣金结算。配送主线平台按小区汇总订单生成配送单配送完成后批量确认收货。售后主线用户发起售后管理员处理退货退款。所以管理系统里最常见的模块就是后台首页统计、商品管理、订单管理、用户管理、团长管理、活动管理、售后管理、系统设置。这套SpringBootVue的项目基本就是围绕这些模块来做增删改查和状态流转的。如果你把它当成普通商城来理解后面做订单状态机的时候容易绕晕。1.2 为什么偏要用前后端分离的架构早期项目喜欢把页面和服务端放一起用Thymeleaf模板直接渲染确实简单但社区团购业务的迭代速度很快前端经常要加营销活动、改页面交互后端又频繁要调整接口、处理订单状态和佣金规则。如果前后端在一起任何一方的改动都会互相影响部署也要整体重启。采用前后端分离之后Vue负责页面展示SpringBoot只提供JSON接口两边通过HTTP通信。这样做的好处是分工明确前端开发可以独立选择组件库后端只关心接口稳定和数据处理。部署上也灵活前端打包成静态文件交给Nginx后端打成Jar包独立运行任何一个挂掉都不会直接拖垮整个应用。这个项目选择这种结构也方便你后面往大团队协作方式靠拢而不是停留在单体作坊里。2. 技术选型和项目结构里的门道2.1 SpringBoot、MyBatis、MySQL这套组合为什么经典社区团购管理系统的数据模型复杂查询条件多报表统计也多。SpringBoot解决的是“快速搭建工程”和“简化配置”的问题它内置了Tomcat打Jar就能跑省去了装外部容器和一堆XML配置的麻烦。MyBatis则是半自动ORM框架SQL写在Mapper里有什么复杂的表关联、动态查询、多条件拼接都能直接控制比自动生成SQL的JPA更灵活。MySQL在这个体量下完全够用社区版免费生态成熟维护的人也多很适合中小型项目。选型时还要考虑团队上手成本。SpringBootMyBatis是很多项目的标配网上资料多遇到问题好查Vue也是国内前端使用率很高的框架文档齐全。把这套技术栈源码跑通后续换成别的业务系统你也能很快理解框架。这个组合唯一的缺点是层与层之间的代码比较重复Controller、Service、Mapper要写很多样板但这些代码对初学者恰恰是帮助能看清楚数据是怎么一层层流到数据库的。2.2 后端和前端项目结构的划分思路拿到源码之后先别急着点运行先把目录结构看明白否则后面改起来很痛苦。后端通常按照“controller / service / mapper / entity / dto / common / config / utils”分层controller接收前端请求做参数校验返回统一结果。service写业务逻辑比如下单、库存扣减、订单状态更新。mapper写MyBatis的接口和XML/SQL。entity数据库表对应的实体类。dto前后端交互用的参数对象和返回对象避免直接暴露实体。common统一返回体、异常处理、常量定义。config跨域配置、拦截器配置、MyBatis分页配置。utilsJWT工具、日期工具、文件工具等。前端项目结构一般是“views / components / router / store / api / utils”views页面组件比如商品列表、订单详情、登录页。components可复用组件比如分页、弹框、图片上传。router路由配置同时处理路由守卫。store用Vuex或Pinia管理全局状态比如用户信息、权限标识。api按模块封装的接口请求方法统一调用axios。utils请求工具封装、日期格式化等。这样划分之后后端职责边界清晰前端也不需要在每个页面里重复写请求逻辑。你将来如果要改一个订单导出的功能直接在service和api层找对应方法就行。2.3 接口设计规范统一返回体和状态码前后端分离的项目里接口返回格式必须一致不然前端每个页面都要做特殊处理很乱。这套系统一般会定义一个Result对象包含code、message、data三个字段所有接口都返回这个对象。public class ResultT { private Integer code; private String message; private T data; public static T ResultT success(T data) { ResultT result new Result(); result.code 200; result.message success; result.data data; return result; } public static T ResultT error(Integer code, String message) { ResultT result new Result(); result.code code; result.message message; return result; } }前端axios封装就会根据code判断是直接返回data还是弹出错误提示。除了统一返回体接口路径也要遵循RESTful风格比如GET /api/product/list 分页查询商品POST /api/product 新增商品PUT /api/product 修改商品DELETE /api/product/{id} 删除商品POST /api/order/updateStatus 修改订单状态另外所有列表页都需要分页参数统一用pageNum和pageSize后端返回total、list、pageNum、pageSize四个字段。前端拿到整个对象之后分页组件直接绑定使用省去很多转换琐事。3. 数据库设计与核心模块实现3.1 核心表结构设计宁可字段冗余不要查询时再联表社区团购系统最核心的表大概有这些用户表、团长表、小区表、商品表、团购活动表、活动商品表、购物车表、订单表、订单明细表、售后表、配送表、管理员表。下面我挑几个重点表看设计思路。商品表字段名类型说明idbigint主键product_namevarchar商品名称pricedecimal(10,2)售价original_pricedecimal(10,2)原价stockint总库存limit_countint每人限购数category_idbigint分类IDimage_urlvarchar商品图片statustinyint上架状态create_timedatetime创建时间deletedtinyint逻辑删除订单表字段名类型说明idbigint主键order_novarchar订单号user_idbigint用户IDleader_idbigint团长IDtotal_amountdecimal(10,2)订单总金额statustinyint订单状态addressvarchar自提点或收货地址remarkvarchar备注create_timedatetime下单时间pay_timedatetime支付时间finish_timedatetime完成时间deletedtinyint逻辑删除订单明细表字段名类型说明idbigint主键order_idbigint订单IDproduct_idbigint商品IDproduct_namevarchar商品名称快照pricedecimal(10,2)成交单价countint购买数量subtotaldecimal(10,2)小计金额设计时要注意几个点价格必须用decimal不能用float或double否则金额出现精度问题很难处理。金额字段要反着算用unit_price乘以count在代码里算小计避免前端传不合理数据。商品名称、价格要在订单明细里做快照因为商品价格可能后续会变但订单里的历史价格不能跟着变。所有表都加一个deleted字段做逻辑删除而不是物理删除这样数据可以追溯。社区团购还有个特殊字段成团人数/成团门槛。这个可以放在团购活动表里字段叫group_min_num订单状态要和这个字段联动后面会细说。3.2 订单状态流转与并发控制社区团购的核心特色是“预售成团”。我建议把订单状态定义成一组常量状态定义清晰了后面流程就不容易乱。比如0待支付1待成团已支付未达到成团人数2已成团达到成团人数等待配送3配送中4已完成5已取消6售后中订单状态流转的方向是固定的比如待支付可以取消也可以支付变成待成团待成团在成团人数足够时变成已成团已成团之后才能配送。不要把状态搞复杂尽量在一个事务里更新订单状态。成团判断的逻辑可以放在后台订单管理里当订单支付成功插入订单后查询同一个团购活动下已支付订单的数量如果达到group_min_num就把这批订单的状态批量更新为“已成团”。这个动作在基础版本里可以放在支付回调/service里同步执行量大了再考虑Redis延迟队列。并发超卖是社区团购比较典型的问题。很简单的一个方案扣减库存时在SQL里加库存判断条件。UPDATE product SET stock stock - #{count} WHERE id #{productId} AND stock #{count} AND status 1在Service层判断update返回的行数如果影响行数为0直接抛异常说明库存不足或商品已下架。这个方案虽然不像Redis锁那么“高级”但胜在简单可靠数据不会出错适合当前这个体量的系统。3.3 管理员登录与权限控制的常见做法管理系统的管理员表通常会有一个角色字段区分“超级管理员”和“普通管理员”。简单做法是定义一个role字段超级管理员能访问所有接口普通管理员只能访问部分接口。接口权限用拦截器加注解的方式实现比较清爽。前端登录后拿到JWT token后端写一个AuthInterceptor从请求头里取出token并解析用户信息再存入ThreadLocal或请求上下文。对于需要特定权限的接口配合自定义注解RequireRole(ADMIN)来校验。Component public class AuthInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token request.getHeader(token); if (StringUtils.isBlank(token)) { throw new BizException(未登录); } // 解析token得到管理员ID和角色 Long adminId JwtUtil.getAdminId(token); String role JwtUtil.getRole(token); request.setAttribute(adminId, adminId); request.setAttribute(role, role); if (handler instanceof HandlerMethod) { HandlerMethod method (HandlerMethod) handler; RequireRole requireRole method.getMethodAnnotation(RequireRole.class); if (requireRole ! null !ADMIN.equals(role)) { throw new BizException(无权限访问); } } return true; } }前端要做路由守卫第一次进入页面时如果有token就算登录但最好调用一次“获取管理员信息”的接口确认token还有效避免页面都打开了才发现登录过期又一片空白。4. 核心功能实操从商品发布到订单配送4.1 商品管理图片上传和批量导入要注意什么商品管理的常见操作是新增商品、上架下架、编辑、批量导入、图片上传。图片上传这一块如果是本地项目最简单的方式是把图片保存到服务器的一个固定目录比如/static/upload/然后再把访问路径返回给前端。PostMapping(/api/upload) public ResultString upload(MultipartFile file) { String filePath System.getProperty(user.dir) /upload/; String originalFilename file.getOriginalFilename(); String suffix originalFilename.substring(originalFilename.lastIndexOf(.)); String newFileName System.currentTimeMillis() suffix; File dest new File(filePath newFileName); if (!dest.getParentFile().exists()) { dest.getParentFile().mkdirs(); } file.transferTo(dest); // 返回访问路径例如 /upload/20250101103012345.jpg return Result.success(/upload/ newFileName); }如果以后要上生产环境建议把图片存到对象存储服务数据库里保存相对路径或完整URL。这里需要提醒一个坑本地运行时设置的upload目录在打包部署后可能不在你想的位置。最好把上传目录配置在application.yml里而不是写死user.dir。商品批量导入一般用Excel前端选择文件后通过接口上传后端用比较成熟的Excel处理库解析循环写入数据库。导入时一定要做批量的数据校验比如价格不能小于0、库存不能为负数、商品名称不能为空否则某一行的脏数据会让整个批量事务回滚还要去翻日志才知道哪行格式不对。4.2 订单流程用户下单到后台履约用户下单的完整流程可以分成两个阶段第一阶段是前台用户提交订单第二阶段是后台管理员处理订单。前台提交订单时后端要做这几件事校验用户是否登录。根据购物车数据或商品ID查出商品信息核对价格和库存。扣减库存。生成订单号和订单明细。清空购物车。返回订单ID和应付金额。这些操作要放在一个事务里任何一步失败都不能留下脏数据。订单号的生成建议用时间戳加随机数或者用日期加自增ID避免并发时重复。最简单的就是String orderNo ORD System.currentTimeMillis() RandomUtil.randomNumbers(4);。生产环境如果要求更严格可以用数据库序列或分布式ID但基础版本这样够用。后台订单管理主要就是分页查询、查看详情、修改状态、导出。订单详情页面要把订单明细、用户信息、团长信息、配送信息拼在一起展示。这里没必要每次查询都用多表嵌套可以分几次查询在Service层组装代码读起来更清晰。配送操作要批量处理比如管理员勾选同一小区的多笔订单点击“确认配送”就把这些订单状态统一改成配送中并且生成一条配送记录。社区团购很多订单是送到自提点的这个功能后期加上地图轨迹会更强但基础版先不必要。4.3 团长管理审核和佣金计算的基本思路团长模块看着简单实际上和订单、用户、小区都有关联。团长表至少要包含团长姓名、手机号、所属小区ID、审核状态、佣金比例、提现账户等信息。管理员操作团长时有一个关键动作绑定小区。因为用户下单时要选择小区系统要能把订单和团长关联起来。建议在小区表里直接加上leader_id字段下单时用户选择小区后订单直接记录leader_id这样后续佣金统计非常简单。佣金计算可以在订单完成后触发。比如佣金比例是5%订单实付金额是100元那么佣金就是5元。注意佣金计算要用订单实付金额不是商品原价还得减去退款金额。把这些逻辑放到Service层不要直接在SQL里算便于以后调整规则。5. 前后端联调中的关键问题5.1 跨域配置别等联调时才两眼一抹黑前后端分离之后前端运行在localhost:8081后端运行在localhost:8080浏览器会拦截跨域请求。解决方式有两种前端开发环境用Vite代理后端配置CORS。实际项目里两边都要配因为开发时要用代理联调生产环境用Nginx反向代理时也需要后端允许特定来源。后端配置CORS有两种方式一种是在Config里写全局CorsFilter另一种是在Controller上加CrossOrigin注解。全局配置更省事Configuration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOriginPatterns(*) .allowedMethods(GET, POST, PUT, DELETE, OPTIONS) .allowedHeaders(*) .allowCredentials(true) .maxAge(3600); } }如果使用了JWT前端请求会带上自定义请求头比如token所以allowedHeaders必须允许。还要注意allowCredentials(true)和allowedOriginPatterns()配合使用直接写allowedOrigins()在某些浏览器版本里会报错。5.2 Axios拦截器和登录状态的自动处理前端所有的请求都应该通过axios封装不要在每一个页面里单独写请求。请求拦截器负责把token放到请求头里响应拦截器负责统一处理错误。service.interceptors.request.use(config { const token localStorage.getItem(token) if (token) { config.headers[token] token } return config }, error { return Promise.reject(error) }) service.interceptors.response.use(response { const res response.data if (res.code 200) { return res.data } if (res.code 401) { localStorage.removeItem(token) router.push(/login) } return Promise.reject(new Error(res.message || 请求失败)) }, error { return Promise.reject(error) })这里有个容易忽略的细节接口返回的code是200不代表HTTP请求就是200。所以axios的成功回调里一定要先判断业务code再决定是否返回数据。后端全局异常处理也要统一返回Result对象前端才能统一弹错误提示。5.3 分页插件和日期格式化的坑后端列表页分页最常用的是PageHelper在SpringBoot项目里引入依赖后在Mapper查询前调用PageHelper.startPage即可PageHelper.startPage(pageNum, pageSize); ListProduct list productMapper.selectProductList(query); PageInfoProduct pageInfo new PageInfo(list);PageHelper的坑在于它通过ThreadLocal保存分页参数如果并发情况下一次请求里有多条查询分页参数可能串到别的查询上。尽量避免在分页查询中再执行其它SQL或者在一段分页逻辑结束后调用PageHelper.clearPage()。日期格式则是老生常谈。MySQL连接串要设置serverTimezoneAsia/Shanghai否则默认用的UTC时间查出来的时间比本地时间少8小时。SpringBoot返回JSON时如果LocalDateTime没有配置格式前端拿到的是“2025-01-01T10:00:00”这种带T的字符串很丑。建议在application.yml里配置全局日期格式spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT8如果还想要毫秒级时间戳可以配合注解单独处理但基础项目统一按这个配置就够了。6. 完整部署教程从本地到服务器6.1 本地环境准备和数据库导入本地需要准备的工具JDK 1.8或8以上建议用8或11太新的版本要关注SpringBoot版本是否兼容。Maven 3.6。Node.js 14。MySQL 5.7或8.0。IDE可选VSCode或IDEA都行。先在本地创建数据库例如叫group_buy字符集选择utf8mb4然后导入项目提供的sql文件。导入时注意MySQL 8.0默认编码、排序规则如果SQL文件里有旧语法可能需要对某些字段做兼容修改。CREATE DATABASE IF NOT EXISTS group_buy DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE group_buy; SOURCE /your_path/group_buy.sql;后端启动之前要修改application.yml中的数据库账号密码。本地如果也装了MySQL端口是3306那么连接串直接写localhost:3306。如果账号密码不对启动时会报Access denied需要仔细检查。6.2 后端打包与启动后端打包一般用Maven命令mvn clean package -DskipTests打包完成后在target目录下会生成一个xxx.jar文件。部署时可以直接运行java -jar xxx.jar --spring.profiles.activeprod我建议单独创建一个profile比如application-prod.yml把生产环境的数据库连接、上传路径、端口等放进去避免和本地配置混在一起。SpringBoot创建上传目录时应用本身要有对应目录的写权限否则上传接口会报FileNotFoundException。在生产环境用systemd托管Jar包会好很多崩溃后能自动重启还能看日志。创建一个服务文件[Unit] DescriptionGroupBuy Server Afternetwork.target [Service] Userroot WorkingDirectory/home/app ExecStart/usr/bin/java -jar /home/app/group-buy.jar Restarton-failure RestartSec5 [Install] WantedBymulti-user.target然后执行systemctl daemon-reload、systemctl enable groupbuy、systemctl start groupbuy这样服务就能后台运行了。6.3 前端打包与Nginx部署前端的部署更简单但也更容易出错。执行npm install npm run build打包完成后在dist目录里生成静态文件。把dist目录里的内容整个传到服务器的某个目录比如/var/www/group-buy。然后配置Nginx站点server { listen 80; server_name your-domain.com; root /var/www/group-buy; index index.html; location /api/ { proxy_pass http://127.0.0.1:8080/api/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location / { try_files $uri $uri/ /index.html; } }try_files这一行特别关键因为Vue是history路由刷新页面时如果URL是“/product/list”Nginx找不到这个物理文件就会404。加上了try_files之后所有没有匹配到静态文件的请求都会回到index.html由前端路由接管。反向代理配置里proxy_pass的写法也很讲究。上面写的是http://127.0.0.1:8080/api/;这样后端接口原本的/api前缀会保留后端Controller里写的/api/product正好匹配。如果你想去掉前缀就要写成http://127.0.0.1:8080/;同时后端路径要改成/product。建议保留原前缀避免后端路径改动。6.4 服务器环境和端口检查服务器开放端口时如果用的是云厂商的安全组也要配置不只是在服务器内部开防火墙。后端Jar默认端口是8080前端通过Nginx监听80所以安全组一般放行80和4438080不要直接对公网开放这样更安全。MySQL在生产环境如果只有本地程序访问绑定的地址最好改成127.0.0.1不要用0.0.0.0。给程序创建单独数据库账号只授权特定数据库避免使用root账号到处连。否则一旦程序被注入漏洞数据库就全部裸奔了。部署完之后可以用curl -X GET http://127.0.0.1:8080/api/product/list?pageNum1pageSize10 -H token: ...测试接口是否通然后再用浏览器访问前端域名。如果返回JSON说明后端正常如果502说明Nginx到后端不通检查后端服务是否启动、防火墙端口、proxy_pass配置。7. 常见问题与排查技巧实录7.1 数据库连接和时区问题最容易遇到的是启动时报错“The server time zone value йʱ is unrecognized”这是MySQL 8.0的时区设置问题。在JDBC连接串里加上serverTimezoneAsia/Shanghai和useUnicodetruecharacterEncodingutf8就能解决。url: jdbc:mysql://localhost:3306/group_buy?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalseallowPublicKeyRetrievaltrue如果你用了MySQL 8.0还需要allowPublicKeyRetrievaltrue否则可能报“Public Key Retrieval is not allowed”。这些参数不用死记遇到问题照着加就行。日期少了8小时的问题基本都出在连接串没配serverTimezone或全局时区没配。前面提到的jackson time-zone: GMT8也要加上不然前后端显示的时间还可能不一致。7.2 前端页面刷新后404这个问题我在很多第一次部署Vue项目的朋友身上见过。后端路由能打开但刷新页面就404。原因就是Nginx没有配置try_files。前面已经给出了配置代码这里再强调一下history路由刷新404不是代码问题是服务器需要一层“兜底”把所有路由请求都指向index.html。如果用了前端vue-router的createWebHistory除了Nginx要配后端跨域也要注意因为可能存在预检请求如果后端没处理OPTIONS浏览器会拦截请求导致登录后页面一直转圈。7.3 接口一直提示跨域或401跨域的典型表现是浏览器控制台出现CORS error。排查顺序是先确认后端CorsConfig有没有生效。再确认前端请求头里是不是带了token。查看是不是后端在拦截器里直接抛了401导致前端报错。如果是登录接口白名单没放行就会出现登录时也401。务必在拦截器里把/api/admin/login、/api/upload等不需要登录的接口放行否则系统完全进不去。登录状态失效还有一种隐藏情况前后端时间不一致。JWT过期时间判断依赖服务器时间如果服务器时间比客户端慢或快很多也会出现明明刚登录就被踢下线。部署后最好检查一下服务器时间和时区用date -R查看。7.4 部署后上传图片无法访问本地开发时图片上传到用户目录部署后上传路径变成了Jar包所在目录。如果你上传之后发现接口成功但浏览器访问图片返回404多半是上传目录里确实写了文件但Nginx没有配置静态文件映射。简单办法是把上传目录放到前端静态目录下比如/var/www/group-buy/upload然后在Nginx的location里加一行location /upload/ { alias /var/www/group-buy/upload/; }如果后端是自己写了一个/api/upload接口返回文件流也要确保这个接口没有被拦截。图片访问不到时先看返回的路径是相对路径还是绝对路径再对着Nginx配置排查别一上来就怀疑代码写错。7.5 并发不高但订单重复没有引入Redis锁的情况下订单重复一般是因为前端连点了两次“提交订单”按钮。最直接的解决办法是前端按钮点击后立即置灰同时后端在生成订单号时做成唯一索引。如果同一个订单号插入失败就会抛出Duplicate Key异常事务回滚不会产生重复订单。更稳妥的做法是在订单表里加一个唯一约束比如uk_user_product用户ID商品ID活动ID这样就算用户手滑多次提交第二次也会被数据库拦截。社区团购是低频操作这种简单约束比复杂分布式锁更实用。最后分享一点个人习惯我实际部署这套项目时最花时间的不是写代码而是处理Nginx静态资源路径和MySQL时区这两个地方。如果你也是第一次搞前后端分离项目建议严格按照“先本地跑通、再打包部署、最后上云”的顺序来不要一上来就直接在服务器上连线排错。拿到源码之后我建议你先打开数据库的订单表和订单明细表把状态字段的值对着源码里的常量和状态流转图看一遍。这一步很枯燥但能帮你把整个业务串起来后面任何模块有问题你都能顺着数据流定位到Controller、Service还是Mapper。能把这一套系统完整跑通你对SpringBoot、Vue、MyBatis和MySQL这套组合的理解会提高一个档次。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号