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

news2025/1/11 19:43:27
个人介绍

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.coloradmin.cn/o/1651047.html

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

相关文章

200554-19-4,AF350琥珀酰亚胺酯具有较高的荧光量子产率

产品概述 AF350 NHS Ester&#xff0c;即AF350琥珀酰亚胺酯&#xff0c;是一种重要的荧光标记染料&#xff0c;具有广泛的应用领域和显著的性能特点。 中文名称&#xff1a;AF350琥珀酰亚胺酯 英文名称&#xff1a;AF350 NHS Ester&#xff0c;AlexaFluor350 SE CAS号&…

可视化数据报道:Kompas.ai如何用图表和动态效果讲述故事

在数字化时代&#xff0c;数据无处不在&#xff0c;而如何将这些数据转化为易于理解且吸引人的故事&#xff0c;成为信息传递的关键。数据可视化作为一种强有力的工具&#xff0c;能够帮助观众快速把握复杂信息的要点&#xff0c;增强记忆&#xff0c;并激发情感共鸣。本文将深…

Dask简介

目录 一、概述 二、编程模型 2.1 High-Level Collection 2.2 Low level Interface 三、调度框架 3.1 任务图 3.2 调度 3.3 优化 3.4 动态任务图 一、概述 Dask是一个灵活的Python并行计算库。 Dask由两部分组成&#xff1a; 为计算优化的动态任务调度&#xff1a;和A…

所向披靡のmakefile

在VS里敲代码&#xff0c;只需要FnF5就可以直接运行勒&#xff0c;在Linux下敲代码却要即敲命令还要用编辑器还要用编译器&#xff0c;那在Linux下有没有能帮我们进行自动化组建的工具呢&#xff1f; 当然有&#xff0c;超级巨星&#xff1a;makefile&#xff01;&#xff01;…

obs64无法定位程序输入点IsWow64Process2

obs安装后&#xff0c;打开提示&#xff1a;obs64无法定位程序输入点IsWow64Process2。 解决办法&#xff0c;找到obs.dll文件&#xff0c;并找软件打开。 &#xff08;我用的是 notepad打开的&#xff09; 用CTRLF 搜索 “IsWow64Process2” 对应的"32"改为"…

【容器】Pod 生命周期

概述 Pod的生命周期包含从Pod创建事件的触发到Pod被停止的整个流程。了解Pod的生命周期方便日常排障&#xff0c;并能帮助较深入了解K8s。 在Pod生命周期中有两个重要的标识&#xff1a;Pod Condition 和 Pod Phase。Pod Phase提供了一个Pod当前状况的概览&#xff0c;可以帮…

APP 在华为应用市场上架 保姆级别详细流程

1、作为一名干开发的程序员&#xff0c;第一次能把自己的APP 上架&#xff0c;对自己来说是多么有意义的一项成就 2、创建一个 华为的开发者账号 根据提示填写完注册的信息https://developer.huawei.com/consumer/cn/product/华为开发者产品 | 开发者平台 | 流量变现 | 华为开…

Three.js的几何形状

在创建物体的时候&#xff0c;需要传入两个参数&#xff0c;一个是几何形状【Geometry】&#xff0c;一个是材质【Material】 几何形状主要是存储一个物体的顶点信息&#xff0c;在Three中可以通过指定一些特征来创建几何形状&#xff0c;比如使用半径来创建一个球体。 立方体…

Android Studio查看xml文件的修改时间和记录

Android Studio查看xml文件的修改时间和记录 Android Studio里面如果是Java/Kotlin编写界面&#xff0c;可以点击函数开头上面的提交在直接&#xff0c;然后在编辑界面的左侧查看历史时间上的修改记录&#xff0c;但是xml文件里面没有直观的这样操作方式。 但xml里面可以通过快…

FileLink跨网文件交换,推动企业高效协作|半导体行业解决方案

随着信息技术的迅猛发展&#xff0c;全球信息产业已经迎来了前所未有的繁荣与变革。在这场科技革命中&#xff0c;半导体作为信息产业的基础与核心&#xff0c;其重要性日益凸显&#xff0c;半导体的应用场景和市场需求将进一步扩大。 然而&#xff0c;在这一繁荣的背后&#x…

微信公众号营销攻略,2024年微信引流商业最佳实践

确实&#xff0c;微信是中国市场上不可或缺的营销工具。下面是一些关于如何在微信上进行有效营销的最佳实践&#xff0c;以及如何通过微信公众号进行广告宣传&#xff0c;以提升品牌知名度并推动业务增长。 拥有一个微信公众号是进行微信营销的关键第一步。 通过公众号&#x…

UE5自动生成地形一:地形制作

UE5自动生成地形一&#xff1a;地形制作 常规地形制作地形编辑器地形管理添加植被手动修改部分地形的植被 置换贴图全局一致纹理制作地貌裸露岩石地形实例 常规地形制作 地形制作入门 地形导入部分 选择模式&#xff1a;地形模式。选择地形子菜单&#xff1a;管理->导入 …

吴恩达深度学习笔记:深度学习的 实践层面 (Practical aspects of Deep Learning)1.13-1.14

目录 第二门课: 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第一周&#xff1a;深度学习的 实践层面 (Practical aspects of Deep Learning)1.13 梯度检验&#…

蓝桥杯单片机之模块代码《AT24C02》

过往历程 历程1&#xff1a;秒表 历程2&#xff1a;按键显示时钟 历程3&#xff1a;列矩阵按键显示时钟 历程4&#xff1a;行矩阵按键显示时钟 历程5&#xff1a;新DS1302 历程6&#xff1a;小数点精确后两位ds18b20 历程7&#xff1a;35定时器测量频率 文章目录 过往历…

微信小程序(Taro)获取经纬度并转化为具体城市

1、获取经纬度 申请权限&#xff0c;想要使用微信小程序获取经纬度的方法是要申请该方面的权限。 获取经纬度的方法有很多选择其中一个使用就好。 我使用的是Taro.getFuzzyLocation(&#xff09; 在app.config.js中需要添加设置 requiredPrivateInfos: ["getFuzzyLocat…

安装numpy遇到的问题

安装numpy的时候提示无法安装如下&#xff1a; (venv) E:\works\AI\venv\Scripts>pip install numpy pandas matplotlib jupyter -i https://pypi.douban.com/simple Looking in indexes: https://pypi.douban.com/simple WARNING: Retrying (Retry(total4, connectNone, r…

怎么把图片尺寸在线修改?5种方法调整方式介绍

在日常生活和工作中&#xff0c;我们经常遇到需要调整图片尺寸的情况&#xff0c;无论是为了适应自媒体文章内容中的图片、还是上传社交媒体平台要求&#xff0c;调整图片尺寸是一项非常有用的技能。在本教程中&#xff0c;我们将介绍几个方便快捷的图片处理工具&#xff0c;帮…

c++编程(10)——string

欢迎来到博主的专栏——c编程 博主ID&#xff1a;代码小豪 文章目录 <string>string类的接口构造、析构、与赋值重载构造函数赋值重载运算符 元素访问operator[] 容量修改器对string对象的操作迭代器 std::string是定义在c标准的一个类&#xff0c;定义在标准库<strin…

【JavaEE初阶系列】——Servlet运行原理以及Servlet API详解

目录 &#x1f6a9;Servlet运行原理 &#x1f6a9;Servlet API 详解 &#x1f393;HttpServlet核心方法 &#x1f393;HttpServletRequest核心方法 &#x1f388;核心方法的使用 &#x1f534;获取请求中的参数 &#x1f4bb;query string &#x1f4bb;直接通过form表…

如何更好地使用Kafka? - 事先预防篇

要确保Kafka在使用过程中的稳定性&#xff0c;需要从kafka在业务中的使用周期进行依次保障。主要可以分为&#xff1a;事先预防&#xff08;通过规范的使用、开发&#xff0c;预防问题产生&#xff09;、运行时监控&#xff08;保障集群稳定&#xff0c;出问题能及时发现&#…