Java 多商户团购小程序:用户端 + 商家端 + 后台管理实战

发布时间:2026/5/22 18:32:14

Java 多商户团购小程序:用户端 + 商家端 + 后台管理实战 以下是针对Java 多商户团购小程序的完整实战方案涵盖用户端、商家端、后台管理三大模块包含技术选型、核心功能设计、数据库设计、高并发优化及安全控制可直接用于实际项目开发或毕业设计。一、项目架构设计1. 技术栈选择模块技术选型后端框架Spring Boot 2.7 Spring Cloud AlibabaNacos注册中心、Sentinel限流数据库MySQL 8.0主从复制 Redis 6.0缓存/分布式锁消息队列RabbitMQ 3.9异步通知、订单超时处理文件存储MinIO图片/视频存储 CDN加速前端用户端UniApp跨端小程序商家端/后台Vue3 Element Plus安全JWT Spring Security OAuth2多端鉴权HTTPS 敏感数据AES加密部署Docker Kubernetes集群化部署Nginx负载均衡2. 架构图mermaidgraph TD subgraph 用户端 A[微信小程序] -- B[UniApp] B -- C[HTTP请求] end subgraph 商家端 D[商家Web管理端] -- E[Vue3] E -- C end subgraph 后台管理 F[后台管理系统] -- G[Vue3] G -- C end subgraph 服务端 C -- H[API网关] H -- I[用户服务] H -- J[商户服务] H -- K[订单服务] H -- L[支付服务] I -- M[MySQL主库] J -- M K -- M L -- M M -- N[MySQL从库] I -- O[Redis缓存] J -- O K -- O L -- O K -- P[RabbitMQ] end二、核心功能设计1. 用户端功能1团购商品浏览功能点商品分类展示美食、娱乐等团购详情页价格、已购人数、剩余时间附近商户推荐基于LBS定位技术实现Redis缓存热门商品列表ZSET按销量排序MySQL空间索引查询附近商户ST_Distance_Sphere函数2下单支付流程mermaidsequenceDiagram 用户-小程序: 选择商品数量 小程序-用户服务: 校验库存 用户服务---小程序: 返回剩余库存 用户-小程序: 提交订单 小程序-订单服务: 创建订单 订单服务-支付服务: 生成预支付订单 支付服务---小程序: 返回支付参数 小程序-微信支付: 调起支付 微信支付---小程序: 支付结果通知 小程序-订单服务: 更新订单状态关键代码java// 支付服务生成预订单 Transactional public PrePayDTO createPreOrder(Long userId, Long productId, Integer quantity) { // 1. 校验库存Redis分布式锁 String lockKey lock:product: productId; try (RLock lock redissonClient.getLock(lockKey)) { lock.lock(10, TimeUnit.SECONDS); Product product productMapper.selectById(productId); if (product.getStock() quantity) { throw new RuntimeException(库存不足); } // 2. 扣减库存乐观锁 int updated productMapper.updateStock(productId, product.getStock() - quantity); if (updated 0) { throw new RuntimeException(并发冲突请重试); } // 3. 生成订单 Order order new Order(); order.setUserId(userId); order.setProductId(productId); order.setStatus(UNPAID); orderMapper.insert(order); // 4. 返回微信支付参数 return weChatPayService.generatePrePay(order.getId()); } }3核销码生成规则商户ID 订单ID 时间戳 随机数AES加密后存储javapublic String generateVerifyCode(Long merchantId, Long orderId) { String raw merchantId | orderId | System.currentTimeMillis() | UUID.randomUUID(); return AESUtil.encrypt(raw, SECRET_KEY); }2. 商家端功能1团购商品管理功能点商品上下架库存修改需校验未支付订单数量团购活动设置开始/结束时间、限购数量技术实现使用Quartz定时任务自动下架过期商品javaScheduled(cron 0 0 */1 * * ?) // 每小时执行 public void autoExpireProducts() { productMapper.updateStatusByExpireTime(EXPIRED, LocalDateTime.now()); }2核销订单流程商家扫描用户核销码或输入码。解密核销码校验商户ID是否匹配。调用订单服务核销接口Redis分布式锁防止重复核销。关键代码javaPostMapping(/verify) public ResponseEntity? verifyOrder(RequestBody VerifyRequest request, AuthenticationPrincipal MerchantUser merchantUser) { // 1. 解密核销码 String decrypted AESUtil.decrypt(request.getCode(), SECRET_KEY); Long codeMerchantId extractMerchantId(decrypted); // 2. 校验商户权限 if (!merchantUser.getMerchantId().equals(codeMerchantId)) { throw new AccessDeniedException(无权核销该订单); } // 3. 调用核销服务 orderService.verifyOrder(request.getOrderId(), merchantUser.getMerchantId()); return ResponseEntity.ok(核销成功); }3数据看板展示内容今日订单数/销售额商品销量排行榜RedisZSET实现用户增长趋势ECharts图表3. 后台管理功能1商户管理功能点商户入驻审核上传营业执照、法人身份证商户状态管理启用/禁用商户结算记录查询技术实现使用MinIO存储商户资质文件返回访问URLjavapublic String uploadFile(MultipartFile file) { String fileName UUID.randomUUID() . FileUtil.extName(file.getOriginalFilename()); minioClient.putObject( PutObjectArgs.builder() .bucket(merchant-certs) .object(fileName) .stream(file.getInputStream(), file.getSize(), -1) .contentType(file.getContentType()) .build() ); return https://minio.example.com/merchant-certs/ fileName; }2风控管理规则同一用户30分钟内下单超过10次触发限流Sentinel。商户日核销金额超过1万元需人工审核。配置示例yaml# Sentinel限流规则 spring: cloud: sentinel: transport: dashboard: localhost:8080 rules: flow-rules: - resource: /api/order/create threshold: 10 # QPS阈值 control-behavior: default # 直接拒绝三、数据库设计1. 核心表结构1用户表usersqlCREATE TABLE user ( id BIGINT AUTO_INCREMENT PRIMARY KEY, openid VARCHAR(64) NOT NULL COMMENT 微信openid, nickname VARCHAR(50) NOT NULL, avatar VARCHAR(255) COMMENT 头像URL, create_time DATETIME DEFAULT CURRENT_TIMESTAMP );2商户表merchantsqlCREATE TABLE merchant ( id BIGINT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, logo VARCHAR(255) COMMENT 商户logo, status ENUM(PENDING, APPROVED, REJECTED, DISABLED) DEFAULT PENDING, create_time DATETIME DEFAULT CURRENT_TIMESTAMP );3团购商品表productsqlCREATE TABLE product ( id BIGINT AUTO_INCREMENT PRIMARY KEY, merchant_id BIGINT NOT NULL, name VARCHAR(100) NOT NULL, price DECIMAL(10,2) NOT NULL, stock INT NOT NULL DEFAULT 0, start_time DATETIME NOT NULL, end_time DATETIME NOT NULL, status ENUM(DRAFT, ONLINE, OFFLINE, EXPIRED) DEFAULT DRAFT, FOREIGN KEY (merchant_id) REFERENCES merchant(id) );4订单表ordersqlCREATE TABLE order ( id BIGINT AUTO_INCREMENT PRIMARY KEY, user_id BIGINT NOT NULL, product_id BIGINT NOT NULL, merchant_id BIGINT NOT NULL, total_amount DECIMAL(10,2) NOT NULL, status ENUM(UNPAID, PAID, VERIFIED, REFUNDED) DEFAULT UNPAID, verify_code VARCHAR(128) COMMENT 加密后的核销码, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES user(id), FOREIGN KEY (product_id) REFERENCES product(id), FOREIGN KEY (merchant_id) REFERENCES merchant(id) );2. 索引优化sql-- 商品表索引加速按商户查询 CREATE INDEX idx_product_merchant ON product(merchant_id); -- 订单表索引加速核销码查询 CREATE INDEX idx_order_verify_code ON order(verify_code); -- 订单表索引加速用户订单列表查询 CREATE INDEX idx_order_user ON order(user_id, status);四、高并发优化方案1. 缓存策略热门商品缓存java// 使用Redis缓存商品详情TTL5分钟 public Product getProductFromCache(Long productId) { String cacheKey product:detail: productId; String json redisTemplate.opsForValue().get(cacheKey); if (json ! null) { return JSON.parseObject(json, Product.class); } Product product productMapper.selectById(productId); if (product ! null) { redisTemplate.opsForValue().set(cacheKey, JSON.toJSONString(product), 5, TimeUnit.MINUTES); } return product; }2. 分布式锁核销接口防重复javapublic void verifyOrder(Long orderId, Long merchantId) { String lockKey verify:lock: orderId; try (RLock lock redissonClient.getLock(lockKey)) { lock.lock(10, TimeUnit.SECONDS); Order order orderMapper.selectById(orderId); if (!PAID.equals(order.getStatus())) { throw new RuntimeException(订单状态异常); } if (!merchantId.equals(order.getMerchantId())) { throw new RuntimeException(无权核销该订单); } orderMapper.updateStatus(orderId, VERIFIED); } }3. 异步处理订单超时关闭javaRabbitListener(queues order.timeout.queue) public void handleTimeoutOrder(Long orderId) { Order order orderMapper.selectById(orderId); if (UNPAID.equals(order.getStatus())) { orderMapper.updateStatus(orderId, CLOSED); // 返还库存 productMapper.increaseStock(order.getProductId(), 1); } }五、安全控制1. 接口鉴权JWT令牌生成javapublic String generateToken(Long userId, String role) { return Jwts.builder() .setSubject(userId.toString()) .claim(role, role) // USER/MERCHANT/ADMIN .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() 86400000)) // 1天过期 .signWith(SignatureAlgorithm.HS512, SECRET_KEY) .compact(); }2. 数据脱敏用户手机号脱敏javapublic String maskPhoneNumber(String phone) { if (phone null || phone.length() ! 11) { return phone; } return phone.replaceAll((\\d{3})\\d{4}(\\d{4}), $1****$2); }3. 操作审计记录关键操作sqlCREATE TABLE operation_log ( id BIGINT AUTO_INCREMENT PRIMARY KEY, operator_id BIGINT NOT NULL, operator_type ENUM(USER, MERCHANT, ADMIN) NOT NULL, action VARCHAR(50) NOT NULL COMMENT 操作类型如核销订单, ip VARCHAR(15) NOT NULL, create_time DATETIME DEFAULT CURRENT_TIMESTAMP );六、毕业设计展示要点核心功能演示用户下单支付流程截图视频。商家核销订单操作扫码/输入码。后台商户审核与数据看板。性能测试报告使用JMeter模拟2000QPS下单请求响应时间P99 300ms。Redis缓存命中率90%数据库CPU使用率40%。安全测试拦截未授权访问返回401 Unauthorized。防止核销码伪造AES加密校验。架构图与代码讲解重点讲解分布式锁、异步任务、限流等关键实现。七、总结模块技术亮点用户端UniApp跨端开发 微信支付集成 LBS定位商家端核销码安全校验 Quartz定时任务 ECharts数据可视化后台管理商户资质审核 Sentinel风控 MinIO文件存储性能优化Redis缓存 Redisson分布式锁 RabbitMQ异步处理安全控制JWT多端鉴权 AES数据加密 操作审计日志此方案覆盖多商户团购小程序全流程可直接用于实际项目开发或毕业设计兼顾功能完整性与技术深度。

相关新闻