首页 > 编程语言 >SSM教务管理系统设计与实现(附源码下载地址)

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

时间:2024-05-05 14:55:24浏览次数:14  
标签:课程 教务 SSM -- 源码 jdbcType import id

@

目录

获取源代码:关注微信公众号【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 {

	@Autowired
	private CourseMapper courseMapper;

	@Autowired
	private CourseMapperCustom courseMapperCustom;

	@Autowired
	private CollegeMapper collegeMapper;

	@Autowired
	private 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 notice
		where id = #{id,jdbcType=INTEGER}
	</select>


	<delete id="deleteByPrimaryKey"
		parameterType="java.lang.Integer">
		delete from notice
		where 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 notice
		set 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”或“教务管理系统”获取本项目完整源码。关键词一定要输完整、输对哦!!

标签:课程,教务,SSM,--,源码,jdbcType,import,id
From: https://www.cnblogs.com/ITXueZhang/p/18173497

相关文章

  • Kubernetes源码二次开发系列(一到三),玩转高阶K8s开发
    Kubernetes源码二次开发通常涉及以下步骤:环境准备:安装和配置Go环境,确保Go版本与Kubernetes项目兼容。获取源码:从GitHub克隆Kubernetes仓库到本地。设置工作环境:通过make命令设置编译环境。修改源码:根据需求修改Kubernetes源码。编译:使用makeall编译所有组......
  • 基于SSM的在线考试系统毕业设计论文【范文】
    摘要随着信息技术的飞速发展,网络教学逐渐成为教育行业的重要组成部分。在线考试系统作为网络教学平台的关键模块之一,其便捷性、高效性和公正性受到广泛关注,基于SSM框架的在线考试系统旨在提供一个稳定、可靠并且易于维护的在线考试环境,以满足现代教育评价的需求。本研究围绕在线......
  • im即时通讯源码/仿微信app源码+php即时通讯源码带红包+客服+禁言等系统php+uniapp开发
    即时通讯(IM)系统是现代互联网应用中不可或缺的一部分,它允许用户进行实时的文本、语音、视频交流。随着技术的发展,IM系统的功能越来越丰富,如红包、客服、禁言等。本文将探讨如何使用PHP语言开发一个功能完备的即时通讯系统,包括源码解析、系统架构、关键功能实现等。仓库源码:ym.fz......
  • 基于SSM的仓库进销存系统毕业设计论文【范文】
    摘要随着信息技术的不断发展,企业对于仓储管理的要求日益提高。为了提升仓库管理的自动化和智能化水平,本研究设计并实现了一个基于Spring、SpringMVC和MyBatis(SSM)框架的在仓库进销存系统。该系统旨在为企业提供一个高效、准确、实时的库存管理解决方案,以优化库存控制,降低成本......
  • std::move 和 std::forward源码解析
    std::move和std::forward仅仅是执行转换(cast)的函数(事实上是函数模板)。std::move无条件的将它的实参转换为右值,而std::forward只在特定情况满足时下进行转换。std::movetemplate<class_Ty>constexprremove_reference_t<_Ty>&&move(_Ty&&_Arg)noexcept{returnstatic......
  • ssm项目2023年最新所需要的所有依赖,成套亲测包能用
    今天下午研究了一下午报错结果就是好多最新版的依赖版本不兼容的问题,换了这套直接就跑起来了烦的很1<dependencies>2<!--SpringFramework-->3<dependency>4<groupId>org.springframework</groupId>5<artifactId>spring-context</art......
  • Flink源码学习(6)StreamTask的初始化和执行
    Stream初始化taskExecutor执行一个Task当taskExecutor接受提交Task执行的请求,会调用:CompletableFuture<Acknowledge>submitTask(TaskDeploymentDescriptortdd,JobMasterIdjobMasterId,@RpcTimeoutTimetimeout);提交Task到TM提交Job过来的JobManager和......
  • 基于SSM的在线外卖订餐系统毕业设计论文【范文】
    摘要随着互联网技术的迅猛发展和人们生活节奏的加快,在线外卖订餐系统因其便捷性和高效率而受到广泛欢迎。本文围绕《基于SSM框架的在线外卖订餐系统》这一课题展开研究,旨在设计并实现一个功能全面、操作简便且安全可靠的在线外卖订餐平台。首先,文中通过详细的需求分析,确定了系统......
  • 基于SSM的酒店管理系统毕业设计论文【范文】
    摘要随着旅游业的蓬勃发展及商务活动的频繁,酒店行业作为其重要组成部分,对信息化管理的需求日益迫切。本研究课题针对现代酒店业的管理需求,设计并实现了一个基于Spring、SpringMVC和MyBatis(SSM)框架的酒店管理系统。该系统旨在提高酒店业务处理效率,优化客房管理流程,增强客户服务体......
  • 26-Spring源码分析(一)
    1.Spring架构设计Spring框架是一个分层架构,他包含一系列的功能要素,并被分为大约20个模块。1.1设计理念Spring是面向Bean的编程(BOP:BeanOrientedProgramming),Bean在Spring中才是真正的主角。Bean在Spring中作用就像Object对OOP的意义一样,没有对象的概念就像......