guhongwei 4 lat temu
rodzic
commit
fe3f4f0091

+ 15 - 0
src/components/common/Sidebar.vue

@@ -84,6 +84,21 @@ export default {
           index: '/question',
           title: '问卷管理',
         },
+        {
+          icon: 'el-icon-s-home',
+          index: '/questions',
+          title: '问卷管理(第二种)',
+        },
+        {
+          icon: 'el-icon-s-home',
+          index: '/questionBank',
+          title: '题库管理',
+        },
+        {
+          icon: 'el-icon-s-home',
+          index: '/answer',
+          title: '答案管理',
+        },
       ];
       list.push(...data);
       this.$set(this, `items`, _.uniqBy(list, 'index'));

+ 30 - 0
src/router/index.js

@@ -36,6 +36,36 @@ export default new Router({
           component: () => import('../views/question/setQuestion.vue'),
           meta: { title: '设置问卷' },
         },
+        {
+          path: '/questions',
+          component: () => import('../views/questions/index.vue'),
+          meta: { title: '问卷管理(第二种)' },
+        },
+        {
+          path: '/questions/detail',
+          component: () => import('../views/questions/detail.vue'),
+          meta: { title: '问卷信息管理' },
+        },
+        {
+          path: '/questions/setQuestion',
+          component: () => import('../views/questions/setQuestion.vue'),
+          meta: { title: '设置问卷' },
+        },
+        {
+          path: '/questionBank',
+          component: () => import('../views/questionBank/index.vue'),
+          meta: { title: '题库管理' },
+        },
+        {
+          path: '/questionBank/detail',
+          component: () => import('../views/questionBank/detail.vue'),
+          meta: { title: '题库信息管理' },
+        },
+        {
+          path: '/answer',
+          component: () => import('../views/answer/index.vue'),
+          meta: { title: '答案管理' },
+        },
       ],
     },
     {

+ 38 - 0
src/views/answer/index.vue

@@ -0,0 +1,38 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        test
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'index',
+  props: {},
+  components: {},
+  data: function() {
+    return {};
+  },
+  created() {},
+  methods: {},
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 115 - 57
src/views/question/setQuestion.vue

@@ -12,12 +12,12 @@
           </el-col>
           <el-col :span="24" class="form">
             <el-col :span="24" class="list" v-for="(item, index) in info.questions" :key="index">
-              <el-col :span="24" class="name"> {{ index + 1 }}-{{ item.name }} </el-col>
+              <el-col :span="24" class="name"> {{ index + 1 }}-{{ item.title }} </el-col>
               <el-col :span="24" class="radios" v-if="item.type == '0'">
-                <el-radio v-model="info.radio" :label="item.num" v-for="(item, index) in item.select" :key="index">{{ item.name }}</el-radio>
+                <el-radio v-model="info.radio" :label="item.num" v-for="(item, index) in item.selects" :key="index">{{ item.num }}-{{ item.name }}</el-radio>
               </el-col>
               <el-col :span="24" class="checkbox" v-else-if="item.type == '1'">
-                <el-checkbox v-for="(item, index) in item.select" :key="index">{{ item.name }}</el-checkbox>
+                <el-checkbox v-for="(item, index) in item.selects" :key="index">{{ item.num }}-{{ item.name }}</el-checkbox>
               </el-col>
               <el-col :span="24" class="content" v-else-if="item.type == '2'">
                 <el-input v-model="item.content" type="textarea" :autosize="{ minRows: 4, maxRows: 6 }" placeholder="请输入简答" disabled> </el-input>
@@ -29,23 +29,35 @@
     </el-row>
     <el-dialog title="添加题目" width="40%" :visible.sync="dialog" @closed="handleClose" :destroy-on-close="true">
       <el-form ref="form" :model="form" label-width="80px">
-        <el-form-item label="题目类型">
-          <el-radio-group v-model="form.type">
-            <el-radio label="0">单选</el-radio>
-            <el-radio label="1">多选</el-radio>
-            <el-radio label="2">简答</el-radio>
+        <el-form-item label="添加方式">
+          <el-radio-group v-model="form.addType">
+            <el-radio label="0">添加题目</el-radio>
+            <el-radio label="1">选择题目</el-radio>
           </el-radio-group>
         </el-form-item>
-        <el-form-item label="题目标题">
-          <el-input v-model="form.name"></el-input>
-        </el-form-item>
-        <span v-if="form.type == '0'">
-          <el-form-item label="单选选项">
+        <span v-if="form.addType == '0'">
+          <el-form-item label="题目类型">
+            <el-radio-group v-model="form.type">
+              <el-radio label="0">单选</el-radio>
+              <el-radio label="1">多选</el-radio>
+              <el-radio label="2">简答</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item label="题目标题">
+            <el-input v-model="form.title"></el-input>
+          </el-form-item>
+          <el-form-item label="单选选项" v-if="form.type == '0'">
             <el-col :span="24" class="radio">
               <el-col :span="20" class="left">
-                <el-col :span="8" class="list" v-for="(item, index) in form.select" :key="index">
-                  选项:<span>{{ item.num }}</span> 答案:<span>{{ item.name }}</span
-                  >;
+                <el-col :span="8" class="list" v-for="(item, index) in form.selects" :key="index">
+                  <el-col :span="24" class="num">
+                    <p>{{ item.num }}</p>
+                    <p>{{ item.name }}</p>
+                  </el-col>
+                  <el-col :span="24" class="btn">
+                    <el-button type="primary" size="mini" @click="selectsEdit(item)">编辑</el-button>
+                    <el-button type="danger" size="mini" @click="selectsDel(index)">删除</el-button>
+                  </el-col>
                 </el-col>
               </el-col>
               <el-col :span="4" class="right">
@@ -53,14 +65,18 @@
               </el-col>
             </el-col>
           </el-form-item>
-        </span>
-        <span v-else-if="form.type == '1'">
-          <el-form-item label="多选选项">
+          <el-form-item label="多选选项" v-else-if="form.type == '1'">
             <el-col :span="24" class="radio">
               <el-col :span="20" class="left">
-                <el-col :span="8" class="list" v-for="(item, index) in form.select" :key="index">
-                  选项:<span>{{ item.num }}</span> 答案:<span>{{ item.name }}</span
-                  >;
+                <el-col :span="8" class="list" v-for="(item, index) in form.selects" :key="index">
+                  <el-col :span="24" class="num">
+                    <p>{{ item.num }}</p>
+                    <p>{{ item.name }}</p>
+                  </el-col>
+                  <el-col :span="24" class="btn">
+                    <el-button type="primary" size="mini" @click="selectsEdit(item)">编辑</el-button>
+                    <el-button type="danger" size="mini" @click="selectsDel(index)">删除</el-button>
+                  </el-col>
                 </el-col>
               </el-col>
               <el-col :span="4" class="right">
@@ -68,12 +84,20 @@
               </el-col>
             </el-col>
           </el-form-item>
-        </span>
-        <span v-else-if="form.type == '2'">
-          <el-form-item label="简答">
+          <el-form-item label="简答" v-else-if="form.type == '2'">
             <el-input v-model="form.content" type="textarea" :autosize="{ minRows: 4, maxRows: 6 }" placeholder="请输入简答" disabled> </el-input>
           </el-form-item>
         </span>
+        <span v-if="form.addType == '1'">
+          <el-form-item label="选择题目">
+            <el-select v-model="form.questions" multiple filterable placeholder="请选择" style="width:100%">
+              <el-option v-for="item in questionsList" :key="item.id" :label="item.title" :value="item.id">
+                <span style="float: left">{{ item.title }}</span>
+                <span style="float: right; color: #8492a6; font-size: 13px">{{ item.type == '0' ? '单选' : item.type == '1' ? '多选' : '简答' }}</span>
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </span>
         <el-form-item>
           <el-button type="primary" size="mini" @click="onSubmit">保存</el-button>
         </el-form-item>
@@ -98,6 +122,7 @@
 <script>
 import { mapState, createNamespacedHelpers } from 'vuex';
 const { mapActions: questionnaire } = createNamespacedHelpers('questionnaire');
+const { mapActions: question } = createNamespacedHelpers('question');
 export default {
   name: 'setQuestion',
   props: {},
@@ -108,18 +133,22 @@ export default {
       // 添加题目
       dialog: false,
       form: {
-        select: [],
+        selects: [],
       },
       // 选项
       selectDialog: false,
       selectForm: {},
+      // 题目列表
+      questionsList: [],
     };
   },
   async created() {
     await this.search();
+    await this.searchOther();
   },
   methods: {
     ...questionnaire(['query', 'fetch', 'create', 'update', 'delete']),
+    ...question({ queQuery: 'query' }),
     async search() {
       if (this.id) {
         let res = await this.fetch(this.id);
@@ -133,42 +162,31 @@ export default {
     },
     // 添加题目
     add() {
-      // let data = {
-      //   name: '您对本人的工作岗位感到满意?',
-      //   type: '1',
-      //   select: [
-      //     {
-      //       name: '很满意',
-      //       num: 'A',
-      //     },
-      //     {
-      //       name: '满意',
-      //       num: 'B',
-      //     },
-      //     {
-      //       name: '一般',
-      //       num: 'C',
-      //     },
-      //   ],
-      // };
-      // this.$set(this, `form`, data);
       this.dialog = true;
     },
     // 保存
     async onSubmit() {
       let data = {};
+      data.id = this.id;
       let questions = _.cloneDeep(this.info.questions);
-      questions.push(this.form);
+      if (this.form.addType == '0') {
+        questions.push(this.form);
+      } else {
+        questions.push(...this.form.questions);
+      }
       data.questions = questions;
-      data.id = this.id;
       let res = await this.update(data);
       if (this.$checkRes(res)) {
+        this.$message({
+          message: '添加题目成功',
+          type: 'success',
+        });
         this.handleClose();
       }
     },
     // 取消保存
     handleClose() {
-      this.form = { select: [] };
+      this.form = { selects: [] };
       this.dialog = false;
       this.search();
     },
@@ -176,15 +194,39 @@ export default {
     // 保存选项
     selectSubmit() {
       let data = this.selectForm;
-      this.form.select.push(data);
+      let oldData = this.form.selects.find(i => i.num == data.num);
+      let index = this.form.selects.findIndex(i => i.num == data.num);
+      if (oldData) {
+        oldData.NUM = data.num;
+        oldData.name = data.name;
+        this.form.selects.splice(index, 1, oldData);
+      } else {
+        this.form.selects.push(data);
+      }
       this.selectClose();
     },
+    // 修改
+    selectsEdit(data) {
+      this.$set(this, `selectForm`, data);
+      this.selectDialog = true;
+    },
+    // 删除选项
+    selectsDel(index) {
+      this.form.selects.splice(index, 1);
+    },
     // 取消保存选项
     selectClose() {
       this.selectForm = {};
       this.selectDialog = false;
       this.search();
     },
+    // 查询题目列表
+    async searchOther() {
+      let res = await this.queQuery();
+      if (this.$checkRes(res)) {
+        this.$set(this, `questionsList`, res.data);
+      }
+    },
   },
   computed: {
     ...mapState(['user']),
@@ -240,15 +282,31 @@ export default {
 .radio {
   .left {
     .list {
-      color: #666;
-      font-size: 16px;
-      line-height: 25px;
-      span {
-        font-weight: bold;
-        padding: 0 0 0 6px;
+      text-align: center;
+      padding: 5px 0;
+      // border-bottom: 1px solid #ccc;
+      .num {
+        height: 65px;
+        overflow: hidden;
+        p {
+          font-size: 14px;
+          font-weight: bold;
+          line-height: 20px;
+        }
+        p:nth-child(2) {
+          color: #ff0000;
+          font-size: 14px;
+          line-height: 20px;
+          overflow: hidden;
+          text-overflow: ellipsis;
+          -webkit-line-clamp: 2;
+          word-break: break-all;
+          display: -webkit-box;
+          -webkit-box-orient: vertical;
+        }
       }
-      span:nth-child(2) {
-        color: #ff0000;
+      .btn {
+        margin: 5px 0 0 0;
       }
     }
   }

+ 229 - 0
src/views/questionBank/detail.vue

@@ -0,0 +1,229 @@
+<template>
+  <div id="detail">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="top">
+          <el-button type="primary" size="mini" @click="back">返回</el-button>
+        </el-col>
+        <el-col :span="24" class="down">
+          <el-form ref="form" :model="form" label-width="80px">
+            <el-form-item label="题目类型">
+              <el-radio-group v-model="form.type">
+                <el-radio label="0">单选</el-radio>
+                <el-radio label="1">多选</el-radio>
+                <el-radio label="2">简答</el-radio>
+              </el-radio-group>
+            </el-form-item>
+            <el-form-item label="题目标题">
+              <el-input v-model="form.title"></el-input>
+            </el-form-item>
+            <span v-if="form.type == '0'">
+              <el-form-item label="单选选项">
+                <el-col :span="24" class="radio">
+                  <el-col :span="20" class="left">
+                    <el-col :span="4" class="list" v-for="(item, index) in form.selects" :key="index">
+                      <el-col :span="24" class="num">
+                        <p>{{ item.num }}</p>
+                        <p>{{ item.name }}</p>
+                      </el-col>
+                      <el-col :span="24" class="btn">
+                        <el-button type="primary" size="mini" @click="selectsEdit(item)">编辑</el-button>
+                        <el-button type="danger" size="mini" @click="selectsDel(index)">删除</el-button>
+                      </el-col>
+                    </el-col>
+                  </el-col>
+                  <el-col :span="4" class="right">
+                    <el-button type="primary" size="mini" @click="selectDialog = true">添加选项</el-button>
+                  </el-col>
+                </el-col>
+              </el-form-item>
+            </span>
+            <span v-else-if="form.type == '1'">
+              <el-form-item label="多选选项">
+                <el-col :span="24" class="radio">
+                  <el-col :span="20" class="left">
+                    <el-col :span="4" class="list" v-for="(item, index) in form.selects" :key="index">
+                      <el-col :span="24" class="num">
+                        <p>{{ item.num }}</p>
+                        <p>{{ item.name }}</p>
+                      </el-col>
+                      <el-col :span="24" class="btn">
+                        <el-button type="primary" size="mini" @click="selectsEdit(item)">编辑</el-button>
+                        <el-button type="danger" size="mini" @click="selectsDel(index)">删除</el-button>
+                      </el-col>
+                    </el-col>
+                  </el-col>
+                  <el-col :span="4" class="right">
+                    <el-button type="primary" size="mini" @click="selectDialog = true">添加选项</el-button>
+                  </el-col>
+                </el-col>
+              </el-form-item>
+            </span>
+            <span v-else-if="form.type == '2'">
+              <el-form-item label="简答">
+                <el-input v-model="form.content" type="textarea" :autosize="{ minRows: 4, maxRows: 6 }" placeholder="请输入简答" disabled> </el-input>
+              </el-form-item>
+            </span>
+            <el-form-item>
+              <el-button type="primary" size="mini" @click="onSubmit">保存</el-button>
+            </el-form-item>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+    <el-dialog title="选项" width="40%" :visible.sync="selectDialog" @closed="selectClose" :destroy-on-close="true">
+      <el-form ref="selectForm" :model="selectForm" label-width="80px">
+        <el-form-item label="选项">
+          <el-input v-model="selectForm.num"></el-input>
+        </el-form-item>
+        <el-form-item label="答案">
+          <el-input v-model="selectForm.name"></el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" size="mini" @click="selectSubmit">保存选项</el-button>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: question } = createNamespacedHelpers('question');
+export default {
+  name: 'detail',
+  props: {},
+  components: {},
+  data: function() {
+    return {
+      form: {
+        selects: [],
+      },
+      // 选项
+      selectDialog: false,
+      selectForm: {},
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...question(['query', 'fetch', 'create', 'update', 'delete']),
+    // 查询详情
+    async search() {
+      if (this.id) {
+        let res = await this.fetch(this.id);
+        if (this.$checkRes(res)) {
+          this.$set(this, `form`, res.data);
+        }
+      }
+    },
+    // 保存
+    async onSubmit() {
+      let data = this.form;
+      if (data.id) {
+        let res = await this.update(data);
+        if (this.$checkRes(res)) {
+          this.$message({
+            message: '修改题目成功',
+            type: 'success',
+          });
+          this.back();
+        }
+      } else {
+        data.user_id = this.user.id;
+        let res = await this.create(data);
+        if (this.$checkRes(res)) {
+          this.$message({
+            message: '创建题目成功',
+            type: 'success',
+          });
+          this.back();
+        }
+      }
+    },
+    // 添加选项
+    selectSubmit() {
+      let data = this.selectForm;
+      let oldData = this.form.selects.find(i => i.num == data.num);
+      let index = this.form.selects.findIndex(i => i.num == data.num);
+      if (oldData) {
+        oldData.name = data.name;
+        this.form.selects.splice(index, 1, oldData);
+      } else {
+        this.form.selects.push(data);
+      }
+      this.selectClose();
+    },
+    // 取消保存选项
+    selectClose() {
+      this.selectForm = {};
+      this.selectDialog = false;
+    },
+    // 修改
+    selectsEdit(data) {
+      this.$set(this, `selectForm`, data);
+      this.selectDialog = true;
+    },
+    // 删除选项
+    selectsDel(index) {
+      this.form.selects.splice(index, 1);
+    },
+    back() {
+      this.$router.push({ path: '/questionBank' });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .top {
+    text-align: right;
+    margin: 0 0 15px 0;
+  }
+}
+.radio {
+  .left {
+    .list {
+      text-align: center;
+      .num {
+        height: 65px;
+        overflow: hidden;
+        p {
+          font-size: 14px;
+          font-weight: bold;
+          line-height: 20px;
+        }
+        p:nth-child(2) {
+          color: #ff0000;
+          font-size: 14px;
+          line-height: 20px;
+          overflow: hidden;
+          text-overflow: ellipsis;
+          -webkit-line-clamp: 2;
+          word-break: break-all;
+          display: -webkit-box;
+          -webkit-box-orient: vertical;
+        }
+      }
+      .btn {
+        margin: 5px 0 0 0;
+      }
+    }
+  }
+  .right {
+    text-align: right;
+  }
+}
+</style>

+ 97 - 0
src/views/questionBank/index.vue

@@ -0,0 +1,97 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="add">
+          <el-button type="primary" size="mini" @click="add">添加</el-button>
+        </el-col>
+        <el-col :span="24" class="list">
+          <data-table :fields="fields" :opera="opera" :data="list" :total="total" @query="search" @edit="toEdit" @delete="toDelete"></data-table>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import dataTable from '@common/src/components/frame/filter-page-table.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: question } = createNamespacedHelpers('question');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'index',
+  props: {},
+  components: {
+    dataTable,
+  },
+  data: function() {
+    return {
+      opera: [
+        {
+          label: '编辑',
+          method: 'edit',
+        },
+        {
+          label: '删除',
+          method: 'delete',
+        },
+      ],
+      fields: [
+        { label: '题目', prop: 'title' },
+        { label: '题目类型', prop: 'type', format: i => (i === '0' ? '单选' : i === '1' ? '多选' : '简答') },
+        { label: '创建时间', prop: 'create_time' },
+      ],
+      list: [],
+      total: 0,
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...question(['query', 'fetch', 'create', 'update', 'delete']),
+    // 查询列表
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      let res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 添加
+    add() {
+      this.$router.push({ path: '/questionBank/detail' });
+    },
+    // 修改
+    toEdit({ data }) {
+      this.$router.push({ path: '/questionBank/detail', query: { id: data.id } });
+    },
+    // 删除
+    async toDelete({ data }) {
+      let res = await this.delete(data.id);
+      if (this.$checkRes(res)) {
+        this.$message({
+          message: '信息修改成功',
+          type: 'success',
+        });
+        this.search();
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .add {
+    text-align: right;
+    margin: 0 0 10px 0;
+  }
+}
+</style>

+ 91 - 0
src/views/questions/detail.vue

@@ -0,0 +1,91 @@
+<template>
+  <div id="detail">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="top">
+          <el-button type="primary" size="mini" @click="back()">返回</el-button>
+        </el-col>
+        <el-col :span="24" class="down">
+          <data-form :data="form" :fields="fields" :rules="rules" @save="toSave"> </data-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import dataForm from '@common/src/components/frame/form.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: questionnaire } = createNamespacedHelpers('questionnaire');
+export default {
+  name: 'detail',
+  props: {},
+  components: { dataForm },
+  data: function() {
+    return {
+      form: {},
+      fields: [
+        { label: '问卷标题', model: 'title' },
+        { label: '问卷简介', model: 'brief', type: 'textarea' },
+      ],
+      rules: {},
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...questionnaire(['query', 'fetch', 'create', 'update', 'delete']),
+    async search() {
+      if (this.id) {
+        let res = await this.fetch(this.id);
+        if (this.$checkRes(res)) {
+          this.$set(this, `form`, res.data);
+        }
+      }
+    },
+    async toSave({ data }) {
+      if (data.id) {
+        let res = await this.update(data);
+        if (this.$checkRes(res)) {
+          this.$message({
+            message: '信息修改成功',
+            type: 'success',
+          });
+        }
+      } else {
+        let res = await this.create(data);
+        if (this.$checkRes(res)) {
+          this.$message({
+            message: '信息保存成功',
+            type: 'success',
+          });
+        }
+      }
+      this.back();
+    },
+    back() {
+      this.$router.push({ path: '/questions' });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .top {
+    text-align: right;
+    margin: 0 0 15px 0;
+  }
+}
+</style>

+ 105 - 0
src/views/questions/index.vue

@@ -0,0 +1,105 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="add">
+          <el-button type="primary" size="mini" @click="add">添加</el-button>
+        </el-col>
+        <el-col :span="24" class="list">
+          <data-table :fields="fields" :opera="opera" :data="list" :total="total" @query="search" @set="toSet" @edit="toEdit" @delete="toDelete"></data-table>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import dataTable from '@common/src/components/frame/filter-page-table.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: questionnaire } = createNamespacedHelpers('questionnaire');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'index',
+  props: {},
+  components: {
+    dataTable,
+  },
+  data: function() {
+    return {
+      opera: [
+        {
+          label: '设置问卷',
+          method: 'set',
+        },
+        {
+          label: '编辑',
+          method: 'edit',
+        },
+        {
+          label: '删除',
+          method: 'delete',
+        },
+      ],
+      fields: [
+        { label: '名称', prop: 'title' },
+        { label: '信息简介', prop: 'brief' },
+        { label: '创建时间', prop: 'create_time' },
+      ],
+      list: [],
+      total: 0,
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...questionnaire(['query', 'fetch', 'create', 'update', 'delete']),
+    // 查询列表
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      let res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 设置问卷
+    toSet({ data }) {
+      this.$router.push({ path: '/questions/setQuestion', query: { id: data.id } });
+    },
+    // 添加
+    add() {
+      this.$router.push({ path: '/questions/detail' });
+    },
+    // 修改
+    toEdit({ data }) {
+      this.$router.push({ path: '/questions/detail', query: { id: data.id } });
+    },
+    // 删除
+    async toDelete({ data }) {
+      let res = await this.delete(data.id);
+      if (this.$checkRes(res)) {
+        this.$message({
+          message: '信息修改成功',
+          type: 'success',
+        });
+        this.search();
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .add {
+    text-align: right;
+    margin: 0 0 10px 0;
+  }
+}
+</style>

+ 166 - 0
src/views/questions/setQuestion.vue

@@ -0,0 +1,166 @@
+<template>
+  <div id="setQuestion">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="top">
+          <el-button type="primary" size="mini" @click="add">添加题目</el-button>
+          <el-button type="primary" size="mini" @click="back">返回</el-button>
+        </el-col>
+        <el-col :span="24" class="down">
+          <el-col :span="24" class="title">
+            {{ info.title }}
+          </el-col>
+          <el-col :span="24" class="form">
+            <el-col :span="24" class="list" v-for="(item, index) in info.questions" :key="index">
+              <el-col :span="24" class="name"> {{ index + 1 }}-{{ item.title }} </el-col>
+              <el-col :span="24" class="radios" v-if="item.type == '0'">
+                <el-radio v-model="info.radio" :label="item.num" v-for="(item, index) in item.selects" :key="index">{{ item.num }}-{{ item.name }}</el-radio>
+              </el-col>
+              <el-col :span="24" class="checkbox" v-else-if="item.type == '1'">
+                <el-checkbox v-for="(item, index) in item.selects" :key="index">{{ item.num }}-{{ item.name }}</el-checkbox>
+              </el-col>
+              <el-col :span="24" class="content" v-else-if="item.type == '2'">
+                <el-input v-model="item.content" type="textarea" :autosize="{ minRows: 4, maxRows: 6 }" placeholder="请输入简答" disabled> </el-input>
+              </el-col>
+            </el-col>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+    <el-dialog title="题目管理" width="40%" :visible.sync="dialog" @closed="handleClose" :destroy-on-close="true">
+      <el-form ref="form" :model="form" label-width="80px">
+        <el-form-item label="选择题目">
+          <el-select v-model="form.questions" multiple filterable placeholder="请选择">
+            <el-option v-for="item in questionsList" :key="item.id" :label="item.title" :value="item.id">
+              <span style="float: left">{{ item.title }}</span>
+              <span style="float: right; color: #8492a6; font-size: 13px">{{ item.type == '0' ? '单选' : item.type == '1' ? '多选' : '简答' }}</span>
+            </el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item>
+          <el-button type="primary" size="mini" @click="onSubmit">保存选项</el-button>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: questionnaire } = createNamespacedHelpers('questionnaire');
+const { mapActions: question } = createNamespacedHelpers('question');
+export default {
+  name: 'setQuestion',
+  props: {},
+  components: {},
+  data: function() {
+    return {
+      info: {},
+      // 选择题目
+      dialog: false,
+      form: {},
+      // 题目列表
+      questionsList: [],
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...questionnaire(['query', 'fetch', 'create', 'update', 'delete']),
+    ...question({ queQuery: 'query' }),
+    async search() {
+      if (this.id) {
+        let res = await this.fetch(this.id);
+        if (this.$checkRes(res)) {
+          this.$set(this, `info`, res.data);
+        }
+      }
+    },
+    // 添加题目
+    async add() {
+      let res = await this.queQuery();
+      if (this.$checkRes(res)) {
+        this.$set(this, `questionsList`, res.data);
+      }
+      this.dialog = true;
+    },
+    // 保存选题
+    async onSubmit() {
+      let data = this.form;
+      data.id = this.id;
+      let res = await this.update(data);
+      if (this.$checkRes(res)) {
+        this.$message({
+          message: '添加题目成功',
+          type: 'success',
+        });
+        this.handleClose();
+        this.search();
+      }
+    },
+    // 取消添加
+    handleClose() {
+      this.form = {};
+      this.dialog = false;
+    },
+    back() {
+      this.$router.push({ path: '/question' });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .top {
+    text-align: right;
+    margin: 0 0 15px 0;
+  }
+  .down {
+    padding: 0 10%;
+    .title {
+      text-align: center;
+      font-size: 20px;
+      font-weight: bold;
+      margin: 0 0 20px 0;
+    }
+    .form {
+      padding: 10px 20px;
+      border: 1px solid #ccc;
+      .list {
+        border-bottom: 1px dashed #f1f1f1;
+        padding: 10px 0;
+        .name {
+          font-weight: bold;
+          font-size: 18px;
+          margin: 0 0 10px 0;
+        }
+        .content {
+          padding: 0;
+        }
+      }
+    }
+  }
+}
+/deep/.el-select {
+  width: 100%;
+}
+</style>