本文将介绍一个使用 Java 开发的网上订餐系统,该系统使用 Spring Boot 作为主要框架,MyBatis 作为持久层框架,Thymeleaf 作为模板引擎,使用 MySQL 作为数据库。
一、系统概述
该网上订餐系统主要包括如下模块:
- 用户管理模块:用户可以注册、登录和修改个人信息等。
- 菜品管理模块:管理员可以添加、删除和修改菜品信息。
- 订单管理模块:用户可以在系统中选择菜品下单,管理员可以查看和处理订单。
- 积分管理模块:用户可以通过在线点餐获取积分,管理员可以设置积分规则和查看积分信息。
二、技术架构
-
框架:Spring Boot
-
ORM框架:MyBatis
-
模板引擎:Thymeleaf
-
数据库:MySQL
对应教学先放在这里:【Java项目】30分钟带你手把手做出网上订餐系统_java毕业设计(白嫖)_哔哩哔哩_bilibili
三、数据库设计
-
用户表(t_user):
CREATE TABLE `t_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`name` varchar(64) NOT NULL COMMENT '用户名',
`password` varchar(64) NOT NULL COMMENT '密码',
`email` varchar(64) DEFAULT NULL COMMENT '邮箱',
`phone` varchar(64) DEFAULT NULL COMMENT '手机号码',
`address` varchar(512) DEFAULT NULL COMMENT '地址',
`point` int(11) DEFAULT '0' COMMENT '积分',
`type` int(11) DEFAULT '1' COMMENT '用户类型:1-普通用户,2-管理员',
`status` int(11) DEFAULT '1' COMMENT '用户状态:1-正常,2-锁定',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
-
菜品表(t_dish):
CREATE TABLE `t_dish` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '菜品ID',
`name` varchar(64) NOT NULL COMMENT '菜品名称',
`price` double(10,2) NOT NULL COMMENT '菜品价格',
`description` varchar(512) DEFAULT NULL COMMENT '菜品描述',
`pic` varchar(256) DEFAULT NULL COMMENT '图片URL',
`status` int(11) DEFAULT '1' COMMENT '菜品状态:1-在售,2-下架',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='菜品表';
-
订单表(t_order):
CREATE TABLE `t_order` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '订单ID',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`dish_id` bigint(20) NOT NULL COMMENT '菜品ID',
`price` double(10,2) NOT NULL COMMENT '菜品价格',
`status` int(11) DEFAULT '1' COMMENT '订单状态:1-未处理,2-已处理',
`create_time` datetime NOT NULL COMMENT '订单创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';
-
积分规则表(tpointrule):
CREATE TABLE `t_point_rule` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '规则ID',
`order_amount` double(10,2) NOT NULL COMMENT '订单金额',
`point` int(11) NOT NULL COMMENT '获得积分',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='积分规则表';
-
积分流水表(tpointlog):
CREATE TABLE `t_point_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '流水ID',
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`rule_id` bigint(20) NOT NULL COMMENT '规则ID',
`point` int(11) NOT NULL COMMENT '获得积分',
`create_time` datetime NOT NULL COMMENT '流水创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='积分流水表';
四、代码实现
4.1 用户管理模块:
-
用户注册
@Controller
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/register")
public String register(User user) {
userService.addUser(user);
return "redirect:/login";
}
}
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public void addUser(User user) {
user.setCreateTime(new Date());
userMapper.insert(user);
}
}
-
用户登录
@Controller
public class UserController {
@PostMapping("/login")
public String login(String name, String password, HttpSession session) {
User user = userService.getUserByNameAndPassword(name, password);
if (user == null) {
return "redirect:/login";
}
session.setAttribute("user", user);
return "redirect:/";
}
}
@Service
public class UserService {
public User getUserByNameAndPassword(String name, String password) {
UserExample example = new UserExample();
example.createCriteria()
.andNameEqualTo(name)
.andPasswordEqualTo(password);
List<User> userList = userMapper.selectByExample(example);
return userList.isEmpty() ? null : userList.get(0);
}
}
-
修改个人信息
@Controller
public class UserController {
@PostMapping("/profile")
public String updateProfile(User user, HttpSession session) {
User oldUser = (User) session.getAttribute("user");
oldUser.setEmail(user.getEmail());
oldUser.setPhone(user.getPhone());
oldUser.setAddress(user.getAddress());
userService.updateUser(oldUser);
return "redirect:/profile";
}
}
@Service
public class UserService {
public void updateUser(User user) {
userMapper.updateByPrimaryKeySelective(user);
}
}
4.2 菜品管理模块:
-
添加菜品
@Controller
public class DishController {
@PostMapping("/add-dish")
public String addDish(Dish dish) {
dishService.addDish(dish);
return "redirect:/dishes";
}
}
@Service
public class DishService {
@Autowired
private DishMapper dishMapper;
public void addDish(Dish dish) {
dishMapper.insert(dish);
}
}
-
删除菜品
@Controller
public class DishController {
@GetMapping("/delete-dish")
public String deleteDish(Long id) {
dishService.deleteDish(id);
return "redirect:/dishes";
}
}
@Service
public class DishService {
public void deleteDish(Long id) {
dishMapper.deleteByPrimaryKey(id);
}
}
-
修改菜品信息
@Controller
public class DishController {
@PostMapping("/update-dish")
public String updateDish(Dish dish) {
dishService.updateDish(dish);
return "redirect:/dishes";
}
}
@Service
public class DishService {
public void updateDish(Dish dish) {
dishMapper.updateByPrimaryKeySelective(dish);
}
}
4.3 订单管理模块:
-
下单
@Controller
public class OrderController {
@PostMapping("/add-order")
public String addOrder(Long dishId, HttpSession session) {
User user = (User) session.getAttribute("user");
orderService.addOrder(user, dishId);
return "redirect:/orders";
}
}
@Service
public class OrderService {
public void addOrder(User user, Long dishId) {
Dish dish = dishMapper.selectByPrimaryKey(dishId);
if (dish == null) {
throw new ServiceException("菜品不存在");
}
Order order = new Order();
order.setUserId(user.getId());
order.setDishId(dishId);
order.setPrice(dish.getPrice());
order.setStatus(OrderStatusEnum.UNPROCESSED.getValue());
order.setCreateTime(new Date());
orderMapper.insert(order);
}
}
-
查看订单
@Controller
public class OrderController {
@GetMapping("/orders")
public String listOrders(Model model, HttpSession session) {
User user = (User) session.getAttribute("user");
List<OrderVO> orderList = orderService.listOrdersByUserId(user.getId());
model.addAttribute("orderList", orderList);
return "order_list";
}
}
@Service
public class OrderService {
public List<OrderVO> listOrdersByUserId(Long userId) {
List<OrderVO> orderList = new ArrayList<>();
OrderExample example = new OrderExample();
example.createCriteria().andUserIdEqualTo(userId);
example.setOrderByClause("create_time desc");
List<Order> orders = orderMapper.selectByExample(example);
for (Order order : orders) {
OrderVO vo = new OrderVO();
vo.setOrderId(order.getId());
vo.setDishName(dishMapper.selectByPrimaryKey(order.getDishId()).getName());
vo.setPrice(order.getPrice());
vo.setStatus(order.getStatus());
vo.setCreateTime(order.getCreateTime());
orderList.add(vo);
}
return orderList;
}
}
-
处理订单
@Controller
public class OrderController {
@GetMapping("/process-order")
public String processOrder(Long id) {
orderService.processOrder(id);
return "redirect:/orders";
}
}
@Service
public class OrderService {
public void processOrder(Long id) {
Order order = orderMapper.selectByPrimaryKey(id);
if (order == null) {
throw new ServiceException("订单不存在");
}
if (order.getStatus() == OrderStatusEnum.PROCESSED.getValue()) {
throw new ServiceException("订单已处理");
}
order.setStatus(OrderStatusEnum.PROCESSED.getValue());
order.setProcessTime(new Date());
orderMapper.updateByPrimaryKeySelective(order);
}
}
4.4 积分管理模块:
-
积分规则设置
@Controller
public class PointRuleController {
@PostMapping("/add-rule")
public String addRule(PointRule rule) {
pointRuleService.addPointRule(rule);
return "redirect:/pointrules";
}
}
@Service
public class PointRuleService {
public void addPointRule(PointRule rule) {
pointRuleMapper.insert(rule);
}
}
-
积分获得记录
@Controller
public class PointLogController {
@GetMapping("/pointlogs")
public String listPointLogs(Model model, HttpSession session) {
User user = (User) session.getAttribute("user");
List<PointLogVO> pointLogList = pointLogService.listPointLogsByUserId(user.getId());
model.addAttribute("pointLogList", pointLogList);
return "point_log_list";
}
}
@Service
public class PointLogService {
public List<PointLogVO> listPointLogsByUserId(Long userId) {
List<PointLogVO> pointLogList = new ArrayList<>();
PointLogExample example = new PointLogExample();
example.createCriteria().andUserIdEqualTo(userId);
example.setOrderByClause("create_time desc");
List<PointLog> pointLogs = pointLogMapper.selectByExample(example);
for (PointLog pointLog : pointLogs) {
PointRule pointRule = pointRuleMapper.selectByPrimaryKey(pointLog.getRuleId());
PointLogVO vo = new PointLogVO();
vo.setPoint(pointLog.getPoint());
vo.setRuleName(pointRule.getOrderAmount() + "元 -> " + pointRule.getPoint() + "积分");
vo.setCreateTime(pointLog.getCreateTime());
pointLogList.add(vo);
}
return pointLogList;
}
}
最后,通过集成 Spring Boot,使用以上服务将用户界面和后端服务联系在一起。