基于SpringBoot的网上点餐系统

1. 项目简介

项目名称 :网上点餐系统
项目描述 :基于Spring Boot和Vue.js开发的美食店管理与在线点餐平台,支持用户浏览美食店、查看菜单、下单支付、评价美食等功能,同时提供商家管理和后台运营模块。
核心功能

  • 多角色管理:管理员、用户、美食店商家
  • 美食展示与分类管理
  • 在线点餐与订单处理
  • 用户评价与收藏功能
  • 后台数据管理与系统配置

2. 技术栈

2.1 后端技术

  • 核心框架:Spring Boot 2.2.2.RELEASE
  • ORM框架:MyBatis + MyBatis-Plus 2.1.1
  • 安全框架:Apache Shiro 1.3.2
  • 数据库:MySQL 5.7
  • API文档:未明确提及
  • 其他组件:
    • FastJson 1.2.8(JSON处理)
    • Hutool 4.0.12(工具类库)
    • Shiro 1.3.2(权限管理)

2.2 前端技术

  • 核心框架:Vue.js
  • UI组件库:Element UI
  • 路由管理:Vue Router
  • HTTP客户端:Axios
  • 图表库:ECharts

2.3 开发与部署工具

  • 项目构建:Maven
  • 服务器:Tomcat(内嵌)
  • 开发环境:idea JDK 1.8

3. 详细介绍

3.1 系统架构

系统采用前后端分离架构:

  • 前端:单页应用(SPA),通过Vue Router实现路由管理
  • 后端:RESTful API,基于Spring Boot控制器提供接口服务
  • 数据层:MyBatis映射数据库操作,支持事务管理

3.2 功能模块划分

3.2.1 用户模块
  • 用户注册与登录(未实现前端登录,需后台添加)
  • 个人信息管理
  • 订单历史查询
  • 美食收藏功能
3.2.2 美食店模块
  • 店铺信息管理(基本信息、联系方式、招牌美食)
  • 菜单管理(添加、修改、删除美食信息)
  • 订单处理(查看订单、确认配送、处理评价)
3.2.3 订单模块
  • 在线点餐流程
  • 订单状态跟踪
  • 支付集成(模拟支付功能)
3.2.4 评价模块
  • 用户评价提交
  • 评分系统
  • 评价管理与展示

3.3 数据库设计

核心表结构

  • meishidian:美食店信息表
  • meishixinxi:美食信息表
  • meishidingdan:订单表
  • meishipingjia:评价表
  • yonghu:用户表
  • config:系统配置表

4. 部分代码

4.1 数据库设计代码

4.1.1 美食店表(meishidian)

sql

sql 复制代码
CREATE TABLE `meishidian` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `dianpuzhanghao` varchar(200) NOT NULL COMMENT '店铺账号',
  `mima` varchar(200) NOT NULL COMMENT '密码',
  `dianpumingcheng` varchar(200) NOT NULL COMMENT '店铺名称',
  `zhaopian` varchar(200) DEFAULT NULL COMMENT '照片',
  `lianxidianhua` varchar(200) DEFAULT NULL COMMENT '联系电话',
  `dianpujieshao` longtext COMMENT '店铺介绍',
  `dianpudizhi` varchar(200) DEFAULT NULL COMMENT '店铺地址',
  `zhaopaimeishi` longtext COMMENT '招牌美食',
  `lianxiren` varchar(200) DEFAULT NULL COMMENT '联系人',
  PRIMARY KEY (`id`),
  UNIQUE KEY `dianpuzhanghao` (`dianpuzhanghao`)
) ENGINE=InnoDB AUTO_INCREMENT=1615534171320 DEFAULT CHARSET=utf8 COMMENT='美食店';
4.1.2 订单表(meishidingdan)

sql

sql 复制代码
CREATE TABLE `meishidingdan` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `dingdanbianhao` varchar(200) DEFAULT NULL COMMENT '订单编号',
  `meishimingcheng` varchar(200) DEFAULT NULL COMMENT '美食名称',
  `dianpuzhanghao` varchar(200) DEFAULT NULL COMMENT '店铺账号',
  `dianpumingcheng` varchar(200) DEFAULT NULL COMMENT '店铺名称',
  `lianxidianhua` varchar(200) DEFAULT NULL COMMENT '联系电话',
  `jiage` varchar(200) DEFAULT NULL COMMENT '价格',
  `goumaishuliang` int(11) NOT NULL COMMENT '购买数量',
  `zongjiage` varchar(200) DEFAULT NULL COMMENT '总价格',
  `yonghuzhanghao` varchar(200) DEFAULT NULL COMMENT '用户账号',
  `yonghuxingming` varchar(200) DEFAULT NULL COMMENT '用户姓名',
  `yonghushouji` varchar(200) DEFAULT NULL COMMENT '用户手机',
  `peisongdizhi` varchar(200) NOT NULL COMMENT '配送地址',
  `xiadanshijian` datetime DEFAULT NULL COMMENT '下单时间',
  `sfsh` varchar(200) DEFAULT '否' COMMENT '是否审核',
  `shhf` longtext COMMENT '审核回复',
  `ispay` varchar(200) DEFAULT '未支付' COMMENT '是否支付',
  PRIMARY KEY (`id`),
  UNIQUE KEY `dingdanbianhao` (`dingdanbianhao`)
) ENGINE=InnoDB AUTO_INCREMENT=1615534362236 DEFAULT CHARSET=utf8 COMMENT='美食订单';

4.2 后端配置代码

4.2.1 Maven依赖配置(pom.xml)

xml

xml 复制代码
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.1.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring</artifactId>
        <version>1.3.2</version>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus</artifactId>
        <version>2.3</version>
    </dependency>
    <!-- 其他依赖... -->
</dependencies>

4.3 前端代码示例

4.3.1 路由配置(router-static.js)

javascript

javascript 复制代码
import Vue from 'vue';
import VueRouter from 'vue-router'
Vue.use(VueRouter);

// 导入组件
import Index from '@/views/index'
import Home from '@/views/home'
import Login from '@/views/login'
import NotFound from '@/views/404'
import meishifenlei from '@/views/modules/meishifenlei/list'
import news from '@/views/modules/news/list'
// 其他组件导入...

// 路由配置
const routes = [
    {
        path: '/index', 
        name: '首页', 
        component: Index, 
        children: [
            { path: '/', name: 'home', component: Home },
            { path: '/meishifenlei', name: '美食分类', component: meishifenlei },
            { path: '/news', name: '美食资讯', component: news },
            // 其他路由...
        ]
    },
    { path: '/login', name: 'login', component: Login },
    { path: '/', redirect: '/index' },
    { path: '*', component: NotFound }
]

const router = new VueRouter({
    mode: 'hash',
    routes
})

export default router;
4.3.2 菜单配置(menu.js)

javascript

javascript 复制代码
const menu = {
    list() {
        return [
            {
                "backMenu": [
                    {
                        "child": [{"buttons": ["新增","查看","修改","删除"],"menu":"用户","menuJump":"列表","tableName":"yonghu"}],
                        "menu": "用户管理"
                    },
                    {
                        "child": [{"buttons": ["新增","查看","修改","删除"],"menu":"美食店","menuJump":"列表","tableName":"meishidian"}],
                        "menu": "美食店管理"
                    },
                    // 其他后台菜单...
                ],
                "frontMenu": [
                    {
                        "child": [{"buttons": ["查看"],"menu":"美食店列表","menuJump":"列表","tableName":"meishidian"}],
                        "menu": "美食店模块"
                    },
                    // 其他前台菜单...
                ],
                "roleName": "管理员",
                "tableName": "users"
            },
            // 其他角色菜单...
        ]
    }
}
export default menu;

4. 部分代码(40%)

4.4 后端业务逻辑代码示例

4.4.1 订单处理Controller

java

java 复制代码
@RestController
@RequestMapping("/meishidingdan")
public class MeishidingdanController {
    @Autowired
    private MeishidingdanService meishidingdanService;
    
    @Autowired
    private TokenService tokenService;
    
    /**
     * 新增订单
     */
    @PostMapping("/add")
    public R add(@RequestBody MeishidingdanEntity meishidingdan, HttpServletRequest request) {
        // 获取当前用户信息
        String token = request.getHeader("Token");
        UserEntity user = tokenService.getUserEntity(token);
        
        // 设置订单基本信息
        meishidingdan.setYonghuzhanghao(user.getUsername());
        meishidingdan.setYonghuxingming(user.getRealname());
        meishidingdan.setYonghushouji(user.getMobile());
        meishidingdan.setDingdanbianhao(UUID.randomUUID().toString());
        meishidingdan.setXiadanshijian(new Date());
        meishidingdan.setSfsh("否");
        meishidingdan.setIspay("未支付");
        
        // 计算总价格
        BigDecimal zongjiage = new BigDecimal(meishidingdan.getJiage())
            .multiply(new BigDecimal(meishidingdan.getGoumaishuliang()));
        meishidingdan.setZongjiage(zongjiage.toString());
        
        meishidingdanService.insert(meishidingdan);
        return R.ok();
    }
    
    /**
     * 订单支付
     */
    @PostMapping("/pay")
    public R pay(@RequestBody Map<String, String> params) {
        String orderId = params.get("orderId");
        MeishidingdanEntity order = meishidingdanService.selectById(orderId);
        
        if (order == null) {
            return R.error("订单不存在");
        }
        
        if ("已支付".equals(order.getIspay())) {
            return R.error("订单已支付");
        }
        
        // 模拟支付流程
        order.setIspay("已支付");
        meishidingdanService.updateById(order);
        
        return R.ok();
    }
    
    /**
     * 订单列表查询
     */
    @GetMapping("/list")
    public R list(@RequestParam Map<String, Object> params, HttpServletRequest request) {
        // 获取当前用户信息
        String token = request.getHeader("Token");
        UserEntity user = tokenService.getUserEntity(token);
        
        // 根据用户角色查询不同订单
        if ("用户".equals(user.getRole())) {
            params.put("yonghuzhanghao", user.getUsername());
        } else if ("美食店".equals(user.getRole())) {
            params.put("dianpuzhanghao", user.getUsername());
        }
        
        PageUtils page = meishidingdanService.queryPage(params);
        return R.ok().put("data", page);
    }
}
4.4.2 美食信息Service实现

java

java 复制代码
@Service("meishixinxiService")
public class MeishixinxiServiceImpl extends ServiceImpl<MeishixinxiDao, MeishixinxiEntity> implements MeishixinxiService {

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        QueryWrapper<MeishixinxiEntity> queryWrapper = new QueryWrapper<>();
        
        // 美食分类筛选
        if(params.get("meishifenlei") != null && !"".equals(params.get("meishifenlei"))) {
            queryWrapper.eq("meishifenlei", params.get("meishifenlei"));
        }
        
        // 关键词搜索
        if(params.get("keyword") != null && !"".equals(params.get("keyword"))) {
            queryWrapper.and(qw -> {
                qw.like("meishimingcheng", params.get("keyword"))
                  .or().like("xiangqing", params.get("keyword"))
                  .or().like("kouwei", params.get("keyword"));
            });
        }
        
        // 按点击量排序
        queryWrapper.orderByDesc("clicknum");
        
        IPage<MeishixinxiEntity> page = this.page(
            new Query<MeishixinxiEntity>().getPage(params),
            queryWrapper
        );
        
        return new PageUtils(page);
    }
    
    /**
     * 记录点击量
     */
    @Override
    public void updateClickNum(Long id) {
        MeishixinxiEntity entity = this.getById(id);
        if(entity != null) {
            entity.setClicknum(entity.getClicknum() + 1);
            entity.setClicktime(new Date());
            this.updateById(entity);
        }
    }
}

5. 部分截图






























6. 项目总结

6.1 系统功能总结

本网上点餐系统实现了从美食浏览到订单完成的全流程管理,主要功能包括:

  1. 多角色管理:支持管理员、用户、美食店商家三种角色,各角色拥有不同的操作权限和功能模块。
  2. 完整的点餐流程:用户可浏览美食店、查看菜单、加入购物车、下单支付、查看订单状态、评价美食等。
  3. 商家管理功能:商家可管理店铺信息、菜品信息、处理订单、查看评价等。
  4. 后台管理系统:管理员可管理用户、商家、菜品分类、订单、评价等系统数据。
  5. 数据统计与分析:系统提供点击量统计、订单数据分析等基础数据功能。

6.2 技术架构评价

优势:
  1. 前后端分离架构:采用Spring Boot后端和Vue.js前端分离开发,提高了开发效率和系统可维护性。
  2. 成熟的技术栈:选用Spring Boot、MyBatis、Vue.js等成熟框架,降低了开发难度,提高了系统稳定性。
  3. 安全机制:集成Shiro权限控制,实现了基于角色的访问控制,保障系统安全。
  4. 可扩展性设计:采用模块化开发,各功能模块低耦合,便于后续功能扩展。

6.3 项目亮点

  1. 完整的业务流程:实现了从浏览到评价的闭环流程,满足用户和商家的核心需求。
  2. 多角色权限控制:通过Shiro和自定义权限管理,实现了精细化的权限控制。
  3. 响应式设计:前端页面采用响应式布局,适配不同设备访问。
  4. 代码规范:项目代码组织结构清晰,命名规范,便于维护和扩展。

6.4 改进方向

  1. 性能优化

    • 引入Redis缓存热门数据
    • 优化数据库查询,添加适当索引
    • 实现前端资源懒加载
  2. 功能增强

    • 集成第三方支付接口(微信支付、支付宝)
    • 添加消息推送功能(订单状态变更通知)
    • 实现优惠券、积分等营销功能
  3. 用户体验优化

    • 优化前端交互,减少加载等待时间
    • 添加智能推荐功能,根据用户偏好推荐美食
    • 完善移动端适配,提升移动端用户体验
  4. 系统监控

    • 添加日志系统,便于问题排查
    • 实现系统性能监控,及时发现并解决问题

6.5 总结

本网上点餐系统基于Spring Boot和Vue.js技术栈,实现了点餐平台的核心功能,系统架构合理,功能完善,能够满足中小规模餐饮企业的线上点餐需求。

通过持续迭代优化,本系统有望成为功能完善、性能稳定、用户体验优良的在线点餐解决方案,为餐饮企业数字化转型提供有力支持。

在线演示:

后端:http://springboott01gx.xiaobias.com/springboott01gx/admin/dist/index.html

前端:http://springboott01gx.xiaobias.com/springboott01gx/front/index.html

管理员:abo/abo

用户:用户1/123456、用户2/123456

美食店:美食店1/123456、美食店2/123456

资源:https://fifteen.xiaobias.com/source/42

相关推荐
李九四7 分钟前
章节11:使用括号()标明优先级
后端
叫我阿柒啊11 分钟前
Java全栈开发面试实战:从基础到微服务的深度解析
java·jvm·微服务·vue3·springboot·全栈开发·restfulapi
拾光师12 分钟前
flume监控目录文件实战:三种 Source 方案对比与配置指南
后端
金銀銅鐵16 分钟前
[Java] 浅析注解是如何实现的
后端
李九四18 分钟前
章节10:支持连续的乘除法
后端
精神领袖本尊20 分钟前
ESP8266(esp-01s) 继电器控制灯具项目
后端
cxyxiaokui00120 分钟前
检索增强生成(RAG):打破模型知识壁垒的革命性架构
java·aigc
Monly2126 分钟前
Docker:部署Java后端
java·docker·容器
加瓦点灯28 分钟前
Spring AI:让大模型更好用的“桥梁”
后端
是店小二呀38 分钟前
【C++】智能指针底层原理:引用计数与资源管理机制
android·java·c++