• 基于javaweb+mysql的+JPA学生宿舍学生住宿申请管理系统(管理员、学生)


    基于javaweb+mysql的+JPA学生宿舍学生住宿申请管理系统(管理员、学生)

    运行环境

    Java≥8、MySQL≥5.7

    开发工具

    eclipse/idea/myeclipse/sts等均可配置运行

    适用

    课程设计,大作业,毕业设计,项目练习,学习演示等

    功能说明

    后台管理员:管理用户、学生、班级、宿舍、处理住宿申请、分配宿舍

    前台学生:查询宿舍、申请宿舍

    后台管理员:

    前台学生:

    技术框架

    JSP JavaScript SpringBoot SpringDataJPA thymeleaf MySQL HTML


    适用

    课程设计,大作业,毕业设计,项目练习,学习演示等

                <div class="search" style="padding-top: 10px;">
                    <div class="layui-form layui-form-item layui-inline" style="margin-bottom: 0">
                        <input type="text" id="q_student_id" placeholder="请输入学号" autocomplete="off" class="layui-input">
                    div>
                    <div class="layui-form layui-form-item layui-inline" style="margin-bottom: 0">
                        <input type="text" id="q_key_word" placeholder="请输入姓名或其它关键词" autocomplete="off" class="layui-input">
                    div>
                    <div class="layui-form layui-form-item layui-inline" style="margin-bottom: 0">
                        <select id="q_teaching_class_id" lay-filter="teachingClasses">
                            <option value="" selected="">不限班级option>
                            <option th:each="teachingClass : ${teachingClasses}"
                                    th:value="${teachingClass.id}"
                                    th:text="${teachingClass.name}"
                                    value="">
                            option>
                        select>
                    div>
                    <div class="layui-form layui-form-item layui-inline" style="margin-bottom: 0">
                        <select id="q_query_type" lay-filter="">
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
        <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">
        
        <link rel="stylesheet" href="../../static/lib/layui/css/layui.css" th:href="@{/lib/layui/css/layui.css}"
              media="all">
        
        <link rel="stylesheet" href="../../static/css/common.css" th:href="@{/css/common.css}">
    head>
    <body class="layui-layout-body">
    <div class="layui-layout layui-layout-admin">
        
        <div th:replace="admin/_fragments :: admin-header" class="layui-header">
            <a href="javascript:void(0)">
                <div id="l-logo" class="layui-logo">学生住宿管理系统div>
            a>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
                    a>
                    <dl class="layui-nav-child">
                        <dd><a href="/user">个人中心a>dd>
                    dl>
                li>
                <li class="layui-nav-item"><a href="/logout">安全退出a>li>
            ul>
        div>
        
        <div th:replace="admin/_fragments :: admin-menu" id="div_side_bg" class="layui-side layui-bg-black">
            <div class="layui-side-scroll">
                
                <ul class="layui-nav layui-nav-tree" lay-filter="nav-dom">
                    <li class="layui-nav-item">
                        <a class="" href="javascript:void(0)">系统管理a>
                        <dl class="layui-nav-child">
                            <dd><a href="javascript:void(0)" th:href="@{/admin/user-list}">用户列表a>dd>
                            
                        dl>
                    li>
                    <li class="layui-nav-item">
                        <a href="javascript:void(0)">学生管理a>
                        <dl class="layui-nav-child">
                            <dd><a href="javascript:void(0)" th:href="@{/admin/student-list}">学生列表a>dd>
                            <dd><a href="javascript:void(0)" th:href="@{/admin/teaching-class-list}">教学班级a>dd>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
        public String toAdminRoomRequestList(Model model) {
            model.addAttribute("statuses", roomRequestService.listAllStatuses());
            return "admin/room-request-list"; // Thymeleaf模板的名字,表示 templates/admin/room-request-list.html
        }
    
        @ApiOperation("ajax:分页查询住宿申请信息")
        @RequestMapping(value = "/admin/room-requests", method = {RequestMethod.POST})
        @ResponseBody
        public Page<RoomRequest> fetchPage(@RequestBody PageRequest pageRequest) {
            return roomRequestService.fetchPage(pageRequest);
        }
    
        @ApiOperation("ajax:根据id查询住宿申请")
        @GetMapping("/admin/room-request/{id}")
        @ResponseBody
        public RoomRequest getRoomRequestById(@PathVariable Long id) {
            return roomRequestService.getRoomRequestById(id);
        }
    
        @ApiOperation("跳转到住宿申请编辑界面")
        @GetMapping("/admin/room-request/edit")
        public String toEditRoomRequestById(@RequestParam(defaultValue = "-1") long id, Model model) {
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
                var data = obj.data;
                if (obj.event === 'del') {
                    layer.confirm("确定要删除名称为" + data.name + "的寝室吗?", {icon: 0, title: '提示'}, function (index) {
                        deleteByIds(data.id);
                        layer.close(index);
                    });
                } else if (obj.event === 'edit') {
                    window.location.href = "/admin/room/edit?id=" + data.id;
                }
            });
        });
    script>
    body>
    html>
    DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head th:replace="admin/_fragments :: head(~{::title})">
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
                <div style="margin-top: 10px">
                    <span class="layui-breadcrumb" lay-separator=" | ">
                    <a href="/admin/index">首页a>
                    <a href="/admin/room-request-list">住宿申请a>
                    span>
                div>
                <div class="search" style="padding-top: 10px;">
                    <div class="display-none layui-form layui-form-item layui-inline" style="margin-bottom: 0">
                        <input type="text" id="q_room-request_id" placeholder="请输入ID" autocomplete="off"
                               class="layui-input">
                    div>
                    <div class="layui-form layui-form-item layui-inline" style="margin-bottom: 0">
                        <input type="text" id="q_key_word" placeholder="请输入关键词" autocomplete="off" class="layui-input">
                    div>
                    <div class="layui-form layui-form-item layui-inline" style="margin-bottom: 0">
                        <select id="q_status_id" lay-filter="statuses">
                            <option value="" selected="">不限状态option>
                            <option th:each="status : ${statuses}"
                                    th:value="${status.code}"
                                    th:text="${status.message}"
                                    value="">
                            option>
                        select>
                    div>
                    <div class="layui-form layui-form-item layui-inline" style="margin-bottom: 0">
                        <select id="q_query_type" lay-filter="">
                            <option value="0" selected="">模糊查询option>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
                        layer.msg("删除成功", {icon: 1, offset: 'c', time: 800});
                        window.location.reload();
                    } else {
                        layer.msg("删除失败", {icon: 2, offset: 'c', time: 1000});
                    }
                });
            }
            // 为表格配置查询条件
            var active = {
                reload: function () {
                    //执行重载
                    table.reload('table_id', {
                        page: {
                            curr: 1 //重新从第 1 页开始
                        },
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
            } else {
                // 新增,同时创建一个用户名和密码都是学号的用户
                val user = new User();
                user.setUsername(student.getId());
                user.setPassword(student.getId());
                val role = new Role();
                role.setId(1L); // 1表示学生
                user.setRole(role);
                val result = userService.saveUser(user);
                if (result.isSuccess()) {
                    student.setUser(result.getValue());
                    return success(studentDao.save(student));
                } else {
                    return failure("创建用户失败");
                }
            }
        }
    
        @Override
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
                        <select id="q_query_type" lay-filter="">
                            <option value="0" selected="">模糊查询option>
                            <option value="1">精确查询option>
                        select>
                    div>
                    <button class="layui-btn layui-icon layui-icon-search" id="search_btn" data-type="reload">button>
                div>
                <table class="layui-hide" id="data-table" lay-filter="data-table">table>
            div>
            <div hidden id="info" th:text="${#strings.isEmpty(info)?'':info}">div>
            <div hidden id="error" th:text="${#strings.isEmpty(error)?'':error}">div>
        div>
        <div th:replace="admin/_fragments :: admin-footer" class="layui-footer" id="sdms-footer">div>
    div>
    
    <script src="../../static/js/footer.js" th:src="@{/js/footer.js}">script>
    
    <script src="../../static/lib/jQuery/jquery-3.5.1.min.js" th:src="@{/lib/jQuery/jquery-3.5.1.min.js}">script>
    
    <script src="../../static/lib/cookie/js.cookie-2.2.1.min.js" th:src="@{/lib/cookie/js.cookie-2.2.1.min.js}">script>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    import com.demo.common.result.LayuiResult;
    import com.demo.entity.User;
    import com.demo.service.RoleService;
    import com.demo.service.UserService;
    import io.swagger.annotations.Api;
    import io.swagger.annotations.ApiOperation;
    import lombok.val;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.servlet.mvc.support.RedirectAttributes;
    
    import javax.annotation.Resource;
    
    @Api("用户相关api")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    import org.apache.shiro.authc.IncorrectCredentialsException;
    import org.apache.shiro.authc.UnknownAccountException;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.springframework.stereotype.Service;
    
    import javax.annotation.Resource;
    import java.util.Collection;
    
    import static com.demo.common.result.OperationResult.failure;
    import static com.demo.common.result.OperationResult.success;
    import static com.demo.common.util.BeanUtils.copyProperties;
    import static com.demo.common.util.BeanUtils.getNullPropertyNames;
    import static com.demo.common.util.StringUtils.isBlankOrNull;
    import static com.demo.common.util.StringUtils.parseLong;
    import static com.demo.common.util.StringUtils.trimAllWhitespace;
    
    @Slf4j
    @Service
    public class UserServiceImpl implements UserService {
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
                    <div class="layui-form layui-form-item layui-inline" style="margin-bottom: 0">
                        <select id="q_category_id" lay-filter="categories">
                            <option value="" selected="">不限类型option>
                            <option th:each="category : ${categories}"
                                    th:value="${category.id}"
                                    th:text="${category.name}"
                                    value="">
                            option>
                        select>
                    div>
                    <div class="layui-form layui-form-item layui-inline" style="margin-bottom: 0">
                        <select id="q_query_type" lay-filter="">
                            <option value="0" selected="">模糊查询option>
                            <option value="1">精确查询option>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
        <div th:replace="admin/_fragments :: admin-footer" class="layui-footer" id="sdms-footer">div>
    div>
    
    <script src="../../static/js/footer.js" th:src="@{/js/footer.js}">script>
    
    <script src="../../static/lib/jQuery/jquery-3.5.1.min.js" th:src="@{/lib/jQuery/jquery-3.5.1.min.js}">script>
    
    <script src="../../static/lib/cookie/js.cookie-2.2.1.min.js" th:src="@{/lib/cookie/js.cookie-2.2.1.min.js}">script>
    
    <script src="../../static/lib/layui/layui.js" th:src="@{/lib/layui/layui.js}">script>
    
    <script src="../../static/js/common.js" th:src="@{/js/common.js}">script>
    <script type="text/html" id="toolbar">
        <div class="layui-btn-container">
            <button class="layui-btn layui-btn-sm" lay-event="create">添加用户</button>
            <button class="layui-btn layui-btn-danger layui-btn-sm" lay-event="deleteBatch">批量删除</button>
        </div>
    script>
    <script type="text/html" id="rowBar">
        <a class="layui-btn layui-btn-xs" lay-event="edit">编辑a>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
        public OperationResult<TeachingClass> saveTeachingClass(TeachingClass teachingClass) {
            if (teachingClass == null) {
                return failure("班级为null");
            }
            val name = teachingClass.getName();
            if (isBlankOrNull(name)) {
                return failure("班级名称不可以为空或者空白串");
            }
            return success(teachingClassDao.save(teachingClass));
        }
    
        @Override
        public OperationResult<String> deleteTeachingClassByIds(Collection<Long> ids) {
            try {
                teachingClassDao.deleteTeachingClassesByIdIn(ids);
            } catch (Exception e) {
                log.error("班级删除失败,ids=" + ids + ",error is " + e.getMessage());
                return failure("删除失败");
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
                                    class="layui-badge"
                                    th:text="${session.noHandleCount==null?'0':session.noHandleCount}">6span>a>dd>
                            <dd><a href="javascript:void(0)" th:href="@{/admin/allocation-list}">宿舍分配详情a>dd>
                        dl>
                    li>
                ul>
            div>
        div>
        <div class="layui-body">
            
            <div style="width: 94%;height:92%; margin:auto">
                
                <div style="margin-top: 10px">
                    <span class="layui-breadcrumb" lay-separator=" | ">
                    <a href="/admin/index">首页a>
                    <a href="/admin/student-list">学生列表a>
                    span>
                div>
                <div class="search" style="padding-top: 10px;">
                    <div class="layui-form layui-form-item layui-inline" style="margin-bottom: 0">
                        <input type="text" id="q_student_id" placeholder="请输入学号" autocomplete="off" class="layui-input">
                    div>
                    <div class="layui-form layui-form-item layui-inline" style="margin-bottom: 0">
                        <input type="text" id="q_key_word" placeholder="请输入姓名或其它关键词" autocomplete="off" class="layui-input">
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    
    <script src="../../static/js/footer.js" th:src="@{/js/footer.js}">script>
    
    <script src="../../static/lib/jQuery/jquery-3.5.1.min.js" th:src="@{/lib/jQuery/jquery-3.5.1.min.js}">script>
    
    <script src="../../static/lib/cookie/js.cookie-2.2.1.min.js" th:src="@{/lib/cookie/js.cookie-2.2.1.min.js}">script>
    
    <script src="../../static/lib/layui/layui.js" th:src="@{/lib/layui/layui.js}">script>
    
    <script src="../../static/js/common.js" th:src="@{/js/common.js}">script>
    <script type="text/html" id="toolbar">
        <div class="layui-btn-container">
            <button class="layui-btn layui-btn-sm" lay-event="create">添加用户button>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述

  • 相关阅读:
    sourceTree中的git rebase变基操作
    2011年下半年 系统架构设计师 下午试卷 II
    Apollo安装
    redis我记不住的那些命令(五)
    TensorFlow 与pytorch
    8.Java数组
    详谈Web3与品牌如何推动下一轮牛市
    football 篮球数据集-目标检测548张
    【图论经典题目讲解】CF715B - Complete The Graph
    NX二次开发-UFUN获取对象的显示属性(图层,颜色,空白状态,线宽,字体,高亮状态)UF_OBJ_ask_display_properties
  • 原文地址:https://blog.csdn.net/m0_68551656/article/details/127741790