Newer
Older
XiaoGanWXMini / pages / quesNaire / index.vue
@zhangdeliang zhangdeliang on 29 Jul 4 KB 迁移
<template>
	<!-- 问卷调查 -->
	<view class="questionNaire" v-if="!dataResult">
		<div class="flex">
			<p class="title">问卷调查</p>
			<img src="@/static/images/quesNaire.png" alt="暂无数据" class="imgs" />
		</div>
		<div class="content">
			<p class="title">{{ quesList.topicName || '' }}</p>
			<div class="contview">
				{{ quesList.introduce || '' }}
			</div>
		</div>
		<uni-forms :modelValue="formData" label-width="100%" class="formCont">
			<uni-forms-item label="您的姓名" required name="name">
				<uni-easyinput type="text" v-model="formData.name" placeholder="请输入您的姓名" />
			</uni-forms-item>
			<uni-forms-item label="您的手机号" required name="telephone">
				<uni-easyinput type="text" v-model="formData.telephone" placeholder="请输入您的手机号" maxlength="11" />
			</uni-forms-item>
			<uni-forms-item :label="`${index + 1},` + item.problemName" v-for="(item, index) in quesList.problemConfigList" :key="item">
				<!-- 单选 -->
				<uni-data-checkbox
					v-model="formData.problemResultList[index].answersResult"
					:localdata="item.problemOptionList"
					:map="{ text: 'optionName', value: 'id' }"
					v-if="item.problemType == 'radio'"
				/>
				<!-- multiple 多选 -->
				<uni-data-checkbox
					multiple
					v-model="formData.problemResultList[index].answersResult"
					:localdata="item.problemOptionList"
					:map="{ text: 'optionName', value: 'id' }"
					v-if="item.problemType == 'checkbox'"
				/>
				<!-- 简答题 -->
				<uni-easyinput
					type="textarea"
					v-model="formData.problemResultList[index].answersResult"
					placeholder="请输入"
					v-if="item.problemType == 'answers'"
				/>
			</uni-forms-item>
			<button class="btnForm" @click="submitData">提交</button>
		</uni-forms>
	</view>
	<!-- 已提交过的 -->
	<view class="questionNaire" v-if="dataResult">
		<div class="noDatas">
			<img src="@/static/images/noData.png" alt="暂无数据" class="imgs" />
			<p class="titles">您已提交过调查问卷,无需再次提交</p>
		</div>
	</view>
</template>

<script setup name="questionNaire">
import { onMounted, ref } from 'vue';
import { questionNaireList, questionNaireAdd, questionNaireResult } from '@/utils/homeApi.js';

const quesList = ref({ topicName: '', introduce: '', problemConfigList: [] });

const formData = ref({
	name: null,
	telephone: null,
	questionnaireId: '',
	programOpenId: '1623498094314524674', //小程序openId
	problemResultList: []
});
const dataResult = ref(true); //是否填过调查问卷

// 查询是否填过
function getResult() {
	let params = {
		programOpenId: formData.value.programOpenId
	};
	questionNaireResult(params).then((res) => {
		dataResult.value = res.data;
		if (!res.data) {
			getQuesList();
		}
	});
}

// 数据提交
function submitData() {
	console.log(formData.value);
	let pattrens = /^1[3|4|5|6|7|8|9][0-9]\d{8}$/;
	if (!pattrens.test(formData.value.telephone)) {
		uni.showToast({
			icon: 'none',
			title: '手机号格式不正确'
		});
		return false;
	}
	let params = JSON.parse(JSON.stringify(formData.value));
	// 多选转换格式为string,方便后端接收
	params.problemResultList.map((item) => {
		if (item.problemType == 'checkbox') {
			item.answersResult = item.answersResult.join(',');
		}
	});
	questionNaireAdd(params).then((res) => {
		if (res.code == 200) {
			uni.showToast({
				icon: 'none',
				title: '提交成功'
			});
			getResult();
		}
	});
}
// 获取问题列表
function getQuesList() {
	formData.value.problemResultList = [];
	questionNaireList().then((res) => {
		let datas = res.data;
		quesList.value = datas;
		formData.value.questionnaireId = datas.id;
		datas.problemConfigList.map((item) => {
			formData.value.problemResultList.push({
				answersResult: item.problemType == 'checkbox' ? [] : '',
				problemType: item.problemType,
				problemId: item.id
			});
		});
	});
}

onMounted(() => {
	formData.value.programOpenId = uni.getStorageSync('openidXGWXMN');
	getResult();
});
</script>

<style lang="scss">
.checklist-text,
uni-text {
	font-size: 16rpx !important;
}

.questionNaire {
	padding: 15rpx;

	.flex {
		align-items: center;
		justify-content: center;
		.title {
			width: 200rpx;
			text-align: center;
			color: #00a8a8;
			font-size: 50rpx;
		}
		.imgs {
			width: 196rpx;
			height: 127rpx;
			margin-left: 30rpx;
		}
	}
	.content {
		background: rgba(255, 255, 255, 0.7);
		padding: 15rpx;
		margin: 10rpx 15rpx;
		border-radius: 8rpx;
		.title {
			text-align: center;
		}
		.contview {
			color: #7b7b7e;
			font-size: 18rpx;
			line-height: 30rpx;
		}
	}
	.formCont,
	.uni-forms {
		background: #fff;
		padding: 15rpx;
		margin: 15rpx;
		border-radius: 8rpx;
		.btnForm {
			background: #00a8a8;
			color: #fff;
			border-radius: 50rpx;
		}
		.uni-forms-item {
			display: flex;
			flex-wrap: wrap;
			.uni-forms-item__label {
				font-size: 24rpx !important;
			}
		}
		.uni-forms-item.is-direction-left {
			flex-direction: column;
		}
	}
}
</style>