在高校后勤管理数字化进程中,传统食堂就餐模式面临诸多挑战:高峰期排队拥挤、点餐效率低下、商户管理分散。针对这些痛点,我们设计并实现了一个基于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='订单消息表'
设计亮点:
- 状态字段分离:将
fkstatus(付款状态)、shstatus(发货状态)、isjs(结算状态)分离设计,支持灵活的订单状态管理 - 索引优化:为
memberid字段建立外键索引,提升用户订单查询性能 - 物流信息完整:包含
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='商品表'
创新设计:
- 价格策略字段:
price(现价)和tprice(原价)支持促销活动展示 - 多级分类支持:通过
fid(父级ID)和cid(分类ID)实现商品的多维度分类 - 营销标识:
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 + "]";
}
}
这种设计模式的优势在于:
- 职责分离:实体类只负责数据存储,业务逻辑集中在Service层
- 序列化友好:便于JSON序列化和网络传输
- 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层专注数据持久化,形成了良好的分层架构。
系统的多角色支持(学生、商户、管理员)体现了复杂业务场景的处理能力。订单状态机设计支持灵活的业务流程调整,商品分类体系为后续的功能扩展奠定了基础。通过标准化的接口设计和数据格式,系统具备了良好的集成能力和扩展性。
平台在实际部署中展现了良好的稳定性和性能表现,为校园餐饮服务的数字化转型提供了可靠的技术支撑。随着后续缓存优化、微服务改造等技术的引入,系统将能够支撑更大规模的用户并发和更复杂的业务场景。