微信点餐系统的开发与实现

article/2025/9/16 22:34:25

作者主页:编程指南针

作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师

主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助

收藏点赞不迷路  关注作者有好处

文末获取源码 

项目编号:BS-XCX-005 

一,项目简介

       随着互联网技术逐渐的深入到生活,人们的生活消费习惯,已经发生很大的变化。就餐厅用餐而言,互联网技术和移动互联网技术的应用也己相关普及,比如早几年前就出现的餐厅点餐系统,就通过信息化的技术手段代替原来纸质菜单点餐的传统方式。这种方式一是可以方便顾客实现点餐叫号,二是方便商家进行人单合一的统一管理,减少了报单出错率,提升了用户的体验,所以得以大面积的应用和普及。

       而移动互联网的出现,让智能手机的赋能更大广泛,腾讯微信适时推出微信小程序,使得智能手机的用户可以通过微信进行相应的信息化管理和参与,比如目前大面积应用的小程序商城,就将商业的业态从传统的PC互联网直接植入手机移动互联网,这种轻量级的APP应用,极大的方便使用者,也给商家通过微信带了大量的流量。

     微信小程序的功能推出,极大方便了全国2亿多的微信用户,在这个生态体系上构建了一个宠大的商业帝国,而小程序开发的应用,又快速的渗透到各个行业。在餐饮行业的信息化应用,也发生了一系统变化,比如通过微信小程序实现用户自助点餐功能,这就极大的方便了用户,减少了点餐的距离限制,用户可以在餐厅打开手机微信小程序进行点餐,也可以在去餐厅的途中或者甚至在家就可以点餐,打破了时空的限制,更加的灵活方便。经过调查和实地分析,基于对微信小程序的研究,开发了这套微信小程序点餐系统,为餐饮业的信息化建设添砖加瓦。

根据上述对微信小程序点餐系统的功能性需求分析,设计出了微信小程序点餐系统的功能结构图,如下图1-1所示。

图1-1 系统功能结构图

     前台用户登陆小程序,采用微信账户绑定登陆实现。目前由于测试账户没开通此权限,只能用开发者的身份来进行测试进行。前台用户可以在手机小程序上浏览系统发布的餐品,实现完整的订餐流程。看中相应的餐品可以添加到购物车中,然后下单购买,并可以查看相关的订单信息。

    后台用户必须登陆方可进行相应的操作,主要进行相应的业务数据管理。

    用户管理:可以管理前端和后端的用户信息,进行相应的数据增删改查操作。

    餐品管理:可以管理点餐系统发布的餐品信息,进行相应的数据增删改查操作。

    订单管理:对前端用户的下单信息进行相应的管理操作。

    分类管理:主要实现对前端点餐显示的餐品分类管理。

    系统管理:主要可以实现对系统的相关基本信息的管理操作。

二,环境介绍

后台开发:

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

前端开发:

开发工具:微信开发者工具

开发技术:微信小程序

整体采用前后端分离开发,前后端单独测试

三,系统展示

3.1 微信小程序功能模块的展示

3.1.1 前台首页展示

   微信小程序点餐前端主要就是实现点餐操作,主要包含预约点餐、菜单浏览、电话订餐、客服个模块。具体操作界面展示如下图4-1所示。

图3-1 前台首页界面

3.1.2 前台菜单浏览模块

用户进入微信点餐系统进入浏览菜单即可查看餐厅发布的餐品信息,具体如下图3-2所示:

图3-2 菜单浏览界面

3.1.3前台用户购物车模块

    微信小程序点餐前台用户登陆系统后可以进入预约点餐模块将餐品添加到购物车。用户登陆直接绑定用户微信账户进行登陆,非常方便。添加购物车操作界面如下图3-3所示。

图3-3前台用户添加购物车操作界面

3.1.4 前台用户点餐支付模块

    前台用户登陆点餐系统后,可以进入预约点餐模块将喜欢的餐品添加到购物车后提交订单并进行支付购买。完成餐品购买后并完成整个订单操作后,可以对餐品进行相关的评论。相关管理操作界面如下图3-4所示。

图3-4前台用户点餐支付界面

3.1.4前台用户个人订单管理模块

    微信小程序点餐前台用户登陆系统后可以在我的模块中个人订单管理模块中管理个人的订单信息。前端用户个人订单管理操作界面如下图3-5所示。

图3-5前台用户个人订单管理操作界面

3.2后台功能模块的展示

3.2.1用户登录功能

    微信小程序点餐后台用户如果想要对餐厅的相关信息进行管理操作,首先要登录系统,才可展开相关的操作。输入手机号和密码后用户登陆界面如下图3-6所示。

图3-6用户登录操作界面

3.2.2用户管理功能

    微信小程序点餐系统管理员用户登陆系统后,可以进入用户管理菜单进行相应的管理员用户信息管理。用户管理操作界面如下图3-7、3-8所示:

图3-7后台用户管理功能界面图

图3-8后台用户新增界面图

3.2.3 后台餐品管理操作UI

    微信小程序点餐管理员用户登陆系统后,可以进入餐品管理菜单进行相应的餐品信息管理。其中主要包含餐品的添加、修改、查询、下架操作等,添加餐品时可以指定餐品的图片进行展示。餐品信息管理操作界面如下图3-9、3-10所示。

图3-9后台餐品管理功能UI界面

图3-10后台餐品新增功能UI界面

3.2.4 后台餐品订单管理操作UI

    微信小程序点餐系统管理员用户登陆系统后,可以进入餐品订单管理菜单进行相应的餐品订单信息管理。其中主要包含餐品订单的查询、订单明细的查看等,添加餐品时可以上传餐品的图片进行展示。订单信息管理操作界面如下图3-11、3-12所示。

图3-11后台订单管理功能UI界面

图3-12后台订单详情查看功能UI界面

四,核心代码展示

package com.imooc.controller;import com.imooc.constant.CookieConstant;
import com.imooc.constant.RedisConstant;
import com.imooc.dataobject.SellerInfo;
import com.imooc.enums.ResultEnum;
import com.imooc.exception.SellException;
import com.imooc.form.SellerForm;
import com.imooc.repository.SellerInfoRepository;
import com.imooc.utils.CookieUtil;import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;import java.util.List;
import java.util.Map;
import java.util.UUID;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;import lombok.extern.slf4j.Slf4j;@RestController
@RequestMapping("/admin")
@Slf4j
public class AdminUserController {@AutowiredSellerInfoRepository repository;/*** 后台用户登陆操作* @param phone* @param password* @param response* @return*/@GetMapping("/loginAdmin")public String loginAdmin(@RequestParam("phone") String phone,@RequestParam("password") String password,HttpServletResponse response) {SellerInfo sellerInfo = repository.findByPhone(phone);log.info("商家信息={}", sellerInfo);if (sellerInfo != null && sellerInfo.getPassword().equals(password)) {String token = UUID.randomUUID().toString();log.info("登录成功的token={}", token);Integer expire = RedisConstant.EXPIRE;//3. 设置token至cookieCookieUtil.set(response, CookieConstant.TOKEN, token, expire);return "登录成功";} else {throw new SellException(ResultEnum.LOGIN_FAIL);}}@GetMapping("/logout")public ModelAndView logout(HttpServletRequest request,HttpServletResponse response,Map<String, Object> map) {//1. 从cookie里查询Cookie cookie = CookieUtil.get(request, CookieConstant.TOKEN);if (cookie != null) {//2. 清除cookieCookieUtil.set(response, CookieConstant.TOKEN, null, 0);}map.put("msg", ResultEnum.LOGOUT_SUCCESS.getMessage());map.put("url", "/sell/seller/order/list");return new ModelAndView("common/success", map);}/** 页面相关* */@GetMapping("/list")public ModelAndView list(Map<String, Object> map) {List<SellerInfo> categoryList = repository.findAll();map.put("categoryList", categoryList);return new ModelAndView("admin/list", map);}@GetMapping("/index")public ModelAndView index(@RequestParam(value = "sellerId", required = false) Integer sellerId,Map<String, Object> map) {SellerInfo sellerInfo = repository.findBySellerId(sellerId);map.put("category", sellerInfo);return new ModelAndView("admin/index", map);}/*** 保存/更新*/@PostMapping("/save")public ModelAndView save(@Valid SellerForm form,BindingResult bindingResult,Map<String, Object> map) {log.info("SellerForm={}", form);if (bindingResult.hasErrors()) {map.put("msg", bindingResult.getFieldError().getDefaultMessage());map.put("url", "/sell/admin/index");return new ModelAndView("common/error", map);}SellerInfo sellerInfo = new SellerInfo();try {if (form.getSellerId() != null) {sellerInfo = repository.findBySellerId(form.getSellerId());}BeanUtils.copyProperties(form, sellerInfo);repository.save(sellerInfo);} catch (SellException e) {map.put("msg", e.getMessage());map.put("url", "/sell/admin/index");return new ModelAndView("common/error", map);}map.put("url", "/sell/admin/list");return new ModelAndView("common/success", map);}
}
package com.imooc.controller;import com.imooc.VO.ResultVO;
import com.imooc.converter.OrderForm2OrderDTOConverter;
import com.imooc.dto.OrderDTO;
import com.imooc.enums.ResultEnum;
import com.imooc.exception.SellException;
import com.imooc.form.OrderForm;
import com.imooc.service.BuyerService;
import com.imooc.service.OrderService;
import com.imooc.utils.ResultVOUtil;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.List;
import java.util.Map;import javax.validation.Valid;import lombok.extern.slf4j.Slf4j;/*** Created by znz*/
@RestController
@RequestMapping("/buyer/order")
@Slf4j
public class BuyerOrderController {@Autowiredprivate OrderService orderService;@Autowiredprivate BuyerService buyerService;//创建订单@PostMapping("/create")public ResultVO<Map<String, String>> create(@Valid OrderForm orderForm,BindingResult bindingResult) {if (bindingResult.hasErrors()) {log.error("【创建订单】参数不正确, orderForm={}", orderForm);throw new SellException(ResultEnum.PARAM_ERROR.getCode(),bindingResult.getFieldError().getDefaultMessage());}OrderDTO orderDTO = OrderForm2OrderDTOConverter.convert(orderForm);if (CollectionUtils.isEmpty(orderDTO.getOrderDetailList())) {log.error("【创建订单】购物车不能为空");throw new SellException(ResultEnum.CART_EMPTY);}OrderDTO createResult = orderService.create(orderDTO);Map<String, String> map = new HashMap<>();map.put("orderId", createResult.getOrderId());return ResultVOUtil.success(map);}//订单列表@GetMapping("/listByStatus")public ResultVO<List<OrderDTO>> listByStatus(@RequestParam("openid") String openid,@RequestParam(value = "orderStatus", defaultValue = "0") Integer orderStatus) {if (StringUtils.isEmpty(openid)) {log.error("【查询订单列表】openid为空");throw new SellException(ResultEnum.PARAM_ERROR);}List<OrderDTO> orderList = buyerService.findOrderList(openid, orderStatus);return ResultVOUtil.success(orderList);}//订单详情@GetMapping("/detail")public ResultVO<OrderDTO> detail(@RequestParam("openid") String openid,@RequestParam("orderId") String orderId) {OrderDTO orderDTO = buyerService.findOrderOne(openid, orderId);return ResultVOUtil.success(orderDTO);}//确认收货@PostMapping("/sure")public ResultVO sure(@RequestParam("openid") String openid,@RequestParam("orderId") String orderId) {buyerService.cancelOrder(openid, orderId);return ResultVOUtil.success();}//取消订单@PostMapping("/cancel")public ResultVO cancel(@RequestParam("openid") String openid,@RequestParam("orderId") String orderId) {buyerService.cancelOrder(openid, orderId);return ResultVOUtil.success();}
}

package com.imooc.controller;import com.imooc.VO.ResultVO;
import com.imooc.dataobject.Comment;
import com.imooc.dataobject.OrderMaster;
import com.imooc.dto.OrderDTO;
import com.imooc.enums.OrderStatusEnum;
import com.imooc.enums.ResultEnum;
import com.imooc.exception.SellException;
import com.imooc.repository.CommentRepository;
import com.imooc.repository.OrderMasterRepository;
import com.imooc.service.OrderService;
import com.imooc.utils.ResultVOUtil;import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** desc:评论相关*/
@RestController
public class CommentController {@Autowiredprivate CommentRepository repository;@Autowiredprivate OrderService orderService;@Autowiredprivate OrderMasterRepository masterRepository;//订单详情@PostMapping("/comment")public ResultVO<Comment> detail(@RequestParam("openid") String openid,@RequestParam("orderId") String orderId,@RequestParam("name") String name,@RequestParam("avatarUrl") String avatarUrl,@RequestParam("content") String content) {if (StringUtils.isEmpty(openid) || StringUtils.isEmpty(orderId)) {throw new SellException(ResultEnum.PARAM_ERROR);}//提交评论Comment comment = new Comment();comment.setName(name);comment.setAvatarUrl(avatarUrl);comment.setOpenid(openid);comment.setContent(content);Comment save = repository.save(comment);//修改订单状态OrderDTO orderDTO = orderService.findOne(orderId);orderDTO.setOrderStatus(OrderStatusEnum.COMMENT.getCode());OrderMaster orderMaster = new OrderMaster();BeanUtils.copyProperties(orderDTO, orderMaster);OrderMaster updateResult = masterRepository.save(orderMaster);return ResultVOUtil.success(save);}//所有评论@GetMapping("/commentList")public ResultVO<List<Comment>> commentList() {List<Comment> all = repository.findAll();return ResultVOUtil.success(all);}//单个用户的所有评论@GetMapping("/userCommentList")public ResultVO<List<Comment>> userCommentList(@RequestParam("openid") String openid) {List<Comment> all = repository.findAllByOpenid(openid);return ResultVOUtil.success(all);}
}

五,项目总结

    微信小程序点餐系统的使用者主要包含两种用户角色,其一是管理员角色,其二是前台用户角色,这两个角色的具体功能如下:

    管理员角色:管理员登录微信小程序点餐系统后台管理后可以进行相应的管理操作,主要包含:用户管理、餐品管理、订单管理、分类管理等操作;

     前台用户角色:前台用户登录微信小程序点餐系统后可以进行餐品浏览、添加购物车、在线点餐、个人订单管理等操作。

     系统整体功能完整,根据微信小程序点餐系统需求分析,进行了微信小程序点餐系统概要设计,并在此基础上进行详细设计。完成了整个项目的详细设计后,就开始了项目的编码阶段。


http://chatgpt.dhexx.cn/article/F6V3OXxX.shtml

相关文章

饭店点餐系统之系统工作流程

系统的工作流程 客人进入店中&#xff0c;服务员手持Pad查询空闲座位&#xff0c;带领客人进入座位&#xff0c;输入座位号&#xff0c;顾客人数进入系统&#xff0c;然后将Pad交给客人进行点餐。点餐完毕后提交发 送到系统管理端&#xff0c;再发送给后厨进行打印制作。顾客就…

springboot+Vue饭店点菜点餐管理系统

该饭店点菜系统&#xff0c;采用了Vue技术开发&#xff0c;后台数据库是mysql数据库&#xff0c;系统分为前台和后台&#xff0c;前台是一般客户登陆后进行点菜选菜&#xff0c;后台是管理员用户登录后进行点菜信息的处理以及注册会员信息的处理 网站前台&#xff1a; 在线点菜…

饭店点餐系统之系统网络结构

系统的网络结构 四个终端都通过路邮器相连起来&#xff0c;顾客终端用wifi与路由器相连。 由于无线局域网传输距离的限制, 因此若脱离其无线服务覆盖范围时通信便会中断, 为解决此一问题须构建无缝的漫游连接. 以802.11b为例以三个不重叠信道1,6,11为基础向外扩充, 如此当无线网…

mysql餐馆点餐系统_课内资源 - 基于Jsp和MySql的餐厅点餐系统

1 总体概述 本设计主要通过HTML、CSS、JavaScript网页开发技术,会话及其会话技术,过滤器技术,Java语言以及连接mysql数据库来实现一个具有登录注册功能,且登录页面使用验证码技术来实现用户验证、未登录用户仅能访问主页的餐厅点餐系统。 主要的思路是与mysql数据库建表连接…

点餐系统-----数据库设计

1.系统需求分析阶段 1.1.选题背景 随着经济不断发展,餐饮行业也随着物质生活水平逐步提高而迅速发展,人们对生活质量的要求也越来越高,享受真正自动化、人性化的服务成为了人们追求高质量生活的重要内容。在大多数的餐饮场所点菜、查看菜谱等是人工完成的,速度慢,效率低…

饭店点餐系统的设计与实现

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a;

Java实现餐厅点餐系统

学习Java实现餐厅点餐系统&#xff0c;本文实现该系统的功能截图&#xff0c;和数据库设计SQL语句&#xff0c;系统功能图&#xff0c;功能优势等供大家参考 1.点餐管理系统背景 随着科技的发展&#xff0c;去饭店吃饭点餐和结账都是以线上操作的形势完成。 a.和现在有的系统…

插入算法

插入算法是一种排序算法 在运用插入算法时一般将数据分为两组&#xff0c;有序组和无序组&#xff0c;并且将数据的第一个元素默认为有序组&#xff0c;将无序组的元素一个一个按照某种排列方式插入到有序组中。 在此我们以大小顺序的排列为例&#xff0c;进行详细讲解&#…

Oracle插入数据

1、创建表格并指定结构 CREATE TABLE DB3.STUINFO( STUID INT, STUNAME VARCHAR(10), SEX INT, AGE INT, CLASSNO VARCHAR(10), STUADDRESS VARCHAR(10), GRADE INT, ENROLDATE DATE, IDNUMBER VARCHAR(20));2、插入数据 规范用法 INSERT INTO table(col1,col2...) VALUES(v…

【数据结构】插入排序 — 直接插入排序

目录 一、概述 二、直接插入排序 1&#xff09;概述 2&#xff09;步骤 3&#xff09;示意图 4&#xff09;分析&#xff1a;不带监视哨的算法 5&#xff09;算法实现&#xff1a;不带监视哨 6&#xff09;分析&#xff1a;带监视哨的算法 7&#xff09;算法&#xff1a…

插入排序图解

七大排序之插入排序 文章目录 七大排序之插入排序前言一、直接插入排序1.1 算法图解1.2 算法稳定性1.3 插入排序和选择排序相比到底优在哪&#xff1f; 二、折半插入排序总结 前言 博主个人社区&#xff1a;开发与算法学习社区 博主个人主页&#xff1a;Killing Vibe的博客 欢迎…

Mysql中4种常见的插入方式

4种常见insert方式 准备工作 CREATE TABLE identity_table (id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键id,identity_id int(11) DEFAULT NULL COMMENT 身份Id,name varchar(255) DEFAULT NULL COMMENT 姓名,PRIMARY KEY (id),UNIQUE KEY identity_idx (identity_id) C…

老生常谈:接口幂等性,防止并发插入重复数据

分布式系统中&#xff0c;接口幂等性问题&#xff0c;对于开发人员来说&#xff0c;是一个跟语言无关的公共问题。不知道你有没有遇到过这些场景&#xff1a; 有时我们在填写某些form表单时&#xff0c;保存按钮不小心快速点了两次&#xff0c;表中竟然产生了两条重复的数据&a…

c++常见面试问题总结

c和C语言的区别 C语言是面向结构性语言&#xff0c;C是面向对象语言 c语言是c的子集&#xff0c;c包含了c语言的全部词法和语法内容&#xff0c;比c语言多出了类。 程序运行的保存的五个区 堆 栈 常量 全局变量 代码区 什么是面向对象&#xff1a;注重的是对象&#xff0c;当…

SQL语句

DDL 1.DDL 库 定义库&#xff1a;创建数据库 create database 数据库名; (数据库名要求&#xff1a;区分大小写&#xff0c;唯一性 &#xff0c;不能使用关键字如create select;不能单独使用 的数字和特殊符号) 查看所有数据库&#xff1a;show databases&#xff1b; 选择/进入…

矿山尾矿库倾斜摄影三维建模

尾矿库现状调查是矿山安全生产工作的重要组成部分&#xff0c;也是监管部门关注的焦点。及时对尾矿库的现状进行调查&#xff0c;对存在的问题提出合理的整治方案&#xff0c;是控制尾矿库发生灾害的有效手段之一。本文以中维空间应用无人机倾斜摄影技术和三维激光扫描技术在某…

浙江数字孪生数字化工厂三维激光扫描建模_三维可视化管理平台_吉优赛维_三维建模解决方案_3D模型

作为工业4.0的标志之一&#xff0c;数字化工厂的建设趋势已经不可逆转了&#xff0c;而且很多企业也纷纷加入了这一行列当中。既要打造符合自己行业特色的数字化工厂&#xff0c;而且也要建造起符合自己未来盈利要求的工厂&#xff0c;于是在这种情况下三维扫描真正发挥了它的作…

那些与三维激光扫描有关的建模

文章目录 一、前言 二、正文 建模的方式 正向设计建模 参照点云数据逆向建模 粗略参照式逆向建模 精细参照式逆向建模 基于点云数据直接建模 基于照片建模 建模的目的 提升视觉及感观效果 附加属性信息 适用于承载平台 数据轻量化存储 打印输出 远离建模误区 见…

[数学建模]学习笔记1:初等建模

初等模型&#xff1a; 1.研究对象的机理比较简单 2.用静态&#xff0c;线性&#xff0c;确定性模型即可达到建模的目的 3.可以利用初等数学方法来构造和求解模型 注&#xff1a;尽量用简单的数学工具来建模 2.1 光盘的数据容量 调查和分析 经过编码的数字信息&#xff0c;以…

【三维激光扫描】第五章:基于点云数据的立面图绘制及三维建模

本文讲述CAD中加载点云并绘制立面图,然后在Sketchup中构建三维模型。 目 录 第一节 CAD绘制立面图 第二节 Sketchup三维模型构建