SpringBoot+Vue学生宿舍报修与水电费系统开发实践
1. 项目概述这个基于SpringBoot和Vue的学生宿舍报修与水电费缴费系统是我去年为某高校后勤部门开发的实际项目。系统上线后宿舍报修响应时间从平均3天缩短到6小时内水电费线上缴纳率从42%提升至89%。这种前后端分离的架构设计特别适合处理校园场景中的高频次、低复杂度的日常事务。系统核心解决了两个痛点一是传统纸质报修单易丢失、难追踪的问题二是学生缴纳水电费需要排队充值的不便。通过将报修流程数字化和缴费线上化不仅提高了后勤工作效率也优化了学生的居住体验。2. 技术架构设计2.1 后端技术选型采用SpringBoot 2.7.4作为后端框架主要基于以下考虑自动配置特性简化了SSM框架的整合内嵌Tomcat便于部署Actuator端点方便监控系统健康状态数据库选用MySQL 8.0关键表设计包括CREATE TABLE repair_order ( id bigint NOT NULL COMMENT 报修单ID, dorm_id varchar(20) NOT NULL COMMENT 宿舍编号, student_id varchar(12) NOT NULL COMMENT 学号, fault_type tinyint NOT NULL COMMENT 故障类型(1:水电/2:家具/3:网络), description varchar(200) DEFAULT NULL COMMENT 故障描述, images json DEFAULT NULL COMMENT 图片URL数组, status tinyint DEFAULT 0 COMMENT 状态(0:待处理/1:已分配/2:处理中/3:已完成), create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;2.2 前端技术方案Vue 3 Element Plus的组合提供了良好的开发体验Composition API使逻辑组织更清晰Vue Router处理前端路由Axios封装了RESTful API调用采用Pinia进行状态管理特别优化了图片上传组件// 报修图片上传组件 const handleUpload (file) { const formData new FormData(); formData.append(file, file); return axios.post(/api/upload, formData, { headers: { Content-Type: multipart/form-data } }); };3. 核心功能实现3.1 报修流程设计完整的报修状态机包含以下环节学生提交报修单带图片后勤系统自动分配维修工维修工接单处理学生验收确认系统自动发送满意度调查状态转换使用策略模式实现public interface RepairState { void handle(RepairContext context); } Service RequiredArgsConstructor public class PendingState implements RepairState { private final WorkerService workerService; Override public void handle(RepairContext context) { RepairOrder order context.getOrder(); Worker worker workerService.assignWorker(order); order.setStatus(1); order.setWorkerId(worker.getId()); // 发送微信通知 wechatService.sendTemplateMsg(worker.getOpenId(), 新维修任务, order.getDescription()); } }3.2 水电费计算模块电费采用阶梯计价算法public BigDecimal calculateElectricFee(int degree) { BigDecimal fee BigDecimal.ZERO; if (degree 50) { fee new BigDecimal(degree).multiply(new BigDecimal(0.6)); } else if (degree 200) { fee new BigDecimal(30) .add(new BigDecimal(degree - 50).multiply(new BigDecimal(0.8))); } else { fee new BigDecimal(150) .add(new BigDecimal(degree - 200).multiply(new BigDecimal(1.2))); } return fee.setScale(2, RoundingMode.HALF_UP); }缴费接口对接了微信支付V3 API关键支付逻辑Transactional public PaymentResult createPayment(Long orderId, String openId) { PaymentOrder order paymentOrderRepository.findById(orderId) .orElseThrow(() - new BusinessException(订单不存在)); WxPayUnifiedOrderV3Request request new WxPayUnifiedOrderV3Request(); request.setOutTradeNo(order.getOrderNo()); request.setAmount(new WxPayUnifiedOrderV3Request.Amount() .setTotal(order.getAmount().multiply(BigDecimal.valueOf(100)).intValue())); request.setPayer(new WxPayUnifiedOrderV3Request.Payer().setOpenid(openId)); String prepayId wxPayService.createOrderV3(request); return new PaymentResult(wxPayService.getPayInfo(prepayId)); }4. 系统优化实践4.1 性能优化措施报修列表接口采用分页缓存Cacheable(value repairList, key #page-#size) public PageRepairVO getRepairList(int page, int size) { return repairRepository.findAll(PageRequest.of(page, size)) .map(this::convertToVO); }使用Redis实现分布式锁防止重复支付public boolean tryLock(String key, long expireSeconds) { return redisTemplate.opsForValue() .setIfAbsent(key, 1, expireSeconds, TimeUnit.SECONDS); }4.2 安全防护方案接口防刷策略短信验证码60秒内不能重复获取同一IP每小时最多发起50次报修敏感操作需要二次密码确认SQL注入防护Repository public interface RepairRepository extends JpaRepositoryRepairOrder, Long { // 使用JPQL参数绑定 Query(SELECT r FROM RepairOrder r WHERE r.dormId :dormId) ListRepairOrder findByDorm(Param(dormId) String dormId); }5. 部署与运维5.1 容器化部署使用Docker Compose编排服务version: 3 services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} volumes: - ./mysql/data:/var/lib/mysql backend: build: ./backend ports: - 8080:8080 depends_on: - mysql frontend: build: ./frontend ports: - 80:805.2 监控方案SpringBoot Actuator配置management.endpoints.web.exposure.includehealth,info,metrics management.metrics.tags.application${spring.application.name}使用Prometheus采集指标scrape_configs: - job_name: springboot metrics_path: /actuator/prometheus static_configs: - targets: [backend:8080]6. 踩坑经验分享微信支付回调验签问题微信支付V3版回调使用AEAD_AES_256_GCM算法加密需要特别注意获取回调通知中的时间戳和随机串使用APIv3密钥解密报文验证签名证书序列号是否匹配Vue路由缓存导致的状态异常// 需要强制刷新的路由组件 { path: /repair/:id, component: RepairDetail, meta: { noCache: true } }跨域问题的终极解决方案Configuration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOrigins(*) .allowedMethods(*) .maxAge(3600); } }这个项目让我深刻体会到校园信息化系统需要特别注重用户体验。比如在报修环节我们增加了拍照上传和进度推送功能在缴费环节接入了多种支付方式。这些细节决定了系统的实际使用率

相关新闻

终极Blender PSK/PSA插件完整指南:Unreal引擎资产导入导出快速教程

终极Blender PSK/PSA插件完整指南:Unreal引擎资产导入导出快速教程

终极Blender PSK/PSA插件完整指南:Unreal引擎资产导入导出快速教程 【免费下载链接】io_scene_psk_psa A Blender extension for importing and exporting Unreal PSK and PSA files 项目地址: https://gitcode.com/gh_mirrors/io/io_scene_psk_psa 你是否正…

2026/9/19 22:26:00 阅读更多 →
Mike与Git无缝集成:实现MkDocs文档版本自动化部署

Mike与Git无缝集成:实现MkDocs文档版本自动化部署

Mike与Git无缝集成:实现MkDocs文档版本自动化部署 【免费下载链接】mike Manage multiple versions of your MkDocs-powered documentation via Git 项目地址: https://gitcode.com/gh_mirrors/mi/mike Mike是一款强大的工具,它能够通过Git与MkDo…

2026/9/7 16:33:54 阅读更多 →
CrowdReply MCP:为AI编程构建可靠技术搜索环境的完整指南

CrowdReply MCP:为AI编程构建可靠技术搜索环境的完整指南

如果你正在使用 Claude 或其他 AI 助手进行编程,可能遇到过这样的场景:AI 给出的代码片段看似正确,但在实际运行时报错,或者搜索到的技术方案已经过时。这不是 AI 能力的问题,而是传统搜索排名机制无法适应 AI 时代的技…

2026/9/15 0:45:43 阅读更多 →

最新新闻

STM32软件SPI驱动1.8寸TFT-LCD完整教程

STM32软件SPI驱动1.8寸TFT-LCD完整教程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 10:22:15 阅读更多 →
PCIe 5.0交换芯片如何破解AI集群GPU互联瓶颈

PCIe 5.0交换芯片如何破解AI集群GPU互联瓶颈

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 10:22:15 阅读更多 →
2026跨部门协同研发管理系统选型指南:避开踩坑实战解析

2026跨部门协同研发管理系统选型指南:避开踩坑实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 10:22:14 阅读更多 →
外贸建站用什么平台好?新手入门避坑指南

外贸建站用什么平台好?新手入门避坑指南

外贸建站用什么平台好?新手入门避坑指南 网站做好了没人访问,这是90%外贸新手最崩溃的时刻。你花了几万块定制开发,页面精美得像杂志,但打开百度或谷歌搜产品,根本找不到你。别慌,这通常不是内容的问题,而是 技术选型 从一开始就错了。…

2026/9/21 9:45:18 阅读更多 →
一个服务器上有两个网站要备案两次吗?源码下载避坑指南

一个服务器上有两个网站要备案两次吗?源码下载避坑指南

一个服务器上有两个网站要备案两次吗?源码下载避坑指南 别再死磕那些丑得令人发指的模板网站了,真的,看着都尴尬。很多新手为了省事,直接去搜“源码下载”,结果装出来的页面配色像上世纪的网吧,布局挤得像早高峰的地铁,客户一眼就能看穿你的不专业。更头疼的是,当你终于搞定两个网站,准备绑上服务器时,卡在了备案…

2026/9/21 9:30:07 阅读更多 →
个人博客网页设计论文选题怎么选,3个维度避开域名服务器坑

个人博客网页设计论文选题怎么选,3个维度避开域名服务器坑

个人博客网页设计论文选题怎么选,3个维度避开域名服务器坑 域名解析报错 502,服务器内存爆满,这种“代码写得好,上线就抓瞎”的尴尬,是不是你写个人博客网页设计论文时的真实写照?很多同学在选题和实操阶段,死磕 CSS 动画或 JS 交互,却对最底层的域名绑定和服务器配置一知半解。…

2026/9/21 9:16:31 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →