Java项目:springboot+vue教室图书馆预约管理系统

news2024/11/17 21:40:11

作者主页:源码空间站2022

 简介:Java领域优质创作者、Java项目、学习资料、技术互助

文末获取源码

智慧物联网教室预约系统-后台系统

项目简介:

这是一个前后端分离的教室预约和查看系统项目,能够实现以教室为单位活动的预约和取消,能够以视图形式显示,附带图书馆和公告管理器功能。

主要采用`Vue.js`+`SpringBoot` 技术栈开发

使用技术点

* 前端:`Vue`、`ElementUI`、`axios`、`Echart`、`jQurey`
* 后端:`SpringBoot`、`Spring Data + JPA`、`hibernate`、`MySQL`、`Shiro`、`Redis`

使用说明:

1. 在mysql数据库中创建数据库`testmeeting`行项目,将自动注入数据。如需关闭此功能,请将 `application.properties `中的 
`spring.datasource.initialization-mode=always` 代码注释。同样,可以通过使用项目`sql`目录下`testmeeting`直接导入数
据库数据结构与内容,可根据需要自行使用。`Redis 端口为 6379(默认端口),密码为空。`

2. 数据库配置在后端项目的 src\main\resources 目录下的application.properties 文件中,mysql 版本为 8.0以上版本 。

3. 在IntelliJ IDEA中运行后端项目,为了保证项目成功运行,可以右键点击 pom.xml 选择 maven -> reimport ,并重启项目。
至此,服务端就启动成功了,同时,运行前端项目,访问 http://localhost:8080 ,即可进入登录页面,默认账号是 admin,密码是 123

4. 项目使用了虹软公司的人脸识别SDK与百度的人体分析SDk:
* 虹软的SDK请自行前往官网获取,获取后建议将SDK导入到``src/main/resources/lib-sdk``目录下,然后在``src/main/java/utils``目录下新建``SdkParameter.java``文件,填入appId和key以及引擎和算法等文件位置。

* 百度人体分析SDk已在``maven``中引用,但是``app_id``等请前往百度云AI开发者平台自行获取,该项目中表示位置为``SdkParameter.java``文件。

* 以上内容不必要,可以删除并注释对应接口与服务即可。
----

二次开发请注意:

* 进入前端项目根目录中,在命令行依次输入如下命令:

```text
# 安装依赖
npm install

# 在 localhost:8080 启动项目
npm run dev
```
* 由于在前端项目中已经配置了端口转发,将数据转发到SpringBoot上,因此项目启动之后,在浏览器中输入 `http://localhost:8080` 
就可以访问我们的前端项目了,所有的请求通过端口转发将数据传到 SpringBoot 中(注意此时不要关闭 SpringBoot 项目)。

* 最后可以用 IDEA / WebStorm 等工具打开前端项目,继续开发,开发完成后,当项目要上线时,依然进入到 wj-vue 目录,然后执行如下命令:
```text
npm run build
```

* 该命令执行成功之后,前端项目目录下生成一个 `dist` 文件夹,可以将该文件夹中的两个文件` static `和 `index.html` 
拷贝到前端项目中 `resources/static/ `目录下,然后直接运行前端项目,访问 `http://localhost:8443` ,

实际上是把前端打包后作为静态文件,但不推荐使用这种方式。

运行截图

相关代码

教室控制器

package com.shencangblue.design.icrs.controller;

import com.baidu.aip.bodyanalysis.AipBodyAnalysis;
import com.shencangblue.design.icrs.dao.ClassRoomDao;
import com.shencangblue.design.icrs.model.ClassRoom;
import com.shencangblue.design.icrs.result.Result;
import com.shencangblue.design.icrs.result.ResultFactory;
import com.shencangblue.design.icrs.service.ClassRoomService;
import com.shencangblue.design.icrs.utils.BDAipBodyAnalysis;
import com.shencangblue.design.icrs.utils.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;

@RestController
@RequestMapping("/api")
public class ClassRoomController {
    @Resource
    private ClassRoomService classRoomService;

    /**
     * 保存新的或者修改教室
     * @param classRoom 教室
     * @return 保存的新房间
     */
    @CrossOrigin
    @RequestMapping("/rooms/save")
    public ClassRoom save(@RequestBody ClassRoom classRoom){
        classRoomService.save(classRoom);
        return classRoom;
    }

    /**
     * 删除教室
     * @param classRoom 教室
     * @return 删除的教室
     */
    @CrossOrigin
    @RequestMapping("/rooms/delete")
    public ClassRoom delete(@RequestBody ClassRoom classRoom){
        System.out.println(classRoom.getRoomId());
        classRoomService.delete(classRoom.getRoomId());
        return classRoom;
    }

    /**
     * 获得所有的房间列表
     * @return 封装获得所有房间
     */
    @CrossOrigin
    @RequestMapping("/rooms")
    public Result getAll(){
        return ResultFactory.buildSuccessResult(classRoomService.getAll());
    }

    /**
     * 获取所有的房间数量
     * @return 封装的房间数
     */
    @CrossOrigin
    @RequestMapping("/rooms/count")
    public Result getAllCount(){
            return ResultFactory.buildSuccessResult(classRoomService.CountByAllClassRoom());
    }

    /**
     * 获取正在使用的房间数
     * @return 封装的房间数
     */
    @CrossOrigin
    @RequestMapping("/rooms/used-count")
    public Result getUsedCount(){
        return ResultFactory.buildSuccessResult(classRoomService.CountByUsedClassRoom(1));
    }

    /**
     * 不可用的房间数量
     * @return 封装的房间数目
     */
    @CrossOrigin
    @RequestMapping("/rooms/unused-count")
    public Result getUnusedCount(){
        return ResultFactory.buildSuccessResult(classRoomService.CountByUsedClassRoom(-1));
    }

    /**
     * 获取没有预约的房间
     * @return 封装的房间
     */
    @CrossOrigin
    @RequestMapping("/rooms/usable-rooms")
    public Result getUsableRooms(){
        return ResultFactory.buildSuccessResult(classRoomService.findAllUsableRooms(0));
    }


    /**
     * 修改指定的房间数据
     * @return 修改结果
     */
    @CrossOrigin
    @RequestMapping("/rooms/update")
    public String update(){
        return classRoomService.update(3L,classRoomService.getById(3L))!=null?"sec":"fal";
    }


    /**
     * 获取不同的分类的房间
     * @param capacity 分类的依据:房间容纳人数
     * @return 教室列表
     */
    @CrossOrigin
    @RequestMapping("/rooms/capacity/{capacity}/rooms")
    public Iterable<ClassRoom> findAllByCapacity(@PathVariable("capacity") int capacity){
        System.out.println(capacity);
        if (0==capacity){
            return classRoomService.getAll();
        }else {
            return classRoomService.findAllByCapacity(capacity);
        }
    }

    /**
     * 查询功能
     * @param keywords 要查询的关键字
     * @return 查询到的教室
     */
    @CrossOrigin
    @RequestMapping("/search")
    public Iterable<ClassRoom> searchResult(@RequestParam("keywords") String keywords){
        if ("".equals(keywords)){
            return classRoomService.getAll();
        }
        else {
            return classRoomService.search(keywords);
        }
    }

    /**
     * 通过教室名字获取教室Id
     * @param roomName  教室名字
     * @return 教室的Id
     */
    @RequestMapping("/room/idName")
    public Long getRoomIdByName(@RequestParam("roomName") String roomName){
        System.out.println(classRoomService.getRoomByName(roomName).getRoomId());
        return classRoomService.getRoomByName(roomName).getRoomId();
    }

    /**
     * 检查教室是否用占用,进行状态检查并修改-重新封装模式
     * @return 预约情况
     */
    @RequestMapping("/checkRoomIsWillUse")
    public Result checkRoomIsWillUse(){
        return ResultFactory.buildSuccessResult(classRoomService.checkRoomIsWillUse());
    }

    /**
     * 用于统计房间人数的方法-活体检测-非前端返回类型
     * @param classRoom 房间Id
     * @return 封装的人数
     */

    @RequestMapping("/checkRoomNumber")
    public Result checkRoomNumberOfParticipants(ClassRoom classRoom){
        return null;
        //return ResultFactory.buildSuccessResult(classRoomService.checkRoomNumberOfParticipants(classRoom.getRoomId()));
    }

    /**
     * 用于统计房间人数的方法-活体检测-前端返回类型
     * @param file 教室的图像
     * @return 封装的人数
     */
    @PostMapping("/classroomInfo/info")
    public String coversUpload(MultipartFile file) {
        AipBodyAnalysis client =BDAipBodyAnalysis.getClient();
        String folder = "D:/workspace/img";
        File imageFolder = new File(folder);
        File f = new File(imageFolder, StringUtils.getRandomString(6) + file.getOriginalFilename()
                .substring(file.getOriginalFilename().length() - 4));
        if (!f.getParentFile().exists())
            f.getParentFile().mkdirs();
        try {
            file.transferTo(f);
//            String imgURL = "http://localhost:8443/api/file/" + f.getName();
//            return imgURL;
            return classRoomService.analysisPeople(client ,f);
        } catch (IOException e) {
            e.printStackTrace();
            return "-1";
        }
    }


}

 如果也想学习本系统,下面领取。回复:011springboot

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

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

相关文章

【微服务】Nacos为什么放弃短连接(http)而选择拥抱长连接(gRPC)

目录 一、现状背景 二、场景分析 1、配置 2、服务 三、长连接核心诉求 1、功能性诉求 1.1、客户端 1.2、服务端 2、性能 3、负载均衡 4、连接生命周期 4.1、心跳保活机制 4.2、需要什么 四、长连接选型对比 五、基于长链接的⼀致性模型 1.、配置⼀致性模型 1.…

【软件测试】8年测试老鸟的解读,测试人你的发展?测试开发......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 测试开发到底是测试…

引擎入门 | Unity UI简介–第3部分(3)

本期我们继续为大家进行Unity UI简介&#xff08;第三部分&#xff09;的后续教程 本篇内容 7.使面板上下滑动 文章末尾可免费获取教程源代码 本篇本篇Unity UI简介&#xff08;第三部分&#xff09;篇幅较长&#xff0c;分为八篇&#xff0c;本篇为第三篇。 7.使面板上下…

第6章 关系代数语言

第6章 关系代数语言 考试范围&#xff1a;6.1 考试题型&#xff1a;计算题 考试内容&#xff1a;关系代数操作 Selection Projection Join Cartesian product Rename Union set-difference intersection 1、Selection(选行操作) 2、Projection(选列操作) 3、Join N…

rabbitmq基础4——单机多节点集群、多机集群部署、基础功能测试

文章目录一、一机多实例集群1.1 三机启动1.2 立主纳从1.3 查看集群状态1.4 web监控1.5 测试1.5.1 数据同步1.5.2 一从死&#xff0c;主仍战1.5.3 从复活&#xff0c;死亡期间数据同步1.5.4 主死&#xff0c;从活但不可用二、多机集群2.1 确定主机名2.2 三机部署rabbitmq2.3 设主…

白话说Java虚拟机原理系列【第二章】:Class字节码文件详解

前导说明&#xff1a; 本文基于《深入理解Java虚拟机》第二版和个人理解完成&#xff0c; 以大白话的形式期望能用大家都看懂的描述讲清楚虚拟机内幕&#xff0c; 后续会增加基于《深入理解Java虚拟机》第三版内容&#xff0c;并进行二个版本的对比。 Class字节码文件的数据结构…

ChatGPT 帮我跑了一个完整的 DevOps 流水线,离了个大谱...

大家好&#xff0c;我是米开朗基杨。上篇文章给大家介绍了&#x1f449;如何将 N 个 ChatGPT 账号接入微信&#xff0c;今天就来给大家演示一下如何利用 ChatGPT 帮我工作&#xff0c;让自己有更多的时间摸鱼&#xff01;上篇文章还没看的赶紧去看&#x1f447;我将 9 个 ChatG…

SpringBoot2核心技术(核心功能)- 05、Web开发【5.3 请求参数处理】

5.3、请求参数处理 0、请求映射 1、rest使用与原理 xxxMapping&#xff1b;Rest风格支持&#xff08;使用HTTP请求方式动词来表示对资源的操作&#xff09; 以前&#xff1a;/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户 现在&#xff1…

Google 释出开源软件漏洞扫描工具 OSV-Scanner​

开源开发人员可在项目使用 OSV-Scanner&#xff0c;透过比对依赖项目和 OSV 漏洞资料库&#xff0c;找出项目的依赖项目中所存在的漏洞。Google 推出免费工具 OSV-Scanner&#xff08;https://github.com/google/osv-scanner&#xff09;&#xff0c;供开源开发人员可以更简单地…

docker网络模式 与 搭建nginx

目录 1. docker网络模式 2. 连接容器的三种方法 3. Docker Networking 3.1 创建网络 3.2 查看宿主机中创建的网络 3.3 删除网络 3.3 如何使用网络 4.搭建Nginx 1.准备工作 1.1 拉取镜像 1.2 在宿主机中创建挂载目录 2.准备2个tomcat 容器集群 3.准备 Nginx配置 3.…

ffmpeg 命令的简单使用

ffmpeg命令是在windows端使用的&#xff0c;使用前&#xff0c;需要先下载对应的 exe文件 1.准备环境 访问FFmpeg官网的下载地址&#xff08;https://www.gyan.dev/ffmpeg/builds/&#xff09;下载对应的压缩包&#xff0c;解压后即可使用 2.使用 ffmpeg.exe的使用 • 功能 …

利用Clion编译器完成C++的头文件与源文件的映射

1、前言 嘿嘿&#xff0c;众所周知&#xff0c;本人是一名Java后端人员&#xff0c;那么为什么开始搞C/C了咧&#xff1f; 因为Java是在C/C的基础上开发的语言&#xff0c;而且性能也是业界公认的除了机器语言外最好的编程语言&#xff0c;所以我就想啊&#xff0c;如果将Java…

记一次返工

记一次返工 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;记一次返工 CSDN&#xff1a;记一次返工 本文搬运自自己的博客园博客&#xff0c;发布于 2018-05-12 说明 本周我经历了参加工作以来&#xff0c;最大的一次返工&#xff0c;这一周都是茶饭不思…

安全灵活,华为云桌面成为数字化办公最佳搭档

目前云上数字化办公已经是大势所趋&#xff0c;但是如何快速高效地为用户提供便捷高效的工作和生活体验&#xff0c;依然需要大量的技术投入来实现。而华为云桌面就是云上办公的门户与平台&#xff0c;它可以将各种业务系统在云端进行集中管理与调度&#xff0c;通过统一的接口…

二、collection接口

文章目录Collection接口和常用方法(以ArrayList为例)基本使用方法遍历元素方式1(iterator)遍历元素方式2(增强for)练习Collection接口和常用方法(以ArrayList为例) 以ArrayList&#xff0c;其他集合同理使用 基本使用方法 注&#xff1a;集合添加基本数据类型会自动装箱成对…

非零基础自学Golang 第15章 Go命令行工具 15.1 编译相关指令 15.1.2 run

非零基础自学Golang 文章目录非零基础自学Golang第15章 Go命令行工具15.1 编译相关指令15.1.2 run第15章 Go命令行工具 15.1 编译相关指令 15.1.2 run 我们在调试代码时通常会使用go run命令。 该命令会编译执行Go语言源码&#xff0c;不会在当前目录生成可执行文件&#x…

【LeetCode每日一题:1799. N 次操作后的最大分数和~~~记忆化搜索+动态规划+状态压缩+最大公约数】

题目描述 给你 nums &#xff0c;它是一个大小为 2 * n 的正整数数组。你必须对这个数组执行 n 次操作。 在第 i 次操作时&#xff08;操作编号从 1 开始&#xff09;&#xff0c;你需要&#xff1a; 选择两个元素 x 和 y 。 获得分数 i * gcd(x, y) 。 将 x 和 y 从 nums 中…

07. 渗透测试之针对网站的信息收集

07. 渗透测试之针对网站的信息收集 01 信息收集简介 什么是信息收集 信息收集&#xff08;Information Gathering&#xff09;是指通过各种方式获取所需要的信息。信息收集是信息得以利用的第一步&#xff0c;也是关键的一步。信息收集工作的好坏&#xff0c;会影响整个渗透…

全国各城市疫情达峰进度条感染高峰时间表最新

防疫政策放开之后&#xff0c;多位专家就研判&#xff0c;未来一个多月内全国疫情将达到感染高峰。而近日&#xff0c;一张全国各地疫情进度和最终高峰的预计时间表流传&#xff0c;对各城市首轮感染高峰期进行了预测。那么&#xff0c;全国各城市疫情达峰进度条如何了&#xf…

怎么高效的开发一款成功的产品?Working Backwards

过去的几天一直在回顾整个产品团队过去一年所做的工作&#xff0c;有的工作有亮点&#xff0c;有的工作可以说是乏善可陈。对于不好的&#xff0c;发现其中的一个核心原因就是没有坚持“以终为始”的原则。现将我2021年10月写的一篇公司内部博客再次分享给团队&#xff0c;也分…