基于Spring Boot+Unipp的博物馆预约小程序(协同过滤算法、二维码识别)【原创】

🎈系统亮点:协同过滤算法、二维码识别;

一.系统开发工具与环境搭建

1.系统设计开发工具


后端使用Java编程语言的Spring boot框架
项目架构:B/S架构
运行环境:win10/win11、jdk17


前端:
技术:框架Vue.js;UI库:ElementUI;
开发工具:Visual Studio Code;


后端:
技术:Java语言、mybatis plus、Spring boot框架;
开发工具:IDEA 2023.3.3版本;


小程序端:
技术:框架Uniapp;
开发工具:HBuilder X;


数据库:
数据库:mysql5.7
数据库工具:Navicat12版本;


二.系统实现(部分截图)

1. 系统登录模块

管理员输入自己的用户名、密码和图形验证码。点击此按钮后,系统会对输入的用户名、密码和验证码进行验证,如果验证通过,管理员就可以成功登录系统后台。在实现这个功能时,后端需要对管理员输入的信息进行验证。首先,需要查询数据库中是否存在该用户名,如果不存在,返回错误信息提示用户。然后,对比用户输入的密码是否与数据库中存储的密码一致,如果不一致,返回错误信息提示用户。最后,验证用户输入的图形验证码是否正确,如果不正确,返回错误信息提示用户。

2 用户管理模块

用户管理模块,提供表单让管理员输入新用户的信息,提交表单后,系统将验证数据的有效性,并将新用户信息存储到数据库中。除了新增用户,该模块还提供了删除用户的功能。此外,用户管理模块还支持修改用户信息的功能。这可能是更改用户的姓名、地址、联系方式或其他相关信息。最后,该模块还支持导出用户功能。

关键代码:

//声明一个支持用户查询的(拉姆达)表达式
LambdaQueryWrapper<AppUser> queryWrapper = Wrappers.<AppUser>lambdaQuery()
.eq(input.getId()!=null,AppUser::getId,input.getId())
.eq(input.getCreatorId()!=null,AppUser::getCreatorId,input.getCreatorId());

3 资讯管理模块

在资讯管理模块中,可以博物馆相关的资讯进行添加。包括但不限于博物馆的资讯标题、封面、资讯内容等。这些信息将被妥善存储和管理,以便于用户随时查阅和使用。同时,当资讯发布的有问题的时候,我们可以对资讯进行修改。此外,我们还增加了删除功能,用户可以对自己不再需要的资讯进行删除。

关键代码:

//声明一个支持资讯查询的(拉姆达)表达式
LambdaQueryWrapper<ArticleInfo> queryWrapper = Wrappers.<ArticleInfo>lambdaQuery()
.eq(input.getId()!=null,ArticleInfo::getId,input.getId())
.eq(input.getCreatorId()!=null,ArticleInfo::getCreatorId,input.getCreatorId());

4 话题管理模块

话题管理模块是一个功能丰富的系统,它不仅可以增加不同的话题类型,以满足用户对各种话题的需求,还可以对话题进行审核,确保话题的质量和合规性。此外,它还包括了管理话题评论的功能,可以对用户的评论进行管理和监控,以保证评论区的秩序和质量。话题管理模块还提供了话题收藏的功能,同时,该模块还记录了用户的浏览记录,管理员可以查看用户浏览的所有话题记录和话题收藏记录。

关键代码:

//查询出关联的创建用户信息
AppUserDto  CreatorAppUserDTO=new AppUserDto();
AppUser  CreatorAppUserEntity= _AppUserMapper.selectOne(Wrappers.<AppUser>lambdaQuery().eq(AppUser::getId,item.getCreatorId()));
if(CreatorAppUserEntity!=null) {
BeanUtils.copyProperties(CreatorAppUserDTO, CreatorAppUserEntity);
item.setCreatorAppUserDto(CreatorAppUserDTO);
}
//查询关联的Comment表信息
List<Comment> CommentEntitys = _CommentMapper.selectList(Wrappers.<Comment>lambdaQuery().eq(Comment::getTopicId, item.getId()));
List<CommentDto> CommentDTOS = Extension.copyBeanList(CommentEntitys, CommentDto.class);
item.setCommentDtos(CommentDTOS);
//查询出关联的TopicType表信息
TopicTypeDto TopicTypeDTO = new TopicTypeDto();
TopicType  TopicTypeEntity= _TopicTypeMapper.selectOne(Wrappers.<TopicType>lambdaQuery().eq(TopicType::getId,item.getTopicTypeId()));
if(TopicTypeEntity!=null) {
BeanUtils.copyProperties(TopicTypeDTO,TopicTypeEntity);
item.setTopicTypeDto(TopicTypeDTO);
}

5 博物馆管理模块

博物馆预约管理系统可以帮助博物馆维护其信息。这包括博物馆的开放时间、展览信息、活动安排等。通过系统,博物馆可以方便地更新和管理这些信息,确保用户能够及时了解到最新的展览和活动信息。其次,博物馆预约管理系统可以提供用户预约参观的功能。用户可以通过系统在线预约参观时间,选择参观日期和时间段。在预约成功后,小程序会生成一个独特的二维码,用于用户的入院识别。管理员可以对二维码进行扫码,以验证其预约身份。

关键代码:

try {
ByteArrayInputStream byteArrayInputStream=new ByteArrayInputStream(decodedBytes);//byte[] 转BufferedImage
image = ImageIO.read(byteArrayInputStream);
LuminanceSource source = new BufferedImageLuminanceSource(image);
Binarizer binarizer = new HybridBinarizer(source);
BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
Map<DecodeHintType, Object> hints = new HashMap<DecodeHintType, Object>();
hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
Result result = new MultiFormatReader().decode(binaryBitmap, hints);//解码
System.out.println("图片中内容:  ");
System.out.println("content: " + result.getText());
content = result.getText();
} catch (IOException e) {
e.printStackTrace();
} catch (NotFoundException e) {
e.printStackTrace();
}

6 游客信息管理模块

当有新的游客进入博物馆时,我们需要记录他们的个人信息,包括姓名、身份证、联系方式等。其次,修改游客信息也是常见的操作。有时候,游客可能会提供错误的信息或者需要更新他们的联系方式。在这种情况下,我们需要及时修改游客的信息。最后,当游客离开博物馆或者不再需要我们的服务时,我们需要将他们的信息从系统中删除。

关键代码:

//声明一个游客信息实体
Visitor Visitor = new Visitor();
//把前端传入的input参数拷贝到游客信息实体
BeanUtils.copyProperties(Visitor,input);
//调用数据库的增加或者修改方法
saveOrUpdate(Visitor);
//定义一个返回给前端的游客信息传输模型
VisitorDto VisitorDto=new VisitorDto();
//同理把操作的游客信息实体拷贝给游客信息传输模型
BeanUtils.copyProperties(VisitorDto,Visitor);

7 博物馆小程序首页模块

在小程序首页,用户可以轻松地获取到博物馆的各项信息。这些信息包括博物馆的开放时间、展览内容等。此外,我们的小程序还提供了预约功能。用户可以根据自己的需求,选择预约的时间,预约人数,添加游客信息,然后提交预约申请。除了预约功能,我们的小程序首页还提供了博物馆的相关资讯。这些资讯包括博物馆的最新展览信息、活动预告、优惠信息等,让用户可以随时了解到博物馆的最新动态。

关键代码:

  //创建订单AppointmentRecord AppointmentRecord = new AppointmentRecord();AppointmentRecord.setAppointStatus(Enums.AppointStatus.待使用.index());AppointmentRecord.setPayTime(LocalDateTime.now());AppointmentRecord.setPayType(input.getPayType());AppointmentRecord.setBuyUserId(input.getBuyUserId());AppointmentRecord.setViewSpot(input.getViewSpot());AppointmentRecord.setTotalPeople(input.getTotalPeople());AppointmentRecord.setBeginTime(viewSpotAppointSetting.getBeginTime());AppointmentRecord.setEndTime(viewSpotAppointSetting.getEndTime());AppointmentRecord.setViewSpotAppointSettingId(input.getViewSpotAppointSettingId());AppointmentRecord.setTotalMoney(viewSpotAppointSetting.getPrice() * input.getTotalPeople());saveOrUpdate(AppointmentRecord);//添加预约明细人//循环前端传入的游客集合信息for (AppointmentRecordDetDto appointmentRecordDetDto : input.getDets()) {//创建一个预约明细实体AppointmentRecordDet appointmentRecordDet = new AppointmentRecordDet();//把前端传入的input参数拷贝到预约明细实体BeanUtils.copyProperties(appointmentRecordDet, appointmentRecordDetDto);//设置预约记录idappointmentRecordDet.setAppointmentRecordId(AppointmentRecord.getId());
_AppointmentRecordDetMpper.insert(appointmentRecordDet);    }

8 博物馆小程序话题圈模块

在小程序话题圈,通过浏览话题主页、搜索栏输入关键词或点击相关链接来找到感兴趣的话题。找到话题,用户可以点击进入,查看已有的帖子、评论和讨论。在话题页面,通常会有一个“收藏”按钮。可以将话题保存到个人的收藏夹中。每个帖子下方都会有一个评论区域,用户可以在这里输入自己的观点、想法或问题。用户要发起一个新的讨论,可以选择创建一个新的话题。

关键代码:

if(input.getId()==null)
{
return new TopicRecordDto();
}
PagedResult<TopicRecordDto>  pagedResult =List(input);
return pagedResult.getTotalCount()>0?pagedResult.getItems().stream().findFirst().get():new TopicRecordDto();

9 博物馆小程序个人信息模块

在小程序个人信息模块,可以查看和管理个人相关信息,可以查看您已经预约的次数,可以浏览和查找之前参与或发布的话题。允许您查看您之前浏览过的内容,方便您找到感兴趣的话题或信息。此外,也可以对个人信息进行修改,查看个人订单,话题收藏保存的都是你收藏的话题。

关键代码:

//查询出关联的创建用户信息
AppUserDto  CreatorAppUserDTO=new AppUserDto();
AppUser  CreatorAppUserEntity= _AppUserMapper.selectOne(Wrappers.<AppUser>lambdaQuery().eq(AppUser::getId,item.getCreatorId()));
if(CreatorAppUserEntity!=null) {
BeanUtils.copyProperties(CreatorAppUserDTO, CreatorAppUserEntity);
item.setCreatorAppUserDto(CreatorAppUserDTO);
}        
//查询出关联的Topic表信息
TopicDto TopicDTO = new TopicDto();        
Topic  TopicEntity= _TopicMapper.selectOne(Wrappers.<Topic>lambdaQuery().eq(Topic::getId,item.getTopicId()));
if(TopicEntity!=null) {  
BeanUtils.copyProperties(TopicDTO,TopicEntity);
item.setTopicDto(TopicDTO); 
}  
//查询出关联的AppUser表信息
AppUserDto UserDTO = new AppUserDto();        
AppUser  UserEntity= _AppUserMapper.selectOne(Wrappers.<AppUser>lambdaQuery().eq(AppUser::getId,item.getUserId()));
if(UserEntity!=null) {  
BeanUtils.copyProperties(UserDTO,UserEntity);
item.setUserDto(UserDTO); 
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解

目录 深入理解 JavaScript 中的 Array.find() 方法&#xff1a;原理、性能优势与实用案例详解 一、引言&#xff1a;为什么要使用Array.find() 二、Array.find()的使用与技巧 1、基础语法 2、返回值 3、使用技巧 三、Array.find()的优势与实际应用案例 1、利用返回引用…

安全、便捷、效率高,明达边缘计算网关助力制药装备企业远程调机

随着药厂对设备运维需求的增长&#xff0c;制药装备企业需要在提高运维效率的同时&#xff0c;降低人工及差旅成本。制药装备因其数据具有高度的保密性&#xff0c;要求运维工程师提供安全可靠的远程调试方式。本案例介绍了明达技术MBox20系列5口WIFI通用网关在制药装备上的应用…

HBase 开发:使用Java操作HBase

1、实战简介 HBase和Hadoop一样&#xff0c;都是用Java进行开发的&#xff0c;本次实训我们就来学习如何使用Java编写代码来操作HBase数据库。 实验环境&#xff1a; hadoop-2.7 JDK8.0 HBase2.1.1 2、任务 1、第1关&#xff1a;创建表 package step1; import java.io.IOE…

vulhub之log4j

Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645) 漏洞简介 Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码。 Apache Log4j 在应用程序中添加日志记录最…

【视觉SLAM】2-三维空间刚体运动的数学表示

读书笔记&#xff1a;学习空间变换的三种数学表达形式。 文章目录 1. 旋转矩阵1.1 向量运算1.2 坐标系空间变换1.3 变换矩阵与齐次坐标 2. 旋转向量和欧拉角2.1 旋转向量2.2 欧拉角 3. 四元数 1. 旋转矩阵 1.1 向量运算 对于三维空间中的两个向量 a , b ∈ R 3 a,b \in \R^3 …

Ubuntu22.04基于ROS2-Humble安装moveit2教程(亲测)

一、安装ROS2-Humble 1、参考&#xff1a;Ubuntu22.04安装ROS2-humble-CSDN博客 2、确保安装完成 source /opt/ros/humble/setup.bash 方法一&#xff1a;二进制安装 sudo apt install ros-humble-moveit* 方法二&#xff1a;安装源码编译 一、卸载二进制安装包 sudo a…

一些常见网络安全术语

1、黑帽 为非法目的进行黑客攻击的人&#xff0c;通常是为了经济利益。他们进入安全网络以销毁&#xff0c;赎回&#xff0c;修改或窃取数据&#xff0c;或使网络无法用于授权用户。这个名字来源于这样一个事实&#xff1a;老式的黑白西部电影中的恶棍很容易被电影观众识别&…

ISCTF 2024 web

ISCTF 2024 web 小蓝鲨的冒险 源码&#xff1a; <?php error_reporting(0); highlight_file(__FILE__); $a "isctf2024"; $b $_GET["b"]; parse_str($b); echo "小蓝鲨开始闯关&#xff0c;你能帮助他拿到flag吗?<br>"; if ($a…

AIGC----生成对抗网络(GAN)如何推动AIGC的发展

AIGC: 生成对抗网络(GAN)如何推动AIGC的发展 前言 随着人工智能领域的迅猛发展&#xff0c;AI生成内容&#xff08;AIGC&#xff0c;AI Generated Content&#xff09;正成为创意产业和技术领域的重要组成部分。在AIGC的核心技术中&#xff0c;生成对抗网络&#xff08;GAN&am…

删除k8s 或者docker运行失败的脚本

vi delete_exited_containers.sh#!/bin/bash# 列出所有停止的容器并存储到数组 list_exited_containers() {echo -e "\nStopped containers:"containers()# 获取停止的容器信息并存入数组while IFS read -r line; docontainers("$line")done < <(do…

如何在MindMaster思维导图中制作PPT课件?

思维导图是一种利用色彩、图画、线条等图文并茂的形式&#xff0c;来帮助人们增强知识或者事件的记忆。因此&#xff0c;思维导图也被常用于教育领域&#xff0c;比如&#xff1a;教学课件、读书笔记、时间管理等等。那么&#xff0c;在MindMaster免费思维导图软件中&#xff0…

【unity小技巧】一些unity3D灯光的使用与渲染及性能优化方案

文章目录 天空盒反射配置太阳耀斑眩光烘培光照烘培光照时弹出错误&#xff0c;记得勾选模型下面的选择阴影项目配置光源模型模型shader的问题 全局光照混合光照模式混合照明模式减性照明模式Shadowmask照明模式间接烘焙照明模式 环境光遮罩灯光探针反射探针技术关闭反射探针可以…

Linux :进程间通信之管道

一、进程间通信 1.1 是什么和为什么 1、进程间通信是什么&#xff1f;&#xff1f; ——>两个或多个进程实现数据层面的交互&#xff0c;但是由于进程独立性的存在&#xff0c;导致通信的成本比较高。 2、既然通信成本高&#xff0c;那为什么还要通信呢&#xff1f;&…

“乐鑫组件注册表”简介

当启动一个新的开发项目时&#xff0c;开发者们通常会利用库和驱动程序等现有的代码资源。这种做法不仅节省时间&#xff0c;还简化了项目的维护工作。本文将深入探讨乐鑫组件注册表的概念及其核心理念&#xff0c;旨在指导您高效地使用和贡献组件。 概念解析 ESP-IDF 的架构…

ATmaga8单片机Pt100温度计源程序+Proteus仿真设计

目录 1、项目功能 2、仿真图 ​3、程序 资料下载地址&#xff1a;ATmaga8单片机Pt100温度计源程序Proteus仿真设计 1、项目功能 设计Pt100铂电阻测量温度的电路&#xff0c;温度测量范围是0-100摄氏度&#xff0c;要求LCD显示。画出电路图&#xff0c;标注元器件参数&am…

【代码pycharm】动手学深度学习v2-05 线性代数

课程链接-05 线性代数 可以先看完特定轴求和再去看p2 import torch xtorch.tensor([3.0]) ytorch.tensor([2.0]) #标量 print(1.标量只有一个元素&#xff1a;\n,xy,x*y,x/y,x**y) x2torch.arange(4) #向量 print(2.向量视为标量值组成的列表&#xff1a;\n,x2) print(3.访问张…

SpringBoot源码解析(四):解析应用参数args

SpringBoot源码系列文章 SpringBoot源码解析(一)&#xff1a;SpringApplication构造方法 SpringBoot源码解析(二)&#xff1a;引导上下文DefaultBootstrapContext SpringBoot源码解析(三)&#xff1a;启动开始阶段 SpringBoot源码解析(四)&#xff1a;解析应用参数args 目录…

ZSTD 内存泄漏问题

优质博文&#xff1a;IT-BLOG-CN Zstandard&#xff08;简称zstd&#xff09;是一种无损压缩算法&#xff0c;由Facebook开发并开源。它旨在提供高压缩比和高解压速度的平衡&#xff0c;适用于多种数据压缩需求。 特点 【1】高压缩比&#xff1a; zstd能够在保持较高压缩比的…

前端:HTML (学习笔记)【1】

一&#xff0c;网络编程的三大基石 1&#xff0c;URL &#xff08;1&#xff09;url —— 统一资源定位符&#xff1a; 网址——整个互联网中可以唯一且准确的确定一个资源的位置。 【项目外】 网址——https://www.baidu.com/ …

【C++动态规划】3148. 矩阵中的最大得分|1819

本文涉及知识点 C动态规划 LeetCode 3148. 矩阵中的最大得分 给你一个由 正整数 组成、大小为 m x n 的矩阵 grid。你可以从矩阵中的任一单元格移动到另一个位于正下方或正右侧的任意单元格&#xff08;不必相邻&#xff09;。从值为 c1 的单元格移动到值为 c2 的单元格的得…