作为一名经历过多次毕业设计指导的开发者,我认为美发店管理系统是一个非常适合计算机专业学生练手的项目。它既包含了典型的CRUD操作,又涉及多角色权限管理,还能锻炼业务建模能力。这个基于Spring Boot的发艺美发店管理系统,采用了我最推荐的"自下而上"开发方式——先构建基础模块,再逐步组合成完整系统。
系统最核心的价值在于解决了传统美发店管理的三大痛点:
Spring Boot的自动配置特性让初学者能快速搭建项目骨架。我实测过,用Spring Initializr生成项目到跑通第一个接口,新手也只需要15分钟。对于毕业设计这种有时间限制的项目,这个优势非常关键。
技术栈组合:
提示:虽然Vue/React更时髦,但课程设计建议先用模板引擎。我曾见过学生花80%时间折腾前端配置,最后后端功能都没完成。
根据系统结构图,我设计了核心表的ER关系:
sql复制CREATE TABLE `user` (
`id` int NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(100) NOT NULL,
`role` enum('ADMIN','STORE_MANAGER','HAIRDRESSER','CUSTOMER','LOGISTICS') NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 美发项目表
CREATE TABLE `hair_service` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`type_id` int NOT NULL,
`price` decimal(10,2) NOT NULL,
`duration` int NOT NULL COMMENT '分钟',
PRIMARY KEY (`id`)
);
特别注意:
系统包含5种角色,我采用Spring Security实现权限管理。这是很多学生容易踩坑的地方,分享我的实现方案:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/manager/**").hasRole("STORE_MANAGER")
.antMatchers("/hairdresser/**").hasRole("HAIRDRESSER")
.anyRequest().authenticated()
.and()
.formLogin().loginPage("/login").permitAll();
}
}
常见问题:
美发预约是核心业务,我设计的状态机能有效防止逻辑混乱:
code复制[待确认] → [已预约] → [服务中] → [已完成]
↓
[已取消]
关键代码片段:
java复制public class AppointmentService {
@Transactional
public void changeStatus(Long id, AppointmentStatus newStatus) {
Appointment appointment = repository.findById(id).orElseThrow();
// 状态校验逻辑
if (!appointment.getStatus().canTransferTo(newStatus)) {
throw new IllegalStateException("非法状态变更");
}
// 关联操作
if (newStatus == AppointmentStatus.COMPLETED) {
billingService.createBill(appointment);
}
appointment.setStatus(newStatus);
repository.save(appointment);
}
}
当多个后勤人员同时操作库存时,会出现超卖问题。我的解决方案:
sql复制UPDATE inventory SET count = count - 1, version = version + 1
WHERE id = ? AND version = ?
理发师排班是个复杂问题,我简化后的检测算法:
java复制public boolean isTimeSlotAvailable(LocalDateTime start, LocalDateTime end, Long hairdresserId) {
return appointmentRepository.countOverlappingAppointments(
start, end, hairdresserId) == 0;
}
如果想拿高分,可以考虑实现:
我在指导学生时发现,把40%时间用在1-2个亮点功能上,比平均分配时间效果更好。比如用Redis缓存热门项目数据,响应时间能从200ms降到50ms,这就能成为答辩时的技术亮点。
这个项目我带着学生做过3次迭代,最大的教训是:数据库设计阶段多花1小时,后期能节省10小时调试时间。特别是关联关系和状态流转,一定要在白板上反复验证。