分享一套锋哥原创的微信小程序校园宿舍管理系统(SpringBoot4后端+Vue3管理端)
大家好,我是Java1234_小锋老师,分享一套锋哥原创的微信小程序校园宿舍管理系统(SpringBoot4后端+Vue3管理端)。
项目介绍
随着高校在校生规模不断扩大与智能终端的普及,传统的纸质化、线下化宿舍管理方式在效率、信息共享与数据沉淀等方面已难以满足现代化校园管理需求。本设计面向校园宿舍管理场景,以 Spring Boot 为后端核心,结合 Vue3 + Element Plus 管理端与微信小程序学生端,构建一套覆盖宿舍资源管理、入住调换、报修审批、卫生检查、公告通知、访客登记和请假晚归等业务的一体化解决方案。在技术实现上,后端采用 Spring Boot 4 + MyBatis 的轻量级组合,数据库选用 MySQL 8.x,通过 JWT + 拦截器实现「管理员/宿管员/学生」三角色的统一鉴权;管理端基于 Vue3 + Vite 搭建,使用 ECharts 完成入住率、报修类型、卫生等级等多维度可视化分析;学生端使用微信小程序原生开发,提供登录、个人信息、公告播报、报修、请假晚归、调宿等高频自助服务。经过功能与性能测试,系统在主要业务流程上响应平均时间小于 200 ms,能够稳定支撑高校宿舍日常管理工作的数字化升级,具有较高的实际应用价值与推广意义。
源码下载
链接:https://pan.baidu.com/s/1VUeG7nocGX9ijauNL-4k9w?pwd=1234
提取码:1234
系统展示
![]()
![]()
![]()
![]()
![]()
![]()
![]()
核心代码
package com.java1234.controller; import com.java1234.common.PageResult; import com.java1234.common.R; import com.java1234.common.SecurityHelper; import com.java1234.entity.Dormitory; import com.java1234.service.DormitoryService; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * 宿舍管理。 */ @RestController @RequestMapping("/dormitory") public class DormitoryController { private final DormitoryService dormitoryService; public DormitoryController(DormitoryService dormitoryService) { this.dormitoryService = dormitoryService; } @GetMapping("/list/{buildingId}") public R<List<Dormitory>> listByBuilding(@PathVariable Long buildingId) { SecurityHelper.requireStaff(); return R.ok(dormitoryService.listByBuilding(buildingId)); } @GetMapping("/page") public R<PageResult<Dormitory>> page(@RequestParam(required = false) Long buildingId, @RequestParam(required = false) String keyword, @RequestParam(required = false) String status, @RequestParam(defaultValue = "1") long page, @RequestParam(defaultValue = "10") long size) { SecurityHelper.requireStaff(); return R.ok(dormitoryService.page(buildingId, keyword, status, page, size)); } @PostMapping public R<Void> save(@RequestBody Dormitory row) { SecurityHelper.requireStaff(); dormitoryService.save(row); return R.ok(); } @PutMapping public R<Void> update(@RequestBody Dormitory row) { SecurityHelper.requireStaff(); dormitoryService.update(row); return R.ok(); } @DeleteMapping("/{id}") public R<Void> delete(@PathVariable Long id) { SecurityHelper.requireStaff(); dormitoryService.delete(id); return R.ok(); } }<script setup> import { reactive, ref } from 'vue' import { useRouter } from 'vue-router' import { ElMessage } from 'element-plus' import { login } from '@/api/auth' import { useUserStore } from '@/store/user' const router = useRouter() const store = useUserStore() const form = reactive({ username: 'java1234', password: '123456', }) const loading = ref(false) /** 提交登录表单 */ const onSubmit = async () => { loading.value = true try { const data = await login(form) store.setLogin(data) ElMessage.success('登录成功') router.push('/dashboard') } finally { loading.value = false } } </script> <template> <div class="login-wrap"> <div class="left"> <div class="badge">Java1234微信小程序校园宿舍管理系统</div> <h1>智慧宿管 · 一站式管理平台</h1> <p>楼栋宿舍、入住分配、报修卫生、访客请假……统一可视化调度。</p> <div class="illus">🏫</div> </div> <div class="right"> <div class="glass card"> <h2>欢迎登录</h2> <el-form :model="form" label-position="top" @keyup.enter="onSubmit"> <el-form-item label="用户名"> <el-input v-model="form.username" placeholder="请输入用户名" clearable /> </el-form-item> <el-form-item label="密码"> <el-input v-model="form.password" type="password" placeholder="请输入密码" show-password /> </el-form-item> <el-button type="primary" class="btn" :loading="loading" round @click="onSubmit">登 录</el-button> </el-form> </div> </div> </div> </div> </template> <style scoped lang="scss"> .login-wrap { min-height: 100vh; display: grid; grid-template-columns: 1.1fr 0.9fr; } .left { padding: 64px; background: radial-gradient(1200px 600px at 20% 10%, #7aafff 0%, #4f8df9 35%, #2849c5 100%); color: #fff; display: flex; flex-direction: column; gap: 18px; } .badge { align-self: flex-start; padding: 8px 14px; border-radius: 999px; background: rgba(255, 255, 255, 0.18); backdrop-filter: blur(8px); font-size: 13px; } h1 { margin: 0; font-size: 38px; letter-spacing: 1px; } p { opacity: 0.92; line-height: 1.8; max-width: 520px; } .illus { margin-top: auto; font-size: 96px; opacity: 0.35; } .right { display: flex; align-items: center; justify-content: center; padding: 40px; } .glass { width: min(440px, 100%); padding: 34px 28px; border-radius: 18px; background: rgba(255, 255, 255, 0.82); backdrop-filter: blur(10px); box-shadow: 0 18px 60px rgba(40, 73, 197, 0.18); } h2 { margin: 0 0 18px; } .btn { width: 100%; margin-top: 8px; } .hint { margin-top: 14px; color: #667; font-size: 12px; line-height: 1.6; } @media (max-width: 980px) { .login-wrap { grid-template-columns: 1fr; } .left { min-height: 240px; } } </style>