微信小程序云开发实现问卷调查的创建与填写

微信小程序云开发实现问卷调查的创建与填写

本人专注使用云开发,实现一个前端可以做后端以及整个项目的部署与上线。
如果觉得我讲的好就可以给我点个赞。也可以加我微信了解详情。
在这里插入图片描述

我们先看效果是怎么样的

WeChat_20220515124055

1.首先你需要先了解 一下基本的云开发知识。

我们主要用到的数据库的操作为,查询,添加,更新。
1.查询 我们查的是全部定坐消息,所以我们应该使用云函数请求数据库,可以查询到表中所有数据,这样权限就更高了。如果是在js中查询只能查询自己添加的数据,以及cms添加的 数据。
2.添加,这个操作是属于自己本身 的操作不需要其他的参与,所以我们可以使用本地请求数据库。
3.更新操作,更新是更改数据的重要操作。
1》调查问卷的原理
1.首先我们需要定义一个表单,通过表单来实现其填写的数据,。
2》创建问卷的原理
1.首先我们需要定义一个json字段[{},{}],在这里我们应该把自己的openid和自己的基本信息(头像,昵称等)以及问卷选项放入这个字段中。
我们先看数据结构
请添加图片描述
请添加图片描述
从上面数据结构可以看出 其数据排布情况,接下来我们就可以开始做该页面了

我们先看代码。

<scroll-view scroll-x class="bg-white nav">
  <view class="flex text-center">
    <view class="cu-item flex-sub {{0==TabCur?'text-orange cur':''}}" bindtap="tabSelect" data-id="{{0}}">问卷</view>
    <view class="cu-item flex-sub {{1==TabCur?'text-orange cur':''}}" bindtap="tabSelect" data-id="{{1}}">创建</view>
  </view>
</scroll-view>

<view wx:if="{{0==TabCur}}" class="padding">
  <view class="padding-xl radius shadow shadow-lg bg-white margin-top" wx:for="{{questionList}}">
    <view class="solids-bottom padding-xs flex align-center" bindtap="loop_qu" data-id="{{item._id}}">
      <view class="flex-sub text-center">
        <view class=" text-xl padding">
          <text class="text-black text-bold">{{item.qusetions.name}}</text>
        </view>
        <view class="padding">{{item.qusetions.des}}</view>
      </view>
    </view>
  </view>
</view>

<view wx:if="{{1==TabCur}}">
  <view>
    <view class="cu-form-group">
      <view class="title">问卷标题</view>
      <input placeholder="请输入问卷标题" bindinput="name" value="{{qusetions.name}}"></input>
    </view>
    <view class="cu-form-group">
      <view class="title">问卷描述</view>
      <input placeholder="请输入问卷描述" bindinput="des" value="{{qusetions.des}}"></input>
    </view>

    <view class="cu-form-group">
      <view class="title">选择截止时间</view>
      <date-time-picker value="{{qusetions.endTime}}" bindchange="setEndTimeChange">
        <view class="picker">{{qusetions.endTime}}</view>
      </date-time-picker>
    </view>

    <view class="cu-form-group">
      <view class="title">选择问题类型</view>
      <picker bindchange="PickerChange" value="{{index}}" range="{{picker}}" class="text-center">
        {{index?picker[index]:'请选择类型'}}
      </picker>
      <button class="cu-btn bg-green shadow" style="width:200rpx" bindtap="addquest">添加问题</button>
    </view>

    <view wx:for="{{qusetions.questionnaireArray}}">
      <!-- 单选 -->
      <view wx:if="{{item.type == 'SCQ'}}">
        <view class="cu-form-group">
          <view class="title">问题(单)</view>
          <input placeholder="请输入问题" value="{{item.content.description}}" bindinput="description"
            data-index="{{index}}"></input>
          <button class="cu-btn bg-green shadow" style="width:200rpx" bindtap="additem"
            data-index="{{index}}">添加选项</button>
        </view>
        <view class="cu-form-group" wx:for="{{item.content.options}}" wx:for-index="childindex">
          <view class="title">选项{{item.id}}</view>
          <input placeholder="请输入选项{{item.id}}" bindinput="opti" data-index="{{index}}" data-childindex="{{childindex}}"
            value="{{item.name}}"></input>
          <button class="cu-btn bg-red shadow" style="width:200rpx" bindtap="delectitem" data-index="{{index}}"
            data-childindex="{{childindex}}">删除选项</button>
        </view>

      </view>
      <!-- 多选 -->
      <view wx:if="{{item.type == 'MCQ'}}">
        <view class="cu-form-group">
          <view class="title">问题(多)</view>
          <input placeholder="请输入问题" bindinput="description" value="{{item.content.description}}"
            data-index="{{index}}"></input>
          <button class="cu-btn bg-green shadow" style="width:200rpx" bindtap="additem"
            data-index="{{index}}">添加选项</button>
        </view>
        <view class="cu-form-group" wx:for="{{item.content.options}}" wx:for-index="childindex">
          <view class="title">选项{{item.id}}</view>
          <input placeholder="请输入选项{{item.id}}" bindinput="opti" data-index="{{index}}" data-childindex="{{childindex}}"
            value="{{item.name}}"></input>
          <button class="cu-btn bg-red shadow" style="width:200rpx" bindtap="delectitem" data-index="{{index}}"
            data-childindex="{{childindex}}">删除选项</button>
        </view>
      </view>
      <!-- 问答 -->
      <view wx:if="{{item.type == 'SAQ'}}">
        <view class="cu-form-group">
          <view class="title">问题(问答)</view>
          <input placeholder="请输入问题" bindinput="description"value="{{item.content.description}}"
            data-index="{{index}}"></input>
        </view>
      </view>
    </view>
  </view>
  <view class="padding bg-white">
    <button class="cu-btn block bg-blue margin-tb-sm lg button-hover" bindtap="sumbit">提交问卷</button>
  </view>

</view>

js代码如下

 data: {
    TabCur: 0,
    scrollLeft: 0,
    index: null,
    picker: ['单选', '多选', '问答'],
    picker1: ['SCQ', 'MCQ', 'SAQ'],
    questionList: null,
    qusetions: {
      name: '',
      des: '',
      qid: 0,
      creatTime: '',
      endTime_num: null,
      endTime: '2022-05-13 16:24:30',
      questionnaireArray: []
    },
  },

  PickerChange(e) {
    console.log(e);
    this.setData({
      index: e.detail.value
    })
  },
  //设置截止时间
  setEndTimeChange(e) { this.setData({ 'qusetions.endTime': e.detail.dateString }) },
  name(e) { this.setData({ 'qusetions.name': e.detail.value }) },
  des(e) { this.setData({ 'qusetions.des': e.detail.value }) },
  description(e) {
    let value = e.detail.value;
    let index = e.currentTarget.dataset.index;
    let qusetions = this.data.qusetions;
    qusetions.questionnaireArray[index].content.description = value;
    this.setData({ qusetions })
  },
  opti(e) {
    let value = e.detail.value;
    let index = e.currentTarget.dataset.index;
    let childindex = e.currentTarget.dataset.childindex;
    let qusetions = this.data.qusetions;
    qusetions.questionnaireArray[index].content.options[childindex].name = value;
    this.setData({ qusetions })
  },
  tabSelect(e) {
    this.setData({
      TabCur: e.currentTarget.dataset.id,
      scrollLeft: (e.currentTarget.dataset.id - 1) * 60
    })
  },
  //获取qid
  getQid() {
    let qids = 0;
    wx.cloud.database().collection("questions_new").get().then(res => {
      console.log("连接questions_new成功", res)
      qids = (res.data[res.data.length - 1].qusetions.qid) + 1
      console.log("连接成功后qid的值", qids)
      if (qids == '') { this.setData({ 'qusetions.qid': 0 }) } else {
        this.setData({ 'qusetions.qid': qids })
      }
    }).catch(res => { console.log("连接questions_new失败", res) })
  },

  //添加问题
  addquest: function () {
    let tempArray = this.data.qusetions.questionnaireArray;
    let picker1 = this.data.picker1[this.data.index];
    if (this.data.index) {
      if (picker1 == "SCQ") {
        var temp0 = {
          "type": "SCQ",
          "content": {
            "description": "",
            "options": []
          }
        };
        tempArray.push(temp0);
      }
      else if (picker1 == "MCQ") {
        var temp0 = {
          "type": "MCQ",
          "content": {
            "description": "",
            "options": []
          }
        };
        tempArray.push(temp0);
      }
      else if (picker1 == "SAQ") {
        var temp0 = {
          "type": "SAQ",
          "content": {
            "description": "",
            "description_value": ""
          }
        };
        tempArray.push(temp0);
      }
      this.setData({
        'qusetions.questionnaireArray': tempArray,
      });
    } else { wx.showToast({ title: '请选择问题类型', icon: 'none' }) }
  },
  //添加选项
  additem(e) {
    let index = e.currentTarget.dataset.index;
    let qusetion = this.data.qusetions;
    let options = qusetion.questionnaireArray[index].content.options;
    options.push({ "id": options.length + 1, "name": "", "isSelected": false },);
    this.setData({ qusetions: qusetion });
    console.log(e.currentTarget.dataset.index);
  },
  //删除选项
  delectitem(e) {
    let index = e.currentTarget.dataset.index;
    let childindex = e.currentTarget.dataset.childindex;
    let qusetion = this.data.qusetions;
    let options = qusetion.questionnaireArray[index].content.options;
    options.splice(childindex, 1);
    this.setData({ qusetions: qusetion });
  },


  //验证是否为空的函数
  ifnone_data() {
    let qusetions = this.data.qusetions;
    if (qusetions.name == '') { return '请填写问卷标题'; };
    if (qusetions.des == '') { return '请填写问卷描述'; };
    if (this.data.index == null) { return '请选择问题类型'; };
    let stati_top = 200;
    for (let i = 0; i < qusetions.questionnaireArray.length; i++) {
      if (qusetions.questionnaireArray[i].content.description == '') { stati_top = '请填写问题'; break; }
      if (qusetions.questionnaireArray[i].type != 'SAQ') {
        if (qusetions.questionnaireArray[i].content.options.length == 0) { stati_top = '请添加选项'; break; }
        for (let j = 0; j < qusetions.questionnaireArray[i].content.options.length; j++) {
          if (qusetions.questionnaireArray[i].content.options[j].name == '') { stati_top = '请填写选项'; break; }
        }
      }

    }
    return stati_top;
  },
  //提交数据
  sumbit() {
    let ifnone_data = this.ifnone_data();
    let qusetions = this.data.qusetions;
    console.log(ifnone_data)
    console.log(qusetions)
    if (ifnone_data == 200) {
      qusetions.endTime_num = new Date(qusetions.endTime).getTime();
      wx.cloud.database().collection('questions_new').add({
        data: {
          qusetions
        }
      }).then(res => {
        wx.showToast({ title: '添加成功', })
        this.setData({
          index: null,
          qusetions: { name: '', des: '', qid: 0, creatTime: '', endTime_num: '', endTime: '2022-05-13 16:24:30', questionnaireArray: [] },
        })
      })
      console.log(qusetions);
    } else {
      wx.showToast({ title: ifnone_data, icon: 'none' });
    }
  },

  getdata() {
    let _ = wx.cloud.database().command;
    //.where({ endTime: _.gt(+new Date()) })
    wx.cloud.database().collection('questions_new').where({ 'qusetions.endTime_num': _.gte(+new Date()) }).get().then(res => {
      console.log("获取questions_new的全部数据成功", res)
      this.setData({
        questionList: res.data
      })
    })
      .catch(res => {
        console.log("获取questions_new的全部数据失败", res)
      })
  },

  loop_qu(e) {
    let id = e.currentTarget.dataset.id;
    let openid = wx.getStorageSync('openid');
    wx.cloud.database().collection('login_questions').where({ item_inf_id: id, _openid: openid }).get().then(res => {
      if (res.data.length == 0) {
        wx.navigateTo({
          url: '/pages/item/item?id=' + id,
        })
      } else {
        wx.showToast({
          title: '你已回答过改问卷请勿再回答。',
          icon: 'none'
        })
      }
    })

  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    //创建时间
    const formatTime = format.formatTime(new Date());
    this.setData({ 'qusetions.creatTime': formatTime, 'qusetions.endTime': formatTime })
    this.getdata();
    this.getQid();
  },

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值