【免费开放源码】审批类小程序项目实战(预约审批端)

news2024/9/22 22:44:48

第一节:什么构成了微信小程序、创建一个自己的小程序

第二节:微信开发者工具使用教程

第三节:深入了解并掌握小程序核心组件

第四节:初始化云函数和数据库

第五节:云数据库的增删改查

第六节:项目大纲以及制作登录、注册页面

第七节:制作活动申请页面

第八节:活动申请页面的补充

第九节:我的页面制作

第十节:活动详情页面制作

第十一节:活动历史页面制作

第十二节:预约老师页面制作

第十三节:预约历史页面制作

第十四节:活动审批端制作

第十五节:预约审批端制作

目录

目录

前言

成品图

核心思想

实现步骤 

appointmentApproval.wxml

appointmentApproval.wxss

appointmentApproval.js

appointmentApproval3.wxml

appointmentApproval3.wxss

appointmentApproval3.js

getAll2.js

excel.js

getExcel.js

appointmentApproval2.wxml

appointmentApproval2.wxss

appointmentApproval2.js

appointmentDetail.wxml

appointmentDetail.wxss

appointmentDetail.js

题外话


前言

        上一节我们完成了活动审批端的搭建,这一节我们将要完成预约审批端的搭建,也就是本项目最后一个部分的搭建!我们先来看思维大纲~

        跟活动审批端同理,我们同样要在app.json文件中创建相关的页面。

        "pages/appointmentApproval/appointmentApproval",
        "pages/appointmentApproval2/appointmentApproval2",
        "pages/appointmentApproval3/appointmentApproval3",
        "pages/appointmentDetail/appointmentDetail"

         完成了上诉准备工作那么开始搭建吧~


成品图


核心思想

1.基本样式参照“我的”页面

2.导航栏参照活动审批端

3.需要老师版的预约详情页面

4.通过云开发来实现预约的审批(updata)

5.点击工具箱可实现一键导出预约信息的excel表格


实现步骤 

        该部分的难点在于如何一键导出预约信息的excel表格,其实node.js也支持这个功能,我们只需要稍加点改动就可以了。这里我直接将代码送上了~如果你对代码有疑问可以在底下留言。

        我们将按照思维大纲中 待审批——>已通过——>已驳回 的顺序来依次制作~


appointmentApproval.wxml

<view class="container">
       <view class="container_content">
              <view class="box">
                     <view class="mine_application">
                     <!-- 活动标题 -->
                            <view class="mine_application_title">
                            <view>待审批的预约</view><image src="../../icon/rank.png" style="width: 50px;height: 35px;position: absolute; right: 20px; top: 0px;" bindtap="up"></image>
                     </view>
                     <block wx:for="{{list}}"></block>
                     <!-- 活动内容 点击可跳转至详情页面 -->
                     <view class="mine_application_content" wx:for="{{list}}" >
                                   <view class="event" bindtap="goDetail" data-id="{{item._id}}">
                                          <view class="appointmentTime">{{item.appointment}}</view>
                                          <view class="appointmentInstitute">预约组织:{{item.g1_orderInstitute}}</view>
                                          <view class='appointmentTeacher'>预约老师:{{item.g1_orderTeacher}}</view>
                                          <view class="time">{{item.time}}</view>
                                          <view class="subscriber">申请人:{{item.subscriber}}</view>

                                   </view>
                                   <!-- 右上角的状态栏 -->
                                   <!-- 用条件渲染来展示多种样式的活动内容 -->
                                   <!-- 状态为3代表已结束,2为已驳回,1为已通过,0为审核中 -->
                                   <block wx:if="{{item.state==0}}">
                                   <!-- 审核中 -->
                                   <view class="state_0">
                                   <view class="state_content">审核中</view>
                                   </view>
                                   <!-- 活动下方的小点 -->
                                   <image src="../../icon/yellow.png" style="width: 11px;height: 11px;position: absolute;left: 15px;bottom: 15px;"></image>
                                   </block>





                                   <block wx:if="{{item.state==1}}">
                                   <!-- 已通过 -->
                                   <view class="state_1">
                                   <view class="state_content">已通过</view>
                                   </view>
                                   <!-- 活动下方的小点 -->
                                   <image src="../../icon/green.png" style="width: 11px;height: 11px;position: absolute;left: 15px;bottom: 15px;"></image>
                                   <view class="next_location" >
                                   <button class="button_detail" size="mini" bindtap="goNext" data-id="{{item._id}}">下一步 >
                                   </button>
                                   </view>
                                   </block>
                                   
                                   <block wx:if="{{item.state==2}}">
                                   <!-- 已驳回 -->
                                   <view class="state_2">
                                   <view class="state_content">已驳回</view>
                                   </view>
                                   <!-- 活动下方的小点 -->
                                   <image src="../../icon/red.png" style="width: 11px;height: 11px;position: absolute;left: 15px;bottom: 15px;"></image>
                                   <view class="reject_location">
                                   <button class="button_detail" size="mini">驳回详情 >
                                   </button>
                                   </view>
                                   </block>




                     </view>

                     </view>
              </view>
              <view class="tabar">
                     <view class='goApprovalButton' bindtap="goApprovalPage">
                            <image src="../../icon/approval.png" style="width: 40px; height: 40px; margin-top: 5px;"></image>
                            <view class="button_content">待审批</view>
                     </view>
                     <view class="goPassButton" bindtap="goPassPage">
                            <image src="../../icon/pass(1).png" style="width: 40px; height: 40px; margin-top: 5px;"></image>
                            <view class="button_content">已通过</view>
                     </view>
                     <view class="goRejectButton" bindtap="goRejectPage">
                            <image src="../../icon/reject(1).png" style="width: 40px; height: 40px; margin-top: 5px;"></image>
                            <view class="button_content">已驳回</view>
                     </view>
              </view>
       </view>
</view>

appointmentApproval.wxss

.mine_application{
       margin-left: 15px;
       margin-right: 15px;
     }
     .mine_application_title{
       border-bottom: 5rpx solid #A6A6A6;
       font-size: 28px;
       font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
     }
  
     .mine_application_content{
            height: 250px;
            width: 100%;
            display: flex;
            position: relative;
            box-shadow: 16rpx 8rpx 24rpx rgba(212,48,48, 0.1);
            margin-top: 15px;
            border-radius: 15px;
  
     }
     .event{
            font-size: 20px;
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            position: relative;
            margin:15px;
            width: 90%;
            flex: 1;
     }
     .appointmentTime{
            margin-top: 0px;
            font-size: 16px;
            color: black;
     }
     .state_0{
            float: right;
            width: 80px;
            height: 40px;
            background-color:#FFC300;
            border-radius: 0 15px 0 15px;
     }
     .state_content{
            position: relative;
            margin-top:10px ;
            margin-left: 15px;
            font-size: 12;
            color: white;
     }

    .appointmentInstitute{

         font-size: 20px;
         color:#FF5733;
         margin-top: 10px;
    }
    .appointmentTeacher{

       font-size: 20px;
       color:#611504;
       margin-top: 10px;
  }
  .time{
       margin-top: 10px;
       font-size: 18px;
       color: #A0A9BD;
  }
.goApprovalButton{
       position: absolute;
       bottom:0px ;
       left: 0%;
       color:#FFFFFF;
       background-color:#FFFFFF;
       border-top: 2px solid grey;
       width: 33.333%;
       height: 70px;
       text-align:center;
       margin-top: 10px;
}
.goPassButton{
       position: absolute;
       bottom:0px ;
       left: 33.333%;
       color:#FFFFFF;
       background-color:#FFFFFF;
       border-top: 2px solid grey;
       width: 33.333%;
       height: 70px;
       text-align:center;
       margin-top: 10px;
}

.goRejectButton{
       position: absolute;
       bottom:0px ;
       left: 66.666%;
       color:#FFFFFF;
       background-color:#FFFFFF;
       border-top: 2px solid grey;
       width: 33.333%;
       height: 70px;
       text-align:center;
       margin-top: 10px;
       
}
.button_content{
       font-size: 15px;
       color: black;
}
.box{
       margin-bottom: 50px;
}
.container{
       position: relative;
}

.container_content{
       position: relative;
       min-height: 100vh;
       box-sizing: border-box;
       padding-bottom: 60rpx;
       padding-top: 0rpx;
}
.subscriber{
       font-size: 20px;
       font-weight: 100;
       color: rgb(23, 6, 175);
}
.tabar{
       width: 100%;
         text-align: center;
         letter-spacing: 4rpx;
         position: absolute;
         bottom: 0;
}

appointmentApproval.js

const db = wx.cloud.database()
Page({
       data: {
              list:[]

       },
       onLoad(options) {
              console.log("列表携带的值",options)
              db.collection("appointment")
                            .where({
                                 state:0,
                            })
                            .get()
                            .then(res=>{
                                   console.log('查询数据库成功',res.data)
                                   //将返回的res.data里面的值赋值给list
                                   this.setData({
                                          list :res.data,
                                   })
                                   console.log("这是list",this.data.list)
                            })

       },
       up(){
              db.collection("appointment")
              .where({
                   state:0,
              })
              .orderBy('rank','asc')
              .get()
                .then(res=>{
                  console.log('升序成功',res.data)
                  this.setData({
                    list:res.data
                  })
                })
                .catch(err=>{
                  console.log('升序失败')
                })
       },
       onPullDownRefresh() {

       },
       onReachBottom() {

       },
       goDetail(e){
              console.log("点击了详情页面,将展示活动的id ",e)
              wx.navigateTo({
              // 跳转到活动详情页面并携带活动id
                url: '/pages/appointmentDetail/appointmentDetail?id=' +e.currentTarget.dataset.id 
              })
       },

       // 前往待审批页面
       goApprovalPage(){
              wx.showToast({
                     title: '您已经在当前页面',
                     icon:'none'
                     })       
       },
       
       // 前往已通过页面
       goPassPage(){
              wx.redirectTo({
                     url: '../appointmentApproval3/appointmentApproval3',
                     })
       },

       // 前往已驳回页面
       goRejectPage(){
              wx.redirectTo({
                     url: '../appointmentApproval2/appointmentApproval2',
                     })
       },
})

appointmentApproval3.wxml

<view class="container">
       <view class="container_content">
              <view class="box">
                     <view class="mine_application">
                     <!-- 活动标题 -->
                            <view class="mine_application_title">
                            <view>已通过的预约历史</view><image src="../../icon/work-box.png" style="width: 40px;height: 40px;position: absolute; right: 20px; top: 0px;" bindtap="download"></image>
                            <image src="../../icon/guide.png" style="width: 40px;height:40px;position: absolute; right: 70px; top:0px;"bindtap="lookAll"></image>
                            </view>
                     <block wx:for="{{list}}"></block>
                     <!-- 活动内容 点击可跳转至详情页面 -->
                     <view class="mine_application_content" wx:for="{{list}}" >
                                   <view class="event" bindtap="goDetail" data-id="{{item._id}}">
                                          <view class="appointmentTime">{{item.appointment}}</view>
                                          <view class="appointmentInstitute">预约组织:{{item.g1_orderInstitute}}</view>
                                          <view class='appointmentTeacher'>预约老师:{{item.g1_orderTeacher}}</view>
                                          <view class="time">{{item.time}}</view>

                                   </view>
                                   <!-- 右上角的状态栏 -->
                                   <!-- 用条件渲染来展示多种样式的活动内容 -->
                                   <!-- 状态为3代表已结束,2为已驳回,1为已通过,0为审核中 -->
                                   <block wx:if="{{item.state==1}}">
                                   <!-- 已通过 -->
                                   <view class="state_1">
                                   <view class="state_content">已通过</view>
                                   </view>
                                   <!-- 活动下方的小点 -->
                                   <image src="../../icon/green.png" style="width: 11px;height: 11px;position: absolute;left: 15px;bottom: 15px;"></image>
                                   </block>
                                   
                                   <block wx:if="{{item.state==2}}">
                                   <!-- 已驳回 -->
                                   <view class="state_2">
                                   <view class="state_content">已驳回</view>
                                   </view>
                                   <!-- 活动下方的小点 -->
                                   <image src="../../icon/red.png" style="width: 11px;height: 11px;position: absolute;left: 15px;bottom: 15px;"></image>
                                   </block>




                     </view>

                     </view>
              </view>
              <view class="tabar">
                     <view class='goApprovalButton' bindtap="goApprovalPage">
                            <image src="../../icon/approval(1).png" style="width: 40px; height: 40px; margin-top: 5px;"></image>
                            <view class="button_content">待审批</view>
                     </view>
                     <view class="goPassButton" bindtap="goPassPage">
                            <image src="../../icon/pass.png" style="width: 40px; height: 40px; margin-top: 5px;"></image>
                            <view class="button_content">已通过</view>
                     </view>
                     <view class="goRejectButton" bindtap="goRejectPage">
                            <image src="../../icon/reject(1).png" style="width: 40px; height: 40px; margin-top: 5px;"></image>
                            <view class="button_content">已驳回</view>
                     </view>
              </view>
       </view>
</view>

appointmentApproval3.wxss

.mine_application{
       margin-left: 15px;
       margin-right: 15px;
     }
     .mine_application_title{
       border-bottom: 5rpx solid #A6A6A6;
       font-size: 28px;
       font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
     }
  
     .mine_application_content{
            height: 250px;
            width: 100%;
            display: flex;
            position: relative;
            box-shadow: 16rpx 8rpx 24rpx rgba(212,48,48, 0.1);
            margin-top: 15px;
            border-radius: 15px;
  
     }
     .event{
            font-size: 20px;
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            position: relative;
            margin:15px;
            width: 90%;
            flex: 1;
     }
     .appointmentTime{
            margin-top: 0px;
            font-size: 16px;
            color: black;
     }
     .state_1{
       width: 80px;
       height: 40px;
       background-color:#43CF7C;
       border-radius: 0 15px 0 15px;
       z-index: 2;
       flex-direction: row;
       position: relative;
       margin-left: 20px;
 }
     .state_content{
            position: relative;
            margin-top:10px ;
            margin-left: 15px;
            font-size: 12;
            color: white;
     }
    .appointmentInstitute{

         font-size: 20px;
         color:#FF5733;
         margin-top: 10px;
    }
    .appointmentTeacher{

       font-size: 20px;
       color:#611504;
       margin-top: 10px;
  }
  .time{
       margin-top: 10px;
       font-size: 18px;
       color: #A0A9BD;
  }
.goApprovalButton{
       position: absolute;
       bottom:0px ;
       left: 0%;
       color:#FFFFFF;
       background-color:#FFFFFF;
       border-top: 2px solid grey;
       width: 33.333%;
       height: 70px;
       text-align:center;
       margin-top: 10px;
}
.goPassButton{
       position: absolute;
       bottom:0px ;
       left: 33.333%;
       color:#FFFFFF;
       background-color:#FFFFFF;
       border-top: 2px solid grey;
       width: 33.333%;
       height: 70px;
       text-align:center;
       margin-top: 10px;
}

.goRejectButton{
       position: absolute;
       bottom:0px ;
       left: 66.666%;
       color:#FFFFFF;
       background-color:#FFFFFF;
       border-top: 2px solid grey;
       width: 33.333%;
       height: 70px;
       text-align:center;
       margin-top: 10px;
       
}
.button_content{
       font-size: 15px;
       color: black;
}
.box{
       margin-bottom: 50px;
}
.container{
       position: relative;
}

.container_content{
       position: relative;
       min-height: 100vh;
       box-sizing: border-box;
       padding-bottom: 60rpx;
       padding-top: 0rpx;
}

/* 有无这个属性都行,之后可能会用到 */
.tabar{
       width: 100%;
         text-align: center;
         letter-spacing: 4rpx;
         position: absolute;
         bottom: 0;
}

appointmentApproval3.js

const db = wx.cloud.database()
const _ = db.command
const t = new Date().getTime().toString().slice(0, -3);
Page({
       data: {
              list:[],
              // fileUrl:'',

       },
       onLoad(options) {
             //调用云函数来突破返回数据库的条数只有20条的限制
             wx.cloud.callFunction({
              name:'getAll2'
       })
       .then(res=>{
              console.log('成功',res)
              this.setData({
               list :res.result.data,
              })
       })
       .catch(res=>{
              console.log("失败",res);
       })

       },
       onPullDownRefresh() {

       },
       onReachBottom() {

       },
       goDetail(e){
              console.log("点击了详情页面,将展示活动的id ",e)
              wx.navigateTo({
              // 跳转到活动详情页面并携带活动id
                url: '/pages/appointmentDetail/appointmentDetail?id=' +e.currentTarget.dataset.id 
              })
       },
       // 前往待审批页面
       goApprovalPage(){
              wx.redirectTo({
                     url: '../appointmentApproval/appointmentApproval',
                     })
       },
       // 前往已通过页面
       goPassPage(){
              wx.showToast({
                     title: '您已经在当前页面',
                     icon:'none'
                     })     
       },
       // 前往已驳回页面
       goRejectPage(){
              wx.redirectTo({
                     url: '../appointmentApproval2/appointmentApproval2',
                     })
       },
       //一键导出excel表格
       download(){
              let that = this
              wx.showModal({
                     title: '您是否需要导出已通过的预约',
                     content: '',
                     success (res) {
                            if (res.confirm){
                                   console.log('点击了一键导出excel')
                                    //引用了excel的云函数,调取了appointment里面的数据
                                   wx.cloud.callFunction({
                                   name:'excel',
                                   success(res) {
                                    console.log("读取成功", res.result.data)
                                    //将调取的数据存入函数里
                                          that.savaExcel(res.result.data)
                                   },
                                   })
                            }
                            else if (res.cancel) {
                            //取消绑定的操作
                            }
                     }
              })
                     
       },
       //把数据保存到excel里,并把excel保存到云存储
       savaExcel(userdata) {
       let that = this
       //调取getExcel云函数(核心)
       wx.cloud.callFunction({
         name: "getExcel",
         data: {
           userdata: userdata
         },
         success(res) {
           console.log("保存成功", res)
           //调取获取地址的函数
           that.getFileUrl(res.result.fileID)
         },
         fail(res) {
           console.log("保存失败", res)
         }
       })
     },
     //获取云存储文件下载地址,这个地址有效期一天
       getFileUrl(fileID) {
       
       let that = this;
       wx.cloud.getTempFileURL({
         fileList: [fileID],
         success: res => {
              // 这里的文件下载链接延迟很高,不能实时更新excel里面的数据,故采用文件下载链接拼接时间字符串的形式来达到可下载实时文件的目的
           console.log("文件下载链接", res.fileList[0].tempFileURL)
          // 这里就是拼接,方法来自  https://blog.csdn.net/sjn0503/article/details/74936613
           const finalUrl = `${res.fileList[0].tempFileURL}?${t}`
           console.log("实时文件下载链接",finalUrl)
           that.setData({
             fileUrl: finalUrl
           })
           //获取到文件下载链接后,使用showModal和setClipboardData来达到给用户复制地址的目的
           wx.showModal({
              title:'一键导出excel成功',
              content:finalUrl,
              showCancel:true,
              confirmText:'复制地址',
                     success(res){
                      if (res.confirm) {
                             wx.setClipboardData({
                               data: that.data.fileUrl,
                               success(res) {
                                 wx.getClipboardData({
                                   success(res) {
                                     console.log(res.data) // data
                                   }
                                 })
                               }
                             })
                           }
                     }
                   
              })
            
         },
       })
     },
})

其中在js中还用到了getAll2、excel、getExcel 三个云函数

getAll2.js

// 云函数入口文件
//获取所有已结束的活动
const cloud = require('wx-server-sdk')
let id=0;
// 云开发环境初始化
cloud.init({env: 'cloud1-0glmim4o153108f5'})
const db = cloud.database()
const _ = db.command
exports.main = async (event, context) => {
try{
       return await db.collection('appointment')
       .where(
              {
              state:1
              }
       )
       //给申请到的预约数据排序
       .orderBy('rank','asc')
       .get({
              success: function (res) {
              this.setData({
                     id:res._id
              })
              return res
              }
       })
}
catch(e){
       console.error(e)
}
}

excel.js

//这个函数是用来获取预约集合里面的数据的,并没有存储到excel里
// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init({
       env:'cloud1-0glmim4o153108f5'
})

// 云函数入口函数
exports.main = async (event, context) => {
       return await cloud.database().collection('appointment')
       .where({
              state:1,
         })
       .orderBy('rank','asc')
       .get()
}

getExcel.js

const cloud = require('wx-server-sdk')
cloud.init({
  env: "cloud1-0glmim4o153108f5"
})
//操作excel用的类库
const xlsx = require('node-xlsx');

// 云函数入口函数
exports.main = async(event, context) => {
  try {
    let {userdata} = event
    
    //1,定义excel表格名
    let dataCVS = '预约.xlsx'
    //2,定义存储数据的
    let alldata = [];
    let row = ['日期','时间段', '组织', '预约老师','预约事项','预约人','手机号']; //表属性
    alldata.push(row);

    for (let key in userdata) {
      let arr = [];
      arr.push(userdata[key].day);
      arr.push(userdata[key].hour);
      arr.push(userdata[key].g1_orderInstitute);
      arr.push(userdata[key].g1_orderTeacher);
      arr.push(userdata[key].content);
      arr.push(userdata[key].subscriber);
      arr.push(userdata[key].subscriberPhone);
      alldata.push(arr)
    }
    //3,把数据保存到excel里
    var buffer = await xlsx.build([{
      name: "mySheetName",
      data: alldata
    }]);
    //4,把excel文件保存到云存储里
    return await cloud.uploadFile({
      cloudPath: dataCVS,
      fileContent: buffer, //excel二进制文件
    })

  } catch (e) {
    console.error(e)
    return e
  }
}

appointmentApproval2.wxml

<view class="container">
       <view class="container_content">
              <view class="box">
                     <view class="mine_application">
                     <!-- 活动标题 -->
                            <view class="mine_application_title">
                            <view>已驳回的预约历史</view>
                     </view>
                     <block wx:for="{{list}}"></block>
                     <!-- 活动内容 点击可跳转至详情页面 -->
                     <view class="mine_application_content" wx:for="{{list}}" >
                                   <view class="event" bindtap="goDetail" data-id="{{item._id}}">
                                          <view class="appointmentTime">{{item.appointment}}</view>
                                          <view class="appointmentInstitute">预约组织:{{item.g1_orderInstitute}}</view>
                                          <view class='appointmentTeacher'>预约老师:{{item.g1_orderTeacher}}</view>
                                          <view class="time">{{item.time}}</view>
                                          <view class="subscriber">申请人:{{item.subscriber}}</view>

                                   </view>
                                   <!-- 右上角的状态栏 -->
                                   <!-- 用条件渲染来展示多种样式的活动内容 -->
                                   <!-- 状态为3代表已结束,2为已驳回,1为已通过,0为审核中 -->   
                                   <block wx:if="{{item.state==2}}">
                                   <!-- 已驳回 -->
                                   <view class="state_2">
                                   <view class="state_content">已驳回</view>
                                   </view>
                                   <!-- 活动下方的小点 -->
                                   <image src="../../icon/red.png" style="width: 11px;height: 11px;position: absolute;left: 15px;bottom: 15px;"></image>
                                   </block>




                     </view>

                     </view>
              </view>
              <view class="tabar">
                     <view class='goApprovalButton' bindtap="goApprovalPage">
                            <image src="../../icon/approval(1).png" style="width: 40px; height: 40px; margin-top: 5px;"></image>
                            <view class="button_content">待审批</view>
                     </view>
                     <view class="goPassButton" bindtap="goPassPage">
                            <image src="../../icon/pass(1).png" style="width: 40px; height: 40px; margin-top: 5px;"></image>
                            <view class="button_content">已通过</view>
                     </view>
                     <view class="goRejectButton" bindtap="goRejectPage">
                            <image src="../../icon/reject.png" style="width: 40px; height: 40px; margin-top: 5px;"></image>
                            <view class="button_content">已驳回</view>
                     </view>
              </view>
       </view>
</view>

appointmentApproval2.wxss

.mine_application{
       margin-left: 15px;
       margin-right: 15px;
     }
     .mine_application_title{
       border-bottom: 5rpx solid #A6A6A6;
       font-size: 28px;
       font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
     }
  
     .mine_application_content{
            height: 250px;
            width: 100%;
            display: flex;
            position: relative;
            box-shadow: 16rpx 8rpx 24rpx rgba(212,48,48, 0.1);
            margin-top: 15px;
            border-radius: 15px;
  
     }
     .event{
            font-size: 20px;
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            position: relative;
            margin:15px;
            width: 90%;
            flex: 1;
     }
     .appointmentTime{
            margin-top: 0px;
            font-size: 16px;
            color: black;
     }
 .state_2{
       width: 80px;
       height: 40px;
       background-color:#FF5733;
       border-radius: 0 15px 0 15px;
       z-index: 2;
  
     }
     .state_content{
            position: relative;
            margin-top:10px ;
            margin-left: 15px;
            font-size: 12;
            color: white;
     }
    .appointmentInstitute{

         font-size: 20px;
         color:#FF5733;
         margin-top: 10px;
    }
    .appointmentTeacher{

       font-size: 20px;
       color:#611504;
       margin-top: 10px;
  }
  .time{
       margin-top: 10px;
       font-size: 18px;
       color: #A0A9BD;
  }
.goApprovalButton{
       position: absolute;
       bottom:0px ;
       left: 0%;
       color:#FFFFFF;
       background-color:#FFFFFF;
       border-top: 2px solid grey;
       width: 33.333%;
       height: 70px;
       text-align:center;
       margin-top: 10px;
}
.goPassButton{
       position: absolute;
       bottom:0px ;
       left: 33.333%;
       color:#FFFFFF;
       background-color:#FFFFFF;
       border-top: 2px solid grey;
       width: 33.333%;
       height: 70px;
       text-align:center;
       margin-top: 10px;
}

.goRejectButton{
       position: absolute;
       bottom:0px ;
       left: 66.666%;
       color:#FFFFFF;
       background-color:#FFFFFF;
       border-top: 2px solid grey;
       width: 33.333%;
       height: 70px;
       text-align:center;
       margin-top: 10px;
       
}
.button_content{
       font-size: 15px;
       color: black;
}
.box{
       margin-bottom: 50px;
}
.container{
       position: relative;
}

.container_content{
       position: relative;
       min-height: 100vh;
       box-sizing: border-box;
       padding-bottom: 60rpx;
       padding-top: 0rpx;
}

/* 有无这个属性都行,之后可能会用到 */
.tabar{
       width: 100%;
         text-align: center;
         letter-spacing: 4rpx;
         position: absolute;
         bottom: 0;
}

appointmentApproval2.js

const db = wx.cloud.database()
const _ = db.command
Page({
       data: {
              list:[],
       },
       onLoad(options) {
              console.log("列表携带的值",options)
              db.collection("appointment")
                            .where({
                                 state:2,
                            })
                            .get()
                            .then(res=>{
                                   console.log('查询数据库成功',res.data)
                                   //将返回的res.data里面的值赋值给list
                                   this.setData({
                                          list :res.data,
                                   })
                                   console.log("这是list",this.data.list)
                            })

       },
       onPullDownRefresh() {

       },
       onReachBottom() {

       },
       goDetail(e){
              console.log("点击了详情页面,将展示活动的id ",e)
              wx.navigateTo({
              // 跳转到活动详情页面并携带活动id
                url: '/pages/appointmentDetail/appointmentDetail?id=' +e.currentTarget.dataset.id 
              })
       },
       // 前往待审批页面
       goApprovalPage(){
              wx.redirectTo({
                     url: '../appointmentApproval/appointmentApproval',
                     })
       },
       // 前往已通过页面
       goPassPage(){
              wx.redirectTo({
                     url: '../appointmentApproval3/appointmentApproval3',
                     })
       },
       // 前往已驳回页面
       goRejectPage(){
              wx.showToast({
                     title: '您已经在当前页面',
                     icon:'none'
                     })    
       },
})

appointmentDetail.wxml

<view class="container">
       <view class="">
              <!-- 预约信息 -->
              <view>
                     <view class="subtitle_font">预约基本信息</view>
                     <view class="message">
                            <view class="font">申请预约的组织:{{list.g1_orderInstitute}}</view>
                            <view class="font">预约的老师:{{list.g1_orderTeacher}}</view>
                            <view class="font">预约的时间:{{list.appointment}}</view>
                            <view class="font">发出预约的时间:{{list.time}}</view>
                            <view class="font">预约事项:{{list.content}}</view>
                            <view class="font">预约人:{{list.subscriber}}</view>
                            <view class="font">手机号:{{list.subscriberPhone}}</view>
                            <block wx:if="{{list.state==2}}">
                                   <view class="font">驳回理由:{{list.rejectReason}}</view>
                            </block>
                     </view>
              </view>
       
       </view>
<!-- 条件渲染,只有待审批的活动才能显示 -->
<view>
       <block wx:if="{{list.state==0}}">
       <view class="subtitle_font">如果驳回,请备注驳回理由</view>
       <input bindinput="rejectReason" class="rejectReason" placeholder="驳回的理由"> </input>
       <button bindtap="pass" class="button_location1" style="margin-left:2%; width: 48%;">审批通过</button>
       <button bindtap="reject" class="button_location2" style="margin-right:2%;width:48%" >审批驳回</button>
       </block>
</view>
</view>

appointmentDetail.wxss

.rejectReason{
       margin-top: 15px;
       margin-left: 20px;
       margin-right:20px;
       margin-bottom: 15px;
       padding-top: 3px;
       padding-bottom: 3px;
       padding-left: 15px;
       padding-right:15px;
       border-radius: 30px;
       border: 1px solid #F2E6E6;
}
.inputborder{
       margin-top: 15px;
       margin-left: 20px;
       margin-right:20px;
       margin-bottom: 15px;
       padding-top: 3px;
       padding-bottom: 3px;
       padding-left: 15px;
       padding-right:15px;
       border-radius: 30px;
       border: 1px solid #F2E6E6;
}

.message{
       margin-top: 15px;
       margin-left: 20px;
       margin-right:20px;
       margin-bottom: 15px;
       padding-top: 3px;
       padding-bottom: 3px;
       padding-left: 15px;
       padding-right:15px;
       border-radius: 30px;
       border: 1px solid #F2E6E6;
       height: 400px;
       }
.font{
       margin-top: 5px;
       font-size: 20px;
       font-weight: 100;
}
/* 小标题内容 */
.subtitle_font{
       font-size: large;
       font-weight: 400;
       color: #D43C33;
       margin-left: 20px;
}
/* 审批通过 */
.button_location1{
       border-radius: 80rpx;
       margin-top: 5%;
       color:#FFFFFF;
       background-color: #D43030;
       box-shadow: 16rpx 8rpx 24rpx rgba(212,48,48, 0.35);
       float: left;

}
/* 审批驳回 */
.button_location2{
       border-radius: 80rpx;
       margin-top: 5%;
       color:#FFFFFF;
       background-color: #D43030;
       box-shadow: 16rpx 8rpx 24rpx rgba(212,48,48, 0.35);
       float: right;

}

.container{
       display: flex;
       width: 100%;
       height:700px;
       flex-direction: column;
       justify-content: space-between;
}

appointmentDetail.js

let eventid = ''
const DB = wx.cloud.database().collection("appointment")
Page({
       data:{
              list:[],
              id:"",
              rejectReason:""
       },
       onLoad(option){
              console.log("列表所携带的值",option)
              var id = option.id
              this.setData({
                     id :option.id
              })
              
              DB
              .doc(id)
              .get()
              .then(res=>{
                     this.setData({
                            list:res.data
                     })
                     
              })
              .catch(res=>{
                     console.log("活动详情页请求失败",res)
              })
       },
       pass(){
              let that = this;
              wx.showLoading({
                title: '正在上传中……',
                mask:true
              })
              DB.doc(this.data.id)
              .update({ // updata指 插入数据库中的userlist表;
                //将我们获取到的新值代入
                  data: { 
                         state:1
                  },
                }).then(res => {
                  console.log("上传成功", res)
                  wx.showToast({
                    title: '成功',
                  })
                  wx.navigateTo({
                    url: '../appointmentApproval/appointmentApproval',
                  })
                  .then(()=>{
                     wx.startPullDownRefresh()
                  })
                })
                .catch(err => {
                  console.log("上传失败", err)
                  wx.showToast({
                    title: '失败',
                    icon:"none"
                  })
                })
              

       },
       
       reject(){
              let that = this;
              wx.showLoading({
                title: '正在上传中……',
                mask:true
              })
              DB.doc(this.data.id)
              .update({ // updata指 插入数据库中的userlist表;
                //将我们获取到的新值代入
                  data: { 
                         state:2,
                         rejectReason: this.data.rejectReason
                  },
                }).then(res => {
                  console.log("上传成功", res)
                  wx.showToast({
                    title: '成功',
                  })
                  wx.navigateTo({
                    url: '../appointmentApproval/appointmentApproval',
                  })
                  .then(()=>{
                     wx.startPullDownRefresh()
                  })
                })
                .catch(err => {
                  console.log("上传失败", err)
                  wx.showToast({
                    title: '失败',
                    icon:"none"
                  })
                })
              

       },
       rejectReason(event){
              console.log("这是驳回输入框里的信息",event.detail.value)
              this.setData({
                     rejectReason:event.detail.value
              })
       }
})


题外话

这一系列文章会持续更新,手把手教你从零创建一个小程序项目!并且免费提供源码。如果有什么疑问欢迎大家在底下留言讨论!你的赞和收藏是我最大的动力!! 

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

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

相关文章

6.5 特殊用途语言特性

文章目录默认实参使用默认实参调用函数默认实参声明默认实参初始值内联函数和constexpr函数内联函数constexpr 函数把内联函数和constexpr函数声明在头文件内调试帮助assert预处理宏NDEBUG预处理变量默认实参 某些函数有这样一种形参,在函数的很多次调用中它们都被赋予一个相同…

电子游戏销售之缺失值检测与处理

电子游戏销售之缺失值检测与处理 文章目录电子游戏销售之缺失值检测与处理0、写在前面1、数据缺失值预处理1.1 表的形状1.2 原始数据每个特征缺失和非缺失的数目1.3 每个特征缺失的率1.4 处理后各特征缺失值的数目1.5 删除缺失值后的数据展示2、替换法处理缺失值2.1 替换法2.2 …

1.Springboot配置细节

一、参考资料 13-SpringBoot配置-项目外部配置加载顺序_哔哩哔哩_bilibili 二、配置 2.1 配置文件 注意变量后面是:&#xff0c;而不是等号 2.2 读取配置文件 2.2.1 Value 比如配置文件application.properities中定义了一个name&#xff0c;其值为abc。 代码里面只需按照如…

一、软件安装与配置

一、PyTorch环境软件安装与配置 1.安装anaconda参考 anaconda老版本下载方法&#xff08;如何查看anaconda与python版本对应关系&#xff09;及安装教程_breadth_的博客-CSDN博客_anaconda旧版本下载 2.在anconda下安装和激活pytorch环境 此步并没有下载pytorch 3.下载pyto…

云计算运营—03 KVM虚拟化技术方案介绍

KVM虚拟化技术方案介绍 1.背景介绍 KVM&#xff08;Kernel-based Virtual Machine&#xff09; 开源全虚拟化方案 支持体系结构 x86(32位,64位)、IA64、PowerPC、S390 依赖x86硬件支持&#xff1a;Intel VT-x/ AMD-V内核模块&#xff0c;使得linux内核成为hypervisor XEN架构 …

《B-树》

tips&#xff1a;B-树读成b树&#xff0c;并不是b减树 【一】基本搜索结构 种类数据格式时间复杂度顺序查找无要求O(N)二分查找有序O(log2N)二叉搜索树无要求O(N)二叉平衡树&#xff08;AVL和红黑树&#xff09;无要求&#xff0c;最后随机O(log2N)哈希无要求O(1)位图无要求O…

linux系统中SPI驱动框架的基本原理与实现

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何使用linux系统中SPI驱动ICM-20608六轴传感器的操作。 目录 第一&#xff1a;linux系统下SPI驱动框架简介 第二&#xff1a;SPI设备驱动编写 第三&#xff1a;SPI设备和驱动匹配过程 第一&#xff1a;linux系统下SPI驱…

MySQL数据库高级面试题(1)

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java面试题…

CSDN年度征文 | 你好,2023

祝大家新年快乐~&#x1f9e7;&#x1f9e7;&#x1f9e7;⭐过去的2022⭐2022已成过去&#xff0c;2023慢步向我们走来。回首2022&#xff0c;这一年不是平凡的一年。这一年&#xff0c;有苦也有乐。冬奥会的成功举办、香港回归25周年、二十大胜利召开、航天任务圆满成功等等都…

设计 | 分享5个好用的PPT模板网站

第一PPT 这个老牌的模板网站了&#xff0c;全站都是免费下载&#xff0c;还是不错的 但是素材质量嘛&#xff0c;免费所以不太高。 第一PPT下载https://www.1ppt.com/ 模板狗 这个是最近发现的一个网站&#xff0c;其中内容比较精美。 而且不用开会员也能单独购买&#x…

【Android】APT

引言&#xff1a; 安卓中APT又叫Annotation Processing Tool&#xff0c;即注解处理器。Java中注解分为编译时注解和运行时注解&#xff0c;编译时注解无法通过反射的方式进行获取和处理&#xff0c;所以我们可以利用APT处理编译时注解。比如常见的三方库ButterKnife、ARouter…

mysql删除重复记录并且只保留一条

准备的测试表结构及数据 插入的数据中A,B,E存在重复数据,C没有重复记录 CREATE TABLE tab ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(20) DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT13 DEFAULT CHARSETutf8; -- --------------------…

使用root用户和普通用户完成分配任务案例 ansible(1)

目录 案例一&#xff1a; 控制主机和受控主机通过root用户通过免密验证方式远程控制受控主机实施对应任务。 案例二&#xff1a; 控制主机连接受控主机通过普通用户以免密验证远程控制受控主机实施特权指定操作。 案例一&#xff1a; 控制主机和受控主机通过root用户通过免…

<网络概述>——《计算机网络》

目录 1.网络基础 1.1 计算机网络背景 1.2 网络发展 1.3 软件分层 1.4 网络和操作系统的关系 1.5 局域网通信的原理 2. 网络协议 2.1 网络协议初识 2.1.1 协议分层 2.2 OSI七层模型 2.3 TCP/IP五层(或四层)模型 3. 网络传输基本流程 3.1 网络传输流程图 3.2 数据包…

密码技术扫盲,Part 3:认证

个人博客 密码技术扫盲&#xff0c;Part 1&#xff1a;对称加密密码技术扫盲&#xff0c;Part 2&#xff1a;非对称加密&#x1f3af; 密码技术扫盲&#xff0c;Part 3&#xff1a;认证 除了加密&#xff0c;还有一类用法是对信息的认证&#xff0c;主要包括 4 个技术 单向散…

PostgreSQL JIT 实现query性能加速的一些补充

文章目录背景Executor 本身做的一些优化LLVM JIT 的优化本地以及全局优化执行 query 时的优化JIT调度优化 过程背景 之前介绍过一次 PostgreSQL JIT with LLVM 实现&#xff0c;因为有一些细节没有介绍得很清楚&#xff0c;需要额外做一些补充。 关于LLVM 的IR 以及 如何 用LL…

11.HTML颜色、HTML脚本、字符实体、URL

1.HTML颜色 1&#xff09;HTML 颜色由红色、绿色、蓝色混合而成。 2&#xff09;HTML 颜色由一个十六进制符号来定义&#xff0c;这个符号由红色、绿色和蓝色的值组成&#xff08;RGB&#xff09;。 3&#xff09;每种颜色的最小值是0&#xff08;十六进制&#xff1a;#00&…

性能优化系列之怎么让图片加载得更快?

文章の目录一、压缩png1、优势2、说明文档3、安装4、使用4.1、环境4.2、示例4.3、API4.4、还有一个第三库是对当前库的封装&#xff0c;叫jdf-png-native【版本1.1.0&#xff0c;环境同node-pngquant-native】&#xff0c;使用方法和node-pngquant-native差不多二、压缩jpg1、优…

分享68个PHP源码,总有一款适合您

链接&#xff1a;https://pan.baidu.com/s/1QB61EsIl70vXx1yrJkiesA?pwdbup1 提取码&#xff1a;bup1 PHP源码 分享68个PHP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载…

【树莓派不吃灰】IO篇① GPIO 开发环境

目录1. 前言1.1 4B GPIO引脚排列2. Python GPIO安装3. 基于C语言的wiringPi安装❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-01-01 ❤️❤️ 本篇更新记录 2023-01-01 ❤️&#x1f389; 欢迎关注 &#x1f50e;点赞 &…