基于SSM框架的宿舍管理系统设计与实现(附源码)
@
摘要
随着高校规模的不断扩大,学生宿舍管理的复杂度也在日益增加。传统的手工管理方式已经难以满足现代高校宿舍管理的需求。因此,开发一套高效、智能的宿舍管理系统显得尤为重要。本文详细介绍了基于 SSM(Spring、SpringMVC、MyBatis)框架的学生宿舍管理系统的设计与实现过程。该系统采用 B/S 架构,利用 Java 语言进行开发,结合 MySQL 数据库实现数据的存储与管理。系统主要功能包括用户管理、宿舍管理、考勤管理、公告管理等,旨在为宿舍管理人员和学生提供便捷的服务,提高宿舍管理的效率和质量。
关键词:SSM 框架;宿舍管理系统;高校宿舍;Spring;SpringMVC;MyBatis
1. 引言
在高校的日常管理中,学生宿舍管理是一个重要的组成部分。它不仅关系到学生的生活质量,还直接影响到学校的教学秩序和学生的成长发展。然而,传统的宿舍管理方式存在诸多问题,如信息传递不及时、管理效率低下、数据统计困难等。为了应对这些挑战,引入先进的信息技术,开发一套智能化的宿舍管理系统成为必然选择。
2. 系统概述
2.1 系统目标
本宿舍管理系统旨在实现以下目标:
- 提高管理效率:通过自动化流程处理日常事务,减少人工操作,提升管理效率。
- 信息实时更新:确保宿舍、学生、考勤等信息的实时更新,方便管理人员和学生随时查看。
- 数据准确可靠:利用数据库技术,保证数据的准确性和完整性,为决策提供可靠依据。
- 操作简便易用:设计简洁直观的用户界面,使系统易于学习和使用,降低培训成本。
- 安全性高:采用多层次的安全机制,保障系统数据的安全性和隐私性。
2.2 用户角色分析
系统主要涉及以下三类用户:
- 系统管理员:拥有最高权限,负责整个系统的维护和管理,包括用户权限分配、数据备份与恢复等。
- 宿舍管理员:负责具体宿舍楼的日常管理,如学生入住登记、退宿办理、考勤记录等。
- 学生:作为被管理者,可通过系统查看个人信息、宿舍安排、考勤记录等。
3. 系统架构设计
3.1 系统架构模式
本系统采用 B/S(浏览器/服务器)架构模式。B/S 架构具有以下优势:
- 跨平台性:用户只需在客户端安装浏览器,无需安装专门的客户端软件,降低了维护成本。
- 易于部署:系统的更新和维护只需在服务器端进行,客户端自动更新,方便快捷。
- 资源集中管理:数据集中存储在服务器端,便于统一管理和维护,提高了数据的安全性。
3.2 技术选型
系统基于 SSM 框架进行开发,具体技术选型如下:
- 数据表现层:使用 HTML、CSS、JavaScript 实现页面布局和交互效果,结合 Vue.js 框架提升前端开发效率和用户体验。
- 业务逻辑层:采用 Java 语言,利用 Spring 和 SpringMVC 框架实现业务逻辑的处理和控制层的转发。
- 数据持久层:使用 MyBatis 框架与 MySQL 数据库进行交互,完成数据的增删改查操作。
- 中间件:选择 Tomcat 作为 Web 应用服务器,负责接收客户端请求并返回响应。
- 开发工具:采用 Eclipse 作为主要的开发环境,配合 Git 进行版本控制。
3.3 系统架构图
4. 数据库设计
4.1 数据库概念设计
根据系统功能需求,设计了以下实体及其关系:
- 用户实体:包括系统管理员、宿舍管理员和学生的基本信息。
- 宿舍实体:包含宿舍楼、房间号等信息。
- 考勤实体:记录学生的考勤情况,如出勤、迟到、早退等。
- 公告实体:存储系统发布的各类通知和公告。
4.2 数据库表设计
4.2.1 用户表(t_user)
| 字段名称 | 类型 | 是否主键 | 说明 |
|---|---|---|---|
| user_id | INT | 是 | 用户唯一标识 |
| username | VARCHAR(50) | 否 | 用户名 |
| password | VARCHAR(50) | 否 | 密码 |
| user_type | VARCHAR(10) | 否 | 用户类型(管理员、宿舍管理员、学生) |
| name | VARCHAR(50) | 否 | 姓名 |
| tel | VARCHAR(15) | 否 | 联系电话 |
4.2.2 宿舍楼表(t_dormitory_building)
| 字段名称 | 类型 | 是否主键 | 说明 |
|---|---|---|---|
| building_id | INT | 是 | 宿舍楼唯一标识 |
| building_name | VARCHAR(50) | 否 | 宿舍楼名称 |
| location | VARCHAR(100) | 否 | 宿舍楼位置 |
| manager_id | INT | 否 | 宿舍管理员ID |
4.2.3 宿舍房间表(t_dormitory_room)
| 字段名称 | 类型 | 是否主键 | 说明 |
|---|---|---|---|
| room_id | INT | 是 | 房间唯一标识 |
| building_id | INT | 否 | 所属宿舍楼ID |
| room_number | VARCHAR(20) | 否 | 房间号 |
| capacity | INT | 否 | 房间容量 |
| current_num | INT | 否 | 当前入住人数 |
4.2.4 学生宿舍表(t_student_dormitory)
| 字段名称 | 类型 | 是否主键 | 说明 |
|---|---|---|---|
| student_id | INT | 是 | 学生唯一标识 |
| user_id | INT | 否 | 学生用户ID |
| room_id | INT | 否 | 所在房间ID |
| entry_date | DATE | 否 | 入住日期 |
| exit_date | DATE | 否 | 退宿日期 |
| status | VARCHAR(10) | 否 | 入住状态(正常、退宿) |
4.2.5 考勤表(t_attendance)
| 字段名称 | 类型 | 是否主键 | 说明 |
|---|---|---|---|
| attendance_id | INT | 是 | 考勤唯一标识 |
| student_id | INT | 否 | 学生ID |
| date | DATE | 否 | 考勤日期 |
| status | VARCHAR(10) | 否 | 考勤状态(出勤、迟到、早退、缺勤) |
| remark | VARCHAR(200) | 否 | 备注信息 |
4.2.6 公告表(t_notice)
| 字段名称 | 类型 | 是否主键 | 说明 |
|---|---|---|---|
| notice_id | INT | 是 | 公告唯一标识 |
| title | VARCHAR(100) | 否 | 公告标题 |
| content | TEXT | 否 | 公告内容 |
| publish_date | DATE | 否 | 发布日期 |
| publisher | VARCHAR(50) | 否 | 发布人 |
4.3 数据库 E-R 图
5. 系统详细设计与实现
5.1 系统功能模块设计
5.1.1 用户管理模块
用户管理模块是系统的核心模块之一,主要负责对各类用户的信息进行管理,包括添加用户、修改用户信息、删除用户以及重置用户密码等功能。系统管理员可以通过该模块对宿舍管理员和学生用户进行统一管理,确保系统的安全性和数据的准确性。


主要功能点:
- 用户注册与登录:支持用户通过用户名和密码进行注册和登录,同时对用户输入的信息进行验证,确保其合法性。
- 用户信息查询:根据用户名、用户类型等条件查询用户信息,并以表格形式展示查询结果。
- 用户信息修改:允许用户修改自己的个人信息,如密码、联系电话等;系统管理员可修改其他用户的信息。
- 用户删除:系统管理员可删除不再需要的用户账号,释放系统资源。
5.1.2 宿舍管理模块
宿舍管理模块用于对宿舍楼、房间以及学生宿舍安排等信息进行管理。通过该模块,宿舍管理员可以方便地查看和管理宿舍资源,提高宿舍的利用率和管理效率。


主要功能点:
- 宿舍楼管理:添加、修改、删除宿舍楼信息,包括宿舍楼名称、位置等。
- 房间管理:对宿舍房间进行添加、修改、删除操作,设置房间容量和当前入住人数。
- 学生宿舍安排:将学生分配到指定的宿舍房间,记录入住和退宿信息。
- 宿舍信息查询:根据宿舍楼、房间号、学生姓名等条件查询宿舍安排情况。
5.1.3 考勤管理模块
考勤管理模块用于记录和管理学生的日常考勤情况,包括出勤、迟到、早退、缺勤等。通过该模块,宿舍管理员可以及时了解学生的出勤状况,加强学生管理。


主要功能点:
- 考勤记录添加:宿舍管理员可手动添加学生的考勤记录,选择相应的考勤状态并填写备注信息。
- 考勤记录查询:按日期、学生姓名、考勤状态等条件查询考勤记录,生成考勤报表。
- 考勤统计分析:对考勤数据进行统计分析,如出勤率、迟到次数等,为管理决策提供依据。
5.1.4 公告管理模块
公告管理模块用于发布和管理宿舍相关的通知、公告等信息。系统管理员可以通过该模块向宿舍管理员和学生发布重要通知,确保信息的及时传递。

成功发布公告后,会出现在宿舍管理员端和学生端界面,效果图如下:

主要功能点:
- 公告发布:添加新的公告信息,包括标题、内容、发布日期和发布人等。
- 公告查询:根据标题、发布日期等条件查询公告信息,方便用户查看历史公告。
- 公告修改与删除:对已发布的公告进行修改或删除操作,确保公告内容的准确性和时效性。
5.2 系统流程设计
5.2.1 用户登录流程
用户登录是系统使用的第一步,其流程如下:
- 用户在浏览器中输入系统网址,进入登录页面。
- 用户选择自己的用户类型(系统管理员、宿舍管理员或学生),并输入用户名和密码。
- 系统对用户输入的信息进行验证:
- 如果用户名或密码错误,提示用户重新输入。
- 如果验证成功,根据用户类型跳转到相应的主界面。
- 用户在系统中进行相应的操作,直至会话超时或主动退出登录。
5.2.2 宿舍分配流程
当有新生入学或学生调整宿舍时,需要进行宿舍分配,其流程如下:
- 宿舍管理员登录系统,进入宿舍管理模块。
- 在宿舍房间列表中选择空闲房间,查看房间详细信息。
- 点击“分配宿舍”按钮,输入学生信息(如学号、姓名等)。
- 系统自动将学生与所选房间进行关联,并记录入住日期等信息。
- 宿舍分配成功后,学生可在个人中心查看自己的宿舍信息。
5.2.3 考勤记录流程
日常考勤记录的流程如下:
- 宿舍管理员在规定时间内到达指定地点进行考勤。
- 登录系统,进入考勤管理模块。
- 选择相应的考勤日期和学生,根据实际情况记录考勤状态(出勤、迟到等)。
- 如有特殊情况,可在备注栏中详细说明。
- 保存考勤记录,系统自动更新学生的考勤信息。
5.3 核心功能代码实现
5.3.1 用户登录功能
Controller 层代码:
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/login")
@ResponseBody
public Map<String, Object> login(@RequestParam("username") String username,
@RequestParam("password") String password,
HttpSession session) {
Map<String, Object> result = new HashMap<>();
// 调用 Service 层方法进行登录验证
User user = userService.login(username, password);
if (user != null) {
// 登录成功,将用户信息存入 Session
session.setAttribute("user", user);
result.put("code", 0);
result.put("msg", "登录成功");
result.put("user", user);
} else {
// 登录失败
result.put("code", 1);
result.put("msg", "用户名或密码错误");
}
return result;
}
@RequestMapping("/logout")
public String logout(HttpSession session) {
// 移除 Session 中的用户信息,实现退出登录
session.removeAttribute("user");
return "redirect:/login.jsp";
}
}
Service 层代码:
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User login(String username, String password) {
// 调用 Mapper 层方法查询用户信息
return userMapper.selectByUsernameAndPassword(username, password);
}
// 其他用户相关业务逻辑方法
}
Mapper 层接口及 XML 文件:
@Mapper
public interface UserMapper {
// 根据用户名和密码查询用户
User selectByUsernameAndPassword(@Param("username") String username, @Param("password") String password);
}
<!-- UserMapper.xml -->
<mapper namespace="com.dormitory.mapper.UserMapper">
<select id="selectByUsernameAndPassword" resultType="com.dormitory.entity.User">
SELECT * FROM t_user
WHERE username = #{username} AND password = #{password}
</select>
</mapper>
5.3.2 宿舍分配功能
Controller 层代码:
@Controller
@RequestMapping("/dormitory")
public class DormitoryController {
@Autowired
private DormitoryService dormitoryService;
// 分配宿舍
@RequestMapping("/assignDormitory")
@ResponseBody
public Map<String, Object> assignDormitory(@RequestParam("studentId") int studentId,
@RequestParam("roomId") int roomId) {
Map<String, Object> result = new HashMap<>();
try {
dormitoryService.assignDormitory(studentId, roomId);
result.put("code", 0);
result.put("msg", "宿舍分配成功");
} catch (Exception e) {
result.put("code", 1);
result.put("msg", "宿舍分配失败:" + e.getMessage());
}
return result;
}
// 查询宿舍分配情况
@RequestMapping("/getDormitoryAssignments")
@ResponseBody
public Map<String, Object> getDormitoryAssignments(@RequestParam("buildingId") int buildingId,
@RequestParam("roomId") int roomId,
@RequestParam("studentName") String studentName) {
List<StudentDormitory> assignments = dormitoryService.getDormitoryAssignments(buildingId, roomId, studentName);
Map<String, Object> result = new HashMap<>();
result.put("code", 0);
result.put("data", assignments);
return result;
}
}
Service 层代码:
@Service
public class DormitoryService {
@Autowired
private DormitoryMapper dormitoryMapper;
public void assignDormitory(int studentId, int roomId) {
// 检查房间是否已满
DormitoryRoom room = dormitoryMapper.getRoomById(roomId);
if (room.getCurrentNum() >= room.getCapacity()) {
throw new RuntimeException("房间已满,无法分配");
}
// 更新学生宿舍信息
dormitoryMapper.assignDormitory(studentId, roomId);
// 更新房间当前入住人数
room.setCurrentNum(room.getCurrentNum() + 1);
dormitoryMapper.updateRoom(room);
}
public List<StudentDormitory> getDormitoryAssignments(int buildingId, int roomId, String studentName) {
return dormitoryMapper.getDormitoryAssignments(buildingId, roomId, studentName);
}
}
Mapper 层接口及 XML 文件:
@Mapper
public interface DormitoryMapper {
// 根据房间ID获取房间信息
DormitoryRoom getRoomById(@Param("roomId") int roomId);
// 分配宿舍
void assignDormitory(@Param("studentId") int studentId, @Param("roomId") int roomId);
// 更新房间信息
void updateRoom(DormitoryRoom room);
// 查询宿舍分配情况
List<StudentDormitory> getDormitoryAssignments(@Param("buildingId") int buildingId,
@Param("roomId") int roomId,
@Param("studentName") String studentName);
}
<!-- DormitoryMapper.xml -->
<mapper namespace="com.dormitory.mapper.DormitoryMapper">
<select id="getRoomById" resultType="com.dormitory.entity.DormitoryRoom">
SELECT * FROM t_dormitory_room
WHERE room_id = #{roomId}
</select>
<update id="assignDormitory">
INSERT INTO t_student_dormitory (student_id, room_id, entry_date, status)
VALUES (#{studentId}, #{roomId}, NOW(), '正常')
</update>
<update id="updateRoom">
UPDATE t_dormitory_room
SET current_num = #{currentNum}
WHERE room_id = #{roomId}
</update>
<select id="getDormitoryAssignments" resultType="com.dormitory.entity.StudentDormitory">
SELECT sd.*, s.name AS student_name, r.room_number, b.building_name
FROM t_student_dormitory sd
LEFT JOIN t_user s ON sd.student_id = s.user_id
LEFT JOIN t_dormitory_room r ON sd.room_id = r.room_id
LEFT JOIN t_dormitory_building b ON r.building_id = b.building_id
WHERE 1=1
<if test="buildingId != 0">
AND b.building_id = #{buildingId}
</if>
<if test="roomId != 0">
AND r.room_id = #{roomId}
</if>
<if test="studentName != null and studentName != ''">
AND s.name LIKE CONCAT('%', #{studentName}, '%')
</if>
</select>
</mapper>
5.3.3 考勤记录功能
Controller 层代码:
@Controller
@RequestMapping("/attendance")
public class AttendanceController {
@Autowired
private AttendanceService attendanceService;
// 添加考勤记录
@RequestMapping("/addAttendance")
@ResponseBody
public Map<String, Object> addAttendance(@RequestParam("studentId") int studentId,
@RequestParam("status") String status,
@RequestParam("remark") String remark) {
Map<String, Object> result = new HashMap<>();
try {
attendanceService.addAttendance(studentId, status, remark);
result.put("code", 0);
result.put("msg", "考勤记录添加成功");
} catch (Exception e) {
result.put("code", 1);
result.put("msg", "考勤记录添加失败:" + e.getMessage());
}
return result;
}
// 查询考勤记录
@RequestMapping("/getAttendanceRecords")
@ResponseBody
public Map<String, Object> getAttendanceRecords(@RequestParam("studentId") int studentId,
@RequestParam("startDate") String startDate,
@RequestParam("endDate") String endDate) {
List<Attendance> records = attendanceService.getAttendanceRecords(studentId, startDate, endDate);
Map<String, Object> result = new HashMap<>();
result.put("code", 0);
result.put("data", records);
return result;
}
}
Service 层代码:
@Service
public class AttendanceService {
@Autowired
private AttendanceMapper attendanceMapper;
public void addAttendance(int studentId, String status, String remark) {
Attendance attendance = new Attendance();
attendance.setStudentId(studentId);
attendance.setStatus(status);
attendance.setRemark(remark);
attendance.setDate(new Date());
attendanceMapper.insertAttendance(attendance);
}
public List<Attendance> getAttendanceRecords(int studentId, String startDate, String endDate) {
return attendanceMapper.getAttendanceRecords(studentId, startDate, endDate);
}
}
Mapper 层接口及 XML 文件:
@Mapper
public interface AttendanceMapper {
// 插入考勤记录
void insertAttendance(Attendance attendance);
// 查询考勤记录
List<Attendance> getAttendanceRecords(@Param("studentId") int studentId,
@Param("startDate") String startDate,
@Param("endDate") String endDate);
}
<!-- AttendanceMapper.xml -->
<mapper namespace="com.dormitory.mapper.AttendanceMapper">
<insert id="insertAttendance" parameterType="com.dormitory.entity.Attendance">
INSERT INTO t_attendance (student_id, date, status, remark)
VALUES (#{studentId}, #{date}, #{status}, #{remark})
</insert>
<select id="getAttendanceRecords" resultType="com.dormitory.entity.Attendance">
SELECT * FROM t_attendance
WHERE student_id = #{studentId}
<if test="startDate != null and startDate != ''">
AND date >= STR_TO_DATE(#{startDate}, '%Y-%m-%d')
</if>
<if test="endDate != null and endDate != ''">
AND date <= STR_TO_DATE(#{endDate}, '%Y-%m-%d')
</if>
ORDER BY date DESC
</select>
</mapper>
6. 系统测试
6.1 测试环境
- 操作系统:Windows 10
- 开发工具:Eclipse
- 数据库:MySQL 5.7
- 服务器:Tomcat 9.0
- 浏览器:Chrome、Firefox、Edge
6.2 测试用例
6.2.1 用户登录测试
测试用例 1:正确用户名和密码登录
- 步骤:
- 打开浏览器,输入系统网址,进入登录页面。
- 选择用户类型为“系统管理员”,输入正确的用户名和密码。
- 点击“登录”按钮。
- 预期结果:登录成功,跳转到系统管理员主界面。
测试用例 2:错误用户名登录
- 步骤:
- 进入登录页面。
- 输入不存在的用户名,正确密码。
- 点击“登录”按钮。
- 预期结果:提示“用户名或密码错误”,无法登录。
测试用例 3:错误密码登录
- 步骤:
- 进入登录页面。
- 输入正确的用户名,错误密码。
- 点击“登录”按钮。
- 预期结果:提示“用户名或密码错误”,无法登录。
6.2.2 宿舍分配测试
测试用例 1:正常分配宿舍
- 步骤:
- 宿舍管理员登录系统。
- 进入宿舍管理模块,选择空闲房间。
- 点击“分配宿舍”,输入学生信息。
- 点击“保存”。
- 预期结果:宿舍分配成功,学生信息出现在该房间的住宿名单中。
测试用例 2:分配已满房间
- 步骤:
- 宿舍管理员登录系统。
- 选择已满的房间,尝试分配新学生。
- 预期结果:系统提示“房间已满,无法分配”,分配失败。
6.2.3 考勤记录测试
测试用例 1:添加考勤记录
- 步骤:
- 宿舍管理员登录系统。
- 进入考勤管理模块,选择学生和日期。
- 选择考勤状态为“迟到”,填写备注信息。
- 点击“保存”。
- 预期结果:考勤记录添加成功,在考勤列表中显示新增记录。
测试用例 2:查询考勤记录
- 步骤:
- 学生登录系统。
- 进入考勤记录模块,选择查询日期范围。
- 点击“查询”。
- 预期结果:显示该学生在指定日期范围内的考勤记录,包括出勤、迟到等情况。
6.3 测试结果与分析
通过以上测试用例的执行,系统在功能、性能、兼容性等方面均表现良好。测试过程中发现的少数问题已及时修复,确保系统的稳定性和可靠性。测试结果表明,本宿舍管理系统能够满足高校宿舍管理的实际需求,为宿舍管理人员和学生提供了便捷、高效的服务。
7. 部署与运行
7.1 部署环境准备
- 安装 Java 运行环境:确保服务器已安装 JDK 1.8 或以上版本。
- 安装 MySQL 数据库:创建相应的数据库和用户,导入系统所需的表结构和初始数据。
- 安装 Tomcat 服务器:解压 Tomcat 压缩包,配置相关环境变量。
- 部署项目:将系统项目的 WAR 包放置到 Tomcat 的 webapps 目录下,启动 Tomcat 服务器进行自动部署。
7.2 运行与访问
- 启动 Tomcat 服务器,在命令行中输入
startup.bat(Windows)或startup.sh(Linux)。 - 打开浏览器,在地址栏输入
http://服务器IP:8080/项目名访问系统登录页面。 - 使用预先设置的管理员账号登录系统,进行初始化配置和其他操作。
7.3 常见问题及解决方法
-
问题 1:页面无法访问
- 可能原因:服务器未正确启动、网络连接问题、防火墙限制等。
- 解决方法:检查服务器状态,确保 Tomcat 已成功启动;核实网络连接是否正常;检查防火墙设置,放行相应端口。
-
问题 2:数据库连接失败
- 可能原因:数据库服务未启动、用户名或密码错误、连接字符串配置有误等。
- 解决方法:确认数据库服务已正常运行;检查数据库连接配置文件中的用户名、密码和连接字符串是否正确;测试数据库端口是否可达。
-
问题 3:页面显示异常
- 可能原因:浏览器兼容性问题、缓存过期等。
- 解决方法:尝试更换浏览器访问;清除浏览器缓存后重新加载页面。
8. 结论与展望
8.1 结论
本基于 SSM 框架的宿舍管理系统成功实现了用户管理、宿舍管理、考勤管理、公告管理等核心功能,满足了高校宿舍管理的实际需求。系统采用 B/S 架构和主流的 Java 技术栈,具有良好的跨平台性、可扩展性和易用性。通过实际测试,系统运行稳定,性能可靠,能够有效提高宿舍管理的效率和质量。
8.2 展望
尽管本系统已经具备了较为完善的功能,但在实际应用中仍有进一步优化和扩展的空间。例如,可以增加移动端支持,方便宿舍管理员和学生随时随地进行操作;引入数据分析模块,对考勤、宿舍使用等情况进行深度分析,为管理决策提供更有力的支持;加强系统的安全防护机制,防止数据泄露和恶意攻击等。未来,随着技术的不断发展和用户需求的日益多样化,我们将持续对系统进行改进和完善,以更好地服务于高校宿舍管理。
9. 源码下载
本期就分享到这里,欢迎点赞、分享,获取本系统源码请在下方名片【公众号:IT学长】后台回复“宿舍管理系统”。

浙公网安备 33010602011771号