基于SSM框架的校园食堂多商户点餐平台 - 源码深度解析

JavaJavaScriptHTMLCSSSSM框架MavenMySQL
2026-02-0812 浏览

文章摘要

本项目是一款基于SSM(Spring+SpringMVC+MyBatis)框架构建的校园食堂多商户点餐平台,旨在解决传统校园食堂就餐高峰期排队拥挤、人工点餐效率低下以及商户管理分散等痛点。系统通过整合多个食堂窗口或入驻商户资源,为学生和教职工提供在线浏览菜单、自助下单和支付的数字化服务,显著提升了就...

在高校后勤管理数字化进程中,传统食堂就餐模式面临诸多挑战:高峰期排队拥挤、点餐效率低下、商户管理分散。针对这些痛点,我们设计并实现了一个基于SSM(Spring+SpringMVC+MyBatis)框架的校园智慧餐饮服务平台,通过技术手段重构了校园餐饮服务流程。

系统架构与技术栈设计

该平台采用经典的三层架构模式,展现层使用JSP动态页面技术,结合HTML、CSS和JavaScript构建用户界面;业务逻辑层基于Spring框架实现,负责核心业务处理;数据持久层采用MyBatis框架,实现对MySQL数据库的高效操作。

技术栈配置通过Maven进行依赖管理,关键配置如下:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.8.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.6</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.21</version>
    </dependency>
</dependencies>

Spring MVC的配置文件设置了组件扫描、视图解析器和静态资源处理:

<context:component-scan base-package="com.controller" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>

数据库设计亮点分析

订单消息表(ordermsg)设计

订单表的设计体现了电商级的数据完整性考虑:

CREATE TABLE `ordermsg` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `orderno` varchar(255) DEFAULT NULL COMMENT '订单号',
  `memberid` int(11) DEFAULT NULL COMMENT '会员ID',
  `total` varchar(255) DEFAULT NULL COMMENT '总金额',
  `fkstatus` varchar(255) DEFAULT NULL COMMENT '付款状态',
  `shstatus` varchar(255) DEFAULT NULL COMMENT '发货状态',
  `addrid` varchar(255) DEFAULT NULL COMMENT '地址ID',
  `saver` int(11) DEFAULT NULL COMMENT '保存人',
  `savetime` varchar(255) DEFAULT NULL COMMENT '保存时间',
  `company` varchar(255) DEFAULT NULL COMMENT '快递公司',
  `waybillno` varchar(255) DEFAULT NULL COMMENT '运单号',
  `isjs` varchar(255) DEFAULT NULL COMMENT '是否结算',
  `sdtime` varchar(255) DEFAULT NULL COMMENT '送达时间',
  PRIMARY KEY (`id`),
  KEY `FK_ordermsg_member` (`memberid`),
  CONSTRAINT `FK_ordermsg_member` FOREIGN KEY (`memberid`) REFERENCES `member` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=56 DEFAULT CHARSET=utf8 COMMENT='订单消息表'

设计亮点

  1. 状态字段分离:将fkstatus(付款状态)、shstatus(发货状态)、isjs(结算状态)分离设计,支持灵活的订单状态管理
  2. 索引优化:为memberid字段建立外键索引,提升用户订单查询性能
  3. 物流信息完整:包含company(快递公司)和waybillno(运单号),支持外卖配送场景

商品表(product)架构设计

商品表设计支持多级分类和灵活的营销策略:

CREATE TABLE `product` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `productname` varchar(255) DEFAULT NULL COMMENT '商品名称',
  `filename` varchar(255) DEFAULT NULL COMMENT '文件名',
  `price` double(255,2) DEFAULT NULL COMMENT '价格',
  `tprice` double DEFAULT NULL COMMENT '原价',
  `fid` int(11) DEFAULT NULL COMMENT '父级ID',
  `cid` int(11) DEFAULT NULL COMMENT '分类ID',
  `content` text DEFAULT NULL COMMENT '内容',
  `vote` int(11) DEFAULT NULL COMMENT '投票数',
  `delstatus` varchar(255) DEFAULT NULL COMMENT '删除状态',
  `issj` varchar(255) DEFAULT NULL COMMENT '是否上架',
  `istj` varchar(255) DEFAULT NULL COMMENT '是否推荐',
  `saver` int(11) DEFAULT NULL COMMENT '保存人',
  PRIMARY KEY (`id`),
  KEY `FK_product_category` (`cid`),
  CONSTRAINT `FK_product_category` FOREIGN KEY (`cid`) REFERENCES `category` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8 COMMENT='商品表'

创新设计

  1. 价格策略字段price(现价)和tprice(原价)支持促销活动展示
  2. 多级分类支持:通过fid(父级ID)和cid(分类ID)实现商品的多维度分类
  3. 营销标识issj(上架状态)和istj(推荐状态)实现商品的可控展示

菜品管理界面

核心功能实现解析

1. 菜品信息管理模块

菜品管理采用标准的MVC模式,实体类设计简洁高效:

@Entity
public class Product {
    private int id;
    private String productname;
    private String filename;
    private Double price;
    private Double tprice;
    private Integer fid;
    private Integer cid;
    private String content;
    private Integer vote;
    private String delstatus;
    private String issj;
    private String istj;
    private Integer saver;
    
    // Getter和Setter方法
    public int getId() { return id; }
    public void setId(int id) { this.id = id; }
    
    public String getProductname() { return productname; }
    public void setProductname(String productname) { 
        this.productname = productname; 
    }
    
    // 其他getter/setter方法...
    
    @Override
    public String toString() {
        return "Product [id=" + id + ", productname=" + productname 
             + ", price=" + price + ", issj=" + issj + "]";
    }
}

MyBatis的Mapper接口定义了数据操作:

@Mapper
public interface ProductMapper {
    
    @Select("SELECT * FROM product WHERE id = #{id}")
    Product findById(int id);
    
    @Insert("INSERT INTO product(productname, filename, price, tprice, " +
            "cid, content, issj, istj, saver) VALUES(#{productname}, " +
            "#{filename}, #{price}, #{tprice}, #{cid}, #{content}, " +
            "#{issj}, #{istj}, #{saver})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insert(Product product);
    
    @Update("UPDATE product SET productname=#{productname}, " +
            "price=#{price}, issj=#{issj} WHERE id=#{id}")
    int update(Product product);
    
    @Select("SELECT * FROM product WHERE issj='是' AND delstatus='0'")
    List<Product> findAvailableProducts();
}

2. 订单处理控制器

订单控制器处理复杂的业务流程:

@Controller
@RequestMapping("/order")
public class OrderController extends BaseController {
    
    @Autowired
    private OrderService orderService;
    
    @Autowired
    private ProductService productService;
    
    @RequestMapping("/create")
    public String createOrder(@RequestParam Map<String, Object> params, 
                             HttpSession session) {
        try {
            // 获取用户信息
            Member member = (Member) session.getAttribute("member");
            if (member == null) {
                return "redirect:/member/login";
            }
            
            // 验证商品库存
            List<CartItem> cartItems = getCartItems(params);
            for (CartItem item : cartItems) {
                Product product = productService.findById(item.getProductId());
                if (product.getStock() < item.getQuantity()) {
                    return "error/stock_insufficient";
                }
            }
            
            // 创建订单
            String orderNo = orderService.generateOrderNo();
            OrderMsg order = new OrderMsg();
            order.setOrderno(orderNo);
            order.setMemberid(member.getId());
            order.setTotal(calculateTotal(cartItems));
            order.setFkstatus("待付款");
            order.setShstatus("待发货");
            order.setSaver(member.getId());
            order.setSavetime(new Date().toString());
            
            orderService.createOrder(order, cartItems);
            
            return "redirect:/order/detail?orderNo=" + orderNo;
            
        } catch (Exception e) {
            logger.error("创建订单失败", e);
            return "error/order_failed";
        }
    }
    
    private List<CartItem> getCartItems(Map<String, Object> params) {
        // 解析购物车数据
        List<CartItem> items = new ArrayList<>();
        // 实现逻辑...
        return items;
    }
    
    private String calculateTotal(List<CartItem> items) {
        BigDecimal total = BigDecimal.ZERO;
        for (CartItem item : items) {
            total = total.add(item.getPrice().multiply(
                new BigDecimal(item.getQuantity())));
        }
        return total.toString();
    }
}

订单提交界面

3. 关于我们信息管理

系统配置信息通过专门的控制器管理:

@Controller
public class AboutController extends BaseController {
    @Resource
    AboutDAO aboutDAO;
    
    @RequestMapping("/admin/showAbout")
    public String showAbout(int id, HttpServletRequest request) {
        About about = aboutDAO.findById(id);
        request.setAttribute("about", about);
        return "admin/aboutedit";
    }
    
    @RequestMapping("/admin/aboutEdit")
    public String aboutEdit(About about, HttpServletRequest request) {
        aboutDAO.update(about);
        return "redirect:showAbout.do?id=1";
    }
}

对应的About实体类设计:

public class About {
    private int id;
    private String content;
    
    public int getId() { return id; }
    public void setId(int id) { this.id = id; }
    
    public String getContent() { return content; }
    public void setContent(String content) { 
        this.content = content; 
    }
    
    @Override
    public String toString() {
        return "About [content=" + content + ", id=" + id + "]";
    }
}

4. 地址管理功能

地址表支持用户的多个收货地址管理:

CREATE TABLE `address` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `memberid` int(11) DEFAULT NULL COMMENT '会员ID',
  `name` varchar(255) DEFAULT NULL COMMENT '收货人姓名',
  `tel` varchar(255) DEFAULT NULL COMMENT '联系电话',
  `addr` varchar(255) DEFAULT NULL COMMENT '详细地址',
  `delstatus` varchar(255) DEFAULT NULL COMMENT '删除状态',
  PRIMARY KEY (`id`),
  KEY `FK_address_member` (`memberid`),
  CONSTRAINT `FK_address_member` FOREIGN KEY (`memberid`) REFERENCES `member` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COMMENT='地址表'

地址管理的Service层实现:

@Service
public class AddressService {
    
    @Autowired
    private AddressMapper addressMapper;
    
    public List<Address> getUserAddresses(int memberId) {
        return addressMapper.findByMemberId(memberId);
    }
    
    public boolean addAddress(Address address) {
        // 验证地址信息完整性
        if (validateAddress(address)) {
            return addressMapper.insert(address) > 0;
        }
        return false;
    }
    
    public boolean setDefaultAddress(int addressId, int memberId) {
        // 先取消其他默认地址
        addressMapper.cancelDefaultAddresses(memberId);
        // 设置新的默认地址
        return addressMapper.setDefaultAddress(addressId) > 0;
    }
    
    private boolean validateAddress(Address address) {
        return address != null && 
               address.getName() != null && 
               address.getTel() != null && 
               address.getAddr() != null;
    }
}

送餐地址管理

实体模型设计策略

系统采用贫血模型设计,实体类主要承担数据载体功能:

// 新闻实体类示例
public class News {
    private int id;
    private String title;
    private String filename;
    private String content;
    private String savetime;
    
    // 标准的getter和setter方法
    public int getId() { return id; }
    public void setId(int id) { this.id = id; }
    
    public String getTitle() { return title; }
    public void setTitle(String title) { this.title = title; }
    
    // 其他getter/setter...
    
    @Override
    public String toString() {
        return "News [id=" + id + ", title=" + title + 
               ", savetime=" + savetime + "]";
    }
}

这种设计模式的优势在于:

  1. 职责分离:实体类只负责数据存储,业务逻辑集中在Service层
  2. 序列化友好:便于JSON序列化和网络传输
  3. ORM映射简单:与数据库表结构直接对应

功能展望与优化方向

1. 缓存层优化

引入Redis作为缓存中间件,提升系统性能:

@Service
public class ProductServiceWithCache {
    
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    @Autowired
    private ProductMapper productMapper;
    
    public Product findByIdWithCache(int id) {
        String cacheKey = "product:" + id;
        Product product = (Product) redisTemplate.opsForValue().get(cacheKey);
        
        if (product == null) {
            product = productMapper.findById(id);
            if (product != null) {
                redisTemplate.opsForValue().set(cacheKey, product, 
                    Duration.ofMinutes(30)); // 缓存30分钟
            }
        }
        return product;
    }
}

2. 消息队列集成

使用RabbitMQ处理高并发订单:

@Configuration
public class RabbitMQConfig {
    
    @Bean
    public Queue orderQueue() {
        return new Queue("order.queue", true);
    }
    
    @Bean
    public MessageConverter jsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }
}

@Component
public class OrderMessageProducer {
    
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    public void sendOrderMessage(OrderMsg order) {
        rabbitTemplate.convertAndSend("order.queue", order);
    }
}

3. 微服务架构改造

将单体应用拆分为微服务:

# docker-compose.yml 示例
version: '3'
services:
  user-service:
    image: campus-canteen/user-service:1.0
    ports:
      - "8081:8080"
    
  order-service:
    image: campus-canteen/order-service:1.0
    ports:
      - "8082:8080"
    depends_on:
      - user-service
      - product-service

4. 移动端适配优化

开发React Native移动应用:

// 移动端订单组件示例
import React, { useState } from 'react';
import { View, Text, FlatList } from 'react-native';

const OrderScreen = () => {
    const [orders, setOrders] = useState([]);
    
    const renderOrderItem = ({ item }) => (
        <View style={styles.orderItem}>
            <Text style={styles.orderNo}>{item.orderno}</Text>
            <Text style={styles.status}>{item.fkstatus}</Text>
        </View>
    );
    
    return (
        <FlatList
            data={orders}
            renderItem={renderOrderItem}
            keyExtractor={item => item.id.toString()}
        />
    );
};

5. 智能推荐系统

基于用户行为数据实现个性化推荐:

@Service
public class RecommendationService {
    
    public List<Product> recommendProducts(int userId) {
        // 基于协同过滤算法
        List<UserBehavior> behaviors = userBehaviorDAO.findByUserId(userId);
        Map<Integer, Double> itemScores = collaborativeFiltering(behaviors);
        
        return itemScores.entrySet().stream()
            .sorted(Map.Entry.<Integer, Double>comparingByValue().reversed())
            .limit(10)
            .map(entry -> productDAO.findById(entry.getKey()))
            .collect(Collectors.toList());
    }
}

销售统计分析

系统架构优势总结

该校园智慧餐饮服务平台通过SSM框架的稳健组合,实现了高内聚低耦合的系统架构。数据库设计考虑了扩展性和性能需求,核心功能模块划分清晰。控制器层处理业务逻辑,Service层实现复杂业务规则,DAO层专注数据持久化,形成了良好的分层架构。

系统的多角色支持(学生、商户、管理员)体现了复杂业务场景的处理能力。订单状态机设计支持灵活的业务流程调整,商品分类体系为后续的功能扩展奠定了基础。通过标准化的接口设计和数据格式,系统具备了良好的集成能力和扩展性。

平台在实际部署中展现了良好的稳定性和性能表现,为校园餐饮服务的数字化转型提供了可靠的技术支撑。随着后续缓存优化、微服务改造等技术的引入,系统将能够支撑更大规模的用户并发和更复杂的业务场景。

本文关键词
SSM框架校园食堂多商户点餐平台源码解析订单表设计

上下篇

上一篇
没有更多文章
下一篇
没有更多文章