基于SpringBoot的自习室预约管理系统

2023-11-11

项目背景

在网络高速发展的时代,众多的软件被开发出来,给学生带来了很大的选择余地,而且人们越来越追求更个性的需求。在这种时代背景下,学院只能以学生为导向,所以自习室预订系统是必须的。
系统采用了Java技术,将所有业务模块采用以浏览器交互的模式,选择MySQL作为系统的数据库,开发工具选择 eclipse来进行系统的设计。基本实现了自习室预订系统应有的主要功能模块,本系统有管理员;首页、个人中心、学生管理、公告信息管理、座位预订管理、自习室管理、留言板管理、系统管理,学生;首页、个人中心、座位预订管理、留言板管理,前台首页;首页、公告信息、自习室、留言反馈、个人中心、后台管理、客服等功能。
对系统进行测试后,改善了程序逻辑和代码。同时确保系统中所有的程序都能正常运行,所有的功能都能操作,并且该系统有很好的操作体验,实现了自习室预订系统。

功能设计

功能模块图

自习室预订系统的结构图
在这里插入图片描述
登录系统结构图
在这里插入图片描述
系统结构图
在这里插入图片描述
管理员信息属性图
在这里插入图片描述
学生管理实体图
在这里插入图片描述
自习室管理实体图
在这里插入图片描述

功能截图

管理员输入个人的用户名、密码、角色登录系统,这时候系统的数据库就会在进行查找相关的信息,如果我们输入的用户名、密码、角色不正确,数据库就会提示出错误的信息提示,同时会提示管理员重新输入自己的用户名、密码、角色,直到账号密码输入成功后,会提登录成功的信息。
在这里插入图片描述
管理员对座位预订管理进行详情、删除、修改操作。
在这里插入图片描述
管理员对自习室管理进行详情、删除、修改操作。
在这里插入图片描述
管理员对留言板管理进行详情、修改以及删除等操作。
在这里插入图片描述
管理员对学生管理进行详情、删除、修改以及查看等操作。
在这里插入图片描述
管理员可以对公告信息管理进行修改、详情等操作。
在这里插入图片描述
轮播图;该页面为轮播图管理界面。管理员可以在此页面进行首页轮播图的管理,通过新建操作可在轮播图中加入新的图片,还可以对以上传的图片进行修改操作,以及图片的删除操作。
在这里插入图片描述
学生进入系统可以对首页、个人中心、座位预订管理、留言板管理进行相对应操作。
在这里插入图片描述
学生通过座位预订管理进行详情、修改、删除等操作。
在这里插入图片描述
学生通过留言板管理进行详情、删除等操作。
在这里插入图片描述
自习室预订系统,在自习室预订系统可以查看首页、公告信息、自习室、留言反馈、个人中心、后台管理、客服等内容。
在这里插入图片描述
学生登录,通过登录获取账号、密码等信息进行登录
在这里插入图片描述
自习室,在自习室页面可以查看名称、图片、位置、配套设施、教室详情、座位总数、已选座位用号隔开等信息进行座位预订。
在这里插入图片描述
座位预订,在座位预订页面可以查看学生号、学生姓名、名称、座位号、预约时间、使用时长等信息进行提交
在这里插入图片描述
个人中心,在个人中心页面可以查看学生号、学生姓名、头像、性别、手机号码、邮箱等信息进行更新信息、退出登录
在这里插入图片描述

相关代码

数据库配置

# Tomcat
server:
    tomcat:
        uri-encoding: UTF-8
    port: 8080
    servlet:
        context-path: /springbootr1tjf

spring:
    datasource:
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/springbootr1tjf?useUnicode=true&characterEncoding=utf-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
        username: root
        password: 123456

#        driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
#        url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=springbootr1tjf
#        username: sa
#        password: 123456

    servlet:
      multipart:
        max-file-size: 10MB
        max-request-size: 10MB
    resources:
      static-locations: classpath:static/,file:static/

#mybatis
mybatis-plus:
  mapper-locations: classpath*:mapper/*.xml
  #实体扫描,多个package用逗号或者分号分隔
  typeAliasesPackage: com.entity
  global-config:
    #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
    id-type: 1
    #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
    field-strategy: 2
    #驼峰下划线转换
    db-column-underline: true
    #刷新mapper 调试神器
    refresh-mapper: true
    #逻辑删除配置
    logic-delete-value: -1
    logic-not-delete-value: 0
    #自定义SQL注入器
    sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: false
    call-setters-on-nulls: true
    #springboot 项目mybatis plus 设置 jdbcTypeForNull (oracle数据库需配置JdbcType.NULL, 默认是Other)
    jdbc-type-for-null: 'null' 

控制层(controller)

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();
    }
}

业务层(Service)


package com.service;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;

import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.service.IService;
import com.entity.UserEntity;
import com.utils.PageUtils;


/**
 * 系统用户
 */
public interface UserService extends IService<UserEntity> {
 	PageUtils queryPage(Map<String, Object> params);
    
   	List<UserEntity> selectListView(Wrapper<UserEntity> wrapper);
   	
   	PageUtils queryPage(Map<String, Object> params,Wrapper<UserEntity> wrapper);
	   	
}

数据访问层(Dao)

package com.dao;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.pagination.Pagination;
import com.entity.UserEntity;

/**
 * 用户
 */
public interface UserDao extends BaseMapper<UserEntity> {
	
	List<UserEntity> selectListView(@Param("ew") Wrapper<UserEntity> wrapper);

	List<UserEntity> selectListView(Pagination page,@Param("ew") Wrapper<UserEntity> wrapper);
	
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于SpringBoot的自习室预约管理系统 的相关文章

  • Java Logger 未记录到 Netbeans 中的输出

    我正在 Netbeans 中使用 Maven 启动一个 Java 项目 我编写了一些代码来使用 Logger 类进行日志记录 但是 日志记录似乎不起作用 在程序开始时 我运行 Logger getLogger ProjectMainClas
  • 与 Eclipse 中的 Java Content Assist 交互

    作为我的插件项目的一部分 我正在考虑与 Eclipse 在 Java 文件上显示的内容辅助列表进行交互 我正在尝试根据一些外部数据对列表进行重新排序 我看过一些有关创建新内容辅助的教程 但没有看到有关更改现有内容辅助的教程 这可能吗 如果是
  • 如何调试“com.android.okhttp”

    在android kitkat中 URLConnection的实现已经被OkHttp取代 如何调试呢 OkHttp 位于此目录中 external okhttp android main java com squareup okhttp 当
  • 从 MATLAB 调用 Java?

    我想要Matlab程序调用java文件 最好有一个例子 需要考虑三种情况 Java 内置库 也就是说 任何描述的here http docs oracle com javase 6 docs api 这些项目可以直接调用 例如 map ja
  • 提供节点名或服务名,或未知 Java

    最近我尝试运行我的 Java 项目 每当我运行它并将其打开到我得到的服务器地址时 Unable to determine host name java net UnknownHostException Caused by java net
  • 如何在单个查询中搜索 RealmObject 的 RealmList 字段

    假设我有一堂课 public class Company extends RealmObject private String companyId private RealmList
  • 断言 Kafka 发送有效

    我正在使用 Spring Boot 编写一个应用程序 因此要写信给 Kafka 我这样做 Autowired private KafkaTemplate
  • 如何检查某个元素是否存在于一组项目中?

    In an ifJava中的语句如何检查一个对象是否存在于一组项目中 例如 在这种情况下 我需要验证水果是苹果 橙子还是香蕉 if fruitname in APPLE ORANGES GRAPES Do something 这是一件非常微
  • Java 中如何将 char 转换为 int? [复制]

    这个问题在这里已经有答案了 我是Java编程新手 我有例如 char x 9 我需要得到撇号中的数字 即数字 9 本身 我尝试执行以下操作 char x 9 int y int x 但没有成功 那么我应该怎么做才能得到撇号中的数字呢 ASC
  • 如何在 ant 中为 junit 测试设置 file.encoding?

    我还没有完全完成file encoding 和 ant https stackoverflow com questions 1339352 how do i set dfile encoding within ants build xml
  • Akka 与现有 java 项目集成的示例

    如果我已经有现有的javaWeb 应用程序使用spring and servlet容器 将 Akka 集成到其中的正确方法是什么 就像我将会有Actor1 and Actor2互相沟通的 开始使用这些演员的切入点是什么 例如 1 把它放在那
  • 在Java中运行bat文件并等待

    您可能会认为从 Java 启动 bat 文件是一项简单的任务 但事实并非如此 我有一个 bat 文件 它对从文本文件读取的值循环执行一些 sql 命令 它或多或少是这样的 FOR F x in CD listOfThings txt do
  • 蓝牙发送和接收文本数据

    我是 Android 开发新手 我想制作一个使用蓝牙发送和接收文本的应用程序 我得到了有关发送文本的所有内容逻辑工作 但是当我尝试在手机中测试它时 我看不到界面 这是Main Activity Code import android sup
  • Spring @Cacheable 和 @Async 注解

    我需要缓存一些异步计算的结果 具体来说 为了克服这个问题 我尝试使用 Spring 4 3 缓存和异步计算功能 作为示例 我们采用以下代码 Service class AsyncService Async Cacheable users C
  • 将 JScrollPane 添加到 JFrame

    我有一个关于向 Java 框架添加组件的问题 我有一个带有两个按钮的 JPanel 和一个添加了 JTable 的 JScrollPane 我想将这两个添加到 JFrame 中 我可以将 JPanel 添加到 JFrame 或将 JScro
  • java XMLSerializer 避免复杂的空元素

    我有这个代码 DocumentBuilderFactory factory DocumentBuilderFactory newInstance DocumentBuilder builder factory newDocumentBuil
  • java 中的蓝牙 (J2SE)

    我是蓝牙新手 这就是我想做的事情 我想获取连接到我的电脑上的蓝牙的设备信息并将该信息写入文件中 我应该使用哪个 api 以及如何实现 我遇到了 bluecove 但经过几次搜索 我发现 bluecove 不能在 64 位电脑上运行 我现在应
  • partitioningBy 必须生成一个包含 true 和 false 条目的映射吗?

    The 分区依据 https docs oracle com javase 8 docs api java util stream Collectors html partitioningBy java util function Pred
  • Java RMI - 客户端超时

    我正在使用 Java RMI 构建分布式系统 它必须支持服务器丢失 如果我的客户端使用 RMI 连接到服务器 如果该服务器出现故障 例如电缆问题 我的客户端应该会收到异常 以便它可以连接到其他服务器 但是当服务器出现故障时 我的客户端什么也
  • Java 11 - 将 Spring @PostConstruct 替换为 afterPropertiesSet 或使用 initMethod

    我正在使用 spring 应用程序 有时会使用 PostConstruct用于代码和测试中的设置 看来注释将被排除在外Java 11 https www baeldung com spring postconstruct predestro

随机推荐

  • android 多线程异步下载文件,造轮子之 Android 多线程多任务断点续传下载器(设计篇)...

    前段时间面试 被问到 app 的自动更新是怎么做的 文件下载怎么实现的 用了多线程吗 是否支持断点续传 一下蒙逼 因为直接用第三方框架实现的文件下载 这些问题完全没想过 回来后觉得这里面其实涉及很多知识点 就打算自己动手封装一个支持多线程多
  • NLP(四十一)使用HuggingFace翻译模型的一次尝试

    本文将如何如何使用HuggingFace中的翻译模型 HuggingFace是NLP领域中响当当的团体 它在预训练模型方面作出了很多接触的工作 并开源了许多预训练模型和已经针对具体某个NLP人物训练好的直接可以使用的模型 本文将使用Hugg
  • Windows安装Maven教程

    一 Maven介绍 Maven是一种流行的构建工具 用于管理Java项目的构建过程 依赖项和项目生命周期 它提供了一种简单而灵活的方式来构建 测试和部署Java应用程序 Maven使用一个XML配置文件来定义项目的结构和构建过程 通过这个配
  • data analysis --python on Jupyter

    data cleaning data analysis 第一步 1 detect and delete wrong data 1 find the wrong data and make sure the data indeed wrong
  • 世界上最完美的公式 ----欧拉公式

    欧拉公式 在数学历史上有很多公式都是欧拉 leonhard euler 公元1707 1783年 发现的 它们都叫做 欧拉公式 它们分散在各个数学分支之中 1 分式里的欧拉公式 a r a b a c b r b c b a c r c a
  • 华为机试题输入输出总结

    华为机试题采用的是ACM模式 需要考生自行编写输入和输出 对于已经习惯了只编写函数体部分的考生来说可能会是个挑战 本人尝试根据自己在刷华为机试题过程中遇到的各种输入输出的case进行梳理 希望能够帮助大家尽快适应华为机试题的输入输出模式 减
  • LuatOS-SOC接口文档(air780E)--dac - 数模转换

    dac open ch freq mode 打开DAC通道 并配置参数 参数 传入值类型 解释 int 通道编号 例如0 int 输出频率 单位hz int 模式 默认为0 预留 返回值 返回值类型 解释 true 成功返回true 否则返
  • C++ traits编程方法

    转自 http s99f blog 163 com blog static 35118365200903111941380 侯捷老师在 STL 源码剖析 说 traits编程方法是一把开启STL源代码大门的钥匙 其重要性也就不必再说了 既然
  • Eclipse如何给main方法传值

    import java util Arrays 这是一个测试类 用来研究main方法的传值问题 author HHB public class Test 这是类的主方法 可以用来接受用户的输入 并将输入数据保存到一个String类型的数组里
  • gitlab部署及整合Jenkins持续构建(四)sonarqube9.9安装和使用(一步一坑)

    文章目录 postgresql13 0安装 1 配置postgresql数据库 2 进入postgresql创建数据库 代码质量管理平台 sonarqube安装 1 前置依赖 下载 2 安装unzip并解压sonarqube并移动到 usr
  • 基础数据类型的取值范围计算方法

    一 以c 为例 1 int 整数类型 4个字节 1KB 1000B 1B就是一个字节 一个字节占8位 所以4个字节就是4 8 32位 因为在计算机的二进制中有一个符号位 32 1 31 剩下31个位置存放数字 计算 每个位置只能是0 1这两
  • C++ 泛型编程(二) 函数模版

    前文回顾 C 泛型编程 一 基本概念 函数模版 模版定义 定义 模版定义以关键字 template 开始 后跟尖括号包围的模版参数列表 用关键字 typename 来定义模版参数类型 template
  • Ubuntu下,python3下离线安装Supervisor

    说明 由于我的是生产环境 没有外网 所以只能通过安装包来下载 有外网的比较简单 可以直接通过apt get即可 或者pip pip3这些直接命令安装即可 一 安装步骤 1 1 先在windows桌面新建一个sss目录 用于存储安装包 方便统
  • UserHandle.ALL、UserHandle.CURRENT、UserHandle.CURRENT_OR_SELF、UserHandle.OWNER的定义与区别

    UserHandle ALL UserHandle CURRENT UserHandle CURRENT OR SELF UserHandle OWNER的定义与区别 UserHandle ALL 设备上所有用户均可接收到广播 UserHa
  • 边缘计算:提升数据处理效率的新时代

    随着物联网 人工智能等技术的快速发展 边缘计算已经成为一个备受关注的话题 但是 很多人对于边缘计算的概念并不是很清晰 本文将重点解释 轻松读懂边缘计算 中的重点词汇或短语 帮助读者更好地理解边缘计算 一 边缘计算 边缘计算是一种新型计算模型
  • 使用ffmpeg视频切片并加密和视频AES-128加密后播放

    创建加密文件 想达到的目的 将一个mp4视频文件切割为多个ts片段 并在切割过程中对每一个片段使用AES 128 加密 最后生成一个m3u8的视频索引文件 电脑环境mac 已经安装了最新的ffmpeg 4 0 2版本 如果要加密 首先准备好
  • 电脑回收站已经清空的文件怎么还原

    互联网时代 我们很难去想象我们的生活没有了电脑没有了智能手机的日子 但是 作为电子设备 在方便我们的同时 也会给我们带来一些小小的烦恼 最常见的使用手机和电脑的弊端就是 被删除的文件 如果回收站已经清空了 那么你的文件就找不会来了 特别是有
  • Java防止重复数据多次调用接口导致数据库插入重复记录

    Java防止重复数据多次调用接口导致数据库插入重复记录 一 我们可以对数据库表设置主键 字段唯一约束来防止重复数据插入到数据库 在数据库层通过唯一键的方式来限制重复提交的记录 对于重复提交的内容自动被过滤 二 在前端控制 比如按钮置灰等 三
  • MySQL 5.7 版本登录报 error 1524: plugin ... in not loaded

    昨天看到论坛有人提问 error 1524 plugin in not loaded 问题相关信息 1 安装mysql 5 7 16 2 修改my ini为 For advice on how to change settings plea
  • 基于SpringBoot的自习室预约管理系统

    项目背景 在网络高速发展的时代 众多的软件被开发出来 给学生带来了很大的选择余地 而且人们越来越追求更个性的需求 在这种时代背景下 学院只能以学生为导向 所以自习室预订系统是必须的 系统采用了Java技术 将所有业务模块采用以浏览器交互的模