1. 项目概述
作为一名有10年开发经验的Java全栈工程师,今天我想分享一个近期完成的课程设计/毕业设计项目——基于Spring Boot的私厨服务平台。这个项目完美融合了当下流行的技术栈,包括Spring Boot、Vue.js和MySQL,实现了一个功能完善的私人美食定制系统。
私厨服务平台的核心价值在于连接美食爱好者和专业厨师,为用户提供个性化的美食定制服务。系统采用B/S架构,前后端分离设计,包含了用户管理、菜品定制、订单处理、支付对接等完整功能模块。我在项目中采用了MVC设计模式,通过Spring Boot简化了后端开发,Vue.js构建了响应式前端界面,MyBatis Plus优化了数据库操作。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 技术选型解析
在项目启动阶段,我经过多方考量选择了以下技术栈:
后端框架:Spring Boot 2.7.x
- 选择理由:Spring Boot的自动配置和起步依赖大大减少了配置工作,内嵌Tomcat简化了部署流程,丰富的starter模块可以快速集成各种功能
- 实际应用:项目中使用了spring-boot-starter-web、spring-boot-starter-security、spring-boot-starter-data-redis等模块
前端框架:Vue 3 + Element Plus
- 选择理由:Vue的响应式特性和组件化开发非常适合构建复杂的单页应用,Element Plus提供了丰富的UI组件
- 优化点:使用了Vue Router实现前端路由,Pinia进行状态管理,axios处理HTTP请求
数据库:MySQL 8.0
- 选择理由:作为成熟的关系型数据库,MySQL在事务处理和数据一致性方面表现优异
- 设计特点:采用InnoDB存储引擎,支持事务和行级锁,使用utf8mb4字符集支持完整Unicode
ORM框架:MyBatis Plus 3.5.x
- 选择理由:在MyBatis基础上增强了CRUD操作,提供了强大的条件构造器和分页插件
- 实际应用:通过@TableField注解实现Java对象与数据库表的映射,使用LambdaQueryWrapper构建类型安全的查询
2.2 系统架构详解
系统采用经典的三层架构设计:
表现层:
- 前端:Vue 3 + Vite构建的SPA应用
- API接口:RESTful风格,使用Swagger生成接口文档
- 安全控制:JWT认证,Spring Security实现权限控制
业务逻辑层:
- 服务划分:按功能模块划分为用户服务、菜品服务、订单服务等
- 事务管理:使用@Transactional注解声明式事务
- 异常处理:全局异常处理器统一处理业务异常
数据访问层:
- 主从分离:配置了主从数据库,读写分离提升性能
- 缓存策略:Redis缓存热点数据,减少数据库压力
- 分库分表:用户表和订单表做了水平分表设计
架构设计心得:在实际开发中,我发现清晰的层次划分能显著提高代码可维护性。特别是将业务逻辑集中到Service层,避免了Controller过于臃肿的问题。同时,合理的模块划分也便于团队协作开发。
3. 核心功能实现
3.1 用户认证与授权
用户系统是平台的基础,我设计了完整的注册登录流程:
java复制// 用户注册逻辑核心代码
@PostMapping("/register")
public Result register(@Valid @RequestBody UserRegisterDTO dto) {
if(userService.existsByUsername(dto.getUsername())) {
throw new BusinessException("用户名已存在");
}
User user = new User();
BeanUtils.copyProperties(dto, user);
user.setPassword(passwordEncoder.encode(dto.getPassword()));
user.setRoles(Collections.singletonList(RoleEnum.USER));
userService.save(user);
return Result.success();
}
// 登录认证核心代码
@PostMapping("/login")
public Result login(@Valid @RequestBody UserLoginDTO dto) {
Authentication authentication = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(dto.getUsername(), dto.getPassword()));
SecurityContextHolder.getContext().setAuthentication(authentication);
String token = jwtTokenProvider.generateToken(authentication);
return Result.success(new JwtAuthResponse(token));
}
安全设计要点:
- 密码使用BCrypt加密存储,避免明文密码泄露风险
- 采用JWT无状态认证,减轻服务器压力
- 接口权限通过注解控制,如@PreAuthorize("hasRole('CHEF')")
- 关键操作记录日志,便于审计追踪
3.2 菜品定制功能实现
菜品定制是平台的核心功能,我设计了多层次的菜品数据模型:
java复制// 菜品实体类设计
@Data
@TableName("dishes")
public class Dish {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private String description;
private BigDecimal price;
private Integer cookTime; // 分钟
@TableField(typeHandler = JacksonTypeHandler.class)
private List<String> images; // 菜品图片
@TableField(typeHandler = JacksonTypeHandler.class)
private List<Ingredient> ingredients; // 食材列表
private Long chefId; // 关联厨师
private Integer status; // 上架状态
}
// 自定义类型处理器示例
public class JacksonTypeHandler extends BaseTypeHandler<Object> {
private final ObjectMapper objectMapper = new ObjectMapper();
@Override
public void setNonNullParameter(PreparedStatement ps, int i,
Object parameter, JdbcType jdbcType) {
// 对象转JSON字符串存储
}
@Override
public Object getNullableResult(ResultSet rs, String columnName) {
// JSON字符串转对象
}
}
前端交互设计要点:
- 使用Element Plus的上传组件实现多图上传
- 食材选择采用级联选择器,支持动态添加
- 价格计算实时预览,提升用户体验
- 响应式布局适配不同设备
4. 数据库设计与优化
4.1 数据库表结构设计
系统主要包含以下核心表:
用户表(users):
sql复制CREATE TABLE `users` (
`id` bigint NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT '用户名',
`password` varchar(100) NOT NULL COMMENT '密码',
`nickname` varchar(50) DEFAULT NULL COMMENT '昵称',
`avatar` varchar(255) DEFAULT NULL COMMENT '头像',
`phone` varchar(20) DEFAULT NULL COMMENT '手机号',
`email` varchar(100) DEFAULT NULL COMMENT '邮箱',
`type` tinyint DEFAULT '0' COMMENT '用户类型(0-普通用户 1-厨师)',
`status` tinyint DEFAULT '1' COMMENT '状态(0-禁用 1-正常)',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
菜品表(dishes):
sql复制CREATE TABLE `dishes` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL COMMENT '菜品名称',
`description` text COMMENT '菜品描述',
`price` decimal(10,2) NOT NULL COMMENT '价格',
`cook_time` int DEFAULT NULL COMMENT '烹饪时间(分钟)',
`images` json DEFAULT NULL COMMENT '图片JSON数组',
`ingredients` json DEFAULT NULL COMMENT '食材JSON数组',
`chef_id` bigint NOT NULL COMMENT '厨师ID',
`status` tinyint DEFAULT '1' COMMENT '状态(0-下架 1-上架)',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_chef_id` (`chef_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4.2 数据库性能优化
在实际运行中,我针对性能瓶颈做了以下优化:
-
索引优化:
- 为高频查询字段添加合适索引
- 使用复合索引减少回表操作
- 定期使用EXPLAIN分析慢查询
-
SQL优化:
- 避免SELECT *,只查询必要字段
- 使用JOIN替代子查询
- 批量操作使用INSERT ... ON DUPLICATE KEY UPDATE
-
缓存策略:
- 使用Redis缓存热点数据
- 菜品信息采用多级缓存策略
- 合理设置缓存过期时间
-
分库分表:
- 用户数据按ID范围分表
- 订单数据按时间分表
- 使用ShardingSphere实现透明访问
数据库优化心得:在项目初期就要考虑数据增长规模,合理设计表结构。我遇到过因为早期设计不合理导致后期需要大量重构的情况,特别是关联关系和索引设计要慎重。
5. 系统部署与运维
5.1 环境配置建议
生产环境推荐配置:
服务器配置:
- CPU: 4核以上
- 内存: 8GB以上
- 系统: CentOS 7+/Ubuntu 20.04+
- JDK: OpenJDK 11+
中间件:
- Nginx: 负载均衡和静态资源服务
- Redis: 6.x版本,配置持久化
- MySQL: 8.0+,配置主从复制
5.2 部署流程
- 后端部署:
bash复制# 打包Spring Boot应用
mvn clean package -DskipTests
# 启动应用
nohup java -jar private-chef-service.jar \
--spring.profiles.active=prod \
> service.log 2>&1 &
- 前端部署:
bash复制# 构建生产环境代码
npm run build
# 配置Nginx
server {
listen 80;
server_name yourdomain.com;
location / {
root /path/to/dist;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://backend-service;
proxy_set_header Host $host;
}
}
- 数据库初始化:
bash复制# 导入数据库结构
mysql -u root -p < schema.sql
# 初始化基础数据
mysql -u root -p < data.sql
5.3 监控与日志
完善的监控体系对系统稳定运行至关重要:
-
应用监控:
- Spring Boot Actuator暴露健康指标
- Prometheus收集指标数据
- Grafana展示监控仪表盘
-
日志管理:
- 使用Logback记录结构化日志
- ELK(Elasticsearch+Logstash+Kibana)集中管理日志
- 关键操作记录审计日志
-
报警机制:
- 异常日志触发邮件报警
- 服务不可用触发短信通知
- 定时任务监控关键指标
6. 项目开发经验总结
在开发这个私厨服务平台的过程中,我积累了一些宝贵的经验:
-
接口设计原则:
- 遵循RESTful规范
- 版本控制从开始就做好(如/v1/api/)
- 统一的响应格式和错误码
- 接口文档随代码更新(Swagger)
-
代码质量保障:
- 使用Checkstyle统一代码风格
- SonarQube静态代码分析
- 单元测试覆盖率不低于70%
- 集成测试覆盖核心业务流程
-
团队协作技巧:
- Git分支策略(Git Flow)
- 清晰的Commit Message规范
- Code Review机制
- 持续集成(CI/CD)流水线
-
性能优化经验:
- 前端启用Gzip压缩
- 图片使用WebP格式
- 接口响应时间监控
- 数据库慢查询分析
这个项目从技术选型到最终部署上线,完整走完了软件开发的全生命周期。作为课程设计或毕业设计,它不仅涵盖了主流技术栈的应用,还涉及了系统设计、性能优化、安全防护等工程实践要点。对于计算机专业的学生来说,通过这样一个完整的项目实践,能够全面提升开发能力和工程思维。
