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

news/2024/12/2 23:03:20/

基于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.ppmy.cn/news/49449.html

相关文章

Infura的基本用途和具体实例

文章目录 Infura 可以做什么?1. 向以太坊网络发送交易并获取交易的结果2. 获取以太坊地址的余额、交易历史记录等信息3. 通过 Web3.js 等以太坊库与智能合约进行交互3. 使用 Infura 发送以太币4. 其他服务 Infura 是一个由 ConsenSys 开发的以太坊基础设施服务提供商…

反向传播推导+numpy实现

很久没有看深度学习了,忘了好多东西。本来想着推导一下,后来发现自己不会了。 再看看以前写的代码,又避开了最终的东西,于是决定重新推导一下。 数据的说明 首先,我们要做一个回归的任务,我们使用numpy随…

《Java8实战》第12章 新的日期和时间 API

原来的Java的时间类Date、java.util.Calendar类都不太好,以语言无关方式格式化和解析日期或时间的 DateFormat 方法也有线程安全的问题 12.1 LocalDate、LocalTime、LocalDateTime、Instant、Duration 以及 Period 12.1.1 使用 LocalDate 和 LocalTime LocalDate…

c++学习之类与对象3

目录 成员变量和函数的存储 this指针 this指针的工作原理 this指针的应用 const修饰的成员函数 友元 友元的语法 1.普通全局函数成为类的友元 2.类的某个成员函数作为另一个类的友元 整个类作为另一个类的友元 运算符重载 1 运算符重载的基本概念 2 重载加号运算符…

Medical X-rays Dataset汇总(长期更新)

目录​​​​​​​ ChestX-ray8 ChestX-ray14 VinDr-CXR VinDr-PCXR ChestX-ray8 ChestX-ray8 is a medical imaging dataset which comprises 108,948 frontal-view X-ray images of 32,717 (collected from the year of 1992 to 2015) unique patients with the text-mi…

FPGA基于XDMA实现PCIE X8采集AD7606数据 提供工程源码和QT上位机程序和技术支持

1、前言 PCIE(PCI Express)采用了目前业内流行的点对点串行连接,比起 PCI 以及更早期的计算机总线的共享并行架构,每个设备都有自己的专用连接,不需要向整个总线请求带宽,而且可以把数据传输率提高到一个很…

CSS浮动

CSS结构伪类选择器 结构伪类选择器用于选择文档结构中特定位置的元素,根据元素在其父元素中的相对位置或兄弟关系进行选择。这些选择器使得你能够更灵活地控制页面的样式。 :first-child(常用) 用途:选择元素的第一个子元素。 …

六:内存回收

内存回收: 应用程序通过 malloc 函数申请内存的时候,实际上申请的是虚拟内存,此时并不会分配物理内存。 当应用程序读写了这块虚拟内存,CPU 就会去访问这个虚拟内存, 这时会发现这个虚拟内存没有映射到物理内存&…