微信小程序实战案例 - 餐馆点餐系统 阶段1 - 菜单浏览
阶段 1 – 菜单浏览(超详细版)
目标:完成「首页=菜品卡片列表」
- 打好 UI 地基
- 会从 云数据库 拉取
categories/dishes并渲染- 打 Git Tag
v1.0‑menu
1. 技术/知识点速览
| 知识点 | 关键词 | 说明 |
|---|---|---|
| 云数据库 | db.collection().where().get() | 小程序端查询示例 |
| 图片优化 | <image lazy-load /> | 懒加载,减少首屏体积 |
| 性能 | Skeleton / 分段加载 | 骨架屏 + 滚动分页(可选) |
2. 前置准备
-
创建首页页面
# 工具中新建 miniprogram/pages/index/
3. 设计数据结构(仅 2 张核心表)
| 集合 | 主要字段 | 备注 |
|---|---|---|
categories | _id, name, sort | sort 用于 Tab 顺序 |
dishes | _id, name, price, img, categoryId, spicyLevel, sold | 后续统计销量可用 |
种子数据:在 阶段 0 的
db/seed.js里补充 3‑5 个分类、每类 4‑5 道菜。
你可以在微信开发者工具「云开发控制台 → 数据库」中手动插入测试数据:
// categories
{ "_id": "001", "name": "热菜", "sort": 1 }
{ "_id": "002", "name": "凉菜", "sort": 2 }// dishes
{ "name": "宫保鸡丁", "price": 18, "img": "xxx", "categoryId": "001" }
{ "name": "拍黄瓜", "price": 10, "img": "xxx", "categoryId": "002" }
4. 页面文件详解
4.1 index.json
{"navigationBarTitleText": "点餐"
}
4.2 index.wxml —— 结构布局
<view class="dish-list"><view wx:for="{{dishes}}" wx:key="_id" class="dish-card"><image class="thumb" src="{{item.img}}" mode="aspectFill" lazy-load /><view class="info"><text class="name">{{item.name}}</text><text class="price">¥{{item.price}}</text></view><button class="add-btn" data-dish="{{item}}" bindtap="onAddCart">加入</button></view>
</view>
lazy-load属性让图片只在进入视口时加载,提高性能。
4.3 index.wxss —— 简易样式
.dish-list {display: flex;flex-direction: column;padding: 16rpx;
}
.dish-card {display: flex;align-items: center;margin-bottom: 20rpx;background: #fff;border-radius: 12rpx;overflow: hidden;box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.05);
}
.thumb {width: 100rpx;height: 100rpx;flex-shrink: 0;border-radius: 8rpx;margin: 12rpx;
}
.info {flex: 1;display: flex;flex-direction: column;
}
.name {font-size: 30rpx;font-weight: bold;
}
.price {color: #fa541c;margin-top: 8rpx;
}
.add-btn {background-color: #07c160;color: white;font-size: 24rpx;padding: 0 20rpx;margin-right: 12rpx;height: 60rpx;line-height: 60rpx;border-radius: 30rpx;
}
4.4 index.js —— 业务逻辑
const cart = require('../../store/cart')Page({data: {dishes: []},onLoad() {this.loadDishes()},async loadDishes() {const db = wx.cloud.database()const res = await db.collection('dishes').get()this.setData({ dishes: res.data })},onAddCart(e) {const dish = e.currentTarget.dataset.dishcart.add(dish)wx.setTabBarBadge({ index: 1, text: String(cart.totalCount()) })wx.showToast({ title: '已加入购物车', icon: 'success' })}
})
5. 性能小贴士(可选提升)
| 场景 | 做法 |
|---|---|
| 图片很多时 | 给 <image> 加 mode="aspectFill" + lazy-load,并在云存储里裁剪到 300×300 |
| 数据过多 | 分页:limit(20).skip(page*20);滑到列表底部触发 onReachBottom 追加 |
| 切换 Tab 卡顿 | 预取下一分类的菜品(Promise.all)或使用本地缓存 |
6. Git Tag & 自测清单
git add . && git commit -m "feat: menu browse"git tag v1.0-menu && git push --tags- 打开开发者工具 → 真机预览,确认:
- 菜品卡片加载、价格/销量显示正确
- 图片懒加载生效(网络面板可观察请求)
- 点击卡片能弹出「已加入」提示

7. 练习(巩固 & 拓展)
| 难度 | 练习内容 |
|---|---|
| ⭐ | 给 dishes 增加 spicyLevel 字段(0‑3),在卡片右侧用 🌶️ 图标展示辣度。 |
| ⭐⭐⭐ | 实现「下拉刷新」:onPullDownRefresh 重新拉取当前分类数据。 |
| ⭐⭐⭐ | 引入 IntersectionObserver,把列表改成 瀑布流 + 懒加载分页(体验电商式长列表)。 |
阶段小结
- 至此,你已掌握 页面结构 → 云数据库查询 → 图片优化 的完整闭环。
- 代码行数 ≈ 150,适合新手阅读。
- 下一阶段(购物车)将基于本页数据做 状态管理,建议 保持当前目录结构 并直接开新分支:
git checkout -b feat/cart
祝你编码愉快,继续加油!
相关文章:
微信小程序实战案例 - 餐馆点餐系统 阶段1 - 菜单浏览
阶段 1 – 菜单浏览(超详细版) 目标:完成「首页=菜品卡片列表」 打好 UI 地基会从 云数据库 拉取 categories / dishes 并渲染打 Git Tag v1.0‑menu 1. 技术/知识点速览 知识点关键词说明云数据库db.collection().where().…...
Dashboard的安装和基本使用
1.Dashboard简介: Dashboard是Kubernetes的Web图形用户界面(GUI),它为用户提供了一个直观的方式来管理和监控Kubernetes集群。 2.实验基础和前置条件: 本实验以Kubernetes集群环境搭建与初始化-CSDN博客为基础和前置…...
英语单词 list 11
前言 这一个 list 是一些简单的单词。感觉这个浏览单词的方法比较低效,所以准备每天最多看一个 list ,真要提升英语水平,感觉还是得直接做阅读理解题。就像我们接触中文阅读材料一样,当然光知道这个表面意思还不够,还…...
JAVA基础 - 高效管理线程隔离数据结构ThreadLocalMap
欢迎光临小站:致橡树 ThreadLocalMap 是 ThreadLocal 的核心底层数据结构,负责在每个线程中存储与 ThreadLocal 实例绑定的数据。它的设计目标是高效管理线程隔离数据,同时尽量减少内存泄漏风险。以下是其核心实现细节。 数据结构与设计目标…...
DeepSeek 接入 Word 完整教程
一、前期准备 1.1 注册并获取 API 密钥 访问 DeepSeek 平台: 打开浏览器,访问 DeepSeek 官方网站(或您使用的相应平台)。注册并登录您的账户。 创建 API 密钥: 在用户控制面板中,找到“API Keys”或“API…...
通义灵码助力Neo4J开发:快速上手与智能编码技巧
在 Web 应用开发中,Neo4J 作为一种图数据库,用于存储节点及节点间的关系。当图结构复杂化时,关系型数据库的查找效率会显著降低,甚至无法有效查找,这时 Neo4J 的优势便凸显出来。然而,由于其独特的应用场景…...
高性能文件上传服务
高性能文件上传服务 —— 您业务升级的不二选择 在当今互联网数据量激增、文件体积日益庞大的背景下,高效、稳定的文件上传方案显得尤为重要。我们的文件分块上传服务端采用业界领先的 Rust HTTP 框架 Hyperlane 开发,凭借其轻量级、低延时和高并发的特…...
p2p的发展
PCDN(P2P内容分发网络)行业目前处于快速发展阶段,面临机遇与挑战并存的局面。 一、发展机遇 技术融合推动 边缘计算与5G普及:5G的高带宽、低延迟特性与边缘计算技术结合,显著提升PCDN性能,降低延迟&#x…...
Java Lambda 表达式详解:发展史、语法、使用场景及代码示例
Java Lambda 表达式详解:发展史、语法、使用场景及代码示例 1. Lambda 表达式的发展史 背景与动机 JDK 7 前:Java的匿名内部类虽强大,但代码冗余(如事件监听器、集合遍历)。JDK 8(2014)&#…...
【从0到1学Elasticsearch】Elasticsearch从入门到精通(下)
我们在【从0到1学Elasticsearch】Elasticsearch从入门到精通(上)这边文章详细讲解了如何创建索引库和文档及javaAPI操作,但是在实战当中,我们还需要根据一些特殊字段对文档进行查找搜索,仅仅靠id查找文档是显然不够的。…...
Python实现贪吃蛇二
上篇文章Python实现贪吃蛇一,实现了一个贪吃蛇的基础版本,但存在一些不足,也缺乏一些乐趣。本篇文章将对其进行一些改进,主要修改/实现以下几点: 1、解决食物随机生成的位置与蛇身重合问题 2、蛇身移动加速/减速功能 3…...
使用pybind11开发c++扩展模块输出到控制台的中文信息显示乱码的问题
使用pybind11开发供Python项目使用的C++扩展模块时,如果在扩展模块的C++代码中向控制台输出的信息中包含中文,python程序的控制台很容易出现乱码。以如下C++扩展框架代码为例(这是对上一篇文章简明使用pybind11开发pythonc+扩展模块教程-CSDN博客中的C++扩展框架代码进行少量…...
基于51单片机的正负5V数字电压表( proteus仿真+程序+设计报告+讲解视频)
基于51单片机的正负5V数字电压表( proteus仿真程序设计报告讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0101 1. 主要功能: 设计一个基于51单片机数字电压表 1、能够…...
Java雪花算法
以下是用Java实现的雪花算法代码示例,包含详细注释和异常处理: 代码下面有解析 public class SnowflakeIdGenerator {// 起始时间戳(2020-01-01 00:00:00)private static final long START_TIMESTAMP 1577836800000L;// 各部分…...
前端大屏可视化项目 局部全屏(指定盒子全屏)
需求是这样的,我用的项目是vue admin 项目 现在需要在做大屏项目 不希望显示除了大屏的其他东西 于是想了这个办法 至于大屏适配问题 请看我文章 底部的代码直接复制就可以运行 vue2 px转rem 大屏适配方案 postcss-pxtorem-CSDN博客 <template><div …...
Android studio消息同步机制:消息本地存储,服务器交互减压
文章目录 后端(Flask)代码前端(Android Studio Java)代码同步机制1. 放在 Activity 中2. 放在 Service 中3. 放在 DataManager 类中 放在Service中的具体实现1. 后台执行2. 独立于活动3. 系统管理4. 绑定服务5. 进程间通信&#x…...
P8667 [蓝桥杯 2018 省 B] 递增三元组(摘自洛谷)
给定三个整数数组 A[A1,A2,⋯,AN],B[B1,B2,⋯,BN],C[C1,C2,⋯,CN]。 请你统计有多少个三元组 (i,j,k) 满足: 1≤i,j,k≤NAi<Bj<Ck 输入格式 第一行包含一个整数 N。 第二行包含 N 个整数 A1,A2,⋯,AN…...
【Kafka基础】监控与维护:动态配置管理,灵活调整集群行为
1 基础配置操作 1.1 修改主题保留时间 /export/home/kafka_zk/kafka_2.13-2.7.1/bin/kafka-configs.sh --alter \--bootstrap-server 192.168.10.33:9092 \--entity-type topics \--entity-name yourtopic \--add-config retention.ms86400000 参数说明: retention…...
01_JDBC
文章目录 一、概述1.1、什么是JDBC1.2、JDBC原理 二、JDBC入门2.1、准备工作2.1.1、建库建表2.1.2、新建项目 2.2、建立连接2.2.1、准备四大参数2.2.2、加载驱动2.2.3、准备SQL语句2.2.4、建立连接2.2.5、常见问题 2.3、获取发送SQL的对象2.4、执行SQL语句2.5、处理结果2.6、释…...
STM32 HAL库 HC - SR04 超声波测距模块驱动实现
一、引言 在现代嵌入式系统开发中,传感器技术起着至关重要的作用。超声波测距模块作为一种常用的距离测量传感器,因其成本低、精度较高、使用方便等优点,被广泛应用于机器人避障、液位检测、工业自动化等领域。HC - SR04 超声波测距模块是一…...
Spring Boot 热部署详解,包含详细的配置项说明
Spring Boot 热部署详解 1. 热部署简介 热部署(Hot Deployment)允许在应用运行时修改代码或配置文件,无需重启应用即可使更改生效。Spring Boot 通过 spring-boot-devtools 模块实现这一功能,其核心依赖于 LiveReload 技术和自动…...
剑指Offer(数据结构与算法面试题精讲)C++版——day12
剑指Offer(数据结构与算法面试题精讲)C版——day12 题目一:小行星碰撞题目二:每日温度题目三:直方图最大矩形面积附录:源码gitee仓库 题目一:小行星碰撞 题目:输入一个表示小行星的数…...
贪心算法(18)(java)距离相等的条形码
在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]。 请你重新排列这些条形码,使其中任意两个相邻的条形码不能相等。 你可以返回任何满足该要求的答案,此题保证存在答案。 示例 1: 输入:barco…...
Docker学习笔记-docker安装、删除
一、在centOS 7中docker的默认安装目录 # Docker 主配置文件目录 ls /etc/docker# Docker 数据目录(镜像、容器、卷等) ls /var/lib/docker# Docker 可执行文件路径 which docker # 输出类似 /usr/bin/docker 二、docker文件目录说明 目录/文件用途/…...
【Python 开源】你的 Windows 关机助手——PyQt5 版定时关机工具
🖥️ 你的 Windows 关机助手——PyQt5 版定时关机工具 相关资源文件已经打包成EXE文件,可双击直接运行程序,且文章末尾已附上相关源码,以供大家学习交流,博主主页还有更多Python相关程序案例,秉着开源精神的…...
STM32 HAL库 ADC+TIM+DMA 3路 1S采样一次电压
一、引言 在很多嵌入式系统应用中,需要对多路模拟信号进行周期性采样,例如在工业控制、环境监测等领域。STM32F407 是一款高性能的微控制器,其丰富的外设资源可以方便地实现这样的功能。通过结合 ADC(模拟 - 数字转换器ÿ…...
汉诺塔问题——用贪心算法解决
目录 一:起源 二:问题描述 三:规律 三:解决方案 递归算法 四:代码实现 复杂度分析 一:起源 汉诺塔(Tower of Hanoi)问题起源于一个印度的古老传说。在世界中心贝拿勒斯&#…...
【Python爬虫】简单介绍
目录 一、基本概念 1.1 什么是爬虫 1.2 Python为什么适合爬虫 1.3 Python爬虫应用领域 (1)数据采集与分析 市场调研 学术研究 (2)内容聚合与推荐 新闻聚合 视频内容聚合 (3)金融领域 股票数据获…...
使用MCP服务通过自然语言操作数据库(vscode+cline版本)
使用MCP服务操纵数据库(vscodecline版本) 本文主要介绍,在vscode中使用cline插件调用deepseek模型,通过MCP服务器 使用自然语言去操作指定数据库。本文使用的是以己经创建号的珠海航展数据库。 理解MCP服务: MCP(Model Context…...
Vue 3 + TypeScript 实现一个多语言国际化组件(支持语言切换与内容加载)
文章目录 一、项目背景与功能概览二、项目技术架构与依赖安装2.1 技术栈2.2 安装依赖 三、国际化组件实现3.1 创建 i18n 实例3.2 配置 i18n 到 Vue 应用3.3 在组件中使用国际化内容3.4 支持语言切换 四、支持类型安全4.1 添加类型支持4.2 自动加载语言文件 一、项目背景与功能概…...
