1. 项目背景与核心需求
学校设备报修系统是高校信息化建设中的重要组成部分。传统报修方式存在诸多痛点:纸质工单流转效率低、维修进度不透明、故障设备定位困难、数据统计缺失等。这些问题直接影响了教学设备的正常使用和后勤部门的工作效率。
基于SpringBoot和微信小程序的解决方案具有天然优势:
- 微信小程序无需安装,用户使用门槛极低
- 可充分利用微信的即时通讯能力实现状态推送
- SpringBoot后端可快速构建RESTful API接口
- 前后端分离架构便于后期功能扩展
典型用户场景包括:
- 学生/教师发现设备故障后,通过小程序扫码或手动选择设备提交报修单
- 后勤管理员收到推送后分配维修工单
- 维修人员接单后前往现场处理,并通过小程序更新状态
- 用户可实时查看处理进度并进行满意度评价
- 管理人员通过后台统计报表分析设备故障率等指标
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型与架构设计
2.1 前端技术栈
采用uni-app框架开发微信小程序前端,主要考虑因素:
- 跨平台能力:一套代码可同时发布到微信、支付宝等多端
- 开发效率:基于Vue.js语法,组件生态丰富
- 性能表现:通过条件编译实现平台特定优化
核心页面组件包括:
- 报修表单页:设备选择、故障描述、图片上传
- 工单列表页:按状态分类展示个人报修记录
- 详情页:显示维修进度和沟通记录
- 个人中心:历史记录统计和通知设置
javascript复制// 典型页面结构示例
<template>
<view class="container">
<u-form :model="form" ref="uForm">
<u-form-item label="设备类型" prop="deviceType">
<u-picker mode="selector" :range="deviceTypes" v-model="form.deviceType"/>
</u-form-item>
<u-form-item label="故障描述" prop="description">
<u-input v-model="form.description" type="textarea"/>
</u-form-item>
<u-upload :fileList="images" @afterRead="handleUpload"/>
</u-form>
<u-button @click="submit">提交报修</u-button>
</view>
</template>
2.2 后端技术栈
SpringBoot 2.7.x + MyBatis-Plus组合提供以下能力:
- 自动化的依赖管理:通过starter简化第三方库集成
- ORM层:MyBatis-Plus提供强大的单表CRUD操作
- 事务管理:通过@Transactional注解声明式控制
- 安全控制:整合Spring Security实现API权限校验
数据库设计关键表结构:
sql复制CREATE TABLE `repair_order` (
`id` bigint NOT NULL AUTO_INCREMENT,
`device_id` varchar(32) NOT NULL COMMENT '设备编号',
`fault_type` tinyint NOT NULL COMMENT '故障类型',
`description` text COMMENT '详细描述',
`status` tinyint DEFAULT '0' COMMENT '0待接单 1处理中 2已完成 3已评价',
`creator_id` varchar(32) NOT NULL COMMENT '报修人ID',
`handler_id` varchar(32) DEFAULT NULL COMMENT '处理人ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_device` (`device_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 核心功能实现细节
3.1 微信小程序登录集成
采用官方unionID机制实现用户标识:
- 调用wx.login获取临时code
- 将code发送至后端换取openid和session_key
- 后端维护用户会话状态并返回自定义token
- 后续请求通过header携带token进行鉴权
安全注意事项:
- 禁止在前端存储session_key
- 用户敏感数据需后端解密处理
- 接口调用需做好防重放攻击措施
java复制// SpringBoot登录接口示例
@RestController
@RequestMapping("/api/auth")
public class AuthController {
@Autowired
private WxService wxService;
@PostMapping("/login")
public Result<LoginVO> login(@RequestBody LoginDTO dto) {
// 1. 使用code换取openid
WxAuthResponse authInfo = wxService.code2Session(dto.getCode());
// 2. 查询或创建用户
User user = userService.getOrCreate(authInfo.getOpenid());
// 3. 生成JWT令牌
String token = JwtUtil.generate(user.getId());
return Result.success(new LoginVO(token, user));
}
}
3.2 工单状态机设计
采用状态模式实现工单流转:
java复制public interface OrderState {
void handle(RepairOrder order, OrderContext context);
}
@Component
@Scope("prototype")
public class PendingState implements OrderState {
@Override
public void handle(RepairOrder order, OrderContext context) {
if (!"ASSIGN".equals(context.getAction())) {
throw new BusinessException("待接单状态只能执行分配操作");
}
order.setStatus(OrderStatus.PROCESSING);
order.setHandlerId(context.getHandlerId());
// 发送微信模板消息通知维修人员
wxPushService.sendNewOrderNotice(order);
}
}
// 使用示例
public class OrderService {
public void processOrder(Long orderId, String action) {
RepairOrder order = getById(orderId);
OrderState state = stateFactory.getState(order.getStatus());
state.handle(order, new OrderContext(action, currentUserId()));
updateById(order);
}
}
4. 性能优化与异常处理
4.1 图片上传优化策略
针对报修时的多图上传场景:
- 前端采用分片上传:将大文件切割为多个1MB的chunk
- 后端使用OSS直传:返回临时凭证让前端直传对象存储
- 图片压缩:小程序端使用canvas进行有损压缩
- CDN加速:通过配置域名CNAME实现静态资源分发
关键配置示例:
properties复制# application.yml
aliyun:
oss:
endpoint: oss-cn-hangzhou.aliyuncs.com
bucket: school-repair
access-key-id: ${OSS_AK}
access-key-secret: ${OSS_SK}
expire-time: 300000 # 5分钟有效期
max-size: 5242880 # 5MB限制
4.2 分布式事务处理
跨服务操作如工单分配+消息通知需保证一致性:
java复制@Transactional(rollbackFor = Exception.class)
public void assignOrder(Long orderId, Long handlerId) {
// 1. 更新工单状态
repairOrderMapper.updateStatusAndHandler(orderId, handlerId);
// 2. 记录操作日志
operationLogService.addAssignLog(orderId, handlerId);
// 3. 发送消息通知(加入事务事件表)
messageEventService.addEvent(
new MessageEvent("order_assign", orderId.toString())
);
}
// 定时任务处理事件表
@Scheduled(fixedDelay = 5000)
public void processPendingEvents() {
List<MessageEvent> events = messageEventService.getPendingEvents(100);
events.forEach(event -> {
try {
if ("order_assign".equals(event.getType())) {
wxPushService.sendAssignNotice(Long.parseLong(event.getPayload()));
}
event.markProcessed();
} catch (Exception e) {
event.markFailed();
}
});
messageEventService.batchUpdate(events);
}
5. 部署与监控方案
5.1 容器化部署
使用Docker Compose编排服务:
dockerfile复制# Dockerfile
FROM openjdk:11-jre
WORKDIR /app
COPY target/repair-api.jar .
EXPOSE 8080
ENTRYPOINT ["java","-jar","repair-api.jar"]
yaml复制# docker-compose.yml
version: '3'
services:
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
redis:
image: redis:6-alpine
app:
build: .
ports:
- "8080:8080"
depends_on:
- mysql
- redis
volumes:
mysql_data:
5.2 监控指标采集
SpringBoot Actuator + Prometheus配置:
xml复制<!-- pom.xml -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
properties复制# application.properties
management.endpoints.web.exposure.include=health,metrics,prometheus
management.metrics.tags.application=repair-system
关键监控指标:
- API请求成功率(status_2xx, status_4xx, status_5xx)
- JVM内存使用(jvm_memory_used_bytes)
- 数据库连接池活跃数(hikaricp_connections_active)
- 工单处理平均耗时(自定义Timer指标)
6. 项目扩展方向
6.1 智能诊断功能
结合历史数据实现:
- 故障知识图谱构建:使用HanLP分词+Neo4j存储设备故障关系
- 相似问题推荐:通过TF-IDF计算报修描述相似度
- 自动分类:训练朴素贝叶斯模型对故障类型自动归类
java复制// HanLP分词示例
public List<String> extractKeywords(String text) {
List<Term> termList = HanLP.segment(text);
return termList.stream()
.filter(t -> "n".equals(t.nature.toString().substring(0, 1)))
.map(t -> t.word)
.collect(Collectors.toList());
}
6.2 微信消息模板优化
提升用户触达效率的技巧:
- 状态变更即时通知:使用订阅消息替代统一服务通知
- 关键节点提醒:维修人员接单、预计到达时间、完成确认等
- 评价引导:维修完成后24小时发送评价提醒
模板消息配置示例:
json复制{
"touser": "OPENID",
"template_id": "TEMPLATE_ID",
"page": "/pages/order/detail?id=123",
"data": {
"thing1": { "value": "多媒体教室投影仪" },
"thing3": { "value": "已分配维修人员" },
"date4": { "value": "2023-08-20 14:00" }
}
}
在实际开发中,我发现微信小程序审核时容易因"功能不完整"被拒。解决方案是:
- 准备完整的测试账号和测试数据
- 对于需权限的功能(如扫码),提供免权限演示模式
- 在版本描述中明确标注"演示测试账号:xxx 密码:xxx"
- 关键业务流程录制演示视频作为附件提交
