这套基于SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0的房屋租赁系统,是我在2022年为一个本地房产中介公司开发的核心业务系统。系统上线后日均处理200+租赁交易,支撑了公司80%的线上业务。相比传统PHP系统,采用前后端分离架构后,合同处理效率提升了3倍,数据一致性达到99.99%。
系统最突出的特点是采用Vue3的组合式API实现动态表单,配合SpringBoot的校验机制,可以灵活适配不同城市的租赁合同模板。比如北京需要备案编号而上海需要房源核验码,这些差异字段都能通过后台配置实时同步到前端。
选择SpringBoot2.7.x而非3.0版本,主要考虑公司现有JDK8环境。实测在4核8G服务器上,该版本处理并发租赁申请时,平均响应时间能控制在300ms以内。关键配置如下:
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/rental?useSSL=false&serverTimezone=Asia/Shanghai
hikari:
maximum-pool-size: 20 # 根据压测结果调整
connection-timeout: 30000
MyBatis-Plus 3.5.2的Lambda查询方式大幅简化了房源条件查询代码。例如多条件分页查询原来需要写30行XML,现在只需:
java复制Page<House> page = new Page<>(current, size);
lambdaQuery()
.like(StringUtils.isNotBlank(keyword), House::getTitle, keyword)
.eq(houseType != null, House::getType, houseType)
.between(priceRange != null, House::getPrice, priceRange[0], priceRange[1])
.page(page);
Vue3 + Vite的组合使首屏加载时间从Vue2时代的2.1s降至1.3s。动态表单的核心实现是利用<component :is>加载配置化的表单组件:
vue复制<template v-for="item in formConfig">
<component
:is="item.componentType"
v-model="formData[item.field]"
:rules="item.rules"
/>
</template>
采用Pinia替代Vuex管理房源状态,配合IndexedDB实现离线缓存,在网络不稳定时仍能提交看房申请。
房源图片处理采用Thumbnailator进行压缩和裁剪,确保单张图片不超过300KB。数据库设计时特别注意了空间数据存储:
sql复制CREATE TABLE `house` (
`id` bigint NOT NULL AUTO_INCREMENT,
`location` point NOT NULL SRID 4326, -- 存储经纬度
SPATIAL INDEX(`location`),
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
踩坑记录:最初使用varchar存储经纬度,导致半径查询性能极差。改为Point类型后,5公里内房源查询从3s降到200ms。
集成e签宝API实现法律效力的电子合同,关键流程:
特别注意处理了签约超时问题:当30分钟内未完成签署,系统会自动发送短信提醒并释放房源锁定。
采用Redis + Token方案解决房源重复预订问题:
java复制// 生成令牌
String token = UUID.randomUUID().toString();
redisTemplate.opsForValue().set("house:reserve:"+userId, token, 5, TimeUnit.MINUTES);
// 提交时验证
String storedToken = redisTemplate.opsForValue().get("house:reserve:"+userId);
if(!token.equals(storedToken)){
throw new BusinessException("请勿重复提交");
}
通过Explain分析发现房源列表查询的瓶颈在于tags字段的LIKE操作。解决方案是新建house_tag关联表,查询效率提升8倍:
sql复制-- 优化前
SELECT * FROM house WHERE tags LIKE '%朝阳%'
-- 优化后
SELECT h.* FROM house h
JOIN house_tag ht ON h.id = ht.house_id
JOIN tag t ON ht.tag_id = t.id
WHERE t.name = '朝阳'
使用Docker Compose编排服务,关键配置包括:
yaml复制services:
app:
image: openjdk:8-jdk-alpine
environment:
- SPRING_PROFILES_ACTIVE=prod
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
interval: 30s
通过SpringBoot Actuator暴露的/metrics端点,配合Prometheus和Grafana监控以下关键指标:
表单设计器存储方案:尝试过JSONB、XML最终选择纯JSON存储,配合MySQL的JSON_EXTRACT函数查询,在灵活性和性能间取得平衡
地理位置服务选型:对比了MySQL GIS、MongoDB和Redis GEO,最终选择MySQL方案,主要考虑事务一致性和团队技术栈统一
缓存策略调整:从最初的全局缓存改为分级缓存 - 基础信息缓存1小时,价格等关键字段缓存5分钟,通过@CacheEvict的condition属性精细控制
这套系统经过三次大版本迭代后,最深刻的体会是:在租赁业务中,状态管理比功能实现更重要。比如房源从"待租"到"已预订"再到"已签约"的状态流转,需要设计严谨的状态机,任何遗漏都会导致严重的业务纠纷。