# 小程序点餐系统 **Repository Path**: thelongestday/mini-program-ordering ## Basic Information - **Project Name**: 小程序点餐系统 - **Description**: 用微信小程序+云技术实现的在线点餐系统。 由于云数据库使用费用经常变化,所以本系统修改为云数据库和本地数据库自动切换的版本。 - **Primary Language**: JavaScript - **License**: Apache-2.0 - **Default Branch**: develop - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 19 - **Forks**: 28 - **Created**: 2022-04-04 - **Last Updated**: 2026-08-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 小程序点餐系统 > 项目路径:`d:\Code\mini-program-ordering` > 文档生成日期:2026-07-15 > 文档更新日期:2026-07-15 > 项目类型:微信小程序 + 微信云开发(WeChat Cloud Base) --- ## 1. 项目概述 本项目是一套基于 **微信小程序原生框架 + 微信云开发(云数据库/云函数)** 实现的扫码点餐系统。 ### 1.1 核心业务流程 ``` 扫码识别桌号 → 用户信息授权 → 选择用餐人数 → 浏览菜品/加购 → 订单确认 → 提交订单 → 落单成功 ``` ### 1.2 主要功能 - 扫描桌面二维码识别桌号 - 成人和儿童用餐人数选择 - 左侧分类导航 + 右侧菜品联动滚动 - 菜品搜索(支持正则模糊匹配,搜索失败时自动降级到本地) - 商品详情弹窗:选择数量、规格(辣度等) - 购物车角标与底部结算栏 - 订单确认:展示菜品、总价、门店信息 - 整单备注弹窗:辣度、忌口 - 订单提交并写入云数据库 - 门店地图定位 - 云数据读取失败时自动降级到本地 JSON 数据(涵盖 prepare、index 页面) --- ## 2. 技术栈与架构 ### 2.1 技术栈 | 层级 | 技术 | |------|------| | 前端框架 | 微信小程序原生框架(WXML + WXSS + JS) | | 后端服务 | 微信云开发(Cloud Base) | | 数据库 | 微信云数据库(MongoDB 风格) | | 云函数 | Node.js + wx-server-sdk | | 开发工具 | 微信开发者工具 | | 基础库版本 | 3.6.6 / 3.8.10(私有配置覆盖) | ### 2.2 整体架构 ``` ┌─────────────────────────────────────────────────────────────┐ │ 微信小程序端 │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌────────┐ │ │ │ scanCode│ │ prepare │ │ index │ │ order │ │ map │ │ │ │ 扫码页 │ │ 准备页 │ │ 点餐页 │ │ 订单页 │ │ 地图页 │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ └────┬───┘ │ │ └────────────┴────────────┴───────────┴───────────┘ │ │ ↑ 自定义组件 popup-detail / popup-order │ ├─────────────────────────────────────────────────────────────┤ │ 微信云开发能力层 │ │ ┌─────────────────┐ ┌─────────────────┐ │ │ │ 云数据库 │ │ 云函数 │ │ │ │ goods / types │ │ ofsFunction │ │ │ │ store / orders │ │ 获取 OPENID │ │ │ └─────────────────┘ └─────────────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ 本地降级数据层 │ │ localdatabase/*.json( goods / types / store ) │ └─────────────────────────────────────────────────────────────┘ ``` --- ## 3. 目录结构 ``` mini-program-ordering/ ├── .cloudbase/ # 云开发容器调试配置 │ └── container/debug.json ├── .vscode/ # VS Code 推荐扩展 │ └── extensions.json ├── cloudfunctions/ # 云函数目录 │ └── ofsFunction/ │ ├── config.json │ ├── index.js # 云函数入口 │ └── package.json ├── miniprogram/ # 小程序源码目录 │ ├── app.js # 应用入口 / 全局数据 │ ├── app.json # 全局页面/窗口配置 │ ├── app.wxss # 全局样式 │ ├── envList.js # 云环境配置 │ ├── sitemap.json # 爬虫索引配置 │ ├── component/ # 自定义组件 │ │ ├── popup-detail/ # 商品详情弹窗组件 │ │ │ ├── popup.js │ │ │ ├── popup.json │ │ │ ├── popup.wxml │ │ │ └── popup.wxss │ │ └── popup-order/ # 订单备注弹窗组件 │ │ ├── popup.js │ │ ├── popup.json │ │ ├── popup.wxml │ │ └── popup.wxss │ ├── images/ # 静态图片资源 │ │ ├── products/ # 菜品图片 │ │ └── *.png │ ├── localdatabase/ # 本地降级数据 │ │ ├── database_goods.json │ │ ├── database_orders.json │ │ ├── database_store.json │ │ └── database_types.json │ └── pages/ # 页面目录 │ ├── index/ # 点餐首页 │ ├── map/ # 地图页 │ ├── order/ # 订单确认页 │ ├── prepare/ # 用餐准备页 │ ├── scanCode/ # 扫码页 │ └── settleAccounts/ # 落单成功页 ├── database-init.js # 云数据库初始化脚本(示例) ├── project.config.json # 项目配置 ├── project.private.config.json # 私有项目配置 ├── uploadCloudFunction.sh # 云函数部署脚本(Mac) ├── 后续改进.txt # 待改进项记录 ├── LICENSE └── README.md ``` --- ## 4. 核心数据模型 ### 4.1 全局数据 `app.js` | 字段 | 类型 | 说明 | |------|------|------| | `deskId` | Number | 当前桌号 | | `numberPeople` | Number | 用餐人数 | | `cart` | Array | 购物车数组 | | `orderTime` | String | 下单时间(MM-DD HH:mm) | | `location` | Object | 门店经纬度 | | `zIndexLevels` | Object | 全局 z-index 层级规范 | ### 4.2 云数据库集合 #### `goods`(菜品表) | 字段 | 类型 | 说明 | |------|------|------| | `_id` | String | 云数据库唯一 ID | | `id` | Number | 业务菜品编号 | | `typeId` | String | 所属分类 ID | | `name` | String | 菜品名称 | | `price` | Number | 原价 | | `real` | Number | 实际售价 | | `imageUrl` | String | 图片路径 | | `number` | Number | 当前选购数量(运行时) | | `count` | Number | 规格数量 | | `good` | Number | 评分 | | `selected` | Boolean | 是否可选 | | `trait` | String | 标签/特色 | | `detail` | String | 菜品详情 | | `check` | Array | 规格选项(如辣度) | #### `types`(分类表) | 字段 | 类型 | 说明 | |------|------|------| | `_id` | String | 云数据库唯一 ID | | `id` | String | 分类编号 | | `name` | String | 分类名称 | | `number` | Number | 该分类已选数量(运行时) | #### `store`(门店表) | 字段 | 类型 | 说明 | |------|------|------| | `_id` | String | 云数据库唯一 ID | | `name` | String | 门店名称 | | `phone` | String | 联系电话 | | `location` | Object | GeoJSON 坐标点 | | `deskNumber` | Number | 桌位总数 | | `peopleNumber` | Number | 成人人数上限 | | `childrenNumber` | Number | 儿童人数上限 | #### `orders`(订单表) | 字段 | 类型 | 说明 | |------|------|------| | `_id` | String | 云数据库唯一 ID | | `_openid` | String | 用户 OPENID | | `deskId` | Number | 桌号 | | `orderTime` | String | 下单时间 | | `orderDetail` | Array | 订单菜品明细 | | `total` | Number | 订单总价 | | `content` | String | 整单备注 | --- ## 5. 页面与模块说明 ### 5.1 `pages/scanCode/scanCode` **职责**:扫码入口页,识别二维码中的桌号并决定跳转目标。 **核心函数**: | 函数 | 说明 | |------|------| | `scanCode()` | 调用 `wx.scanCode` 扫码,解析 `deskId=xxx` 格式;若本地缓存已存在相同桌号与人数信息,则直接跳转点餐页;否则跳转准备页。 | **跳转逻辑**: ``` 扫码成功 ├─ 本地缓存匹配(deskId + numberPeople)→ redirectTo index └─ 缓存不存在或不匹配 → redirectTo prepare?deskId=xxx ``` **注意**:本版本已移除对 `userInfo` 缓存的判断(与 prepare 页取消授权流程保持一致)。 --- ### 5.2 `pages/prepare/prepare` **职责**:用餐人数选择、加载门店配置。 **核心数据**: | 字段 | 说明 | |------|------| | `deskId` | 从扫码页传入的桌号 | | `numberPeople` | 成人可选人数上限(来自云/本地 store) | | `childrenNumber` | 儿童可选人数上限 | | `currentNumber` | 当前选中的成人人数 | | `currentChildrenNumber` | 当前选中的儿童人数 | | `inputValue` | 自定义输入的人数 | **核心函数**: | 函数 | 说明 | |------|------| | `onLoad(options)` | 接收扫码传入的 `deskId`,立即调用 `loadPageData()` 加载门店人数上限。 | | `loadPageData()` | 从云数据库 `store` 读取人数上限;失败则读取本地 `database_store.json` 降级。 | | `selectNumber(event)` | 选择成人人数。 | | `selectChildrenNumber(event)` | 选择儿童人数。 | | `focus()` / `input(event)` | 自定义输入人数处理(当前仅影响 `currentNumber`)。 | | `intoIndex()` | 校验并确定最终人数,写入本地缓存,跳转点餐首页。 | **本地降级实现**: ```javascript // 修复后(2026.7.15):正确使用解析后的 store 对象 const store = JSON.parse(res.data) _this.setData({ numberPeople: store.peopleNumber, // 修复前错误使用 res.data.peopleNumber childrenNumber: store.childrenNumber }) ``` **注意**:当前 `input()` 同时被成人和儿童输入框绑定,仅更新 `currentNumber`,存在儿童输入无法被采集的问题。 --- ### 5.3 `pages/index/index` **职责**:点餐主页面,展示分类与菜品、处理购物车、搜索、页面跳转。 **核心数据**: | 字段 | 说明 | |------|------| | `active` | 当前高亮分类 ID | | `types` | 分类数组 | | `goods` | 从云端获取的原始菜品数据(不变) | | `tempGoods` | 页面实际渲染的菜品数据(搜索后会变化) | | `cart` | 购物车数据 | | `goodsCount` | 购物车总份数 | | `tops` | 各分类在右侧滚动区的累计高度 | | `menuHeight` | 右侧滚动区高度 | | `shoplistScollTop` | 右侧滚动区 scroll-top | | `isSearchBarVisible` | 搜索栏是否显示 | | `searchValue` | 搜索关键词 | **核心函数**: | 函数 | 说明 | |------|------| | `onLoad()` | 加载分类和菜品数据(云数据库优先,失败降级本地);计算右侧滚动区高度;延迟获取各分类节点高度。 | | `handleGroupSelect(event)` | 点击左侧分类,平滑滚动右侧到对应位置。 | | `shopListScroll(event)` | 右侧滚动时根据 `deltaY` 方向和高度的 `tops` 数组反推高亮分类。 | | `selectGoods(event)` | 点击菜品,组装参数并打开 `popup-detail`。 | | `searchOperation(event)` | 使用 `$regex` 在云数据库 `goods` 中按名称模糊搜索;云搜索失败时降级到本地 `goods` 数组过滤匹配(`indexOf` 模糊匹配)。 | | `showSearchBar()` / `hideSearchBar()` | 显示/隐藏搜索栏。 | | `navigateOperaion()` | 生成下单时间,将 `deskId`、`cart` 写入全局数据,跳转订单页。 | | `setShoppingCart(event)` | 接收 `popup-detail` 的 `closePopup` 事件,更新购物车和分类角标。 | **关键常量**: - `itemHeight = 310`:单个菜品显示高度估算值,用于初始化滚动高度。 --- ### 5.4 `pages/order/order` **职责**:订单确认页,展示购物车、门店信息、计算总价、提交订单。 **核心数据**: | 字段 | 说明 | |------|------| | `deskId` | 桌号 | | `cart` | 购物车明细 | | `orderTime` | 下单时间 | | `total` | 总价 | | `storeInfo` | 门店信息 | | `location` | 门店坐标 | **核心函数**: | 函数 | 说明 | |------|------| | `onShow()` | 读取门店信息;从全局数据恢复桌号、购物车、下单时间;计算总价。 | | `backOperation()` | 返回上一页,兼容从首页或结算页返回的场景。 | | `call(event)` | 拨打门店电话。 | | `location()` | 将门店坐标写入全局,跳转地图页。 | | `settleAccounts()` | 打开 `popup-order` 备注弹窗。 | | `submitOrder(event)` | 接收备注内容,将订单写入云数据库 `orders`,跳转结算成功页。 | --- ### 5.5 `pages/map/map` **职责**:使用 `map` 组件展示门店位置。 **核心函数**: | 函数 | 说明 | |------|------| | `onShow()` | 从全局数据读取 `location`,设置地图 `markers`。 | **注意**:`location` 字段为 GeoJSON 格式 `coordinates: [longitude, latitude]`,代码中需要正确区分经纬度顺序。 --- ### 5.6 `pages/settleAccounts/settleAccounts` **职责**:落单成功提示页。 **核心函数**: | 函数 | 说明 | |------|------| | `backOrders()` | 跳转回订单页。 | --- ## 6. 自定义组件说明 ### 6.1 `component/popup-detail/popup`(商品详情弹窗) **职责**:展示菜品大图、价格、数量选择和规格选项。 **核心数据**: | 字段 | 说明 | |------|------| | `show` | 弹窗显示状态 | | `goodsInfo` | 父页面传入的菜品信息 | | `number` | 当前选择的数量 | **核心函数**: | 函数 | 说明 | |------|------| | `switch(parameter)` | 接收父页面参数并切换显示状态。 | | `reduceOperation()` | 数量减 1。 | | `addOperation()` | 数量加 1。 | | `saveAndClose()` | 组装结果对象,触发 `closePopup` 事件回传父页面,关闭弹窗。 | | `radioChange(event)` | 规格单选变化(当前仅修改本地状态,未回传)。 | **事件**: - `closePopup`:向父页面传递 `{id, name, real, imageUrl, number, typeId, check}`。 --- ### 6.2 `component/popup-order/popup`(订单备注弹窗) **职责**:整单备注,支持辣度选择和忌口勾选。 **核心数据**: | 字段 | 说明 | |------|------| | `show` | 弹窗显示状态 | | `hots` | 辣度选项(不辣/微辣/中辣/特辣) | | `hotsValue` | 当前辣度值 | | `tastes` | 忌口选项(免葱/免姜/免香菜/免酱油) | | `content` | 拼接后的备注文本 | **核心函数**: | 函数 | 说明 | |------|------| | `switch()` | 切换弹窗显示状态。 | | `radioClick(event)` | 选择辣度并更新备注文本。 | | `tasteClick(event)` | 勾选/取消忌口并更新备注文本。 | | `saveAndClose()` | 触发 `closePopup` 事件回传 `{content}`,关闭弹窗。 | | `regOperation(tempContent)` | 使用正则清理备注中多余的逗号、前后缀逗号。 | **事件**: - `closePopup`:向父页面传递 `{content}`。 --- ## 7. 云函数说明 ### 7.1 `cloudfunctions/ofsFunction/index.js` **职责**:模板云函数,返回调用者基本信息。 **输入**:任意 `event`。 **输出**: ```json { "event": { ... }, "openid": "用户 OPENID", "appid": "小程序 APPID", "unionid": "用户 UNIONID" } ``` **依赖**:`wx-server-sdk ~2.6.1` --- ## 8. 数据流与页面跳转 ### 8.1 页面路由表 | 页面路径 | 入口/说明 | |----------|-----------| | `pages/scanCode/scanCode` | 启动首页,扫码入口 | | `pages/prepare/prepare?deskId=` | 准备页,授权+选择人数 | | `pages/index/index` | 点餐首页 | | `pages/order/order` | 订单确认页 | | `pages/map/map` | 门店地图页 | | `pages/settleAccounts/settleAccounts` | 落单成功页 | ### 8.2 全局数据流 ``` scanCode → app.globalData.deskId prepare → app.globalData.numberPeople index → app.globalData.cart / orderTime / deskId order ← 读取 app.globalData order → app.globalData.location map ← 读取 app.globalData.location ``` ### 8.3 组件事件流 ``` index → popup-detail.switch(parameter) popup-detail → closePopup → index.setShoppingCart(event) order → popup-order.switch() popup-order → closePopup → order.submitOrder(event) ``` ### 8.4 存储持久化 - `wx.setStorageSync`:缓存 `numberPeople`、`childrenNumber`、`deskId`。 - `wx.getStorageSync`:扫码页读取缓存以判断是否跳过准备页。 - 已不再缓存 `userInfo`(取消了用户信息授权流程)。 --- ## 9. 关键业务逻辑 ### 9.1 云数据与本地数据切换 项目以云数据库为主,当云数据库读取失败时,降级读取 `localdatabase/*.json`。 **当前实现位置**: - `prepare.js`:`loadPageData()` 读取 `store` 失败时读取 `database_store.json`(已修复解析对象访问错误)。 - `index.js`:`onLoad()` 读取 `types`/`goods` 失败时读取对应本地 JSON。 - `index.js`:`searchOperation()` 云端搜索失败时,改为在本地 `goods` 数组中进行 `indexOf` 模糊匹配。 **修复历史**: - `prepare.js` 本地降级分支中曾使用 `res.data.peopleNumber`(`res.data` 为 JSON 字符串),现已改为 `store.peopleNumber`(解析后对象),可正常读取。 ### 9.2 购物车更新逻辑 在 `index.js` 的 `setShoppingCart` 中: 1. 判断购物车是否已有该商品。 2. 若有:累加数量;若新数量为 0,则从购物车移除。 3. 若没有且数量不为 0:加入购物车。 4. 回写 `tempGoods` 中对应商品的 `number`。 5. 使用 `reduce` 计算总份数 `goodsCount`。 6. 统计各分类已选数量,更新 `types` 角标。 ### 9.3 分类联动滚动逻辑 - 初始化时通过 `wx.createSelectorQuery().selectAll('.shop-list__item').boundingClientRect()` 获取每个分类容器高度,累积存入 `tops` 数组。 - 点击左侧分类:根据 `tops` 平滑设置 `shoplistScollTop`。 - 右侧滚动:根据 `deltaY` 方向和 `scrollTop` 处于 `tops` 的区间,反推高亮分类 `active`。 ### 9.4 订单提交逻辑 1. 用户在 `order` 页点击"请到收银台结账"。 2. 弹出 `popup-order` 备注弹窗。 3. 用户确认后触发 `submitOrder`,将订单写入云数据库 `orders`。 4. 跳转 `settleAccounts` 成功页。 --- ## 10. 本地开发与运行方式 ### 10.1 环境要求 - 微信开发者工具(建议稳定版) - 已开通微信云开发的小程序 AppID:`wx566de3c4522967cd` - 云环境 ID:`cloud1-8gpri31n70e5ea27` ### 10.2 导入项目 1. 打开微信开发者工具。 2. 选择"导入项目"。 3. 项目目录选择 `d:\Code\mini-program-ordering`。 4. 填入 AppID:`wx566de3c4522967cd`。 5. 勾选"不使用云服务"或"使用云服务"(本项目依赖云开发)。 ### 10.3 初始化云数据库 参考根目录 `database-init.js` 中的示例,在云数据库控制台或云函数中初始化以下集合: - `types` - `goods` - `store`(文档 ID:`6d85a2b9629311a7076342b322de9447`) - `orders` `database-init.js` 为示例脚本,不能直接运行,需要配合 `wx.cloud.database()` 上下文使用。 ### 10.4 上传并部署云函数 #### 方式一:微信开发者工具图形界面 1. 展开 `cloudfunctions/ofsFunction` 目录。 2. 右键点击 `ofsFunction`。 3. 选择"创建并部署:云端安装依赖(不上传 node_modules)"。 #### 方式二:命令行(Mac 示例) 参考 `uploadCloudFunction.sh`: ```bash "/Applications/wechatwebdevtools.app/Contents/MacOS/cli" \ cloud functions deploy \ --e order-food-6gn2qo4259fe9a35 \ --n quickstartFunctions \ --r \ --project "/Users/yuhf/Nutstore Files/SX/code/ofs-project" \ --report_first --report ``` > 注意:该脚本中的环境 ID 和项目名称与当前仓库不完全一致,实际部署时需替换为对应环境 ID 和项目路径。 ### 10.5 运行预览 1. 在微信开发者工具中点击"编译"。 2. 默认进入 `scanCode` 页,可点击扫码图片模拟扫码。 3. 扫码结果格式需为 `deskId=xxx`。 --- ## 11. 依赖关系 ### 11.1 小程序端依赖 | 依赖 | 来源 | 说明 | |------|------|------| | `wx.cloud.database()` | 微信内置 | 云数据库访问 | | `wx.scanCode()` | 微信内置 | 扫码能力 | | `wx.getUserProfile()` | 微信内置 | 获取用户信息 | | `wx.getWindowInfo()` | 微信内置 | 获取窗口高度 | | `wx.makePhoneCall()` | 微信内置 | 拨打电话 | | `wx.getStorageSync()` / `wx.setStorageSync()` | 微信内置 | 本地缓存 | ### 11.2 云函数依赖 | 依赖 | 版本 | 说明 | |------|------|------| | `wx-server-sdk` | ~2.6.1 | 微信云开发服务端 SDK | ### 11.3 页面与组件依赖 ``` pages/index/index.json ──usingComponents──> component/popup-detail/popup pages/order/order.json ──usingComponents──> component/popup-order/popup ``` --- ## 12. 配置说明 ### 12.1 `project.config.json` | 字段 | 说明 | |------|------| | `miniprogramRoot` | 小程序源码根目录:`miniprogram/` | | `cloudfunctionRoot` | 云函数根目录:`cloudfunctions/` | | `appid` | 小程序 AppID | | `projectname` | 项目名称 | | `libVersion` | 基础库版本 | | `compileType` | 编译类型:`miniprogram` | ### 12.2 `miniprogram/app.json` | 字段 | 说明 | |------|------| | `pages` | 页面路由列表,`scanCode` 为首页 | | `window` | 全局窗口样式配置 | | `sitemapLocation` | 站点地图配置位置 | | `style` | 使用新版组件样式:`v2` | ### 12.3 `miniprogram/envList.js` ```javascript const envList = [ { envId: "cloud1-8gpri31n70e5ea27", alias: "cloud1" } ]; const isMac = true; ``` --- ## 13. 待改进项 根据项目内 `后续改进.txt` 和代码审查,记录以下待改进点: 1. 首页轮播公告当前为静态写死,可改为从服务器/云数据库动态获取。 2. 轮播项可添加点击事件,跳转详情页或活动页。 3. `prepare.js` 成人和儿童人数输入框共用一个 `input` 事件,会导致儿童输入无法被采集,应分别处理。 4. `popup-detail` 中的规格选择结果未回传父页面,订单页无法展示所选规格。 5. `map.js` 需确认 `location` 字段是 `{latitude, longitude}` 还是 GeoJSON `coordinates` 顺序。 6. `uploadCloudFunction.sh` 脚本中的环境 ID 和路径需与当前仓库保持一致。 7. 云函数 `ofsFunction` 目前为示例,可根据业务扩展为订单处理、支付回调等。 8. 缺少单元测试和异常处理统一封装。 9. `index.js` 桌号硬编码为 1,扫码传入的 `deskId` 实际未生效,建议从 `app.globalData` 读取或跳转时传参。 10. `index.js` 中 `setShoppingCart` 存在重复更新 `tempGoods` 的冗余逻辑(308-323 行)。 ### 13.1 已修复问题 - ✅ `prepare.js` 本地数据降级分支中 `res.data.peopleNumber` 读取错误(已改为 `store.peopleNumber`)。 - ✅ `scanCode.js` 移除对 `userInfo` 缓存的判断(与 prepare 页取消授权流程一致)。 - ✅ `index.js` 搜索失败时增加本地 `goods` 数组降级匹配。 - ✅ README.md 新增 `2026.7.15` 变更记录:"完成云数据失败后,自动切换为本地数据的所有操作"。 --- ## 14. 变更记录 | 日期 | 内容 | |------|------| | 2026-07-15 | 修复 `prepare.js` 本地数据降级读取 Bug(`res.data.peopleNumber` → `store.peopleNumber`);移除 `prepare.js` 中的用户信息授权流程;`scanCode.js` 不再依赖 `userInfo` 缓存;`index.js` 搜索增加本地降级匹配;README.md 新增本次变更记录。 | | 2025-02-20 | 增加云数据和本地数据的切换功能(仅 prepare 页面)。 | | 2024-04 至 2024-06 | 项目主体功能开发(首页、点餐、弹窗、订单、地图、结算)。 | --- ## 15. 附录:核心文件速查 | 文件 | 作用 | |------|------| | [miniprogram/app.js](file:///d:/Code/mini-program-ordering/miniprogram/app.js) | 应用入口、全局数据 | | [miniprogram/app.json](file:///d:/Code/mini-program-ordering/miniprogram/app.json) | 全局页面与窗口配置 | | [miniprogram/pages/index/index.js](file:///d:/Code/mini-program-ordering/miniprogram/pages/index/index.js) | 点餐主页逻辑 | | [miniprogram/pages/order/order.js](file:///d:/Code/mini-program-ordering/miniprogram/pages/order/order.js) | 订单确认逻辑 | | [miniprogram/pages/prepare/prepare.js](file:///d:/Code/mini-program-ordering/miniprogram/pages/prepare/prepare.js) | 用餐准备逻辑 | | [miniprogram/pages/scanCode/scanCode.js](file:///d:/Code/mini-program-ordering/miniprogram/pages/scanCode/scanCode.js) | 扫码逻辑 | | [miniprogram/component/popup-detail/popup.js](file:///d:/Code/mini-program-ordering/miniprogram/component/popup-detail/popup.js) | 商品详情弹窗 | | [miniprogram/component/popup-order/popup.js](file:///d:/Code/mini-program-ordering/miniprogram/component/popup-order/popup.js) | 订单备注弹窗 | | [cloudfunctions/ofsFunction/index.js](file:///d:/Code/mini-program-ordering/cloudfunctions/ofsFunction/index.js) | 云函数入口 | | [database-init.js](file:///d:/Code/mini-program-ordering/database-init.js) | 数据库初始化示例 | | [project.config.json](file:///d:/Code/mini-program-ordering/project.config.json) | 项目配置 |