基于SSM的教材管理系统(含源码+sql+视频导入教程)

news2024/11/27 6:36:12

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

1 、功能描述

  基于SSM的教材管理系统1拥有两种角色:

管理员:学生管理、学院管理、出版社管理、教材管理、入库、分配、订购分类

学生:查看出版社和教材

1.1 背景描述

  SSM教材管理系统是一种基于Spring、Spring MVC和MyBatis框架的应用程序,旨在帮助学校或教育机构有效管理其教材资源。该系统提供了学科分类、教材采购、库存管理、借阅追踪和报废处理等功能。教师可以轻松查找并申请所需教材,管理员能够实时监控教材库存情况并进行适时补充。学生通过系统可以查询可借阅的教材并进行借阅操作,同时系统能够自动提醒归还日期以减少逾期情况。这种系统简化了教材管理流程,提高了资源利用效率,为教育管理提供了便捷的解决方案。

2、项目技术

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

前端技术:jsp

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都可运行
  • 数据库类型:MySql(5.7、8.x版本都可)
  • tomcat版本:Tomcat 7-10版本均可
  • maven版本:无限制
  • 硬件环境:Windows

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

4.1 登录

登录

4.2 管理员模块

管理员-教材选定管理

管理员-教材管理

管理员-出版社管理

管理员-学院管理

管理员-学生管理

管理员-教材入库管理

管理员-教材订购管理

4.3 学生模块

学生后端功能列表

5 、核心代码实现

5.1 配置代码


spring:
  datasource:
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/chuangmeng?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
  servlet:
    multipart:
      max-file-size: 50MB
      max-request-size: 50MB
server:
  port: 521
redis:
  open: false
shiro:
  redis: false
logging:
  level:
    com:
      mh: debug
mybatis-plus:
  type-aliases-package: com.mh.*.entity
  mapper-locations: classpath*:/mapper/*/*.xml

5.2 其它核心代码


package com.controller;


import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.TokenEntity;
import com.entity.UserEntity;
import com.service.TokenService;
import com.service.UserService;
import com.utils.CommonUtil;
import com.utils.MPUtil;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.ValidatorUtils;

/**
 * 登录相关
 */
@RequestMapping("users")
@RestController
public class UserController{
	
	@Autowired
	private UserService userService;
	
	@Autowired
	private TokenService tokenService;

	/**
	 * 登录
	 */
	@IgnoreAuth
	@PostMapping(value = "/login")
	public R login(String username, String password, String captcha, HttpServletRequest request) {
		UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
		if(user==null || !user.getPassword().equals(password)) {
			return R.error("账号或密码不正确");
		}
		String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());
		return R.ok().put("token", token);
	}
	
	/**
	 * 注册
	 */
	@IgnoreAuth
	@PostMapping(value = "/register")
	public R register(@RequestBody UserEntity user){
//    	ValidatorUtils.validateEntity(user);
    	if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
    		return R.error("用户已存在");
    	}
        userService.insert(user);
        return R.ok();
    }

	/**
	 * 退出
	 */
	@GetMapping(value = "logout")
	public R logout(HttpServletRequest request) {
		request.getSession().invalidate();
		return R.ok("退出成功");
	}
	
	/**
     * 密码重置
     */
    @IgnoreAuth
	@RequestMapping(value = "/resetPass")
    public R resetPass(String username, HttpServletRequest request){
    	UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
    	if(user==null) {
    		return R.error("账号不存在");
    	}
    	user.setPassword("123456");
        userService.update(user,null);
        return R.ok("密码已重置为:123456");
    }
	
	/**
     * 列表
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params,UserEntity user){
        EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
    	PageUtils page = userService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params));
        return R.ok().put("data", page);
    }

	/**
     * 列表
     */
    @RequestMapping("/list")
    public R list( UserEntity user){
       	EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
      	ew.allEq(MPUtil.allEQMapPre( user, "user")); 
        return R.ok().put("data", userService.selectListView(ew));
    }

    /**
     * 信息
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") String id){
        UserEntity user = userService.selectById(id);
        return R.ok().put("data", user);
    }
    
    /**
     * 获取用户的session用户信息
     */
    @RequestMapping("/session")
    public R getCurrUser(HttpServletRequest request){
    	Long id = (Long)request.getSession().getAttribute("userId");
        UserEntity user = userService.selectById(id);
        return R.ok().put("data", user);
    }

    /**
     * 保存
     */
    @PostMapping("/save")
    public R save(@RequestBody UserEntity user){
//    	ValidatorUtils.validateEntity(user);
    	if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
    		return R.error("用户已存在");
    	}
        userService.insert(user);
        return R.ok();
    }

    /**
     * 修改
     */
    @RequestMapping("/update")
    public R update(@RequestBody UserEntity user){
//        ValidatorUtils.validateEntity(user);
    	UserEntity u = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername()));
    	if(u!=null && u.getId()!=user.getId() && u.getUsername().equals(user.getUsername())) {
    		return R.error("用户名已存在。");
    	}
        userService.updateById(user);//全部更新
        return R.ok();
    }

    /**
     * 删除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        userService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
}

6 、获取方式

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

请添加图片描述

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

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

相关文章

认识Pulsar

功能 Pulsar是一种用于服务器到服务器消息传递的多租户、高性能解决方案。Pulsar 最初由 Yahoo 开发&#xff0c;由 Apache 软件基金会管理。 Pulsar是由Apache软件基金会开发的分布式发布/订阅消息系统&#xff0c;它结合了传统消息系统&#xff08;如RabbitMQ&#xff09;和…

『Mysql进阶』Mysql SQL语句性能分析(七)

目录 什么是Profile&#xff1f; 开启Profile功能 基本使用 分析案例 什么是Profile&#xff1f; Query Profiler是 MySQL 自带的一种 Query 诊断分析工具 &#xff0c;通过它可以分析出一条 SQL 语句的 硬件性能瓶颈 在什么地方。 通常我们是使用的 explain &#xff0c;…

【数学分析笔记】第5章第1节 微分中值定理(2)

5. 微分中值定理及其应用 5.1 微分中值定理 5.1.4 一阶导数与单调性的关系 【定理5.1.5】【一阶导数与单调性的关系】 f ( x ) f(x) f(x)在区间 I \textbf{I} I&#xff08;可以是开区间&#xff0c;也可以闭区间&#xff0c;也可以半开半闭区间&#xff09;定义且可导&…

linux基本环境配置 安装Docker RedisMysql

目录 一、安装docker 1、卸载系统之前的docker 2、安装Docker-CE 3、启动docker 4、设置docker开机自启 5、root测试docker命令 6、配置docker镜像加速 二、Docker安装Mysql 1、下载镜像文件 2、创建实例并启动 3、修改MySQL字符集 4、设置容器自启动 三、Docker安…

如何提高专利申请的成功率?

在当今充满创新与竞争的时代&#xff0c;专利成为了保护智力成果、赢得市场优势的重要武器。然而&#xff0c;专利申请并非一帆风顺&#xff0c;许多申请人在这一过程中面临诸多挑战&#xff0c;导致申请成功率不尽如人意。那么&#xff0c;如何才能在这复杂的专利申请之路上提…

安卓13usb触摸唤醒系统 android13触摸唤醒

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 android13在待机后,需要能够使用触摸屏去唤醒我们的系统,这就需要我们修改系统的相关配置了。 2.问题分析 对于这个问题,我们需要知道安卓的事件分发,通过事件分发,…

c#中多态的实例应用说明二(利用隐藏方法)

在C#中&#xff0c;多态性是通过继承和实现接口来实现的&#xff0c;允许编写可以使用基类型的代码&#xff0c;然后使用派生类型的特定行为。 一.实例界面显示 二.源码界面显示 class dad//定义基类{protected string name;//定义属性public dad(string n)//构造函数{name …

1 线性系统性能分析方法1——时域分析法

1.典型输入信号 2.阶跃响应的时域性能指标 c(t) ct(t) css(t) 暂态响应 稳态响应 2.1暂态性能指标 2.2稳态性能指标 稳态误差ess&#xff1a;稳定系统误差的终值。即&#xff1a; 3.一阶系统的时域分析 凡是可用一阶微分方程描述的系统&#xff0c;称为一阶系统。 T&am…

QD1-P4 HTML标题标签(h)水平线标签(hr)

本节视频 www.bilibili.com/video/BV1n64y1U7oj?p4 ‍ 本节学习&#xff1a; title标签&#xff08;页面标题&#xff09;h标签&#xff08;文章标题&#xff09;hr标签&#xff08;横线&#xff09;body标签的属性&#xff08;网页背景色&#xff0c;字体颜色&#xff09…

专利布局的构思原则是什么,有哪些布局模式?

在知识经济时代&#xff0c;专利的价值愈发凸显&#xff0c;对于企业和创新者而言&#xff0c;做好专利布局是实现创新成果最大化保护和利用的关键一步。专利布局的构思原则如同基石&#xff0c;决定了布局的合理性和稳定性&#xff1b;而专利布局的模式则如建筑风格&#xff0…

React前端框架技术解析

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

docker-compose的Nacos集群(多机多节点)环境搭建与使用

上篇文写到了docker-compose的Nacos集群(单机多节点)环境搭建与使用 就有小伙伴私聊我&#xff1a;求多机器搭建的教程~ 谁让我如此宠粉呢&#xff0c;这不 它来了。老规矩 此方案已经过生产环境验证&#xff0c;可放心大胆使用~ 安装docker 与配置 docker-compose 步骤略过~ …

Android设置状态栏隐藏、固定颜色

设置隐藏效果&#xff1a; <?xml version"1.0" encoding"utf-8"?> <resources><style name"Theme.XiaoShuang" parent"Theme.AppCompat.Light.NoActionBar"><!--设置沉浸式通知栏--><item name"an…

机器学习第六十周周报 NLA-GNN

week 60 NLA-GNN 摘要 本周阅读了题为NLA-GNN: Non-local information aggregated graph neural network for heterogeneous graph embedding的论文。该文提出了一种新的框架——非局部信息聚合图神经网络(NLA-GNN)&#xff0c;旨在更有效地探索异构图。该框架结合了本地和非…

Iceberg 基本操作和快速入门二-Spark DDL操作

Iceberg 基本操作和快速入门一-CSDN博客 启动spark会话 docker exec -it spark-iceberg spark-sql 创建表 CREATE TABLE prod.db.sample ( id bigint NOT NULL COMMENT unique id, data string) USING iceberg; 创建分区表 CREATE TABLE prod.db.sample_par ( id bigint, …

windows server 2019中安装.net framework 3.5功能出错

转自金蝶云社区|财务金融企业信息化|IT精英人脉圈子-金蝶云社区官网 [故障现象] Windows server 2019系统安装net framework3.5时默认情况下会出现报错,提示错误:error 0x800F0954。 问题说明: 根据网上资料尝试了几种方式都不行: (1)离线下载net framework3.5进行安装(不…

【测试用例设计】一个登录界面的测试用例设计

文章目录 1. 登录页面的测试用例设计 1. 登录页面的测试用例设计

【CSS in Depth 2 精译_047】7.2 CSS 响应式设计中的媒体查询原则(上):深入理解媒体查询的类型

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第七章 响应式设计】&#xff08;概述&#xff09; 7.1 移动端优先设计原则&#xff08;上篇&#xff09; 7.1.1 创建移动端菜单&#xff08;下篇&#xff09;7.1.2 给视口添加 meta 标签&#xf…

3D渲图软件推荐:打造高质量渲染效果

在现代设计领域&#xff0c;3D渲图已经成为展示设计方案和产品外观的重要手段。无论是建筑设计、产品设计还是影视动画&#xff0c;都需要借助专业的3D渲染图软件来实现逼真的视觉效果。 本文将为您介绍几款备受好评的3D渲染图软件&#xff0c;帮助您在项目中选择合适的工具。…

每日学学Java开发规范,集合处理(附阿里巴巴Java开发手册(终极版))

前言 每次去不同的公司&#xff0c;码不同的代码&#xff0c;适应不同的规范&#xff0c;经常被老大教育规范问题&#xff0c;我都有点走火入魔的感觉&#xff0c;还是要去看看阿里巴巴Java开发规范&#xff0c;从中熟悉一下&#xff0c;纠正自己&#xff0c;码出高效&#xf…