大家好,我是java1234_小锋老师,分享一套分享一套锋哥原创的微信小程序校园宿舍管理系统(SpringBoot4后端+Vue3管理端) 。
项目简介
随着高校在校生规模不断扩大与智能终端的普及,传统的纸质化、线下化宿舍管理方式在效率、信息共享与数据沉淀等方面已难以满足现代化校园管理需求。本设计面向校园宿舍管理场景,以 Spring Boot 为后端核心,结合 Vue3 + Element Plus 管理端与微信小程序学生端,构建一套覆盖宿舍资源管理、入住调换、报修审批、卫生检查、公告通知、访客登记和请假晚归等业务的一体化解决方案。在技术实现上,后端采用 Spring Boot 4 + MyBatis 的轻量级组合,数据库选用 MySQL 8.x,通过 JWT + 拦截器实现「管理员/宿管员/学生」三角色的统一鉴权;管理端基于 Vue3 + Vite 搭建,使用 ECharts 完成入住率、报修类型、卫生等级等多维度可视化分析;学生端使用微信小程序原生开发,提供登录、个人信息、公告播报、报修、请假晚归、调宿等高频自助服务。经过功能与性能测试,系统在主要业务流程上响应平均时间小于 200 ms,能够稳定支撑高校宿舍日常管理工作的数字化升级,具有较高的实际应用价值与推广意义。
源码下载
链接: pan.baidu.com/s/1VUeG7noc… 提取码: 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 class="hint"><a href="https://www.java1234.com/a/bysj/javaweb/" target='_blank'><font color=red>Java1234原创作品</font></a>
</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>