现代小区管理正面临数字化转型的关键时期。传统基于PHP或JSP的单体架构管理系统普遍存在三个痛点:首先是前后端代码高度耦合,任何界面调整都需要重新部署整个系统;其次是扩展性差,新增功能模块时经常出现"牵一发而动全身"的情况;最后是维护成本高,技术栈陈旧导致招聘合适开发人员困难。
我们团队在调研了30+个中大型小区后,发现几个共性需求:
后端选择SpringBoot的三大理由:
前端选择Vue.js的关键考量:
持久层方案对比:
| 方案 | 开发效率 | 性能 | 学习成本 | 最终选择 |
|---|---|---|---|---|
| JPA | 高 | 中 | 低 | ✗ |
| MyBatis | 中 | 高 | 中 | ✓ |
| MyBatis-Plus | 高 | 高 | 低 | ✓ |
我们最终采用MyBatis-Plus+MyBatis混合方案,基础CRUD用MyBatis-Plus自动生成,复杂查询手写SQL。

架构亮点设计:
数据库设计优化:
sql复制CREATE TABLE `resident` (
`resident_id` VARCHAR(20) PRIMARY KEY COMMENT '住户编号',
`resident_name` VARCHAR(50) NOT NULL COMMENT '姓名',
`phone_number` VARCHAR(15) UNIQUE COMMENT '手机号',
`id_card` VARCHAR(18) ENCRYPTED COMMENT '加密存储身份证',
`house_binding` JSON COMMENT '房屋绑定关系',
`check_in_date` DATETIME DEFAULT CURRENT_TIMESTAMP,
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`update_time` DATETIME ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
关键接口实现:
java复制@RestController
@RequestMapping("/api/resident")
public class ResidentController {
@GetMapping("/search")
public PageResult<ResidentVO> search(
@RequestParam(required = false) String keyword,
@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer size) {
LambdaQueryWrapper<Resident> wrapper = new LambdaQueryWrapper<>();
if (StringUtils.isNotBlank(keyword)) {
wrapper.like(Resident::getResidentName, keyword)
.or().like(Resident::getPhoneNumber, keyword);
}
Page<Resident> pageInfo = new Page<>(page, size);
residentService.page(pageInfo, wrapper);
return PageResult.success(pageInfo);
}
}
状态机设计:
mermaid复制stateDiagram
[*] --> UNPAID
UNPAID --> PAID: 用户支付
UNPAID --> CANCELLED: 管理员作废
PAID --> REFUNDED: 申请退款
REFUNDED --> PAID: 拒绝退款
防重复支付方案:
状态转换代码:
java复制public class RepairOrderService {
@Transactional
public void changeStatus(Long orderId, RepairStatus newStatus) {
RepairOrder order = getById(orderId);
if (!order.getStatus().canTransferTo(newStatus)) {
throw new BusinessException("状态转换不合法");
}
order.setStatus(newStatus);
if (newStatus == RepairStatus.COMPLETED) {
order.setFinishTime(LocalDateTime.now());
}
updateById(order);
// 发送状态变更通知
eventPublisher.publishEvent(new StatusChangeEvent(order));
}
}
SQL注入防护:
XSS防护:
java复制@Bean
public FilterRegistrationBean<XssFilter> xssFilter() {
FilterRegistrationBean<XssFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new XssFilter());
registration.addUrlPatterns("/*");
return registration;
}
数据加密:
缓存策略:
java复制@Cacheable(value = "resident", key = "#id", unless = "#result == null")
public Resident getById(String id) {
return residentMapper.selectById(id);
}
@CacheEvict(value = "resident", key = "#resident.residentId")
public void updateResident(Resident resident) {
residentMapper.updateById(resident);
}
数据库优化:
Docker Compose配置:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- ./mysql/data:/var/lib/mysql
redis:
image: redis:6
ports:
- "6379:6379"
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
- redis
Prometheus配置示例:
yaml复制scrape_configs:
- job_name: 'backend'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['backend:8080']
完整CORS配置:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowCredentials(true)
.maxAge(3600);
}
}
SpringBoot配置:
properties复制# 单个文件最大50MB
spring.servlet.multipart.max-file-size=50MB
# 总请求最大100MB
spring.servlet.multipart.max-request-size=100MB
ElementUI表格性能优化:
SpringBoot启动加速技巧:
bash复制# 开发时关闭JMX
java -jar -Dspring.jmx.enabled=false app.jar
MyBatis日志优化:
properties复制# 只打印SQL不打印结果
logging.level.org.mybatis=DEBUG
logging.level.org.apache.ibatis=WARN
这个项目从技术选型到最终上线历时3个月,期间最大的收获是深刻理解了前后端分离架构下如何保证开发效率的同时确保系统稳定性。特别是在权限控制方面,我们最终采用了RBAC+ABAC混合模型,既满足了物业公司的灵活配置需求,又保证了权限验证的性能。