分享一套锋哥原创的微信小程序校园宿舍管理系统(SpringBoot4后端+Vue3管理端)

0 阅读3分钟

大家好,我是java1234_小锋老师,分享一套分享一套锋哥原创的微信小程序校园宿舍管理系统(SpringBoot4后端+Vue3管理端)  。

6.jpg

1.jpg

项目简介

随着高校在校生规模不断扩大与智能终端的普及,传统的纸质化、线下化宿舍管理方式在效率、信息共享与数据沉淀等方面已难以满足现代化校园管理需求。本设计面向校园宿舍管理场景,以 Spring Boot 为后端核心,结合 Vue3 + Element Plus 管理端与微信小程序学生端,构建一套覆盖宿舍资源管理、入住调换、报修审批、卫生检查、公告通知、访客登记和请假晚归等业务的一体化解决方案。在技术实现上,后端采用 Spring Boot 4 + MyBatis 的轻量级组合,数据库选用 MySQL 8.x,通过 JWT + 拦截器实现「管理员/宿管员/学生」三角色的统一鉴权;管理端基于 Vue3 + Vite 搭建,使用 ECharts 完成入住率、报修类型、卫生等级等多维度可视化分析;学生端使用微信小程序原生开发,提供登录、个人信息、公告播报、报修、请假晚归、调宿等高频自助服务。经过功能与性能测试,系统在主要业务流程上响应平均时间小于 200 ms,能够稳定支撑高校宿舍日常管理工作的数字化升级,具有较高的实际应用价值与推广意义。

源码下载

链接: pan.baidu.com/s/1VUeG7noc… 提取码: 1234

相关截图

9.jpg

2.jpg

3.jpg

4.jpg

5.jpg

7.jpg

8.jpg

核心代码

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>