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

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

项目编号: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);
    }
}

五,项目总结

相关文章
|
2月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
172 1
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
111 62
|
3天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
32 13
|
10天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
1月前
|
XML Java 数据库连接
SpringBoot集成Flowable:打造强大的工作流管理系统
在企业级应用开发中,工作流管理是一个核心组件,它能够帮助我们定义、执行和管理业务流程。Flowable是一个开源的工作流和业务流程管理(BPM)平台,它提供了强大的工作流引擎和建模工具。结合SpringBoot,我们可以快速构建一个高效、灵活的工作流管理系统。本文将探讨如何将Flowable集成到SpringBoot应用中,并展示其强大的功能。
139 1
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
69 2
|
1月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
2月前
|
存储 安全 Java
打造智能合同管理系统:SpringBoot与电子签章的完美融合
【10月更文挑战第7天】 在数字化转型的浪潮中,电子合同管理系统因其高效、环保和安全的特点,正逐渐成为企业合同管理的新宠。本文将分享如何利用SpringBoot框架实现一个集电子文件签字与合同管理于一体的智能系统,探索技术如何助力合同管理的现代化。
102 4
|
2月前
|
前端开发 Java Apache
SpringBoot实现电子文件签字+合同系统!
【10月更文挑战第15天】 在现代企业运营中,合同管理和电子文件签字成为了日常活动中不可或缺的一部分。随着技术的发展,电子合同系统因其高效性、安全性和环保性,逐渐取代了传统的纸质合同。本文将详细介绍如何使用SpringBoot框架实现一个电子文件签字和合同管理系统。
95 1
|
2月前
|
文字识别 安全 Java
SpringBoot3.x和OCR构建车牌识别系统
本文介绍了一个基于Java SpringBoot3.x框架的车牌识别系统,详细阐述了系统的设计目标、需求分析及其实现过程。利用Tesseract OCR库和OpenCV库,实现了车牌图片的识别与处理,确保系统的高准确性和稳定性。文中还提供了具体的代码示例,展示了如何构建和优化车牌识别服务,以及如何处理特殊和异常车牌。通过实际应用案例,帮助读者理解和应用这一解决方案。

热门文章

最新文章