基于Java+Mysql实现(WEB)宿舍管理系统

news2024/11/22 23:41:43

数据库实践课程之宿舍管理系统

一、系统需求分析

1.1 系统描述

随着社会的发展以及教育水平的提高,当今社会在校生的数量越来越庞大,使用传统的方式对学生的信息进行管理效率非常低下。在互联网技术高度发达的今天,使用数据库技术对学生的住宿信息进行管理能够使学校对学生信息的管理更加的高效,检索迅速,查找方便,可靠性高,存储量大。此外,使用数据库技术可以使得学生信息出错的可能性大大降低,还可以使学生住宿信息长时间稳定地保存,不易丢失。可见,开发出这样的一个数据库具有很强的显示意义。

1.2 数据存储需求

宿舍管理系统数据库需要存储如下信息:

  • 系统管理员的用户名,密码,真实姓名,性别,电话;
  • 宿管老师的的用户名,密码,真实姓名,性别,电话;
  • 学生的学号,用户名,密码,真实姓名,院系信息,性别,电话;
  • 宿舍楼的名称,类型;
  • 寝室的名称,大小,现居人数;
  • 学生缺寝的日期,原因,登记老师是谁;
  • 学生的当前状态(入住还是迁出),以及相应的登记时间。

各种数据之间的关系:

  • 寝室与学生是一对多的关系,一个寝室下可有多名学生;
  • 宿舍楼与寝室是一对多的关系,一栋宿舍楼下可有多个寝室;
  • 宿管老师与宿舍楼是多对多的关系,一个宿管老师可以负责多个宿舍楼,一个宿舍楼也可以由多个宿管老师负责;
  • 宿管老师与学生是多对多的关系,一个宿管老师可以负责多个学生的缺寝情况,一个学生也可以由多个宿管老师负责登记缺寝信息;
  • 系统管理员可以获取所有的数据信息,拥有最高的权限。

1.3 系统常做的查询与更新

经常做的查询,或许对创建索引有影响的:

  • 根据学生的入住状态,姓名,学号,院系,查询学生相关信息
  • 根据宿管老师的姓名,电话,查询宿管老师相关信息
  • 根据宿舍楼的名称,查询宿舍楼相关信息
  • 根据寝室所在楼宇,寝室号,寝室大小,现有人数,查询寝室相关信息

根据经常做的查询,需要创建有关视图的:

  • 学生信息 + 寝室信息视图
  • 宿舍楼信息 + 寝室信息视图

关于更新

  • 当有学生入住某一寝室时,需要使相应的寝室现有人数加一
  • 当有学生迁出某一寝室时,需要使相应的寝室现有人数减一
  • 当有学生调换寝室时,需要使原本的寝室现有人数减一,新的寝室现有人数加一
  • 学生只能入住还有空余位置的寝室

关于删除

  • 当删除某一寝室时,其中不能有学生入住

1.4 应用程序功能

前台的主要功能如下:

对于学生:

  • 登录以及退出系统。
  • 每个学生可以查看自己的缺寝记录。

对于宿管老师:

  • 登录以及退出系统。
  • 每个宿管老师可以查看自己负责的宿舍楼中学生的基本信息以及缺寝记录。

对于系统管理员:

  • 登录以及退出系统。
  • 查看宿管老师的基本信息。
  • 查看学生的基本信息以及缺寝记录。
  • 查看宿舍楼的基本信息。
  • 查看寝室的基本信息。

后台的主要功能如下:

对于学生:

  • 可以修改自己的密码。

对于宿管老师:

  • 可以修改自己的密码。
  • 可以对自己负责的宿舍楼中的学生添加缺寝记录。

对于系统管理员:

  • 可以修改自己的密码。
  • 可以添加,修改,删除宿管老师。
  • 可以添加新入住的学生,修改学生的基本信息,删除指定的学生。
  • 可以添加新的宿舍楼,修改宿舍楼的基本信息,查看每栋宿舍楼的负责老师,也可添加或移除每栋楼的负责老师。
  • 可以添加新的寝室,修改寝室的基本信息,删除指定的寝室。
  • 可以安排指定学生的寝室调换。
  • 可以迁出已经毕业的学生。
  • 可以查看所有指定学生的缺寝记录。

二、数据库概念设计

2.1 确定实体和属性

分析宿舍管理系统的系统需求,将系统中设计的人、物进行抽象,得到了系统的实体如下:

  • 系统管理员实体集。属性包括:管理员 ID,用户名,登录密码,真实姓名,性别,电话。
  • 宿管老师实体集。属性包括:宿管老师 ID,用户名,登录密码,真实姓名,性别,电话。
  • 学生实体集。属性包括:学生 ID 即学号,用户名,登录密码,真实姓名,院系信息,性别,电话。
  • 宿舍楼实体集。属性包括:宿舍楼 ID,宿舍楼名称,宿舍楼类型。
  • 寝室实体集。属性包括:寝室 ID,寝室名称,寝室大小,寝室现有人数。

2.2 E-R 图

系统 E-R 图如图 2-1 所示:

图 2-1 E-R 图

三、数据库逻辑结构设计

3.1 关系模式设计

根据概念结构设计得到的 E-R 图和转换规则,得到如下关系模式(主键用下划线标出,外键用蓝色标志并予以说明):

  • 系统管理员表(管理员 ID,用户名,登录密码,真实姓名,性别,电话)
  • 宿管老师表(宿管老师 ID,用户名,登录密码,真实姓名,性别,电话)
  • 学生表(学生 ID 即学号,用户名,登录密码,真实姓名,院系信息,性别,电话)
  • 宿舍楼表(宿舍楼 ID,宿舍楼名称,宿舍楼类型)
  • 寝室表(寝室 ID,寝室名称,寝室大小,寝室现有人数)
  • 缺寝记录表(缺寝记录 ID,被登记学生的 ID,登记老师的 ID,登记日期,缺寝原因)
  • 宿舍楼-寝室表(宿舍楼-寝室对 ID,宿舍楼 ID,寝室 ID)
  • 宿舍楼-教师表(宿舍楼-教师对 ID,宿舍楼 ID,教师 ID)
  • 寝室-学生表(寝室-学生对 ID,寝室 ID,学生 ID,学生入住状态,登记日期)

3.2 基本表设计

基本表设计如表 3-1~3-9 所示。

表 3-1:系统管理员表的设计

属性名数据类型是否可空列约束默认值解释
Admin_IDint主键管理员 ID
Admin_Usernamevarchar(30)unique用户名
Admin_Passwordvarchar(30)密码
Admin_Namevarchar(30)真实姓名
Admin_Sexvarchar(10)“男”或“女”性别
Admin_Telvarchar(30)电话

表 3-2:宿管老师表的设计

属性名数据类型是否可空列约束默认值解释
Teacher_IDint主键宿管老师 ID
Teacher _Usernamevarchar(30)unique用户名
Teacher _Passwordvarchar(30)密码
Teacher _Namevarchar(30)真实姓名
Teacher _Sexvarchar(10)“男”或“女”性别
Teacher _Telvarchar(30)电话

表 3-3:学生表的设计

属性名数据类型是否可空列约束默认值解释
Student_IDint主键学生 ID
Student _Usernamevarchar(30)unique用户名
Student _Passwordvarchar(30)密码
Student _Namevarchar(30)真实姓名
Student _Sexvarchar(10)“男”或“女”性别
Student _Telvarchar(30)电话
Student_Deptvarchar(30)院系

表 3-4:宿舍楼表的设计

属性名数据类型是否可空列约束默认值解释
Building_IDint主键宿舍楼 ID
Building _Namevarchar(30)名称
Building _Typevarchar(30)“男生宿舍”或“女生宿舍”类型

表 3-5:寝室表的设计

属性名数据类型是否可空列约束默认值解释
Dormitory_IDint主键寝室 ID
Dormitory _Namevarchar(30)名称
Dormitory _Sizeint大小
Dormitory_Nowint0现有人数

表 3-6:缺寝记录表的设计

属性名数据类型是否可空列约束默认值解释
Log_IDint主键ID
Log _StudentIDint外键参考学生表学生 ID
Log _TeacherIDint外键参考宿管老师表老师 ID
Log _Datevarchar(30)登记日期
Log_Reasonvarchar(255)缺寝原因

表 3-7:宿舍楼-寝室表的设计

属性名数据类型是否可空列约束默认值解释
DB_IDint主键ID
DB_DormitoryIDint外键参考寝室表寝室 ID
DB_BuildingIDint外键参考宿管老师表宿舍楼 ID

表 3-8:宿舍楼-教师表的设计

属性名数据类型是否可空列约束默认值解释
TB_IDint主键ID
TB_TeacherIDint外键参考宿管老师表教师 ID
TB_BuildingIDint外键参考宿舍楼表宿舍楼 ID

表 3-9:寝室-学生表的设计

属性名数据类型是否可空列约束默认值解释
SD_IDint主键ID
SD_StudentIDint外键参考宿管老师表教师 ID
SD_DormitoryIDint外键参考宿舍楼表宿舍楼 ID
SD_Statevarchar(30)“入住”或“迁出”学生入住状态
SD_Datevarchar(30)登记日期

四、数据库物理设计和实施

4.1 数据库的创建

使用 Navicat for MySQL 建立寝室管理系统的数据库,数据库基本信息如下:

表 4-1:寝室管理系统的数据库参数表

选项参数
数据库名称dormitory
物理文件名dormitory.sql

4.2 创建基本表

CREATE TABLE `admin` (
    `Admin_ID` int(11) NOT NULL AUTO_INCREMENT,
    `Admin_Username` varchar(30) NOT NULL,
    `Admin_Password` varchar(30) NOT NULL,
    `Admin_Name` varchar(30) NOT NULL,
    `Admin_Sex` varchar(10) DEFAULT NULL,
    `Admin_Tel` varchar(30) DEFAULT '',
    PRIMARY KEY (`Admin_ID`),
    UNIQUE KEY `Admin_Username` (`Admin_Username`)
    ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;
    CREATE TABLE `building` (
        `Building_ID` int(11) NOT NULL AUTO_INCREMENT,
        `Building_Name` varchar(30) NOT NULL,
        `Building_Type` varchar(30) NOT NULL,
        PRIMARY KEY (`Building_ID`)
        ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4;
        CREATE TABLE `dormitory` (
            `Dormitory_ID` int(11) NOT NULL AUTO_INCREMENT,
            `Dormitory_Name` varchar(30) NOT NULL,
            `Dormitory_Size` int(11) NOT NULL,
            `Dormitory_Now` int(10) unsigned zerofill NOT NULL DEFAULT '0000000000',
            PRIMARY KEY (`Dormitory_ID`)
            ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4;
            CREATE TABLE `dor_bui` (
                `DB_ID` int(11) NOT NULL AUTO_INCREMENT,
                `DB_DormitoryID` int(11) NOT NULL,
                `DB_BuildingID` int(11) NOT NULL,
                PRIMARY KEY (`DB_ID`),
                KEY `DB_DormitoryID` (`DB_DormitoryID`),
                KEY `DB_BuildingID` (`DB_BuildingID`),
                CONSTRAINT `dor_bui_ibfk_1` FOREIGN KEY (`DB_DormitoryID`) REFERENCES `dormitory` (`Dormitory_ID`) ON DELETE CASCADE ON UPDATE CASCADE,
                CONSTRAINT `dor_bui_ibfk_2` FOREIGN KEY (`DB_BuildingID`) REFERENCES `building` (`Building_ID`) ON DELETE CASCADE ON UPDATE CASCADE
                ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4;
                CREATE TABLE `log` (
                    `Log_ID` int(11) NOT NULL AUTO_INCREMENT,
                    `Log_StudentID` int(11) NOT NULL,
                    `Log_Date` varchar(30) NOT NULL,
                    `Log_Reason` varchar(255) NOT NULL,
                    `Log_TeacherID` int(11) DEFAULT NULL,
                    PRIMARY KEY (`Log_ID`),
                    KEY `absence_ibfk_1` (`Log_StudentID`),
                    KEY `Log_TeacherID` (`Log_TeacherID`),
                    CONSTRAINT `log_ibfk_1` FOREIGN KEY (`Log_StudentID`) REFERENCES `student` (`Student_ID`) ON DELETE CASCADE ON UPDATE CASCADE,
                    CONSTRAINT `log_ibfk_2` FOREIGN KEY (`Log_TeacherID`) REFERENCES `teacher` (`Teacher_ID`)
                    ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4;
                    CREATE TABLE `student` (
                        `Student_ID` int(11) NOT NULL AUTO_INCREMENT,
                        `Student_Username` varchar(30) NOT NULL,
                        `Student_Password` varchar(30) NOT NULL,
                        `Student_Name` varchar(30) NOT NULL,
                        `Student_Dept` varchar(30) DEFAULT NULL,
                        `Student_Tel` varchar(30) DEFAULT NULL,
                        `Student_Sex` varchar(10) DEFAULT NULL,
                        PRIMARY KEY (`Student_ID`),
                        UNIQUE KEY `Student_Username` (`Student_Username`)
                        ENGINE=InnoDB AUTO_INCREMENT=71 DEFAULT CHARSET=utf8mb4;
                        CREATE TABLE `stu_dor` (
                            `SD_ID` int(11) NOT NULL AUTO_INCREMENT,
                            `SD_StudentID` int(11) NOT NULL,
                            `SD_DormitoryID` int(11) NOT NULL,
                            `SD_State` varchar(30) NOT NULL,
                            `SD_Date` varchar(30) NOT NULL,
                            PRIMARY KEY (`SD_ID`),
                            KEY `SD_StudentID` (`SD_StudentID`),
                            KEY `SD_DormitoryID` (`SD_DormitoryID`),
                            CONSTRAINT `stu_dor_ibfk_1` FOREIGN KEY (`SD_StudentID`) REFERENCES `student` (`Student_ID`) ON DELETE CASCADE ON UPDATE CASCADE,
                            CONSTRAINT `stu_dor_ibfk_2` FOREIGN KEY (`SD_DormitoryID`) REFERENCES `dormitory` (`Dormitory_ID`) ON DELETE CASCADE ON UPDATE CASCADE
                            ENGINE=InnoDB AUTO_INCREMENT=72 DEFAULT CHARSET=utf8mb4;
                            CREATE TABLE `teacher` (
                                `Teacher_ID` int(11) NOT NULL AUTO_INCREMENT,
                                `Teacher_Username` varchar(30) NOT NULL,
                                `Teacher_Password` varchar(30) NOT NULL,
                                `Teacher_Name` varchar(30) NOT NULL,
                                `Teacher_Sex` varchar(10) DEFAULT NULL,
                                `Teacher_Tel` varchar(30) DEFAULT NULL,
                                PRIMARY KEY (`Teacher_ID`),
                                UNIQUE KEY `Teacher_Username` (`Teacher_Username`)
                                ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4;
                                CREATE TABLE `tea_bui` (
                                    `TB_ID` int(11) NOT NULL AUTO_INCREMENT,
                                    `TB_TeacherID` int(11) NOT NULL,
                                    `TB_BuildingID` int(11) NOT NULL,
                                    PRIMARY KEY (`TB_ID`),
                                    KEY `tea_bui_ibfk_1` (`TB_TeacherID`),
                                    KEY `tea_bui_ibfk_2` (`TB_BuildingID`),
 CONSTRAINT `tea_bui_ibfk_1` FOREIGN KEY (`TB_TeacherID`) REFERENCES `teacher` (`Teacher_ID`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `tea_bui_ibfk_2` FOREIGN KEY (`TB_BuildingID`) REFERENCES `building` (`Building_ID`) ON DELETE CASCADE ON UPDATE CASCADE
ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4;

4.3 触发器设计

当有新的学生入住时,对应的寝室现有人数要加一:

CREATE TRIGGER stu_dor_insert_after_trigger after insert
ON stu_dor FOR EACH ROW
BEGIN
update dormitory set Dormitory_Now=Dormitory_Now+1 where Dormitory_ID=new.SD_DormitoryID;
end;

4.4 视图设计

学生信息 + 寝室信息视图:

create view stu_dor_view as
select * from Student, stu_dor, Dormitory
where SD_StudentID=Student_ID and SD_DormitoryID=Dormitory_ID;

宿舍楼信息 + 寝室信息视图:

create view dor_bui_view as
select * from Dormitory,Building,dor_bui where Dormitory_ID=DB_DormitoryID and Building_ID=DB_BuildingID;

五、应用程序设计

5.1 开发及运行环境介绍

  • 系统使用的开发工具是 MyEclipse 2017,Navicat for MySQL
  • 运行环境是 Tomcat v8.5
  • 开发采用 Struts2 + JavaBean + JSP + MySQL 的实现方式
  • 测试浏览器为 Chrome 和 MyEclipse 内置浏览器

5.2 主要功能设计

  • 登录身份共有三种:系统管理员,宿管老师,学生。输入用户名、密码和身份之后,判断是否和数据库中记录相符。如果用户名和密码正确,那么根据不同身份进入不同子界面。其中用到的权限控制代码段如下:
public String execute() throws Exception {
    if(Type.equals("系统管理员"))
    {
        if (null == new AdminDao().CheckLogin(Username, Password)) {
            Msg = "用户名或者密码错误";
            return INPUT;
        }
        else
        {
//获取ID
            String Admin_ID = new AdminDao().CheckLogin(Username, Password);
//创建session
            HttpSession session = ServletActionContext.getRequest().getSession();
            session.setAttribute("id", Admin_ID);
            session.setAttribute("type", "1");
            return SUCCESS;
        }
    }
    else if(Type.equals("宿管老师"))
    {
        if (null == new TeacherDao().CheckLogin(Username, Password)) {
            Msg = "用户名或者密码错误";
            return INPUT;
        }
        else
        {
//获取ID
            String Teacher_ID=new TeacherDao().CheckLogin(Username, Password);
//创建session
            HttpSession session = ServletActionContext.getRequest().getSession();
            session.setAttribute("id", Teacher_ID);
            session.setAttribute("type", "2");
            return SUCCESS;
        }
    }
    else if(Type.equals("学生"))
    {
        if (null == new StudentDao().CheckLogin(Username, Password)) {
            Msg = "用户名或者密码错误";
            return INPUT;
        }
        else
        {
//获取ID
            String Student_ID=new StudentDao().CheckLogin(Username, Password);
//创建session
            HttpSession session = ServletActionContext.getRequest().getSession();
            session.setAttribute("id", Student_ID);
            session.setAttribute("type", "3");
            return SUCCESS;
        }
    }
    else
    {
        Msg = "身份类型错误";
        return INPUT;
    }
}
  • 管理员界面提供各种增删改查功能,针对的对象包括学生,宿管老师,宿舍楼,寝室。点击各个功能后会进入对应的子界面。输入需要的参数之后,点击按钮即可完成操作。
<%if(session.getAttribute("type").toString().equals("1")) {
    %>
    <li><a href="TeacherManager.action">宿管老师管理</a></li>
                <li><a href="StudentManager.action">学生管理</a></li>
                            <li><a href="BuildingManager.action">楼宇管理</a></li>
                                        <li><a href="DormitoryManager.action">宿舍管理</a></li>
                                                <li><a href="StudentRZ.action">学生入住登记</a></li>
                                                        <li><a href="StudentDH.jsp">学生寝室调换</a></li>
                                                                <li><a href="StudentQC.jsp">学生迁出登记</a></li>
                                                                        <li><a href="AdminLog.action">学生缺寝记录</a></li>
                                                                                <%
}%>
  • 教师界面和管理员类似,不过只提供了对学生缺寝记录的添加和查询操作。
<%if(session.getAttribute("type").toString().equals("2")) {
    %>
    <li><a href="MyStudent.action">学生管理</a></li>
                <li><a href="MyLog.action">学生缺寝记录</a></li>
                            <%
}%>
  • 学生界面只提供了查询自己缺寝记录的功能。
<%if(session.getAttribute("type").toString().equals("3")) {
    %>
    <li><a href="StudentLog.action">我的缺寝记录</a></li>
                <%
}%>
  • 下面展示关于教师增删改查的代码,其余类似:
//获取列表
public List<TeacherBean> GetList(String strwhere,String strorder) {
    String sql="select * from Teacher";
    if(!(isInvalid(strwhere)))
    {
        sql+=" where "+strwhere;
    }
    if(!(isInvalid(strorder)))
    {
        sql+=" order by "+strorder;
    }
    Statement stat = null;
    ResultSet rs = null;
    Connection conn = new DBHelper().getConn();
    List<TeacherBean> list=new ArrayList<TeacherBean>();
    try {
        stat = conn.createStatement();
        rs = stat.executeQuery(sql);
        while(rs.next()) {
            TeacherBean cnbean=new TeacherBean();
            cnbean.setTeacher_ID(rs.getInt("Teacher_ID"));
            cnbean.setTeacher_Username(rs.getString("Teacher_Username"));
            cnbean.setTeacher_Password(rs.getString("Teacher_Password"));
            cnbean.setTeacher_Name(rs.getString("Teacher_Name"));
            cnbean.setTeacher_Sex(rs.getString("Teacher_Sex"));
            cnbean.setTeacher_Tel(rs.getString("Teacher_Tel"));
            list.add(cnbean);
        }
    } catch (SQLException e) {
        printStackTrace();
    }
    finally {
        try {
            if (conn != null)
                conn.close();
            if (stat != null)
                stat.close();
            if (rs != null)
                rs.close();
        } catch (SQLException e) {
            printStackTrace();
        }
    }
    return list;
}
//获取指定ID的实体Bean
public TeacherBean GetBean(int id) {
    String sql="select * from Teacher where Teacher_ID="+id;
    Statement stat = null;
    ResultSet rs = null;
    Connection conn = new DBHelper().getConn();
    TeacherBean cnbean=new TeacherBean();
    try {
        stat = conn.createStatement();
        rs = stat.executeQuery(sql);
        while(rs.next()) {
            cnbean.setTeacher_ID(rs.getInt("Teacher_ID"));
            cnbean.setTeacher_Username(rs.getString("Teacher_Username"));
            cnbean.setTeacher_Password(rs.getString("Teacher_Password"));
            cnbean.setTeacher_Name(rs.getString("Teacher_Name"));
            cnbean.setTeacher_Sex(rs.getString("Teacher_Sex"));
            cnbean.setTeacher_Tel(rs.getString("Teacher_Tel"));
        }
    } catch (SQLException e) {
        printStackTrace();
    }
    finally {
        try {
            if (conn != null)
                conn.close();
            if (stat != null)
                stat.close();
            if (rs != null)
                rs.close();
        } catch (SQLException e) {
            printStackTrace();
        }
    }
    return cnbean;
}
//添加
public void Add(TeacherBean cnbean) {
    String sql="insert into Teacher (";
    sql+="Teacher_Username,Teacher_Password,Teacher_Name,Teacher_Sex,Teacher_Tel";
    sql+=") values(";
    sql+="'"+cnbean.getTeacher_Username()+"','"+cnbean.getTeacher_Password()+"','"+cnbean.getTeacher_Name()+"','"+cnbean.getTeacher_Sex()+"','"+cnbean.getTeacher_Tel()+"'";
    sql+=")";
    Statement stat = null;
    ResultSet rs = null;
    Connection conn = new DBHelper().getConn();
    try {
        stat = conn.createStatement();
        stat.executeUpdate(sql);
    } catch (SQLException e) {
        printStackTrace();
    }
    finally {
        try {
            if (conn != null)
                conn.close();
            if (stat != null)
                stat.close();
            if (rs != null)
                rs.close();
        } catch (SQLException e) {
            printStackTrace();
        }
    }
}
//修改
public void Update(TeacherBean cnbean) {
    String sql="update Teacher set ";
    sql+="Teacher_Username='"+cnbean.getTeacher_Username()+"',";
    sql+="Teacher_Password='"+cnbean.getTeacher_Password()+"',";
    sql+="Teacher_Name='"+cnbean.getTeacher_Name()+"',";
    sql+="Teacher_Sex='"+cnbean.getTeacher_Sex()+"',";
    sql+="Teacher_Tel='"+cnbean.getTeacher_Tel()+"'";
    sql+=" where Teacher_ID='"+cnbean.getTeacher_ID()+"'";
    Statement stat = null;
    ResultSet rs = null;
    Connection conn = new DBHelper().getConn();
    try {
        stat = conn.createStatement();
        stat.executeUpdate(sql);
    } catch (SQLException e) {
        printStackTrace();
    }
    finally {
        try {
            if (conn != null)
                conn.close();
            if (stat != null)
                stat.close();
            if (rs != null)
                rs.close();
        } catch (SQLException e) {
            printStackTrace();
        }
    }
}
//删除
public void Delete(String strwhere) {
    String sql="delete from Teacher where ";
    sql+=strwhere;
    Statement stat = null;
    ResultSet rs = null;
    Connection conn = new DBHelper().getConn();
    try {
        stat = conn.createStatement();
        stat.executeUpdate(sql);
    } catch (SQLException e) {
        printStackTrace();
    }
    finally {
        try {
            if (conn != null)
                conn.close();
            if (stat != null)
                stat.close();
            if (rs != null)
                rs.close();
        } catch (SQLException e) {
            printStackTrace();
        }
    }
}

5.3 主要界面

登录界面如图 5-1 所示。用户名或密码为空时点击登录会有提醒。登陆失败时也会有提醒如图 5-2 所示。

图 5-1 登陆界面

图 5-2 登陆失败界面

以管理员身份登录后的主界面如图 5-3 所示,左侧为导航栏:

图 5-3 管理员主界面

管理员可以查看宿管老师列表,如图 5-4 所示,有分页和模糊查询功能:

图 5-4 宿管老师列表界面

管理员可以添加宿管老师,如图 5-5 所示:

图 5-5 添加宿管老师界面

管理员可以修改宿管老师的基本信息,如图 5-6 所示:

图 5-6 修改宿管老师界面

删除宿管老师时,会弹出确认框,如图 5-7 所示:

图 5-7 删除宿管老师界面

管理员可以查看学生列表,如图 5-8 所示,有分页和模糊查询功能:

图 5-8 学生列表界面

管理员可以添加入住学生,如图 5-9 所示:

图 5-9 学生入住登记界面

管理员可以修改学生的基本信息,如图 5-10 所示:

图 5-10 修改学生界面

删除学生时,会弹出确认框,如图 5-11 所示:

图 5-11 删除学生界面

管理员可以查看宿舍楼列表,如图 5-12 所示,有分页和模糊查询功能:

图 5-12 宿舍楼列表界面

管理员可以添加宿舍楼,如图 5-13 所示:

图 5-13 添加宿舍楼界面

管理员可以查看负责某一宿舍楼的宿管老师,并能进行添加和删除操作,如图 5-14 所示:

图 5-14 宿舍楼负责老师列表界面

管理员可以修改宿舍楼的基本信息,如图 5-15 所示:

图 5-15 修改宿舍楼界面

管理员可以查看宿舍列表,如图 5-16 所示,有分页和模糊查询功能:

图 5-16 宿舍列表界面

管理员可以添加宿舍,如图 5-17 所示:

图 5-17 添加宿舍界面

管理员可以修改宿舍的基本信息,如图 5-18 所示:

图 5-18 修改宿舍界面

删除宿舍时,会弹出确认框,如图 5-19 所示:

图 5-19 删除宿舍界面

管理员可以调换学生的宿舍,如图 5-20,5-21 所示:

图 5-20 调换学生宿舍界面 1

图 5-21 调换学生宿舍界面 2

管理员可以迁出学生,如图 5-22,5-23 所示:

图 5-22 迁出学生界面 1

图 5-23 迁出学生界面 2

管理员可以查看学生的缺寝记录,如图 5-24,5-25 所示:

图 5-24 查看学生的缺寝记录界面 1

图 5-25 查看学生的缺寝记录界面 2

管理员可以修改自己的密码,如图 5-26 所示,宿管老师和学生也有同样的功能,后面不再赘述:

图 5-26 修改密码界面

管理员可以退出系统,如图 5-27 所示,宿管老师和学生也有同样的功能,后面不再赘述:

图 5-27 退出系统界面

以宿管老师身份登录后,可以进行学生管理,如图 5-28,5-29 所示,有分页和模糊查询功能:

图 5-28 学生管理界面 1

图 5-29 学生管理界面 2

宿管老师可以针对某一学生进行缺寝登记:

图 5-30 学生缺寝登记界面

宿管老师可以查看自己负责的学生的缺寝记录,如图 5-31,5-32 所示,有分页和模糊查询功能:

图 5-31 学生缺寝记录界面 1

图 5-32 学生缺寝记录界面 2

以学生身份登录后,可以查看自己的缺寝记录,有分页功能,如图 5-33 所示:

图 5-33 学生查看自己缺寝记录界面

六、心得体会

在设计数据库的过程中有遇到过问题。

首先,在设计阶段有非常多的数据项,当时觉得不好分类和处理,而且有很多的数据项和许多实体都有关系。最后通过将各个数据项进行归类,对于和多个实体之间都有关系的数据项可以建立一个关系表,从而完成归类。

接着,在添加数据的过程中,我忽略掉了数据的参照完整性,导致许多数据之间没有了关联性。后来我将数据进行了统一分析,保持所有的数据一致,解决了这个问题。但由于有了数据的参照完整性,又引来了新的问题,诸如:在删除宿舍楼时,应先要删除宿舍楼中的所有宿舍;在删除宿舍时,应先要迁出或删除宿舍中的所有学生,发现一开始在编写代码时没有考虑到这些问题,便在代码中加紧完善了相关的逻辑。

最后,每个表中的数据更改完成之后,更改后的数据会丢失找不到了。对于这个问题就解决办法为加入触发器,记录表中信息的修改前的值,成功解决问题。

经过这次实践,我得出了一个非常重要的结论:对于一个系统,数据库的设计是非常重要的,数据库设计决定了以后数据好不好维护。后期需求好不好展。同时也决定了系统的性能。一个坏的数据库设计一个功能点的改动可能会设计多张表的改动。一不小心可能就会引起数据的不一致。为了解决这些问题。在数据库设计之初就要考虑这些问题,以减少后期系统维护量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2130291.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Golang | Leetcode Golang题解之第400题第N位数字

题目&#xff1a; 题解&#xff1a; func findNthDigit(n int) int {d : 1for count : 9; n > d*count; count * 10 {n - d * countd}index : n - 1start : int(math.Pow10(d - 1))num : start index/ddigitIndex : index % dreturn num / int(math.Pow10(d-digitIndex-1)…

Redis高可用,Redis性能管理

文章目录 一&#xff0c;Redis高可用&#xff0c;Redis性能管理二&#xff0c;Redis持久化1.RDB持久化1.1触发条件&#xff08;1&#xff09;手动触发&#xff08;2&#xff09;自动触发 1.2 Redis 的 RDB 持久化配置1.3 RDB执行流程(1) 判断是否有其他持久化操作在执行(2) 父进…

Unity开发一个FPS游戏之五

这个系列的前几篇文章介绍了如何从头开始用Unity开发一个FPS游戏&#xff0c;感兴趣的朋友可以回顾一下。这个系列的文章如下&#xff1a; Unity开发一个FPS游戏_unity 模仿开发fps 游戏-CSDN博客 Unity开发一个FPS游戏之二_unity 模仿开发fps 游戏-CSDN博客 Unity开发一个F…

828华为云征文|华为云Flexus X服务器centos挂载新增的磁盘教程

华为云Flexus X服务器推荐公司、企事业单位及生产环境使用&#xff0c;特别注重安全和稳定性 &#x1f680;【828华为云盛典&#xff0c;Flexus X引领算力新纪元&#xff01;】&#x1f680; 在数字化转型的征途中&#xff0c;数据安全是企业最坚实的后盾。华为云Flexus X实例…

中关村科金推出得助音视频鸿蒙SDK,助力金融业务系统鸿蒙化提速

鸿蒙生态大势所趋&#xff0c;各种应用适配加速 近日&#xff0c;华为纯血鸿蒙系统&#xff08;HarmonyOS NEXT&#xff09;再度引发市场高度关注。据媒体消息&#xff0c;鸿蒙NEXT Beta版将在9月24日对Mate 60系列、X5系列、Pura70系列等16款旗舰机型进行推送&#xff0c;这已…

春招审核流程优化:Spring Boot系统设计

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理大学生入学审核系统的相关信息成为必然。开…

Arcgis实现面空间位置从东至西从南至北排序

效果 背景 工作项目中经常会遇到需要对网格进行编号,而编号是有一定原则的,比如空间位置从上到下从左到右,或者其它原则,那么都可以通过下面的方式来实现 1、准备数据 点shp文件,查看初始FID字段标注,目前是一个无序的状态 2、排序 字段选择空间字段,空间排序方法…

业务流程建模(BPM)的重要性及其应用

什么是业务流程建模&#xff08;BPM&#xff09;&#xff1f; 业务流程建模&#xff08;BPM&#xff09;是对企业内各项业务流程进行图形化描述的一种方法。它旨在通过可视化的方式帮助企业理解和分析现有的业务流程&#xff0c;从而发现潜在的问题并进行改进。BPM通常采用流程…

Linux学习-Docker文件系统

Overlayfs Overlayfs 是一种类似 aufs 的一种堆叠文件系统&#xff0c;于 2014 年正式合入 Linux-3.18 主线内核&#xff0c;目前其功能已经基本稳定&#xff08;虽然还存在一些特性尚未实现&#xff09;且被逐渐推广。 Overlayfs 是一种堆叠文件系统&#xff0c;它依赖并建立…

stm32 IIC总线busy解决方法

参考博客&#xff1a; https://blog.csdn.net/PP_hui/article/details/112229696 1------这是IIC的初始化代码&#xff1a; #include "i2c.h"/* USER CODE BEGIN 0 */ // #define __HAL_AFIO_REMAP_I2C1_ENABLE() AFIO_REMAP_ENABLE(AFIO_MAPR_I2C1_REMAP) /* USE…

最新Open-vocabulary方法个人学习小结

Open-vocabulary方法总结 Yolo-world CVPR2024 预训练公式&#xff1a;区域-文本对 传统的目标检测方法&#xff0c;包括yolo系列都是用实例注释进行训练的&#xff0c;它由边界框和类别标签组成。 在本文中&#xff0c;我们将实例注释重新表述为区域-文本对。具体来说&#…

2024 年 GitLab Global DevSecOps 报告解读

近日 GitLab 正式发布了 2024 年 GitLab Global DevSecOps 报告&#xff0c;报告主题为 What’s next in DevSecOps。在全球有超 5000 位 IT 人员参与了该报告的调研&#xff0c;超 70% 为企业管理者&#xff0c;50% 以上的受访者所在企业规模超过 500人。该报告深刻揭示了在 A…

Qt进程通信,不推荐使用QSharedMemory和QLocalSocket,而是推荐ZMQ

一、据一位资深的网友说QLocalSocket有问题&#xff0c;共享内存QSharedMemory也有&#xff0c;比如存在多线程问题&#xff0c;不灵活&#xff0c;丢数据等问题都有&#xff0c;而且还占资源。血的教训。后来换成了zmqprotobuf。ZMQ进程内&#xff0c;进程间&#xff0c;机器间…

重塑科普展厅魅力,以用户体验为核心的策略性规划新探索!

如今&#xff0c;尽管数字技术已在全国范围内得到广泛应用&#xff0c;努力缩小地域间的信息鸿沟&#xff0c;但地域信息差依然是一个不容忽视的存在&#xff0c;他们由于文化背景、教育水平、生活习惯等方面的差异&#xff0c;对科普知识的需求和接受程度也各不相同&#xff0…

深入解析全连接层:PyTorch 中的 nn.Linear、nn.Parameter 及矩阵运算

文章目录 数学概念&#xff08;全连接层&#xff0c;线性层&#xff09;nn.Linear()nn.Parameter()Q1. 为什么 self.weight 的权重矩阵 shape 使用 ( out_features , in_features ) (\text{out\_features}, \text{in\_features}) (out_features,in_features)而不是 ( in_featur…

复现OpenVLA:开源的视觉-语言-动作模型及原理详解

复现OpenVLA&#xff1a;开源的视觉-语言-动作模型及原理详解 1. 摘要2. 引言3. 相关工作4. 模型结构4.1 模视觉-语言模型VLM4.2 训练流程4.3 图像分辨率4.4 微调视觉编码器4.5 训练轮数4.6 学习率4.7 训练细节4.8 参数高效微调 5. 复现5.1 下拉代码5.2 安装环境依赖5.2.1 创建…

什么是科技与艺术相结合的异形创意圆形(饼/盘)LED显示屏

在当今数字化与创意并重的时代&#xff0c;科技与艺术的融合已成为推动社会进步与文化创新的重要力量。其中&#xff0c;晶锐创显异形创意圆形LED显示屏作为这一趋势下的杰出代表&#xff0c;不仅打破了传统显示设备的形态束缚&#xff0c;更以其独特的造型、卓越的显示效果和广…

浏览器百科:网页存储篇-IndexedDB介绍(十)

1.引言 在现代网页开发中&#xff0c;数据存储需求日益增多和复杂&#xff0c;传统的客户端存储技术如localStorage和sessionStorage已难以满足大型数据的存储和管理需求。为了解决这一问题&#xff0c;HTML5 引入了 IndexedDB&#xff0c;在本篇《浏览器百科&#xff1a;网页…

SiC,GaN驱动优选驱动方案SiLM5350系列SiLM5350MDDCM-DG 带米勒钳位Clamp保护功能 单通道隔离栅极驱动器

SiLM5350MDDCM-DG是一款适用于IGBT、MOSFET的单通道 隔离门极驱动器&#xff0c;具有10A拉电流和10A灌电流驱动能 力。提供内部钳位功能&#xff0c;可单独控制 上升时间和下降时间。 在 SOP8 封 装 中 具 有 3000VRMS 隔 离 耐 压 &#xff08; 符 合 UL1577&#xff09;。 与…

Vue-Route4 ts

小满学习视频 Vue-Route 官网 项目的目录结构&#xff1a; 1. Vue-Router的使用 安装Vue-route pnpm add vue-router4创建router文件 /route/index.vue import { createRouter } from "vue-router"; import {createMemoryHistory,createWebHashHistory,create…