SSM教务管理系统设计与实现(附源码下载地址)

news/2024/10/10 3:22:59

@

目录
  • 01 项目背景
  • 02 使用技术
  • 03 运行环境
  • 04 功能分析
  • 05 数据库设计
  • 06 项目工程结构
  • 07 部分功能展示及源码
    • 7.1 登录页
    • 7.2 管理员端--首页
    • 7.3 管理员端--课程管理
    • 7.4 管理员端--学生管理
    • 7.5 教师端--首页
    • 7.6 教师端--个人信息
    • 7.7 学生端--已修课程
    • 7.8 学生端--公告管理
  • 08 运行教程
  • 09 获取源码

获取源代码:关注微信公众号【IT学长】,回复“20221102”或“教务管理系统”获取本项目完整源码

01 项目背景

教务管理是大学的主要日常管理工作之一,涉及到校、系、师、生的诸多方面,随着教学体制的不断改革,尤其是学分制、选课制的展开和深入,教务日常管理工作日趋复杂繁重。如何把教务工作信息化,模块化,便捷化是现代高校发展的重点,因此研制开发一种综合教务管理软件,建成一个完整统一、技术先进、高效稳定、安全可靠的教务管理系统变得尤为重要。

本系统基于B/S结构,运用MVC(Model-View-Controller)模式,采用先进的Spring、SpringMVC、MyBatis等技术框架 ,实现了课程管理、教师管理、学生管理、院系管理、公告管理、个人信息管理等功能模块,为高校数字化校园建设提供先进实用、安全可靠、便于操作、易干扩展的应用解决方案。

02 使用技术

  • 数据表现层:Jsp+JavaScript+CSS+Bootstrap+JQuery
  • 业务逻辑层:Java+Spring+SpringMVC
  • 数据持久层:MySQL+MyBatis
  • 开发工具:IDEA / Eclipse
  • 安全框架:Shiro
  • 日志:log4j

03 运行环境

JDK1.8 + Maven3.6.3 + MySQL5.7 + Tomcat9.0

04 功能分析

管理员:

  1. 首页
    • 卡片方式展示系统管理员拥有的权限,点击卡片可快捷跳转到对应的功能模块
  2. 课程管理
    • 课程列表:显示已添加的课程信息,对课程进行搜索、修改、删除操作
    • 课程添加:添加课程信息,输入课程号、课程名称、授课教师、上课时间、上课地点、学时、课程类型、所属院系、学分进行课程信息添加
  3. 教师管理
    • 教师列表:显示已添加的教师信息,对教师进行搜索、修改、删除操作
    • 教师添加:添加教师信息,输入工号、姓名、性别、出生年份、学历、职称、入职时间、所属院系进行教师信息添加
  4. 学生管理
    • 学生列表:显示已添加的学生信息,对学生进行搜索、修改、删除操作
    • 学生添加:添加学生信息,输入学号、姓名、性别、出生年份、入学时间、所属院系进行学生信息添加
  5. 院系管理
    • 院系列表:显示已添加的院系信息,对院系进行搜索、修改操作
    • 院系添加:添加院系信息,输入院系ID、院系名称进行院系信息添加
  6. 公告管理
    • 公告列表:显示已发布的公告信息,对发布的公告进行搜索、修改、详情、删除操作
    • 公告发布:输入公告ID、公告标题,发布时间,公告内容、公告类型发布公告信息
  7. 密码重置
    • 重置其它用户密码(除管理员以外),输入账号(非管理员账号)、密码后重置用户密码
  8. 密码修改
    • 修改登录用户的密码

教师:

  1. 首页
    • 卡片方式展示教师拥有的权限,点击卡片可快捷跳转到对应的功能模块
  2. 我的课程
    • 课程列表:显示登录教师教授的所有课程,教师可通过关键词查询课程信息
    • 课程打分:教师对选修了该课程的学生打分
  3. 公告管理
    • 公告列表:显示公告类型为“全体可见”和“教师可见”的公告信息,登录教师可以对已经发布的公告进行搜索、详情操作
  4. 个人信息
    • 展示登录用户的Id、姓名、性别、出生年份、学历、职称、入职年份、所属院系信息
  5. 密码修改
    • 修改登录用户的密码

学生:

  1. 首页
    • 卡片方式展示学生拥有的权限,点击卡片可快捷跳转到对应的功能模块
  2. 所有课程
    • 课程列表:显示所有的课程信息,可通过关键词搜索课程,登录学生进行选课
  3. 已选课程
    • 课程列表:显示登录学生选修的课程信息,并且可以对非必修课进行退课操作
  4. 已修课程
    • 课程列表:显示登录学生已修的课程信息,查看成绩
  5. 公告管理
    • 公告列表:显示公告类型为“全体可见”和“学生可见”的公告信息,登录学生可以对已经发布的公告进行搜索、详情操作
  6. 个人信息
    • 展示登录用户的Id、姓名、性别、出生年份、入学时间、所属院系信息
  7. 密码修改
    • 修改登录用户的密码

05 数据库设计

数据库详细设计见 “教务管理系统设计与实现(SSM+MySQL+JSP)”源码包中 educational_manage.sql 文件。

源码包通过第09章节下载

06 项目工程结构

下载本项目源码并导入到开发工具后(下图为导入到Eclipse中的目录结构),项目的目录结构如下图所示:

07 部分功能展示及源码

7.1 登录页

部分代码:

package com.cya.controller;import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
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;import com.cya.entity.Userlogin;/*** @author 【IT学长】* @version*/@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")) {return "redirect:/admin/index";} else if (subject.hasRole("teacher")) {return "redirect:/teacher/index";} else if (subject.hasRole("student")) {return "redirect:/student/index";}return "/login";}}

7.2 管理员端--首页

7.3 管理员端--课程管理

课程列表:

课程添加:

部分代码:

package com.cya.service.impl;import com.cya.entity.*;
import com.cya.mapper.CollegeMapper;
import com.cya.mapper.CourseMapper;
import com.cya.mapper.CourseMapperCustom;
import com.cya.mapper.SelectedcourseMapper;
import com.cya.service.CourseService;import org.apache.commons.beanutils.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author 【IT学长】* @version 2022-10-6*/@Service
public class CourseServiceImpl implements CourseService {@Autowiredprivate CourseMapper courseMapper;@Autowiredprivate CourseMapperCustom courseMapperCustom;@Autowiredprivate CollegeMapper collegeMapper;@Autowiredprivate SelectedcourseMapper selectedcourseMapper;public void upadteById(Integer id, CourseCustom courseCustom) throws Exception {courseMapper.updateByPrimaryKey(courseCustom);}public Map<String, Object> removeById(Integer id) throws Exception {Map<String, Object> resMap = new HashMap<String, Object>();// 自定义查询条件SelectedcourseExample example = new SelectedcourseExample();SelectedcourseExample.Criteria criteria = example.createCriteria();criteria.andCourseidEqualTo(id);criteria.andMarkIsNull();List<Selectedcourse> list = selectedcourseMapper.selectByExample(example);if (list.size() == 0) {courseMapper.deleteByPrimaryKey(id);resMap.put("status", true);resMap.put("message", "删除成功");} else {List<String> tempList = new ArrayList<String>();for (Selectedcourse selectedcourse : list) {tempList.add(selectedcourse.getStudentid().toString());}// 根据课程号查授课教师Course course = courseMapper.selectByPrimaryKey(id);resMap.put("status", false);resMap.put("message", tempList);if (course != null) {resMap.put("teacherID", course.getTeacherid());}}return resMap;}public List<CourseCustom> findByPaging(Integer toPageNo) throws Exception {PagingVO pagingVO = new PagingVO();pagingVO.setToPageNo(toPageNo);List<CourseCustom> list = courseMapperCustom.findByPaging(pagingVO);return list;}public Boolean save(CourseCustom couseCustom) throws Exception {Course course = courseMapper.selectByPrimaryKey(couseCustom.getCourseid());if (course == null) {courseMapper.insert(couseCustom);return true;}return false;}public int getCountCouse() throws Exception {// 自定义查询对象CourseExample courseExample = new CourseExample();// 通过criteria构造查询条件CourseExample.Criteria criteria = courseExample.createCriteria();criteria.andCoursenameIsNotNull();return courseMapper.countByExample(courseExample);}public CourseCustom findById(Integer id) throws Exception {Course course = courseMapper.selectByPrimaryKey(id);CourseCustom courseCustom = null;if (course != null) {courseCustom = new CourseCustom();BeanUtils.copyProperties(courseCustom, course);}return courseCustom;}public List<CourseCustom> findByName(String name, Integer teacherId) throws Exception {CourseExample courseExample = new CourseExample();// 自定义查询条件CourseExample.Criteria criteria = courseExample.createCriteria();criteria.andCoursenameLike("%" + name + "%");if (teacherId != null) {criteria.andTeacheridEqualTo(teacherId);}List<Course> list = courseMapper.selectByExample(courseExample);List<CourseCustom> courseCustomList = null;if (list != null) {courseCustomList = new ArrayList<CourseCustom>();for (Course c : list) {CourseCustom courseCustom = new CourseCustom();// 类拷贝org.springframework.beans.BeanUtils.copyProperties(c, courseCustom);// 获取课程名College college = collegeMapper.selectByPrimaryKey(c.getCollegeid());courseCustom.setcollegeName(college.getCollegename());courseCustomList.add(courseCustom);}}return courseCustomList;}public List<CourseCustom> findByTeacherID(Integer id) throws Exception {CourseExample courseExample = new CourseExample();// 自定义查询条件CourseExample.Criteria criteria = courseExample.createCriteria();// 根据教师id查课程criteria.andTeacheridEqualTo(id);List<Course> list = courseMapper.selectByExample(courseExample);List<CourseCustom> courseCustomList = null;if (list.size() > 0) {courseCustomList = new ArrayList<CourseCustom>();for (Course c : list) {CourseCustom courseCustom = new CourseCustom();// 类拷贝BeanUtils.copyProperties(courseCustom, c);// 获取课程名College college = collegeMapper.selectByPrimaryKey(c.getCollegeid());courseCustom.setcollegeName(college.getCollegename());courseCustomList.add(courseCustom);}}return courseCustomList;}
}

7.4 管理员端--学生管理

学生列表:

学生修改:

7.5 教师端--首页

7.6 教师端--个人信息

部分源码:

 //查询个人信息@RequestMapping(value = "/teacherInfo")public String teacherInfo(Model model) throws Exception {Subject subject = SecurityUtils.getSubject();String username = (String) subject.getPrincipal();TeacherCustom teacherCustom = teacherService.findById(Integer.parseInt(username));if (teacherCustom == null) {throw new CustomException("未找到此教师信息") ;}model.addAttribute("teacher", teacherCustom);return "teacher/teacherInfo";}

7.7 学生端--已修课程

7.8 学生端--公告管理

公告列表:

公告详情:

部分源码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.cya.mapper.NoticeMapper"><resultMap id="BaseResultMap" type="com.cya.entity.Notice"><id column="id" property="id" jdbcType="INTEGER" /><result column="title" property="title" jdbcType="VARCHAR" /><result column="date" property="date" jdbcType="TIMESTAMP" /><result column="content" property="content"jdbcType="LONGVARCHAR" /><result column="type" property="type" jdbcType="VARCHAR" /></resultMap><sql id="Example_Where_Clause"><where><foreach collection="oredCriteria" item="criteria"separator="or"><if test="criteria.valid"><trim prefix="(" suffix=")" prefixOverrides="and"><foreach collection="criteria.criteria" item="criterion"><choose><!-- <when test="criterion.noValue" > and ${criterion.condition} </when> --><when test="criterion.singleValue">and ${criterion.condition} #{criterion.value}</when><when test="criterion.betweenValue">and ${criterion.condition} #{criterion.value} and#{criterion.secondValue}</when><when test="criterion.listValue">and ${criterion.condition}<foreach collection="criterion.value" item="listItem"open="(" close=")" separator=",">#{listItem}</foreach></when></choose></foreach></trim></if></foreach></where></sql><sql id="Base_Column_List">id, title, date, content, type</sql><select id="selectByExample" resultMap="BaseResultMap"parameterType="com.cya.entity.NoticeExample">select<if test="distinct">distinct</if><include refid="Base_Column_List" />from notice<if test="_parameter != null"><include refid="Example_Where_Clause" /></if><if test="orderByClause != null">order by ${orderByClause}</if></select><select id="selectByPrimaryKey" resultMap="BaseResultMap"parameterType="java.lang.Integer">select<include refid="Base_Column_List" />from noticewhere id = #{id,jdbcType=INTEGER}</select><delete id="deleteByPrimaryKey"parameterType="java.lang.Integer">delete from noticewhere id = #{id,jdbcType=INTEGER}</delete><insert id="insert" parameterType="com.cya.entity.Notice">insert into notice (id, title, date, content, type)values (#{id,jdbcType=INTEGER},#{title,jdbcType=VARCHAR},#{date,jdbcType=TIMESTAMP},#{content,jdbcType=LONGVARCHAR},#{type,jdbcType=VARCHAR})</insert><insert id="insertSelective"parameterType="com.cya.entity.Notice">insert into notice<trim prefix="(" suffix=")" suffixOverrides=","><if test="id != null">id,</if><if test="title != null">title,</if><if test="date != null">date,</if><if test="content != null">content,</if><if test="type != null">type,</if></trim><trim prefix="values (" suffix=")" suffixOverrides=","><if test="id != null">#{id,jdbcType=INTEGER},</if><if test="title != null">#{title,jdbcType=VARCHAR},</if><if test="date != null">#{date,jdbcType=TIMESTAMP},</if><if test="content != null">#{content,jdbcType=LONGVARCHAR},</if><if test="type != null">#{type,jdbcType=VARCHAR},</if></trim></insert><select id="countByExample"parameterType="com.cya.entity.NoticeExample"resultType="java.lang.Integer">select count(*) from notice<if test="_parameter != null"><include refid="Example_Where_Clause" /></if></select><update id="updateByPrimaryKeySelective"parameterType="com.cya.entity.Notice">update notice<set><if test="title != null">title = #{title,jdbcType=VARCHAR},</if><if test="date != null">date = #{date,jdbcType=TIMESTAMP},</if><if test="content != null">content = #{content,jdbcType=LONGVARCHAR},</if><if test="type != null">type = #{type,jdbcType=VARCHAR},</if></set>where id = #{id,jdbcType=INTEGER}</update><update id="updateByPrimaryKey"parameterType="com.cya.entity.Notice">update noticeset title = #{title,jdbcType=VARCHAR},date = #{date,jdbcType=TIMESTAMP},content = #{content,jdbcType=LONGVARCHAR},type = #{type,jdbcType=VARCHAR}where id = #{id,jdbcType=INTEGER}</update>
</mapper>

08 运行教程

详细运行步骤及常见问题解答请看“教务管理系统设计与实现(SSM+MySQL+JSP)”源码包中 README.md 文件。

通过第09章节下载源码包并解压后如下图所示:

09 获取源码

本期内容就到这里,感谢你的阅读。获取源代码:关注微信公众号【IT学长】,回复“20221102”或“教务管理系统”获取本项目完整源码。关键词一定要输完整、输对哦!!

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

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

相关文章

AutoCAD C# 两不平行直线倒圆弧算法

下面是计算示例主要计算代码:var peo = new PromptEntityOptions("选择直线1"){AllowNone = false,AllowObjectOnLockedLayer = false};peo.SetRejectMessage("请选择直线Line");peo.AddAllowedClass(typeof(Line), false);var per1 = AcEnv.CurEd.GetEnt…

sublime设置默认打开侧边栏(失败)

描述 每次使用sublime打开某个目录,总是不显示侧边栏,还得手动打开。 过程 在设置里找了半天似乎没有这个选项,有点离谱,网上搜到的全是手动打开侧边栏。看来只能Ctrl+KB按得勤快些了。// Display the toggle sidebar button in the status bar"show_sidebar_button&q…

C++模板

C++模板 C++是一个面向对象编程的语言,提供了类的继承和组合机制,虽然在层次结构上很简单,但使用起来非常糟糕。C++使用关键字template,告诉编译器声明的类或者对象是一个模板。模板不是像继承和组合那样重用目标代码,而是重用源代码。容器不再包含名为 Object 的泛型基类…

Matlab安装教程(Linux)

解压安装包 在虚拟机中,文件直接通过拖拽文件的方式将安装包拉入虚拟机时,文件通常存放在/tmp/VMwareDnD中,因此需要将存放文件位置的文件转移到/home/<用户名>/<存放目录>中 参考命令如下: mv /tmp/VMwareDnD/<文件存放目录>/* /home/<用户名>/&l…

2. 基础配置

1. 配置文件格式 1.1 配置文件自动提示功能消失解决方案 ​​ 1.2 SpringBoot配置文件加载顺序(了解) application.properties > application.yml > application.yaml 1.3 注意事项 SpringBoot核心配置文件名为application SpringBoot内置属性过多,且所有属性集中…

Qt/C++音视频开发72-倍速推流/音视频同步倍速推流/不改变帧率和采样率/低倍速和高倍速

一、前言 最近多了个新需求,需要倍速推流,推流界的扛把子obs也有倍速推流功能,最高支持到两倍速。这里所说的倍速,当然只限定在文件,只有文件才可能有倍速功能,因为也只有文件才能倍速解码播放。实时视频流是不可能倍速的,因为没有时长,有时长的才可以按照播放进度来。…

Excel求解器使用教程

添加规则求解加载项创建excel文件,点击文件点击选项选择加载项->规则求解加载项->转到选择规则求解加载项->确定求解器所在位置---数据->规划求解在excel文档中填写相关的计算公式,用来求解点击规则求解,填写对应的目标,可变单元和约束,选择求解方法来求解通过…

虚拟机创建教程

虚拟机创建 创建虚拟机的时候,选择自定义,自己来创建虚拟机在虚拟机中,选择创建16.2.X版本的虚拟机,兼容性比较好在创建虚拟机的操作系统时,选择稍后安装操作系统,实测中如果选择其他的在安装过程中会跳过系统安装的部分阶段选择对应的系统和版本选择名称和安装位置,个人…