123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- <template>
- <div id="detail">
- <el-row>
- <el-col :span="24" class="main">
- <div class="w_1200">
- <el-col :span="24" class="one">
- <el-row>
- <el-col :span="24" class="info">
- <el-col :span="24" class="title">
- {{ question.title }}
- </el-col>
- <el-col :span="24" class="brief">
- {{ question.brief }}
- </el-col>
- </el-col>
- <el-col :span="24" class="form">
- <el-form :model="answer" label-position="top" ref="form">
- <el-form-item v-if="!user || !user.id" label="您是否注册成为平台用户">
- <el-radio-group v-model="userForm.user">
- <el-radio :label="true">是</el-radio>
- <el-radio :label="false">否</el-radio>
- </el-radio-group>
- </el-form-item>
- <el-form-item v-if="userForm.user" label="手机号">
- <el-input v-model="userForm.phone" placeholder="请填写手机号"></el-input>
- </el-form-item>
- <!-- 0单选,1多选,2简答 -->
- <template v-for="(i, index) in question.questions">
- <el-form-item
- v-if="i.type === '0'"
- :prop="`${index}`"
- :key="`question${index}`"
- :label="`${index + 1}.${i.title}`"
- :rules="[{ required: true, message: '请选择一个选项', trigger: 'blur' }]"
- >
- <el-radio-group v-model="answer[index]" :disabled="disabled">
- <el-radio v-for="(s, si) in i.selects" :key="`s_${index}_${si}`" :label="s.name">{{ s.num }}.{{ s.name }}</el-radio>
- </el-radio-group>
- </el-form-item>
- <el-form-item
- v-else-if="i.type === '1'"
- :prop="`${index}`"
- :key="`question${index}`"
- :label="`${index + 1}.${i.title}`"
- :rules="[{ required: true, message: '请至少选择一个选项', trigger: 'blur' }]"
- >
- <el-checkbox-group :value="answer[index]" @input="data => toCheck(data, index)" :disabled="disabled">
- <el-checkbox v-for="(s, si) in i.selects" :key="`c_${index}_${si}`" :label="s.name">{{ s.num }}.{{ s.name }}</el-checkbox>
- </el-checkbox-group>
- </el-form-item>
- <el-form-item v-else :key="`question${index}`" :label="`${index + 1}.${i.title}`">
- <el-input v-model="answer[index]" type="textarea" :autosize="{ minRows: 4, maxRows: 6 }" :readonly="disabled"></el-input>
- </el-form-item>
- </template>
- </el-form>
- </el-col>
- <el-col :span="24" style="text-align:center">
- <el-button type="primary" @click="toSubmit" v-if="!disabled">提交</el-button>
- </el-col>
- </el-row>
- </el-col>
- </div>
- </el-col>
- </el-row>
- </div>
- </template>
- <script>
- import { mapState, createNamespacedHelpers } from 'vuex';
- const { mapActions: questionnaire } = createNamespacedHelpers('questionnaire');
- const { mapActions: answer } = createNamespacedHelpers('answer');
- export default {
- name: 'detail',
- props: {},
- components: {},
- data: function() {
- return {
- question: {},
- answer: {},
- disabled: false,
- userForm: {},
- };
- },
- created() {
- this.search();
- },
- methods: {
- ...questionnaire(['fetch']),
- ...answer(['create', 'findAnswer']),
- async search() {
- const res = await this.fetch(this.id);
- if (this.$checkRes(res)) {
- const { questions } = res.data;
- for (let i = 0; i < questions.length; i++) {
- const e = questions[i];
- const { select, type } = e;
- if (type === '1') {
- this.answer[i] = [];
- }
- }
- this.$set(this, `question`, res.data);
- }
- this.getAnswer();
- },
- async getAnswer() {
- if (!this.user || !this.user.id) return;
- const res = await this.findAnswer({ user_id: this.user.id, questionnaire_id: this.id });
- if (this.$checkRes(res)) {
- if (res.data) {
- this.disabled = true;
- // 还原数据
- const { answer } = res.data;
- const questions = this.question.questions;
- const reply = {};
- for (const i of answer) {
- const { answer: a, quest } = i;
- const r = questions.findIndex(f => f.title === quest);
- if (r > -1) reply[r] = a;
- }
- this.$set(this, 'answer', reply);
- }
- }
- },
- // 因为层级过深(只要不是在this下,就属于过深),所以需要手动更新视图
- toCheck(data, model) {
- this.answer[model] = data;
- this.$forceUpdate();
- },
- async toSubmit() {
- this.$refs.form.validate(valid => {
- if (valid) {
- this.submit();
- } else {
- console.log('error submit!!');
- return false;
- }
- });
- },
- async submit() {
- let dup = _.cloneDeep(this.answer);
- const keys = Object.keys(dup);
- const questions = this.question.questions;
- const answer = [];
- for (const i of keys) {
- const a = dup[i];
- const quest = questions[i];
- if (a && quest) {
- const obj = { answer: a, quest: quest.title };
- answer.push(obj);
- }
- }
- const data = {
- questionnaire_id: this.id,
- answer,
- };
- if (this.user && this.user.id) {
- data.user_id = this.user.id;
- } else {
- const userForm = this.userForm;
- if (userForm.user) data.phone = userForm.phone;
- }
- const res = await this.create(data);
- if (this.$checkRes(res, '提交成功', '提交失败')) {
- // 返回列表
- this.$router.push('/questionnaire/index');
- }
- },
- },
- computed: {
- ...mapState(['user', 'menuParams']),
- pageTitle() {
- return `${this.$route.meta.title}`;
- },
- id() {
- return this.$route.query.id;
- },
- },
- metaInfo() {
- return { title: this.$route.meta.title };
- },
- };
- </script>
- <style lang="less" scoped>
- .main {
- padding: 15px 0;
- .one {
- margin: 0 0 10px 0;
- .info {
- border-bottom: 1px dashed #ccc;
- padding: 0 20px;
- .title {
- font-size: 30px;
- font-weight: bold;
- margin: 20px 0;
- text-align: center;
- }
- .brief {
- font-size: 16px;
- padding: 0 0 20px 0;
- }
- }
- .form {
- padding: 20px 0;
- /deep/.el-form-item {
- margin-bottom: 5px;
- }
- /deep/.el-form-item__label {
- padding: 0 0;
- font-weight: bold;
- color: #000;
- font-size: 16px;
- }
- }
- }
- }
- </style>
|