基于JavaSpringMvc+mybatis实现学生信息管理系统

news2025/1/12 6:18:12

基于JavaSpringMvc+mybatis实现学生信息管理系统

博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域
作者主页 超级帅帅吴
Java毕设项目精品实战案例《500套》
欢迎点赞 收藏 ⭐留言
文末获取源码联系方式

文章目录

  • 基于JavaSpringMvc+mybatis实现学生信息管理系统
  • 摘要设计:
  • 系统功能概述:
  • 主要功能截图:
    • 教师登录后主要页面展示:
    • 学生用户登录:
  • 主要代码展示:
  • 主要数据库设计:
  • 获取源码:

摘要设计:

本次系统设计以方便快捷和安全为出发点,放弃传统的人工记录对学生信息管理的缺陷和不足, 采用全新的方式使学校对学生信息进行存储和维护,增加管理效率。本系统大体分为管理员登录管理后台、学生登录选课及对老师授课等三大模块、并且赋予了管理员很多功能来操作这个系统,包括:学生管理,老师管理,选课管理,密码修改等功能;为学生用户提供了选修改课程查询 、选择、密码修改等功能。通过这些功能模块的设计,满足了老师对学生的信息进行管控所需的功能。系统采用 B/S 三层结构,对动态页面的制作采用了 JSP技术,为了实现管理系统的安全可靠以及对有些代码可以进行重复使用考虑, 对程序的重要代码进行封装时采用 Java Bean。本系统贯彻以人为本的思想,实用性高。

系统功能概述:

主要模块设计如下:
使用Shiro权限管理框架,实现登录验证和登录信息的储存,根据不同的登录账户,分发权限角色,对不同页面url进行角色设置。 管理员可对 教师信息、学生信息、课程信息 进行 增删改查 操作,管理员账户,可以重置非管理员账户的密码。
课程管理:当课程已经有学生选课成功时,将不能删除学生管理:添加学生信息时,其信息也会添加到登录表中教师管理:同上账户密码重置:
教师登陆后,可以获取其,教授的课程列表,并可以给已经选择该课程的同学打分无法对已经给完分的同学进行二次操作
学生登录后,根据学生信息,获取其已经选择的课程,和已经修完的课程
所有课程: 在这里选修课程,选好后,将会自动跳转到已选课程选项
已选课程: 这里显示的是,还没修完的课程,也就是老师还没给成绩,由于还没有给成绩,所以这里可以进行退课操作
已修课程: 显示已经修完,老师已经给成绩的课程修改密码:

主要功能截图:

用户登录:用户登录是选择角色进行登录:管理员、教师、学生
在这里插入图片描述
系统主页:管理员登录后具体功能模块可对 教师信息、学生信息、课程信息 进行 增删改查 操作,管理员账户,可以重置非管理员账户的密码。
在这里插入图片描述
课程管理:课程列表管理和添加课程等具体操作
在这里插入图片描述
添加录入课程信息
在这里插入图片描述
学生管理:学生列表管理和添加学生等具体操作
在这里插入图片描述
添加学生信息
在这里插入图片描述
教师管理:
在这里插入图片描述
文件上传下载:
文件列表和下载文件
在这里插入图片描述
文件上传
在这里插入图片描述
账号相关:
在这里插入图片描述

教师登录后主要页面展示:

查看授课列表
在这里插入图片描述
查看该课程学生信息
在这里插入图片描述
给学生成绩打分
在这里插入图片描述

学生用户登录:

根据学生信息,获取其已经选择的课程,和已经修完的课程
在这里插入图片描述

主要代码展示:

登录相关

package com.system.controller;
 
import com.system.exception.CustomException;
import com.system.po.Userlogin;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
 
/**
 * Created by 李杨勇.
 */
@Controller
public class LoginController {
 
    //登录跳转
    @RequestMapping(value = "/login", method = {RequestMethod.GET})
    public String loginUI() throws Exception {
        return "../../login";
    }
 
    //登录表单处理
    @RequestMapping(value = "/login", method = {RequestMethod.POST})
    public String login(Userlogin userlogin) throws Exception {
 
        //Shiro实现登录
        UsernamePasswordToken token = new UsernamePasswordToken(userlogin.getUsername(),
                userlogin.getPassword());
        Subject subject = SecurityUtils.getSubject();
 
        //如果获取不到用户名就是登录失败,但登录失败的话,会直接抛出异常
        subject.login(token);
        if (subject.hasRole("admin")&userlogin.getRole()==0) {
                return "redirect:/admin/showStudent";
        } else if (subject.hasRole("teacher")&userlogin.getRole()==1) {
                return "redirect:/teacher/showCourse";
        } else if (subject.hasRole("student")&userlogin.getRole()==2) {
                return "redirect:/student/showCourse";
        }else throw new CustomException("请选择正确的身份登陆");
 
 
    }
 
}

文件上传

package com.system.controller;
 
import com.system.po.FileVO;
import com.system.service.FileService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
 
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.UUID;
 
/**
 * 文件上传下载
 */
@Controller
@RequestMapping("/file")
public class FileController {
 
 
    @Resource(name = "fileServiceImpl")
    private FileService fileService;
 
    @RequestMapping("/upload")
    public String  fileUpload(@RequestParam MultipartFile file, FileVO filevo, HttpServletRequest request) throws IOException {
        //上传路径保存设置
        // 把文件写到磁盘
        String fileName = file.getOriginalFilename();
        String[] str = fileName.split("\\.");
        String uuid = UUID.randomUUID().toString().replaceAll("-","");
        String headPath = "E://upload/" + uuid+ "."+str[str.length-1];
        File dest = new File(headPath);
        file.transferTo(dest);
        filevo.setFileID(uuid);
        filevo.setFilePath(headPath);
        filevo.setUserID(null);
        try {
            fileService.save(filevo);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "redirect:/admin/showFile";
    }
 
 
    @RequestMapping("/downFile")
    public void down(HttpServletRequest request, HttpServletResponse response,String fileID) throws Exception{
        FileVO fileVO = fileService.findById(fileID);
        String fileName = fileVO.getFilePath();
        String[] str = fileName.split("\\.");
        InputStream bis = new BufferedInputStream(new FileInputStream(new File(fileName)));
        String filename =  fileVO.getFileName()+"\\."+str[str.length-1];
        filename = URLEncoder.encode(filename,"UTF-8");
        response.addHeader("Content-Disposition", "attachment;filename=" + filename);
        response.setContentType("multipart/form-data");
        BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
        int len = 0;
        while((len = bis.read()) != -1){
            out.write(len);
            out.flush();
        }
        out.close();
    }
 
}

异常处理

package com.system.exception;
 
/**
 *  系统自定义异常类,针对预期异常,需要在程序中抛出此类的异常
 */
public class CustomException extends Exception {
 
    //异常信息
    public String message;
 
    public CustomException(String message) {
        super(message);
        this.message=message;
    }
 
    public String getMessage() {
        return message;
    }
 
    public void setMessage(String message) {
        this.message = message;
    }
}

主要数据库设计:

主要数据表有:专业表、课程表、文件信息表、角色表、学生选课表、老师表、学生表等

CREATE TABLE `college` (
  `collegeID` int(11) NOT NULL,
  `collegeName` varchar(200) NOT NULL COMMENT '课程名',
  PRIMARY KEY (`collegeID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
/*Data for the table `college` */
 
insert  into `college`(`collegeID`,`collegeName`) values 
 
(1,'计算机系'),
 
(2,'设计系'),
 
(3,'财经系');
 
/*Table structure for table `course` */
 
DROP TABLE IF EXISTS `course`;
 
CREATE TABLE `course` (
  `courseID` int(11) NOT NULL,
  `courseName` varchar(200) NOT NULL COMMENT '课程名称',
  `teacherID` int(11) NOT NULL,
  `courseTime` varchar(200) DEFAULT NULL COMMENT '开课时间',
  `classRoom` varchar(200) DEFAULT NULL COMMENT '开课地点',
  `courseWeek` int(200) DEFAULT NULL COMMENT '学时',
  `courseType` varchar(20) DEFAULT NULL COMMENT '课程类型',
  `collegeID` int(11) NOT NULL COMMENT '所属院系',
  `score` int(11) NOT NULL COMMENT '学分',
  PRIMARY KEY (`courseID`),
  KEY `collegeID` (`collegeID`),
  KEY `teacherID` (`teacherID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
/*Data for the table `course` */
 
insert  into `course`(`courseID`,`courseName`,`teacherID`,`courseTime`,`classRoom`,`courseWeek`,`courseType`,`collegeID`,`score`) values 
 
(1,'C语言程序设计',1001,'周二','科401',18,'必修课',1,3),
 
(2,'Python爬虫技巧',1001,'周四','X402',18,'必修课',1,3),
 
(3,'数据结构',1001,'周四','科401',18,'必修课',1,2),
 
(4,'Java程序设计',1002,'周五','科401',18,'必修课',1,2),
 
(5,'英语',1002,'周四','X302',18,'必修课',2,2),
 
(6,'服装设计',1003,'周一','科401',18,'选修课',2,2);
 
/*Table structure for table `role` */
 
DROP TABLE IF EXISTS `role`;
 
CREATE TABLE `role` (
  `roleID` int(11) NOT NULL,
  `roleName` varchar(20) NOT NULL,
  `permissions` varchar(255) DEFAULT NULL COMMENT '权限',
  PRIMARY KEY (`roleID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
/*Data for the table `role` */
 
insert  into `role`(`roleID`,`roleName`,`permissions`) values 
 
(0,'admin',NULL),
 
(1,'teacher',NULL),
 
(2,'student',NULL);
 
/*Table structure for table `selectedcourse` */
 
DROP TABLE IF EXISTS `selectedcourse`;
 
CREATE TABLE `selectedcourse` (
  `courseID` int(11) NOT NULL,
  `studentID` int(11) NOT NULL,
  `mark` int(11) DEFAULT NULL COMMENT '成绩',
  KEY `courseID` (`courseID`),
  KEY `studentID` (`studentID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
/*Data for the table `selectedcourse` */
 
insert  into `selectedcourse`(`courseID`,`studentID`,`mark`) values 
 
(2,10001,12),
 
(1,10001,95),
 
(1,10002,66),
 
(2,10003,99),
 
(5,10001,NULL),
 
(3,10001,NULL),
 
(1,10003,NULL),
 
(4,10003,NULL);
 
/*Table structure for table `student` */
 
DROP TABLE IF EXISTS `student`;
 
CREATE TABLE `student` (
  `userID` int(11) NOT NULL AUTO_INCREMENT,
  `userName` varchar(200) NOT NULL,
  `sex` varchar(20) DEFAULT NULL,
  `birthYear` date DEFAULT NULL COMMENT '出生日期',
  `grade` date DEFAULT NULL COMMENT '入学时间',
  `collegeID` int(11) NOT NULL COMMENT '院系id',
  PRIMARY KEY (`userID`),
  KEY `collegeID` (`collegeID`)
) ENGINE=InnoDB AUTO_INCREMENT=10008 DEFAULT CHARSET=utf8;
 
/*Data for the table `student` */
 
insert  into `student`(`userID`,`userName`,`sex`,`birthYear`,`grade`,`collegeID`) values 
 
(9999,'mike1','男','1996-09-03','2019-11-13',3),
 
(10001,'小红','男','2020-03-02','2020-03-02',1),
 
(10002,'小绿','男','2020-03-10','2020-03-10',1),
 
(10003,'小陈','女','1996-09-02','2015-09-02',2),
 
(10005,'小左','女','1996-09-02','2015-09-02',2),
 
(10007,'MIke','男','1996-09-02','2015-09-02',2);
 
/*Table structure for table `teacher` */
 
DROP TABLE IF EXISTS `teacher`;
 
CREATE TABLE `teacher` (
  `userID` int(11) NOT NULL AUTO_INCREMENT,
  `userName` varchar(200) NOT NULL,
  `sex` varchar(20) DEFAULT NULL,
  `birthYear` date NOT NULL,
  `degree` varchar(20) DEFAULT NULL COMMENT '学历',
  `title` varchar(255) DEFAULT NULL COMMENT '职称',
  `grade` date DEFAULT NULL COMMENT '入职时间',
  `collegeID` int(11) NOT NULL COMMENT '院系',
  PRIMARY KEY (`userID`),
  KEY `collegeID` (`collegeID`)
) ENGINE=InnoDB AUTO_INCREMENT=1004 DEFAULT CHARSET=utf8;
 
/*Data for the table `teacher` */
 
insert  into `teacher`(`userID`,`userName`,`sex`,`birthYear`,`degree`,`title`,`grade`,`collegeID`) values 
 
(1001,'刘老师','女','1990-03-08','硕士','副教授','2015-09-02',2),
 
(1002,'张老师','女','1996-09-02','博士','讲师','2015-09-02',1),
 
(1003,'软老师','女','1996-09-02','硕士','助教','2017-07-07',1);
 
/*Table structure for table `userlogin` */
 
DROP TABLE IF EXISTS `userlogin`;
 
CREATE TABLE `userlogin` (
  `userID` int(11) NOT NULL AUTO_INCREMENT,
  `userName` varchar(200) NOT NULL,
  `password` varchar(200) NOT NULL,
  `role` int(11) NOT NULL DEFAULT '2' COMMENT '角色权限',
  PRIMARY KEY (`userID`),
  KEY `role` (`role`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8;
 
/*Data for the table `userlogin` */
 
insert  into `userlogin`(`userID`,`userName`,`password`,`role`) values 
 
(1,'admin','123',0),
 
(10,'10003','123',2),
 
(11,'10005','123',2),
 
(14,'1001','123',1),
 
(15,'1002','123',1),
 
(16,'1003','123',1),
 
(20,'9999','123',2),
 
(21,'10001','123',2),
 
(22,'10002','123',2);

获取源码:

大家点赞、收藏、关注、评论啦
🍅查看下方微信号获取联系方式 📝
🚀🚀🚀精彩系列推荐
Java毕设项目精品实战案例《500套》
精彩专栏推荐订阅:在下方专栏

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

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

相关文章

IOS Theos Tweak 之 HelloWorld

一、目标 Theos是什么? 是一套跨平台的开发工具套件,不仅可以开发Ios,Mac、Windows和Linux也可以的哦,开源免费。 Tweak是什么? 可以理解成动态链接库,有搞过Windows下dll注入的同学应该可以秒懂了。Android的同学…

JavaWeb——redis_1/6

链接: day23_redis_代码&资料 提取码:ijyg 今日内容redis——数据库软件1. 概念2. 下载安装3. 命令操作1. redis的数据结构2. 字符串类型 string3. 哈希类型 hash4. 列表类型 list:可以添加一个元素到列表的头部(左边)或者尾部&#xff0…

硬件工程师成长之路(0)----认识元件

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录前言1、电阻①、贴片电阻②、金属膜电阻③、水泥电阻④、制动电阻⑤、电位器⑥、压敏电阻⑦、热敏电阻⑧、光敏电阻⑨、…

奇舞周刊478期:算法工程师深度解构 ChatGPT 技术

记得点击文章末尾的“ 阅读原文 ”查看哟~下面先一起看下本期周刊 摘要 吧~奇舞推荐■ ■ ■算法工程师深度解构 ChatGPT 技术本文用专业视野带你由浅入深了解 ChatGPT 技术全貌。它经历了什么训练过程?成功关键技术是什么?将如何带动行业的变革&#xf…

Spark学习(8)-SparkSQL的运行流程,Spark On Hive

1. SparkSQL的运行流程 1.1 SparkRDD的执行流程回顾 1.2 SparkSQL的自动优化 RDD的运行会完全按照开发者的代码执行, 如果开发者水平有限,RDD的执行效率也会受到影响。而SparkSQL会对写完的代码,执行“自动优化”, 以提升代码运…

In-Context Learning玩法大全

卷友们好,我是rumor。虽然ChatGPT在大众眼里的热度可能已经过去了,但它prompt出了我的焦虑,于是最近一直在补大模型相关的工作。比起小模型,大模型有一个很重要的涌现能力(Emergent ability)就是In-Context…

CORS 跨域资源共享 与 JSONP

CORS 1、接口的跨域问题 我们使用express编写的 GET 和 POST接口,存在一个很严重的问题:不支持跨域请求。 解决接口跨域问题的方案主要有两种: CORS(主流的解决方案,推荐使用)JSONP(有缺陷的…

excel查重技巧:如何用组合函数快速统计重复数据(下)

数据源照旧,如下图所示,要求统计出不重复的客户数:在上期我们掌握了破解公式的方法后,今天我们再来看看计算不重复数据个数的第二个公式套路。套路2:COUNT和MATCH的组合这个公式的难度就稍微有点大了,一起看…

Word控件Spire.Doc 【Table】教程(3):如何在C#、VB.NET中设置Word表格样式

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下,轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具,专注于创建、编辑、转…

聊聊帮助别人这件事--爱摸鱼的美工(12)

年近了,上班途中依然匆忙 看女孩子们渐渐开始倒腾 做了新发型,做了美美的指甲 换上了新衣服,买了新包 电话里讨论着 去哪里过年,买什么年货 好像以前的我也这样 今年挣得少了,不想添新衣(不能) …

基于QWidget和QImage的水印添加实现

目录 1. 基于QWidget的屏幕阅读水印的添加 1.1 平铺 1.1.1 核心代码 1.1.2 构造函数中设置透明度和鼠标穿透 1.1.3 调用 1.1.4 效果展示 1.2 指定位置添加水印 1.2.1 核心代码 1.2.2 设置水印透明度和鼠标穿透 1.2.3 调用 1.2.4 效果展示 2、基于QImage的屏幕水印的…

QT 学习笔记(十四)

文章目录一、TCP/IP 通信过程简介1. Socket 通信2. Linux 下的 TCP/IP 通信过程3. QT 下的 TCP/IP 通信过程3.1 在 QT 中实现 TCP/IP 服务器端通信的流程3.2 客户端通信流程二、TCP/IP 通信过程操作实现1. 服务器端2. 客户端三、服务器端和客户端实现代码1. 主函数 main.c2. 服…

重装系统重新分区方法教程

对电脑进行系统重装以后,若是想电脑使用起来更稳定舒适,就要对电脑硬盘进行系统分区,但是许多用户都不知道怎样分区,今天小编就来为大家详细介绍一下重装系统重新分区方法教程。 工具/原料: 系统版本:win1…

11 个非常实用的 Python 和 Shell 拿来就用脚本实例!

我工作中用到的几个脚本,主要分为:Python和Shell两个部分。 Python 脚本部分实例:企业微信告警、FTP 客户端、SSH 客户端、Saltstack 客户端、vCenter 客户端、获取域名 ssl 证书过期时间、发送今天的天气预报以及未来的天气趋势图&#xff…

Verilog语法笔记(夏宇闻第三版)-赋值语句和块语句

目录 赋值语句: (1).非阻塞(Non_Blocking)赋值方式( 如 b < a; ): (2).阻塞(Blocking)赋值方式( 如 b a; ): 例&#xff1a; 块语句&#xff1a; 顺序块&#xff1a; 例&#xff1a; 并行块&#xff1a; 例&#xff1a; ​编辑 块名&#xff1a; 起始时间和结束…

php学习笔记-php运算符,类型转换,打印输出语句相较于其他语言的特殊部分-day02

php运算符&#xff0c;类型转换&#xff0c;打印输出语句相较于其他语言的特殊部分php运算符php的类型转换php打印输出语句php运算符 1.php运算符与其他高级语言相同的部分 算术运算符&#xff08;&#xff0c;-&#xff0c;*&#xff0c;/&#xff0c;%&#xff09;&#xff0…

使用Flask快速部署PyTorch模型

对于数据科学项目来说&#xff0c;我们一直都很关注模型的训练和表现&#xff0c;但是在实际工作中如何启动和运行我们的模型是模型上线的最后一步也是最重要的工作。 今天我将通过一个简单的案例&#xff1a;部署一个PyTorch图像分类模型&#xff0c;介绍这个最重要的步骤。 …

OAK-PoE设备故障排查详解

编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查看首发地址链接。 ▌前言 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是助手…

Linux小黑板(5):磁盘与文件系统

"这月蹦迪没我" 一、浅谈磁盘 磁盘作为计算机硬件里&#xff0c;唯一的机械设备。在数据存储的领域&#xff0c;有着不可磨灭的作用。相较于&#xff0c;保持通电情况下具有保持数据的不丢失的内存&#xff0c;磁盘能够"永久性"地存储 数据。 磁盘是计算机…

1. R语言介绍、Rstudio的基本使用、【R包的安装与使用】、帮助命令、内置数据集

课程视频链接&#xff1a;https://www.bilibili.com/video/BV19x411X7C6?p1 本笔记参照该视频&#xff0c;笔记顺序做了些调整【个人感觉逻辑顺畅】&#xff0c;并删掉一些不重要的内容 系列笔记目录【持续更新】&#xff1a;https://blog.csdn.net/weixin_42214698/category_…