【原创唯一】基于微信小程序+uni-app+vue的实验室预约管理系统 课程设计/大作业/期末作业(源码+MySQL数据库+实验报告+PPT+远程部署)
作者介绍:专注于计算机课设、毕设辅导,本人开发,原创代码,一题一稿,绝不撞题,坚持原创,个人创作,非工作室,源码全网唯一。
✅ 原创唯一:个人原创开发,独立设计数据库与业务逻辑,拒绝工作室代码改造
✅ 技术主流:SpringBoot + Vue 前后端分离,MySQL,Echarts数据统计,可本地运行
✅ 配套资料:源码 + 数据库 + 实验报告/论文 + 答辩 PPT+部署演示+远程调试+问题解答
实验室预约管理系统摘要
随着高校与科研机构实验教学规模的不断扩大,实验室资源(场地、器材、时段)的数字化管理成为提升教学效率、避免资源冲突的重要手段。本文以「实验室管理系统」为研究对象,在已有 Vue 3 管理后台与 Spring Boot 后端的基础上,按照 uni-app 3 小程序开发规范,设计并实现面向普通用户的微信小程序端。小程序采用 Vue 3 Composition API、uView Plus 组件库与页面自治架构,通过 JWT 会话机制对接 RESTful API,实现了实验室浏览与预约、器材浏览与领用、预约/领用记录管理、系统公告查看及个人资料维护等核心功能。本文从需求分析、总体架构、关键模块实现、前后端联调策略等方面进行阐述,并对微信小程序环境下的兼容性处理与工程实践经验进行总结。实践表明,该方案在保持与 Web 端业务一致性的同时,有效降低了移动端开发复杂度,为同类 C 端小程序项目提供了可复用的实现参考。
技术栈: Spring Boot 3 + MyBatis-Plus + MySQL + Vue 3 + Element Plus + ECharts
数据库表:7张

技术范围:SpringBoot、Vue、数据可视化、小程序、HLMT、Nodejs、uni-app、MySQL数据库、ElementUi等设计与开发。
适用范围:软件工程、软件技术、数据库课程设计、计算机科学与技术、数据库系统原理、JavaWeb开发、JavaEE、Java、Web应用开发、动态网页设计的课程设计、课设、大作业、课程实验、期末作业
实验报告参考内容
实验报告可供大家参考使用
本小程序工程位于项目 miniapp 目录,技术选型如下:
|
层次 |
技术 |
说明 |
|
跨端框架 |
uni-app 3 |
基于 Vue 3,一套代码编译至微信小程序与 H5 |
|
视图层 |
Vue 3 Composition API |
使用 `<script setup>` 语法,逻辑更清晰 |
|
UI 组件 |
uView Plus 3.x |
通过 easycom 自动引入,提供 Loading、Empty、Tag 等 |
|
构建工具 |
Vite 5 + @dcloudio/vite-plugin-uni |
支持 H5 代理与微信小程序编译 |
|
样式 |
SCSS + rpx |
适配不同屏幕宽度 |
|
后端 |
Spring Boot 3 + MyBatis-Plus |
统一 `/api` 前缀的 REST 接口 |
|
认证 |
JWT Bearer Token |
与 Web 端共用 AuthController |



小程序端功能(用户端)
|
编号 |
功能模块 |
描述 |
对应 API |
|
F1 |
用户登录 |
用户名密码登录,仅 USER 角色 |
POST /auth/login |
|
F2 |
用户注册 |
注册并自动登录 |
POST /auth/register |
|
F3 |
首页概览 |
展示统计摘要、快捷入口、最新公告 |
GET /stats, GET /announcements |
|
F4 |
实验室列表 |
关键词与状态筛选、分页加载 |
GET /labs |
|
F5 |
实验室预约 |
选择日期时段提交预约 |
POST /lab-reservations |
|
F6 |
器材列表 |
关键词与分类筛选、分页 |
GET /equipment, GET /equipment/categories |
|
F7 |
器材领用 |
填写数量与应还日期 |
POST /equipment-borrows |
|
F8 |
我的预约 |
筛选、结束、取消、删除 |
GET/PUT/DELETE /lab-reservations |
|
F9 |
我的领用 |
筛选、归还、删除 |
GET/PUT/DELETE /equipment-borrows |
|
F10 |
公告 |
列表与详情 |
GET /announcements |
|
F11 |
个人中心 |
资料编辑、改密、退出 |
GET/PUT /auth/profile, PUT /auth/password |





系统后台功能(管理员端)
|
编号 |
功能模块 |
功能描述 |
|
A01 |
实验室管理 |
实验室信息增删改查、批量删除、状态维护(可用/维护中) |
|
A02 |
器材管理 |
器材台账维护、分类管理、库存数量管理、关联所属实验室 |
|
A03 |
预约管理 |
查看全部实验室预约与器材领用记录,支持检索与批量删除 |
|
A04 |
归还管理 |
查看器材归还归档记录,支持删除 |
|
A05 |
用户管理 |
用户列表、新增/编辑用户、启用/禁用账号 |
|
A06 |
公告管理 |
公告发布、草稿/发布状态、分页管理 |
|
A07 |
工作台 |
统计卡片与多类型图表展示 |





数据库设计
图书管理系统数据库设计为:

表1 users(用户表)
|
字段 |
类型 |
说明 |
|
id |
BIGINT |
主键 |
|
username |
VARCHAR(50) |
用户名,唯一 |
|
password |
VARCHAR(100) |
BCrypt 密码 |
|
real_name |
VARCHAR(50) |
姓名 |
|
phone |
VARCHAR(20) |
手机 |
|
role |
VARCHAR(20) |
ADMIN / USER |
|
enabled |
TINYINT |
是否启用 |
|
created_at |
DATETIME |
创建时间 |
表2 labs(实验室表)
|
字段 |
类型 |
说明 |
|
id |
BIGINT |
主键 |
|
name |
VARCHAR(100) |
名称 |
|
location |
VARCHAR(200) |
位置 |
|
capacity |
INT |
容量 |
|
status |
VARCHAR(20) |
AVAILABLE / MAINTENANCE |
|
description |
VARCHAR(500) |
简介 |
|
created_at / updated_at |
DATETIME |
时间戳 |
表3 equipment(器材表)
|
字段 |
类型 |
说明 |
|
id |
BIGINT |
主键 |
|
asset_no |
VARCHAR(50) |
资产编号,唯一 |
|
name |
VARCHAR(200) |
名称 |
|
model |
VARCHAR(100) |
型号 |
|
category |
VARCHAR(50) |
分类 |
|
lab_id |
BIGINT |
所属实验室 |
|
total_quantity |
INT |
总数量 |
|
available_quantity |
INT |
可用数量 |
|
status |
VARCHAR(20) |
NORMAL / MAINTENANCE |
|
description |
VARCHAR(500) |
简介 |
表4 lab_reservations(实验室预约表)
|
字段 |
类型 |
说明 |
|
id |
BIGINT |
主键 |
|
lab_id |
BIGINT |
实验室 ID |
|
user_id |
BIGINT |
用户 ID |
|
reserve_date |
DATE |
预约日期 |
|
start_time / end_time |
VARCHAR(10) |
时段 |
|
purpose |
VARCHAR(200) |
用途 |
|
status |
VARCHAR(20) |
RESERVED / RETURNED / CANCELLED |
|
remark |
VARCHAR(200) |
备注 |
表5 equipment_borrows(器材领用表)
|
字段 |
类型 |
说明 |
|
id |
BIGINT |
主键 |
|
equipment_id |
BIGINT |
器材 ID |
|
user_id |
BIGINT |
用户 ID |
|
quantity |
INT |
数量 |
|
borrow_date |
DATE |
领用日期 |
|
due_date |
DATE |
应还日期 |
|
return_date |
DATE |
归还日期 |
|
status |
VARCHAR(20) |
BORROWED / RETURNED |
系统架构

Controller及Service层核心代码写法:
@RestController
@RequestMapping("/api/equipment-returns")
@RequiredArgsConstructor
@RequireRole({UserRole.ADMIN, UserRole.USER})
public class EquipmentReturnController {
private final EquipmentReturnService equipmentReturnService;
@GetMapping
@RequireRole(UserRole.ADMIN)
public ApiResponse<PageResult<EquipmentReturn>> list(
@RequestParam(required = false) String keyword,
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int size) {
return ApiResponse.ok(equipmentReturnService.list(keyword, page, size));
}
@DeleteMapping("/batch")
@RequireRole(UserRole.ADMIN)
public ApiResponse<Void> batchDelete(@RequestBody List<Long> ids) {
equipmentReturnService.batchDelete(ids);
return ApiResponse.ok("删除成功", null);
}
@DeleteMapping("/{id}")
@RequireRole(UserRole.ADMIN)
public ApiResponse<Void> delete(@PathVariable Long id) {
equipmentReturnService.delete(id);
return ApiResponse.ok("删除成功", null);
}
}
@Service
@RequiredArgsConstructor
public class EquipmentReturnService extends ServiceImpl<EquipmentReturnMapper, EquipmentReturn> {
private final UserMapper userMapper;
private final EquipmentMapper equipmentMapper;
private final RelationFillHelper relationFillHelper;
public PageResult<EquipmentReturn> list(String keyword, int page, int size) {
Long user_id = AuthContext.isAdmin() ? null : AuthContext.getUserId();
var query = lambdaQuery().eq(user_id != null, EquipmentReturn::getUser_id, user_id);
if (StringUtils.hasText(keyword)) {
List<Long> user_ids = userMapper.selectList(
Wrappers.<User>lambdaQuery()
.like(User::getUsername, keyword)
.or().like(User::getReal_name, keyword))
.stream().map(User::getId).toList();
List<Long> equipment_ids = equipmentMapper.selectList(
Wrappers.<Equipment>lambdaQuery().like(Equipment::getName, keyword))
.stream().map(Equipment::getId).toList();
if (user_ids.isEmpty() && equipment_ids.isEmpty()) {
return new PageResult<>(List.of(), 0, page, size);
}
query.and(w -> {
if (!user_ids.isEmpty()) {
w.in(EquipmentReturn::getUser_id, user_ids);
}
if (!equipment_ids.isEmpty()) {
if (!user_ids.isEmpty()) {
w.or();
}
w.in(EquipmentReturn::getEquipment_id, equipment_ids);
}
});
}
Page<EquipmentReturn> result = query.orderByDesc(EquipmentReturn::getId).page(new Page<>(page, size));
relationFillHelper.fillEquipmentReturns(result.getRecords());
return PageResult.of(result);
}
@Transactional
public void delete(Long id) {
EquipmentReturn record = getById(id);
if (record == null) {
throw new RuntimeException("归还记录不存在");
}
if (!AuthContext.isAdmin()) {
throw new RuntimeException("仅管理员可删除归还记录");
}
removeById(id);
}
@Transactional
public void batchDelete(List<Long> ids) {
for (Long id : ids) {
delete(id);
}
}
}
博主本身从事软件开发、有丰富的编程能力和水平,累积给上千名同学进行辅导,论文纯手写查重低于10%,全都顺利通过答辩!
擅长:功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文降重、长期答辩答疑辅导、腾讯会议一对一专业讲解辅导答辩、模拟答辩演练、和理解代码逻辑思路等。
更多个人原创作品👇🏻
获取联系
项目功能完整,可在本地运行,并可远程调试,确保运行顺利!
查看👇🏻👇🏻获取联系方式👇🏻👇🏻
更多推荐

所有评论(0)