基于Spring Boot的BS架构学生住宿管理系统设计与实现

摘要

本文设计并实现了一个基于B/S架构的学生住宿管理系统,该系统作为Web应用软件,服务器端采用MySQL作为后台数据库,并使用Java语言进行服务器端应用程序的开发。前端界面则利用HTML、CSS和JavaScript等网页技术构建。在开发过程中,主要运用了Intellij IDEA作为Java集成开发环境,Navicat作为数据库连接工具,以及Visio进行绘图设计。系统采用了Spring Boot和JPA技术作为服务器端编程框架,前端UI框架则选择了layui。
系统主要功能包括用户登录访问、查询学生宿舍分配情况、学生自选寝室、处理学生入住申请、住宿解约、后台信息管理以及用户修改个人信息等。宿舍管理员和学生可以通过浏览器访问系统,并根据各自角色拥有不同的操作权限。学生可以查看自己被分配的寝室,提交入住申请,并在申请通过后查看分配结果。宿舍管理员可以处理学生的入住申请,执行解约操作,管理用户、学生和寝室信息,并支持查询结果的导出。系统还为学生自动创建账户,并允许用户和管理员修改个人信息,其中密码进行单向加密保存。

关键词:学生住宿管理系统;B/S架构;Spring Boot;JPA;宿舍分配;入住申请

目录
摘要 1
Abstract 2
前言 4
1.1选题背景及意义 4
1.2国内外研究现状 4
1.3研究主要内容 4
1系统分析 6
1.1问题说明 6
1.2功能需求 6
1.2.1主要功能描述 6
1.2.2用例图 8
1.3数据需求 8
1.3.1数据结构 8
1.3.2数据处理要求 10
1.4性能需求 11
1.5开发环境与工具软件 12
2系统设计 13
2.1总体设计 13
2.2数据库表结构 15
2.3输入/输出设计 17
2.3.1输入设计 17
2.3.2输出设计 17
2.4用户界面设计 18
2.5处理过程设计 21
3系统实现与测试 25
3.1单元测试 25
(5)测试用例5:宿舍管理员登录系统,通过张明的入住申请。 25
3.2集成测试 26
4设计的特点、不足、体会 27
4.1设计的特点与不足 27
总结 28
致谢 29
参考文献 30

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>学生住宿管理系统前台</title>
    <link rel="icon" href="../static/favicon.ico" th:href="@{/favicon.ico}" type="image/x-icon">
    <!--导入网页图标 -->
    <link rel="shortcut icon" href="../static/favicon.ico" th:href="@{/favicon.ico}" type="image/x-icon">
    <!--导入网页图标 -->
    <script src="../static/lib/jQuery/jquery-3.5.1.min.js" th:src="@{/lib/jQuery/jquery-3.5.1.min.js}"></script>
    <!--导入jQuery库 -->
    <script src="../static/lib/layui/layui.js" th:src="@{/lib/layui/layui.js}"></script>
    <!--导入layUI库 -->
    <script src="../static/lib/cookie/js.cookie-2.2.1.min.js" th:src="@{/lib/cookie/js.cookie-2.2.1.min.js}"></script>
    <!--导入cookie库 -->
    <link rel="stylesheet" href="../static/lib/layui/css/layui.css" th:href="@{/lib/layui/css/layui.css}" media="all">
    <!--导入layUI css库 -->
    <link rel="stylesheet" href="../static/css/common.css" th:href="@{/css/common.css}">
    <!--导入公共的css,其中可定义整个网页的配色方案 -->
    <link rel="stylesheet" href="../static/css/index.css" th:href="@{/css/index.css}">
</head>

<body>
<div>
    <ul class="layui-nav" lay-filter="" style="position: fixed;top:0;left: 0;right: 0;z-index: 1000;">
        <li class="layui-nav-item"><a href="" id="hover_div" style="font-size:large">&nbsp;学生住宿管理系统</a></li>
        <li class="layui-nav-item "><a href="javascript:void(0)"><span id="i_room"
                                                                       th:text="${currentRoom==null?'未安排宿舍':'我的寝室:'+currentRoom.name}">XXX</span></a>
            <dl class="layui-nav-child">
                <dd><img src="../static/images/default.ico"
                         th:src="${currentRoom==null?'/images/no.png':((currentRoom.picture==null||currentRoom.picture=='')?'/images/no.png':currentRoom.picture)}"
                         alt="">
                </dd>
            </dl>
        </li>
        <li class="layui-nav-item layui-layout-right" style="margin-right: 100px;">
            <a href="javascript:void(0)">
                <img src="../static/images/default.ico"
                     th:src="${(session.currentUser==null||session.currentUser.avatar==null||session.currentUser.avatar=='')?'/images/avatar.jpg':session.currentUser.avatar}"
                     class="layui-nav-img" alt="">
                <span th:text="${session.currentUser==null?'未登录':(session.currentUser.username==null?'':session.currentUser.username)}">用户名</span>
            </a>
            <dl class="layui-nav-child">
                <dd><a href="" th:href="@{/user}">个人中心</a></dd>
            </dl>
        </li>
        <li class="layui-nav-item layui-layout-right"><a href="/logout">安全退出</a></li>
    </ul>
</div>

<div style="position: absolute;left: 60px;right:60px;top:0;bottom:0;padding-top: 10px;background-color: rgb(246, 251, 255);">

    <div class="layui-col-md12"
         style="padding: 30px;">

        <!-- 内容主体区域 -->
        <div style="padding-left: 15px;padding-top: 10px">

            <div id="search_div" style="margin-top: 10px;padding-top: 10px;">

                <div class="layui-form layui-form-item  layui-inline" style="margin-bottom: 0">
                    <label for="search_by_key_word"></label>
                    <input class="layui-input" name="searchName" placeholder="请输入寝室名" id="search_by_key_word"
                           autocomplete="off">
                </div>

                <div class="layui-form layui-form-item  layui-inline" style="margin-bottom: 0">
                    <label for="search_by_select"></label>
                    <select class="layui-input" id="search_by_select" style="width: 200px;">
                        <option value="" selected="selected">不限类型</option>
                        <option value="" th:each="category:${categories}" th:value="${category.id}"
                                th:text="${category.name}">四人寝
                        </option>
                    </select>
                </div>
                <button class="layui-btn" id="search_by_room_name_btn" data-type="reload">
                    <i class="layui-icon layui-icon-search"></i>
                </button>
            </div>
            <!-- layUI渲染的表格组件 -->
            <table class="layui-hide" id="test" lay-filter="test"></table>

        </div>
        <input id="student_id" type="hidden" th:value="${session.currentUser==null?'未登录':session.currentUser.username}">
    </div>

</div>

<div class="layui-footer" id="sdms-footer"></div>
<script src="../static/js/footer.js" th:src="@{/js/footer.js}"></script>
<!-- 表格组件内部的操作按钮 -->
<script type="text/html" id="barDemo">
    <a class="layui-btn layui-btn-xs" lay-event="edit"> 申请入住 </a>
</script>
<!-- layUI执行脚本,预先加载 -->
<script>
    layui.use(['element', 'layer', 'form', 'table'], function () {
        var table = layui.table;
        var layer = layui.layer;
        table.render({
            elem: '#test',
            url: "/admin/rooms",
            method: 'post',
            contentType: 'application/json',
            limit: 10,
            title: '寝室数据表',
            cols: [
                [{
                    type: 'checkbox',
                    fixed: 'left'
                }, {
                    field: 'id',
                    title: '寝室ID',
                    width: 150
                }, {
                    field: 'categoryName',
                    title: '类型',
                    width: 150,
                    sort: true
                }, {
                    field: 'name',
                    title: '寝室名',
                    width: 150,
                    sort: true
                }, {
                    field: 'address',
                    title: '地址'
                }, {
                    fixed: 'right',
                    title: '操作',
                    toolbar: '#barDemo',
                    width: 100
                }]
            ],
            page: true,
            id: 'table_id'
        });

        //表格渲染重载,通过where字段传递查询条件 searchName
        var $ = layui.$;
        var active = {
            reload: function () {
                //执行重载
                table.reload('table_id', {
                    page: {
                        curr: 1 //重新从第 1 页开始
                    },
                    where: {
                        //查询条件
                        queryType: 0,
                        param: {
                            roomId: "",
                            keyWord: $("#search_by_key_word").val(),
                            categoryId: $("#search_by_select").val(),
                        }

                        //这里可以传对象
                    }
                });
            }
        };
        //搜索框点击事件
        $('#search_by_room_name_btn').on('click', function () {
            var type = $(this).data('type');
            active[type] ? active[type].call(this) : '';
        });

        //监听行工具事件
        table.on('tool(test)', function (obj) {
            var data = obj.data;
            if (obj.event === 'edit') {
                if ($("#i_room").text() !== '未安排宿舍') {
                    layer.msg("您已经被安排了宿舍,不要重复申请", {icon: 2, offset: 't', time: 1000})
                } else {
                    $.get("/room-request/new?studentId=" + $("#student_id").val() + "&" + "roomId=" + data.id, function (resp) {
                        if (resp.code === 0) {
                            layer.msg("申请发送成功", {icon: 1, offset: 't', time: 2000});
                        } else {
                            layer.msg("申请发送失败", {icon: 2, offset: 't', time: 2000});
                        }
                    });
                }
            }
        });
    });
</script>

</body>

</html>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值