校园宿舍报修管理系统是典型的"最后一公里"服务数字化改造案例。传统报修流程中,学生需要填写纸质表单或拨打固定电话,维修部门手工记录后再派单,整个过程存在信息滞后、进度不透明、责任追溯困难等问题。我们设计的这套系统通过微服务架构实现了全流程数字化改造,实测将平均报修响应时间从原来的48小时缩短至4小时以内。
系统采用前后端分离设计,后端基于SpringBoot+SpringCloud构建分布式服务,前端分为两个入口:Vue.js开发的管理后台供维修部门使用,微信小程序端面向学生群体。这种架构选择主要基于三点考量:
关键设计原则:所有接口必须支持2000QPS以上的并发请求,确保开学季等高峰时段的系统稳定性。这是我们选择Redis+MySQL组合的重要原因。
系统按照业务域划分为六个微服务:
每个服务都包含独立的:
java复制// 服务注册示例
@SpringBootApplication
@EnableDiscoveryClient
public class RepairServiceApplication {
public static void main(String[] args) {
SpringApplication.run(RepairServiceApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
报修创建涉及多个服务的数据变更,我们采用Seata的AT模式保证一致性:
踩坑记录:初期使用本地消息表方案,发现当消息服务不可用时会导致工单状态不一致。改用Seata后问题解决,但需要注意其性能开销比本地方案高约15%。
学生端主要功能模块:
关键技术点:
javascript复制// 小程序端报修提交示例
wx.chooseImage({
count: 3,
sizeType: ['compressed'],
success(res) {
const tempFilePaths = res.tempFilePaths
uploadFiles(tempFilePaths).then(urls => {
wx.request({
url: 'https://api.example.com/repair',
method: 'POST',
data: {
description: '宿舍灯管损坏',
images: urls,
location: '3号楼502'
},
success() {
wx.showToast({ title: '提交成功' })
}
})
})
}
})
管理员核心功能:
智能分配算法实现:
java复制// 工单分配算法片段
public List<Worker> matchWorkers(RepairOrder order) {
// 1. 查询5公里内的维修工
GeoRadiusCommandArgs args = GeoRadiusCommandArgs.newGeoRadiusArgs()
.includeCoordinates()
.includeDistance()
.sortAscending()
.limit(10);
List<GeoRadiusResponse> workers = redisTemplate.opsForGeo()
.radius("worker:geo", order.getLng(), order.getLat(),
new Distance(5, Metrics.KILOMETERS), args);
// 2. 过滤具备相关技能的维修工
return workers.stream()
.filter(r -> {
String workerId = r.getContent().getName();
return redisTemplate.opsForSet()
.isMember("worker:tags:" + workerId, order.getRepairType());
})
.sorted(Comparator.comparingDouble(r -> r.getDistance().getValue()))
.limit(3)
.map(r -> workerService.getById(r.getContent().getName()))
.collect(Collectors.toList());
}
三级缓存体系:
关键配置示例:
properties复制# Caffeine配置
spring.cache.caffeine.spec=maximumSize=1000,expireAfterWrite=5m
# Redis缓存配置
spring.redis.timeout=3000
spring.redis.lettuce.pool.max-active=20
MySQL关键优化措施:
sql复制-- 分表示例
CREATE TABLE repair_order_3building (
id BIGINT PRIMARY KEY,
student_id VARCHAR(20),
description TEXT,
status TINYINT,
INDEX idx_student_status (student_id, status)
) ENGINE=InnoDB PARTITION BY RANGE (MONTH(create_time)) (
PARTITION p1 VALUES LESS THAN (2),
PARTITION p2 VALUES LESS THAN (3),
...
);
安全体系组成:
JWT增强措施:
java复制// 安全配置核心代码
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/public/**").permitAll()
.antMatchers("/api/student/**").hasRole("STUDENT")
.antMatchers("/api/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()))
.addFilter(new JwtAuthorizationFilter(authenticationManager()));
}
}
关键保护措施:
使用Docker Compose编排服务:
yaml复制version: '3.8'
services:
user-service:
image: registry.example.com/user-service:1.0
ports:
- "8081:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
depends_on:
- redis
- mysql
repair-service:
image: registry.example.com/repair-service:1.0
# 类似配置...
redis:
image: redis:6.2-alpine
ports:
- "6379:6379"
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
监控组件:
关键监控指标:
常见原因及解决方案:
排查步骤:
bash复制grep 'GlobalTransaction' /logs/repair-service.log
properties复制seata.enabled=true
seata.application-id=repair-service
硬件对接计划:
技术对接要点:
这套系统在实际部署中,我们特别强调渐进式演进策略。初期先保证核心报修流程的稳定性,后续再逐步添加智能调度、物联网对接等高级功能。对于高校信息化部门,建议先选择1-2栋宿舍试点运行,待流程跑顺后再全面推广。