【免费开放源码】审批类小程序项目实战(活动申请详解)

news2024/11/15 11:19:39

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

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

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

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

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

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

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

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

第九节 ”我的“页面制作

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

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

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

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

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

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

目录

前言

1.普通的输入框

2.单选器

2.1下拉单选器

2.2直接选择器 

3.时间选择器

4.提交按钮执行逻辑

题外话


前言

        由于上节代码行数较多,到后面编辑器太卡顿了连添加一个字符都很费劲。因此这一节是用来解析“活动申请”页面部分核心代码的。大致分为四个部分:普通的输入框、单选器、时间选择器、提交按钮执行逻辑。那我们现在开始吧~


1.普通的输入框

        “活动申请”页面中整个表单包含元素最多的就是普通的输入框,如活动名称、活动地点、负责人信息、预计参与人数、项目内容阐述、活动经费预算。这些都是比较简单的普通输入框。其实现的基本逻辑是:

        WXML中        创建input组件 \rightarrow 设置输入键盘的type属性 \rightarrow 设置占位符placeholder属性的具体字符 \rightarrow 设置bindinput  

        JS中        在data中创建相关的空数据 \rightarrow 使用this.setData方法将用户输入的值赋给data中的空数据 \rightarrow 在最后提交整个表单的时候提交data里面的相关的值

这么说可能有点抽象,下面我将展示“活动名称”输入框作为例子,来实操一下(注:我这里并没有实现输入框的美化,是纯组件

WXML

// type设置输入键盘样式,placeholder设置占位符,bindinput设置输入时触发的js函数
<input type="text" placeholder="活动名称(必填*)" class="PnameInput" bindinput="huodongName"/>

JS 

// 活动名称
    //设置入口参数res
    huodongName(res){
      //打印用户输入的值
      console.log(res.detail.value,"活动名称")
      //创建一个变量,并使值其等于用户输入的内容(可省略)
      let huodongna = res.detail.value
      //使用this.setData方法,令data中的huodongna的值为res.detail.value也就是用户输入的内容
      this.setData({
        huodongna
      })
    console.log(huodongna)
    },

最后在提交整体表单的时候将data中的相关变量提交上去 

 普通输入框的制作就是这样的一个基本流程,当然这只是实现了功能,样式没有美化,你懂了吗?


2.单选器

        在“活动申请”页面包含了两种单选器,一种是点击后下拉的单选器如所归属的组织、活动地点,一种是直接选择的单选器如是否有赞助、是否有借款、是否需要申请发放教师劳务费、是否需要上传OA。我们将按照先下拉单选器再直接选择器的顺序来解析


2.1下拉单选器

        其实就是用到了picker组件的一些相关知识,其基本逻辑是这样的。

        WXML中        创建picker组件 \rightarrow 将其value属性与js的data的某一变量绑定 \rightarrow 将其range属性与js的data的某一变量绑定 \rightarrow 设置bindchange  \rightarrow   创建一个view组件并让其显示当前的选项

        JS中        在data中创建相关的变量 \rightarrow 使用this.setData方法将用户选择的值赋给data中的相关数据 \rightarrow 创建变量并利用前面返回的数字值将返回的值变为汉字 \rightarrow 再次利用setData方法\rightarrow 在最后提交整个表单的时候提交data里面的相关的值

同样的我将举“活动地点”的例子,来详细的说明整个流程。

这里你可以把value绑定的值理解为是选择器中的第一个元素,range绑定的值理解为选择器的内容

WXML

//将value属性和range属性分别于js的data中相关的变量进行绑定,设置选择触发函数bindchange
<picker bindchange="bindPickerChange" value="{{index}}" range="{{array}}">
        //使用view组件,显示当前选择的选项       
        <view class="xuanzheyuyue">
              当前选择:{{array[index]}}
        </view>
</picker>

 JS

data:{
    //注意我这里第一个是一个空的数据
    array: ['','校区1', '校区2'],
    index: 0,
    area:"",
    },

//选择校区
//设置入口参数为e
bindPickerChange: function(e) {
       console.log('选择校区的picker发送选择改变,携带值为', e.detail.value)
        //改变index的索引值
       this.setData({       
         index: e.detail.value
       })
       //创建一个汉字的变量,并根据索引做出判断
       var area0 = "校区1"
         if(e.detail.value==1){

                //如果索引值为1,那么就将area0赋值给data中的area
                this.setData({
                     area: area0
                })
         }
         var area1 = "校区2"
         if(e.detail.value==2){
                //与上述同理
                this.setData({
                     area: area1
                })
         }
         console.log('校区:',this.data.area)
},

同样的这里也没实现CSS美化,全部的样式代码我都放在第七节了,需要的可自取


2.2直接选择器 

        这里要实现选择“是”后展现多个输入框的功能。如下图的展示

这里我们主要需要用到radio-group和label组件,其实现的基本逻辑是这样的。

        WXML中        创建radio-group组件并设置其选择函数 \rightarrow 创建label组件用wx:for列表渲染js的data文件中的一个数组 \rightarrow 创建radio组件并设置其value属性为列表渲染数组的value值\rightarrow 创建view组件并展示列表渲染数组的name值 

        JS中        在data中创建相关的数组 \rightarrow 通过radio-group所绑定的函数判定选项 \rightarrow 若选择的是“是”则将某一变量通过setData方法设置为true \rightarrow 相反若是选择了“否”则令其为false\rightarrow 在最后提交整个表单的时候提交data里面的相关的值

这里我将举“是否有赞助”为例子来帮助大家理解

WXML

<!-- 是否有赞助 -->
<view class="inputborder">
    <view class="Pname">是否有赞助 <view class="xiaozi">*</view> </view>
    <view>
    <!-- 创建radio-group并设置其选择函数 -->
       <radio-group bindchange="radioChange2">
              <!-- 将label与js文件中的itens列表渲染 -->
              <label wx:for="{{itens}}" wx:key="index" class="Pnamechoose">
                     <view>
                     <!-- 让radio的值与渲染列表中的value进行绑定 -->
                     <radio value="{{item.value}}"/>
                     </view>
                     <!-- 使用view组件来显示其name -->
                     <view>{{item.name}}
                     </view>
              </label>
       </radio-group>
    </view>
    <!-- hidden属性与displays的值绑定,display的值默认为ture,故不显示下列表单 -->
    <view hidden="{{displays}}">
       <view class="Pname">赞助相关信息 <view class="xiaozi">*</view> </view>
       <input type="text" placeholder="赞助公司(必填)" class="inputborder" bindinput="Company"/>
       <input type="text" placeholder="赞助形式" class="inputborder" bindinput="Form"/>
       <input type="number" placeholder="赞助金额(必填)" class="inputborder" bindinput="Money"/>
       <!-- 选择是否已经提交合同 -->
       <view class="Pname">是否已经提交合同 <view class="xiaozi">*</view></view>
       <radio-group bindchange="radioChange2plus">
              <label wx:for="{{contractItens}}" wx:key="index" class="Pnamechoose">
                     <view>
                     <radio value="{{item.value}}"/>
                     </view>
                     <view>{{item.name}}</view>
              </label>
       </radio-group>
  </view>
</view>

JS

data:{
    itens: [
      {value: '有赞助', name: '是'},
      {value: '没有赞助', name: '否'},
    ],
    display:true,
    },

//是否有赞助
radioChange2(e) {
    console.log('radio发生change事件,携带value值为:', e.detail.value)
    const itens = this.data.itens
    let iten = e.detail.value  
    this.setData({
      itens,
       iten
    })
    if(iten == "没有赞助"){
       this.setData({
         displays:true
      })
    }
    else{
       this.setData({
         displays:false
      })
    }
       console.log(iten, this.data.displays)
   },


3.时间选择器

        这个部分用到的就是picker的时间选择器也就是mode属性为data的picker,由于这个组件被封装的很好,没有什么额外的知识点需要拎出来理解,直接复制粘贴就好了!因此这部分就简单的略过。

 WXML

<picker mode="date" start="2017-09-01"  bindchange="bindDatechangeStart" >
        <view>{{liststart}}
                <image src="../../icon/outline.png" class="_icon"></image>        
        </view>
        
</picker>

 JS

    // 起始时间选择
    bindDatechangeStart(e){
      let obj = e.detail.value
      this.setData({
        liststart:obj
      })
      console.log("活动开始时间为", obj,this.data.liststart)
    },

注意:我这里为了美观加了一个图片在view里面,如果你没有相应的图片直接复制粘贴的话是会报错的,如果有需要icon文件里面所有的图片,私聊我。 


4.提交按钮执行逻辑

        虽然“提交”在wxml中的代码很少,但是它所绑定的js函数是在js文件中代码行数占比最大的,为什么呢?原因是在提交整体的表格之前的要做很多判断,有的用户很粗心,有时候会漏填许多重要的信息导致整个表单报废,浪费资源,故提交整体表单到数据库中的要做详细的判断!

举一个例子

 如果用户忘记填写“活动名称”这个输入框,那么data里面的huodongna的值就是空,在提交的时候执行到下图的时候就会显示弹窗并且返回失败。由此可类推其他的判断~

        除此之外,我在提交表单到数据库中的时候提交了state字段,并且令它的值为0

这么做是为了区别活动的状态,因为在这个项目流程中活动分为:第一次待审批、已通过、已驳回、第二次待审批、已结束。一共五种状态,故令其state值分别为0、1、2、3、4

 


题外话

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

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

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

相关文章

Mac下安装go

1.下载地址 ​​​​​​https://golang.google.cn/dl/ 2.安装Go 3.查看安装效果 go version go env 4.安装vscode和插件 4.1.安装vscode https://code.visualstudio.com/Download 4.2.安装GO插件 4.3.设置goproxy 执行命令&#xff1a;vim ~/.bash_profile export GO1…

数值分布的分散程度对迭代次数的影响

( A, B )---1*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有1个节点&#xff0c;AB各由7张二值化的图片组成&#xff0c;排列组合A和B的所有可能性&#xff0c;固定收敛误差为7e-4&#xff0c;统计收敛迭代次数 1 2 3 4 5 6 7 迭代次数 1b 1b 1b 1b 1b 1b 0 0*0*0…

PHP---文件上传

目录 一、文件上传的概念 二、文件上传的步骤 &#xff08;1&#xff09;表单的制作 三、$_FILES详解 &#xff08;1&#xff09;name &#xff08;2&#xff09;tmp_name &#xff08;3&#xff09;type &#xff08;4&#xff09;error &#xff08;5&#xff09;si…

YOLO v6:一个硬件友好的目标检测算法

本文来自公众号“AI大道理” YOLOv6 是美团视觉智能部研发的一款目标检测框架&#xff0c;致力于工业应用。 YOLOv6支持模型训练、推理及多平台部署等全链条的工业应用需求&#xff0c;并在网络结构、训练策略等算法层面进行了多项改进和优化&#xff0c;在 COCO 数据集上&…

一文轻松明白 Base64 编码原理

把图片丢进浏览器&#xff0c;打开sources能看到一长串字符串&#xff0c;这是图片的Base64编码。这一长串编码到底是怎么生成的呢&#xff1f; 我们接下来探索一下base64编码的原理 Base64 名称的由来 Base64编码要求把3个8位的字节&#xff08;3824&#xff09;转化为4个6…

C++代码编程学习(2):类和对象封装部分的两个案例-立方体与点圆位置

C类与对象 封装的学习 挺有趣的&#xff01; 一、前言 昨日有点事忙了些&#xff0c;今天把昨天学习的两个案例给整理一下&#xff0c;C确实比较原始基础&#xff0c;在学习过程中需要好好总结分析与记录。 二、效果展示 案例一&#xff1a;设计立方体 立方体的面积和体积 用…

阿里微服务质量保障系列(一):微服务知多少

年初买了一本集团巨佬联合出的书《阿里测试之道》&#xff0c;然后认真拜读了下&#xff0c;我相信看过的同学都会获益匪浅&#xff0c;此书分享了阿里在大促保障、移动App测试、大数据测试、AI系统测试、云计算测试、资损防控、物流类测试等领域的方法、技术和工具平台&#x…

十一、Properties、多线程

Properties集合 Properties作为Map集合的使用 介绍 是一个Map体系的集合类Properties可以保存到流中或从流中加载属性列表中的每个键及其对应的值都是一个字符串 基本使用 public static void main(String[] args) {Properties prop new Properties();//增prop.put("…

Pytorch c++ 部署报错解决方案

目录 1. Only the versions between 2017 and 2019 (inclusive) are supported! 2. Cannot find cuDNN library. Turning the option off C 部署的时候&#xff0c;demo 写完之后&#xff0c;提示如下错误 1. Only the versions between 2017 and 2019 (inclusive) are sup…

使用Kubernetes部署xxl-job-admin及xxl-job执行器服务

部署环境 xxl-job-2.4.0kubernetes-1.26 这里以xxl-job官方的2.4.0的代码为例子&#xff0c;在官方编写的Dockerfile基础上使用dockerkubernetes进行部署&#xff0c;xxl-job-admin和执行器的Dockerfile、application等配置文件并不是关键&#xff0c;所以这里示例安装以官方…

Linux系统初始化进程及文件(带命令)

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.系统初始化进程及文件 1.init 进程 2.Systemd概述 3.SysVi…

【Java语言】— 循环结构 :for循环

循环结构&#xff1a;for循环 1.for循环 控制一段代码反复执行很多次。 for循环的格式如下&#xff1a; for (初始化语句;循环条件;迭代语句){循环体语句(重复执行的代码);}下面我们通过案例&#xff1a;输出3次HelloWorld感受一下。 //需求&#xff1a;输出3次HelloWorld…

OpenOCD 不同仿真器使用操作总结记录

针对不同的仿真器使用 OpenOCD 时候的设置操作总结 ...... 矜辰所致目录前言一、OpenOCD 环境搭建二、OpenOCD 基本测试三、Makefile 中仿真器配置3.1 ST-link3.2 Jlink3.2 CMSIS-DAP&#xff08;待更新&#xff09;结语前言 在使用 GCC 环境开发 ARM 系列芯片的时候&#x…

ArcGIS基础实验操作100例--实验35等高线生成DEM

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验35 等高线生成DEM 目录 一、实验背景 二、实验数据 三、实验步骤 方法一 &#xff…

4.5、静态路由配置及其可能产生的路由环路问题

静态路由配置是指用户或网络管理员使用路由器的相关命令给路由器人工配置路由表\color{red}人工配置路由表人工配置路由表。 这种人工配置方式简单、开销小。但不能及时适应网络状态&#xff08;流量、拓扑等&#xff09;的变化。\color{red}但不能及时适应网络状态&#xff08…

我的世界Bukkit服务器插件开发教程(十三)资源包与玩家资料

十三、资源包与玩家资料 1.资源包&#xff08;Resource Pack&#xff09; 早期的 Minecraft 并没有资源包一说&#xff0c;而是被叫做材质包。有些服务器为了让玩家拥有更好的游戏体验&#xff0c;一般会在自己特制的客户端中存放一些资源包供玩家加载。 显然&#xff0c;使用…

自动梯度计算

神经网络的参数主要通过梯度下降来进行优化&#xff0e; 当确定了风险函数以及网络结构后&#xff0c; 我们就可以手动用链式法则来计算风险函数对每个参数的梯度&#xff0c; 并用代码进行实现&#xff0e; 但是手动求导并转换为计算机程序的过程非常琐碎并容易出错&#xff0…

二叉树的基础oj题(单值二叉树、相同的树、对称二叉树、二叉树的前序、中序、后序遍历、另一棵树的子树、二叉树的构建和遍历、翻转二叉树)

今天&#xff0c;我带来二叉树的基础oj题 目录单值二叉树&#xff1a;[链接](https://leetcode.cn/problems/univalued-binary-tree/)相同的树&#xff1a;[链接](https://leetcode.cn/problems/same-tree/)对称二叉树&#xff1a;[链接](https://leetcode.cn/problems/symmetr…

syzkaller 黑盒测试1:环境搭建

syzkaller 黑盒测试1&#xff1a;环境搭建 近期需要使用syzkaller对某Linux发行版系统内核进行测试&#xff0c;但是未提供内核源码&#xff0c;只能在黑盒条件下测试。这是笔者第一次接触syzkaller&#xff0c;对测试流程不太熟悉。另外&#xff0c;网上很少有syzkaller黑盒测…

C语言版扫雷——从0到1实现扫雷小游戏

&#x1f412;博客名&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;有志者&#xff0c;事竟成&#xff0c;破釜沉舟&#xff0c;百二秦关终属楚&#xff1b;苦心人&#xff0c;天不负&#xff0c;卧薪尝胆&#xff0c;三千越甲可吞吴。 扫雷思维导图 目录 扫雷思维…