1月第四讲:Java Web学生自习管理系统

news2025/1/4 3:02:55

一、项目背景与需求分析

随着网络技术的不断发展和学校规模的扩大,学生自习管理系统的需求日益增加。传统的自习管理方式存在效率低下、资源浪费等问题,因此,开发一个智能化的学生自习管理系统显得尤为重要。该系统旨在提高自习室的利用率和管理效率,为学生提供方便快捷的自习预约服务,同时为管理员提供高效的资源管理工具。

系统的主要功能需求包括:

1.用户管理:管理员和学生的注册、登录。

2.自习室管理:自习室类型、座位信息的录入和查询。

3.座位预约:学生预约自习室座位、查看预约状态和历史记录。

4.管理员操作:管理员查看预约情况、管理资源分配。

二、技术选型与架构设计

1.技术选型:

  • 前端:HTML、CSS、JavaScript,用于创建用户界面。
  • 后端:Java(JDK 1.8),Servlet,JSP,JDBC,用于处理业务逻辑和数据库交互。
  • 数据库:MySQL,用于存储用户信息和自习室资源数据。
  • 服务器:Apache Tomcat,用于部署和运行Web应用。
  • 开发工具:IntelliJ IDEA 或 Eclipse,用于编写和调试代码。

2.架构设计:

三层架构:

  • 表示层:JSP/HTML 作为前台与用户交互,Servlet 用于控制跳转和调用业务逻辑层。
  • 业务逻辑层:处理业务逻辑,调用数据访问层。
  • 数据访问层:与数据库交互,封装数据库操作。

三、数据库设计

1.用户表(users):存储用户信息。

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(50) NOT NULL,
    role VARCHAR(10) NOT NULL CHECK (role IN ('student', 'admin'))
);

2.自习室表(study_rooms):存储自习室信息。

CREATE TABLE study_rooms (
    id INT AUTO_INCREMENT PRIMARY KEY,
    room_name VARCHAR(50) NOT NULL,
    capacity INT NOT NULL
);

3.座位表(seats):存储座位信息。

CREATE TABLE seats (
    id INT AUTO_INCREMENT PRIMARY KEY,
    room_id INT NOT NULL,
    status VARCHAR(10) NOT NULL CHECK (status IN ('available', 'booked')),
    FOREIGN KEY (room_id) REFERENCES study_rooms(id)
);

4.预约表(reservations):存储预约信息。

CREATE TABLE reservations (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    seat_id INT NOT NULL,
    start_time DATETIME NOT NULL,
    end_time DATETIME NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (seat_id) REFERENCES seats(id)
);

四、后端实现

1.数据库连接工具类(DBUtil.java)

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
 
public class DBUtil {
    private static final String DB_URL = "jdbc:mysql://localhost:3306/study_management";
    private static final String DB_USER = "root";
    private static final String DB_PASSWORD = "your_password";
    private static Connection connection = null;
 
    static {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            connection = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
 
    public static Connection getConnection() {
        return connection;
    }
 
    // 其他数据库操作方法(增删改查)
}

2.数据访问层(DAO)

  • UserDao.java

    import java.sql.*;
    import java.util.ArrayList;
    import java.util.List;
     
    public class UserDao {
        public boolean registerUser(String username, String password, String role) {
            String sql = "INSERT INTO users (username, password, role) VALUES (?, ?, ?)";
            try (PreparedStatement pst = DBUtil.getConnection().prepareStatement(sql)) {
                pst.setString(1, username);
                pst.setString(2, password);
                pst.setString(3, role);
                return pst.executeUpdate() > 0;
            } catch (SQLException e) {
                e.printStackTrace();
                return false;
            }
        }
     
        // 其他方法(登录、查询用户等)
    }
    
  • StudyRoomDao.java 和 SeatDao.java 以及 ReservationDao.java 的实现类似,包含各自的增删改查方法。

3.业务逻辑层(Service)

  • UserService.java

    public class UserService {
        public boolean register(String username, String password, String role) {
            return UserDao.registerUser(username, password, role);
        }
     
        // 其他方法(登录验证、查询用户信息等)
    }
    
  • StudyRoomService.javaSeatService.java 和 ReservationService.java 类似,包含各自的业务逻辑处理。

4. Servlet

  • RegisterServlet.java:

    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.IOException;
     
    public class RegisterServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            String role = request.getParameter("role");
     
            boolean isRegistered = UserService.register(username, password, role);
     
            if (isRegistered) {
                response.sendRedirect("login.jsp");
            } else {
                request.setAttribute("error", "Registration failed!");
                request.getRequestDispatcher("register.jsp").forward(request, response);
            }
        }
     
        // 其他方法(登录Servlet、预约Servlet等)
    }
    

5. JDBC工具类

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
 
public class JDBCUtils {
    private static final String URL = "jdbc:mysql://localhost:3306/StudyManagementSystem?useSSL=false&serverTimezone=UTC";
    private static final String USER = "root";
    private static final String PASSWORD = "your_password"; // 请替换为您的数据库密码
 
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USER, PASSWORD);
    }
}

6. Servlet示例:添加学生

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
 
@WebServlet("/addStudent")
public class AddStudentServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name");
        String major = request.getParameter("major");
        int grade = Integer.parseInt(request.getParameter("grade"));
        String phone = request.getParameter("phone");
 
        String sql = "INSERT INTO Student (name, major, grade, phone) VALUES (?, ?, ?, ?)";
 
        try (Connection conn = JDBCUtils.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setString(1, name);
            pstmt.setString(2, major);
            pstmt.setInt(3, grade);
            pstmt.setString(4, phone);
            pstmt.executeUpdate();
 
            response.sendRedirect("students.jsp"); // 重定向到学生列表页面
        } catch (SQLException e) {
            e.printStackTrace();
            request.setAttribute("error", "添加学生失败,请稍后再试!");
            request.getRequestDispatcher("addStudent.jsp").forward(request, response);
        }
    }
}

7. JSP页面示例:添加学生页面

<!-- addStudent.jsp -->
<!DOCTYPE html>
<html>
<head>
    <title>添加学生</title>
</head>
<body>
    <h2>添加学生</h2>
    <form action="addStudent" method="post">
        姓名: <input type="text" name="name" required><br>
        专业: <input type="text" name="major" required><br>
        年级: <input type="number" name="grade" required><br>
        电话: <input type="text" name="phone" required><br>
        <input type="submit" value="提交">
    </form>
    <c:if test="${not empty error}">
        <p style="color:red;">${error}</p>
    </c:if>
</body>
</html>

注意:为了使用JSP标签库(如<c:if>),您需要在JSP页面顶部添加以下指令:

jsp复制代码

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

并且,您需要在项目的WEB-INF/lib目录下添加JSTL库(如jstl-1.2.jar)。

相关文章:“

https://book.qq.com/book-search/%E5%90%8D%E4%BC%98%E9%A6%86%E7%BD%91%E3%80%9023Y4.com%E3%80%91?c31a
https://book.qq.com/book-search/%E6%B5%B7%E8%A7%92%E7%A4%BE%E5%8C%BA%E3%80%9023Y4.com%E3%80%91?c31b
https://book.qq.com/book-search/%E8%89%B3%E6%AF%8D%E7%BD%91%E8%BF%9B%E3%80%9023Y4.com%E3%80%91?c31c
https://book.qq.com/book-search/%E6%9E%9C%E5%86%BB%E4%BC%A0%E5%AA%92%E3%80%9023Y4.com%E3%80%91?c31d
https://book.qq.com/book-search/%E6%9E%9C%E5%86%BB%E4%BC%A0%E5%AA%92%E8%BF%9B23Y4.com%E7%9C%8B?c31e
https://book.qq.com/book-search/%E6%80%A7%E5%B7%B4%E5%85%8B%E8%BF%9B%E3%80%9023Y4.com%E3%80%91?c31f
https://book.qq.com/book-search/%E7%88%B1%E5%A8%81%E5%A5%B6%E7%BD%91%E3%80%9023Y4.com%E3%80%91?c31g
https://book.qq.com/book-search/%E7%A6%81%E6%BC%AB%E5%A4%A9%E5%A0%82%E3%80%9023Y4.com%E3%80%91?c31h
https://book.qq.com/book-search/%E6%92%B8%E6%92%B8%E7%A4%BE%E7%BD%91%E3%80%9023Y4.com%E3%80%91?c31i
https://book.qq.com/book-search/%E6%8A%96%E9%98%B4%E4%B8%8B%E8%BD%BD%E3%80%8A23Y4.com%E3%80%8B?c31i
https://book.qq.com/book-search/%E6%8A%96%E9%98%B4%E7%BD%91%E7%AB%99%E3%80%9023Y4.com%E3%80%91?c31k
https://book.qq.com/book-search/%E4%B9%85%E4%B9%85%E7%83%AD%E7%9C%8B%E3%80%9023Y4.com%E3%80%91?c31l
https://book.qq.com/book-search/%E4%B9%85%E4%B9%85%E7%83%AD%E8%BF%9B%E3%80%9023Y4.com%E3%80%91?c31m
https://book.qq.com/book-search/%E6%92%B8%E6%92%B8%E7%A4%BE%E8%BF%9B%E3%80%9023Y4.com%E3%80%91?c31n
https://book.qq.com/book-search/%E4%B8%8B%E8%BD%BD%E6%8A%96%E9%98%B4%E3%80%9023Y4.com%E3%80%91?c31o

https://book.qq.com/book-search/%E8%89%B3%E6%AF%8D%E5%9C%B0%E5%9D%80%E3%80%9023Y4.com%E3%80%91?c31p
https://book.qq.com/book-search/%E7%9C%8B%E8%89%B3%E6%AF%8D%E8%BF%9B%E3%80%9023Y4.com%E3%80%91?c31q
https://book.qq.com/book-search/%E8%89%B3%E6%AF%8D%E7%9C%8B%E8%BF%99%E3%80%9023Y4.com%E3%80%91?c31r
https://book.qq.com/book-search/%E8%89%B3%E6%AF%8D%E5%9C%B0%E5%9D%80%E8%BF%9B23Y4.com%E7%9C%8B?c31s
https://book.qq.com/book-search/%E8%89%B3%E6%AF%8D%E5%9C%B0%E5%9D%80%E6%9D%A523Y4.com%E7%9C%8B?c31t

五、前端实现

1.注册页面(register.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Register</title>
</head>
<body>
    <h1>Register</h1>
    <form action="RegisterServlet" method="post">
        Username: <input type="text" name="username" required><br>
        Password: <input type="password" name="password" required><br>
        Role: <select name="role">
                <option value="student">Student</option>
                <option value="admin">Admin</option>
            </select><br>
        <button type="submit">Register</button>
    </form>
    <c:if test="${not empty error}">
        <p style="color:red">${error}</p>
    </c:if>
</body>
</html>

2.登录页面(login.jsp)

登录页面(login.jsp)** 和 其他页面(如自习室管理页面、座位预约页面等)类似,通过表单提交数据到相应的Servlet进行处理。

(1)项目结构

假设项目结构如下:

MyWebApp/
│
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── example/
│   │   │           ├── controller/
│   │   │           │   ├── LoginServlet.java
│   │   │           │   ├── StudyRoomServlet.java
│   │   │           │   └── SeatReservationServlet.java
│   │   │           └── model/
│   │   │               └── User.java
│   │   └── webapp/
│   │       ├── WEB-INF/
│   │       │   ├── web.xml
│   │       └── 
│   │           ├── login.jsp
│   │           ├── studyRoom.jsp
│   │           └── seatReservation.jsp
(2) User 模型类

首先,定义一个简单的User类来表示用户信息。

// src/main/java/com/example/model/User.java
package com.example.model;
 
public class User {
    private String username;
    private String password;
 
    // Getters and Setters
    public String getUsername() {
        return username;
    }
 
    public void setUsername(String username) {
        this.username = username;
    }
 
    public String getPassword() {
        return password;
    }
 
    public void setPassword(String password) {
        this.password = password;
    }
}
(3)登录页面 (login.jsp)

创建一个简单的登录页面。

<!-- src/main/webapp/login.jsp -->
<!DOCTYPE html>
<html>
<head>
    <title>Login</title>
</head>
<body>
    <h2>Login</h2>
    <form action="login" method="post">
        <label for="username">Username:</label>
        <input type="text" id="username" name="username" required><br><br>
        <label for="password">Password:</label>
        <input type="password" id="password" name="password" required><br><br>
        <input type="submit" value="Login">
    </form>
    <p>Or go to <a href="studyRoom.jsp">Study Room Management</a> or <a href="seatReservation.jsp">Seat Reservation</a> (without login).</p>
</body>
</html>
(4)登录处理Servlet (LoginServlet.java)

处理登录表单提交的Servlet。

// src/main/java/com/example/controller/LoginServlet.java
package com.example.controller;
 
import com.example.model.User;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
 
        // Simple hard-coded authentication for demo purposes
        if ("admin".equals(username) && "password123".equals(password)) {
            User user = new User();
            user.setUsername(username);
            user.setPassword(password);
            request.getSession().setAttribute("user", user);
            response.sendRedirect("studyRoom.jsp");
        } else {
            response.sendRedirect("login.jsp?error=true");
        }
    }
}
(5)自习室管理页面 (studyRoom.jsp)

显示自习室管理页面(假设用户已登录)。

<!-- src/main/webapp/studyRoom.jsp -->
<!DOCTYPE html>
<html>
<head>
    <title>Study Room Management</title>
</head>
<body>
    <h2>Study Room Management</h2>
    <%
        if (session.getAttribute("user") == null) {
            response.sendRedirect("login.jsp");
            return;
        }
    %>
    <p>Welcome, <%= session.getAttribute("user").getUsername() %>!</p>
    <p>This is where you can manage study rooms.</p>
    <a href="logout">Logout</a>
</body>
</html>

JSP 复制 全屏

(6)座位预约页面 (seatReservation.jsp)

显示座位预约页面(假设用户未登录也可访问)。

<!-- src/main/webapp/seatReservation.jsp -->
<!DOCTYPE html>
<html>
<head>
    <title>Seat Reservation</title>
</head>
<body>
    <h2>Seat Reservation</h2>
    <p>You can reserve a seat here.</p>
    <%
        if (session.getAttribute("user") != null) {
            out.println("<p>Logged in as: " + session.getAttribute("user").getUsername() + "</p>");
        } else {
            out.println("<p>You are not logged in. <a href='login.jsp'>Login</a> to see more options.</p>");
        }
    %>
    <a href="login.jsp">Login</a>
</body>
</html>
(7)注销处理Servlet (LogoutServlet.java)

处理用户注销的Servlet(未包含在代码中,但可以通过添加一个新的Servlet实现)。

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

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

相关文章

柱状图中最大的矩形 - 困难

************* c topic: 84. 柱状图中最大的矩形 - 力扣&#xff08;LeetCode&#xff09; ************* chenck the topic first: Think about the topics I have done before. the rains project comes:盛最多水的容器 - 中等难度-CSDN博客https://blog.csdn.net/ElseWhe…

第17篇 使用数码管实现计数器___ARM汇编语言程序<四>

Q&#xff1a;如何使用定时器实现数码管循环计数器&#xff1f; A&#xff1a;DE1-SoC_Computer系统有许多硬件定时器&#xff0c;本次实验使用A9 Private Timer定时器实现延时&#xff1a;定时器首先向Load寄存器写入计数值&#xff0c;然后向Control寄存器中的使能位E写1来启…

SSM 进销存系统

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;&#x1f525;&…

通过Cephadm工具搭建Ceph分布式存储以及通过文件系统形式进行挂载的步骤

1、什么是Ceph Ceph是一种开源、分布式存储系统&#xff0c;旨在提供卓越的性能、可靠性和可伸缩性。它是为了解决大规模数据存储问题而设计的&#xff0c;使得用户可以在无需特定硬件支持的前提下&#xff0c;通过普通的硬件设备来部署和管理存储解决方案。Ceph的灵活性和设计…

【Rust自学】8.4. String类型 Pt.2:字节、标量值、字形簇以及字符串的各类操作

8.4.0. 本章内容 第八章主要讲的是Rust中常见的集合。Rust中提供了很多集合类型的数据结构&#xff0c;这些集合可以包含很多值。但是第八章所讲的集合与数组和元组有所不同。 第八章中的集合是存储在堆内存上而非栈内存上的&#xff0c;这也意味着这些集合的数据大小无需在编…

svn分支相关操作(小乌龟操作版)

在开发工作中进行分支开发&#xff0c;涉及新建分支&#xff0c;分支切换&#xff0c;合并分支等 新建远程分支 右键选择branch/tagert按钮 命名分支的路径名称 点击确定后远程分支就会生成一个当时命名的文件夹&#xff08;开发分支&#xff09; 分支切换 一般在开发阶段&a…

24年收尾之作------动态规划<六> 子序列问题(含对应LeetcodeOJ题)

目录 引例 经典LeetCode OJ题 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 6.第六题 7.第七题 引例 OJ传送门 LeetCode<300>最长递增子序列 画图分析: 使用动态规划解决 1.状态表示 dp[i]表示以i位置元素为结尾的子序列中&#xff0c;最长递增子序列的长度 2.…

蓝牙|软件 Qualcomm S7 Sound Platform开发系列之初级入门指南

本文适用范围 ADK24.2~ 问题/功能描述 S7开发环境搭建与编译介绍 实现方案 本文介绍适用于windows平台Application部分,audio ss的说明会在下一篇文章在做说明,Linux平台如果不进行AI算法的开发,个人认知是没有必要配置,若是做服务器倒是不错的选择.因为编译完成后烧录调试还…

Redis - 4 ( 9000 字 Redis 入门级教程 )

一&#xff1a; Zset 有序集合 1.1 常用命令 有序集合在 Redis 数据结构中相较于字符串、列表、哈希和集合稍显陌生。它继承了集合中元素不允许重复的特点&#xff0c;但与集合不同的是&#xff0c;有序集合的每个元素都关联一个唯一的浮点分数&#xff08;score&#xff09;…

ubuntu 使用samba与windows共享文件[注意权限配置]

在Ubuntu上使用Samba服务与Windows系统共享文件&#xff0c;需要正确配置Samba服务以及相应的权限。以下是详细的步骤&#xff1a; 安装Samba 首先&#xff0c;确保你的Ubuntu系统上安装了Samba服务。 sudo apt update sudo apt install samba配置Samba 安装完成后&#xff0c…

打印进度条

文章目录 1.Python语言实现(1)黑白色(2)彩色&#xff1a;蓝色 2.C语言实现(1)黑白颜色(2)彩色版&#xff1a;红绿色 1.Python语言实现 (1)黑白色 import sys import timedef progress_bar(percentage, width50):"""打印进度条:param percentage: 当前进度百分比…

深度解析 LDA 与聚类结合的文本主题分析实战

🌟作者简介:热爱数据分析,学习Python、Stata、SPSS等统计语言的小高同学~🍊个人主页:小高要坚强的博客🍓当前专栏:《Python之文本分析》🍎本文内容:深度解析 LDA 与聚类结合的文本主题分析实战🌸作者“三要”格言:要坚强、要努力、要学习 目录 引言 技术框架…

点跟踪基准最早的论文学习解读:TAP-Vid: A Benchmark for Tracking Any Point in a Video—前置基础

TAP-Vid: A Benchmark for Tracking Any Point in a Video— TAP-Vid&#xff1a;跟踪视频中任意点的基准、 学习这一篇文章的本来的目的是为了学习一下TAP-NET便于理解后面用到的TAPIR方法的使用。 文章目录 TAP-Vid: A Benchmark for Tracking Any Point in a Video— TAP-V…

C进阶-字符串与内存函数介绍(另加2道典型面试题)

满意的话&#xff0c;记得一键三连哦&#xff01; 我们先看2道面试题 第一道&#xff1a; 我们画图理解&#xff1a; pa&#xff0c;先使用再&#xff0c;pa开始指向a【0】&#xff0c;之后pa向下移动一位&#xff0c;再解引用&#xff0c;指向a【1】&#xff0c;a【1】又指向…

PH47代码框架 24241231 重要更新

仪式感一下&#xff1a;2024年最后一天&#xff0c;发布 PH47 代码框架的一次重要更新。当然这并不是有意的&#xff0c;而是直到现在才把更新的所有工作全部做完&#xff08;希望确实如此&#xff09;。 本次更新要点&#xff1a; 1、加入多IMU支持。本次更新正式加入对 MPU65…

idea报错:There is not enough memory to perform the requested operation.

文章目录 一、问题描述二、先解决三、后原因&#xff08;了解&#xff09; 一、问题描述 就是在使用 IDEA 写代码时&#xff0c;IDEA 可能会弹一个窗&#xff0c;大概提示你目前使用的 IDEA 内存不足&#xff0c;其实就是提醒你 JVM 的内存不够了&#xff0c;需要重新分配。弹…

Python用K-Means均值聚类、LRFMC模型对航空公司客户数据价值可视化分析指标应用|数据分享...

全文链接&#xff1a;https://tecdat.cn/?p38708 分析师&#xff1a;Yuling Fang 信息时代的来临使得企业营销焦点从产品中心转向客户中心&#xff0c;客户关系管理成为企业的核心问题&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 客户关系管理的关键是客…

Linux umami网站统计工具自定义API开发

Linux umami网站统计工具自定义API开发 一、src/queries/analytics/下添加调用sql查询文件&#xff1a;二、src/queries/index.js文件中增加导出模块内容&#xff1a;三、src/pages/api/下根据目录添加接口方法文件&#xff1a;四、构建项目&#xff0c;启动。1、到umami目录&a…

基于SpringBoot的实验室信息管理系统【源码+文档+部署讲解】

系统介绍 视频演示 基于SpringBootVue实现的实验室信息管理系统采用前后端分离的架构方式&#xff0c;系统分为管理员、老师、用户三种角色&#xff0c;实现了用户管理、设备管理、实验室查询、公告、课程、实验室耗材管理、我的等功能 技术选型 开发工具&#xff1a;idea2…

【openGauss】正则表达式次数符号“{}“在ORACLE和openGauss中的差异

一、前言 正则作为一种常用的字符串处理方式&#xff0c;在各种开发语言&#xff0c;甚至数据库中&#xff0c;都有自带的正则函数。但是正则函数有很多标准&#xff0c;不同标准对正则表达式的解析方式不一样&#xff0c;本次在迁移一个ORACLE数据库到openGauss时发现了一个关…