餐饮小程序极速开发指南:从0到1搭建外卖点餐系统

餐饮小程序极速开发指南:从0到1搭建外卖点餐系统

【免费下载链接】bee 微信小程序-餐饮点餐外卖-开箱即用 【免费下载链接】bee 项目地址: https://gitcode.com/gooking2/bee

引言:餐饮商家的数字化转型痛点与解决方案

你是否还在为餐饮外卖系统开发周期长、成本高而烦恼?是否面临第三方平台抽成过高、客户数据无法沉淀的困境?本文将带你深入了解如何利用gooking2/bee微信小程序框架,以最低成本、最快速度搭建一套完整的餐饮点餐外卖系统。

读完本文后,你将能够:

  • 掌握gooking2/bee框架的核心架构与组件使用
  • 实现从商品展示、购物车到支付的完整业务流程
  • 配置多语言支持与门店管理功能
  • 部署一套可直接上线运营的餐饮小程序

一、项目架构与技术选型

1.1 整体架构概览

gooking2/bee采用经典的微信小程序架构,基于原生小程序框架开发,同时整合了Vant Weapp组件库,形成了高效、可扩展的技术体系。

mermaid

1.2 核心技术栈

技术说明版本
微信小程序原生框架基础开发框架最新
Vant Weapp轻量、可靠的小程序UI组件库最新
JavaScript主要开发语言ES6+
WXML/WXSS页面结构与样式最新
Apifm-wxapi后端API接口封装最新

1.3 项目目录结构

gooking2/bee/
├── app.js                 # 应用入口文件
├── app.json               # 全局配置
├── app.wxss               # 全局样式
├── config.js              # 项目配置
├── components/            # 自定义组件
│   ├── parser/            # HTML解析组件
│   └── payment/           # 支付组件
├── i18n/                  # 国际化配置
├── images/                # 图片资源
├── miniprogram_npm/       # npm依赖包
├── pages/                 # 页面文件
│   ├── home/              # 首页
│   ├── goods/             # 商品相关
│   ├── cart/              # 购物车
│   ├── order/             # 订单相关
│   ├── pay/               # 支付相关
│   └── my/                # 个人中心
└── utils/                 # 工具函数
    ├── pay.js             # 支付工具
    ├── auth.js            # 授权工具
    └── util.js            # 通用工具

二、环境搭建与项目初始化

2.1 开发环境准备

  1. 安装微信开发者工具
  2. 获取微信小程序AppID
  3. 安装Node.js环境
  4. 配置Git环境

2.2 项目获取与安装

# 克隆项目仓库
git clone https://gitcode.com/gooking2/bee.git

# 进入项目目录
cd gooking2/bee

# 安装依赖
npm install

2.3 配置项目

项目的核心配置文件为config.js,主要包含以下配置项:

module.exports = {
  version: "25.04.24",
  note: '我的礼品卡显示送礼人头像和昵称',
  subDomain: "beeorder", // 子域名,需根据教程设置
  merchantId: 27, // 商户ID,可在后台查看
  customerServiceType: 'QW' // 客服类型,QW为企业微信
}

配置说明

  • subDomain:需根据官方教程设置自己的子域名
  • merchantId:商户ID,在后台工厂设置-商户信息中查看
  • customerServiceType:客服类型,默认企业微信客服

三、核心功能模块实现

3.1 应用入口与全局配置

app.js是应用的入口文件,负责应用的初始化、生命周期管理等核心功能:

App({
  onLaunch: function() {
    // 初始化国际化
    i18n.getLanguage()
    this.setTabBarLanguage()
    
    // 初始化API
    WXAPI.init(CONFIG.subDomain)
    WXAPI.setMerchantId(CONFIG.merchantId)
    
    // 检测新版本
    const updateManager = wx.getUpdateManager()
    updateManager.onUpdateReady(function () {
      wx.showModal({
        confirmText: $t.common.confirm,
        cancelText: $t.common.cancel,
        content: $t.common.upgrade,
        success(res) {
          if (res.confirm) {
            updateManager.applyUpdate()
          }
        }
      })
    })
    
    // 网络状态监测
    wx.getNetworkType({/* ... */})
    wx.onNetworkStatusChange(function(res) {/* ... */})
    
    // 加载配置信息
    WXAPI.queryConfigBatch('mallName,myBg,mapPos,...').then(res => {/* ... */})
  },
  
  onShow: function(e) {
    // 处理页面显示逻辑,如登录状态检查、分享参数处理等
  },
  
  // 其他核心方法...
  getUserApiInfo() {/* ... */},
  initLanguage(_this) {/* ... */},
  changeLang(_this) {/* ... */},
  setTabBarLanguage() {/* ... */},
  
  globalData: {
    isConnected: true
  }
})

3.2 商品展示与购物车功能

3.2.1 商品列表实现

商品列表页面(pages/goods/list.js)负责展示商品信息,支持分类筛选、搜索等功能:

// 核心代码片段
Page({
  data: {
    goodsList: [],
    categories: [],
    activeCategoryId: 0,
    page: 1,
    pageSize: 10,
    loading: false,
    searchKeyword: ''
  },
  
  onLoad: function(options) {
    getApp().initLanguage(this)
    this.getCategories()
    this.getGoodsList()
  },
  
  // 获取分类
  async getCategories() {
    const res = await WXAPI.goodsCategory()
    if (res.code == 0) {
      this.setData({
        categories: res.data,
        activeCategoryId: res.data.length > 0 ? res.data[0].id : 0
      })
    }
  },
  
  // 获取商品列表
  async getGoodsList() {
    wx.showLoading({ title: '' })
    this.setData({ loading: true })
    
    const res = await WXAPI.goods({
      categoryId: this.data.activeCategoryId,
      keyword: this.data.searchKeyword,
      page: this.data.page,
      pageSize: this.data.pageSize
    })
    
    wx.hideLoading()
    if (res.code == 0) {
      this.setData({
        goodsList: this.data.page === 1 ? res.data : this.data.goodsList.concat(res.data),
        loading: false
      })
    }
  },
  
  // 分类切换
  onCategoryChange(e) {
    this.setData({
      activeCategoryId: e.currentTarget.dataset.id,
      page: 1,
      goodsList: []
    })
    this.getGoodsList()
  },
  
  // 搜索功能
  onSearch(e) {
    this.setData({
      searchKeyword: e.detail,
      page: 1,
      goodsList: []
    })
    this.getGoodsList()
  },
  
  // 加入购物车
  addToCart(e) {
    const goods = e.currentTarget.dataset.goods
    // 调用购物车工具添加商品
    getApp().globalData.cart.add(goods, 1)
    wx.showToast({ title: '已加入购物车' })
  }
  
  // 其他方法...
})
3.2.2 购物车实现

购物车功能主要在pages/cart/index.jspages/cart/order.js中实现:

// pages/cart/order.js 核心代码
Page({
  data: {
    orderInfo: null,
    goodsList: [],
    paymentShow: false,
    money: 0,
    paySuccess: false
  },
  
  onLoad: function(options) {
    getApp().initLanguage(this)
    wx.setNavigationBarTitle({ title: this.data.$t.cart.ordered })
  },
  
  onShow: function() {
    this.fetchOrder()
  },
  
  // 获取订单信息
  async fetchOrder() {
    wx.showLoading({ title: '' })
    const res = await WXAPI.orderList({
      token: wx.getStorageSync('token'),
      status: 0
    })
    wx.hideLoading()
    
    if (res.code == 0) {
      this.setData({
        orderInfo: res.data.orderList[0],
        goodsList: res.data.goodsMap[res.data.orderList[0].id]
      })
    }
  },
  
  // 去支付
  async goPayOrder() {
    const code = await AUTH.wxaCode()
    let res = await WXAPI.authorize({ code })
    
    if (res.code != 0) {
      wx.showModal({/* ... */})
      return
    }
    
    wx.setStorageSync('payToken', res.data.token)
    this.setData({
      paymentShow: true,
      money: this.data.orderInfo.amountReal,
      nextAction: {/* ... */}
    })
  },
  
  // 支付成功回调
  paymentOk(e) {
    this.setData({
      paymentShow: false,
      paySuccess: true
    })
  },
  
  // 取消支付
  paymentCancel() {
    this.setData({ paymentShow: false })
  }
})

3.3 支付功能实现

支付功能是系统的核心模块之一,主要由utils/pay.js工具类实现:

// utils/pay.js 核心代码
const WXAPI = require('apifm-wxapi')
const i18n = require("../i18n/index")
const $t = i18n.$t()

/**
 * 微信支付函数
 * @param {string} type - 支付类型:order(订单)、recharge(充值)、paybill(优惠买单)
 * @param {number} money - 支付金额
 * @param {string} orderId - 订单ID
 * @param {string} redirectUrl - 支付完成后跳转的URL
 * @param {object} data - 扩展数据对象
 */
function wxpay(type, money, orderId, redirectUrl, data) {
  const postData = {
    token: wx.getStorageSync('token'),
    money: money,
    remark: "在线充值",
  }
  
  // 根据支付类型设置不同参数
  if (type === 'order') {
    postData.remark = "支付订单 :" + orderId;
    postData.nextAction = { type: 0, id: orderId };
  }
  
  if (type === 'paybill') {
    postData.remark = $t.my.youhuimaidan + " :" + data.money;
    postData.nextAction = { type: 4, uid: wx.getStorageSync('uid'), money: data.money };
  }
  
  postData.payName = postData.remark;
  if (postData.nextAction) {
    postData.nextAction = JSON.stringify(postData.nextAction);  
  }
  
  // 发起支付请求
  WXAPI.wxpay(postData).then(function(res) {
    if (res.code == 0) {
      // 调用微信支付接口
      wx.requestPayment({
        timeStamp: res.data.timeStamp,
        nonceStr: res.data.nonceStr,
        package: res.data.package,
        signType: res.data.signType,
        paySign: res.data.paySign,
        fail: function(aaa) {
          console.error(aaa)
          wx.showToast({ title: aaa })
          if (redirectUrl) wx.redirectTo({ url: redirectUrl })
        },
        success: function() {
          wx.showToast({ title: $t.asset.success })
          if (redirectUrl) wx.redirectTo({ url: redirectUrl })
        }
      })
    } else {
      wx.showModal({/* 错误处理 */})      
    }
  })
}

module.exports = { wxpay: wxpay }

3.4 用户认证与授权

用户认证与授权功能主要在utils/auth.js中实现:

// 简化版auth.js
const WXAPI = require('apifm-wxapi')

/**
 * 检查是否已登录
 */
function checkHasLogined() {
  const token = wx.getStorageSync('token')
  if (!token) {
    return false
  }
  return true
}

/**
 * 执行授权登录
 */
function authorize() {
  return new Promise((resolve, reject) => {
    wx.login({
      success: res => {
        WXAPI.login_wx(res.code).then(res => {
          if (res.code == 10000) {
            // 未注册
            register().then(res => {
              resolve(res)
            }).catch(err => {
              reject(err)
            })
            return
          }
          if (res.code == 0) {
            wx.setStorageSync('token', res.data.token)
            wx.setStorageSync('uid', res.data.uid)
            resolve(res)
          } else {
            reject(res)
          }
        })
      },
      fail: err => {
        reject(err)
      }
    })
  })
}

// 其他辅助方法...
module.exports = {
  checkHasLogined,
  authorize,
  // 其他导出...
}

3.5 国际化实现

系统支持多语言切换,主要通过i18n目录下的配置文件实现:

// i18n/index.js
import en from './en'
import zh_CN from './zh_CN'

const locales = {
  en,
  'zh_CN': zh_CN
}

module.exports = {
  langs: [
    { code: 'zh_CN', name: '简体中文' },
    { code: 'en', name: 'English' }
  ],
  
  getLanguage() {
    const language = wx.getStorageSync('Language')
    if (language) {
      return language
    }
    // 默认根据手机系统语言
    const systemInfo = wx.getSystemInfoSync()
    const lang = systemInfo.language
    if (lang.indexOf('zh') > -1) {
      return 'zh_CN'
    } else {
      return 'en'
    }
  },
  
  $t() {
    const language = this.getLanguage()
    return locales[language]
  },
  
  setTabBarLanguage() {
    const $t = this.$t()
    if (typeof $t.tabBar == 'object') {
      wx.setTabBarItem({ index: 0, text: $t.tabBar.home })
      wx.setTabBarItem({ index: 1, text: $t.tabBar.cate })
      wx.setTabBarItem({ index: 2, text: $t.tabBar.cart })
      wx.setTabBarItem({ index: 3, text: $t.tabBar.my })
    }
  }
}

四、核心业务流程解析

4.1 用户点餐流程

mermaid

4.2 订单状态流转

mermaid

五、系统配置与部署

5.1 关键配置项说明

config.js中配置项目关键信息:

module.exports = {
  version: "25.04.24",          // 版本号
  note: '我的礼品卡显示送礼人头像和昵称', // 更新说明
  subDomain: "beeorder",        // 子域名,需根据教程设置
  merchantId: 27,               // 商户ID,在后台查看
  customerServiceType: 'QW'     // 客服类型,QW为企业微信
}

5.2 部署流程

  1. 准备工作

    • 注册微信小程序账号并获取AppID
    • 完成微信支付商户认证
    • 配置服务器域名
  2. 代码上传与审核

    # 克隆代码库
    git clone https://gitcode.com/gooking2/bee.git
    
    # 进入项目目录
    cd gooking2/bee
    
    # 安装依赖
    npm install
    
  3. 使用微信开发者工具

    • 导入项目
    • 配置AppID
    • 填写项目名称和目录
    • 编译运行测试
  4. 上传审核

    • 在微信开发者工具中点击"上传"
    • 填写版本号和更新说明
    • 提交审核
    • 等待审核通过后发布

六、常见问题与解决方案

6.1 支付功能异常

问题现象:调用支付接口失败或支付后状态不正确。

解决方案

  1. 检查config.js中的merchantId是否正确配置
  2. 确认微信支付商户号已完成认证并与小程序绑定
  3. 检查支付参数是否完整,特别是nextAction参数的JSON序列化
  4. 检查网络连接是否正常
  5. 查看控制台日志,分析具体错误信息

6.2 商品数据不显示

问题现象:商品列表页面空白,不显示商品数据。

解决方案

  1. 检查subDomain配置是否正确
  2. 确认后端服务是否正常运行
  3. 检查网络请求是否成功,可在开发者工具中查看Network面板
  4. 确认用户是否已登录,token是否有效
  5. 检查后端商品数据是否已正确录入

6.3 多语言切换不生效

问题现象:切换语言后界面文字未更新。

解决方案

  1. 检查页面是否正确调用initLanguage方法
  2. 确认所有文本都使用了$t函数进行国际化处理
  3. 检查i18n配置文件是否完整
  4. 尝试清除小程序缓存后重新打开

七、总结与扩展

7.1 项目特点总结

gooking2/bee作为一款开箱即用的餐饮点餐外卖小程序,具有以下特点:

  1. 快速部署:提供完整的前后端解决方案,无需从零开发
  2. 功能全面:涵盖商品展示、购物车、订单、支付等完整流程
  3. 良好体验:基于Vant组件库,界面美观,交互流畅
  4. 多语言支持:内置国际化功能,支持中英文切换
  5. 易于扩展:模块化设计,便于功能扩展和二次开发

7.2 功能扩展建议

基于现有框架,可以考虑以下功能扩展:

  1. 会员积分系统:增加用户积分、等级和兑换功能
  2. 营销活动模块:添加优惠券、秒杀、拼团等营销工具
  3. 数据分析功能:增加销售数据统计和用户行为分析
  4. 多门店管理:支持连锁餐饮品牌的多门店管理
  5. 外卖配送对接:对接第三方配送平台API

7.3 性能优化建议

  1. 图片优化:使用微信小程序的图片压缩和懒加载功能
  2. 数据缓存:合理使用本地缓存减少网络请求
  3. 分包加载:对小程序进行分包处理,优化启动速度
  4. 代码精简:移除未使用的代码和资源
  5. 接口优化:合并请求,减少接口调用次数

八、开发资源与社区支持

8.1 官方文档

8.2 项目地址

https://gitcode.com/gooking2/bee

8.3 开发者交流

  • 项目Issues:提交问题和建议
  • 技术社区:可在相关技术论坛交流使用经验

通过本文档的指导,您应该能够快速部署和使用gooking2/bee餐饮小程序,并根据实际需求进行定制开发。祝您的餐饮业务蒸蒸日上!

【免费下载链接】bee 微信小程序-餐饮点餐外卖-开箱即用 【免费下载链接】bee 项目地址: https://gitcode.com/gooking2/bee

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值