小程序外卖开发源码
概述
小程序外卖系统是当前餐饮行业的数字化转型重要组成部分,通过微信小程序平台为用户提供便捷的在线点餐、支付、配送等一站式服务。本文将详细介绍小程序外卖系统的开发架构、核心功能模块及关键源码实现。
技术架构
前端技术栈
- 小程序框架: 微信原生小程序 / uni-app / Taro
- UI组件库: WeUI / Vant Weapp / ColorUI
- 状态管理: MobX / Redux / Pinia
后端技术栈
- 开发语言: Node.js / Java / Python
- 框架选择: Express / Spring Boot / Django
- 数据库: MySQL / MongoDB / Redis
- 服务器部署: Nginx + PM2 / Docker
核心功能模块
1. 用户端模块
// 用户登录授权
wx.login({
success: (res) => {
if (res.code) {
// 发送code到后端换取openid
this.getUserInfo(res.code)
}
}
})
// 获取用户信息
getUserInfo(code) {
wx.request({
url: 'https://api.example.com/login',
method: 'POST',
data: { code },
success: (res) => {
// 存储用户token
wx.setStorageSync('token', res.data.token)
}
})
}
2. 商家管理模块
// 菜品管理API
app.post('/api/dish', async (req, res) => {
try {
const { name, price, description, image, category } = req.body
const dish = new Dish({
name,
price,
description,
image,
category,
createdAt: new Date()
})
await dish.save()
res.json({ code: 200, message: '添加成功', data: dish })
} catch (error) {
res.status(500).json({ code: 500, message: '服务器错误' })
}
})
3. 订单处理模块
// 创建订单
async function createOrder(userId, items, address) {
const session = await mongoose.startSession()
session.startTransaction()
try {
// 计算订单金额
const totalAmount = items.reduce((sum, item) => {
return sum + item.price * item.quantity
}, 0)
const order = new Order({
userId,
items,
address,
totalAmount,
status: 'pending',
orderNo: generateOrderNo()
})
await order.save({ session })
await session.commitTransaction()
return order
} catch (error) {
await session.abortTransaction()
throw error
} finally {
session.endSession()
}
}
数据库设计
用户表结构
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`openid` varchar(100) NOT NULL,
`nickname` varchar(50) DEFAULT NULL,
`avatar` varchar(255) DEFAULT NULL,
`phone` varchar(20) DEFAULT NULL,
`created_at` timestamp DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `openid` (`openid`)
);
订单表结构
CREATE TABLE `orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`order_no` varchar(32) NOT NULL,
`user_id` int(11) NOT NULL,
`total_amount` decimal(10,2) NOT NULL,
`status` enum('pending','paid','delivering','completed','cancelled') DEFAULT 'pending',
`address` text,
`created_at` timestamp DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `order_no` (`order_no`),
KEY `user_id` (`user_id`)
);
支付集成
// 微信支付
const wxpay = require('wechat-pay-nodejs-sdk')
app.post('/api/payment', async (req, res) => {
const { orderId, totalAmount } = req.body
const paymentParams = {
body: '外卖订单支付',
out_trade_no: orderId,
total_fee: totalAmount * 100, // 转换为分
spbill_create_ip: req.ip,
notify_url: 'https://api.example.com/payment/notify',
trade_type: 'JSAPI'
}
try {
const result = await wxpay.unifiedOrder(paymentParams)
res.json({
code: 200,
data: {
appId: result.appid,
timeStamp: Math.floor(Date.now() / 1000).toString(),
nonceStr: result.nonce_str,
package: `prepay_id=${result.prepay_id}`,
signType: 'MD5'
}
})
} catch (error) {
res.status(500).json({ code: 500, message: '支付失败' })
}
})
部署与优化
性能优化
- 图片压缩与CDN加速
- 接口缓存策略
- 数据库索引优化
- 前端分包加载
安全措施
- API接口鉴权
- 敏感数据加密
- SQL注入防护
- XSS攻击防护
总结
小程序外卖系统开发涉及前后端多个技术栈的整合,需要考虑用户体验、系统性能、支付安全等多个方面。通过合理的技术选型和架构设计,可以构建一个稳定、高效的外卖服务平台。在实际开发中,还需要根据业务需求不断迭代优化,为用户提供更好的服务体验。
