guhongwei 4 years ago
parent
commit
94afb0a756

+ 180 - 0
src/components/common/Header copy.vue

@@ -0,0 +1,180 @@
+<template>
+  <div class="header">
+    <!-- 折叠按钮 -->
+    <div class="collapse-btn" @click="collapseChage">
+      <i v-if="!collapse" class="el-icon-s-fold"></i>
+      <i v-else class="el-icon-s-unfold"></i>
+    </div>
+    <div class="logo">管理中心</div>
+    <div class="header-right">
+      <div class="header-user-con">
+        <!-- 全屏显示 -->
+        <div class="btn-fullscreen" @click="handleFullScreen">
+          <el-tooltip effect="dark" :content="fullscreen ? `取消全屏` : `全屏`" placement="bottom">
+            <i class="el-icon-rank"></i>
+          </el-tooltip>
+        </div>
+        <!-- 用户头像 -->
+        <div class="user-avator">
+          <img src="../../assets/img/img.jpg" />
+        </div>
+        <!-- 用户名下拉菜单 -->
+        <!-- <el-dropdown class="user-name" trigger="hover">
+          <span class="el-dropdown-link">
+            {{ user || user.name || '游客' }}
+          </span>
+        </el-dropdown> -->
+        <span>{{ user || user.name || '游客' }}</span>
+        <div class="btn">
+          <button @click="loginout"><i class="el-icon-switch-button"></i></button>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import bus from '../common/bus';
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  data() {
+    return {
+      collapse: false,
+      fullscreen: false,
+    };
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  methods: {
+    // 用户名下拉菜单选择事件
+    loginout() {
+      localStorage.removeItem('token');
+      this.$router.push('/login');
+    },
+    // 侧边栏折叠
+    collapseChage() {
+      this.collapse = !this.collapse;
+      bus.$emit('collapse', this.collapse);
+    },
+    // 全屏事件
+    handleFullScreen() {
+      let element = document.documentElement;
+      if (this.fullscreen) {
+        if (document.exitFullscreen) {
+          document.exitFullscreen();
+        } else if (document.webkitCancelFullScreen) {
+          document.webkitCancelFullScreen();
+        } else if (document.mozCancelFullScreen) {
+          document.mozCancelFullScreen();
+        } else if (document.msExitFullscreen) {
+          document.msExitFullscreen();
+        }
+      } else {
+        if (element.requestFullscreen) {
+          element.requestFullscreen();
+        } else if (element.webkitRequestFullScreen) {
+          element.webkitRequestFullScreen();
+        } else if (element.mozRequestFullScreen) {
+          element.mozRequestFullScreen();
+        } else if (element.msRequestFullscreen) {
+          // IE11
+          element.msRequestFullscreen();
+        }
+      }
+      this.fullscreen = !this.fullscreen;
+    },
+  },
+  mounted() {
+    if (document.body.clientWidth < 1500) {
+      this.collapseChage();
+    }
+  },
+};
+</script>
+<style scoped>
+.header {
+  position: relative;
+  box-sizing: border-box;
+  width: 100%;
+  height: 60px;
+  font-size: 22px;
+  color: #fff;
+}
+.collapse-btn {
+  float: left;
+  padding: 0 21px;
+  cursor: pointer;
+  line-height: 60px;
+}
+.header .logo {
+  float: left;
+  width: 25%;
+  line-height: 60px;
+}
+.header-right {
+  float: right;
+  padding-right: 50px;
+}
+.header-user-con {
+  display: flex;
+  height: 60px;
+  align-items: center;
+}
+.btn-fullscreen {
+  transform: rotate(45deg);
+  margin-right: 5px;
+  font-size: 24px;
+}
+.btn-bell,
+.btn-fullscreen {
+  position: relative;
+  width: 30px;
+  height: 30px;
+  text-align: center;
+  border-radius: 15px;
+  cursor: pointer;
+}
+.btn-bell-badge {
+  position: absolute;
+  right: 0;
+  top: -2px;
+  width: 8px;
+  height: 8px;
+  border-radius: 4px;
+  background: #f56c6c;
+  color: #fff;
+}
+.btn-bell .el-icon-bell {
+  color: #fff;
+}
+.user-name {
+  margin-left: 10px;
+}
+.user-avator {
+  margin-left: 20px;
+}
+.user-avator img {
+  display: block;
+  width: 40px;
+  height: 40px;
+  border-radius: 50%;
+}
+.el-dropdown-link {
+  color: #fff;
+  cursor: pointer;
+}
+.el-dropdown-menu__item {
+  text-align: center;
+}
+.btn {
+  margin: 0 0 0 10px;
+}
+.btn button:hover {
+  cursor: pointer;
+  background-color: #409eff;
+  color: #fff;
+}
+.btn button i {
+  font-size: 25px;
+}
+</style>

+ 90 - 149
src/components/common/Header.vue

@@ -1,86 +1,48 @@
 <template>
-  <div class="header">
-    <!-- 折叠按钮 -->
-    <div class="collapse-btn" @click="collapseChage">
-      <i v-if="!collapse" class="el-icon-s-fold"></i>
-      <i v-else class="el-icon-s-unfold"></i>
-    </div>
-    <div class="logo">成果评价系统-管理中心</div>
-    <div class="header-right">
-      <div class="header-user-con">
-        <!-- 全屏显示 -->
-        <div class="btn-fullscreen" @click="handleFullScreen">
-          <el-tooltip effect="dark" :content="fullscreen ? `取消全屏` : `全屏`" placement="bottom">
-            <i class="el-icon-rank"></i>
-          </el-tooltip>
-        </div>
-        <!-- 用户头像 -->
-        <div class="user-avator">
+  <div id="Header">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="12" class="left">
+          <div class="collapse-btn" @click="collapseChage">
+            <i v-if="!collapse" class="el-icon-s-fold"></i>
+            <i v-else class="el-icon-s-unfold"></i>
+          </div>
+          <div class="logo">管理中心</div>
+        </el-col>
+        <el-col :span="12" class="right">
           <img src="../../assets/img/img.jpg" />
-        </div>
-        <!-- 用户名下拉菜单 -->
-        <el-dropdown class="user-name" trigger="hover">
-          <span class="el-dropdown-link">
-            {{ user.name || '游客' }}
-          </span>
-        </el-dropdown>
-        <div class="btn">
+          <span> {{ user ? user.name : '游客' }}</span>
           <button @click="loginout"><i class="el-icon-switch-button"></i></button>
-        </div>
-      </div>
-    </div>
+        </el-col>
+      </el-col>
+    </el-row>
   </div>
 </template>
+
 <script>
-import bus from '../common/bus';
 import { mapState, createNamespacedHelpers } from 'vuex';
+import bus from '../common/bus';
 export default {
-  data() {
+  name: 'Header',
+  props: {},
+  components: {},
+  data: function() {
     return {
       collapse: false,
       fullscreen: false,
     };
   },
-  computed: {
-    ...mapState(['user']),
-  },
+  created() {},
   methods: {
-    // 用户名下拉菜单选择事件
-    loginout() {
-      localStorage.removeItem('token');
-      this.$router.push('/login');
-    },
     // 侧边栏折叠
     collapseChage() {
       this.collapse = !this.collapse;
       bus.$emit('collapse', this.collapse);
     },
-    // 全屏事件
-    handleFullScreen() {
-      let element = document.documentElement;
-      if (this.fullscreen) {
-        if (document.exitFullscreen) {
-          document.exitFullscreen();
-        } else if (document.webkitCancelFullScreen) {
-          document.webkitCancelFullScreen();
-        } else if (document.mozCancelFullScreen) {
-          document.mozCancelFullScreen();
-        } else if (document.msExitFullscreen) {
-          document.msExitFullscreen();
-        }
-      } else {
-        if (element.requestFullscreen) {
-          element.requestFullscreen();
-        } else if (element.webkitRequestFullScreen) {
-          element.webkitRequestFullScreen();
-        } else if (element.mozRequestFullScreen) {
-          element.mozRequestFullScreen();
-        } else if (element.msRequestFullscreen) {
-          // IE11
-          element.msRequestFullscreen();
-        }
-      }
-      this.fullscreen = !this.fullscreen;
+    // 用户名下拉菜单选择事件
+    loginout() {
+      localStorage.removeItem('token');
+      this.$router.push('/login');
     },
   },
   mounted() {
@@ -88,92 +50,71 @@ export default {
       this.collapseChage();
     }
   },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
 };
 </script>
-<style scoped>
-.header {
-  position: relative;
-  box-sizing: border-box;
-  width: 100%;
-  height: 60px;
-  font-size: 22px;
-  color: #fff;
-}
-.collapse-btn {
-  float: left;
-  padding: 0 21px;
-  cursor: pointer;
-  line-height: 60px;
-}
-.header .logo {
-  float: left;
-  width: 25%;
-  line-height: 60px;
-}
-.header-right {
-  float: right;
-  padding-right: 50px;
-}
-.header-user-con {
-  display: flex;
-  height: 60px;
-  align-items: center;
-}
-.btn-fullscreen {
-  transform: rotate(45deg);
-  margin-right: 5px;
-  font-size: 24px;
-}
-.btn-bell,
-.btn-fullscreen {
-  position: relative;
-  width: 30px;
-  height: 30px;
-  text-align: center;
-  border-radius: 15px;
-  cursor: pointer;
-}
-.btn-bell-badge {
-  position: absolute;
-  right: 0;
-  top: -2px;
-  width: 8px;
-  height: 8px;
-  border-radius: 4px;
-  background: #f56c6c;
-  color: #fff;
-}
-.btn-bell .el-icon-bell {
-  color: #fff;
-}
-.user-name {
-  margin-left: 10px;
-}
-.user-avator {
-  margin-left: 20px;
-}
-.user-avator img {
-  display: block;
-  width: 40px;
-  height: 40px;
-  border-radius: 50%;
-}
-.el-dropdown-link {
-  color: #fff;
-  cursor: pointer;
-}
-.el-dropdown-menu__item {
-  text-align: center;
-}
-.btn {
-  margin: 0 0 0 10px;
-}
-.btn button:hover {
-  cursor: pointer;
-  background-color: #409eff;
-  color: #fff;
-}
-.btn button i {
-  font-size: 25px;
+
+<style lang="less" scoped>
+.main {
+  background-color: #242f42;
+  .left {
+    .collapse-btn {
+      float: left;
+      padding: 2px 21px;
+      cursor: pointer;
+      line-height: 60px;
+      i {
+        font-size: 22px;
+        color: #fff;
+      }
+    }
+    .logo {
+      float: left;
+      width: 25%;
+      line-height: 60px;
+      font-size: 22px;
+      color: #fff;
+    }
+  }
+  .right {
+    text-align: right;
+    padding: 0 2%;
+    img {
+      width: 50px;
+      height: 50px;
+      border-radius: 90px;
+      position: relative;
+      top: 5px;
+    }
+    span {
+      position: relative;
+      top: -12px;
+      font-size: 18px;
+      color: #fff;
+    }
+    button {
+      top: -10px;
+      position: relative;
+      left: 5px;
+      i {
+        font-size: 20px;
+      }
+    }
+    button:hover {
+      cursor: pointer;
+    }
+  }
 }
 </style>

+ 1 - 12
src/components/common/Sidebar.vue

@@ -44,7 +44,6 @@
 <script>
 import _ from 'lodash';
 import { mapState, createNamespacedHelpers } from 'vuex';
-const { mapActions: menu } = createNamespacedHelpers('menu');
 import bus from '../common/bus';
 export default {
   data() {
@@ -74,9 +73,9 @@ export default {
     });
   },
   methods: {
-    ...menu(['query']),
     // 分配用户彩带权限
     async getMenu() {
+      // 客户信息
       let user = this.user;
       let list = _.cloneDeep(this.items);
       let data = [
@@ -89,16 +88,6 @@ export default {
       list.push(...data);
       this.$set(this, `items`, _.uniqBy(list, 'index'));
     },
-    // 查询成果数
-    async searchNum() {
-      let role = this.user.role;
-      if (role == undefined) {
-        let res = await this.queryNum(this.user.id);
-        if (this.$checkRes(res)) {
-          this.$set(this, `num`, res.data);
-        }
-      }
-    },
   },
   watch: {
     user: {

+ 10 - 0
src/router/index.js

@@ -26,6 +26,16 @@ export default new Router({
           component: () => import('../views/question/index.vue'),
           meta: { title: '问卷管理' },
         },
+        {
+          path: '/question/detail',
+          component: () => import('../views/question/detail.vue'),
+          meta: { title: '问卷信息管理' },
+        },
+        {
+          path: '/question/setQuestion',
+          component: () => import('../views/question/setQuestion.vue'),
+          meta: { title: '设置问卷' },
+        },
       ],
     },
     {

+ 7 - 0
src/store/index.js

@@ -4,6 +4,10 @@ import * as ustate from './user/state';
 import * as umutations from './user/mutations';
 // 管理员
 import adminLogin from './adminLogin';
+// 问卷调查
+import answer from '@common/src/store/question/answer';
+import question from '@common/src/store/question/question';
+import questionnaire from '@common/src/store/question/questionnaire';
 
 Vue.use(Vuex);
 
@@ -13,5 +17,8 @@ export default new Vuex.Store({
   actions: {},
   modules: {
     adminLogin,
+    answer,
+    question,
+    questionnaire,
   },
 });

+ 91 - 0
src/views/question/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: '/question' });
+    },
+  },
+  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>

+ 83 - 16
src/views/question/index.vue

@@ -2,37 +2,104 @@
   <div id="index">
     <el-row>
       <el-col :span="24" class="main">
-        test
+        <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: {},
-  data: function() {
-    return {};
+  components: {
+    dataTable,
   },
-  created() {},
-  methods: {},
-  computed: {
-    ...mapState(['user']),
+  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,
+    };
   },
-  metaInfo() {
-    return { title: this.$route.meta.title };
+  async created() {
+    await this.search();
   },
-  watch: {
-    test: {
-      deep: true,
-      immediate: true,
-      handler(val) {},
+  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: '/question/setQuestion', query: { id: data.id } });
+    },
+    // 添加
+    add() {
+      this.$router.push({ path: '/question/detail' });
+    },
+    // 修改
+    toEdit({ data }) {
+      this.$router.push({ path: '/question/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></style>
+<style lang="less" scoped>
+.main {
+  .add {
+    text-align: right;
+    margin: 0 0 10px 0;
+  }
+}
+</style>

+ 238 - 0
src/views/question/setQuestion.vue

@@ -0,0 +1,238 @@
+<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.name }} </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-col>
+              <el-col :span="24" class="checkbox" v-else-if="item.type == '1'">
+                <el-checkbox v-for="(item, index) in item.select" :key="index" disabled>{{ 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-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.name"></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="8" class="list" v-for="(item, index) in form.select" :key="index">
+                  选项:<span>{{ item.num }}</span> 答案:<span>{{ item.name }}</span
+                  >;
+                </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="8" class="list" v-for="(item, index) in form.select" :key="index">
+                  选项:<span>{{ item.num }}</span> 答案:<span>{{ item.name }}</span
+                  >;
+                </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-dialog>
+    <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: questionnaire } = createNamespacedHelpers('questionnaire');
+export default {
+  name: 'setQuestion',
+  props: {},
+  components: {},
+  data: function() {
+    return {
+      info: {},
+      // 添加题目
+      dialog: false,
+      form: {
+        select: [],
+      },
+      // 选项
+      selectDialog: false,
+      selectForm: {},
+    };
+  },
+  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, `info`, res.data);
+        }
+      }
+    },
+    back() {
+      this.$router.push({ paht: '/question' });
+    },
+    // 添加题目
+    add() {
+      this.dialog = true;
+    },
+    // 保存
+    async onSubmit() {
+      let data = {};
+      let questions = _.cloneDeep(this.info.questions);
+      questions.push(this.form);
+      data.questions = questions;
+      data.id = this.id;
+      let res = await this.update(data);
+      if (this.$checkRes(res)) {
+        this.handleClose();
+      }
+    },
+    // 取消保存
+    handleClose() {
+      this.form = {};
+      this.dialog = false;
+      this.search();
+    },
+    // 保存选项
+    selectSubmit() {
+      let data = this.selectForm;
+      this.form.select.push(data);
+      this.selectClose();
+    },
+    // 取消保存选项
+    selectClose() {
+      this.selectForm = {};
+      this.selectDialog = false;
+      this.search();
+    },
+  },
+  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;
+        }
+      }
+    }
+  }
+}
+.radio {
+  .left {
+    .list {
+      color: #666;
+      font-size: 16px;
+      span {
+        font-weight: bold;
+        padding: 0 0 0 6px;
+      }
+      span:nth-child(2) {
+        color: #ff0000;
+      }
+    }
+  }
+  .right {
+    text-align: right;
+  }
+}
+</style>

+ 5 - 0
vue.config.js

@@ -24,6 +24,11 @@ module.exports = {
       '/files': {
         target: 'http://broadcast.waityou24.cn',
       },
+      '/api/question': {
+        target: 'http://192.168.1.19:9104',
+        changeOrigin: true,
+        ws: false,
+      },
       '/api': {
         target: 'http://broadcast.waityou24.cn',
         changeOrigin: true,