美食点餐小程序的设计与实现

前言

博主介绍:优快云特邀作者、985高校计算机专业毕业、现任某互联网大厂高级全栈开发工程师、Gitee/掘金/华为云/阿里云/GitHub等平台持续输出高质量技术内容、深耕Java、小程序、前端、python等技术领域和毕业项目实战,以及程序定制化开发、全栈讲解。

💯文末获取源码+数据库💯
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以找我咨询,希望帮助更多的人。

详细视频演示

视频演示

具体实现截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

后端框架SpringBoot

Spring Boot允许开发者快速构建出既可以独立运行又满足生产级别标准的Spring基础应用程序。此框架通过提供一系列便捷的工具和服务,极大地促进了基于Spring的应用开发工作的效率和质量。通过提供一系列大型项目中常用的默认配置,Spring Boot最大化减少配置文件的使用,开发者能够迅速启动和运行Spring应用程序。

Spring Boot通过约定优于配置的原则,避免了许多传统Spring应用开发时繁琐的配置,该框架支持对内嵌服务器的自动配置,如Tomcat、Jetty或Undertow,从而简化了Web应用的部署过程。

微信小程序

小程序开发框架的目标是通过尽可能简单、高效的方式让开发者可以在微信中开发具有原生 APP 体验的服务。
整个小程序框架系统分为两部分:逻辑层(App Service)和 视图层(View)。小程序提供了自己的视图层描述语言 WXML 和 WXSS,以及基于 JavaScript 的逻辑层框架,并在视图层与逻辑层间提供了数据传输和事件系统,让开发者能够专注于数据与逻辑。

持久层框架MyBaits

MyBatis是一个开源的持久层框架,它可以帮助开发者简化数据库操作的编写和管理。MyBatis的核心思想是将SQL语句和Java代码分离,通过XML或注解的方式来描述数据库操作,从而实现了数据访问层的解耦和灵活性。

MyBatis的优势主要包括以下几点:

简化数据库操作:MyBatis通过提供强大的SQL映射功能,可以将Java对象与数据库表进行映射,开发者无需手动编写繁琐的SQL语句,大大简化了数据库操作的编写和维护。

灵活的SQL控制:MyBatis支持动态SQL,可以根据不同的条件和逻辑来动态生成SQL语句,使得查询、更新等操作更加灵活和可控。

缓存支持:MyBatis提供了一级缓存和二级缓存的支持,可以有效减少数据库的访问次数,提高系统性能。

可扩展性强:MyBatis采用插件机制,可以方便地扩展和定制自己的功能,满足各种不同的业务需求。

所有项目均为博主亲自收集、开发并严格测试,确保源码完整、可运行,无缺失依赖或兼容性问题!同学们拿到后就能使用!博主具备多年高级开发经验,能深入讲解代码架构、核心逻辑及技术难点,助你高效掌握项目精髓。

成功系统案例:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

参考代码

package com.xxxy.ssm_shop.controller;

import com.xxxy.ssm_shop.model.CartItem;
import com.xxxy.ssm_shop.model.Order;
import com.xxxy.ssm_shop.model.OrderItem;
import com.xxxy.ssm_shop.model.User;
import com.xxxy.ssm_shop.service.IOrderService;
import com.xxxy.ssm_shop.service.IUserService;
import com.xxxy.ssm_shop.service.impl.CartItemService;
import com.xxxy.ssm_shop.utils.PageBean;
import com.xxxy.ssm_shop.utils.Result;
import com.xxxy.ssm_shop.utils.UUIDUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping(value = "/order")
public class OrderController extends BaseController{

    @Autowired
    private CartItemService cartItemService;

    @Autowired
    private IOrderService orderService;


    @RequestMapping(value = "/addOrder")
    public String addOrder(Model model) {
        User user = (User) getSessionUser();
        List<CartItem> carItemsByUid = cartItemService.findCarItemsByUid(user.getUid());
        Order order = new Order();
        String uuid = String.valueOf(System.currentTimeMillis());
        order.setOid(uuid);
        order.setTotal(carItemsByUid.stream().map(CartItem::getSubtotal).reduce(0d, Double::sum));
        order.setOrdertime(new Date());
        order.setState(2);
        order.setUser(user);
        List<OrderItem> orderItemList = new ArrayList<>();
        orderService.saveOrder(order);
        for (CartItem cartItem : carItemsByUid) {
            OrderItem orderItem = new OrderItem();
            orderItem.setCount(cartItem.getCount());
            orderItem.setSubtotal(cartItem.getSubtotal());
            orderItem.setProduct(cartItem.getProduct());
            orderItem.setOrder(order);
            orderItemList.add(orderItem);
            orderService.saveOrderItem(orderItem);
        }
        order.setOrderItemList(orderItemList);
        model.addAttribute("order", order);
        cartItemService.delClearCartItem(user.getUid());
        return "order";

    }


    @RequestMapping(value = "/addOrderWx")
    @ResponseBody
    public Result addOrderWx(Integer[] pids) {
        User user = (User) getSessionUser();
        List<CartItem> carItems = new ArrayList<>();
        for(Integer pid :pids){
            CartItem cartItem = cartItemService.findCartItemBypidAndUid(pid, user.getUid());
            carItems.add(cartItem);
        }
        Order order = new Order();
        String uuid = String.valueOf(System.currentTimeMillis());
        order.setOid(uuid);
        order.setTotal(carItems.stream().map(CartItem::getSubtotal).reduce(0d, Double::sum));
        order.setOrdertime(new Date());
        order.setState(1);
        order.setUser(user);
        order.setName(user.getName());
        order.setPhone(user.getPhone());
        order.setAddr(user.getAddr());
        List<OrderItem> orderItemList = new ArrayList<>();
        orderService.saveOrder(order);
        for (CartItem cartItem : carItems) {
            OrderItem orderItem = new OrderItem();
            orderItem.setCount(cartItem.getCount());
            orderItem.setSubtotal(cartItem.getSubtotal());
            orderItem.setProduct(cartItem.getProduct());
            orderItem.setOrder(order);
            orderItemList.add(orderItem);
            orderService.saveOrderItem(orderItem);
        }
        order.setOrderItemList(orderItemList);
        for(Integer pid :pids){
            cartItemService.delCartItemBypidAndUid(pid,user.getUid());
        }
       return Result.success();
    }

    /*用户订单列表*/
    @RequestMapping(value = "/findOrderByUid")
    public String findOrderByUid(@RequestParam(defaultValue = "1") int page, Model model) {
        User existUser = (User) getSessionUser();
        Integer uid = existUser.getUid();
        PageBean<Order> pageBean = orderService.findByUid(uid, page);
        model.addAttribute("pageBean", pageBean);
        return "orderList";
    }


    /*用户订单列表*/
    @RequestMapping(value = "/findOrderByUidWx")
    @ResponseBody
    public Result findOrderByUid(@RequestParam(defaultValue = "1") int page) {
        User existUser = (User) getSessionUser();
        Integer uid = existUser.getUid();
        PageBean<Order> pageBean = orderService.findByUid(uid, page);
        return Result.success(pageBean);
    }

    /*去付款*/
    @RequestMapping("/findByOid")
    String findOrderByOid(@RequestParam String oid, Model model) {
        model.addAttribute("order", orderService.findByOid(oid));
        return "order";
    }

    /*支付*/
    @RequestMapping("/payOrder")
    String payOrder(@ModelAttribute Order order) {
        Order payOrder = orderService.findByOid(order.getOid());
        if (payOrder != null && 1 == payOrder.getState()) {
            payOrder.setAddr(order.getAddr());
            payOrder.setName(order.getName());
            payOrder.setPhone(order.getPhone());
            payOrder.setState(2);
            orderService.updateOrder(payOrder);
        }
        return "redirect:/order/findOrderByUid";
    }

    /*确认收货*/
    @RequestMapping("/updateState")
    String updateState(@RequestParam String oid) {
        Order order = orderService.findByOid(oid);
        if(order != null && order.getState() == 3){
            order.setState(4);
            orderService.updateOrder(order);
        }
        return "redirect:/order/findOrderByUid";
    }

}

数据库

/*

-- ----------------------------
-- Table structure for adminuser
-- ----------------------------
DROP TABLE IF EXISTS `adminuser`;
CREATE TABLE `adminuser`  (
  `uid` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名',
  `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码',
  `type` int(11) NULL DEFAULT 0 COMMENT '用户类型(0表示普通,1表示管理员等)',
  PRIMARY KEY (`uid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '管理员用户表' ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of adminuser
-- ----------------------------
INSERT INTO `adminuser` VALUES (1, 'admin', 'admin', 1);
INSERT INTO `adminuser` VALUES (2, 'superadmin', 'superpass', 0);
INSERT INTO `adminuser` VALUES (3, 'operator', 'operatorpass', 1);

-- ----------------------------
-- Table structure for cart
-- ----------------------------
DROP TABLE IF EXISTS `cart`;
CREATE TABLE `cart`  (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '购物车ID',
  `user_id` int(11) NOT NULL COMMENT '所属用户ID',
  `total` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '购物车总金额',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `user_id`(`user_id` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '购物车表' ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of cart
-- ----------------------------

-- ----------------------------
-- Table structure for cartitem
-- ----------------------------
DROP TABLE IF EXISTS `cartitem`;
CREATE TABLE `cartitem`  (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '购物项主键ID',
  `uid` int(11) NOT NULL COMMENT '用户ID,关联用户表',
  `pid` int(11) NOT NULL COMMENT '商品ID,关联商品表',
  `count` int(11) NOT NULL DEFAULT 1 COMMENT '商品数量',
  `subtotal` decimal(10, 2) NOT NULL COMMENT '小计金额',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '购物车项表' ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of cartitem
-- ----------------------------

-- ----------------------------
-- Table structure for category
-- ----------------------------
DROP TABLE IF EXISTS `category`;
CREATE TABLE `category`  (
  `cid` int(11) NOT NULL AUTO_INCREMENT COMMENT '一级分类ID',
  `cname` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '一级分类名称',
  PRIMARY KEY (`cid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '商品一级分类表' ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of category
-- ----------------------------
INSERT INTO `category` VALUES (1, '徽菜');
INSERT INTO `category` VALUES (2, '川菜');
INSERT INTO `category` VALUES (3, '湘菜');

-- ----------------------------
-- Table structure for categorysecond
-- ----------------------------
DROP TABLE IF EXISTS `categorysecond`;
CREATE TABLE `categorysecond`  (
  `csid` int(11) NOT NULL AUTO_INCREMENT COMMENT '二级分类ID',
  `csname` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '二级分类名称',
  `cid` int(11) NOT NULL COMMENT '所属一级分类ID',
  PRIMARY KEY (`csid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '商品二级分类表' ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of categorysecond
-- ----------------------------
INSERT INTO `categorysecond` VALUES (1, '精美凉菜', 1);
INSERT INTO `categorysecond` VALUES (2, '家常小菜', 1);
INSERT INTO `categorysecond` VALUES (3, '海鲜', 1);

-- ----------------------------
-- Table structure for orderitem
-- ----------------------------
DROP TABLE IF EXISTS `orderitem`;
CREATE TABLE `orderitem`  (
  `itemid` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单项ID',
  `count` int(11) NOT NULL COMMENT '购买数量',
  `subtotal` double NOT NULL COMMENT '小计金额',
  `pid` int(11) NOT NULL COMMENT '商品ID,关联product表',
  `oid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '订单ID,关联orders表',
  PRIMARY KEY (`itemid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '订单项表' ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of orderitem
-- ----------------------------
INSERT INTO `orderitem` VALUES (1, 1, 19, 1, '1751882626360');
INSERT INTO `orderitem` VALUES (2, 1, 19, 1, '1753538242787');

-- ----------------------------
-- Table structure for orders
-- ----------------------------
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders`  (
  `oid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '订单ID',
  `total` double NULL DEFAULT NULL COMMENT '订单总金额',
  `ordertime` datetime NULL DEFAULT NULL COMMENT '下单时间',
  `state` int(11) NULL DEFAULT NULL COMMENT '订单状态:1未付款,2已付款,3已发货,4已完成',
  `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '收货人姓名',
  `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系电话',
  `addr` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '收货地址',
  `uid` int(11) NULL DEFAULT NULL COMMENT '用户ID',
  PRIMARY KEY (`oid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '订单表' ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of orders
-- ----------------------------
INSERT INTO `orders` VALUES ('1751882626360', 19, '2025-07-07 18:03:46', 2, '张三', '13800000001', '北京市朝阳区', 1);
INSERT INTO `orders` VALUES ('1753538242787', 19, '2025-07-26 21:57:23', 2, '张三', '13800000001', '北京市朝阳区', 1);

-- ----------------------------
-- Table structure for product
-- ----------------------------
DROP TABLE IF EXISTS `product`;
CREATE TABLE `product`  (
  `pid` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品ID',
  `pname` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '商品名称',
  `market_price` double NULL DEFAULT 0 COMMENT '市场价格',
  `shop_price` double NULL DEFAULT 0 COMMENT '商店价格',
  `image` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '商品图片路径',
  `pdesc` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '商品描述',
  `is_hot` tinyint(1) NULL DEFAULT 0 COMMENT '是否热销,1为是,0为否',
  `pdate` date NULL DEFAULT NULL COMMENT '上架日期',
  `csid` int(11) NOT NULL COMMENT '二级分类ID,外键',
  PRIMARY KEY (`pid`) USING BTREE,
  INDEX `fk_product_category_second`(`csid` ASC) USING BTREE,
  CONSTRAINT `fk_product_category_second` FOREIGN KEY (`csid`) REFERENCES `categorysecond` (`csid`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '商品表' ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of product
-- ----------------------------
INSERT INTO `product` VALUES (1, '凉拌紫甘蓝', 19, 19, 'products/1753538530282.jpeg', '凉拌紫甘蓝', 0, NULL, 1);

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `uid` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名',
  `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码',
  `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '真实姓名',
  `email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '电子邮件',
  `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机号',
  `addr` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系地址',
  `state` int(11) NULL DEFAULT 0 COMMENT '用户状态(例如激活状态)',
  `code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '激活码或验证码',
  PRIMARY KEY (`uid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户表' ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'zhangsan', '123456', '张三', 'zhangsan@example.com', '13800000001', '北京市朝阳区', 1, NULL);
INSERT INTO `user` VALUES (2, 'lisi', 'password', '李四', 'lisi@example.com', '13800000002', '上海市浦东新区', 1, NULL);
INSERT INTO `user` VALUES (3, 'wangwu', 'passwd123', '王五', 'wangwu@example.com', '13800000003', '广州市天河区', 0, 'activationcode123');

SET FOREIGN_KEY_CHECKS = 1;

源码获取

如需交流/获取资料,请先【关注+私信】我,私信获取源码~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值