基于微信小程序的自习室预约系统的设计与实现

基于微信小程序的自习室预约系统的设计与实现

文章目录

    • 基于微信小程序的自习室预约系统的设计与实现
        • 1、前言介绍
        • 2、功能设计
        • 3、功能实现
        • 4、开发技术简介
        • 5、系统物理架构
        • 6、系统流程图
        • 7、库表设计
        • 8、关键代码
        • 9、源码获取
        • 10、 🎉写在最后

1、前言介绍

伴随着信息技术与互联网技术的不断发展,校园也进到了一个新的信息化时代,传统管理技术性没法高效率、容易地管理自习室预约信息内容。为了实现时代的发展必须,提升自习室预约高效率,各种各样自习室预约体系应时而生,自习室预约管理系统的实现是信息内容时代浪潮时代的产物之一。一切系统都要遵循系统设计的基本流程。它还需要通过市场调查、需求分析报告、汇总设计、详尽设计以及测试,根据node语言表达设计,完成实验室预约管理系统。该系统根据B/S,即所谓的电脑浏览器/网络服务器方式,运用Java技术,前端采用微信小程序等技术实现,选用MySQL作为后台系统。

2、功能设计

自习室预约管理平台选用B/S架构模式,即网页页面和网站架构设计的开发方式。这类系统构造可以理解为对 C/S 系统构造的改变与推广能够进行信息分布式处理,减少资源成本,提升订制系统的性能。在这种设计下,极少有事务处理在前进行,绝大多数重要事务管理的思路需要在服务端完成。

在这里插入图片描述

3、功能实现

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

在这里插入图片描述
目管理页面提供的功能操作有:查看自习室,删除自习室操作,新增自习室操作,修改自习室操作。下图就是实验室管理页面
在这里插入图片描述
公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。下图就是公告信息管理页面。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、开发技术简介

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

5、系统物理架构

自习室系统的物理架构主要有:管理端和用户端,其中管理端主要是基于Vue和Element UI,用户端主要基于安卓、微信小程序和H5自习室系统的物理建构图

在这里插入图片描述

6、系统流程图

用户发起预约时首先会检测用户是否登录,若登录则进入到相应的预约界面,此时用户可以选择需要预约的时间段以及场地。当用户预约成功时用户会在我的预约中找到这次预约。当用户去场馆时可以通过预约生成的二维码来验证身份。若用户的预约时间失效也会有响应的提示

在这里插入图片描述

7、库表设计

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

8、关键代码
// pages/xgxx/xgxx.js
const db=wx.cloud.database()
const {updateUser} =require('../../api/login')
Page({

  /**
   * 页面的初始数据
   */
  data: {
    openid:'',
    userInfo:'',
    xy_index:0,
    nj_index:0,
    imgUrl:''
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    var userinfo =wx.getStorageSync('userInfo')
    this.setData({
      userInfo:userinfo
    })
  },
  bindchangenj:function(e){
    console.log(e.detail.value)
    this.setData({
      nj_index:e.detail.value
    })
  },
  bindchangexy:function(e){
    console.log(e.detail.value)
    this.setData({
      xy_index:e.detail.value
    })
  },
  changImg(res){
    let that=this
    wx.chooseImage({
      count: 1,
      sizeType: ['original', 'compressed'],
      sourceType: ['album', 'camera'],
      success (res) {
        var imgsFile = res.tempFilePaths[0];
        wx.uploadFile({
          filePath: imgsFile,
          name: 'file',
          url: 'http://localhost:3000/upload/upload',
          success: res => {
           that.data.imgUrl=JSON.parse(res.data).url
           console.log(JSON.parse(res.data).url)
          }
        })
        console.log(that.data.imgUrl)
      }
      
    })
  },
  //提交修改
  formSubmit(e){
    var userinfo =wx.getStorageSync('userInfo')
     //判断
     let img=""
     if(this.data.imgUrl!=''){
          img=this.data.imgUrl
     }else{
          img=userinfo.imgUrl
     }
      let userInfo={
          id:userinfo.id,
          username:e.detail.value.name,
          phone:e.detail.value.phone,
          imgUrl:img,
          address:e.detail.value.address,
          password:e.detail.value.password
      }
      console.log("1",userInfo)
      updateUser(userInfo).then(res=>{
        wx.showToast({
            icon:'none',
            title: '修改成功',
          })
         wx.setStorageSync('userInfo', userInfo )
      })
  },
  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  }
})
var express = require('express');
var router = express.Router();
var connection=require('../db/sql.js')

router.post('/addReservation',(req,res)=>{
    console.log(req.body)
   let username=req.body.username
   let phone=req.body.phone
   let placeName=req.body.placeName
   let address=req.body.address
   let endtime=req.body.endtime
   let price=req.body.price
   let isReservation=req.body.isReservation
   let isCancle=req.body.isCancle
   let id=req.body.status
   let starttime=req.body.starttime
   let placeNumber=req.body.placeNumber
   let reservationId=req.body.reservationId
   let status=1
   let steatId=id
   let data=req.body.data
   let sql='insert into  reservation value(null,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)'
   connection.query(sql,[username,phone,placeName,address,endtime,price,isReservation,isCancle,starttime,placeNumber,reservationId,'0','0',null,null,steatId,data],(error,result)=>{
    if(error) return console.log(error.message)
    if(result.affectedRows===1){
        let sql1='update steat set status=? where id=?'
        connection.query(sql1,[status,id],(error,result)=>{
            if(error) return console.log(error.message)
            res.send({
                code:200,
                msg:"预约成功"
            })
        })
    }else{
        res.send({
            code:200
        })
    }
   })
})
//查询预约表
router.post('/getReservation',(req,res)=>{
    let phone=req.body.phone
    let sql='select * from reservation where phone=?'
    connection.query(sql,[phone],(error,result)=>{
        if(error) return console.log(error.message)
        res.send({
            code:200,
            data:{
                data:result
            }
        })
    })
})
//取消预约
router.post('/deteleReservation',(req,res)=>{
    let id=req.body.id
    let username=req.body.username
    let phone=req.body.phone
    let reason=req.body.reason
    let placeName=req.body.placeName
    let cancelTime=req.body.cancelTime
    let isCancle=1
    let isReservation=0
    let steatId=req.body.steatId
    let status=0
    console.log(steatId)
    let sql='update reservation set isCancle=?,isReservation=? where id=?'
    connection.query(sql,[isCancle,isReservation,id],(error,result)=>{
        if(error) return console.log(error.message)
        if(result.affectedRows===1){
         let sql='insert into cancel value(null,?,?,?,?,?)'
         connection.query(sql,[reason,phone,username,placeName,cancelTime],(error,result)=>{
            if(error) return console.log(error.message)
            if(result.affectedRows==1){
                let sql='update steat set status=? where id=?'
                connection.query(sql,[status,steatId],(error,result)=>{
                    res.send({
                        code:200,
                        msg:"取消成功"
                    })
                })
            }
         })
        }else{
            res.send({
                code:403,
                msg:"取消失败"
            })
        }
    })
})

//查询取消表单个人
router.post('/getCancel',(req,res)=>{
    let phone=req.body.phone
    let sql='select * from cancel where phone=?'
    connection.query(sql,[phone],(error,result)=>{
        if(error) return console.log(error.message)
        res.send({
            code:200,
            data:{
                data:result
            }
        })
    })
})
//查询取消
router.get('/getCancel',(req,res)=>{
    let sql='select * from cancel '
    connection.query(sql,(error,result)=>{
        if(error) return console.log(error.message)
        res.send({
            code:200,
            data:{
                data:result
            }
        })
    })
})
//删除取消
router.post('/deletecancel', function(req, res, next) {
    //查询数据
    const id=req.query.id
    console.log(id)
  let sql = "delete from cancel where id = ?";
  connection.query(sql,[id],function(err,result,fields){
   if(err) return console.log(err.message)
   res.send({
    code:200,
    data:{
      msg:"删除成功"
    }
    })  
    })
});

//查询预约表
router.get('/getAllReservation',(req,res)=>{
    let sql='select * from reservation'
    connection.query(sql,(error,result)=>{
        if(error) return console.log(error.message)
        res.send({
            code:200,
            data:{
                data:result
            }
        })
    })
})

//通过姓名查询预约
router.post('/searchAllReservation',(req,res)=>{
    let username=req.query.username
    let sql='select * from reservation where username=?'
    connection.query(sql,[username],(error,result)=>{
        if(error) return console.log(error.message)
        res.send({
            code:200,
            data:{
                data:result
            }
        })
    })
})
//删除预约表信息
router.post('/deleteAllReservation', function(req, res, next) {
    //查询数据
    const id=req.query.id
    console.log(id)
  let sql = "delete from reservation where id = ?";
  connection.query(sql,[id],function(err,result,fields){
   if(err) return console.log(err.message)
   res.send({
    code:200,
    data:{
      msg:"删除成功"
    }
    })  
    })
});
//修改预约表
router.post('/updateAllReservation',function(req,res,next){
    let id=req.query.id
   let sql='update reservation set ? where id=?'
   connection.query(sql,[req.query,id],function(error,results){
     if(error) return console.log(error.message)
     res.send({
       code:200,
       data:{
         msg:'修改成功'
       }
     })
   })
  })
module.exports=router
9、源码获取

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

10、 🎉写在最后

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

你的支持就是我更新的最大动力💪~

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

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

相关文章

ESP8266 WiFi物联网智能插座—上位机软件实现

1、软件架构 上位机主要作为下位机数据上传服务端以及节点调试的控制端,可以等效认为是专属版本调试工具。针对智能插座协议,对于下位机进行可视化监测和管理。 软件技术架构如下,主要为针对 Windows 的PC 端应用程序,采用WPF以及…

pyqt 创建右键菜单栏

class MainModule(QMainWindow, Ui_MainWindow):def __init__(self):super().__init__(parentNone)self.setupUi(self)# 允许出现菜单栏self.tableWidget.setContextMenuPolicy(Qt.CustomContextMenu)# 对空间添加右键菜单栏处理 self.tableWidget.customContextMenuRequested.…

C练习题(1)

变种水仙花(来自牛课网) 题目 变种水仙花数 - Lily Number:把任意的数字,从中间拆分成两个数字,比如1461 可以拆分成(1和461),(14和61),(146和1),如果所有拆…

【Web】NSSCTF Round#20 Basic 两道0解题的赛后谈

目录 前言 baby-Codeigniter 组合拳! 前言 本想着说看看go的gin框架就睡了的,r3师傅提醒说赛题环境已经上了,那不赶紧研究下😀 主要来谈谈做题的心路历程 baby-Codeigniter 拿到题目的第一反应应该是:“什么是C…

[ESP32]:基于esp-modbus实现serial主机

[ESP32]:基于esp-modbus实现serial主机 开发环境 esp idf 5.1esp-modbus 1.0.13 使用如下指令添加组件,或者访问esp-modbus idf.py add-dependency "espressif/esp-modbus^1.0.13"Device parameters 对于master而言,需要理解的…

五、Yocto集成QT5(基于Raspberrypi 4B)

Yocto集成QT5 本篇文章为基于raspberrypi 4B单板的yocto实战系列的第五篇文章: 一、yocto 编译raspberrypi 4B并启动 二、yocto 集成ros2(基于raspberrypi 4B) 三、Yocto创建自定义的layer和image 四、Yocto创建静态IP和VLAN 本章节实操代码请查看github仓库&…

CVAE——生成0-9数字图像(Pytorch+mnist)

1、简介 CVAE(Conditional Variational Autoencoder,条件变分自编码器)是一种变分自编码器(VAE)的变体,用于生成有条件的数据。在传统的变分自编码器中,生成的数据是完全由潜在变量决定的&…

GridLayoutManager 中的一些坑

前言 如果GridLayoutManager使用item的布局都是wrap_cotent 那么会在布局更改时会出现一些出人意料的情况。&#xff08;本文完全不具备可读性和说教性&#xff0c;仅为博主方便查找问题&#xff09; 布局item: <!--layout_item.xml--> <?xml version"1.0&qu…

论文阅读: Visual Attention Network

Motivation 自注意力机制在2D自然图像领域面临3个挑战&#xff1a; 视二维图像为一维序列。对于高分辨率图像&#xff0c;二次复杂度消耗太大。只捕捉空间适应性&#xff0c;忽略通道适应性。 Contribution 设计了 Large Kernel attention(LKA)&#xff0c;包含卷积和自注意…

SpringBoot整合knife4J 3.0.3

Knife4j的前身是swagger-bootstrap-ui,前身swagger-bootstrap-ui是一个纯swagger-ui的ui皮肤项目。项目正式更名为knife4j,取名knife4j是希望她能像一把匕首一样小巧,轻量,并且功能强悍,更名也是希望把她做成一个为Swagger接口文档服务的通用性解决方案,不仅仅只是专注于前端Ui…

受益于边缘计算的三个关键应用

边缘计算和 5G 网络正在改变物联网&#xff0c;增强跨多个领域的广泛应用的功能&#xff0c;并催生大量新兴应用。我们通过研究三个突出的用例来说明边缘计算的强大功能。 工业4.0智能工厂 工业 4.0 为制造商提供了基于灵活的工业环境提高生产力和盈利能力的愿景&#xff0c;…

5.vector容器的使用

文章目录 vector容器1.构造函数代码工程运行结果 2.赋值代码工程运行结果 3.容量和大小代码工程运行结果 4.插入和删除代码工程运行结果 5.数据存取工程代码运行结果 6.互换容器代码工程运行结果 7.预留空间代码工程运行结果 vector容器 1.构造函数 /*1.默认构造-无参构造*/ …

STM32 can通信部分函数注释

相关截图: CAN模式初始化函数:u8 CAN1_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode) //CAN初始化 //tsjw:重新同步跳跃时间单元.范围:CAN_SJW_1tq~ CAN_SJW_4tq //tbs2:时间段2的时间单元. 范围:CAN_BS2_1tq~CAN_BS2_8tq; //tbs1:时间段1的时间单元. 范围:CAN_BS…

IO流c++

IO流类库 输入输出流 #include <iostream> using namespace std;class InCount { public:InCount(int a 0, int b 0){c1 a;c2 b;}void show(void){cout << "c1" << c1 << "\t" << "c2" << c2 << …

PHP三种方式读取RSA密钥加解密、签名验签完整教程

目录 第一步、生成公私钥 第二步、三种方式读取RSA密钥 第1种&#xff1a;公私钥弄成一行&#xff0c;必须一行没有空格和换行 第2种&#xff1a;直接复制生成公私钥 第3种;复制密钥存储为.pem文件后缀 第三步、RSA加解密 第四步、RSA签名以及验证签名 第五步、封装完整…

Linux的开发工具(二):编译器gcc/g++与Linux项目自动化构建工具-Makefile

Linux的编译器-gcc/g 基本概念&#xff1a;gcc是专门用来编译c语言的&#xff0c;g可以编译c或c语言 问题一&#xff1a;gcc有时候为什么不能编译带有for循环的c语言源文件&#xff1f; 答&#xff1a;gcc版本过低会不支持for循环等c99标准下的内容 解决方式&#xff1a;gcc…

手搓 Docker Image Creator(DIC)工具(02):预备知识

此节主要简单介绍一下 Docker、Dockerfile 的基本概念&#xff0c;Dockerfile 对的基本语法&#xff0c;Windows 和 macOS 下 Docker 桌面的安装&#xff0c;Docker 镜像的创建和运行测试等。 1 关于 Docker Docker 是一个开源的应用容器引擎&#xff0c;它允许开发者打包应用…

Open3D(C++) 基于随机抽样与特征值法的点云平面稳健拟合方法

目录 一、算法原理1、论文概述2、参考文献二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的GPT爬虫。 一、算法原理 1、论文概述 针对点云数据含有异常值且传统拟合方法拟合结果不理想的情…

《自动机理论、语言和计算导论》阅读笔记:p115-p138

《自动机理论、语言和计算导论》学习第 6 天&#xff0c;p115-p138 总结&#xff0c;总计 24 页。 一、技术总结 1.associativity and comutativity (1)commutativity(交换性): Commutativity is the property of an operator that says we can switch the order of its ope…

Acwing-3418 杨辉三角形

关于杨辉三角形的一些规律&#xff08;更详细地去看参考&#xff09;&#xff1a; 下面这些图都来自其他人所做图片 因为杨辉三角形是对称的&#xff0c;并且与二项式有关&#xff1a; 将左半部分(左半部分的编号肯定比右半部分小&#xff0c;不考虑右半部分&#xff09;一个斜…