1. 项目概述
这个基于Java+SpringBoot的家政预约平台是我去年指导的一个本科毕业设计项目,核心目标是打造一个连接家政服务人员与消费者的数字化平台。从实际开发经验来看,这类系统最关键的三个特性是:预约流程的可靠性、服务评价的真实性以及支付环节的安全性。
平台采用B/S架构,前端使用Vue.js+ElementUI,后端基于SpringBoot 2.7.3,数据库选用MySQL 8.0。特别在支付模块集成了支付宝沙箱环境,确保毕业答辩时能完整演示交易流程。整个开发周期约3个月,其中最难解决的是服务人员智能推荐算法的实现。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心模块设计
2.1 用户体系设计
采用RBAC权限模型,区分四种角色:
- 普通用户:可预约、评价、支付
- 家政人员:接单、服务确认
- 商家管理员:人员管理、服务管理
- 系统管理员:全权限控制
用户表设计特别注意了手机号加密存储(使用AES算法),密码采用BCryptPasswordEncoder加密。这里有个实际教训:初期直接用MD5加密,在答辩时被评委指出安全隐患,后来全部重构了加密方式。
2.2 服务预约流程
核心状态机设计:
java复制public enum OrderStatus {
PENDING_PAYMENT, // 待支付
PAID, // 已支付
WAITING_SERVICE, // 待服务
IN_SERVICE, // 服务中
COMPLETED, // 已完成
CANCELLED, // 已取消
REFUNDED // 已退款
}
关键点在于状态转换的校验,比如"已支付"状态不能直接变为"服务中",必须经过服务人员确认。我们使用了状态模式(State Pattern)来实现这个逻辑,避免大量的if-else判断。
2.3 智能推荐算法
结合用户历史订单和LBS信息,实现两种推荐策略:
- 基于内容的推荐:匹配用户偏好标签(如"保洁"、"月嫂")
- 协同过滤推荐:相似用户的选择
实际开发中发现Spring Data JPA的@Query注解处理复杂SQL比较吃力,后来改用MyBatis-Plus实现推荐查询。性能对比测试显示,同样的推荐逻辑,MyBatis-Plus版本响应时间平均减少40%。
3. 关键技术实现
3.1 SpringBoot多环境配置
使用profile区分开发/测试/生产环境:
properties复制# application-dev.properties
spring.datasource.url=jdbc:mysql://localhost:3306/homemaking_dev
# application-prod.properties
spring.datasource.url=jdbc:mysql://prod-db:3306/homemaking_prod
启动时通过--spring.profiles.active=dev指定环境。有个实用技巧:在IDE运行配置里预设好profile参数,避免每次手动输入。
3.2 支付模块集成
支付宝沙箱接入关键步骤:
- 配置AlipayClient bean
java复制@Bean
public AlipayClient alipayClient() {
return new DefaultAlipayClient(
"https://openapi.alipaydev.com/gateway.do",
APP_ID,
APP_PRIVATE_KEY,
"json",
"UTF-8",
ALIPAY_PUBLIC_KEY,
"RSA2");
}
- 实现支付回调验签
java复制boolean signVerified = AlipaySignature.rsaCheckV1(
params,
ALIPAY_PUBLIC_KEY,
"UTF-8",
"RSA2"); // 不要漏掉这个参数
特别注意:沙箱环境测试时要用官方提供的测试账号,我们曾因使用真实支付宝账号导致回调失败,浪费两天排查时间。
3.3 定时任务设计
使用Spring Scheduler处理超时未支付订单:
java复制@Scheduled(cron = "0 0/30 * * * ?")
public void cancelUnpaidOrders() {
orderService.cancelOrders(
OrderSpecification.unpaidAndOlderThan(30));
}
踩过的坑:本地测试时任务正常执行,部署到服务器后不触发。后来发现是服务器时区设置问题,加上@EnableScheduling时指定时区才解决:
java复制@SpringBootApplication
@EnableScheduling
public class Application {
@PostConstruct
void started() {
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
}
}
4. 性能优化实践
4.1 缓存策略
采用两级缓存:
- 本地缓存(Caffeine):高频访问的基础数据
java复制@Bean
public CacheManager cacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager();
cacheManager.setCaffeine(Caffeine.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
.maximumSize(1000));
return cacheManager;
}
- Redis缓存:分布式会话和热点数据
properties复制spring.cache.type=redis
spring.redis.host=127.0.0.1
4.2 数据库优化
针对服务查询的优化方案:
- 添加复合索引:
sql复制ALTER TABLE service
ADD INDEX idx_category_region (category_id, region_code);
- 大文本字段分表:
java复制@Entity
@Table(name = "service")
public class Service {
@OneToOne(mappedBy = "service")
private ServiceDetail detail;
}
@Entity
@Table(name = "service_detail")
public class ServiceDetail {
@Lob
private String description;
}
4.3 日志监控
集成Spring Boot Actuator+Prometheus:
xml复制<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
配置端点暴露:
properties复制management.endpoints.web.exposure.include=health,metrics,prometheus
management.metrics.export.prometheus.enabled=true
5. 安全防护措施
5.1 XSS防护
采用三层防御:
- 前端过滤:Vue的v-html指令自动转义
- 后端过滤:Jackson的@JsonSerialize
java复制@JsonSerialize(using = XssStringJsonSerializer.class)
private String content;
- 数据库过滤:存储前进行HTML实体编码
5.2 CSRF防护
Spring Security默认启用CSRF保护,对API请求需要特殊处理:
java复制@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf()
.ignoringAntMatchers("/api/alipay/callback");
}
5.3 接口限流
使用Guava RateLimiter控制登录接口访问:
java复制private final RateLimiter limiter = RateLimiter.create(10.0); // 每秒10次
@PostMapping("/login")
public ResponseEntity<?> login(@Valid @RequestBody LoginDTO dto) {
if (!limiter.tryAcquire()) {
throw new BusinessException("访问过于频繁");
}
// ...正常逻辑
}
6. 部署方案
6.1 Docker化部署
Dockerfile配置要点:
dockerfile复制FROM openjdk:11-jre
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
构建命令:
bash复制docker build -t homemaking-platform .
docker run -d -p 8080:8080 \
-e SPRING_PROFILES_ACTIVE=prod \
homemaking-platform
6.2 数据库配置
生产环境MySQL建议配置:
ini复制[mysqld]
innodb_buffer_pool_size=1G
innodb_log_file_size=256M
max_connections=200
6.3 前端部署
Nginx配置示例:
nginx复制server {
listen 80;
server_name homemaking.example.com;
location / {
root /var/www/html;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://localhost:8080;
}
}
7. 常见问题解决
7.1 跨域问题
开发环境解决方案:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.maxAge(3600);
}
}
生产环境建议通过Nginx反向代理解决。
7.2 文件上传限制
调整SpringBoot默认配置:
properties复制spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
7.3 时区问题
统一时区方案:
- 数据库连接字符串添加参数:
properties复制spring.datasource.url=jdbc:mysql://localhost:3306/homemaking?useSSL=false&serverTimezone=Asia/Shanghai
- 启动时设置默认时区(见3.3节)
8. 项目扩展建议
- 增加微信小程序端:使用uni-app跨平台方案
- 引入智能客服:集成阿里云智能对话服务
- 实现服务动态定价:基于供需关系的算法定价
- 增加保险服务:与第三方保险平台对接
- 开发管理端APP:使用Flutter跨平台技术
实际开发中,我们最初想用WebSocket实现实时通知,但考虑到毕业设计的时间限制,最终采用了轮询方案。如果时间充裕,建议使用Spring WebFlux实现真正的实时通信。
