基于springboot的微信小程序的订餐系统
·
微信小程序订餐系统设计
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/ - 个人中心
系统实现时需注意微信小程序规范要求,包括网络请求域名备案、用户隐私协议等。支付功能必须通过微信审核后才能上线使用。








更多推荐



所有评论(0)