1. 项目背景与需求分析
高校资产管理一直是校园后勤工作中的痛点,特别是设备维修环节。传统模式下,师生报修需要填写纸质单据或打电话登记,维修部门手工记录后再分配任务,整个过程效率低下且难以追踪。我们团队在调研了国内12所高校后发现,平均每起维修请求从报修到完成需要3-7个工作日,其中仅信息传递就消耗了40%的时间。
这个基于微信小程序的资产维修管理系统,正是为了解决以下核心痛点:
- 报修渠道分散(电话、现场、邮件等多入口)
- 维修状态不透明(师生无法实时查看进度)
- 历史记录难追溯(纸质单据易丢失)
- 数据统计困难(无法分析设备故障规律)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 整体技术栈选型
采用前后端分离架构,主要技术组件如下:
| 模块 | 技术选型 | 选型理由 |
|---|---|---|
| 前端 | 微信小程序 + Vant Weapp | 无需安装,师生打开即用;Vant提供丰富的UI组件库 |
| 后端 | SpringBoot 2.7.3 | 快速构建RESTful API,内置Tomcat简化部署 |
| 数据库 | MySQL 8.0 | 事务支持完善,高校场景下数据一致性要求高 |
| 消息通知 | 微信模板消息 + 邮件提醒 | 关键状态变更多渠道通知 |
| 文件存储 | 七牛云OSS | 维修图片、视频等附件存储,比本地存储更可靠 |
| 权限控制 | Spring Security + JWT | 区分学生、维修工、管理员等多角色权限 |
特别注意:微信小程序要求所有网络请求必须走HTTPS,在SpringBoot中需要配置SSL证书。我们使用Let's Encrypt免费证书,通过Nginx反向代理实现。
2.2 数据库关键表设计
核心表结构设计考虑了高校维修场景的特殊性:
sql复制-- 设备信息表
CREATE TABLE `asset` (
`id` bigint NOT NULL AUTO_INCREMENT,
`asset_code` varchar(32) COMMENT '资产编号(学校统一编码)',
`name` varchar(100) NOT NULL,
`location` varchar(255) COMMENT '所在楼宇+房间号',
`category_id` int COMMENT '设备分类',
`status` tinyint DEFAULT 1 COMMENT '1-正常 2-维修中 3-报废',
`purchase_date` date COMMENT '购置日期',
`warranty_period` int COMMENT '保修期(月)',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_asset_code` (`asset_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 维修工单表(核心业务表)
CREATE TABLE `repair_order` (
`id` bigint NOT NULL AUTO_INCREMENT,
`order_no` varchar(32) NOT NULL COMMENT '工单编号RO20230701-001',
`asset_id` bigint NOT NULL,
`reporter_id` varchar(32) NOT NULL COMMENT '报修人学工号',
`fault_type` tinyint COMMENT '1-硬件 2-软件 3-网络...',
`description` text NOT NULL,
`images` varchar(1024) COMMENT '多张图片URL,逗号分隔',
`urgent_level` tinyint DEFAULT 2 COMMENT '1-紧急 2-一般 3-可延缓',
`status` tinyint DEFAULT 1 COMMENT '1-待接单 2-处理中 3-待验收 4-已完成 5-已取消',
`create_time` datetime NOT NULL,
`update_time` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_asset_id` (`asset_id`),
KEY `idx_reporter_id` (`reporter_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 核心功能实现细节
3.1 微信小程序端关键技术
扫码报修功能实现:
javascript复制// pages/scanRepair/scanRepair.js
Page({
scanCode: function() {
wx.scanCode({
success: (res) => {
const assetCode = res.result; // 解析资产二维码中的编码
this.setData({ assetCode });
this.getAssetInfo(assetCode);
},
fail: (err) => {
wx.showToast({ title: '扫码失败', icon: 'error' });
}
});
},
getAssetInfo: function(code) {
wx.request({
url: 'https://yourdomain.com/api/assets/' + code,
method: 'GET',
success: (res) => {
if(res.data.code === 200) {
this.setData({ assetInfo: res.data.data });
}
}
});
}
})
图片上传优化方案:
- 使用wx.chooseImage选择图片
- 前端压缩(quality设置为70%)
- 分片上传(针对大于2MB的图片)
- 显示上传进度条
3.2 SpringBoot后端关键API
工单状态机设计:
java复制// 使用状态模式处理工单状态流转
public interface RepairOrderState {
void handle(RepairOrderContext context);
}
@Component
@Scope("prototype")
public class PendingState implements RepairOrderState {
@Override
public void handle(RepairOrderContext context) {
if ("ACCEPT".equals(context.getAction())) {
context.getOrder().setStatus(OrderStatus.PROCESSING);
context.setState(ApplicationContext.getBean(ProcessingState.class));
}
// 其他状态转换规则...
}
}
// 在Service层应用状态机
public class OrderServiceImpl {
public void processOrderAction(Long orderId, String action) {
RepairOrder order = orderRepository.findById(orderId).orElseThrow();
RepairOrderContext context = new RepairOrderContext(order);
context.setState(getStateBean(order.getStatus()));
context.handle(action);
orderRepository.save(order);
}
}
性能优化实践:
- 使用Spring Cache缓存高频访问的设备信息
- 工单列表接口采用分页查询(PageHelper实现)
- 复杂统计报表使用@Async异步生成
4. 典型问题与解决方案
4.1 微信小程序常见坑
问题1:真机调试时出现"invalid domain"
- 原因:未配置服务器域名
- 解决:登录微信公众平台→开发→开发设置→服务器域名
- request合法域名:填写SpringBoot接口域名
- uploadFile合法域名:填写OSS域名
- 注意:必须使用HTTPS且备案通过
问题2:iOS设备上图片显示异常
- 现象:部分iPhone上传的图片旋转90度
- 原因:EXIF方向信息未正确处理
- 解决方案:
javascript复制// 使用exif-js库读取方向信息 EXIF.getData(img, function() { let orientation = EXIF.getTag(this, 'Orientation'); // 根据orientation值进行canvas旋转校正 });
4.2 SpringBoot对接问题
跨域解决方案对比:
- 简单场景:使用@CrossOrigin注解
- 生产环境推荐:Nginx反向代理解决
- 特殊需求:自定义CorsFilter
微信模板消息发送:
java复制public void sendTemplateMessage(String openId, String templateId,
Map<String, TemplateData> data) {
String url = "https://api.weixin.qq.com/cgi-bin/message/template/send";
Map<String, Object> params = new HashMap<>();
params.put("touser", openId);
params.put("template_id", templateId);
params.put("data", data);
// 获取access_token(需要缓存,2小时有效期)
String token = wechatService.getAccessToken();
restTemplate.postForObject(url + "?access_token=" + token,
params, String.class);
}
5. 项目部署与运维
5.1 生产环境部署方案
服务器最低配置建议:
- CPU:4核(建议8核)
- 内存:8GB(建议16GB)
- 带宽:5Mbps(建议按日均PV配置)
- 系统:CentOS 7.6+
Docker部署示例:
dockerfile复制# SpringBoot应用Dockerfile
FROM openjdk:11-jre
COPY target/repair-system-0.0.1-SNAPSHOT.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
EXPOSE 8080
Nginx关键配置:
code复制server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location /api/ {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
location / {
root /var/www/html;
try_files $uri $uri/ /index.html;
}
}
5.2 数据安全策略
- 敏感数据加密:
- 数据库字段加密(使用Jasypt)
- 日志脱敏处理
- 接口安全:
- 所有API必须携带JWT
- 关键操作记录审计日志
- 定期备份:
- MySQL每日全备+binlog
- OSS数据跨区域复制
6. 项目扩展方向
- 智能派单系统:根据维修工的历史工单数据(擅长领域、完成时效等)实现智能派单
- 设备健康预测:基于历史维修记录,使用LSTM模型预测设备可能故障时间
- AR远程协助:集成微信小程序AR能力,实现维修人员远程指导
- 语音报修:接入ASR技术,支持语音输入故障描述
在项目开发过程中,我们特别注重用户体验的细节打磨。比如在工单状态变更时,除了微信消息通知外,还会在界面通过颜色变化(使用CSS过渡动画)直观展示状态流转。对于高频使用的扫码功能,做了本地缓存处理,同一设备10分钟内重复扫码不再请求接口。这些细节虽然小,但能显著提升用户满意度。
