微信小程序订餐系统设计

SpringBoot后端与微信小程序前端结合的订餐系统需要完成用户认证、菜单展示、订单管理、支付对接等核心功能模块。以下是关键实现要点:

技术架构设计

后端采用SpringBoot+MyBatis Plus框架,数据库使用MySQL,缓存采用Redis。微信小程序通过HTTPS协议与后端交互,数据格式为JSON。支付模块需对接微信支付接口。

后端技术栈:
- SpringBoot 2.7.x
- MySQL 8.0
- Redis 6.2
- Maven 3.8

数据库设计

核心表包括用户表、菜品表、订单表、购物车表。用户表需存储openid作为唯一标识,订单表需包含支付状态字段。

CREATE TABLE `dish` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `price` decimal(10,2) NOT NULL,
  `image_url` varchar(255) DEFAULT NULL,
  `category_id` bigint NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

微信登录实现

小程序调用wx.login获取code,后端通过auth.code2Session接口获取openid。SpringSecurity可配置JWT认证过滤器。

@RestController
@RequestMapping("/auth")
public class AuthController {
    @GetMapping("/login")
    public Result<String> login(@RequestParam String code) {
        String url = "https://api.weixin.qq.com/sns/jscode2session";
        Map<String,String> params = new HashMap<>();
        params.put("appid", APPID);
        params.put("secret", SECRET);
        params.put("js_code", code);
        params.put("grant_type", "authorization_code");
        String response = restTemplate.getForObject(url, String.class, params);
        JSONObject json = JSON.parseObject(response);
        return Result.success(json.getString("openid"));
    }
}

订单流程处理

订单状态机包含待支付、已支付、制作中、已配送、已完成等状态。使用Redis分布式锁防止超卖。

@Service
public class OrderServiceImpl implements OrderService {
    @Transactional
    public Result createOrder(OrderDTO orderDTO) {
        String lockKey = "dish_" + orderDTO.getDishId();
        boolean locked = redisLock.tryLock(lockKey, 10, TimeUnit.SECONDS);
        if (!locked) {
            throw new BusinessException("当前菜品太火爆,请稍后再试");
        }
        try {
            // 扣减库存
            dishMapper.reduceStock(orderDTO.getDishId(), orderDTO.getQuantity());
            // 创建订单
            Order order = new Order();
            BeanUtils.copyProperties(orderDTO, order);
            orderMapper.insert(order);
            return Result.success(order.getId());
        } finally {
            redisLock.unlock(lockKey);
        }
    }
}

微信支付集成

调用统一下单接口生成预支付订单,小程序调起支付API。需处理支付结果通知和订单状态同步。

@RestController
@RequestMapping("/pay")
public class PayController {
    @PostMapping("/prepay")
    public Result<Map<String,String>> prepay(@RequestBody PrepayRequest request) {
        Map<String,String> params = new HashMap<>();
        params.put("body", "餐饮订单支付");
        params.put("out_trade_no", request.getOrderNo());
        params.put("total_fee", String.valueOf(request.getAmount()));
        params.put("openid", request.getOpenid());
        params.put("trade_type", "JSAPI");
        
        WXPay wxPay = new WXPay(config);
        Map<String,String> resp = wxPay.unifiedOrder(params);
        if ("SUCCESS".equals(resp.get("return_code"))) {
            Map<String,String> prepay = new HashMap<>();
            prepay.put("timeStamp", String.valueOf(System.currentTimeMillis()/1000));
            prepay.put("package", "prepay_id=" + resp.get("prepay_id"));
            prepay.put("signType", "MD5");
            // 生成签名
            String sign = WXPayUtil.generateSignature(prepay, KEY);
            prepay.put("paySign", sign);
            return Result.success(prepay);
        }
        return Result.error(resp.get("return_msg"));
    }
}

小程序前端要点

页面需包含首页菜单展示、购物车页面、订单确认页、个人中心页。使用微信小程序组件如picker、scroll-view等优化交互体验。

小程序页面结构:
pages/
  index/       - 首页
  category/    - 分类页
  cart/        - 购物车
  order/       - 订单页
  my/          - 个人中心

系统实现时需注意微信小程序规范要求,包括网络请求域名备案、用户隐私协议等。支付功能必须通过微信审核后才能上线使用。

更多推荐