浏览代码

Merge branch 'master' of http://git.cc-lotus.info/new_train/train-center

guhongwei 5 年之前
父节点
当前提交
e8a04b41ef

+ 4 - 1
package.json

@@ -20,6 +20,7 @@
     "core-js": "^3.4.4",
     "core-js": "^3.4.4",
     "echarts": "^4.8.0",
     "echarts": "^4.8.0",
     "element-ui": "^2.13.0",
     "element-ui": "^2.13.0",
+    "file-saver": "^2.0.2",
     "jsonwebtoken": "^8.5.1",
     "jsonwebtoken": "^8.5.1",
     "lodash": "^4.17.15",
     "lodash": "^4.17.15",
     "moment": "^2.26.0",
     "moment": "^2.26.0",
@@ -30,7 +31,8 @@
     "vue-meta": "^2.3.1",
     "vue-meta": "^2.3.1",
     "vue-router": "^3.1.3",
     "vue-router": "^3.1.3",
     "vuex": "^3.1.2",
     "vuex": "^3.1.2",
-    "wangeditor": "^3.1.1"
+    "wangeditor": "^3.1.1",
+    "xlsx": "^0.16.2"
   },
   },
   "devDependencies": {
   "devDependencies": {
     "@vue/cli-plugin-babel": "^4.1.0",
     "@vue/cli-plugin-babel": "^4.1.0",
@@ -46,6 +48,7 @@
     "less": "^3.0.4",
     "less": "^3.0.4",
     "less-loader": "^5.0.0",
     "less-loader": "^5.0.0",
     "prettier": "^1.19.1",
     "prettier": "^1.19.1",
+    "script-loader": "^0.7.2",
     "vue-template-compiler": "^2.6.10"
     "vue-template-compiler": "^2.6.10"
   },
   },
   "eslintConfig": {
   "eslintConfig": {

+ 12 - 6
src/router/index.js

@@ -384,6 +384,12 @@ const statistics = [
     meta: { title: '问卷统计' },
     meta: { title: '问卷统计' },
     component: () => import('@/views/statistics/detail.vue'),
     component: () => import('@/views/statistics/detail.vue'),
   },
   },
+  {
+    path: '/statistics/question/class',
+    name: 'statistics_question_class',
+    meta: { title: '问卷-按班级统计' },
+    component: () => import('@/views/statistics/class-index.vue'),
+  },
 ];
 ];
 
 
 const routes = [
 const routes = [
@@ -455,12 +461,12 @@ const routes = [
     meta: { title: '全年计划', sub: '管理' },
     meta: { title: '全年计划', sub: '管理' },
     component: () => import('@/views/yearPlan/index.vue'),
     component: () => import('@/views/yearPlan/index.vue'),
   },
   },
-  {
-    path: '/student/name/card',
-    name: 'student_name_card',
-    meta: { title: '学生名签' },
-    component: () => import('@/views/student/namCard.vue'),
-  },
+  // {
+  //   path: '/student/name/card',
+  //   name: 'student_name_card',
+  //   meta: { title: '学生名签' },
+  //   component: () => import('@/views/student/namCard.vue'),
+  // },
   // 教师甄选注册账号
   // 教师甄选注册账号
   {
   {
     path: '/teaRegister',
     path: '/teaRegister',

+ 73 - 0
src/views/statistics/class-index.vue

@@ -0,0 +1,73 @@
+<template>
+  <div id="class-index">
+    <detail-frame :title="querys.title" :returns="toReturns" @query="search">
+      <data-table :fields="fields" :data="list" :opera="opera" @data="toData" :usePage="false"></data-table>
+    </detail-frame>
+  </div>
+</template>
+
+<script>
+import _ from 'lodash';
+import detailFrame from '@frame/layout/admin/detail-frame';
+import dataTable from '@frame/components/filter-page-table';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: classes } = createNamespacedHelpers('classes');
+export default {
+  name: 'class-index',
+  props: {},
+  components: {
+    detailFrame,
+    dataTable,
+  },
+  data: function() {
+    return {
+      opera: [
+        {
+          label: '查看结果',
+          method: 'data',
+        },
+      ],
+      fields: [
+        { label: '期', prop: 'term' },
+        { label: '批', prop: 'batch' },
+        { label: '班级', prop: 'name' },
+      ],
+      list: [],
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...classes(['query']),
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      let res = await this.query({ ...info, termid: this.querys.termid });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+      }
+    },
+    toData({ data }) {
+      let { questionnaireid } = this.querys;
+      this.$router.push({ path: './detail', query: { questionnaireid, classid: data._id } });
+    },
+    toReturns() {
+      window.history.go(-1);
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+    querys() {
+      // 期id:termid, 问卷id: questionnaireid
+      return this.$route.query;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 40 - 7
src/views/statistics/detail.vue

@@ -1,6 +1,6 @@
 <template>
 <template>
   <div id="detail">
   <div id="detail">
-    <detail-frame :title="pageTitle" returns="./index">
+    <detail-frame :title="pageTitle" :returns="toReturns">
       <el-card :header="quest.name">
       <el-card :header="quest.name">
         <el-tabs v-model="tabs" :stretch="true" type="card">
         <el-tabs v-model="tabs" :stretch="true" type="card">
           <el-tab-pane label="图表分析" name="chart">
           <el-tab-pane label="图表分析" name="chart">
@@ -13,11 +13,16 @@
               style="text-align:center;border-bottom: 1px solid #EBEEF5;"
               style="text-align:center;border-bottom: 1px solid #EBEEF5;"
             >
             >
               <el-col :span="24">
               <el-col :span="24">
-                <charts :data="quest"></charts>
+                <charts :data="quest" :nodata="nodata"></charts>
               </el-col>
               </el-col>
             </el-row>
             </el-row>
           </el-tab-pane>
           </el-tab-pane>
           <el-tab-pane label="具体数据" name="data">
           <el-tab-pane label="具体数据" name="data">
+            <el-row type="flex" align="middle" justify="end" style="margin-bottom:20px">
+              <el-col :span="2">
+                <el-button size="mini" type="primary" @click="toExcel">导出数据</el-button>
+              </el-col>
+            </el-row>
             <el-collapse v-model="collapse" accordion>
             <el-collapse v-model="collapse" accordion>
               <el-collapse-item v-for="(data, qi) in cdata" :key="qi" :title="data.studentname" :name="`${qi}`">
               <el-collapse-item v-for="(data, qi) in cdata" :key="qi" :title="data.studentname" :name="`${qi}`">
                 <el-row type="flex" align="middle" justify="center" style="border-bottom: 1px solid #EBEEF5;">
                 <el-row type="flex" align="middle" justify="center" style="border-bottom: 1px solid #EBEEF5;">
@@ -35,9 +40,10 @@
 </template>
 </template>
 
 
 <script>
 <script>
+//组件全部转移到frame中,和班主任端共用
 import _ from 'lodash';
 import _ from 'lodash';
-import charts from './g2/quest-chart.vue';
-import reports from './g2/report.vue';
+import charts from '@frame/parts/statistics/quest-chart.vue';
+import reports from '@frame/parts/statistics/report.vue';
 import detailFrame from '@frame/layout/admin/detail-frame';
 import detailFrame from '@frame/layout/admin/detail-frame';
 import { mapState, createNamespacedHelpers } from 'vuex';
 import { mapState, createNamespacedHelpers } from 'vuex';
 const { mapActions: questionnaire } = createNamespacedHelpers('questionnaire');
 const { mapActions: questionnaire } = createNamespacedHelpers('questionnaire');
@@ -54,6 +60,7 @@ export default {
       collapse: '',
       collapse: '',
       quest: {},
       quest: {},
       cdata: [], //具体数据
       cdata: [], //具体数据
+      nodata: false,
     };
     };
   },
   },
   created() {
   created() {
@@ -67,7 +74,9 @@ export default {
       if (!this.$checkRes(res)) return;
       if (!this.$checkRes(res)) return;
       let ansres = await this.query(this.querys); //{ questionnaireid: this.id, termid: this.termid, batchid: this.batchid, classid: this.classid }
       let ansres = await this.query(this.querys); //{ questionnaireid: this.id, termid: this.termid, batchid: this.batchid, classid: this.classid }
       if (this.$checkRes(ansres)) {
       if (this.$checkRes(ansres)) {
-        if (_.get(ansres.data, 'length', 0) <= 0) return;
+        if (_.get(ansres.data, 'length', 0) <= 0) {
+          this.$set(this, `nodata`, true);
+        }
         let data = _.cloneDeep(_.get(res, 'data'));
         let data = _.cloneDeep(_.get(res, 'data'));
         let quests = _.cloneDeep(_.get(res.data, `question`, []));
         let quests = _.cloneDeep(_.get(res.data, `question`, []));
         let allAnswer = _.cloneDeep(ansres.data);
         let allAnswer = _.cloneDeep(ansres.data);
@@ -106,7 +115,7 @@ export default {
       let ga = _.groupBy(rl, 'answer');
       let ga = _.groupBy(rl, 'answer');
       quest.option.map(i => {
       quest.option.map(i => {
         let r = _.get(ga[i.opname], 'length', 0);
         let r = _.get(ga[i.opname], 'length', 0);
-        i.value = r;
+        i.value = r || 0;
         return i;
         return i;
       });
       });
       return quest;
       return quest;
@@ -116,7 +125,7 @@ export default {
       let mid = _.flatten(rl.map(i => i.answer));
       let mid = _.flatten(rl.map(i => i.answer));
       quest.option.map(i => {
       quest.option.map(i => {
         let r = mid.filter(f => f == i.opname);
         let r = mid.filter(f => f == i.opname);
-        i.value = r.length;
+        i.value = r.length || 0;
         return i;
         return i;
       });
       });
       return quest;
       return quest;
@@ -138,6 +147,30 @@ export default {
       });
       });
       return danswers;
       return danswers;
     },
     },
+    toReturns() {
+      window.history.go(-1);
+    },
+    //导出excel数据
+    toExcel() {
+      const { export_json_to_excel } = require('@frame/excel/Export2Excel');
+      let duplicate = _.cloneDeep(this.cdata);
+      let data = [];
+      for (const dup of duplicate) {
+        const elm = { studentname: dup.studentname };
+        for (const answer of dup.answers) {
+          elm[answer.questionid] = answer.answer;
+        }
+        data.push(elm);
+      }
+      let dquest = _.cloneDeep(this.quest.question);
+      let qarr = dquest.map(i => ({ questionid: i._id, topic: i.topic }));
+      let tHeader = qarr.map(i => i.topic);
+      tHeader.unshift('学生姓名');
+      let filterVal = qarr.map(i => i.questionid);
+      filterVal.unshift('studentname');
+      data = data.map(v => filterVal.map(j => v[j]));
+      export_json_to_excel(tHeader, data, this.quest.name);
+    },
   },
   },
   computed: {
   computed: {
     ...mapState(['user']),
     ...mapState(['user']),

+ 8 - 6
src/views/statistics/g2/quest-chart.vue

@@ -17,7 +17,7 @@
           </el-table>
           </el-table>
         </el-col>
         </el-col>
       </el-row>
       </el-row>
-      <el-row type="flex" align="middle" justify="center" class="btn_bar" :gutter="10">
+      <el-row type="flex" align="middle" justify="center" class="btn_bar" :gutter="10" v-if="!nodata">
         <el-col :span="3" v-for="(i, index) in btnList" :key="index">
         <el-col :span="3" v-for="(i, index) in btnList" :key="index">
           <el-button :type="btnModel[i.model] ? 'primary' : ''" size="mini" @click="changeModel(i.model)">
           <el-button :type="btnModel[i.model] ? 'primary' : ''" size="mini" @click="changeModel(i.model)">
             {{ i.text }}
             {{ i.text }}
@@ -47,15 +47,16 @@
 
 
 <script>
 <script>
 import _ from 'lodash';
 import _ from 'lodash';
-import g2column from './column.vue';
-import g2pie from './pie.vue';
-import g2donut from './donut.vue';
-import g2bar from './bar.vue';
+import g2column from '@frame/parts/statistics/column.vue';
+import g2pie from '@frame/parts/statistics/pie.vue';
+import g2donut from '@frame/parts/statistics/donut.vue';
+import g2bar from '@frame/parts/statistics/bar.vue';
 import { mapState, createNamespacedHelpers } from 'vuex';
 import { mapState, createNamespacedHelpers } from 'vuex';
 export default {
 export default {
   name: 'quest-chart',
   name: 'quest-chart',
   props: {
   props: {
     data: { type: [Object, Array], default: () => [] },
     data: { type: [Object, Array], default: () => [] },
+    nodata: { type: Boolean, default: false },
   },
   },
   components: { g2column, g2pie, g2donut, g2bar },
   components: { g2column, g2pie, g2donut, g2bar },
   data: function() {
   data: function() {
@@ -97,7 +98,8 @@ export default {
       this.$forceUpdate();
       this.$forceUpdate();
     },
     },
     getPercent(num) {
     getPercent(num) {
-      let all = this.data.option.reduce((prev, next) => prev + next.value * 1, 0);
+      let all = this.data.option.reduce((prev, next) => prev + next.value * 1 || 0, 0);
+      if (all == 0) return 0;
       let percent = (num * 1) / all;
       let percent = (num * 1) / all;
       percent = _.round(percent, 4) * 100;
       percent = _.round(percent, 4) * 100;
       return percent;
       return percent;

+ 10 - 3
src/views/statistics/index.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
   <div id="index">
   <div id="index">
     <list-frame title="问卷列表页" @query="search" :needPag="false" :filter="filFields" :needAdd="false">
     <list-frame title="问卷列表页" @query="search" :needPag="false" :filter="filFields" :needAdd="false">
-      <data-table :fields="fields" :data="list" :opera="opera" @data="toData"></data-table>
+      <data-table :fields="fields" :data="list" :opera="opera" @data="toData" @toClass="toClass" :usePage="false"></data-table>
     </list-frame>
     </list-frame>
   </div>
   </div>
 </template>
 </template>
@@ -9,7 +9,7 @@
 <script>
 <script>
 import _ from 'lodash';
 import _ from 'lodash';
 import listFrame from '@frame/layout/admin/list-frame';
 import listFrame from '@frame/layout/admin/list-frame';
-import dataTable from '@frame/components/data-table';
+import dataTable from '@frame/components/filter-page-table';
 import { mapState, createNamespacedHelpers } from 'vuex';
 import { mapState, createNamespacedHelpers } from 'vuex';
 const { mapActions: questionnaire } = createNamespacedHelpers('questionnaire');
 const { mapActions: questionnaire } = createNamespacedHelpers('questionnaire');
 const { mapActions: util } = createNamespacedHelpers('util');
 const { mapActions: util } = createNamespacedHelpers('util');
@@ -25,9 +25,12 @@ export default {
     opera: [
     opera: [
       {
       {
         label: '查看结果',
         label: '查看结果',
-        icon: 'el-icon-s-data',
         method: 'data',
         method: 'data',
       },
       },
+      {
+        label: '按班级查看',
+        method: 'toClass',
+      },
     ],
     ],
     fields: [
     fields: [
       { label: '问卷标题', prop: 'name' },
       { label: '问卷标题', prop: 'name' },
@@ -75,6 +78,10 @@ export default {
       this.$checkRes(res, '删除成功', '删除失败');
       this.$checkRes(res, '删除成功', '删除失败');
       this.search();
       this.search();
     },
     },
+    toClass({ data }) {
+      let termid = _.get(this.defaultOption, 'termid');
+      this.$router.push({ path: '/statistics/question/class', query: { termid, questionnaireid: data._id, title: data.name } });
+    },
   },
   },
   watch: {
   watch: {
     defaultOption: {
     defaultOption: {

+ 0 - 115
src/views/student/namCard.vue

@@ -1,115 +0,0 @@
-<template>
-  <div id="namCard">
-    <el-row type="flex" align="middle" justify="center" class="btn_bar">
-      <!-- <el-col :span="4" class="printingBtn">
-        <el-button type="primary" size="mini" icon="el-icon-arrow-left" @click="now--" :disabled="now == 0">上一班</el-button>
-      </el-col> -->
-      <el-col :span="4" class="printingBtn">
-        <el-button type="primary" size="mini" @click="toPrint()">打印名牌</el-button>
-      </el-col>
-      <!-- <el-col :span="4" class="printingBtn">
-        <el-button type="primary" size="mini" icon="el-icon-arrow-right" @click="now++" :disabled="now == csList.length - 1">下一班</el-button>
-      </el-col> -->
-    </el-row>
-
-    <!-- <el-col :span="24" class="info" ref="print">
-      <el-col :span="6" class="list" v-for="(item, index) in list" :key="index">
-        <p>
-          <span>吉林省高校学生就业能力扩展训练</span><span>第{{ item.termname }}期</span><span>{{ item.classname }}</span>
-        </p>
-        <p>{{ item.name }}</p>
-      </el-col>
-    </el-col> -->
-    <el-col :span="24" class="info" ref="print">
-      <el-col :span="6" class="list" v-for="(item, index) in csList[now]" :key="index">
-        <p>
-          <span>吉林省高校学生就业能力扩展训练</span><span>第{{ item.termname }}期</span><span>{{ item.classname }}</span>
-        </p>
-        <p>{{ item.name }}</p>
-      </el-col>
-    </el-col>
-  </div>
-</template>
-
-<script>
-import _ from 'lodash';
-import { mapState, createNamespacedHelpers } from 'vuex';
-const { mapActions } = createNamespacedHelpers('student');
-export default {
-  metaInfo: { title: '学生名单' },
-  name: 'name-list',
-  props: { list: { type: Array, default: () => [] } },
-  components: {},
-  data: function() {
-    return {
-      csList: [],
-      now: 0,
-      nowList: [],
-    };
-  },
-  created() {},
-  methods: {
-    ...mapActions(['query']),
-    groupByClass() {
-      let duplicate = _.cloneDeep(this.list);
-      let group = _.flatten(_.toPairs(_.groupBy(duplicate, 'classid'))).filter(f => _.isArray(f));
-      this.$set(this, `csList`, group);
-    },
-    toPrint() {
-      this.$print(this.$refs.print);
-    },
-    toreturn() {
-      window.history.go(-1);
-    },
-  },
-  computed: {
-    id() {
-      return this.$route.query.id;
-    },
-    mainTitle() {
-      let meta = this.$route.meta;
-      let main = meta.title || '';
-      let sub = meta.sub || '';
-      let title = main + sub;
-      return title;
-    },
-  },
-  watch: {
-    list: {
-      handler(val) {
-        if (val) this.groupByClass();
-      },
-      immediate: true,
-    },
-  },
-};
-</script>
-
-<style lang="less" scoped>
-// .info {
-//   width: 714px;
-// }
-.list {
-  width: 171px;
-  height: 140px;
-  border: 1px dashed #333;
-  margin: 0 8px 10px 0;
-  padding: 5px 5px;
-  p {
-    float: left;
-    width: 100%;
-    text-align: center;
-    font-size: 12px;
-    padding: 0 0 10px 0;
-  }
-  p:last-child {
-    font-size: 25px;
-    letter-spacing: 5px;
-    padding: 0;
-  }
-}
-.printingBtn {
-  text-align: center;
-  padding: 10px 0;
-}
-</style>

+ 0 - 53
src/views/train-plan/parts/print-sign.vue

@@ -1,53 +0,0 @@
-<template>
-  <div id="print-sign">
-    <el-row type="flex" align="middle" justify="end" class="btn_bar">
-      <el-col :span="4" class="printingBtn">
-        <el-button type="primary" size="mini" @click="toPrint()">打印报到表</el-button>
-      </el-col>
-    </el-row>
-    <el-row type="flex" align="middle" justify="center" style="text-align:center">
-      <el-col :span="24" style="width:1060px;border: solid #cecece;">
-        <el-table border stripe :data="list" ref="print" size="small" style="border: solid #cecece;">
-          <el-table-column align="center" label="姓名" prop="name" width="170"></el-table-column>
-          <el-table-column align="center" label="学校" prop="school_name" width="150"></el-table-column>
-          <el-table-column align="center" label="性别" prop="gender" width="80"></el-table-column>
-          <el-table-column align="center" label="民族" prop="nation" width="150"></el-table-column>
-          <el-table-column align="center" label="班级" prop="classname" width="80"></el-table-column>
-          <el-table-column align="center" label="手机号" prop="phone" width="150"></el-table-column>
-          <el-table-column align="center" label="签名"></el-table-column>
-        </el-table>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script>
-import { mapState, createNamespacedHelpers } from 'vuex';
-export default {
-  name: 'print-sign',
-  props: {
-    list: { type: Array, default: () => [] },
-  },
-  components: {},
-  data: function() {
-    return {};
-  },
-  created() {},
-  methods: {
-    toPrint() {
-      this.$print(this.$refs.print);
-    },
-  },
-  computed: {
-    ...mapState(['user']),
-    pageTitle() {
-      return `${this.$route.meta.title}`;
-    },
-  },
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-};
-</script>
-
-<style lang="less" scoped></style>

+ 0 - 111
src/views/train-plan/parts/test.vue

@@ -1,111 +0,0 @@
-<template>
-  <div id="test">
-    <el-row :gutter="12">
-      <el-col :offset="8" :span="8">
-        <el-card shadow="always">
-          <div slot="header" class="clearfix">
-            <span>简单实例</span>
-          </div>
-
-          <div>
-            <el-form label-width="80px">
-              <el-form-item label="名字">
-                <el-input v-model="from.name"></el-input>
-              </el-form-item>
-              <el-form-item label="条形码">
-                <el-input v-model="from.code"></el-input>
-              </el-form-item>
-              <el-form-item label="页数">
-                <el-input-number v-model="from.num" controls-position="right" :min="1" :max="10"> </el-input-number>
-              </el-form-item>
-              <el-form-item>
-                <el-button type="primary" @click="print">生成打印文件</el-button>
-                <el-button v-if="url" type="success" @click="openPdf">
-                  打开生成文件
-                </el-button>
-              </el-form-item>
-            </el-form>
-          </div>
-        </el-card>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script>
-import _ from 'lodash';
-import printTemplate from 'print-template';
-import { mapState, createNamespacedHelpers } from 'vuex';
-export default {
-  name: 'test',
-  props: {
-    list: { type: Array, default: () => [] },
-  },
-  components: {},
-  data: function() {
-    return {
-      url: '',
-      template: null,
-      from: { num: 1, name: '张三', code: 'YT121212323' },
-      zhengshu: require('@/assets/zhengshu.jpg'),
-    };
-  },
-  created() {
-    this.init();
-  },
-  methods: {
-    init() {
-      this.template = new printTemplate();
-      this.template.push({
-        name: 'expressDelivery1',
-        unit: 'mm',
-        size: [210, 297],
-        fixed: [{ type: 'image', x: 0, y: 0, default: this.zhengshu, width: 210, height: 297 }],
-
-        data: {
-          school_name: { type: 'text', x: 15, y: 15, fontSize: 3.5 },
-          entry_year: { type: 'text', x: 56, y: 55, fontSize: 3.5 },
-          major: { type: 'text', x: 107, y: 105, fontSize: 3.5 },
-          name: { type: 'text', x: 158, y: 155, fontSize: 3.5 },
-          termname: { type: 'text', x: 15, y: 255, fontSize: 3.5 },
-          cernum: { type: 'text', x: 100, y: 250, fontSize: 3.5 },
-        },
-      });
-    },
-    openPdf() {
-      let link = document.createElement('a');
-      link.href = this.url;
-      link.target = '_blank';
-      link.click();
-    },
-    print() {
-      let data = [];
-      this.url = null;
-      let duplicate = _.cloneDeep(this.list);
-      duplicate = duplicate.map(i => {
-        i.cernum = `2020${i.termname}${i.classname}`;
-        return i;
-      });
-      this.template.print('expressDelivery1', [duplicate[0]]).then(pdf => {
-        if (pdf) {
-          this.$message.success('生成成功');
-          this.url = pdf.output('bloburi', { filename: '证书' });
-        } else {
-          this.$message.warring('生成失败');
-        }
-      });
-    },
-  },
-  computed: {
-    ...mapState(['user']),
-    pageTitle() {
-      return `${this.$route.meta.title}`;
-    },
-  },
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-};
-</script>
-
-<style lang="less" scoped></style>

+ 3 - 3
src/views/train-plan/print.vue

@@ -51,10 +51,10 @@
 <script>
 <script>
 import _ from 'lodash';
 import _ from 'lodash';
 import axios from 'axios';
 import axios from 'axios';
-import signList from './parts/print-sign';
 import dataTable from '@frame/components/filter-page-table';
 import dataTable from '@frame/components/filter-page-table';
-import nameCard from '@/views/student/namCard.vue';
-import certCard from '@/views/student/certCard.vue';
+import signList from '@frame/parts/print/print-sign';
+import nameCard from '@frame/parts/print/namCard.vue';
+import certCard from '@frame/parts/print/certCard.vue';
 import lessonTable from '@frame/parts/time-table.vue';
 import lessonTable from '@frame/parts/time-table.vue';
 import listFrame from '@frame/layout/admin/list-frame';
 import listFrame from '@frame/layout/admin/list-frame';
 import detailFrame from '@frame/layout/admin/detail-frame';
 import detailFrame from '@frame/layout/admin/detail-frame';

+ 37 - 10
src/views/work/look.vue

@@ -1,6 +1,6 @@
 <template>
 <template>
   <div id="index">
   <div id="index">
-    <list-frame :title="`${title}-作业题`" returns="/work/index" @query="search" :needPag="false" :needFilter="false" @add="toAdd">
+    <list-frame :title="`${title}-作业题`" :returns="toReturns" @query="search" :needPag="false" :needFilter="false" @add="toAdd">
       <el-row type="flex" justify="end" style="padding-bottom:1.875rem;">
       <el-row type="flex" justify="end" style="padding-bottom:1.875rem;">
         <el-col :span="3">
         <el-col :span="3">
           <el-button type="primary" @click="submit" size="small">保存作业</el-button>
           <el-button type="primary" @click="submit" size="small">保存作业</el-button>
@@ -11,7 +11,7 @@
     <el-dialog title="作业题" :visible.sync="dialog" @close="toClose">
     <el-dialog title="作业题" :visible.sync="dialog" @close="toClose">
       <el-form ref="infoForm" :model="info" :rules="rules" label-width="120px" size="small" @submit.native.prevent>
       <el-form ref="infoForm" :model="info" :rules="rules" label-width="120px" size="small" @submit.native.prevent>
         <el-form-item label="类型" :required="true" prop="type">
         <el-form-item label="类型" :required="true" prop="type">
-          <el-radio-group v-model="info.type">
+          <el-radio-group v-model="info.type" @change="changeAnswer">
             <el-radio v-for="(item, index) in radios" :key="index" :label="item.code">{{ item.name }}</el-radio>
             <el-radio v-for="(item, index) in radios" :key="index" :label="item.code">{{ item.name }}</el-radio>
           </el-radio-group>
           </el-radio-group>
         </el-form-item>
         </el-form-item>
@@ -42,12 +42,20 @@
           </el-row>
           </el-row>
         </el-form-item>
         </el-form-item>
         <el-form-item label="答案" prop="answer" v-if="info.type === '0' || info.type === '1'">
         <el-form-item label="答案" prop="answer" v-if="info.type === '0' || info.type === '1'">
-          <el-input v-model="info.answer"></el-input>
+          <template v-if="info.type === '0'">
+            <el-radio-group v-model="answer">
+              <el-radio v-for="(i, index) in info.option" :key="index" :label="i.number">{{ i.number }}</el-radio>
+            </el-radio-group>
+          </template>
+          <template v-if="info.type === '1'">
+            <el-checkbox-group v-model="answer">
+              <el-checkbox v-for="(i, index) in info.option" :key="index" :label="i.number">{{ i.number }}</el-checkbox>
+            </el-checkbox-group>
+          </template>
+          <!-- <el-input v-model="info.answer"></el-input> -->
         </el-form-item>
         </el-form-item>
         <el-form-item label="分数" prop="score">
         <el-form-item label="分数" prop="score">
-          <el-tooltip effect="dark" content="请填写选项的内容,多选用 ; 隔开" placement="bottom">
-            <el-input v-model="info.score"></el-input>
-          </el-tooltip>
+          <el-input v-model="info.score"></el-input>
         </el-form-item>
         </el-form-item>
         <el-form-item>
         <el-form-item>
           <el-row type="flex" justify="center">
           <el-row type="flex" justify="center">
@@ -94,6 +102,7 @@ export default {
     oIsNew: true,
     oIsNew: true,
     dialog: false,
     dialog: false,
     drawer: false,
     drawer: false,
+    answer: '',
     opera: [
     opera: [
       {
       {
         label: '编辑',
         label: '编辑',
@@ -126,7 +135,7 @@ export default {
         list: [
         list: [
           { label: '单选', value: 0 },
           { label: '单选', value: 0 },
           { label: '多选', value: 1 },
           { label: '多选', value: 1 },
-          { label: '问答', value: 2 },
+          // { label: '问答', value: 2 },
         ],
         ],
       },
       },
       {
       {
@@ -157,7 +166,7 @@ export default {
     radios: [
     radios: [
       { code: '0', name: '单选' },
       { code: '0', name: '单选' },
       { code: '1', name: '多选' },
       { code: '1', name: '多选' },
-      { code: '2', name: '简答' },
+      // { code: '2', name: '简答' },
     ],
     ],
     total: 0,
     total: 0,
   }),
   }),
@@ -193,10 +202,15 @@ export default {
     handleSave() {
     handleSave() {
       this.$refs['infoForm'].validate(valid => {
       this.$refs['infoForm'].validate(valid => {
         if (valid) {
         if (valid) {
+          let duplicate = _.cloneDeep(this.info);
+          if (duplicate.type == 0) duplicate.answer = _.clone(this.answer);
+          else {
+            duplicate.answer = _.join(_.clone(this.answer), ';');
+          }
           if (this.isNew) {
           if (this.isNew) {
-            this.list.push(JSON.parse(JSON.stringify(this.info)));
+            this.list.push(duplicate);
           } else {
           } else {
-            let { index, ...data } = JSON.parse(JSON.stringify(this.info));
+            let { index, ...data } = duplicate;
             this.$set(this.list, index, data);
             this.$set(this.list, index, data);
           }
           }
           this.toClose();
           this.toClose();
@@ -208,6 +222,10 @@ export default {
     toEdit({ data, index }) {
     toEdit({ data, index }) {
       data.index = index;
       data.index = index;
       this.info = JSON.parse(JSON.stringify(data));
       this.info = JSON.parse(JSON.stringify(data));
+      let answer = _.get(this.info, `answer`);
+      let type = _.get(this.info, `type`);
+      if (type == 0) this.$set(this, `answer`, answer);
+      else this.$set(this, `answer`, answer.split(';'));
       this.isNew = false;
       this.isNew = false;
       this.dialog = true;
       this.dialog = true;
     },
     },
@@ -216,6 +234,7 @@ export default {
     },
     },
     toClose() {
     toClose() {
       this.dialog = false;
       this.dialog = false;
+      this.answer = undefined;
       this.info = {};
       this.info = {};
       this.$refs.infoForm.resetFields();
       this.$refs.infoForm.resetFields();
     },
     },
@@ -253,6 +272,14 @@ export default {
         this.$router.push({ path: '/work/index' });
         this.$router.push({ path: '/work/index' });
       }
       }
     },
     },
+    //改变answer类型
+    changeAnswer(type) {
+      if (type == 0) this.answer = '';
+      if (type == 1) this.answer = [];
+    },
+    toReturns() {
+      window.history.go(-1);
+    },
   },
   },
 };
 };
 </script>
 </script>