基于微信小程序的图书馆预约系统的设计与实现

个人介绍

hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹
在这里插入图片描述
🦁作者简介:一名喜欢分享和记录学习的在校大学生
💥个人主页:code袁
💥 个人QQ:2647996100
🐯 个人wechat:code8896

专栏导航

code袁系列专栏导航
1.毕业设计与课程设计:本专栏分享一些毕业设计的源码以及项目成果。🥰🥰🥰
2.微信小程序开发:本专栏从基础到入门的一系开发流程,并且分享了自己在开发中遇到的一系列问题。🤹🤹🤹
3.vue开发系列全程线路:本专栏分享自己的vue的学习历程。

非常期待和您一起在这个小小的互联网世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨ 

在这里插入图片描述

在这里插入图片描述

文章目录

        • 个人介绍
        • 专栏导航
        • 1、前言介绍
        • 2、开发技术简介
        • 3、系统功能图
        • 4、功能实现
        • 5、库表设计
        • 6、性能测试
        • 7、关键代码
        • 8、源码获取
      • 🎉写在最后

基于微信小程序的图书馆预约系统的设计与实现

1、前言介绍

图书馆预约小程序是一款方便学生和读者预约图书馆资源的便捷工具。随着数字化时代的到来,传统的图书馆预约方式已经无法满足人们的需求,因此开发了这款小程序,旨在提供更高效、便捷的图书馆资源预约服务。
通过图书馆预约小程序,用户可以轻松浏览图书馆的资源信息,包括图书、期刊、报纸等各类文献资料。用户可以根据自己的需求和兴趣,在小程序中查找并选择想要借阅或预约的图书馆资源。同时,小程序还提供了实时的资源可用性信息,帮助用户更好地安排自己的阅读计划。
除了资源浏览和预约功能,图书馆预约小程序还具有个人化推荐功能,根据用户的借阅历史和兴趣偏好,为用户推荐相关的图书馆资源,提升用户体验。此外,小程序还提供了预约管理功能,用户可以查看自己的预约记录、借阅历史等信息,方便管理自己的阅读计划。
总的来说,图书馆预约小程序为用户提供了一个便捷、高效的图书馆资源预约平台,帮助用户更好地利用图书馆资源,丰富自己的阅读生活。无论是学生还是社会读者,都可以通过这款小程序轻松预约所需的图书馆资源,享受阅读的乐趣。

2、开发技术简介

本节介绍场馆预约平台用到的一些技术和开发环境的简介,用到开发技术主要包括:
(1)前端用到Element UI组件库、Vue框架和微信小程序
(2)后端用到Node
(3)包管理器Npm
(4)中间件Express
(5)数据库MySQL
系统开发环境主要是:前端开发工具Vscode,Hbuilder、操作系统Win10、CPU i5-9300H、内存8G。

在这里插入图片描述

3、系统功能图

图书馆预约小程序提供了多项便捷的系统功能,以满足用户对图书馆资源的预约和管理需求。主要功能包括:

  1. 资源浏览:用户可以浏览图书馆的各类资源信息,包括图书、期刊、报纸等,了解资源的详细信息和可用性情况。

  2. 预约功能:用户可以通过小程序预约自己感兴趣的图书馆资源,选择借阅时间和地点,方便快捷。

  3. 个性化推荐:根据用户的借阅历史和兴趣偏好,系统会智能推荐相关的图书馆资源,提升用户体验。

  4. 预约管理:用户可以查看自己的预约记录、借阅历史等信息,方便管理自己的阅读计划。

  5. 消息通知:系统会及时向用户发送预约成功、借阅到期等消息通知,提醒用户注意借阅情况。
    通过这些功能,用户可以方便地预约和管理图书馆资源,提升阅读效率和体验。

4、功能实现

系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。下图就是管理员登录页面。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5、库表设计

程序设计是离不开对应数据库的设计操作的,这样的做法就是减少数据对程序的依赖性,所以数据库的设计也是需要花费大量的日常时间来进行设计的,在设计中对程序开发需要存储的数据信息进行实体划分,先确认实体,然后设计实体的属性等操作,这种设计就是数据库设计里面不能少的必须有的E-R模型设计。为了降低程序设计的对应的数据库设计难度,开发人员也可以使用相应的工具来进行E-R模型设计,现在市面上设计E-R模型的工具有PowerDesigner建模工具,Navicat制作工具,还有微软的Visio绘图工具。为了简便起见,本程序在设计E-R模型的时候,就选用了微软的Visio这款功能强大,操作便利的绘图工具。

在这里插入图片描述
1.预约实体及其附属图
在这里插入图片描述
2.管理员实体及其附属图
在这里插入图片描述

6、性能测试

性能测试是软件测试的一种重要形式,旨在评估系统在特定条件下的性能表现。通过模拟用户负载、并发访问等场景,性能测试可以帮助确定系统的稳定性、吞吐量、响应时间等关键性能指标,以确保系统在实际使用中能够正常运行并满足用户需求。
性能测试通常包括负载测试、压力测试、稳定性测试等不同类型,每种类型测试着重于评估系统在不同条件下的性能表现。测试样例可以是模拟多用户同时访问系统的情况,观察系统在高负载下的响应时间和资源利用情况。以下是一个简单的性能测试样例:

```java
1.from base.data_read import ReadData
2.from base.response import method_post
3.import pytest

4.# ====测试数据读取====
5.def data_read():
6.    # 1. 将yaml文件读取
7.    data_dict = ReadData('data.yaml').read_data()
8.    # 2. 从字典中取数据  url  accounts
9.    url = data_dict['test_user_login']['url']
10.    accounts = data_dict['test_user_login']['accounts']
11.    # 3. 返回数据 供测试用例调用
12.    return url, accounts
13.
14.
15.class TestLogin():
16.    @pytest.mark.parametrize('url', [data_read()[0]])
17.    @pytest.mark.parametrize('accounts', data_read()[1])
18.    def test_login(self, url, accounts):
19.        # 1. 注意这里的account是列表格式
20.        print('\n>>>', type(accounts))
21.        print(accounts)
22.        # 2. 发请求
23.        response = method_post(url, json=accounts)
24.        # 3. 判断是否请求成功
25.        assert response.status_code == 200
26.        # 4. 根据返回的code判断是否登录成功
27.        code = response.json().get('code')
28.        print(response.json())
29.        assert code == 0, '登录失败!'
30.# =============测试结果==============
31.========= 1 failed, 1 passed in 11.81s ==========
7、关键代码
<template>
  <div>
    <el-row>
      <el-col :span="6">
        <el-card style="height: 150px; margin: 10px; color: #67c23a">
          <div>
            <i class="el-icon-user-solid" style="margin-right: 10px"></i
            >用户总数
          </div>
          <div style="margin: 30px 0; text-align: center; font-weight: bold">
            {{ tableData.length }}
          </div>
        </el-card>
      </el-col>
      <el-col :span="6">
        <el-card style="height: 150px; margin: 10px; color: #e6a23c">
          <div>
            <i class="el-icon-menu" style="margin-right: 10px"></i
            >可预约座位总数
          </div>
          <div style="margin: 30px 0; text-align: center; font-weight: bold">
            {{ labList.length }}
          </div>
        </el-card>
      </el-col>
      <el-col :span="6">
        <el-card style="height: 150px; margin: 10px; color: #409eff">
          <div>
            <i class="el-icon-s-platform" style="margin-right: 10px"></i
            >区域总数
          </div>
          <div style="margin: 30px 0; text-align: center; font-weight: bold">
            {{ facilityList.length }}
          </div>
        </el-card>
      </el-col>
      <el-col :span="6">
        <el-card style="height: 150px; margin: 10px; color: #f56c6c">
          <div>
            <i class="el-icon-s-comment" style="margin-right: 10px"></i>取消预约
          </div>
          <div style="margin: 30px 0; text-align: center; font-weight: bold">
            {{ delectList.length }}
          </div>
        </el-card>
      </el-col>
    </el-row>
    <el-row>
      <el-col :span="12">
        <el-card style="margin: 10px 10px; height: 400px">
          <div
            class="echarts2"
            style="height: 350px; width: 500rpx"
            ref="echarts2"
          ></div>
        </el-card>
      </el-col>
      <el-col :span="12">
        <el-card style="margin: 10px 10px; height: 400px">
          <div
            class="echarts1"
            style="height: 350px; width: 500rpx"
            ref="echarts1"
          ></div>
        </el-card>
      </el-col>
    </el-row>
    <router-view></router-view>
  </div>
</template>

<script>
import { getAllReservation, getCancel } from "@/api/reservation";
import { allReservationTable } from "@/api/reservation";
import * as echarts from "echarts";
import { getUser } from "@/api/user";
import { getPlace, getSteat } from "@/api/index";
// import { getfk } from "@/api/sign";
const moment = require("moment");
export default {
  data() {
    return {
      day: "",
      tableData: [],
      numList: [],
      labList: [],
      facilityList: [],
      delectList: [],
      tableName: {
        username: "用户名",
        phone: "手机号",
        department: "院系",
      },
    };
  },
  components: {},
  computed: {
    tableData() {
      return this.tableData.slice(0, 3);
    },
  },
  methods: {},
  mounted() {
    //或群登录时间
    let day = new Date();
    this.day = `${day.getFullYear()}-${day.getMonth() + 1}-${day.getDate()}`;
    // 代用封装的接口
    getUser().then((res) => {
      this.tableData = res.data.data.data;
    });
    getPlace().then((res) => {
      this.facilityList = res.data.data.data;
    });
    getSteat().then((res) => {
      let data = res.data.data.data;
      let labList = [];
      for (let i = 0; i < data.length; i++) {
        if (data[i].status == 0) {
          labList.push(data[i]);
        }
      }

      this.labList = labList;
    });
    getAllReservation().then((res) => {
      console.log(res.data.data.data);
      let data = res.data.data.data;
      // 使用reduce方法计算同一category的个数并添加到新的数组对象中
      const resultArray = data.reduce((acc, curr) => {
        const found = acc.find((item) => item.name === curr.placeName);
        if (found) {
          found.value++;
        } else {
          acc.push({ name: curr.placeName, value: 1 });
        }
        return acc;
      }, []);
      console.log(resultArray);
      var echarts1 = echarts.init(this.$refs.echarts1);
      var option = {
        title: {
          text: "图书馆预约概述",
          subtext: "数据统计",
          left: "center",
        },
        tooltip: {
          trigger: "item",
        },
        legend: {
          orient: "vertical",
          left: "left",
        },
        series: [
          {
            name: "统计数据",
            type: "pie",
            radius: "50%",
            data: resultArray,
            emphasis: {
              itemStyle: {
                shadowBlur: 10,
                shadowOffsetX: 0,
                shadowColor: "rgba(0, 0, 0, 0.5)",
              },
            },
          },
        ],
      };
      echarts1.setOption(option);
      // 原始数组对象
    });
    //获取用户数据
    getCancel().then((res) => {
      let data = res.data.data.data;
      this.delectList = data;
      const resultArray = data.reduce((acc, curr) => {
        acc.find((item) => item.name === curr.reason);
        acc.push(curr.reason);
        return acc;
      }, []);
      var newArr = resultArray.filter(function (item, index) {
        return resultArray.indexOf(item) === index; // 因为indexOf 只能查找到第一个
      });

      console.log(newArr);
      const resultArray1 = data.reduce((acc1, curr) => {
        const found = acc1.find((item) => item.name === curr.reason);
        if (found) {
          found.value++;
        } else {
          acc1.push({ name: curr.reason, value: 1 });
        }
        return acc1;
      }, []);
      console.log(resultArray1);
      let yData = [];
      for (let i = 0; i < resultArray1.length; i++) {
        let data = resultArray1[i].value;
        yData.push(data);
      }
      var echarts2 = echarts.init(this.$refs.echarts2);
      var option = {
        title: {
          text: "图书馆预约取消",
          subtext: "数据统计",
          left: "center",
        },
        xAxis: {
          type: "category",
          data: newArr,
        },
        yAxis: {
          type: "value",
        },
        series: [
          {
            data: yData,
            type: "line",
          },
          {
            data: yData,
            type: "bar",
          },
        ],
      };
      echarts2.setOption(option);
    });
  },
};
</script>

<style lang="less">
.user {
  display: flex;
  align-items: center;
  padding-bottom: 20px;
  margin-bottom: 20px;
  border-bottom: 1px solid #ccc;
  img {
    margin-right: 40px;
    width: 150px;
    height: 150px;
    border-radius: 50%;
  }
  .userinfo {
    p {
      font-size: 32px;
    }
  }
}
.user-login {
  p {
    line-height: 28px;
    font-size: 14px;
    color: #999;
    span {
      color: #666;
      margin-left: 60px;
    }
  }
}
.graph {
  display: flex;
  justify-content: space-between;
  margin-top: 10px;
  .el-card {
    width: 48%;
  }
}
</style>

<!--pages/index/index.wxml-->
<view class="banner">
  <swiper class="swip_main" indicator-dots="true" autoplay='true' interval="3000" circular='true'>
    <block wx:for="{{mglist}}">
      <swiper-item>
        <image style="width: 100%;height: 100%;" mode="aspectFill" src="{{item.imgUrl}}"></image>                           
      </swiper-item>
    </block>
  </swiper>
</view>
<view class="body_yy">
  <view class="body_yy_zz">自助约定</view>
  <view class="body_yy_ms">安心学习,给你一个舒服的学习环境</view>
  <button class="body_yy_bt" bindtap="my_yy">预定</button>
</view>
<view class="news-bar">
  <view class="newa-bar-title">
    图书馆公约
  </view>
  <view class="news-bar-box" wx:for="{{msgList}}" wx:for-item="item" wx:key="_id" bindtap="sjowbs" id="{{item.id}}" wx:if="{{index<10}}">
    <view class="news-box-img">
      <image src="{{item.imgUrl}}"></image>
    </view>
    <view class="news-box-text">
      <view class="news-box-text-title">
      {{item.title}}
      </view>
      <rich-text class="concent" nodes="{{item.concent}}"></rich-text>
      <view class="news-bar-box-time">
      {{item.uploadTime}}
      </view>
    </view>
  </view>
</view>
8、源码获取

大家点赞、收藏、关注、评论啦 、查看👇🏻获取联系方式👇🏻

🎉写在最后

🍻伙伴们,如果你已经看到了这里,觉得这篇文章有帮助到你的话不妨点赞👍或 Star ✨支持一下哦!手动码字,如有错误,欢迎在评论区指正💬~

你的支持就是我更新的最大动力💪~
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【一起深度学习吧!!!!!】24/05/03

卷积层里的多输入输出通道 1、 多输入通道&#xff1a;代码演示&#xff1a; 多输出通道&#xff1a;代码实现&#xff1a; 1、 多输入通道&#xff1a; 当输入包含多个通道时&#xff0c;需要构造一个输入通道与之相等的卷积核&#xff0c;以便进行数据互相关计算。 例如李沐…

责任链模式和观察者模式

1、责任链模式 1.1 概述 在现实生活中&#xff0c;常常会出现这样的事例&#xff1a;一个请求有多个对象可以处理&#xff0c;但每个对象的处理条件或权限不同。例如&#xff0c;公司员工请假&#xff0c;可批假的领导有部门负责人、副总经理、总经理等&#xff0c;但每个领导…

XMall-Front:基于Vue.js的XMall商城前台页面的开发实践

XMall-Front&#xff1a;基于Vue.js的XMall商城前台页面的开发实践 摘要 随着电子商务的蓬勃发展&#xff0c;用户体验逐渐成为决定电商平台成功与否的关键因素。作为XMall商城项目的一部分&#xff0c;XMall-Front是基于Vue.js的前端页面开发&#xff0c;其目标是为用户提供…

《深入解析WIndows操作系统》第10章读书笔记

1、大页面和小页面&#xff1a;虚拟地址空间被划分成以页面为单位&#xff0c;这是因为硬件内存管理单元在页面的粒度上&#xff0c;将虚拟地址转译为物理地址。Windows支持两种页面尺寸&#xff1a;大页面和小页面&#xff0c;根据处理器体系结构不同&#xff0c;实际尺寸值有…

HAL PWM 配置 占空比 频率 stm32 学习笔记

title: HALPWM配置占空比频率 tags: STM32ClionHal 1.STM32CubeMX学习笔记&#xff08;13&#xff09;——PWM输出(呼吸灯)使用 2.STM32标准库HAL库 | 高精度动态调节PWM输出频率占空比 看你cubemx 里面的配置时钟频率是多少 参照第二篇文章描述修改 下面俩个参数就行 uin…

SAP生产订单常用状态以及

常用系统状态&#xff1a; 状态 状态 CRTD 已建立 REL 已核发 CNF 已确认 PCNF 已部份确认 DLV 已交货 DLT 删除指示码 LKD 已锁住 TECO 技术完成 GMPS 已发料 关闭 关闭 工单结案前的生产报表分析 路径:后勤系统- 生产- 现场控制- 信息系统-订单信息系…

NFS共享存储服务配置实践

一、NFS 1.NFS定义 NFS&#xff08;Network File System&#xff09;网络文件服务&#xff1a;基于TCP/IP传输的网络文件系统协议&#xff0c;NFS服务的实现依赖于RPC&#xff08;Remote Process Call&#xff09;远端过程调用&#xff1a;通过使用NFS协议&#xff0c;客户机…

02、Kafaka 简介

02、Kafka 简介 1、 Kafka 简介 Apache Kafka 是一个分布式的发布-订阅消息系统&#xff0c;最初由 LinkedIn 公司开发&#xff0c;并在 2010 年贡献给了 Apache 软件基金会&#xff0c;成为一个顶级开源项目。Kafka 设计之初是为了满足高吞吐量、可扩展性、持久性、容错性以…

VALSE 2024特邀报告内容解析|多模态视觉融合方法:是否存在性能极限?

2024年视觉与学习青年学者研讨会&#xff08;VALSE 2024&#xff09;于5月5日到7日在重庆悦来国际会议中心举行。本公众号将全方位地对会议的热点进行报道&#xff0c;方便广大读者跟踪和了解人工智能的前沿理论和技术。欢迎广大读者对文章进行关注、阅读和转发。文章是对报告人…

高频次的低价监测如何实现

品牌在做控价的过程中&#xff0c;需要对渠道中的低价数据进行监测&#xff0c;但价格数据变化快&#xff0c;涉及的促销信息也很多&#xff0c;如何将这些变化的数据监测到位&#xff0c;同时对于低价的凭证还要截图留证&#xff0c;以便有效的进行渠道治理&#xff0c;这就需…

python菜鸟级安装手册

python安装教程 电脑-右键-属性&#xff0c;确认系统类型和版本号&#xff0c;比如本案例系统是64位 win10 点击python官网&#xff0c;进行下载 适用于 Windows 的 Python 版本 |Python.org 选择第一个安装程序64位即可满足需要&#xff0c; 嵌入式程序包是压缩包版本&…

美国站群服务器的CN2线路在国际互联网通信中的优势?

美国站群服务器的CN2线路在国际互联网通信中的优势? CN2线路&#xff0c;或称中国电信国际二类线路&#xff0c;是中国电信在全球范围内建设的高速骨干网络。这条线路通过海底光缆系统将中国与全球连接起来&#xff0c;为用户提供高速、低延迟的网络服务。CN2线路在国际互联网…

检测服务器环境,实现快速部署。适用于CRMEB_PRO/多店

运行效果如图&#xff1a; 最近被好多人问&#xff0c;本来运行的好好的&#xff0c;突然swoole就启动不了了。 本工具为爱发电&#xff0c;如果工具正好解决了您的需求。我会很开心 代码如下&#xff1a; """本脚本为爱发电by:网前雨刮器 """…

websevere服务器从零搭建到上线(一)|阻塞、非阻塞、同步、异步

文章目录 数据准备(阻塞和非阻塞)、数据读写(同步和异步)小总结&#xff08;陈硕老师的总结&#xff09; 知识拓展同步执行实例异步编程实例 八股 数据准备(阻塞和非阻塞)、数据读写(同步和异步) 无论是什么样的IO都包含两个阶段&#xff1a;数据准备和数据读写。 我们的网络IO…

Navicat for MySQL Mac:数据库管理与开发的理想工具

Navicat for MySQL Mac是一款功能强大的数据库管理与开发工具&#xff0c;专为Mac用户设计&#xff0c;旨在提供高效、便捷的数据库操作体验。 它支持创建、管理和维护MySQL和MariaDB数据库&#xff0c;通过直观的图形界面&#xff0c;用户可以轻松进行数据库连接、查询、编辑和…

第一批用AI绘画做设计的人,已经碾压同事了!

“上辈子作孽&#xff0c;这辈子作图。” 设计师的心累只有自己知道。熬夜肝图一个月&#xff0c;好不容易准时下班&#xff0c;饭刚送到嘴边&#xff0c;工作群消息开始疯狂轰炸&#xff0c;领导夺命连环催进度… 2年工作时间&#xff0c;等于别人工作了6年&#xff0c;疯狂加…

HTTP 多个版本

了解一下各个版本的HTTP。 上个世纪90年代初期&#xff0c;蒂姆伯纳斯-李&#xff08;Tim Berners-Lee&#xff09;及其 CERN的团队共同努力&#xff0c;制定了互联网的基础&#xff0c;定义了互联网的四个构建模块&#xff1a; 超文本文档格式&#xff08;HTML&#xff09; …

深度学习之基于Resnet50卷积神经网络脊柱骨折CT影像图片诊断系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 脊柱骨折是骨科中一种常见的损伤类型&#xff0c;准确的诊断对于患者的治疗和康复至关重要。传统的脊…

信创 | 2023年中国信创产业深度研究报告(完整版)

信创产业研究报告 免责声明&#xff1a;本文资料来源于“第一新声”&#xff0c;版权归原作者所有。如涉及作品版权问题&#xff0c;请与我们联系&#xff0c;我们将在第一时间协商版权问题或删除内容&#xff01; 获取文中相关的PPT资料&#xff0c;请关注文末公众号“程序员…

【Java EE】多线程(三)线程状态

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…
最新文章