소스 검색

Merge branch '03/03Lebao' into test

lex-xin 4 년 전
부모
커밋
fd1aeeab7f

BIN
src/assets/images/pay_success.png


+ 4 - 1
src/router/index.js

@@ -438,7 +438,10 @@ export const asyncRoutes = {
   // 报表中心 下载列表
   downList:()=>import('@/views/reportForm/downList'),
   // 乐器置换
-  reaplceMusicPlayer:()=>import('@/views/reaplceMusicPlayer')
+  reaplceMusicPlayer:()=>import('@/views/reaplceMusicPlayer'),
+  // 问卷管理
+  setQuestions: () => import('@/views/setQuestions'),
+  questionOperation: () => import('@/views/setQuestions/operation'),
 }
 
 export default router

+ 6 - 5
src/views/reaplceMusicPlayer/index.vue

@@ -90,7 +90,8 @@
               </div>
             </template>
           </el-table-column>
-          <el-table-column
+          <el-table-column align="center" label="问卷名称" prop="topicTitle"></el-table-column>
+          <!-- <el-table-column
             align="center"
             prop="showQuestion"
             label="是否参加问卷调查"
@@ -98,7 +99,7 @@
             <template slot-scope="scope">
               {{ scope.row.showQuestion ? '是' : '否' }}
             </template>
-          </el-table-column>
+          </el-table-column> -->
           <el-table-column
             align="center"
             prop="activeNum"
@@ -341,7 +342,7 @@ export default {
         //   });
         let str;
         if (name == "调查链接") {
-          let returnUrl = vaildStudentUrl() + `/#/questionnaire?` + encodeURIComponent(encode(`o=${row.organId}&c=${row.cooperationOrganId}`));
+          let returnUrl = vaildStudentUrl() + `/#/questionnaire?` + encodeURIComponent(encode(`id=${row.id}`));
           // console.log(returnUrl)
           // let tempUrl =
           //   vaildStudentUrl() +
@@ -350,9 +351,9 @@ export default {
         } else if (name == "统计链接") {
           str =
             vaildTeachingUrl() +
-            `/#/questionStatistics?o=${row.organId}&c=${row.cooperationOrganId}`;
+            `/#/questionStatistics?o=${row.organId}&c=${row.cooperationOrganId}&id=${row.id}`;
         } else if(name == '缴费链接') {
-          str = vaildStudentUrl() + `/#/questionGoodsSale?` + encodeURIComponent(encode(`cid=${row.cooperationOrganId}`));
+          str = vaildStudentUrl() + `/#/questionGoodsSale?` + encodeURIComponent(encode(`rid=${row.id}`));
         }
         // vaildTeachingUrl
         // this.qrcode.makeCode(

+ 34 - 4
src/views/reaplceMusicPlayer/modals/addUrl.vue

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <el-form :model="form" label-width="120px" ref="form">
+    <el-form :model="form" label-width="80px" ref="form">
       <el-form-item
         label="分部"
         prop="organId"
@@ -42,6 +42,22 @@
         </el-select>
       </el-form-item>
       <el-form-item
+        label="选择问卷"
+      >
+        <el-select
+          v-model.trim="form.topicId"
+          filterable
+          clearable
+        >
+          <el-option v-for="item in topicList" :key="item.id" :label="item.title" :value="item.id"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-alert
+        title="若不选择问卷,则直接跳转乐器选购页面"
+        :closable="false"
+        type="error">
+      </el-alert>
+      <!-- <el-form-item
         label="是否参与调查"
         prop="showQuestion"
         :rules="[{ required: true, message: '请选择是否参与调查' }]"
@@ -54,24 +70,35 @@
           <el-option label="是" :value="1"></el-option>
           <el-option label="否" :value="0"></el-option>
         </el-select>
-      </el-form-item>
+      </el-form-item> -->
     </el-form>
   </div>
 </template>
 <script>
 import { queryByOrganId } from "@/api/systemManage";
 import { addReplacement } from "../api"
+import { questionnaireTopicQueryPage } from '../../setQuestions/api'
 export default {
   data() {
     return {
       form: {
         organId: "",
         school: "",
-        showQuestion: 1,
+        topicId: null,
       },
       cooperationList: [],
+      topicList: []
     };
   },
+  async mounted() {
+    try {
+      let res = await questionnaireTopicQueryPage({ page: 1, rows: 999 })
+      console.log(res)
+      this.topicList = res.data.rows
+    } catch {
+      //
+    }
+  },
   methods: {
     changeSection(val) {
       this.form.school = "";
@@ -85,7 +112,7 @@ export default {
       this.$refs.form.validate( async(res) => {
         if (res) {
           try{
-          const res = await addReplacement({cooperationOrganId:this.form.school,organId:this.form.organId, showQuestion: this.form.showQuestion})
+          const res = await addReplacement({cooperationOrganId:this.form.school,organId:this.form.organId, topicId: this.form.topicId})
           this.$message.success('生成链接成功')
            this.$emit('getList')
           this.$emit('close')
@@ -100,4 +127,7 @@ export default {
 };
 </script>
 <style lang="scss" scoped>
+/deep/.el-select {
+  width: 100% !important;
+}
 </style>

+ 4 - 4
src/views/reaplceMusicPlayer/modals/detail.vue

@@ -47,7 +47,7 @@
           ></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item prop="hasYesFirstAnswer">
+      <!-- <el-form-item prop="hasYesFirstAnswer">
         <el-select
           v-model.trim="searchForm.hasYesFirstAnswer"
           filterable
@@ -57,7 +57,7 @@
           <el-option label="是" :value="1"></el-option>
           <el-option label="否" :value="0"></el-option>
         </el-select>
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item prop="hasInstrumentsId">
         <el-select
           v-model.trim="searchForm.hasInstrumentsId"
@@ -95,12 +95,12 @@
           prop="mobileNo"
           label="联系电话"
         ></el-table-column>
-        <el-table-column
+        <!-- <el-table-column
           align="center"
           prop="question1"
           label="是否参加市赛"
         >
-        </el-table-column>
+        </el-table-column> -->
         <el-table-column
           align="center"
           label="是否置换"

+ 32 - 0
src/views/setQuestions/api.js

@@ -0,0 +1,32 @@
+import request2 from '@/utils/request2'
+
+export const questionnaireTopicQueryPage = data => request2({
+    url: '/api-web/questionnaireTopic/queryPage',
+    params: data,
+    method: 'get',
+})
+
+export const questionnaireTopicGetDetail = data => request2({
+    url: '/api-web/questionnaireTopic/getDetail',
+    params: data,
+    method: 'get',
+})
+
+export const questionnaireTopicAdd = data => request2({
+    url: '/api-web/questionnaireTopic/add',
+    data,
+    method: 'post'
+})
+
+export const questionnaireTopicUpdate = data => request2({
+    url: '/api-web/questionnaireTopic/update',
+    data,
+    method: 'post'
+})
+
+export const questionnaireTopicUpdateStatus = data => request2({
+    url: '/api-web/questionnaireTopic/updateStatus',
+    data,
+    method: 'post',
+    requestType: 'form'
+})

+ 209 - 0
src/views/setQuestions/components/answerList.vue

@@ -0,0 +1,209 @@
+<template>
+	<div>
+        <div class="questions" v-if="questionList.length > 0"  v-show="!resultStatus">
+            <div class="top-tips">{{ form.title }}</div>
+            <el-card class="box-card">
+                <div slot="header" class="clearfix">
+                    <span class="questionName">{{ questionList[currentIndex - 1]['content'] }}</span>
+                </div>
+                <el-radio-group v-model="check" v-if="questionList[currentIndex - 1]['type'] == 'radio'">
+                    <div class="" v-for="(item) in questionList[currentIndex - 1]['questionnaireQuestionItemList']" :key="item.id">
+                        <el-radio :label="item.id">{{item.answerValue}}</el-radio>
+                    </div>
+                </el-radio-group>
+                <el-checkbox-group v-model="checkBox" v-if="questionList[currentIndex - 1]['type'] == 'checkbox'">
+                    <el-checkbox  v-for="(item) in questionList[currentIndex - 1]['questionnaireQuestionItemList']" :key="item.id" :label="item.id">{{ item.answerValue }}</el-checkbox>
+                </el-checkbox-group>
+                <el-input
+                    v-if="questionList[currentIndex - 1]['type'] == 'textarea'"
+                    type="textarea"
+                    style="border: 0;"
+                    :autosize="{ minRows: 3, maxRows: 6}"
+                    placeholder="请输入其它意见"
+                    v-model="textarea">
+                </el-input>
+            </el-card>
+            <el-button size="large" type="primary" v-if="questionList[currentIndex - 1]['type'] == 'radio'" block round class="btn-submit" color="#01C1B5" :disabled="!check && !!isRequire" @click="onSubmit">提交</el-button>
+            <el-button size="large" type="primary" v-if="questionList[currentIndex - 1]['type'] == 'checkbox'" block round class="btn-submit" color="#01C1B5" :disabled="checkBox.length <= 0 && !!isRequire" @click="onSubmit">提交</el-button>
+            <el-button size="large" type="primary" v-if="questionList[currentIndex - 1]['type'] == 'textarea'" block round class="btn-submit" color="#01C1B5" :disabled="!textarea && !!isRequire" @click="onSubmit">提交</el-button>
+        </div>
+
+        <div class="resultModel" v-show="resultStatus">
+            <img src="@/assets/images/pay_success.png" class="img" alt="">
+            <p class="content">感谢您的参与!</p>
+            <el-button size="large" type="primary" round class="btn-submit" @click="onSubmitClose">确认</el-button>
+        </div>
+
+	</div>
+</template>
+
+<script>
+	export default {
+		name: 'question',
+        props: ['form', 'close'],
+		data() {
+			return {
+                currentIndex: 1,
+                questionList: [],
+                check: null,
+                isRequire: 1,
+                checkBox: [],
+                textarea: null,
+                checkList: [],
+                resultStatus: false
+			}
+		},
+		async mounted() {
+            try {
+                this.questionList = this.form.questionnaireQuestionList || []
+                console.log(this.questionList)
+                this.isRequire = this.questionList[this.currentIndex - 1].isRequire
+            } catch {
+                //
+            }
+		},
+		methods: {
+            toggle(index) {
+                let selectList = this.questionList[this.currentIndex - 1]
+                if(selectList.type == 'radio') {
+                    this.check = index
+                } else if(selectList.type == 'checkbox') {
+                    this.$refs.checkboxes[index].toggle()
+                }
+            },
+            onSubmit() {
+                let selectList = this.questionList[this.currentIndex - 1]
+                if(selectList.type == 'radio' && selectList.isRequire && !this.check) {
+                    this.$message.error('请回答当前问题')
+                    return
+                } else if(selectList.type == 'checkbox' && selectList.isRequire && this.checkBox.length <= 0) {
+                    this.$message.error('请回答当前问题')
+                    return
+                } else if(selectList.type == 'textarea' && selectList.isRequire && !this.textarea) {
+                    this.$message.error('请回答当前问题')
+                    return
+                }
+
+                let answerList = selectList.questionnaireQuestionItemList || [] //当前题的选项
+                let currentIsOver = 0 // 是否终止答题
+                answerList.forEach(item => {
+                    if(selectList.type == 'radio' && this.check == item.id) {
+                        currentIsOver = item.isOver
+                    } else if(selectList.type == 'checkbox' && this.checkBox.includes(item.id) && !currentIsOver) {
+                        currentIsOver = item.isOver
+                    }
+                })
+
+                // 判断是否在题目列表里面
+                if(this.currentIndex <= this.questionList.length) {
+                    if(selectList.type == 'radio') {
+                        this.checkList[this.currentIndex - 1] = {
+                            questionnaireQuestionId: selectList.id,
+                            questionnaireQuestionItemIdList: this.check
+                        }
+                        this.check = null
+                    } else if(selectList.type == 'checkbox') {
+                        this.checkList[this.currentIndex - 1] = {
+                            questionnaireQuestionId: selectList.id,
+                            questionnaireQuestionItemIdList: this.checkBox.join(',')
+                        }
+                        this.checkBox = []
+                    } else if(selectList.type == 'textarea') {
+                        this.checkList[this.currentIndex - 1] = {
+                            questionnaireQuestionId: selectList.id,
+                            additionalValue: this.textarea
+                        }
+                        this.textarea = null
+                    }
+
+                    // 1 为终止答题
+                    if(currentIsOver) {
+                        this.onConfirm()
+                        return
+                    }
+
+                    this.check = null
+                    if(this.currentIndex == this.questionList.length) {
+                        this.saveKey()
+                        return
+                    }
+
+                    this.currentIndex++
+                }
+            },
+            saveKey() {
+                // this.$message.info('谢谢参与')
+                this.resultStatus = true
+            },
+            async onConfirm() {
+                // this.$message.info('谢谢参与')
+                this.resultStatus = true
+            },
+            onSubmitClose() {
+                this.close()
+            }
+		}
+	}
+</script>
+
+<style lang="less" scoped>
+.top-tips {
+    color: #808080;
+    font-size: 14px;
+    padding: 0 0 10px;
+}
+
+.btn-submit {
+    width: 90%;
+    margin: 20px 5%;
+}
+
+.form-info {
+    margin: 10px;
+    width: auto;
+    border-radius: 5px;
+}
+.questionName {
+    padding-top: 5px;
+    font-size: 16px;
+    color: #444;
+    font-weight: 500;
+    line-height: 1.5;
+}
+/deep/.el-radio-group, /deep/.el-checkbox-group {
+    width: 100%;
+}
+/deep/.el-radio__input.is-checked+.el-radio__label {
+    color: #606266;
+}
+/deep/.el-radio, /deep/.el-checkbox {
+    width: 100%;
+    display: flex;
+    justify-content: space-between;
+    flex-direction: row-reverse;
+    padding: 10px 0;
+    .el-radio__label, .el-checkbox__label {
+        padding-left: 0;
+    }
+}
+/deep/.el-button--primary {
+    background: #01c1b5 !important;
+    border-color: #01c1b5 !important;
+}
+
+.resultModel {
+    .img {
+        width: 145px;
+        margin: 0 auto;
+        display: block;
+        // padding-top: 50px;
+    }
+    .content {
+        font-size: 20px;
+        color: #1A1A1A;
+        text-align: center;
+        font-weight: 500;
+        padding-bottom: 30px;
+    }
+}
+</style>

+ 103 - 0
src/views/setQuestions/components/questionList.vue

@@ -0,0 +1,103 @@
+<template>
+<el-form :model="form" ref="form" label-width="100px" class="question">
+    <el-row>
+        <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+            <el-form-item label="题目类型" prop="type" :rules="[{ required: true, message: '请选择题目类型', trigger: 'change' }]">
+                <el-select v-model="form.type" placeholder="请选择题目类型" :disabled="disabled">
+                    <el-option label="单选" value="radio"></el-option>
+                    <el-option label="多选" value="checkbox"></el-option>
+                    <el-option label="问答" value="textarea"></el-option>
+                </el-select>
+            </el-form-item>
+        </el-col>
+        <el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
+            <el-form-item label="是否必填" prop="isRequire" :rules="[{ required: true, message: '请选择是否必填', trigger: 'change' }]">
+                <el-select v-model="form.isRequire" placeholder="请选择是否必填" :disabled="disabled">
+                    <el-option label="是" :value="1"></el-option>
+                    <el-option label="否" :value="0"></el-option>
+                </el-select>
+            </el-form-item>
+        </el-col>
+    </el-row>
+    <el-form-item label="题目" prop="content" :rules="[{ required: true, message: '请输入题目', trigger: 'blur' }]">
+        <el-input type="textarea" placeholder="请输入题目" :disabled="disabled" v-model="form.content" show-word-limit maxlength="200" :autosize="{ minRows: 2, maxRows: 4}"></el-input>
+    </el-form-item>
+
+    <template v-if="form.type != 'textarea'">
+        <div v-for="(questionnaireQuestionItemList, index) in form.questionnaireQuestionItemList" :key="index">
+            <el-form-item :label="'选项' + (index + 1)"
+                style="display: inline-block;"
+                :prop="'questionnaireQuestionItemList.' + index + '.answerValue'"
+                :rules="[{ required: true, message: '请输入选项内容', trigger: 'change' }]">
+                <el-input type="text" placeholder="请输入选项内容" :disabled="disabled" v-model="questionnaireQuestionItemList.answerValue"></el-input>
+            </el-form-item>
+            <el-form-item label="是否终止答题"
+                style="display: inline-block;"
+                label-width="120px"
+                :prop="'questionnaireQuestionItemList.' + index + '.isOver'"
+                :rules="[{ required: true, message: '请选择是否终止答题', trigger: 'change' }]">
+                <el-radio-group v-model="questionnaireQuestionItemList.isOver" :disabled="disabled" style="margin-right: 20px">
+                    <el-radio :label="1">是</el-radio>
+                    <el-radio :label="0">否</el-radio>
+                </el-radio-group>
+            </el-form-item>
+            <div style="display: inline-block;">
+                <el-tooltip class="item" effect="dark" content="向下移动" placement="top">
+                    <el-button icon="el-icon-top" circle size="small" @click="moveDown(form.questionnaireQuestionItemList, index)" :disabled="index == 0 || disabled"></el-button>
+                </el-tooltip>
+                <el-tooltip class="item" effect="dark" content="向下移动" placement="top">
+                    <el-button icon="el-icon-bottom" circle size="small" @click="moveUp(form.questionnaireQuestionItemList, index)" :disabled="form.questionnaireQuestionItemList.length <= 1 || form.questionnaireQuestionItemList.length == (index + 1) || disabled"></el-button>
+                </el-tooltip>
+                <el-tooltip class="item" effect="dark" content="删除" placement="top">
+                    <el-button icon="el-icon-delete" circle size="small" @click="onDelete(form.questionnaireQuestionItemList, index)" :disabled="form.questionnaireQuestionItemList.length <= 1 || disabled"></el-button>
+                </el-tooltip>
+            </div>
+        </div>
+        <el-form-item>
+            <el-button style="width: 200px" type="default" icon="el-icon-plus" :disabled="form.questionnaireQuestionItemList.length >= 10 || disabled" @click="addQuestionItem(form.questionnaireQuestionItemList)">新增选项</el-button>
+        </el-form-item>
+    </template>
+</el-form>
+</template>
+<script>
+export default {
+    props: ['form', 'type', 'disabled'],
+    data () {
+        return {
+        }
+    },
+    mounted () {
+    },
+    methods: {
+        // 添加题目选项
+        addQuestionItem(questionnaireQuestionItemLists) {
+            questionnaireQuestionItemLists.push({})
+        },
+        // 向上移动
+        moveUp(arr, index) {
+            arr.splice(index, 1, ...arr.splice(index + 1, 1, arr[index]));
+        },
+        // 向下移动
+        moveDown(arr, index) {
+            arr.splice(index - 1, 1, ...arr.splice(index, 1, arr[index - 1]));
+
+        },
+        // 删除选项
+        onDelete(arr, index) {
+            if(this.type == 'update') {
+                if(this.form.delQuestionnaireQuestionItemIdList) {
+                    this.form.delQuestionnaireQuestionItemIdList.push(arr[index].id)
+                } else {
+                    this.form.delQuestionnaireQuestionItemIdList = [arr[index].id]
+                }
+            }
+            arr.splice(index, 1)
+        }
+    }
+}
+</script>
+<style lang="scss" scoped>
+.question .el-select {
+    width: 100% !important;
+}
+</style>

+ 198 - 0
src/views/setQuestions/index.vue

@@ -0,0 +1,198 @@
+<template>
+  <div class='m-container'>
+    <h2>
+      <div class="squrt"></div>问卷管理
+    </h2>
+    <div class="m-core">
+        <el-button type="primary" @click="onQuestionOperation('create')"
+           v-if="$helpers.permission('/operateManager/questionOperation/create')"
+           class='newBand'>添加问卷</el-button>
+        <save-form :inline="true"
+               @submit="search"
+               @reset="onReSet"
+               ref="searchForm"
+               :model="searchForm">
+        <el-form-item prop="search">
+            <el-input
+                type="text"
+                clearable
+                v-model="searchForm.search"
+                placeholder="问卷编号或编号"
+            ></el-input>
+        </el-form-item>
+        <el-form-item prop="status">
+          <el-select v-model="searchForm.status"
+                     filterable
+                     placeholder="请选择问卷状态"
+                     clearable>
+            <el-option label="启用" :value="1"></el-option>
+            <el-option label="停用" :value="0"></el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item>
+          <el-button type="danger" native-type="submit">搜索</el-button>
+          <el-button native-type="reset" type="primary">重置</el-button>
+        </el-form-item>
+      </save-form>
+      <!-- 列表 -->
+      <div class="tableWrap">
+        <el-table :data='tableList'
+                  :header-cell-style="{background:'#EDEEF0',color:'#444'}">
+          <el-table-column align='center'
+                           prop="id"
+                           label="问卷编号">
+            <template slot-scope="scope">
+              <copy-text>{{ scope.row.id }}</copy-text>
+            </template>
+          </el-table-column>
+          <el-table-column align='center'
+                           prop="title"
+                           label="问卷名称">
+            <template slot-scope="scope">
+              <!-- <copy-text>{{ scope.row.title }}</copy-text> -->
+              <overflow-text :text="scope.row.title" ></overflow-text>
+            </template>
+          </el-table-column>
+          <el-table-column align='center'
+                           prop="status"
+                           label="状态">
+            <template slot-scope="scope">
+              {{ scope.row.status ? '开启' : '关闭' }}
+            </template>
+          </el-table-column>
+          <el-table-column align='center'
+                           label="操作">
+            <template slot-scope="scope">
+              <el-button @click="onQuestionOperation('look', scope.row)"
+                         v-if="$helpers.permission('/operateManager/questionOperation/detail')"
+                         type="text">详情</el-button>
+              <el-button @click="onOperation(scope.row)"
+                         v-if="$helpers.permission(scope.row.status ? 'questionnaireTopic/updateStatus/stop' : 'questionnaireTopic/updateStatus/start')"
+                         type="text">{{ scope.row.status ? '停用' : '启用' }}</el-button>
+              <el-button @click="onQuestionOperation('update', scope.row)"
+                         v-if="$helpers.permission('/operateManager/questionOperation/update')"
+                         type="text">修改</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination sync :total.sync="pageInfo.total"
+                    :page.sync="pageInfo.page"
+                    :limit.sync="pageInfo.limit"
+                    :page-sizes="pageInfo.page_size"
+                    @pagination="getList" />
+      </div>
+    </div>
+
+  </div>
+</template>
+<script>
+import pagination from '@/components/Pagination/index'
+import { questionnaireTopicQueryPage, questionnaireTopicUpdateStatus } from './api'
+export default {
+  name: 'branchSetting',
+  components: { pagination },
+  data () {
+    return {
+        searchForm: {
+            search: null,
+            status: null
+        },
+        tableList: [],
+        pageInfo: {
+            // 分页规则
+            limit: 10, // 限制显示条数
+            page: 1, // 当前页
+            total: 0, // 总条数
+            page_size: [10, 20, 40, 50] // 选择限制显示条数
+        },
+        organId: null,
+    }
+  },
+  mounted () {
+    this.getList()
+  },
+  methods: {
+    getList () {
+      questionnaireTopicQueryPage({
+        rows: this.pageInfo.limit,
+        page: this.pageInfo.page,
+        ...this.searchForm
+      }).then(res => {
+        if (res.code == 200 && res.data) {
+          this.tableList = res.data.rows
+          this.pageInfo.total = res.data.total
+        }
+      })
+    },
+    onQuestionOperation(type, row) {
+        let str = '问卷'
+        if(type == 'create') {
+          str = '添加' + str
+        } else if(type == 'update') {
+          str = '修改' + str
+        } else if(type == 'look') {
+          str = '查看' + str
+        }
+        let params = {
+          type
+        }
+        if(type == 'update' || type == 'look') {
+          params.id = row.id
+        }
+        this.$router.push({
+            path: '/operateManager/questionOperation',
+            query: params
+        }, (router) => {
+            router.meta.title = str;
+        })
+    },
+    async onOperation(row, type) {
+      let str = row.status ? '停用' : '启用'
+      this.$confirm(`是否${str}该问卷?`, '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(async () => {
+        try {
+            let status = row.status ? 0 : 1
+            await questionnaireTopicUpdateStatus({ topicId: row.id, status: status })
+            this.$message.success(str + '成功')
+            this.getList()
+        } catch {
+          //
+        }
+      })
+    },
+    search() {
+      this.pageInfo.page = 1;
+      this.getList();
+    },
+    onReSet() {
+      this.$refs['searchForm'].resetFields();
+      this.search();
+    },
+
+  }
+}
+</script>
+<style lang="scss" scoped>
+/deep/.el-button--primary {
+  background: #14928a;
+  border-color: #14928a;
+  color: #fff;
+  &:hover,
+  &:active,
+  &:focus {
+    background: #14928a;
+    border-color: #14928a;
+    color: #fff;
+  }
+}
+/deep/.el-date-editor.el-input {
+  width: 100% !important;
+}
+/deep/.el-select {
+  width: 98% !important;
+}
+</style>

+ 264 - 0
src/views/setQuestions/operation.vue

@@ -0,0 +1,264 @@
+<template>
+<div class='m-container'>
+    <h2>
+      <el-page-header @back="onCancel" :content="titleName"></el-page-header>
+    </h2>
+    <div class="m-core">
+        <el-row>
+            <el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18">
+                <el-form ref="form" :model="form" label-width="80px">
+                    <el-form-item label="问卷名称" prop="title" :rules="[{ required: true, message: '请输入问卷名称', trigger: 'blur' }]">
+                        <el-input v-model="form.title" placeholder="请输入问卷名称" :disabled="disabled"></el-input>
+                    </el-form-item>
+                </el-form>
+            </el-col>
+        </el-row>
+        <el-row>
+            <el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18" v-for="(item, index) in form.questionnaireQuestionList" :key="index" style="padding: 15px 22px; background-color: #eef4f9; margin-bottom: 10px;">
+                <el-row type="flex" align="middle" style="flex: 1 auto; padding-bottom: 15px;">
+                    <el-col :span="12">
+                        <span style="font-size: 18px;width: 80px; text-align: right;display: inline-block;">问题{{ index + 1 }}</span>
+                    </el-col>
+                    <el-col :span="12" style="text-align: right; padding-right: 15px;">
+                        <el-tooltip class="item" effect="dark" content="向下移动" placement="top">
+                            <el-button icon="el-icon-top" circle size="small" @click.stop="moveDown(form.questionnaireQuestionList, index)" :disabled="index == 0 || disabled"></el-button>
+                        </el-tooltip>
+                        <el-tooltip class="item" effect="dark" content="向下移动" placement="top">
+                            <el-button icon="el-icon-bottom" circle size="small" @click.stop="moveUp(form.questionnaireQuestionList, index)" :disabled="form.questionnaireQuestionList.length <= 1 || form.questionnaireQuestionList.length == (index + 1) || disabled"></el-button>
+                        </el-tooltip>
+                        <el-tooltip class="item" effect="dark" content="删除" placement="top">
+                            <el-button icon="el-icon-delete" circle size="small" @click.stop="onDelete(form.questionnaireQuestionList, index)" :disabled="form.questionnaireQuestionList.length <= 1 || disabled"></el-button>
+                        </el-tooltip>
+                    </el-col>
+                </el-row>
+                <question-list ref="questions" :type="type" :form="item" :disabled="disabled" />
+            </el-col>
+            <!-- <el-collapse v-model="activeName">
+                <el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18" v-for="(item, index) in form.questionnaireQuestionList" :key="index" style="padding: 15px 22px; background-color: #eef4f9; margin-bottom: 10px;">
+                <el-collapse-item style="background-color: #eef4f9;" :name="index">
+                    <template slot="title">
+                        <el-row type="flex" align="middle" style="flex: 1 auto;">
+                            <el-col :span="12">
+                                <span style="font-size: 18px;width: 80px; text-align: right;display: inline-block;">问题{{ index + 1 }}</span>
+                            </el-col>
+                            <el-col :span="12" style="text-align: right; padding-right: 15px;">
+                                <el-tooltip class="item" effect="dark" content="向下移动" placement="top">
+                                    <el-button icon="el-icon-top" circle size="small" @click.stop="moveDown(form.questionnaireQuestionList, index)" :disabled="index == 0"></el-button>
+                                </el-tooltip>
+                                <el-tooltip class="item" effect="dark" content="向下移动" placement="top">
+                                    <el-button icon="el-icon-bottom" circle size="small" @click.stop="moveUp(form.questionnaireQuestionList, index)" :disabled="form.questionnaireQuestionList.length <= 1 || form.questionnaireQuestionList.length == (index + 1)"></el-button>
+                                </el-tooltip>
+                                <el-tooltip class="item" effect="dark" content="删除" placement="top">
+                                    <el-button icon="el-icon-delete" circle size="small" @click.stop="onDelete(form.questionnaireQuestionList, index)" :disabled="form.questionnaireQuestionList.length <= 1"></el-button>
+                                </el-tooltip>
+                            </el-col>
+                        </el-row>
+                    </template>
+                    <question-list ref="questions" :type="type" :form="item" />
+                </el-collapse-item>
+                </el-col>
+            </el-collapse> -->
+        </el-row>
+        <el-row style="padding-bottom: 15px;">
+            <el-col :xs="24" :sm="24" :md="24" :lg="18" :xl="18" style="text-align: center;">
+                <el-button style="width: 100%" type="default" :disabled="disabled" @click="addQuestionItem(form.questionnaireQuestionList)" icon="el-icon-plus">新增问题</el-button>
+            </el-col>
+        </el-row>
+        <el-button type="primary" :disabled="disabled" @click="onSubmit">{{ type == 'create' ? '提交问卷' : '修改问卷' }}</el-button>
+        <el-button @click="onReset" :disabled="disabled">重置</el-button>
+        <el-button @click="onPreview">预览</el-button>
+
+        <el-dialog title="问卷题目"
+               :close-on-click-modal="false"
+               :visible.sync="questionStatus"
+               v-if="questionStatus"
+               width="375px">
+            <answer-list :form="form" :close="() => {questionStatus = false}" />
+        </el-dialog>
+    </div>
+</div>
+</template>
+<script>
+import questionList from './components/questionList'
+import { questionnaireTopicAdd, questionnaireTopicGetDetail, questionnaireTopicUpdate } from './api'
+import AnswerList from './components/answerList'
+export default {
+    name: 'operationQuestion',
+    components: { questionList, AnswerList },
+    data () {
+        let query = this.$route.query
+        let titleName = '问卷'
+        if(query.type == 'create') {
+          titleName = '添加' + titleName
+        } else if(query.type == 'update') {
+          titleName = '修改' + titleName
+        } else if(query.type == 'look') {
+          titleName = '查看' + titleName
+        }
+        return {
+            type: query.type,
+            titleName: titleName,
+            id: query.id,
+            questionList: [],
+            activeName: [],
+            form: {
+                title: null,
+                questionnaireQuestionList: [{questionnaireQuestionItemList: [{ }]}],
+            },
+            disabled: query.type == 'look' ? true : false,
+            questionStatus: false
+        }
+    },
+    async mounted () {
+        if(this.type == 'update' || this.type == 'look') {
+            try {
+                let res = await questionnaireTopicGetDetail({ id: this.id })
+                this.form = res.data
+                this.questionList = res.data
+                // let list = res.data.questionnaireQuestionList || []
+                // list.forEach((item, index) => {
+                //     this.activeName.push(index)
+                // })
+            } catch {
+                //
+            }
+        }
+    },
+    methods: {
+        getForms() {
+            const { $refs: refs } = this;
+            return [
+                refs.form,
+                ...(refs.questions || []),
+            ].filter((item) => !!item).map((item) => item.$refs.form || item);
+        },
+        setResultSort() { // 给问答结果排序
+            let form = this.form
+            form.questionnaireQuestionList.forEach((item, index) => {
+                item.sort = index
+                let itemList = item.questionnaireQuestionItemList
+                if(item.type != 'textarea') {
+                    itemList.forEach((child, index) => {
+                        child.sort = index
+                    })
+                } else {
+                    itemList = []
+                }
+            })
+        },
+        onSubmit() {
+            const forms = this.getForms();
+            Promise.all(forms.map(this.getFormPromise)).then(async (res) => {
+                const validateResult = res.every(item => !!item)
+                console.log(validateResult)
+                if(validateResult) {
+                    this.setResultSort()
+                    try {
+                        if(this.type == 'create') {
+                            await questionnaireTopicAdd(this.form)
+                            this.$message.success('添加成功')
+                        } else {
+                            await questionnaireTopicUpdate(this.form)
+                            this.$message.success('修改成功')
+                        }
+                        this.onCancel()
+                    } catch {
+                        //
+                    }
+                } else {
+                    this.$nextTick(() => {
+                        let isError = document.getElementsByClassName('is-error')
+                        isError[0].scrollIntoView({
+                            block: 'center',
+                            behavior: 'smooth',
+                        })
+                    })
+                    return false
+                }
+            })
+        },
+        getFormPromise(form) {
+            return new Promise(resolve => {
+                form.validate(res => {
+                    resolve(res);
+                })
+            })
+        },
+        onPreview() {
+            const forms = this.getForms();
+            Promise.all(forms.map(this.getFormPromise)).then(async (res) => {
+                const validateResult = res.every(item => !!item)
+                if(validateResult) {
+                    this.questionStatus = true
+                }
+            })
+        },
+        onReset() {
+            this.form = {
+                title: null,
+                questionnaireQuestionList: [{questionnaireQuestionItemList: [{ }]}],
+            }
+            setTimeout(() => {
+                const forms = this.getForms();
+                for(let form of forms) {
+                    form.clearValidate()
+                }
+            }, 30)
+        },
+        // 添加题目选项
+        addQuestionItem(questionnaireQuestionList) {
+            questionnaireQuestionList.push({questionnaireQuestionItemList: [{}]})
+        },
+        // 向上移动
+        moveUp(arr, index) {
+            arr.splice(index, 1, ...arr.splice(index + 1, 1, arr[index]));
+        },
+        // 向下移动
+        moveDown(arr, index) {
+            arr.splice(index - 1, 1, ...arr.splice(index, 1, arr[index - 1]));
+
+        },
+        // 删除选项
+        onDelete(arr, index) {
+            if(this.type == 'update') {
+                if(this.form.delQuestionnaireQuestionIdList) {
+                    this.form.delQuestionnaireQuestionIdList.push(arr[index].id)
+                } else {
+                    this.form.delQuestionnaireQuestionIdList = [arr[index].id]
+                }
+            }
+            arr.splice(index, 1)
+        },
+        onCancel () {
+            this.$store.dispatch('delVisitedViews', this.$route)
+            this.$router.push({ path: '/operateManager/setQuestions' })
+        },
+    }
+}
+</script>
+<style lang="scss" scoped>
+/deep/.el-button--primary {
+  background: #14928a;
+  border-color: #14928a;
+  color: #fff;
+  &:hover,
+  &:active,
+  &:focus {
+    background: #14928a;
+    border-color: #14928a;
+    color: #fff;
+  }
+}
+/deep/.el-date-editor.el-input {
+  width: 100% !important;
+}
+/deep/.el-select {
+  width: 98% !important;
+}
+/deep/.el-collapse {
+    border: 0;
+}
+/deep/.el-collapse-item__wrap, /deep/.el-collapse-item__header {
+    background-color: #eef4f9;
+}
+</style>

+ 4 - 4
vue.config.js

@@ -18,7 +18,7 @@ const name = defaultSettings.title || '管乐迷后台管理系统' // page titl
 // //  https://online.dayaedu.com
 // let target = 'https://online.dayaedu.com' //线上
 // let target = 'http://192.168.3.139:8000' // 箭河
-// let target = 'http://192.168.3.38:8000' //邹璇
+// let target = 'http://192.168.3.148:8000' //邹璇
 // let target = 'http://192.168.3.57:8000' //勇哥
 let target = 'http://dev.dayaedu.com' // 开发环境
 // let target = 'https://test.dayaedu.com' //测试环境
@@ -55,7 +55,7 @@ module.exports = {
     //   warnings: false,
     //   errors: true
     // },
-    https: true,
+    https: false,
     proxy: {
       // change xxx-api/login => mock/login
       // detail: https://cli.vuejs.org/config/#devserver-proxy
@@ -66,8 +66,8 @@ module.exports = {
       // let target = 'http://dev.dayaedu.com'
       // 'http://dev.dayaedu.com'
       '/api-auth': {
-        // target: 'https://test.dayaedu.com',
-        target : target,
+        target: target,
+        // target : target,
         changeOrigin: true,
         pathRewrite: {
           '^api-auth': ''