作为一个在软件开发领域摸爬滚打多年的老码农,我见过太多学生被毕业设计折磨得焦头烂额。今天要拆解的这个"SSM家庭食谱管理系统",正是计算机专业毕业设计中的经典选题。不同于企业级应用,家庭食谱管理看似简单,实则包含了完整的CRUD操作、用户权限管理和数据可视化等核心功能模块,是检验学生SSM框架掌握程度的绝佳试金石。
这个系统的核心价值在于:
选择SSM框架组合而非Spring Boot主要基于以下考虑:
技术栈版本建议:
典型的MVC分层架构:
code复制├── 表现层(View)
│ ├── JSP 2.3 + JSTL 1.2
│ └── Bootstrap 4.6 + jQuery 3.5
├── 控制层(Controller)
│ └── Spring MVC 5.2
├── 业务层(Service)
│ └── Spring IOC/AOP
└── 持久层(Mapper)
└── MyBatis 3.5 + PageHelper
提示:分层时要注意避免常见的"贫血模型"问题,业务逻辑应该集中在Service层而非Controller
采用RBAC权限模型设计:
java复制// 用户实体类关键字段
public class User {
private Integer userId;
private String username;
private String password; // 需MD5加密
private String salt;
private Integer roleId; // 1-管理员 2-普通用户
// getters/setters...
}
安全注意事项:
核心实体关系设计:
sql复制CREATE TABLE `recipe` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`category_id` int NOT NULL COMMENT '分类ID',
`user_id` int NOT NULL COMMENT '创建人',
`cook_time` int DEFAULT NULL COMMENT '烹饪时长(分钟)',
`difficulty` tinyint DEFAULT '1' COMMENT '难度1-5',
`ingredients` json DEFAULT NULL COMMENT '食材JSON',
`steps` text COMMENT '步骤说明',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
注意:MySQL 8.0的JSON类型非常适合存储不定长的食材列表,避免了多表关联的复杂度
基于用户行为的简单推荐算法实现:
java复制public List<Recipe> recommendRecipes(Integer userId) {
// 1. 获取用户历史浏览记录
List<ViewHistory> histories = viewHistoryMapper.selectByUser(userId);
// 2. 提取高频分类
Map<Integer, Integer> categoryCount = histories.stream()
.collect(Collectors.groupingBy(
ViewHistory::getCategoryId,
Collectors.summingInt(e -> 1)));
// 3. 返回同分类下热门菜谱
Integer topCategory = Collections.max(categoryCount.entrySet(),
Map.Entry.comparingByValue()).getKey();
return recipeMapper.selectPopularByCategory(topCategory, 5);
}
MyBatis-Generator配置优化:
xml复制<!-- 生成Example类时跳过无意义的条件 -->
<property name="enableExampleClassGeneration" value="false"/>
<!-- 使用Lombok注解简化代码 -->
<property name="rootClass" value="com.xxx.BaseEntity"/>
推荐插件组合:
java复制@Select("SELECT r.*, u.nickname FROM recipe r LEFT JOIN user u ON r.user_id = u.id WHERE r.id = #{id}")
RecipeDetailVO selectDetailById(Integer id);
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 中文乱码 | 未统一字符编码 | 1. 确保MySQL使用utf8mb4 2. 在JDBC连接串添加characterEncoding=utf8 |
| 事务失效 | 异常被捕获未抛出 | 检查@Transactional方法内是否catch了Exception未rethrow |
| 分页失效 | PageHelper未紧接查询语句 | 确保PageHelper.startPage()与mapper调用之间无其他逻辑 |
properties复制logging.level.com.xxx.mapper=DEBUG
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
对于想进一步提升项目的同学,可以考虑:
这个项目我指导过不下20个学生完成,最大的体会是:不要追求功能的多而全,而要在核心模块上做到精而美。一个运行流畅、代码规范的基础系统,远胜过功能堆砌但bug频出的"大杂烩"。特别是在事务处理、异常处理这些基础但重要的环节多下功夫,往往能在答辩时给老师留下专业印象