基于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
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
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
<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
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
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
@RestController
@RequestMapping("/meishidingdan")
public class MeishidingdanController {@Autowiredprivate MeishidingdanService meishidingdanService;@Autowiredprivate 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
@Service("meishixinxiService")
public class MeishixinxiServiceImpl extends ServiceImpl<MeishixinxiDao, MeishixinxiEntity> implements MeishixinxiService {@Overridepublic 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);}/*** 记录点击量*/@Overridepublic 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 系统功能总结
本网上点餐系统实现了从美食浏览到订单完成的全流程管理,主要功能包括:
- 多角色管理:支持管理员、用户、美食店商家三种角色,各角色拥有不同的操作权限和功能模块。
- 完整的点餐流程:用户可浏览美食店、查看菜单、加入购物车、下单支付、查看订单状态、评价美食等。
- 商家管理功能:商家可管理店铺信息、菜品信息、处理订单、查看评价等。
- 后台管理系统:管理员可管理用户、商家、菜品分类、订单、评价等系统数据。
- 数据统计与分析:系统提供点击量统计、订单数据分析等基础数据功能。
6.2 技术架构评价
优势:
- 前后端分离架构:采用Spring Boot后端和Vue.js前端分离开发,提高了开发效率和系统可维护性。
- 成熟的技术栈:选用Spring Boot、MyBatis、Vue.js等成熟框架,降低了开发难度,提高了系统稳定性。
- 安全机制:集成Shiro权限控制,实现了基于角色的访问控制,保障系统安全。
- 可扩展性设计:采用模块化开发,各功能模块低耦合,便于后续功能扩展。
6.3 项目亮点
- 完整的业务流程:实现了从浏览到评价的闭环流程,满足用户和商家的核心需求。
- 多角色权限控制:通过Shiro和自定义权限管理,实现了精细化的权限控制。
- 响应式设计:前端页面采用响应式布局,适配不同设备访问。
- 代码规范:项目代码组织结构清晰,命名规范,便于维护和扩展。
6.4 改进方向
-
性能优化:
- 引入Redis缓存热门数据
- 优化数据库查询,添加适当索引
- 实现前端资源懒加载
-
功能增强:
- 集成第三方支付接口(微信支付、支付宝)
- 添加消息推送功能(订单状态变更通知)
- 实现优惠券、积分等营销功能
-
用户体验优化:
- 优化前端交互,减少加载等待时间
- 添加智能推荐功能,根据用户偏好推荐美食
- 完善移动端适配,提升移动端用户体验
-
系统监控:
- 添加日志系统,便于问题排查
- 实现系统性能监控,及时发现并解决问题
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