微信小程序开发 调查问卷

news2024/11/16 19:30:08

1. 需求

  开发一个“调查问卷”的案例来学习常用表单组件的使用,收集用户填写胡表单信息提交给服务器,或者从服务器获取数据后显示在表单中。调查问卷分为单选、多选、单行填空、多行填空,选项为必填时候,提交弹出必填项未提交提示。
在这里插入图片描述
在这里插入图片描述

2. 完整代码

2.1. questionnaire.wxml

<view class="quest_layout">
  <view wx:for="{{quest}}" wx:key="id" wx:for-index="outterIndex">
    <!-- 标题 -->
    <view class="quest_item_title">
      <view class="{{((item.isMust=='Y'))?'quest_item_mark_red':'quest_item_mark_invisible'}}">*</view>
      <text>{{outterIndex+1}}.</text>
      <text wx:if="{{item.type==1}}">(单选)</text>
      <view wx:else="">
        <text wx:if="{{item.type==2}}">(多选)</text>
        <text wx:else="">(填空)</text>
      </view>

      <text>{{item.question}}</text>
    </view>
    <!-- 选项(单选、多选) -->
    <view wx:if="{{(item.type==1)||(item.type==2)}}">
      <view class="quest_item_option_layout {{item.selected?'quest_item_option_active':''}}" wx:for="{{item.answers}}" wx:key="content" bindtap="answerSelected" data-outidx='{{outterIndex}}' data-idx="{{index}}">
        <text>{{item.index}}.</text>
        <text> {{item.content}}</text>
      </view>
    </view>
    <!-- 单行填空 -->
    <view wx:if="{{item.type==3}}">
      <input class="quest_item_inpt_layout" bindinput='inputWatch' data-index='{{outterIndex}}' type='text' placeholder='请填写{{item.question}}'></input>
    </view>
    <!-- 多行填空 -->
    <view  wx:if="{{item.type==4}}" class="item_input_area_layout">
      <textarea class="item_input_area_content" bindinput="inputWatch" data-index='{{outterIndex}}'   rows="5" cols='0' placeholder="请输入{{item.question}}" maxlength="1000">
        </textarea>
    </view>
  </view>
  <view class="submit_btn" bindtap="submit">提交</view>
</view>

2.2. questionnaire.wxss

/* pages/questionnaire3/questionnaire3.wxss */
page {
  background-color: #eeeeee;
  padding: 20rpx 0;
}

.quest_layout {
  overflow: hidden;
  width: 90%;
  margin: 20rpx 2.6%;
  padding: 20rpx;
  background-color: white;
  border-radius: 20rpx;
}

.quest_item_title {
  display: flex;
  flex-direction: row;
  color: #000000;
  font-size: 34rpx;
  margin-top: 30rpx;
}

.quest_item_mark_red {
  color: red;
}

.quest_item_mark_invisible {
  color: #00000000;
}

.quest_item_option_layout {
  color: #000000;
  font-size: 32rpx;
  margin-top: 10rpx;
}

.quest_item_option_active {
  color: red;
}

.quest_item_inpt_layout {
  color: #333;
  font-size: 32rpx;
  border: solid 1rpx #e1e1e1;
  margin-top: 10rpx;
  padding: 10rpx 10rpx;
  border-radius: 8rpx;
}
.item_input_area_layout {
  border: 1rpx solid #e1e1e1;
  border-radius: 10rpx;
  padding: 8px;
  margin-top: 10rpx;
}

.item_input_area_content {
  width: 100%;
  height: 200rpx;
  color: #333;
  font-size: 32rpx;
  overflow-y: scroll;
}
.submit_btn {
  background: #00a050;
  color: white;
  margin: 50rpx;
  padding: 25rpx;
  border-radius: 10rpx;
  text-align: center;
}

2.3. questionnaire.js

import questionnaireJson from '../../public/json/questionnaireJson';
Page({

  /**
   * 页面的初始数据
   */
  data: {
    quest: questionnaireJson.data.quest
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {

  },
  /**
   * 点击(单选、多选)问题答案触发事件
   */
  answerSelected(e) {
    let outidx = e.currentTarget.dataset.outidx;
    let idx = e.currentTarget.dataset.idx;
    let question = this.data.quest[outidx];
    if (question.type == 1) { //单选
      for (let item of question.answers) {
        item.selected = false;
      }
      question.answers[idx].selected = true;
      this.setData({
        quest: this.data.quest
      });
    } else if (question.type == 2) { //多选
      question.answers[idx].selected = !question.answers[idx].selected;
      this.setData({
        quest: this.data.quest
      });
    }
  },
  /**
   * 监听输入
   */
  inputWatch: function (e) {
    var that=this;
    var index = e.currentTarget.dataset.index
    var value = e.detail.value
    that.data.quest[index].answers=value
  },
  // 点击提交按钮
  submit() {
    let {
      quest
    } = this.data;
    //用来保存选中的答案
    let answerSelected = [];
    console.log("=quest=", quest);
    for (let questItem of quest) {
      if (questItem.type == 1) { //处理单选题
        let isSelected = false;
        for (let answerItem of questItem.answers) {
          if (answerItem.selected) {
            //答案被选中
            isSelected = true;
            var itemObj = {}
            itemObj.key = questItem.id
            itemObj.value = answerItem.index
            answerSelected.push(itemObj);
          }
        }
        if (!isSelected) { //如果一个都没选
          if (questItem.isMust == 'Y') {
            wx.showToast({
              title: questItem.question + '必须选择',
              icon: 'none'
            })
            return
          } else {
            var itemObj = {}
            itemObj.key = questItem.id
            itemObj.value = ''
            answerSelected.push(itemObj);
          }
        }
      } else if (questItem.type == 2) { //处理多选题
        let isSelected = false;
        var itemValue = ''
        var itemObj = {}
        itemObj.key = questItem.id
        for (let answerItem of questItem.answers) {
          if (answerItem.selected) { //答案被选中
            isSelected = true;
            if (itemValue) {
              itemValue = itemValue + ',' + answerItem.index
            } else {
              itemValue = itemValue + answerItem.index
            }
          }
        }
        itemObj.value = itemValue
        answerSelected.push(itemObj);
        if (!isSelected) { //如果一个都没选
          if (questItem.isMust == 'Y') {
            wx.showToast({
              title: questItem.question + '必须选择',
              icon: 'none'
            })
            return
          }
          answerSelected.push(itemObj);
        }
      } else if (questItem.type == 3) { //处理单行填空题
        if (questItem.isMust == 'Y') {
          if(!questItem.answers){
            wx.showToast({
              title: questItem.question + '必须填写',
              icon: 'none'
            })
            return
          }
        }
        var itemObj = {}
        itemObj.key = questItem.id
        itemObj.value = questItem.answers
        answerSelected.push(itemObj);
      } else if (questItem.type == 4) { //处理多换填空题
        if (questItem.isMust == 'Y') {
          if(!questItem.answers){
            wx.showToast({
              title: questItem.question + '必须输入',
              icon: 'none'
            })
            return
          }
        }
        var itemObj = {}
        itemObj.key = questItem.id
        itemObj.value = questItem.answers
        answerSelected.push(itemObj);
      }
    }
    console.log(answerSelected);
  },
})

2.4. questionnaireJson.js

const data = {
  quest: [
    {
    id: 1,
    type: 1, //类型,1.单选,2.多选
    isMust: 'Y',
    question: "你有女朋友吗?",
    answers: [{
      index: 'A',
      content: '有'
    }, {
      index: 'B',
      content: '没有'
    }]
  },
   {
    id: 2,
    type: 1,
    isMust: 'N',
    question: "目前薪资在哪个范围?",
    answers: [{
      index: 'A',
      content: '3-6k'
    }, {
      index: 'B',
      content: '6-8k'
    }, {
      index: 'C',
      content: '8-10k'
    }, {
      index: 'D',
      content: '10k以上'
    }]
  }, 
  {
    id: 3,
    type: 2,
    isMust: 'Y',
    question: "你喜欢哪一种编程语言?",
    answers: [{
      index: 'A',
      content: 'Java'
    }, {
      index: 'B',
      content: 'C语言'
    }, {
      index: 'C',
      content: 'PHP'
    }, {
      index: 'D',
      content: 'Python'
    }, {
      index: 'E',
      content: 'JavaScript'
    }, {
      index: 'F',
      content: '其他'
    }]
  }, 
  {
    id: 4,
    type: 3,
    isMust: 'Y',
    question: "身份证号",
    answers: ''
  }, 
  {
    id: 5,
    type: 3,
    isMust: 'N',
    question: "联系等方式",
    answers: ''
  },
  {
    id: 6,
    type: 4,
    isMust: 'Y',
    question: "其他建议",
    answers: ''
  }
]
}
module.exports = {
  data: data,
}

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

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

相关文章

Redis2-事务 连接Java 整合springboot 注解缓存

一、订阅和发布 Redis 发布订阅 (pub/sub) 是一种消息通信模式&#xff1a;发送者 (pub) 发送消息&#xff0c;订阅者 (sub) 接收消息。 Redis 客户端可以订阅任意数量的频道。 Redis的发布和订阅 客户端订阅频道发布的消息 频道发布消息 订阅者就可以收到消息 发布订阅的代…

蓝桥杯备赛 week 4 —— DP 背包问题

目录 &#x1f308;前言&#x1f308;&#xff1a; &#x1f4c1; 01背包问题 分析&#xff1a; dp数组求解&#xff1a; 优化&#xff1a;滚动数组&#xff1a; &#x1f4c1; 完全背包问题 &#x1f4c1; 总结 &#x1f308;前言&#x1f308;&#xff1a; 这篇文章主…

联合 Maxlinear 迈凌 与 Elitestek 易灵思 - WPI 世平推出基于 FPGA 芯片的好用高效电源解决方案

近期 WPI 世平公司联合 Maxlinear 迈凌电源产品搭配 Elitestek 易灵思 FPGA 共同合作推出基于 FPGA 芯片的好用高效电源解决方案。 Elitestek 易灵思 FPGA 核心产品有 2 大系列 : Trion 系列与钛金系列。Trion 系列主要特点是 : 1. 40nm 工艺 2. 超低功耗 ( 可低至竞争对手的 …

修复idea,eclipse ,clion控制台中文乱码

控制台乱码问题主要原因并不在编译器IDE身上&#xff0c;还主要是Windows的控制台默认编码问题。。。 Powershell&#xff0c;cmd等默认编码可能不是UTF-8&#xff0c;无需改动IDE的settings或者properties&#xff08;这治标不治本&#xff09;&#xff0c;直接让Windows系统…

上位机图像处理和嵌入式模块部署(python opencv)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们谈到了qt&#xff0c;谈到了opencv&#xff0c;也谈到了嵌入式&#xff0c;但是没有说明python在这个过程当中应该扮演什么样的角色。open…

TCP的连接和关闭的那些事

一、基础概念 1、啥是TCP&#xff1f; 它是面向连接的一种协议&#xff0c;任何数据发送之前都需要建立连接。 2、TCP/IP协议的四层中那一层&#xff1f; TCP位于运输层&#xff0c;详见下图 3、TCP协议的状态机有哪些? 在链接建立和断开不同阶段都有不同的状态&#xf…

ES 分布式搜索的运行机制

ES 分布式搜索的运行机制-腾讯云开发者社区-腾讯云 ES 分布式搜索的运行机制 ES 有两种 search_type 即搜索类型&#xff1a; •query_then_fetch &#xff08;默认&#xff09;•dfs_query_then_fetch query_then_fetch query_then_fetch 1.用户发起搜索&#xff0c;请求…

RabbitMQ 笔记二

1.Spring 整合RabbitMQ 生产者消费者 创建生产者工程添加依赖配置整合编写代码发送消息 创建消费者工程添加依赖配置整合编写消息监听器 2.创建工程RabbitMQ Producers spring-rabbitmq-producers <?xml version"1.0" encoding"UTF-8"?> <pr…

SQL注入:报错注入

SQL注入系列文章&#xff1a;初识SQL注入-CSDN博客 SQL注入&#xff1a;联合查询的三个绕过技巧-CSDN博客 目录 什么是报错注入&#xff1f; 报错注入常用的3个函数 UpdateXML ExtractValue Floor rand&#xff08;随机数&#xff09; floor&#xff08;向上取整&…

海外多语言盲盒APP开发:跨越语言障碍的创新解决方案

随着全球化的加速和信息技术的迅猛发展&#xff0c;跨语言沟通的重要性日益凸显。为了满足这一市场需求&#xff0c;海外多语言盲盒APP应运而生。这一创新性的应用软件&#xff0c;旨在帮助用户跨越语言障碍&#xff0c;实现无障碍的交流与互动。 一、海外多语言盲盒APP的核心…

Python中lambda表达式的用法

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 lambda表达式本身是一个非常基础的python函数语法&#xff0c; 其基本功能跟使用def所定义的python函数是一样的&#xff0c; 只是lambda表达式基本在一行以内就完整的表达了整个函数的运算逻辑。 这里我们简单展示一些lam…

C#,恩廷格尔组合数(Entringer Number)的算法与源程序

恩廷格尔组合数&#xff08;Entringer Number&#xff09;组合数学的序列数字之一。 E&#xff08;n&#xff0c;k&#xff09;是{1&#xff0c;2&#xff0c;…&#xff0c;n1}的排列数&#xff0c;从k1开始&#xff0c;先下降后上升。 计算结果&#xff1a; 源代码&#xf…

五、Flask学习之MySQL

五、Flask学习之MySQL 1. 下载MySQL 下载教程&#xff1a;MySQL安装及可视化工具SQLyog下载 2.常用指令 2.1. 查看已有数据库 show databases;2.2. 创建数据库 create database 名字 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;2.3. 删除数据库 drop database 名字;…

计算机毕业设计 | SSM 凌云招聘平台(附源码)

1&#xff0c;绪论 人力资源是企业产生效益、创造利润的必不可少的、最重要的资源。人作为人力资源的个体可看作是一个承载着有效知识、能力的信息单元。这样的信息单元可看作是一个为企业产生价值和利润的个体。从而使得这样的信息单元所具有的信息就是一个有价值的信息。 校…

stripped文件描述以及gdb反汇编工具使用

往期地址&#xff1a; 操作系统系列一 —— 操作系统概述操作系统系列二 —— 进程操作系统系列三 —— 编译与链接关系操作系统系列四 —— 栈与函数调用关系操作系统系列五 —— 目标文件详解操作系统系列六 —— 详细解释【静态链接】操作系统系列七 —— 装载操作系统系列…

缓存问题 | 缓存穿透,缓存击穿,缓存雪崩

缓存穿透 关键字&#xff1a;强调缓存和数据库都没有数据并发访问 缓存穿透是指数据库和缓存都没有的数据&#xff0c;每次都要经过缓存去访问数据库&#xff0c;大量的请求有可能导致DB宕机。 应对策略&#xff1a; 使用布隆过滤器&#xff08;Bloom Filter&#xff09;&am…

PythonPDF编辑库之pypdf使用详解

概要 PDF&#xff08;Portable Document Format&#xff09;是一种常见的文档格式&#xff0c;广泛用于存储和共享文本和图像数据。在 Python 中&#xff0c;有许多库可以用于处理 PDF 文件&#xff0c;其中之一就是 PyPDF。PyPDF 是一个功能强大的库&#xff0c;它允许你读取…

RK3568平台 麦克风PDM接口录音

一.PDM接口简介 PDM Pulse Density Modulation是一种用数字信号表示模拟信号的调制方法。 PDM则使用远高于PCM采样率的时钟采样调制模拟分量&#xff0c;只有1位输出&#xff0c;要么为0&#xff0c;要么为1。因此通过PDM方式表示的数字音频也被称为Oversampled 1-bit Audio…

Leetcode—145. 二叉树的后序遍历【简单】

2023每日刷题&#xff08;九十七&#xff09; Leetcode—145. 二叉树的后序遍历 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr…

Go、容器以及Linux调度器

在容器中运行Go应用程序时&#xff0c;需要设置合理的GOMAXPROCS&#xff0c;从而避免调度中因为资源不足而造成STW。原文: Go, Containers, and the Linux Scheduler Go开发的应用程序通常部署在容器中。在容器中运行时&#xff0c;重要的一点是要设置CPU限制以确保容器不会耗…