基于Javaweb+MySQL实现学生选课系统

学生选课系统设计报告

一、阶段:开发前的设置和思考

1.1 题目要求:

建立一个学生选课系统, 编写应用程序完成系统开发。

建立基本表:

  • 学生(学号,姓名,性别,年龄,系别)
  • 课程(课程号,课程名,开课系,任课教师)
  • 学习(学号,课程号,成绩)

要求有以下子系统

  • 基本信息查询子系统
    要求:能够显示出学生表、课程表、带参数学生详细信息和选课情况
  • 学生、课程信息维护子系统
    要求:能够维护学生表和课程表
  • 学生选课子系统
    要求:考虑参照完整性以及用户自定义完整性,实现学生选课功能
  • 系统维护

1.2 需求分析

  • 根据描述,这个系统不仅是选课系统,而是有其他教务管理和信息查询和维护的教务管理系统,选课系统只是这个教务管理系统的一个子系统。
  • 使用教务管理系统的用户有三种,一种是学生,一种是任课教师,另外一种损失教务处的老师,可以认为是管理员,所以可以将用户也分为这三种,不同的用户登录到这个系统中要有不同的界面,不同的功能。
  • 学生登录后有相关的信息查询和部分信息修改的权限,信息查询包括查询自己的个人信息,(自己的学号,班级,专业,籍贯,政治面貌,邮箱,联系方式等)选课信息(选了哪些课,课程表查看,每门课上课的时间,地点,任课教师,教学周起始等),成绩信息(查看自己的成绩信息,包括课程名称,分数,哪一个学期选修的这门课,任课教师等)。修改权限包括学生部分个人信息的修改(比如学生的联系电话,QQ 和微信,家庭住址,政治面貌等),在选课阶段修改自己的所选课程信息(在选课阶段,自由的增加选课和取消选课),修改自己的登录密码等。另外,仿照现有教务管理系统,增加私信老师的功能,使得学生可以向老师提交反馈,老师可以根据反馈进行相应的操作,学生可以不用打电话或者到教务处办公室寻求帮助。
  • 任课教师登录后功能和学生不同,任课教师可以查看自己现在这个学期教授哪些课程,可以查看这门课的详细教学安排时间表,这门课的上课地点等信息,可以查看选修了这门课的所有学生的信息(教务相关等基本信息,其他私人信息不会看到,另外,只有选修了自己所教授课程的学生的信息老师才可以查看,其他学生的不可以),查看自己的个人信息,和学生一样。任课教师可以修改自己部分的个人信息,修改自己的登录密码,在一个时间范围内给选修了自己课程的学生进行评分以及修改分数等操作,另外,任课教师还可以申请新开一门课程,在得到教务处的允许后方可成为正式的课程。
  • 教务处教师登录后的功能比较多,可以审核通过任课教师提出的新课的审核,可以发布系统公告,查看学生的求助并作出相应的处理,可以进行课程的安排,可以创建每个专业的选课清单,可以对每个选课清单进行控制(停止选课和开始选课等),可以添加新的教职工信息和学生信息。
  • 所有的信息查看功能都有搜索功能,可以在信息比较多的情况下根据用户输入的学号,工号,专业,以及状态等进行结果的缩减,达到快速检索到信息的目的,支持模糊搜索。

1.3 概念结构设计

系统的 ER 图如下:

1.4 逻辑结构设计

1.4.1 实体

  • 学生(学号,姓名,性别,学院,专业,班级,状态等)
  • 教师(工号,姓名,性别,学院,职称,地址,电话,类别等)
  • 管理员(工号,姓名,性别,学院,职称,地址,电话,类别等)
  • 课程(课程号,课程名称,开课学院,先修课程号,开课学院,简介,状态)

1.4.2 联系

  • 选修(学期学号课程号,成绩)
  • 教授(学期工号课程号,教学开始周,教学结束周,教学班容量,教室地址,状态)
  • 求助(消息 id,学号,发送时间,标题,内容,状态)
  • 安排(学期工号课程号,教学开始周,教学结束周,教学班容量,教室地址,状态)

1.5 数据库物理结构设计

数据表信息如下:

1.5.1 概览:

数据库名称为 DB,数据表数量为 11 个

1.5.2 学生表

1.5.3 教师表

1.5.4 管理员

(根据逻辑结构设计部分发现,教师和管理员其实可以合并)

1.5.5 课程表

1.5.6 选课表

1.5.7 课程安排表

1.5.8 教师授课表

(研究发现,可以和安排表合并)

1.5.9 课程时间表

1.5.10 学期表

1.5.11 消息表

1.5.12 公告表

1.5.13 选课清单表

1.5.14 用户登录信息表

二、阶段:开发编码调试工作

2.1 开发环境相关:

  • 开发后台服务语言:Java 版本 1.8
  • 服务器: Tomcat 版本 9.0.14
  • 数据库:MySQL 5.7
  • 操作系统:Windows10
  • 开发工具:Jetbrains Intelij IDEA

2.2 开发所用技术:

  • Web 前端:HTML,CSS,JavaScript,jQuery,Bootstrap。
  • Web 后端:原生 Java Web,Servlet,JDBC,JSTL,数据库连接池 DHCP,JSP

2.2.1 源代码目录简介:

  • .idea:IDEA 编译器的配置文件,系统默认生成,无序关心lib 和 libs:自己下载的驱动包和第三方 jar 包,包括数据库驱动和 jstl
  • out:字节码文件,为 Java 虚拟机实际运行的文件,编译之后生成,无需关心。
  • SQL:数据库备份文件,完整的数据表结构和部分数据。
  • src:Java 代码编写处
    DB:存放有关数据库操作的类
    model:存放数据表结构相关的 Java bean 类
    servlet:存放业务逻辑处理的 servlet 类

Web:存放静态资源和网页模板的类:

	app:放所有的 JSP 网页模板

	CSS:放所有的层叠样式表文件

	js:放所有的 JavaScript 脚本文件

	WEB-INF:系统自动生成 ,无需关心,是网站的配置信息文件。

2.3 项目典型代码讲解

2.3.1 数据库连接工具类:DB

package DB;
import java.sql.*;
public class DB {
//初始化连接参数;
    public static String url="jdbc:mysql://localhost:3306/db?serverTimezone=UTC&useSSL=false&characterEncoding=utf8";
    public static String user="root";
    public static String password="root";
//初始化驱动加载:
    static{
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            printStackTrace();
        }
    }
    public static Connection getConnection()
    {
        try {
            Connection connection=DriverManager.getConnection(url,user,password);
            return connection;
        } catch (SQLException e) {
            printStackTrace();
        }
        return null;
    }
    public static void close(Connection connection,Statement st,ResultSet rs)
    {
        try {
            connection.close();
            st.close();
            rs.close();
        }
        catch(Exception e) {
            printStackTrace();
        }
    }
    public static void close(Connection connection,PreparedStatement st)
    {
        try {
            connection.close();
            st.close();
        }
        catch(Exception e)
        {
            printStackTrace();
        }
    }
    public static void close(Statement st)
    {
        try {
            st.close();
        }
        catch(Exception e)
        {
            printStackTrace();
        }
    }
    public static void close(Connection connection)
    {
        try {
            connection.close();
        }
        catch(Exception e)
        {
            printStackTrace();
        }
    }
    public static void close(ResultSet resultSet)
    {
        try {
            resultSet.close();
        }
        catch(Exception e)
        {
            printStackTrace();
        }
    }
}

以上类用于数据库的连接,获取连接对象,然后还有关闭连接的函数,对关闭连接的函数进行了重载,可以关闭连接对象,语句对象,结果集对象的任何一个子集组合,完善的异常处理机制,可以简化其他用到数据库连接的地方,减少代码量。

2.3.2 登录 Servlet

package servlets.publicfun;
import DB.SemesterDB;
import DB.StudentDB;
import DB.TeacherDB;
import DB.UserDB;
import model.Student;
import model.Teacher;
import 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 javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String account=request.getParameter("account");
        String password=request.getParameter("password");
        String type=request.getParameter("type");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html");
        if(account==""||password=="")
        {
            PrintWriter printWriter=response.getWriter();
            printWriter.println("您的用户名或者密码为空,请重新登陆");
            printWriter.flush();
            printWriter.close();
        }
        else
        {
            UserDB userDB=new UserDB();
            User user=userDB.login(account,password,type);
            if(user==null) {
                PrintWriter printWriter=response.getWriter();
                printWriter.print("<script type='text/javascript'>alert('用户名或者密码错误!');window.location.href='"+request.getContextPath()+"/index.jsp'</script>");
                printWriter.flush();
                printWriter.close();
            }
            if(type.equals("student".toString()))
            {
//查询学生表详细信息,并设置session
                StudentDB studentDB=new StudentDB();
                Student student=studentDB.getInfo(user.getAccount());
                if(student==null)
                {
                    PrintWriter printWriter=response.getWriter();
                    printWriter.print("<script type='text/javascript'>alert('没有您的登录信息,请联系管理员!');window.location.href='"+request.getContextPath()+"/index.jsp'</script>");
                    printWriter.flush();
                    printWriter.close();
                }
                else {
                    SemesterDB semesterDB=new SemesterDB();
                    String semester=null;
                    try {
                        semester=semesterDB.getCurrentSemester();
                    } catch (SQLException e) {
                        printStackTrace();
                    }
                    if(semester==null)
                    {
                        PrintWriter printWriter=response.getWriter();
                        printWriter.print("<script type='text/javascript'>alert('学期列表出现错误,请联系管理员!');window.location.href='"+request.getContextPath()+"/index.jsp'</script>");
                        printWriter.flush();
                        printWriter.close();
                        response.setStatus(500);
                    }
                    HttpSession session = request.getSession();
                    session.setAttribute("userinfo", student);
                    session.setAttribute("type","student");
                    session.setAttribute("semester",semester);
//重定向到另外一个servlet
                    response.setStatus(302);
                    response.sendRedirect("content");
                }
            }
            else if(type.equals("teacher"))
            {
//查询教师表详细信息,并设置session
                TeacherDB teacherDB=new TeacherDB();
                Teacher teacher=teacherDB.getInfo(user.getAccount());
                if(teacher==null)
                {
                    PrintWriter printWriter=response.getWriter();
                    printWriter.print("<script type='text/javascript'>alert('没有您的登录信息,请联系管理员!');window.location.href='"+request.getContextPath()+"/index.jsp'</script>");
                    printWriter.flush();
                    printWriter.close();
                }
                else {
                    SemesterDB semesterDB=new SemesterDB();
                    String semester=null;
                    try {
                        semester=semesterDB.getCurrentSemester();
                    } catch (SQLException e) {
                        printStackTrace();
                    }
                    if(semester==null)
                    {
                        PrintWriter printWriter=response.getWriter();
                        printWriter.print("<script type='text/javascript'>alert('学期列表出现错误,请联系管理员!');window.location.href='"+request.getContextPath()+"/index.jsp'</script>");
                        printWriter.flush();
                        printWriter.close();
                        response.setStatus(500);
                    }
                    HttpSession session = request.getSession();
                    session.setAttribute("userinfo", teacher);
                    session.setAttribute("type","teacher");
                    session.setAttribute("semester",semester);
                    response.setStatus(302);
                    response.sendRedirect("content");
                }
            }
            else if(type.equals("root")) {
                TeacherDB teacherDB = new TeacherDB();
                Teacher teacher = teacherDB.getInfo(user.getAccount());
                if (teacher == null) {
                    PrintWriter printWriter = response.getWriter();
                    printWriter.print("<script type='text/javascript'>alert('没有您的登录信息,请联系管理员!');window.location.href='" + request.getContextPath() + "/index.jsp'</script>");
                    printWriter.flush();
                    printWriter.close();
                } else {
//设置管理员身份标识
                    teacher.setType("root");
//设置管理员登录标识
                    SemesterDB semesterDB=new SemesterDB();
                    String semester=null;
                    try {
                        semester=semesterDB.getCurrentSemester();
                    } catch (SQLException e) {
                        printStackTrace();
                    }
                    if(semester==null)
                    {
                        PrintWriter printWriter=response.getWriter();
                        printWriter.print("<script type='text/javascript'>alert('学期列表出现错误,请联系管理员!');window.location.href='"+request.getContextPath()+"/index.jsp'</script>");
                        printWriter.flush();
                        printWriter.close();
                        response.setStatus(500);
                    }
                    HttpSession session = request.getSession();
                    session.setAttribute("userinfo", teacher);
                    session.setAttribute("type","root");
                    session.setAttribute("semester",semester);
//重定向到另外一个servlet
                    response.setStatus(302);
                    response.sendRedirect("content");
                }
            }
        }
    }
}
这里登录只是验证一下是不是用户名和密码都正确,同时保存用户登录的信息到 session 中,设置登录状态的标志,以后的所有界面如果没有 session 的话都会自动跳转到登录界面,保证了只有是系统已经登录成功的用户才可以进行相关的查询和修改操作

2.3.3 首页初始化 Servlet:

因为所有首页登录进去之后都有一些数据是在数据库中取到的,所以要在加载页面之前从数据库中取出数据加到 request 域中,让前端可以访问并显示这些数据。因为教师,学生,管理员的首页界面不同,所以需要进行判断身份,然后连接不同的数据库,发送不同的信息到前端。
package servlets;
import DB.*;
import model.*;
import view.Course_select;
import view.Course_teach;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
@WebServlet("/content")
public class content extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session=request.getSession();
        try {
            String type = (String) session.getAttribute("type");
            if (type.equals("root")) {
                MessageDB messageDB = new MessageDB();
                List<Message> result = messageDB.getAllUncomplete();
                CourseDB courseDB = new CourseDB();
                List<Course> courseapp = courseDB.getAllUncompleCourse();
                request.setAttribute("helpList", result);
                request.setAttribute("newcourse", courseapp);
                request.getRequestDispatcher("app/content.jsp").forward(request, response);
            } else if (type.equals("student")) {
                Student student =(Student) session.getAttribute("userinfo");
                String sno=student.getSno();
                String semester=(String) session.getAttribute("semester");
                if(semester==null) {
                    response.setStatus(500);
                    PrintWriter printWriter =response.getWriter();
                    printWriter.print("<script>alert('学期表出现错误!请联系管理员!');window.location.href='"+request.getContextPath()+"/index.jsp';</script>");
                    printWriter.flush();
                    printWriter.close();
                }
                NoticeDB noticeDB = new NoticeDB();
                StudyCourseDB studyCourseDB=new StudyCourseDB();
                try {
                    List<Notice> result = noticeDB.getNotice();
                    List<Course_select> course_table=studyCourseDB.getCourseTableList(sno,semester);
                    List<StudyCourse> gradelist=studyCourseDB.getGradeList(sno,semester);
                    request.setAttribute("noticelist", result);
                    request.setAttribute("course_table_list",course_table);
                    request.setAttribute("grade_list",gradelist);
                    request.getRequestDispatcher("app/content.jsp").forward(request, response);
                } catch (SQLException e) {
                    printStackTrace();
                }
            } else if (type.equals("teacher")) {
                String semester=(String) session.getAttribute("semester");
                Teacher teacher=(Teacher) session.getAttribute("userinfo");
                String tno=teacher.getTno();
                NoticeDB noticeDB = new NoticeDB();
                Course_teacheDB db=new Course_teacheDB();
                ArrayList<Course_teach> teach_list=db.getTeachList(semester,tno);
                List<Notice> result = noticeDB.getNotice();
                request.setAttribute("noticelist", result);
                request.setAttribute("teachlist",teach_list);
                request.getRequestDispatcher("app/content.jsp").forward(request, response);
            }
        }
        catch (Exception e)
        {
            PrintWriter printWriter=response.getWriter();
            printWriter.println("<script>window.location.href='"+request.getContextPath()+"'</script>");
            printWriter.flush();
            printWriter.close();
        }
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

三、部分:系统演示和说明

3.1 用户登录

3.2 学生相关

3.2.1 学生首页

3.2.2 修改密码

3.2.3 选课

3.2.4 查看课表

3.2.5 查看个人信息

3.2.6 联系老师

3.2.7 成绩查询

3.3 教师相关

3.3.1 教师首页

3.3.2 个人信息维护

(同学生版页面)

3.3.3 修改密码

(同学生版页面)

3.3.4 申请新课

3.3.5 课程评分和修改

3.3.6 查看公告

3.3.7 查看学生信息

(需要选课之后才可以看)

3.3.8 授课查看

3.4 管理员相关

3.4.1 管理员首页

3.4.2 安排课程

3.4.3 添加人员

3.4.4 运行控制

3.4.5 创建选课清单

3.4.6 新课审核

3.4.7 学生求助信息

3.4.8 发布公告

3.4.9 课程信息

四、部分:总结与反思

通过学习数据库原理这门课,我学到的不仅仅是技术方面的东西,更加重要的是学会了如何去进行需求分析,对系统开发有了一个清晰的认识,对数据库的设计有了更深层次的认知,或许只有真正自己开发了之后才会有很深刻的理解吧,或许这就是数据库原理课程设计的目的所在。这门课程我从零开始学习 Java Web 开发,从零开始学习 JDBC,感谢老师给了我机会在同学们面前展示自己,锻炼自己。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

centos7 安装python3.9.4,解决import ssl异常

本篇文章介绍如何在centos7中安装python3.9.4(下文简称python3)&#xff0c;解决python3安装后import ssl模块失败问题&#xff0c;为什么我要在centos7中安装python呢&#xff0c;因为我需要在服务器中跑python数据处理脚本。 安装python3同时解决import ssl模块失败问题总共包…

Springboot 整合 Java DL4J 实现情感分析系统

&#x1f9d1; 博主简介&#xff1a;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编程&#xff0c;…

计算机网络串联——打开网站的具体步骤

参与浏览网站的重要名词 1、MAC地址也叫硬件地址、物理地址。那这个东西就是设备你出厂的时候就会带有的&#xff0c;详情跳转&#xff0c;其构成如下&#xff1a; MAC地址用16进制表示&#xff0c;就是一共有12位&#xff0c;前六位他们会像一个国际的这种专门组织去申…

<项目代码>YOLOv8 夜间车辆识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

xilinx vitis 更换硬件平台——ZYNQ学习笔记5

1、重新生成硬件信息 2、选择带有bit信息 3、设施路径和名字 4、打开更新硬件选项 5、选择新的硬件信息 6、打开系统工程界面 7、复位硬件信息 更新完毕

【温酒笔记】SPI

1. SPI基础 物理层 片选线 &#xff1a;选中拉低SCK: 时钟线MOSI:主出从入MISO:主入从出 协议层 CPOL:时钟极性&#xff1a;空闲电平高低 CPHA:时钟相位&#xff1a;第一个还是第二个边沿采样 2. 示例SPI-W25Q16 (见模组分类下文章)

Web应用性能测试工具 - httpstat

在数字化时代&#xff0c;网站的性能直接影响用户体验和业务成功。你是否曾经在浏览网页时&#xff0c;遇到加载缓慢的困扰&#xff1f;在这个快速变化的互联网环境中&#xff0c;如何快速诊断和优化Web应用的性能呢&#xff1f;今天&#xff0c;我们将探讨一个强大的工具——h…

Transformer 论文精读与完整代码复现【Attention Is All You Need】

本文将在一开始快速概括模型的主体&#xff0c;论文的贡献以及重要图表&#xff0c;然后使用 PyTorch 复现完整且与原论文对齐的 Transformer&#xff08;位于后半段&#xff09;。通过阅读文章能够了解&#xff1a; 单头与多头的区别&#xff1f;掩码到底掩了什么&#xff1f;…

element-plus按需引入报错AutoImport is not a function

官网文档&#xff1a;快速开始 | Element Plus webpack配置 // webpack.config.js const AutoImport require(unplugin-auto-import/webpack) const Components require(unplugin-vue-components/webpack) const { ElementPlusResolver } require(unplugin-vue-components…

《Python网络安全项目实战》项目2 Python基础练习_总复习(2)

《Python网络安全项目实战》项目2 Python基础练习_总复习&#xff08;2&#xff09; 期末总复习&#xff08;2&#xff09; 班级: 姓名: 实训成绩: 任务单成绩: 利用%d&#xff0c;%f占位符格式化输出。 Name “小明” age 16 height 1.7355774 ___________________________…

自扶正救生艇,保障水上救援的安全卫士_鼎跃安全

在应急事件中&#xff0c;自扶正救生艇能够发挥关键的救援和保障作用&#xff0c;确保救援人员和被困人员的生命安全&#xff0c;尤其在极端天气或突发水上事故中展现出明显优势。 在救援过程中如果遭遇翻船&#xff0c;救生艇能够迅速恢复正常姿态&#xff0c;确保救援人员不会…

SAR_ADC介绍和建模

SAR-ADC介绍以及建模 一、介绍 1、工作原理 采用多个时钟周期&#xff0c;将DAC的模拟输出VDAC逐次逼近此采样模拟输入&#xff0c;获得数字输出结果。采用二进制搜索或者折半查找算法 2、工作过程 1&#xff1a;信号与VREF/2相比&#xff0c;结‘1&#xff0c;代表信号>…

什么是 OpenTelemetry?

OpenTelemetry 定义 OpenTelemetry (OTel) 是一个开源可观测性框架&#xff0c;允许开发团队以单一、统一的格式生成、处理和传输遥测数据&#xff08;telemetry data&#xff09;。它由云原生计算基金会 (CNCF) 开发&#xff0c;旨在提供标准化协议和工具&#xff0c;用于收集…

Nginx 实现动态封禁IP,详细教程来了

Nginx 实现动态封禁IP&#xff0c;详细教程来了 需求环境准备设计方案在操作系统层面&#xff0c;配置 iptables&#xff0c;来拦截指定 IP 的网络请求在 Web 服务器层面&#xff0c;通过 Nginx 自身的 deny 选项或者 lua 插件配置 IP 黑名单在应用层面&#xff0c;在处理请求之…

11月3日笔记(根据凭据提权)

用户凭据操作 枚举 Unattended 凭据 无人值守(Unattended)安装允许应用程序在不需要管理员关注下自动安装。无人值守安装的问题是会在系统中残留一些配置文件&#xff0c;其中可能包含本地管理员的用户名和密码&#xff0c;常见的路径如下。 C:\sysprep.inf C:\syspreg\sysp…

如何解决permission denied - invalid PVE ticket (401)

PVE8.2访问出现&#xff1a;permission denied - invalid PVE ticket (401)&#xff0c;解决方法: 1、重启动PVE&#xff0c;然后登录。 去浏览器设置页面&#xff0c;清空cokie&#xff0c;然后再登录。如果问题仍然存在&#xff0c;就按下面的方法进一步确定。 2、另外一种…

驱动——线程断链和信息获取

实验环境&#xff1a;win7 x32 断链&#xff1a; #include <ntifs.h>NTSTATUS EnumThread(ULONG ulPid, ULONG ulTid) {PEPROCESS pProcessAddr PsGetCurrentProcess();PLIST_ENTRY pHeadlink (PLIST_ENTRY)((ULONG)pProcessAddr 0xb8);PLIST_ENTRY pNextlink pHead…

打羽毛球为什么要在气膜馆?—轻空间

在现代健身环境中&#xff0c;羽毛球作为一项受欢迎的运动&#xff0c;不仅能够锻炼身体&#xff0c;还能增强社交互动。选择在气膜馆打羽毛球&#xff0c;能为运动爱好者带来全新的体验和诸多优势。 优越的空间设计 气膜馆的最大特点是其独特的空间设计。与传统的体育馆相比&a…

计算机毕业设计Python+大模型新闻自动分类 新闻舆情预测 新闻语料情感分析 新闻推荐系统 朴素贝叶斯分类算法 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

2001-2023年A股上市公司数字化转型数据(MDA报告词频统计)(三种方法)

2001-2023年A股上市公司数字化转型数据&#xff08;MD&A报告词频统计&#xff09;&#xff08;三种方法&#xff09; 1、时间&#xff1a;2001-2023年 2、来源&#xff1a;上市公司MD&A报告 3、指标&#xff1a;年份、股票代码、股票简称、行业名称、行业代码、MD&a…