实验室预约系统|基于Springboot+Vue实现学校实验室预约管理系统

news2024/12/29 12:49:11

作者主页:编程指南针

作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师

主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助

收藏点赞不迷路  关注作者有好处

文末获取源码 

项目编号:BS-XX-167

一,项目简介

学校中的实验设备是属于全校师生共用的教学资源。由于学校实验室个数及每门课程相关实验室课时数的有限性,使得实验室不可能像普通教室那样按周次进行固定排课。当前实验教室的排课普遍采用人工预约的方法,这种方式无论在人员联系上还是实验室安排上都很不方便。预约一个教室的周期往往在两周以上,极大地影响了教学进度的安排,并且由于实验室教室的分散性,往往会出现一个教室爆满而另一个闲置的不对称使用情况,在这种情况下,开发一种全校实验室资源共享、合理分配教室资源、远距离操作实验室预约系统就显得尤为必要。

在国外,预约系统早就起源并且早已经扩展开来。基于ASP的高校实验网络管理系统,也可为学生提供一种选修自己喜欢实验的途径。有些系统允许学生通过校园网选修实验,它具有实验预约、查询等功能。

在国内,现在一般是用ASP做实验预约系统。预先查看几个比较典型的实验预约系统:长江大学电子信息学院开发的长江大学电工电子实验预约系统,它是一个实验预约管理系统,提供学生和教师登录预约,教师和学生登录后的功能不一样,教师登录后还可以对学生进行实验管理:学生可以进行实验预约,只是该系统有时候学生预约并不开放,以教师预约为主。这是国内目前功能比较完善的实验预约系统。绍兴文理学院的开放实验网上预约系统预约实现了可选择的实验进行预约和取消预约,可以轻松查看实验室状况,不过此系统封闭性不强,任何注册人员都可以进行预约,这给系统管理带来了负面影响。另外,最近在网上还出现了一个简单的网上实验预约系统,简单实现了预约功能,也是一个纯粹的实验预约系统,用户可以随时进行注册并预约实验,又没有取消预约的功能,而且此系统维护不够,预约得不到管理员的批准与调配。但这也说明预约系统现在在国内比较盛行,大家在勇于攀登,在不断完善实验预约系统的功能。

本系统实现实验室预约。系统共设有用户登录、实验室预约、预约情况查询、管理员管理等四个主要的功能模块,满足了教师/学生进行实验室预约/查询、管理员进行管理等各个方面的需求。它具有网络化、智能化、高性能、低维护、界面友好、操作简单、功能强大、管理方便、平台优秀等一系列的优点,能够完全按照用户的需求,稳定、安全、快速地运行,实现了任意计算机都能进行实验室预约信息的查询,进行实验室预约操作,访问相关信息。从而充分利用了学校现有的资源,促进了教学管理系统的网络化,智能化,顺应了教学管理的发展趋势。

 

二,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

后台技术:Springboot+Mybatis-plus

前端技术:Node+Vue+ElementUI

三,系统展示

用户登陆

公告栏

公告管理

设备管理

实验室管理

实验结果管理

教师管理

学生管理

预约信息管理

四,核心代码展示

package com.project.labsystem.controller;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.project.labsystem.entity.AnnouncementTable;
import com.project.labsystem.entity.LabTable;
import com.project.labsystem.entity.VO.announcementVo;
import com.project.labsystem.entity.VO.labVo;
import com.project.labsystem.service.LabTableService;
import com.project.labsystem.utils.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author byAuto
 * @since 2022-10-24
 */
@Api(description = "实验室管理")
@RestController
@RequestMapping("/labsystem/lab-table")
public class LabTableController {

    @Autowired
    LabTableService service;


    @ApiOperation(value = "查询所有实验室")
    @GetMapping("findAll")
    public R findAll() {
        List<LabTable> list = new ArrayList<>();
        list = service.list(null);
        return R.ok().data("data", list);
    }

    @ApiOperation(value = "查询个实验室")
    @GetMapping("findOne/{id}")
    public R findOne(@PathVariable String id) {
        LabTable labTable = service.getById(id);
        if (labTable != null) {
            return R.ok().data("data", labTable);
        } else {
            return R.error();
        }
    }

    @ApiOperation(value = "实验室添加")
    @PostMapping("add")
    public R add(@RequestBody LabTable labTable) {
        boolean flag = service.save(labTable);

        if (flag) {
            return R.ok().data("data", "Fuck");
        } else {
            return R.error();
        }
    }

    @ApiOperation(value = "实验室更新")
    @PostMapping("update/id")
    public R update(@RequestBody LabTable labTable) {
        boolean flag = service.updateById(labTable);
        if (flag) {
            return R.ok();
        } else {
            return R.error();
        }
    }

    @ApiOperation(value = "实验室删除")
    @GetMapping("del/{id}")
    public R del(@PathVariable String id) {

        Boolean flag = service.removeById(id);
        if (flag) {
            return R.ok().data("data", "Fuck");
        } else {
            return R.error();
        }
    }

    //获取所有的实验室编号
    @ApiOperation(value = "实验室Allid")
    @GetMapping("getAllId")
    public R getAllId() {

        List list = new ArrayList<>();
        QueryWrapper<LabTable> wrapper=new QueryWrapper<>();
        wrapper.select("lab_room_id");
        wrapper.orderByDesc("create_time");
        list=service.list(wrapper);
        System.out.println(list);

        return R.ok().data("rows", list);
    }



    // 条件查询带分页的方法
    @ApiOperation(value = "多条件查询")
    @PostMapping("pageCondition/{current}/{limit}")
    public R pageTeacherCondition(@PathVariable long current, @PathVariable long limit,
                                  @RequestBody(required = false) labVo Query) {
        //创建page对象
        Page<LabTable> pageAn = new Page<>(current, limit);

        //构建条件
        QueryWrapper<LabTable> wrapper = new QueryWrapper<>();
        // 多条件组合查询
        // mybatis学过 动态sql
        String name = Query.getLabName();
        String roomId = Query.getLabRoomId();
        String labLocation  =Query.getLabLocation();
        String labManager = Query.getLabManager();
        String begin = Query.getBegin();
        String end = Query.getEnd();
        //判断条件值是否为空,如果不为空拼接条件
        if (!StringUtils.isEmpty(name)) {
            //构建条件
            wrapper.like("lab_name", name);
        }
        if (!StringUtils.isEmpty(roomId)) {
            //构建条件
            wrapper.eq("lab_room_id", roomId);
        }
        if (!StringUtils.isEmpty(labLocation)) {
            //构建条件
            wrapper.like("lab_location", labLocation);
        }
        if (!StringUtils.isEmpty(labManager)) {
            //构建条件
            wrapper.like("lab_manager", labManager);
        }

        if (!StringUtils.isEmpty(begin)) {
            wrapper.ge("create_time", begin);
        }
        if (!StringUtils.isEmpty(end)) {
            wrapper.le("create_time", end);
        }

        //排序
        wrapper.orderByDesc("create_time");

        //调用方法实现条件查询分页
       service.page(pageAn, wrapper);
        //总记录数
        long total = pageAn.getTotal();
        //数据list集合
        List<LabTable> records = pageAn.getRecords();
        System.out.println(records);

        return R.ok().data("total", total).data("rows", records);

    }
    /**
     * 导入房间信息
     */
    @ApiOperation("批量导入")
    @PostMapping("/importData")
    @ResponseBody
    public R importData(@RequestBody MultipartFile file) {
        service.importExcel(file,service);
        System.out.println(file);
        return R.ok();
    }

}

package com.project.labsystem.controller;


import com.project.labsystem.entity.VO.loginVo;
import com.project.labsystem.utils.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

@Api(description = "登录")
@RestController
@RequestMapping("login")
public class LoginController {



    //login
    @PostMapping("login")
    public R login() {
        return R.ok().data("token","admin");
    }
    //info
    @GetMapping("info")
    public R info() {
        return R.ok().data("roles","[admin]").data("name","admin").data("avatar","https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif");
    }

    @PostMapping("logout")
    public R logout() {
        return R.ok();
    }

    @ApiOperation(value = "登录测试")
    @GetMapping("loginTest")
    public String loginTest() {
       loginVo loginer=new loginVo();

       return null;
    }

    @ApiOperation(value = "根据token获取用户信息")
    @GetMapping("getInfo")
    public R getinfo(HttpServletRequest request){


        return null;
    }

    @ApiOperation(value = "管理员登录")
    @GetMapping("loginAdmin")
    public R loginAdmin() {
        if (false) {
            return R.ok().data("data", "Fuck");
        } else {
            return R.error();
        }
    }

    @ApiOperation(value = "学生登录")
    @GetMapping("loginStudent")
    public R loginStudent() {
        if (false) {
            return R.ok().data("data", "Fuck");
        } else {
            return R.error();
        }
    }

    @ApiOperation(value = "教师登录")
    @GetMapping(" loginTeacher")
    public R loginTeacher() {
        if (false) {
            return R.ok().data("data", "Fuck");
        } else {
            return R.error();
        }
    }
}

package com.project.labsystem.controller;


import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.project.labsystem.entity.LabTable;
import com.project.labsystem.entity.OrderTable;
import com.project.labsystem.entity.VO.assetVo;
import com.project.labsystem.entity.VO.orderVo;
import com.project.labsystem.service.LabTableService;
import com.project.labsystem.service.OrderTableService;
import com.project.labsystem.utils.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author byAuto
 * @since 2022-10-28
 */
@Api(description = "预约单管理")
@RestController
@RequestMapping("/labsystem/order-table")
public class OrderTableController {
    @Autowired
    OrderTableService service;
    @Autowired
    LabTableService labTableService;

    @ApiOperation(value = "查询所有预约")
    @GetMapping("findAll")
    public R findAll() {
        List<OrderTable> list = new ArrayList<>();
        list = service.list(null);
        return R.ok().data("data", list);
    }

    @ApiOperation(value = "查询一个预约")
    @GetMapping("findOne/{id}")
    public R findOne(@PathVariable String id) {
        OrderTable assetTable = service.getById(id);
        if (assetTable != null) {
            return R.ok().data("data", assetTable);
        } else {
            return R.error();
        }
    }

    @ApiOperation(value = "预约添加")
    @PostMapping("add")
    public R add(@RequestBody OrderTable orderTable) {
        String labId = orderTable.getLabId();

        QueryWrapper<LabTable> wrapper = new QueryWrapper<>();
        wrapper.eq("lab_room_id", labId);

        // System.out.println(labTableService.getOne(wrapper)+"LLLLLLLLLLLLL");
        QueryWrapper<OrderTable> wrapper2 = new QueryWrapper<>();

        wrapper2.eq("lab_id", orderTable.getLabId());
        wrapper2.eq("order_time", orderTable.getOrderTime());

        // System.out.println(labTableService.getOne(wrapper)+"LLLLLLLLLLLLL");
        boolean flag2 = (service.getOne(wrapper2) == null);
        boolean flag = false;
        if (flag2) {
            orderTable.setLabName(labTableService.getOne(wrapper).getLabName());
            flag = service.save(orderTable);
        }
        if (flag) {
            return R.ok().data("data", "Fuck");
        } else {
            return R.error().message("实验室被占用");
        }
    }

    @ApiOperation(value = "Post 查询预约可用")
    @PostMapping("query")
    public R query(@RequestBody OrderTable assetTable) {
        QueryWrapper<OrderTable> wrapper = new QueryWrapper<>();

        wrapper.eq("lab_room_id", assetTable.getLabId());
        wrapper.eq("order_time", assetTable.getOrderTime());

        // System.out.println(labTableService.getOne(wrapper)+"LLLLLLLLLLLLL");
        boolean flag = (service.getOne(wrapper) != null);


        if (flag) {
            return R.ok();
        } else {
            return R.error();
        }
    }

    @ApiOperation(value = "预约更新")
    @PostMapping("update")
    public R update(@RequestBody OrderTable assetTable) {
        boolean flag = service.updateById(assetTable);
        if (flag) {
            return R.ok();
        } else {
            return R.error();
        }
    }

    @ApiOperation(value = "预约删除")
    @GetMapping("del/{id}")
    public R del(@PathVariable String id) {

        Boolean flag = service.removeById(id);
        if (flag) {
            return R.ok().data("data", "Fuck");
        } else {
            return R.error();
        }
    }


    // 条件查询带分页的方法
    @ApiOperation(value = "多条件查询")
    @PostMapping("pageCondition/{current}/{limit}")
    public R pageTeacherCondition(@PathVariable long current, @PathVariable long limit,
                                  @RequestBody(required = false) orderVo Query) {
        //创建page对象
        Page<OrderTable> pageAn = new Page<>(current, limit);

        //构建条件
        QueryWrapper<OrderTable> wrapper = new QueryWrapper<>();
        // 多条件组合查询
        // mybatis学过 动态sql
        //申请人
        String orderApplicant = Query.getOrderApplicant();
        //status
        String status = Query.getOrderStatus();
        //实验室名字
        String labName = Query.getLabName();

        String begin = Query.getBegin();
        String end = Query.getEnd();
        //判断条件值是否为空,如果不为空拼接条件
        if (!StringUtils.isEmpty(orderApplicant)) {
            //构建条件
            wrapper.like("order_applicant", orderApplicant);
        }
        if (!StringUtils.isEmpty(labName)) {
            //构建条件
            //System.out.println(labName+"LLLL名字");
            wrapper.like("lab_name", labName);
        }
        if (!StringUtils.isEmpty(status)) {
            //构建条件
            wrapper.eq("order_status", status);
        }

        if (!StringUtils.isEmpty(begin)) {
            wrapper.ge("create_time", begin);
        }
        if (!StringUtils.isEmpty(end)) {
            wrapper.le("create_time", end);
        }

        //排序
        wrapper.orderByDesc("create_time");

        //调用方法实现条件查询分页
        service.page(pageAn, wrapper);
        //总记录数
        long total = pageAn.getTotal();

        System.out.println(total + "total");
        //数据list集合
        List<OrderTable> records = pageAn.getRecords();
        System.out.println(records);

        return R.ok().data("total", total).data("rows", records);

    }


}

五,项目总结

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

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

相关文章

JAVA中那些令人眼花缭乱的锁

一、开局一张图带你了解java相关的锁 二、乐观锁和悲观锁 1、悲观锁 悲观锁对应于生活中悲观的人&#xff0c;悲观的人总是想着事情往坏的方向发展。 举个生活中的例子&#xff0c;假设厕所只有一个坑位了&#xff0c;悲观锁上厕所会第一时间把门反锁上&#xff0c;这样其他…

python pyqtgraph绘图库

pyqtgraph官网 PyQtGraph被大量应用于Qt GUI平台&#xff08;通过PyQt或PySide&#xff09;&#xff0c;因为它的高性能图形和numpy可用于大量数据处理。 特别注意的是&#xff0c;pyqtgraph使用了Qt的GraphicsView框架&#xff0c;它本身是一个功能强大的图形系统; 我们将最优…

知识付费海哥:这样做课,不赚钱都难

现在不少人开始了开发网课&#xff0c;卖网课赚钱&#xff0c; 但是在网课开发时&#xff0c;很多人开始的时候&#xff0c;关注的点就错了&#xff01; 自己喜欢钓鱼&#xff0c;就开发钓鱼的课&#xff0c; 自己喜欢演讲&#xff0c;就开发演讲的课&#xff0c; 自己喜欢…

Dubbo入门(二)——IDEA下Dubbo+Zookeeper搭建

目录一、Zookeeper1.1 下载1.2 安装1.3 修改配置文件1.4 启动二、Dubbo插件搭建三、手动创建3.1 创建项目3.1.1 pom依赖3.2 api模块3.2.1 pom依赖3.2.2 实体类3.2.3 service接口3.3 provider3.3.1 pom依赖3.3.2 配置文件3.3.3 mapper3.3.4 service实现类3.3.5 启动类3.4 consum…

冶金工艺流程(钢铁全流程)

工艺图 工艺讲解 生产流程从矿石原料采集开始,对于低品位的矿石&#xff0c;必须在冶炼前经选矿工序先选出铁精矿&#xff0c;然后进一步制成烧结矿或球团矿。 ————————————————————————————— 高炉冶炼是一个连续的、大规模的高温生产过程。铁矿石…

为什么Aruba始终走在网络世界的前列?

编辑 | 阿冒 设计 | 沐由关于网络的价值&#xff0c;梅特卡夫定律&#xff08;Metcalfes law&#xff09;曾经在多年前就明白无误地告诉我们&#xff1a;VKN。其中&#xff0c;V代表一个网络的价值&#xff0c;N代表这个网络的节点数&#xff0c;K代表价值系数。如果梅特卡夫…

47. 批量规范化 代码从零开始实现 + 简洁实现

1. 从零实现 下面&#xff0c;我们从头开始实现一个具有张量的批量规范化层。 import torch from torch import nn from d2l import torch as d2l# X是输入&#xff0c;gamma, beta是两个可以学习的参数&#xff0c;moving_mean, moving_var是整个数据集的均值和方差&#xf…

ssh登录——scp传文件

一、ssh登录 1.基本用法 远程登录服务器&#xff1a; ssh userhostname# user: 用户名 # hostname: IP地址或域名 第一次登录时会提示&#xff1a; The authenticity of host 123.57.47.211 (123.57.47.211) cant be established. ECDSA key fingerprint is SHA256:iy237y…

十分钟掌握 “UML ” 的基本使用

十分钟掌握 “UML ” 的基本使用 每博一文案 很喜欢这样一段话&#xff1a;内可以不跟别人计较&#xff0c;但一定要学会维护自己&#xff0c;你可以不跟别人争抢&#xff0c;但应该懂得远离小人。 人生在世&#xff0c;我们会遇到形形色色的人&#xff0c;人心隔肚皮&#xf…

Pytorch深度学习实战——第3章课后习题

1.从list(range(9))list(range(9))list(range(9))中创建一个张量aaa并预测检查其大小、偏移量、步长。 import torch atorch.tensor(list(range(9))) print(a.storage_offset())#偏移量 print(a.stride())#步长 print(a.size())#大小a)使用ba.view(3,3)ba.view(3,3)ba.view(3,…

Aspose.PDF for Java系列3-创建复杂的PDF

创建复杂PDF 上篇文章展示了使用Java和Aspose.PDF简单步骤。本文中&#xff0c;我们将使用Java和Aspose.PDF创建更复杂的文档结构。此示例中&#xff0c;我们将创建包含图片、两个文本片段&#xff08;标题和段落&#xff09;和表格。 创建文档参考以下步骤&#xff1a; 实例…

被房地产坑惨的老板电器,终于要“回血”了!

近期&#xff0c;随着房地产行业重新被定义为“国民经济的支柱产业”&#xff0c;叠加疫情防控转向&#xff0c;笼罩在家电行业上空的阴霾逐渐消散&#xff0c;家电股预期改善&#xff0c;纷纷迎来估值修复。尤其是曾遭房地产暴击的老板电器&#xff0c;有望抓住房地产回暖的窗…

Synchronized

Synchronized前言1.synchronized修饰符和线程控制1.1synchronized修饰符和Object Monitor模式1.2 synchronized修饰符可标注的位置2. 方法2.1 waitwait多态表达式notify()方法和notifyAII()方法interrupt中断信号判断是否收到interrupt中断信号的方法前言 悲观锁在Java中有两种…

Jenkins环境搭建

Jenkins环境搭建 一、Jenkins下载&#xff1a;Jenkins 点击Download&#xff0c;进入新的页面后点击下载Jenkins的war包&#xff0c;如下图&#xff1a; 注意&#xff1a;Jenkins是java语言开发&#xff0c;需要安装JDK并进行环境变量配置&#xff0c;Jenkins可以在Tomcat容器…

java注解(Annotation)和反射(Reflection)

文章目录重要的点一 注解(Annotation)(Annotation)(Annotation)1.1 注解初识1.2 内置注解1.3 内置注解代码演示1.4 元注解(meta−annotation)(meta-annotation)(meta−annotation)1.5 元注解代码演示1.6 自定义注解1.7 自定义注解代码演示二 反射(Reflection)(Reflection)(Refl…

gitlab-ci.yml关键字(三)before_script 、script 、after_script

before_script before_script 用于定义在每个作业执行之前所运行的一系列脚本命令。这里需要注意的是&#xff0c;before_script 运行的时机&#xff0c;是在制品&#xff08;artifacts&#xff09;恢复后&#xff0c;也就意味着&#xff0c;在这个时机中是可以操作制品的。 …

Unity 解决QFramework WebGL报错

Unity 解决QFramework WebGL报错&#x1f95d;错误描述☕原因&#x1f364; 解决方案&#x1f95d;错误描述 在新建工程中只导入了QFramework&#xff0c;Build WebGL(空场景) 会看到如下错误&#xff1a; Exception: Non-Public Constructor() not found! in QFramework.Saf…

点云 3D 目标检测 - SECOND(Sensors 2018)

点云 3D 目标检测 - SECOND&#xff08;Sensors 2018&#xff09;摘要1. 引言2. 相关工作2.1 基于前视图和图像的方法2.2 基于鸟瞰图的方法2.3 基于3D的方法2.4 基于融合的方法3. SECOND检测器3.1 网络架构3.1.1 点云分组3.1.2 Voxelwise特征提取器3.1.3 稀疏卷积中间提取器3.1…

代码模板3---基础算法(双指针算法/位运算/离散化/区间合并)

①双指针算法 一般做题&#xff1a;先用暴力做法&#xff0c;然后去看是否存在某种性质&#xff08;如单调性&#xff0c;维护这个区间的单调性即可&#xff09; AcWing 799. 最长连续不重复子序列 - AcWing AcWing 800. 数组元素的目标和 - AcWing AcWing 2816. 判断子序列 - …

期货交易软件哪个好?为什么选择期货MT4平台软件?

越来越多人选择期货投资&#xff0c;因为期货投资具有高投资高回报的特征。在做期货交易时&#xff0c;很多投资者会发现市场上有各种各样的期货交易软件。如果第一次接触期货交易&#xff0c;难免会不知道选择哪个期货交易软件更好。下面为大家讲讲期货交易软件哪个好&#xf…