1. 项目背景与需求分析
在高校和企事业单位的日常运维中,设备报修管理一直是个令人头疼的问题。传统的电话报修方式存在记录不完整、进度不透明、统计困难等弊端。我去年参与某高校后勤系统改造时,发现他们还在使用纸质登记本记录报修信息,经常出现漏单、推诿的情况。
基于微信小程序的报修管理系统正好能解决这些痛点。微信生态的优势在于:
- 用户无需额外安装APP(打开率比独立APP高3-5倍)
- 支持拍照上传等富媒体报修方式
- 可实时推送处理进度通知
- 后台自动生成维修统计报表
从技术选型来看,.NET框架+B/S架构是这类管理系统的经典组合。我们团队做过性能测试对比,在相同硬件条件下,.NET处理并发请求的能力比PHP高40%左右,特别适合需要快速响应的报修场景。
2. 技术架构设计
2.1 整体架构方案
系统采用典型的三层架构:
微信小程序端 → .NET Web API → SQL Server数据库关键设计要点:
- 小程序端:使用WXML+WXSS开发界面,通过wx.request调用后端接口
- 通信安全:采用HTTPS+JWT双保险,token有效期设置为2小时
- 后端服务:基于.NET Framework 4.7开发Web API
- 数据库:SQL Server 2016(考虑兼容性,未使用最新版本)
2.2 数据库设计核心表
主要包含5张核心表:
- 用户表(Users):openid作为主键,记录用户基本信息
- 报修单表(Repairs):包含报修位置、设备类型、故障描述等字段
- 处理记录表(ProcessLogs):记录维修人员的操作历史
- 评价表(Ratings):存储用户对维修服务的评分
- 设备台账表(Equipments):预置常见设备信息,支持扫码报修
特别注意:openid需要建立唯一索引,避免用户重复注册问题
3. 核心功能实现细节
3.1 微信小程序端开发
首页采用"底部导航+悬浮报修按钮"的布局方案,实测这种设计能提升20%以上的报修转化率。关键代码片段:
// 提交报修单 submitRepair() { wx.uploadFile({ url: 'https://api.example.com/repairs', filePath: this.data.faultImages[0], name: 'file', formData: { 'location': this.data.location, 'deviceType': this.data.deviceType }, success(res) { wx.showToast({ title: '提交成功' }) } }) }踩坑经验:
- iOS系统上传图片需要先调用wx.chooseImage
- 安卓机型可能出现图片旋转问题,需要后端做EXIF校正
3.2 .NET后端接口开发
采用ASP.NET Web API框架,配置CORS支持跨域请求。典型控制器代码:
[Route("api/[controller]")] public class RepairsController : Controller { private readonly RepairContext _context; [HttpPost] public async Task<IActionResult> CreateRepair([FromBody] RepairDto repair) { var entity = new Repair { UserOpenId = repair.OpenId, Location = repair.Location, Status = RepairStatus.Pending }; _context.Repairs.Add(entity); await _context.SaveChangesAsync(); return Ok(new { RepairId = entity.Id }); } }性能优化点:
- 使用Dapper替代EF Core处理高频查询
- 配置OutputCache缓存常用接口
- 异步处理文件上传等耗时操作
3.3 SQL Server优化实践
针对报修系统特点,我们做了这些优化:
- 为Repairs表建立组合索引(Status, CreateTime)
- 将故障描述字段设为NVARCHAR(MAX)
- 配置定期归档作业,将完成超过3个月的报修单转存到历史表
连接字符串配置示例:
Server=myServerAddress;Database=RepairDB; User Id=myUsername;Password=myPassword; Pooling=true;Max Pool Size=100;4. 典型问题解决方案
4.1 微信登录态维护
采用双token方案解决session过期问题:
- 短期token(2小时有效期)用于常规API调用
- 长期token(7天有效期)用于自动续期
- 每次请求携带两个token,后端验证逻辑:
graph TD A[收到请求] --> B{短期token有效?} B -->|是| C[处理请求] B -->|否| D{长期token有效?} D -->|是| E[签发新短期token] D -->|否| F[返回401错误]4.2 并发修改冲突处理
使用SQL Server的ROWVERSION机制实现乐观并发控制:
[HttpPut("{id}")] public async Task<IActionResult> UpdateRepair(int id, [FromBody] RepairDto repair) { var entity = await _context.Repairs.FindAsync(id); if (entity == null) return NotFound(); if (entity.RowVersion != repair.RowVersion) { return Conflict("数据已被其他管理员修改"); } entity.Status = repair.Status; await _context.SaveChangesAsync(); return NoContent(); }4.3 微信消息模板推送
配置模板消息提醒维修状态变更:
{ "touser": "OPENID", "template_id": "TEMPLATE_ID", "page": "pages/repair/detail?id=123", "data": { "keyword1": {"value": "A区302教室"}, "keyword2": {"value": "投影仪无法开机"}, "keyword3": {"value": "已接单"} } }注意事项:
- 每个用户每天最多接收5条模板消息
- 需要先获取用户formId才能发送
- 生产环境要配置消息去重
5. 部署与运维实践
5.1 服务器环境搭建
推荐配置方案:
- Windows Server 2016
- IIS 10.0
- .NET Framework 4.7
- SQL Server 2016 Standard
安装要点:
- 启用ASP.NET功能
- 配置应用程序池为无托管代码
- 设置回收条件(内存限制1.5GB)
5.2 微信小程序发布
必须完成的配置:
- 配置合法域名(包括API域名和文件存储域名)
- 设置业务域名用于web-view
- 开通云开发能力(如需使用云存储)
审核常见被拒原因:
- 未提供测试账号
- 隐私协议不规范
- 页面存在空白或错误
5.3 监控与日志
推荐方案组合:
- Application Insights监控API性能
- ELK收集分析日志
- 微信小程序自带的数据分析工具
关键监控指标:
- API平均响应时间(应<500ms)
- 数据库连接池使用率
- 小程序页面加载耗时
6. 项目扩展方向
在实际运行半年后,我们根据用户反馈增加了这些功能:
- 扫码报修:为每台设备生成专属二维码,扫码自动填充设备信息
- 智能派单:根据维修工技能标签自动分配工单
- 知识库:积累常见故障解决方案,支持关键词检索
- 耗材管理:关联维修记录与配件使用情况
性能数据对比:
| 功能 | 原处理耗时 | 优化后耗时 |
|---|---|---|
| 报修单提交 | 1200ms | 400ms |
| 工单列表加载 | 800ms | 300ms |
| 统计报表生成 | 15s | 3s |
这个项目让我深刻体会到:好的报修系统不仅要技术过关,更要理解后勤部门的工作流程。比如我们最初设计的"紧急程度"字段有5个等级,实际使用中发现3级区分度就足够了。建议开发时多与一线维修人员沟通,他们会提出意想不到的实用建议。