基于SSM的学生信息管理系统(选课管理系统)的设计与实现 (含源码+sql+视频导入教程)

news2024/11/15 5:52:28

👉文末查看项目功能视频演示+获取源码+sql脚本+视频导入教程视频

1 、功能描述

  基于SSM的学生信息管理系统(选课管理系统)13拥有三种角色

  • 管理员:学生管理、教师管理、专业管理、课程管理、审批管理、课程表管理、开课管理、教室管理、班级管理等
  • 教师:查看学生、成绩管理、查看排课、录入成绩等
  • 学生:查看成绩、查看课表、申请审批等

1.1 背景描述

  学生管理系统是一个针对学校或教育机构的学生信息进行全面管理的系统。这个系统主要功能包括学生信息的录入、查询、修改和删除,以及学生成绩的录入、查询和修改。此外,系统还可以生成报告,包括学生信息统计和成绩分析等。这个系统的用户包括学生、家长、教师和管理员。通过这个系统,学生可以查看自己的个人信息和成绩,家长可以查看孩子的信息和成绩,教师可以看到学生的信息和成绩,管理员可以管理所有学生的信息和成绩。

2、项目技术

后端框架:SSM(Spring、SpringMVC、Mybatis)

前端技术:Layui、jsp、css、JavaScript、JQuery

2.1 SSM

  SSM(Spring+SpringMVC+MyBatis)是目前比较主流的Java EE企业级框架,适用于搭建各种大型的企业级应用系统。其中,Spring就像是整个项目中的粘合剂,负责装配bean并管理其生命周期,实现控制反转(IoC)的功能。SpringMVC负责拦截用户请求,通过DispatcherServlet将请求匹配到相应的Controller并执行。而MyBatis则是对JDBC的封装,让数据库底层操作变得透明,通过配置文件关联到各实体类的Mapper文件,实现了SQL语句映射。

2.2 mysql

  MySQL是一款Relational Database Management System,直译过来的意思就是关系型数据库管理系统,MySQL有着它独特的特点,这些特点使他成为目前最流行的RDBMS之一,MySQL想比与其他数据库如ORACLE、DB2等,它属于一款体积小、速度快的数据库,重点是它符合本次毕业设计的真实租赁环境,拥有成本低,开发源码这些特点,这也是选择它的主要原因。

3、开发环境

  • JAVA版本:JDK1.8
  • IDE类型:IDEA、Eclipse都可运行
  • tomcat版本:Tomcat 9以上版本(有下载教程)
  • 数据库类型:MySql(5.x和8.x版本都可)
  • maven版本:无限制
  • 硬件环境:Windows 或者 Mac OS

4、功能截图+视频演示+文档目录

4.1 登录

登录

4.2 管理员模块

管理员首页

管理员-班级管理

管理员-教师管理

管理员-教室管理

管理员-开课管理

开课管理

管理员-课程管理

管理员-审批管理

管理员-学生管理

管理员-专业管理

4.3 教师模块

教师-查看学生

教师-成绩管理

教师-查看排课

教师0录入成绩

4.4 学生模块

学生-学生信息

学生-查看成绩

学生-查看课表

学生-申请审批

5 、核心代码实现

5.1 配置代码

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!--设置数据库配置文件地址-->
    <context:property-placeholder location="classpath:conf/jdbc.properties"/>

    <!--声明数据源,连接数据库-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
          init-method="init" destroy-method="close">
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <!--SqlSessionFactoryBean创建SqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:conf/mybatis.xml"/>
    </bean>

    <!--声明mybatis的扫描器,创建dao对象-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <property name="basePackage" value="com.wangpeng.dao"/>
    </bean>

    <!--组件扫描器,扫描service-->
    <context:component-scan base-package="com.wangpeng.service"/>

    <!--下面还可以写事务配置:注解的配置,aspect的配置-->
    <!--事务注解驱动,然后就可以使用@Transactional注解来实现事务管理-->
    <!--或者配置aspectj用aop的事务管理-->
</beans>

5.2 登录注册代码

package com.wangpeng.controller;

import com.wangpeng.pojo.Manager;
import com.wangpeng.pojo.Student;
import com.wangpeng.pojo.Teacher;
import com.wangpeng.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@RestController
@RequestMapping("/login")
public class LoginController {

    @Autowired
    LoginService service;

    /**
     * 登录
     * @param username 用户名
     * @param password 密码
     * @param authority 身份
     * @param captcha 验证码
     * @param req HttpServletRequest
     * @param resp HttpServletResponse
     * @return
     */
    @RequestMapping("login.do")
    public int login(String username, String password, String authority, String captcha, HttpServletRequest req, HttpServletResponse resp){
        //  status: 0验证码错误,1账号密码错误,2成功,3验证码失效

        // 获取Session中的验证码
        String token = (String) req.getSession().getAttribute("KAPTCHA_SESSION_KEY");
        // 删除Session中的验证码
        req.getSession().removeAttribute("KAPTCHA_SESSION_KEY");

        System.out.println("验证码[" + token + "]");

        // 验证码失效
        if(token == null) return 3;

        // 验证码错误
        if( !captcha.equals(token)) return 0;

        // 账号密码错误
        Object obj = null;
        if(authority.equals("manager")){
            obj = service.managerLogin(username,password);
        } else if(authority.equals("teacher")){
            obj = service.teacherLogin(username,password);
        } else if(authority.equals("student")){
            obj = service.studentLogin(username,password);
        }

        if(obj == null) return 1;
        else {
            //保存用户登陆的信息到Session域中
            req.getSession().setAttribute("authority",authority);   //权限身份
            req.getSession().setAttribute("loginObj", obj);         //登录对象
            return 2;
        }
    }

    /**
     * 修改密码
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @param req HttpServletRequest
     * @return 成功标志1
     */
    @RequestMapping("alterPassword.do")
    public int alterPassword(String oldPassword, String newPassword,HttpServletRequest req){
        //获取当前登录的权限
        String authority = (String) req.getSession().getAttribute("authority");

        if(authority.equals("manager")) {
            //获取当前账号信息
            Manager loginManager =  (Manager) req.getSession().getAttribute("loginObj");

            //检查旧密码是否正确
            Manager manager = service.managerLogin(loginManager.getUsername(), oldPassword);
            if(manager == null) {   //旧密码不正确
                return 0;
            } else {    //旧密码正确,设置新密码
                service.setManagerPassword(loginManager, newPassword);
                return 1;
            }
        } else if(authority.equals("teacher")) {
            //获取当前账号信息
            Teacher loginTeacher =  (Teacher) req.getSession().getAttribute("loginObj");

            //检查旧密码是否正确
            Teacher teacher = service.teacherLogin(loginTeacher.getTnum(), oldPassword);

            if(teacher == null) {   //旧密码不正确
                return 0;
            } else {    //旧密码正确,设置新密码
                service.setTeacherPassword(loginTeacher, newPassword);
                return 1;
            }
        } else if(authority.equals("student")) {
            //获取当前账号信息
            Student loginStudent =  (Student) req.getSession().getAttribute("loginObj");

            //检查旧密码是否正确
            Student student = service.studentLogin(loginStudent.getSnum(), oldPassword);

            if(student == null) {   //旧密码不正确
                return 0;
            } else {    //旧密码正确,设置新密码
                service.setStudentPassword(loginStudent, newPassword);
                return 1;
            }
        }

        return 0;
    }

    /**
     * 退出登录
     * @param req HttpServletRequest
     */
    @RequestMapping({"exitLogin.do", "student/exitLogin.do", "teacher/exitLogin.do"})
    public void exitLogin(HttpServletRequest req){
        req.getSession().setAttribute("authority", null);
        req.getSession().setAttribute("loginObj", null);
    }
}

6 、功能视频演示

基于SSM的学生信息管理系统(教务选课管理系统) 计算机毕业设计 源码 java毕设

7 、 获取方式

👇 大家点赞、收藏、关注、评论啦 👇🏻获取联系方式,后台回复关键词:学生👇🏻

请添加图片描述

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

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

相关文章

高德地图JS API加载行政区边界AMap.Polygon

&#x1f916; 作者简介&#xff1a;水煮白菜王 &#xff0c;一位资深前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 高德AMap专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧✍。 感谢支持&#x1f495;&#x1f495;&#x1f49…

大模型LLM之SpringAI:Web+AI(二)

2.2.2、ChatModel API(聊天模型API) 聊天模型太多了,这里只写OpenAI和Ollama ChatModel和ChatClient区别:ChatClient针对的是所有模型,共用一个客户端。而ChatModel是针对各个模型实现的。 (1)OpenAI 自动配置 <dependency><groupId>org.springframework…

vue3 内置组件 <Suspense>

官方文档&#xff1a; <Suspense> 指南-Suspense 官方提示&#xff1a; <Suspense> 是一项实验性功能。它不一定会最终成为稳定功能&#xff0c;并且在稳定之前相关 API 也可能会发生变化。 <Suspense>是一个内置组件&#xff0c;用来在组件树中协调对异步依…

git删除本地分支报错:error: the branch ‘xxx‘ is not fully merged

git删除本地分支报错&#xff1a;error: the branch xxx is not fully merged error: the branch xxx is not fully merged 直接&#xff1a; git branch -D xxx 就可以。 如果删除远程分支&#xff1a; git push origin --delete origin/xxx git强制删除本地分支 git branc…

如何将Git本地代码推送到Gitee云端仓库

如何将Git本地代码推送到Gitee云端仓库 在使用Git进行版本控制时&#xff0c;将本地代码推送到远程仓库是一个基本且重要的操作。本文将详细介绍如何将你的Git本地代码推送到Gitee&#xff08;码云&#xff09;云端仓库。Gitee是一个国内非常流行的代码托管平台&#xff0c;类…

NX—UI界面生成的文件在VS上的设置

UI界面保存生成的三个文件 打开VS创建项目&#xff0c;删除自动生成的cpp文件&#xff0c;将生成的hpp和cpp文件拷贝到项目的目录下&#xff0c;并且在VS项目中添加现有项目。 修改VS的输出路径&#xff0c;项目右键选择属性&#xff0c;链接器中的常规&#xff0c;文件路径D:…

线性代数 第七讲 二次型_标准型_规范型_坐标变换_合同_正定二次型详细讲解_重难点题型总结

文章目录 1.二次型1.1 二次型、标准型、规范型、正负惯性指数、二次型的秩1.2 坐标变换1.3 合同1.4 正交变换化为标准型 2.二次型的主要定理3.正定二次型与正定矩阵4.重难点题型总结4.1 配方法将二次型化为标准型4.2 正交变换法将二次型化为标准型4.3 规范型确定取值范围问题4.…

《中国制药设备行业市场现状分析与发展前景预测研究报告》

报告导读&#xff1a;本报告从国际制药设备发展、国内制药设备政策环境及发展、研发动态、供需情况、重点生产企业、存在的问题及对策等多方面多角度阐述了制药设备市场的发展&#xff0c;并在此基础上对制药设备的发展前景做出了科学的预测&#xff0c;最后对制药设备投资潜力…

​​操作系统 ---- 进程调度的时机、切换与过程

目录 一、进程调度的时机 1.1 什么时候需要进行进程调度与切换&#xff1f; 1.2 什么情况下不能进行进程调度与切换&#xff1f; 二、进程调度的方式 2.1 非抢占方式(Nonpreemptive Mode) 2.2 抢占方式(Preemptive Mode) 三、总结 一、进程调度的时机 进程调度&am…

FreeRTOS内部机制学习04(任务通知和软件定时器)

文章目录 何为任务通知&#xff1f;任务通知使用例子任务通知的优势以及劣势优势劣势 深入源码看看API函数内部干了什么函数的种类函数都做了啥&#xff1f; 软件定时器软件定时器的作用软件定时器内部到底做了什么实现了“闹钟”功能引入守护任务&#xff0c;守护任务做了啥&a…

SprinBoot+Vue网上购物商城的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

我们怎么把自动化测试落地到一个项目上呢?

现在的软件测试行业已经不是原先的点点点的功能测试&#xff0c;要想在软件测试这一行中扎根稳住&#xff0c;就需要你会的很多&#xff0c;不局限于功能测试&#xff0c;还要会自动化测试、接口测试、性能测试等。 今天就来说一下自动化测试&#xff0c;首先什么是自动化测试…

简单分享-获取.txt文件内数据 文件内数据逗号分隔 分隔符 C语言

简单分享-获取.txt文件内数据 文件内数据逗号分隔 分隔符 C语言 数据存储到文件中&#xff0c;把文件数据读取到数组&#xff0c;方便数据处理。 # include <stdio.h> # include <stdlib.h> # include <string.h>#define DATANUM 307200 //数组个数 int ma…

Linux之MySQL定时备份

#!/bin/bash #author: zking #MySQL定义备份并发送邮件 #定义变量 DATE$(date %F"_"%H:%M:%S) HOST127.0.0.1 DBdb1 USERNAMEroot PASSWORDun1xR00t MAILdonkeevip.qq.com BACKUP_DIR/data/db_backup SQL_FILE${DB}_sql_$DATE.sql#判断备份目录是否存在 if [ ! -d $B…

Visual Studio提示:无法安装CPpython.Exe.x64

如果你需要在Visual Studio中使用python环境&#xff0c;而且你本身已经有一个python环境&#xff0c;则只需要将你自己的python环境配置到Visual Studio中即可&#xff0c;可以无视如题报错&#xff0c;将不会产生实质性的问题或影响。 解决办法&#xff1a; 工具->获取工…

zabbix“专家坐诊”第255期问答

问题一 Q&#xff1a;大家好&#xff0c;问一下&#xff0c;zabbix做聚合图的时候&#xff0c;可以做到两根线在一个图里- 吗&#xff1f;还是说只能&#xff0c;单边计算聚合&#xff0c;然后再最后作图的时候&#xff0c;添加两条线上去 A&#xff1a;两个数据吗 Q&#xff…

安全政策与安全意识(上)

目录 1、信息安全保障 信息安全保障的三大支柱 2、网络犯罪 2.1 网络犯罪的概念 网络犯罪与计算机犯罪区别 2.2 网络犯罪的特点 2.3 犯罪形式 2.4 网络犯罪的原因(主观) 2.5 网络犯罪的原因(客观) 2.5预防网络犯罪的对策 2.6 计算机信息网络国际联网安全保护管理办法…

C语言知识体系思维导图

为了更清晰地描述C语言知识体系&#xff0c;笔者用一个结构化的思维导图来概括其主要组成部分。见下&#xff1a; 这个思维导图旨在提供一个全面而系统的视角&#xff0c;帮助学习者逐步构建扎实的C语言知识体系。随着学习的深入&#xff0c;可以根据个人兴趣和职业需求&#x…

缓存预热/雪崩/穿透/击穿

1. 缓存预热 预先将MySQL中的数据同步至Redis的过程 2. 缓存雪崩 Redis主机出现故障&#xff0c;或有大量的key同时过期大面积失效导致Redis不可用 Redis中key设置为永不过期&#xff0c;或者过期时间错开Redis缓存集群实现高可用多缓存结合预防雪崩服务降级 3. 缓存穿透 …

51单片机-AT24C02(IIC总线介绍及其时序编写步骤)-第一节(下一节实战)

IIC开始通信&#xff08;6大步&#xff09; 我以前的文章也有对基本常用的通信协议讲解&#xff0c;如SPI UART IIC RS232 RS485 CAN的讲解&#xff0c;可前往主页查询&#xff0c;&#xff08;2024.9.12,晚上20&#xff1a;53&#xff0c;将AT24C02存储芯片&#xff0c;掉电不…