建校園設(shè)備報(bào)修系統(tǒng))
1. 項(xiàng)目概述學(xué)校設(shè)備報(bào)修系統(tǒng)是校園信息化建設(shè)中的重要一環(huán)。傳統(tǒng)的紙質(zhì)報(bào)修流程存在效率低下、進(jìn)度不透明、統(tǒng)計(jì)困難等問題?;赟pringBoot和微信小程序的報(bào)修系統(tǒng)能夠?qū)崿F(xiàn)以下核心價(jià)值師生可隨時(shí)隨地進(jìn)行設(shè)備報(bào)修維修人員能實(shí)時(shí)接收工單通知管理人員可監(jiān)控維修進(jìn)度和統(tǒng)計(jì)分析實(shí)現(xiàn)報(bào)修流程的數(shù)字化和可視化這個(gè)畢業(yè)設(shè)計(jì)項(xiàng)目采用前后端分離架構(gòu)前端微信小程序使用uni-app框架開發(fā)后端SpringBoot 2.7 MySQL 8.0接口RESTful API設(shè)計(jì)2. 技術(shù)選型解析2.1 后端技術(shù)棧選擇SpringBoot作為后端框架主要基于以下考慮快速開發(fā)自動配置、起步依賴簡化了SSM框架的整合生態(tài)豐富Spring生態(tài)有完善的解決方案易于部署內(nèi)嵌Tomcat打包即運(yùn)行適合教學(xué)社區(qū)資源豐富便于學(xué)生理解關(guān)鍵依賴dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version2.2.2/version /dependency2.2 前端技術(shù)方案采用uni-app開發(fā)微信小程序的優(yōu)勢跨平臺一套代碼可編譯到多個(gè)平臺開發(fā)效率基于Vue語法學(xué)習(xí)成本低組件豐富uni-ui提供大量現(xiàn)成組件調(diào)試方便HBuilderX提供完善工具鏈小程序頁面結(jié)構(gòu)示例pages/ index/ // 首頁 repair/ // 報(bào)修頁 my/ // 個(gè)人中心 components/ // 公共組件3. 數(shù)據(jù)庫設(shè)計(jì)3.1 核心表結(jié)構(gòu)用戶表(user)CREATE TABLE user ( id int NOT NULL AUTO_INCREMENT, openid varchar(50) DEFAULT NULL COMMENT 微信openid, username varchar(20) DEFAULT NULL, role tinyint DEFAULT 0 COMMENT 0-學(xué)生 1-維修員 2-管理員, phone varchar(11) DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY idx_openid (openid) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;報(bào)修單表(repair_order)CREATE TABLE repair_order ( id int NOT NULL AUTO_INCREMENT, user_id int DEFAULT NULL, device_type varchar(20) DEFAULT NULL COMMENT 設(shè)備類型, location varchar(50) DEFAULT NULL COMMENT 故障地點(diǎn), description text COMMENT 故障描述, images varchar(255) DEFAULT NULL COMMENT 圖片URL多個(gè)用逗號分隔, status tinyint DEFAULT 0 COMMENT 0-待處理 1-已接單 2-已完成 3-已評價(jià), create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;3.2 索引優(yōu)化為提高查詢效率需要建立以下索引報(bào)修單狀態(tài)索引ALTER TABLE repair_order ADD INDEX idx_status (status);用戶報(bào)修記錄索引ALTER TABLE repair_order ADD INDEX idx_user (user_id);4. 核心功能實(shí)現(xiàn)4.1 微信登錄流程前端獲取codeuni.login({ provider: weixin, success: function (res) { console.log(res.code); } });后端處理登錄PostMapping(/login) public Result login(String code) { // 1. 使用code獲取openid String openid wechatService.getOpenid(code); // 2. 查詢或創(chuàng)建用戶 User user userService.findOrCreate(openid); // 3. 生成JWT token String token JwtUtil.generate(user.getId()); return Result.success(token); }4.2 報(bào)工單提交前端表單關(guān)鍵代碼template view uni-forms :modelform uni-forms-item label設(shè)備類型 namedeviceType uni-data-select v-modelform.deviceType :localdatadeviceTypes/ /uni-forms-item uni-forms-item label故障描述 namedescription textarea v-modelform.description/ /uni-forms-item uni-file-picker limit3 successuploadSuccess/ /uni-forms /view /template后端接口實(shí)現(xiàn)PostMapping(/repair) public Result submitRepair(RequestBody RepairDTO dto, RequestHeader(Authorization) String token) { // 1. 驗(yàn)證token Integer userId JwtUtil.verify(token); // 2. 構(gòu)建工單實(shí)體 RepairOrder order new RepairOrder(); order.setUserId(userId); order.setDeviceType(dto.getDeviceType()); order.setDescription(dto.getDescription()); order.setImages(String.join(,, dto.getImages())); // 3. 保存到數(shù)據(jù)庫 repairService.save(order); // 4. 通知維修人員 notifyService.sendNewOrderNotice(order.getId()); return Result.success(); }5. 系統(tǒng)特色功能5.1 維修進(jìn)度推送采用微信訂閱消息實(shí)現(xiàn)狀態(tài)變更通知配置消息模板用戶提交報(bào)修時(shí)訂閱消息狀態(tài)變更時(shí)觸發(fā)推送后端推送實(shí)現(xiàn)public void sendStatusChangeNotice(Integer orderId) { RepairOrder order repairService.getById(orderId); String openid userService.getOpenid(order.getUserId()); WxMpTemplateMessage message WxMpTemplateMessage.builder() .toUser(openid) .templateId(TEMPLATE_ID) .data(Arrays.asList( new WxMpTemplateData(thing1, order.getDeviceType()), new WxMpTemplateData(phrase2, getStatusText(order.getStatus())), new WxMpTemplateData(date3, new SimpleDateFormat(yyyy-MM-dd HH:mm).format(new Date())) )) .build(); wxMpService.getTemplateMsgService().sendTemplateMsg(message); }5.2 數(shù)據(jù)統(tǒng)計(jì)看板管理員后臺使用ECharts實(shí)現(xiàn)數(shù)據(jù)可視化按設(shè)備類型統(tǒng)計(jì)故障分布按時(shí)間維度統(tǒng)計(jì)報(bào)修量維修員接單響應(yīng)時(shí)間分析關(guān)鍵SQL-- 按周統(tǒng)計(jì)報(bào)修量 SELECT DATE_FORMAT(create_time,%Y-%u) AS week, COUNT(*) AS count FROM repair_order GROUP BY week ORDER BY week;6. 部署方案6.1 后端部署推薦使用Docker部署SpringBoot應(yīng)用FROM openjdk:11-jre COPY target/repair-system.jar /app.jar EXPOSE 8080 ENTRYPOINT [java,-jar,/app.jar]啟動命令docker build -t repair-system . docker run -d -p 8080:8080 --name repair repair-system6.2 小程序發(fā)布流程開發(fā)環(huán)境配置{ miniprogramRoot: ./unpackage/dist/dev/mp-weixin, appid: 你的小程序APPID, setting: { urlCheck: false } }生產(chǎn)環(huán)境構(gòu)建npm run build:mp-weixin通過微信開發(fā)者工具上傳代碼7. 常見問題解決7.1 微信登錄失敗可能原因及解決方案AppID配置錯(cuò)誤檢查application.yml中的wechat配置確保小程序后臺配置的服務(wù)器域名正確code失效確保前端獲取code后立即調(diào)用后端接口code有效期5分鐘不可重復(fù)使用7.2 圖片上傳問題典型錯(cuò)誤處理大小限制小程序端限制單張圖片不超過2M可使用uni.compressImage壓縮圖片格式問題只允許jpg/png格式前端需做格式校驗(yàn)uni.chooseImage({ count: 3, sizeType: [compressed], sourceType: [album, camera], success: (res) { // 處理選中的圖片 } });8. 項(xiàng)目擴(kuò)展方向智能分配根據(jù)維修員位置和技能自動分配工單知識庫建立常見故障解決方案庫評價(jià)系統(tǒng)增加維修服務(wù)評價(jià)機(jī)制數(shù)據(jù)大屏可視化展示全校設(shè)備運(yùn)行狀況實(shí)現(xiàn)自動分配的邏輯示例public void autoAssignOrder(Integer orderId) { RepairOrder order getById(orderId); // 1. 獲取附近維修員 ListRepairman repairmen repairmanService.findNearby( order.getLocation(), 1000); // 1公里范圍內(nèi) // 2. 篩選有相關(guān)技能的維修員 repairmen repairmen.stream() .filter(r - r.getSkills().contains(order.getDeviceType())) .sorted(Comparator.comparing(Repairman::getCurrentOrders)) .collect(Collectors.toList()); // 3. 分配工單 if(!repairmen.isEmpty()) { assignOrder(orderId, repairmen.get(0).getId()); } }