基于SSM框架的在线食堂菜谱管理系统 - 源码深度解析
在传统食堂运营管理中,菜谱规划、成本控制和信息发布往往依赖纸质记录或零散的电子文档,导致信息更新滞后、查询效率低下、版本管理混乱。针对这些痛点,我们设计并实现了一套企业级智慧食堂管理平台,通过数字化手段重构食堂管理流程,显著提升了运营效率和服务质量。
系统架构与技术栈
该平台采用经典的SSM(Spring + SpringMVC + MyBatis)框架组合构建,整体架构层次分明:
- Spring框架:作为核心容器,通过依赖注入(DI)和面向切面编程(AOP)机制管理业务逻辑组件与数据访问对象之间的依赖关系,实现松耦合架构
- SpringMVC:负责Web请求的分发与响应,采用清晰的Controller-Service-Dao分层架构确保用户交互逻辑、核心业务处理与数据持久化操作的有效分离
- MyBatis:作为持久层框架,通过灵活的XML映射文件实现Java对象与数据库表记录的关联映射,提供动态SQL支持
技术栈配置详解:
<dependencies>
<!-- Spring核心依赖 - 提供IoC容器和基础支持 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<!-- Spring MVC - Web层框架支持 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<!-- MyBatis - 持久层ORM框架 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!-- 数据库连接池 - 高性能Druid连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.22</version>
</dependency>
</dependencies>
数据库设计亮点分析
权限管理系统设计
系统采用RBAC(基于角色的访问控制)模型设计权限管理,通过sys_role_right表实现角色与权限的多对多关联,这种设计模式在企业级应用中具有高度可扩展性:
CREATE TABLE `sys_role_right` (
`ID` varchar(50) NOT NULL COMMENT 'ID标识',
`RIGHT_ID` varchar(50) DEFAULT NULL COMMENT '权限ID',
`ROLE_ID` varchar(50) DEFAULT NULL COMMENT '角色ID',
PRIMARY KEY (`ID`),
KEY `FK_s1f73s3b49p1mr3f12winuw8v` (`RIGHT_ID`),
KEY `FK_h5tfegtn5va1dosmdufd1486d` (`ROLE_ID`),
CONSTRAINT `sys_role_right_ibfk_1` FOREIGN KEY (`ROLE_ID`) REFERENCES `sys_role` (`ID`),
CONSTRAINT `sys_role_right_ibfk_2` FOREIGN KEY (`RIGHT_ID`) REFERENCES `sys_right` (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='角色--权限表'
该表设计的技术亮点:
- 外键约束优化:通过外键约束确保数据完整性,避免脏数据产生,保证关联数据的一致性
- 复合索引设计:为
RIGHT_ID和ROLE_ID分别建立索引,显著提升角色权限关联查询性能 - 字符集统一:采用utf8字符集支持多语言环境,满足国际化需求
- 引擎选择:使用InnoDB存储引擎,支持事务处理和行级锁定
菜单管理核心表设计
menu_menu表作为系统的核心业务表,承载了菜单管理的主要数据,体现了完整的数据建模思路:
CREATE TABLE `menu_menu` (
`ID` varchar(120) NOT NULL COMMENT 'ID标识',
`NAME` varchar(255) NOT NULL COMMENT '名称',
`MENU_TIME` datetime NOT NULL COMMENT '时间',
`COOKER_ID` varchar(255) NOT NULL COMMENT '所属灶',
`NUM` double NOT NULL COMMENT '份数',
`SPEC` varchar(255) DEFAULT NULL COMMENT '规格说明',
`PRICE` double NOT NULL COMMENT '单价',
`CATEGORY` varchar(255) DEFAULT NULL COMMENT '类型:早餐、午餐、中餐',
`DESCRIPTION` varchar(255) DEFAULT NULL COMMENT '描述',
`AUDIT_STATUS` int(11) NOT NULL COMMENT '审核状态',
`CREATOR` varchar(120) DEFAULT NULL COMMENT '创建者',
`CREATETIME` datetime DEFAULT NULL COMMENT '创建时间',
`REMARK` varchar(255) DEFAULT NULL COMMENT '备注',
`STATUS` int(11) DEFAULT NULL COMMENT '状态;1=正常,-1=删除',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='菜单'
专业设计考量:
- 状态机设计:
AUDIT_STATUS字段采用枚举值设计,清晰定义审核流程状态(待审核、审核通过、审核拒绝) - 业务字段完整性:包含价格、份数、规格等完整业务属性,支持复杂的业务计算
- 软删除支持:通过
STATUS字段实现软删除,保留历史数据用于审计和分析 - 审计追踪:包含创建者、创建时间等审计字段,满足企业级系统的合规要求

核心功能实现深度解析
1. 统一身份认证与权限控制
系统采用基于Session的认证机制,通过基础控制器实现统一的登录状态管理,确保安全性和一致性:
package cn.huayunsoftware.web.common.controller;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import com.baomidou.framework.controller.SuperController;
import cn.huayunsoftware.web.sys.model.Account;
/**
* 基础控制器 - 提供统一的用户会话管理
*/
public class BaseController extends SuperController{
// Session中存储的用户信息键值
public static final String LOGIN_USER = "LOGIN_USER";
public static final String LOGIN_USER_RIGHT = "LOGIN_USER_RIGHT";
public static final String LOGIN_USER_RIGHT_CODE = "LOGIN_USER_RIGHT_CODE";
@Autowired
protected HttpServletRequest request;
@Autowired
protected HttpServletResponse response;
@Autowired
protected ServletContext application;
/**
* 获取当前登录用户信息
* @return 用户账户对象
*/
protected Account getLoginer(){
return (Account) request.getSession().getAttribute(LOGIN_USER);
}
}
权限验证拦截器实现关键逻辑:
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
// 排除登录和静态资源路径,避免权限验证干扰
if (requestURI.contains("/login") || requestURI.contains("/static/")) {
return true;
}
// 检查用户登录状态
Account account = (Account) request.getSession().getAttribute(BaseController.LOGIN_USER);
if (account == null) {
response.sendRedirect(request.getContextPath() + "/login");
return false;
}
// 权限码验证 - 基于RBAC模型的细粒度权限控制
Set<String> rightCodes = (Set<String>) request.getSession()
.getAttribute(BaseController.LOGIN_USER_RIGHT_CODE);
if (!hasPermission(rightCodes, requestURI)) {
response.sendError(HttpServletResponse.SC_FORBIDDEN, "权限不足");
return false;
}
return true;
}
/**
* 检查用户是否具有访问当前资源的权限
*/
private boolean hasPermission(Set<String> rightCodes, String requestURI) {
// 权限验证逻辑实现
return rightCodes != null && rightCodes.contains(extractPermissionCode(requestURI));
}
}
该权限控制系统通过拦截器模式实现了统一的访问控制,支持细粒度的权限管理,确保系统安全性。