在当今高校环境中,电子设备已成为学生日常学习生活的必需品。根据2023年高校信息化调查报告显示,平均每位大学生拥有2.3台电子设备(包括智能手机、笔记本电脑、平板等)。设备数量的激增带来了维修需求的快速增长,但传统校园维修服务普遍存在以下痛点:
基于这些痛点,我们设计开发了这套基于SpringBoot的校园智能维修系统。系统采用O2O服务模式,将线下维修服务线上化,实现以下核心价值:
本系统采用主流Java技术栈,主要基于以下考虑:
SpringBoot框架:
MySQL数据库:
前端技术:
辅助工具:
系统采用经典的三层架构:
code复制表示层(Vue前端)
↑↓ HTTP/JSON
业务逻辑层(SpringBoot)
↑↓ JDBC/MyBatis
数据访问层(MySQL)
关键设计决策:
RBAC权限模型:
状态机设计:
文件存储方案:
java复制// 密码加密存储
public class PasswordUtil {
private static final int SALT_LENGTH = 8;
private static final int HASH_ITERATIONS = 1024;
public static String encrypt(String password) {
byte[] salt = SecureRandom.getInstanceStrong().generateSeed(SALT_LENGTH);
PBKDF2Hash hash = new PBKDF2Hash(HASH_ITERATIONS);
return hash.generate(password.toCharArray(), salt);
}
}
关键安全措施:
java复制@Configuration
public class JwtConfig {
@Value("${jwt.secret}")
private String secret;
@Bean
public JwtTokenUtil jwtTokenUtil() {
return new JwtTokenUtil(secret);
}
}
public class JwtTokenUtil {
public String generateToken(UserDetails details) {
Map<String, Object> claims = new HashMap<>();
claims.put("roles", details.getAuthorities());
return Jwts.builder()
.setClaims(claims)
.setSubject(details.getUsername())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION))
.signWith(SignatureAlgorithm.HS512, secret)
.compact();
}
}
java复制public enum RepairStatus {
PENDING_REVIEW(0, "待审核"),
ASSIGNED(1, "已分配"),
IN_PROGRESS(2, "维修中"),
PENDING_PAYMENT(3, "待支付"),
COMPLETED(4, "已完成"),
CANCELLED(-1, "已取消");
// 状态流转规则
private static final Map<RepairStatus, Set<RepairStatus>> TRANSITIONS = Map.of(
PENDING_REVIEW, Set.of(ASSIGNED, CANCELLED),
ASSIGNED, Set.of(IN_PROGRESS, CANCELLED),
IN_PROGRESS, Set.of(PENDING_PAYMENT, CANCELLED),
PENDING_PAYMENT, Set.of(COMPLETED)
);
public static boolean isValidTransition(RepairStatus from, RepairStatus to) {
return TRANSITIONS.getOrDefault(from, Set.of()).contains(to);
}
}
java复制public class RepairAssigner {
// 基于维修员负载均衡的分配策略
public Technician assignTechnician(RepairOrder order) {
List<Technician> candidates = technicianDao.findBySkill(order.getDeviceType());
return candidates.stream()
.min(Comparator.comparingInt(t ->
t.getCurrentWorkload() + t.getLocation().distanceTo(order.getLocation())
))
.orElseThrow(() -> new NoAvailableTechnicianException());
}
}
java复制@RestController
@RequestMapping("/payment")
public class PaymentController {
@PostMapping("/create")
public PaymentResult createPayment(@RequestBody PaymentRequest request) {
// 1. 验证订单状态
RepairOrder order = orderService.validateOrder(request.getOrderId());
// 2. 调用支付网关
PaymentGatewayResponse response = paymentGateway.createPayment(
order.getAmount(),
"维修服务费",
request.getPaymentMethod()
);
// 3. 更新订单状态
orderService.updatePaymentStatus(order.getId(), response.getTransactionId());
return new PaymentResult(response.getPaymentUrl());
}
}
支持支付方式:
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| order_no | varchar(32) | 工单编号 |
| student_id | bigint | 学生ID |
| device_type | varchar(20) | 设备类型 |
| fault_desc | text | 故障描述 |
| status | tinyint | 工单状态 |
| technician_id | bigint | 维修员ID |
| create_time | datetime | 创建时间 |
| update_time | datetime | 更新时间 |
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| order_id | bigint | 工单ID |
| operator | varchar(20) | 操作人 |
| operation | varchar(20) | 操作类型 |
| content | text | 操作内容 |
| create_time | datetime | 创建时间 |
索引策略:
分表设计:
缓存方案:
java复制@Cacheable(value = "deviceTypes", key = "#root.methodName")
public List<DeviceType> getAllDeviceTypes() {
return deviceTypeMapper.selectAll();
}
| 组件 | 版本 | 说明 |
|---|---|---|
| JDK | 1.8+ | 推荐OpenJDK 11 |
| MySQL | 5.7+ | 推荐8.0 |
| Redis | 5.0+ | 缓存服务 |
| Nginx | 1.18+ | 反向代理 |
bash复制#!/bin/bash
# 启动后端服务
nohup java -jar repair-system.jar \
--spring.profiles.active=prod \
--server.port=8080 \
> system.log 2>&1 &
# 启动前端服务
cd /opt/repair-web
nohup npm run prod > web.log 2>&1 &
Spring Boot Actuator:
Prometheus + Grafana:
日志收集:
java复制@Configuration
public class DateTimeConfig {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
return mapper;
}
}
yaml复制spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 20MB
N+1查询问题:
接口响应优化:
java复制@Async
public void asyncProcess(RepairOrder order) {
// 发送通知、生成报表等非核心操作
}
智能诊断功能:
配件管理系统:
移动端适配:
数据分析平台:
在实际开发过程中,我们遇到了许多技术挑战,例如高并发下的工单状态同步问题、支付接口的幂等性设计等。通过引入分布式锁、乐观锁等机制,最终实现了系统的稳定运行。建议在二次开发时,先从简单的业务模块入手,逐步理解系统的设计思想,再着手进行功能扩展。