用Java开发网上订餐系统

本文将介绍一个使用 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,使用以上服务将用户界面和后端服务联系在一起。

猜你喜欢

转载自blog.csdn.net/2301_76720304/article/details/130491448