图书馆座位预约系统
SpringBootVueMySQL
本项目是一个基于 Spring Boot 3 + Vue 3 前后端分离架构的图书馆座位预约系统,旨在解决高校图书馆座位占用混乱、资源浪费等问题,提供可视化选座、智能预约、信用积分管理、数据统计分析等核心功能。
图书馆座位预约系统 — 项目介绍文档
一、项目概述
本项目是一套图书馆座位在线预约系统,采用前后端分离架构,覆盖从用户浏览楼层座位、在线预约、签到签退、续约离席回归到信用积分管理的完整业务流程。系统同时提供后台管理端,支持楼层区域配置、座位管理、预约管理和数据统计。
| 属性 | 说明 |
|---|---|
| 项目名称 | 图书馆座位预约系统(Library Reservation System) |
| 架构模式 | B/S 前后端分离 |
| 后端技术 | Spring Boot 3.2 / MyBatis-Plus 3.5 / MySQL 8.0 / JWT |
| 前端技术 | Vue 3 / Element Plus / Pinia / Axios / ECharts / Vite |
| 开发语言 | Java 21 / JavaScript(ES6+) |
| 适用场景 | 计算机毕设、课程设计、源码学习与二次开发 |
二、技术架构
2.1 后端技术栈
| 类别 | 技术选型 | 版本 | 说明 |
|---|---|---|---|
| 核心框架 | Spring Boot | 3.2.3 | Java 企业级开发框架 |
| ORM 框架 | MyBatis-Plus | 3.5.5 | 增强版 MyBatis,简化 CRUD |
| 数据库 | MySQL | 8.0+ | 关系型数据库 |
| 安全认证 | jjwt(JWT) | 0.12.3 | 无状态 Token 认证 |
| 密码加密 | BCrypt(Hutool) | 5.8.26 | 慢哈希 + 随机盐值 |
| API 文档 | Knife4j(OpenAPI 3) | 4.4.0 | Swagger 增强 UI |
| 工具库 | Hutool | 5.8.26 | Java 通用工具集 |
| 构建工具 | Maven | 3.8+ | 依赖管理与项目构建 |
2.2 前端技术栈
| 类别 | 技术选型 | 版本 | 说明 |
|---|---|---|---|
| 核心框架 | Vue 3(Composition API) | 3.4.21 | 渐进式前端框架 |
| UI 组件库 | Element Plus | 2.6.3 | 企业级桌面端组件库 |
| 路由 | Vue Router | 4.3.0 | 单页应用路由管理 |
| 状态管理 | Pinia | 2.1.7 | Vue 官方状态管理库 |
| HTTP 客户端 | Axios | 1.15.2 | 基于 Promise 的 HTTP 库 |
| 图表 | ECharts | 5.5.0 | 数据可视化图表库 |
| 构建工具 | Vite | 5.2.0 | 下一代前端构建工具 |
| 自动导入 | unplugin-auto-import | 0.17.5 | API 自动按需导入 |
2.3 架构图
┌─────────────────────────────────────────────────────────┐
│ 浏览器(Browser) │
├───────────────────────┬─────────────────────────────────┤
│ 前台页面(Portal) │ 后台管理(Admin) │
│ localhost:5173 │ localhost:5173/admin │
│ · 首页/轮播公告 │ · 仪表盘/数据统计 │
│ · 楼层座位浏览/预约 │ · 楼层/区域/座位 CRUD │
│ · 我的预约/签到签退 │ · 预约管理/取消预约 │
│ · 信用记录/个人中心 │ · 用户/信用/黑名单管理 │
│ · 系统消息/候补队列 │ · 轮播图/公告管理 │
└───────────────────────┴─────────────────────────────────┘
│ HTTP /api/*
▼
┌─────────────────────────────────────────────────────────┐
│ Spring Boot 后端(localhost:8080) │
├─────────────┬──────────────┬──────────────┬──────────────┤
│ Interceptor │ Controller │ Service │ Mapper │
│ JWT认证 │ portal/ 前台 │ 业务逻辑 │ MyBatis-Plus│
│ 管理员鉴权 │ admin/ 后台 │ 事务管理 │ XML 自定义SQL│
└─────────────┴──────────────┴──────────────┴──────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ MySQL 8.0(yc_library) │
│ 共 11 张数据表 │
└─────────────────────────────────────────────────────────┘
2.4 安全设计
- JWT 双拦截器:
JwtAuthInterceptor(认证)+AdminAuthInterceptor(鉴权),按路径和执行顺序分层控制 - 密码 BCrypt 加密:使用慢哈希算法加随机盐值,有效抵御彩虹表攻击
@Anonymous注解:标注公开接口(如注册、登录、首页轮播公告),无需额外维护白名单- CORS 精准控制:仅允许特定来源跨域,携带认证信息
三、功能模块
3.1 前台功能(学生用户)
| 模块 | 功能点 | 说明 |
|---|---|---|
| 首页 | 轮播图展示、系统公告 | 展示轮播图 Banner 和已发布公告列表 |
| 座位浏览 | 楼层列表、区域详情、座位状态查看 | 按楼层→区域层级展示;支持静音区/讨论区/电子阅览区分类;区分空闲/已预约/故障状态 |
| 预约座位 | 选择日期时段、时段冲突检测、创建预约 | 单次最长4小时;信用分≥60且非黑名单用户可预约;同用户同时间段仅能预约一个座位 |
| 签到签退 | 到场签到、离场签退 | 预约后15分钟内需签到,超时自动释放并扣信用分;正常签退加5信用分 |
| 续约 | 使用中预约延长使用时间 | 仅可续约一次,续约时长+原时长≤4小时,且不与其他预约冲突 |
| 离席回归 | 临时离开座位、返回座位 | 离席后座位标记为临时占用;超过10分钟未回归自动释放并扣信用分 |
| 取消预约 | 主动取消待签到/使用中预约 | 提前取消不扣分,释放座位并通知候补队列 |
| 候补队列 | 加入候补、确认预约、取消候补 | 座位满时加入排队;当前用户签退/取消后按排队序号通知;10分钟内确认有效 |
| 我的预约 | 预约列表、状态筛选 | 支持按待签到/使用中/已完成/已取消/未签到(超时)筛选 |
| 信用积分 | 信用记录查询 | 初始100分;签到使用+5分;超时未签到-10分;离席超时-10分;管理员可手动调整 |
| 系统消息 | 消息列表、已读/未读、全部已读 | 预约状态变更、候补通知、信用变动等消息推送 |
| 个人中心 | 修改资料、头像上传、修改密码 | 昵称/邮箱/手机号/性别/头像可编辑 |
3.2 后台功能(管理员)
| 模块 | 功能点 | 说明 |
|---|---|---|
| 仪表盘 | 今日预约数、使用中座位数、用户总数、预约趋势图 | ECharts 可视化图表 |
| 楼层管理 | 楼层增删改查 | 楼层编号、名称、描述、开放/关闭状态 |
| 区域管理 | 区域增删改查 | 类型(静音区/讨论区/电子阅览区)、电源、靠窗、座位类型 |
| 座位管理 | 座位增删改查、状态管理 | 行号/列号/座位编号;空闲/已预约/临时占用/故障状态切换 |
| 预约管理 | 全部预约查询、按状态筛选、管理员取消预约 | 支持关键词搜索 |
| 用户管理 | 用户列表、启用/禁用、角色过滤 | 模糊搜索用户名 |
| 信用管理 | 信用记录列表、手动调整信用分 | 按用户筛选,手动加减分 |
| 黑名单管理 | 添加/解除黑名单 | 支持有效期设置和永久封禁 |
| 轮播图管理 | 轮播图增删改查 | 标题、图片、跳转链接、排序 |
| 公告管理 | 公告增删改查 | 类型(系统公告/活动通知)、置顶、草稿/发布状态 |
| 个人信息 | 查看/修改管理员信息 | 同前台个人中心 |
四、项目亮点
4.1 信用积分体系
每位用户初始拥有 100 信用分(最高 100 分,不可超过)。系统通过以下规则自动维护信用分:
- 正常签到使用并签退:+5 分
- 预约后 15 分钟未签到(超时自动释放):-10 分
- 离席超时 10 分钟未回归:-10 分
- 信用分低于 60 分时禁止预约
- 信用分上限 100 分,加分时不超过上限
- 管理员可手动调整用户信用分(总分不超过 100)
4.2 候补队列机制
当目标座位在目标时段已被预约时,用户可选择加入候补队列。当前用户签退或取消预约时,系统自动按排队序号通知候补用户,被通知用户需在 10 分钟内确认,超时自动顺延至下一位。
4.3 离席回归机制
用户在使用座位过程中可临时离开(如去洗手间、取书),系统记录离席时间。若超过 10 分钟未回归,自动释放座位并扣除信用分。回归后座位恢复正常使用状态。
4.4 续约功能
使用中的预约可申请续约一次,系统自动校验续约后总时长是否超过4小时上限以及是否与后续预约冲突。
4.5 定时任务自动处理
@Scheduled 定时任务每分钟执行三项检查:
- 超时未签到处理:释放超过 15 分钟未签到的预约
- 候补过期处理:标记超过 10 分钟未确认的候补为过期
- 离席超时处理:释放离席超过 10 分钟的座位
4.6 预约冲突检测
创建预约时进行多重校验:
- 时段重叠检测:同一座位同一时段不能有冲突预约
- 用户重叠检测:同一用户同一时段只能有一个预约
- 黑名单校验:在有效黑名单期内的用户禁止预约
- 信用分校验:低于60分禁止预约
4.7 代码规范性
- 全局统一异常处理(
GlobalExceptionHandler),错误码枚举化管理 - 分页统一返回结构(
PageResult),前端无需适配不同接口 - 所有数据库操作使用 Lambda 表达式构建条件,避免字段名硬编码
- 统一响应体(
Result<T>),所有接口返回格式一致
五、项目结构
library-reservation-system/
├── db/ # 数据库脚本(init.sql 建库建表+基础数据;demo.sql 演示数据)
├── springboot/ # 后端 Spring Boot
│ └── src/main/
│ ├── java/com/example/
│ │ ├── common/ # 公共模块(常量/枚举/异常/统一响应)
│ │ ├── config/ # 配置(跨域/拦截器/MyBatis-Plus)
│ │ ├── controller/ # 控制器(admin 后台 / portal 前台 / 文件上传)
│ │ ├── dto/ # 数据传输对象
│ │ ├── entity/ # 实体类
│ │ ├── mapper/ # MyBatis-Plus Mapper
│ │ ├── security/ # JWT 认证与拦截器
│ │ ├── service/ # 业务逻辑
│ │ ├── task/ # 定时任务
│ │ ├── utils/ # 工具类
│ │ ├── vo/ # 视图对象
│ │ └── MainApplication.java # 启动类
│ └── resources/ # 配置(application.yml、mapper XML、static 静态资源)
├── vue/ # 前端 Vue 3
│ └── src/
│ ├── api/ # 接口封装
│ ├── components/ # 公共组件
│ ├── layouts/ # 布局(PortalLayout 前台 / AdminLayout 后台)
│ ├── router/ # 路由
│ ├── stores/ # Pinia 状态
│ ├── utils/ # 工具(request、file)
│ └── views/ # 页面(admin 后台 / 前台)
└── uploads/ # 文件上传目录(avatar 头像 / demo 演示图)
