校园设备管理一直是高校后勤工作的痛点。记得去年我参与某高校信息化建设时,后勤处长拿着厚厚一叠报修单抱怨:"每天要处理200多张纸质单子,维修响应至少要3天,师生投诉率居高不下。"这正是传统管理模式的典型困境——设备台账混乱、报修流程冗长、状态追踪困难。
通过实地调研,我们发现核心问题集中在三个维度:
采用SpringBoot+MyBatis Plus+Vue的前后端分离架构,主要基于以下考量:
java复制// 典型的多环境配置示例
@Configuration
@Profile("dev")
public class DevConfig {
@Bean
public StorageService storageService() {
return new LocalStorageService("/tmp/uploads");
}
}
@Configuration
@Profile("prod")
public class ProdConfig {
@Bean
public StorageService storageService() {
return new AliyunOSS("your-bucket");
}
}
采用状态机模式设计工单流转逻辑,关键状态包括:
mermaid复制stateDiagram
[*] --> 待接单
待接单 --> 维修中: 维修员接单
维修中 --> 待评价: 维修完成
待评价 --> 已完成: 用户评价
待接单 --> 已取消: 用户取消
对应实体类设计:
java复制@Entity
public class RepairOrder {
@Id
@GeneratedValue
private Long id;
@Enumerated(EnumType.STRING)
private OrderStatus status; // 使用枚举定义状态
@ManyToOne
private User creator;
@ManyToOne
private Worker worker;
@ElementCollection
private List<String> images; // 报修图片URL
// 状态变更方法
public void accept(Worker worker) {
if(this.status != OrderStatus.PENDING) {
throw new IllegalStateException("工单当前状态不可接单");
}
this.worker = worker;
this.status = OrderStatus.PROCESSING;
}
}
维修任务分配采用基于地理位置和技能标签的匹配策略:
java复制public List<Worker> matchWorkers(RepairOrder order) {
return workerRepository.findAll()
.stream()
.filter(w -> w.getSkills().contains(order.getDeviceType()))
.sorted(Comparator.comparingDouble(w ->
GeoUtils.getDistance(w.getLocation(), order.getLocation())
))
.limit(3)
.collect(Collectors.toList());
}
采用RBAC模型扩展实现字段级权限:
java复制@PreAuthorize("hasRole('REPAIR_WORKER')")
@PostMapping("/orders/{id}/accept")
public ResponseEntity acceptOrder(@PathVariable Long id) {
// 方法级权限校验
}
@Entity
public class RepairOrder {
@Column(updatable = false)
@CreatedBy
private String createdBy; // 自动记录创建人
@JsonView(Views.Admin.class)
private String internalNotes; // 管理员可见字段
}
结合WebSocket和STOMP协议实现进度通知:
javascript复制// 前端订阅代码示例
const socket = new SockJS('/ws-endpoint');
const client = Stomp.over(socket);
client.connect({}, () => {
client.subscribe('/topic/order-updates', (message) => {
const update = JSON.parse(message.body);
showNotification(`工单${update.orderId}状态变更为${update.status}`);
});
});
采用多级缓存提升查询性能:
java复制@Cacheable(value = "deviceCache", key = "#id")
public Device getDeviceById(Long id) {
return deviceRepository.findById(id).orElseThrow();
}
properties复制# application.properties
spring.cache.type=redis
spring.cache.redis.time-to-live=30m
针对高频查询场景设计索引:
sql复制CREATE INDEX idx_repair_order_status ON repair_order (status);
CREATE INDEX idx_worker_skill ON worker_skills (worker_id, skill);
使用JPA查询优化技巧:
java复制@EntityGraph(attributePaths = {"worker", "device"})
@Query("SELECT o FROM RepairOrder o WHERE o.status = :status")
List<RepairOrder> findByStatusWithDetails(@Param("status") OrderStatus status);
Docker Compose编排文件示例:
yaml复制version: '3'
services:
app:
image: your-registry/campus-repair:${TAG}
environment:
- SPRING_PROFILES_ACTIVE=prod
ports:
- "8080:8080"
depends_on:
- redis
- mysql
redis:
image: redis:alpine
ports:
- "6379:6379"
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- db_data:/var/lib/mysql
集成Prometheus+Grafana监控关键指标:
java复制@Bean
public MeterRegistryCustomizer<PrometheusMeterRegistry> metricsCommonTags() {
return registry -> registry.config().commonTags(
"application", "campus-repair-system"
);
}
监控看板应包含:
采用乐观锁防止重复接单:
java复制@Transactional
public void acceptOrder(Long orderId, Long workerId) {
RepairOrder order = orderRepository.findById(orderId)
.orElseThrow();
if(order.getVersion() != currentVersion) {
throw new OptimisticLockingFailureException("工单已被其他维修员接取");
}
order.setWorker(workerRepository.getById(workerId));
order.setStatus(OrderStatus.PROCESSING);
orderRepository.save(order);
}
实现防恶意文件上传机制:
java复制public void validateFile(MultipartFile file) {
// 校验文件类型
String contentType = file.getContentType();
if(!ALLOWED_TYPES.contains(contentType)) {
throw new InvalidFileTypeException();
}
// 校验文件内容
byte[] magicBytes = new byte[4];
file.getInputStream().read(magicBytes);
if(!isValidMagicNumber(magicBytes)) {
throw new InvalidFileContentException();
}
}
我在实际部署中发现,系统性能瓶颈主要出现在工单状态变更的高并发场景。通过引入RabbitMQ实现异步事件处理后,系统吞吐量提升了3倍。建议在类似项目中提前考虑消息队列的集成方案。