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 系统功能总结
本网上点餐系统实现了从美食浏览到订单完成的全流程管理,主要功能包括:
- 多角色管理:支持管理员、用户、美食店商家三种角色,各角色拥有不同的操作权限和功能模块。
- 完整的点餐流程:用户可浏览美食店、查看菜单、加入购物车、下单支付、查看订单状态、评价美食等。
- 商家管理功能:商家可管理店铺信息、菜品信息、处理订单、查看评价等。
- 后台管理系统:管理员可管理用户、商家、菜品分类、订单、评价等系统数据。
- 数据统计与分析:系统提供点击量统计、订单数据分析等基础数据功能。
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