reloaded 5 years ago
parent
commit
38077c7386

+ 3 - 0
src/main.js

@@ -8,7 +8,10 @@ import '@/plugins/check-res';
 import '@/plugins/setting';
 import '@/plugins/setting';
 import '@/plugins/element';
 import '@/plugins/element';
 import InitStomp from '@/plugins/stomp';
 import InitStomp from '@/plugins/stomp';
+import '@frame/icon/iconfont.css';
 Vue.config.productionTip = false;
 Vue.config.productionTip = false;
+import Print from '@/util/print';
+Vue.use(Print); //注册
 
 
 new Vue({
 new Vue({
   router,
   router,

+ 22 - 2
src/router/index.js

@@ -35,10 +35,22 @@ const routes = [
       },
       },
       {
       {
         path: '/classes/index',
         path: '/classes/index',
-        name: 'classes_list',
-        meta: { title: '班级', sub: '管理' },
+        name: 'classes_index',
+        meta: { title: '班级管理' },
         component: () => import('@/views/classes/index.vue'),
         component: () => import('@/views/classes/index.vue'),
       },
       },
+      {
+        path: '/classes/list',
+        name: 'classes_list',
+        meta: { title: '班级列表' },
+        component: () => import('@/views/classes/classes.vue'),
+      },
+      {
+        path: '/classes/qingjia',
+        name: 'classes_qingjia',
+        meta: { title: '请假管理' },
+        component: () => import('@/views/classes/qingjia.vue'),
+      },
       {
       {
         path: '/classes/name/list',
         path: '/classes/name/list',
         name: 'classes_name_list',
         name: 'classes_name_list',
@@ -57,6 +69,14 @@ const routes = [
         meta: { title: '班级', sub: '寝室' },
         meta: { title: '班级', sub: '寝室' },
         component: () => import('@/views/classes/bedroom.vue'),
         component: () => import('@/views/classes/bedroom.vue'),
       },
       },
+      // 新增-打印名单
+
+      {
+        path: '/classes/namCard',
+        name: 'classes_namCard',
+        meta: { title: '班级', sub: '学生名单' },
+        component: () => import('@/views/classes/namCard.vue'),
+      },
       {
       {
         path: '/classes/attendance',
         path: '/classes/attendance',
         name: 'classes_attendance',
         name: 'classes_attendance',

+ 2 - 0
src/store/index.js

@@ -16,6 +16,7 @@ import lesson from '@frame/store/lesson';
 import director from '@frame/store/director';
 import director from '@frame/store/director';
 import termquest from '@frame/store/termquest';
 import termquest from '@frame/store/termquest';
 import questionnaire from '@frame/store/questionnaire';
 import questionnaire from '@frame/store/questionnaire';
+import bedroom from '@frame/store/bedroom';
 import login from '@frame/store/login';
 import login from '@frame/store/login';
 import util from '@frame/store/util';
 import util from '@frame/store/util';
 import attendance from "@frame/store/attendance";
 import attendance from "@frame/store/attendance";
@@ -44,6 +45,7 @@ export default new Vuex.Store({
     lesson,
     lesson,
     util,
     util,
     attendance,
     attendance,
+    bedroom,
   },
   },
   state: { ...ustate },
   state: { ...ustate },
   mutations: { ...umutations },
   mutations: { ...umutations },

+ 135 - 0
src/util/print.js

@@ -0,0 +1,135 @@
+// 打印类属性、方法定义
+/* eslint-disable */
+const Print = function (dom, options) {
+  if (!(this instanceof Print)) return new Print(dom, options);
+
+  this.options = this.extend({
+    'noPrint': '.no-print'
+  }, options);
+
+  if ((typeof dom) === "string") {
+    this.dom = document.querySelector(dom);
+  } else {
+    this.isDOM(dom)
+    this.dom = this.isDOM(dom) ? dom : dom.$el;
+  }
+
+  this.init();
+};
+Print.prototype = {
+  init: function () {
+    var content = this.getStyle() + this.getHtml();
+    this.writeIframe(content);
+  },
+  extend: function (obj, obj2) {
+    for (var k in obj2) {
+      obj[k] = obj2[k];
+    }
+    return obj;
+  },
+
+  getStyle: function () {
+    var str = "",
+      styles = document.querySelectorAll('style,link');
+    for (var i = 0; i < styles.length; i++) {
+      str += styles[i].outerHTML;
+    }
+    str += "<style>" + (this.options.noPrint ? this.options.noPrint : '.no-print') + "{display:none;}</style>";
+
+    return str;
+  },
+
+  getHtml: function () {
+    var inputs = document.querySelectorAll('input');
+    var textareas = document.querySelectorAll('textarea');
+    var selects = document.querySelectorAll('select');
+
+    for (var k = 0; k < inputs.length; k++) {
+      if (inputs[k].type == "checkbox" || inputs[k].type == "radio") {
+        if (inputs[k].checked == true) {
+          inputs[k].setAttribute('checked', "checked")
+        } else {
+          inputs[k].removeAttribute('checked')
+        }
+      } else if (inputs[k].type == "text") {
+        inputs[k].setAttribute('value', inputs[k].value)
+      } else {
+        inputs[k].setAttribute('value', inputs[k].value)
+      }
+    }
+
+    for (var k2 = 0; k2 < textareas.length; k2++) {
+      if (textareas[k2].type == 'textarea') {
+        textareas[k2].innerHTML = textareas[k2].value
+      }
+    }
+
+    for (var k3 = 0; k3 < selects.length; k3++) {
+      if (selects[k3].type == 'select-one') {
+        var child = selects[k3].children;
+        for (var i in child) {
+          if (child[i].tagName == 'OPTION') {
+            if (child[i].selected == true) {
+              child[i].setAttribute('selected', "selected")
+            } else {
+              child[i].removeAttribute('selected')
+            }
+          }
+        }
+      }
+    }
+
+    return this.dom.outerHTML;
+  },
+
+  writeIframe: function (content) {
+    var w, doc, iframe = document.createElement('iframe'),
+      f = document.body.appendChild(iframe);
+    iframe.id = "myIframe";
+    //iframe.style = "position:absolute;width:0;height:0;top:-10px;left:-10px;";
+    iframe.setAttribute('style', 'position:absolute;width:0;height:0;top:-10px;left:-10px;');
+    w = f.contentWindow || f.contentDocument;
+    doc = f.contentDocument || f.contentWindow.document;
+    doc.open();
+    doc.write(content);
+    doc.close();
+    var _this = this
+    iframe.onload = function(){
+      _this.toPrint(w);
+      setTimeout(function () {
+        document.body.removeChild(iframe)
+      }, 100)
+    }
+  },
+
+  toPrint: function (frameWindow) {
+    try {
+      setTimeout(function () {
+        frameWindow.focus();
+        try {
+          if (!frameWindow.document.execCommand('print', false, null)) {
+            frameWindow.print();
+          }
+        } catch (e) {
+          frameWindow.print();
+        }
+        frameWindow.close();
+      }, 10);
+    } catch (err) {
+      console.log('err', err);
+    }
+  },
+  isDOM: (typeof HTMLElement === 'object') ?
+    function (obj) {
+      return obj instanceof HTMLElement;
+    } :
+    function (obj) {
+      return obj && typeof obj === 'object' && obj.nodeType === 1 && typeof obj.nodeName === 'string';
+    }
+};
+const MyPlugin = {}
+MyPlugin.install = function (Vue, options) {
+  // 4. 添加实例方法
+  Vue.prototype.$print = Print
+}
+export default MyPlugin

+ 47 - 6
src/views/classes/bedroom.vue

@@ -1,47 +1,88 @@
 <template>
 <template>
   <div id="bedroom">
   <div id="bedroom">
-    <detail-frame title="寝室安排" returns="/classes/index">
+    <detail-frame title="寝室安排" :returns="toreturn">
       <data-table :fields="fields" :data="list">
       <data-table :fields="fields" :data="list">
         <template #custom="{item, row}">
         <template #custom="{item, row}">
           <template v-if="item.prop === 'studentList'">
           <template v-if="item.prop === 'studentList'">
             <el-row type="flex" justify="left">
             <el-row type="flex" justify="left">
-              <el-col :span="6" v-for="(stud, index) in row.studentList" :key="index">{{ stud }}</el-col>
+              <el-col :span="6" v-for="(stud, index) in row.stus" :key="index" @click.native="changeRoom(stud)">{{ stud.name }}</el-col>
             </el-row>
             </el-row>
           </template>
           </template>
         </template>
         </template>
       </data-table>
       </data-table>
     </detail-frame>
     </detail-frame>
+    <el-dialog :visible.sync="dialog" title="修改寝室" @close="toClose" width="30%">
+      <data-form :data="form" :fields="turnBedRoomFields" :rules="{}" @save="turnSave">
+        <template #options="{item,form}">
+          <template v-if="item.model == 'bedroom'">
+            <template v-for="(i, index) in list">
+              <el-option v-if="i.bedroom" :key="index" :label="`${i.bedroom}`" :value="i.bedroom"></el-option>
+            </template>
+          </template>
+        </template>
+      </data-form>
+    </el-dialog>
   </div>
   </div>
 </template>
 </template>
 
 
 <script>
 <script>
+import _ from 'lodash';
 import { mapActions, mapState, createNamespacedHelpers } from 'vuex';
 import { mapActions, mapState, createNamespacedHelpers } from 'vuex';
 import dataTable from '@frame/components/data-table';
 import dataTable from '@frame/components/data-table';
+import dataForm from '@frame/components/form';
 import detailFrame from '@frame/layout/admin/detail-frame';
 import detailFrame from '@frame/layout/admin/detail-frame';
-const { mapActions: student } = createNamespacedHelpers('student'); //班级
+const { mapActions: bedroom } = createNamespacedHelpers('bedroom'); //班级
+const { mapActions: student } = createNamespacedHelpers('student');
 export default {
 export default {
   metaInfo: { title: '寝室安排' },
   metaInfo: { title: '寝室安排' },
   name: 'bedroom',
   name: 'bedroom',
   props: {},
   props: {},
-  components: { detailFrame, dataTable },
+  components: { detailFrame, dataTable, dataForm },
   data: () => ({
   data: () => ({
+    dialog: false,
     fields: [
     fields: [
       { label: '寝室号', prop: 'bedroom', options: { width: `150px` } },
       { label: '寝室号', prop: 'bedroom', options: { width: `150px` } },
       { label: '寝室人员', prop: 'studentList', custom: true },
       { label: '寝室人员', prop: 'studentList', custom: true },
     ],
     ],
+    turnBedRoomFields: [
+      { label: '姓名', model: 'name', type: 'text' },
+      { label: '学校', model: 'school_name', type: 'text' },
+      { label: '寝室', model: 'bedroom', type: 'select' },
+    ],
     list: [],
     list: [],
+    form: {},
   }),
   }),
   created() {
   created() {
     this.search();
     this.search();
   },
   },
   methods: {
   methods: {
-    ...student(['bedRoom']),
+    ...student({ getStudentList: 'query', updateStudent: 'update', removeClass: 'removeClass' }),
+    ...bedroom(['getClassList']),
     async search() {
     async search() {
-      let res = await this.bedRoom({ classid: this.id });
+      let res = await this.getClassList(this.id);
       if (this.$checkRes(res)) {
       if (this.$checkRes(res)) {
         this.$set(this, `list`, res.data);
         this.$set(this, `list`, res.data);
       }
       }
     },
     },
+    //转寝保存
+    async turnSave({ data }) {
+      let res = await this.updateStudent(data);
+      if (this.$checkRes(res, `转寝成功`, res.errmsg || `转寝失败`)) {
+        this.search();
+        this.toClose();
+      }
+    },
+    toreturn() {
+      window.history.go(-1);
+    },
+    changeRoom(stu) {
+      this.$set(this, `form`, _.cloneDeep(stu));
+      this.dialog = true;
+    },
+    toClose() {
+      this.dialog = false;
+      this.form = {};
+    },
   },
   },
   computed: {
   computed: {
     id() {
     id() {

+ 145 - 0
src/views/classes/classes.vue

@@ -0,0 +1,145 @@
+<template>
+  <div id="index">
+    <list-frame title="班级管理" returns="/classes/index" :needPage="false" :needFilter="false" :needAdd="false">
+      <el-card style="padding:10px">
+        <el-row>
+          <el-col :span="20">
+            <el-form :inline="true" size="mini">
+              <el-form-item label="期">
+                <el-select v-model="selectInfo.termid" placeholder="请选择期数" @change="getBatch">
+                  <el-option v-for="(i, index) in termList" :key="index" :label="`第${i.term}期`" :value="i._id"></el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="批次">
+                <el-select v-model="selectInfo.batchid" placeholder="请先选择期数" @change="getClasses">
+                  <el-option v-for="(i, index) in batchList" :key="index" :label="i.name" :value="i._id"></el-option>
+                </el-select>
+              </el-form-item>
+            </el-form>
+          </el-col>
+        </el-row>
+        <span class="iconfont iconqingjiashenqing"></span>
+        <data-table
+          :fields="fields"
+          :data="list"
+          :opera="opera"
+          @edit="toEdit"
+          @completion="toCompletion"
+          @lesson="toLesson"
+          @bedRoom="toBedRoom"
+          @qingjia="toQj"
+        ></data-table>
+      </el-card>
+    </list-frame>
+  </div>
+</template>
+
+<script>
+import listFrame from '@frame/layout/admin/list-frame';
+import dataTable from '@frame/components/data-table';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: trainPlan } = createNamespacedHelpers('trainplan');
+const { mapActions: classes } = createNamespacedHelpers('classes');
+export default {
+  metaInfo: { title: '班级管理' },
+  name: 'index',
+  props: {},
+  components: {
+    listFrame,
+    dataTable,
+  },
+  data: () => ({
+    selectInfo: {},
+    termList: [],
+    batchList: [],
+    list: [],
+    opera: [
+      {
+        label: '班级名单',
+        icon: 'el-icon-user',
+        method: 'edit',
+      },
+      {
+        label: '查看问卷进度',
+        icon: 'el-icon-s-order',
+        method: 'completion',
+      },
+      {
+        label: '查看课程表',
+        icon: 'el-icon-date',
+        method: 'lesson',
+      },
+      {
+        label: '查看寝室',
+        icon: 'el-icon-s-home',
+        method: 'bedRoom',
+      },
+      {
+        label: '请假管理',
+        icon: 'iconfont iconqingjia',
+        method: 'qingjia',
+      },
+    ],
+    fields: [
+      { label: '班级名称', prop: 'name' },
+      { label: '人数', prop: 'number' },
+      { label: '班级类型', prop: 'type', format: i => (i === '1' ? '特殊班级' : '正常班级') },
+    ],
+    total: 0,
+  }),
+  created() {
+    this.search();
+  },
+  computed: {
+    ...mapState(['user']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  methods: {
+    ...trainPlan(['fetch']),
+    ...classes(['query', 'delete']),
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      const res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        let { termnum } = res.data;
+        this.$set(this, `termList`, termnum);
+      }
+    },
+    getBatch(termid) {
+      let batchs = this.termList.filter(f => f._id === termid);
+      if (batchs.length > 0) {
+        let { batchnum } = batchs[0];
+        this.$set(this, `batchList`, batchnum);
+      }
+    },
+    //根据批次id,查询下面的班级
+    async getClasses(data) {
+      const res = await this.query({ batchid: data, headteacherid: this.user.userid });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+      }
+    },
+    toEdit({ data }) {
+      this.$router.push({ path: '/classes/name/list', query: { id: data.id } });
+    },
+    toCompletion({ data }) {
+      this.$router.push({ path: '/question/completion', query: { id: data.id } });
+    },
+    toLesson({ data }) {
+      this.$router.push({ path: '/classes/lesson', query: { id: data.id } });
+    },
+    toBedRoom({ data }) {
+      this.$router.push({ path: '/classes/bedroom', query: { id: data.id } });
+    },
+    toQj({ data }) {
+      this.$router.push({ path: '/classes/qingjia', query: { id: data.id } });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 4 - 1
src/views/classes/completion.vue

@@ -1,6 +1,6 @@
 <template>
 <template>
   <div id="completion">
   <div id="completion">
-    <detail-frame :title="mainTitle" returns="/classes/index">
+    <detail-frame :title="mainTitle" :returns="toreturn">
       <!-- <el-alert :title="`进度:${student.answertotal || 0}/${student.alltotal || 0}`" :closable="false"></el-alert> -->
       <!-- <el-alert :title="`进度:${student.answertotal || 0}/${student.alltotal || 0}`" :closable="false"></el-alert> -->
       <self-cards title="问卷列表" v-if="views === `quest`">
       <self-cards title="问卷列表" v-if="views === `quest`">
         <dataTable :fields="questFields" :data="questList" :opera="opera" @view="data => toView(data, 'term')"></dataTable>
         <dataTable :fields="questFields" :data="questList" :opera="opera" @view="data => toView(data, 'term')"></dataTable>
@@ -92,6 +92,9 @@ export default {
     toReturns() {
     toReturns() {
       this.views = 'quest';
       this.views = 'quest';
     },
     },
+    toreturn() {
+      window.history.go(-1);
+    },
   },
   },
   computed: {
   computed: {
     id() {
     id() {

+ 53 - 78
src/views/classes/index.vue

@@ -1,110 +1,85 @@
 <template>
 <template>
   <div id="index">
   <div id="index">
-    <list-frame title="班级管理" @query="search" :total="total" :filter="filFields" :needFilter="false" :needAdd="false">
-      <data-table
-        :fields="fields"
-        :data="list"
-        :opera="opera"
-        @edit="toEdit"
-        @completion="toCompletion"
-        @lesson="toLesson"
-        @bedRoom="toBedRoom"
-        @attendance="toAttendance"
-        @leave="toLeave"
-      ></data-table>
+    <list-frame :title="pageTitle" @query="search" :total="total" :needFilter="false" :needAdd="false">
+      <data-table :fields="fields" :data="list" :opera="opera" @view="toClasses"></data-table>
     </list-frame>
     </list-frame>
   </div>
   </div>
 </template>
 </template>
 
 
 <script>
 <script>
+var moment = require('moment');
+import _ from 'lodash';
+import Vue from 'vue';
 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/data-table';
 import { mapState, createNamespacedHelpers } from 'vuex';
 import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: trainplan } = createNamespacedHelpers('trainplan');
 const { mapActions: classes } = createNamespacedHelpers('classes');
 const { mapActions: classes } = createNamespacedHelpers('classes');
 export default {
 export default {
-  metaInfo: { title: '班级管理' },
   name: 'index',
   name: 'index',
   props: {},
   props: {},
-  components: {
-    listFrame,
-    dataTable,
+  components: { listFrame, dataTable },
+  data: () => {
+    return {
+      dialog: false,
+      drawer: false,
+      opera: [
+        {
+          label: '班级列表',
+          icon: 'el-icon-view',
+          method: 'view',
+        },
+      ],
+      fields: [
+        { label: '年度', prop: 'year' },
+        { label: '标题', prop: 'title' },
+        { label: '状态', prop: 'status', format: i => (i === '0' ? '筹备中' : i === '1' ? '进行中' : '已结束') },
+      ],
+      info: {},
+      form: {},
+      rules: {},
+      list: [],
+      holiday: [],
+      total: 0,
+    };
   },
   },
-  data: () => ({
-    opera: [
-      {
-        label: '班级名单',
-        icon: 'el-icon-user',
-        method: 'edit',
-      },
-      {
-        label: '查看问卷进度',
-        icon: 'el-icon-s-order',
-        method: 'completion',
-      },
-      {
-        label: '查看课程表',
-        icon: 'el-icon-date',
-        method: 'lesson',
-      },
-      {
-        label: '查看寝室',
-        icon: 'el-icon-s-home',
-        method: 'bedRoom',
-      },
-      {
-        label: '查看考勤情况',
-        icon: 'el-icon-map-location',
-        method: 'attendance',
-      },
-      {
-        label: '查看请假情况',
-        icon: 'el-icon-timer',
-        method: 'leave',
-      },
-    ],
-    fields: [
-      { label: '班级名称', prop: 'name' },
-      { label: '人数', prop: 'number' },
-      { label: '班级类型', prop: 'type', format: i => (i === '0' ? '正常班级' : '特殊班级') },
-    ],
-    filFields: [],
-    list: [],
-    total: 0,
-  }),
   created() {
   created() {
     this.search();
     this.search();
   },
   },
-  computed: {
-    ...mapState(['user']),
-  },
   methods: {
   methods: {
-    ...classes(['query', 'delete']),
+    ...trainplan(['query', 'create', 'delete', 'update', 'notice']),
+    ...classes({ getClasses: 'query' }),
     async search({ skip = 0, limit = 10, ...info } = {}) {
     async search({ skip = 0, limit = 10, ...info } = {}) {
-      const res = await this.query({ skip, limit, ...info, headteacherid: this.user.userid || '' });
+      const res = await this.query({ skip, limit, ...info });
       if (this.$checkRes(res)) {
       if (this.$checkRes(res)) {
         this.$set(this, `list`, res.data);
         this.$set(this, `list`, res.data);
         this.$set(this, `total`, res.total);
         this.$set(this, `total`, res.total);
       }
       }
     },
     },
-    toEdit({ data }) {
-      this.$router.push({ path: '/classes/name/list', query: { id: data.id } });
-    },
-    toCompletion({ data }) {
-      this.$router.push({ path: '/question/completion', query: { id: data.id } });
-    },
-    toLesson({ data }) {
-      this.$router.push({ path: '/classes/lesson', query: { id: data.id } });
-    },
-    toBedRoom({ data }) {
-      this.$router.push({ path: '/classes/bedroom', query: { id: data.id } });
+    toClasses({ data }) {
+      this.$router.push({ path: './list', query: { id: data.id } });
     },
     },
-    toAttendance({ data }) {
-      this.$router.push({ path: '/classes/attendance', query: { id: data.id } });
+    async sendMsg({ data }) {
+      //TODO need test
+      let res = await this.getClasses({ planid: data._id });
+      if (this.$checkRes(res)) {
+        let arr = res.data.map(i => i._id);
+        if (arr.length > 0) {
+          const resNotice = await this.sendNotice({ classids: arr });
+          this.$checkRes(resNotice, '发送成功', '发送失败');
+        }
+      }
     },
     },
-    toLeave({ data }) {
-      this.$router.push({ path: '/classes/leave', query: { id: data.id } });
+  },
+  computed: {
+    ...mapState(['user']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
     },
     },
   },
   },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
 };
 };
 </script>
 </script>
 
 

+ 29 - 28
src/views/classes/lesson.vue

@@ -1,38 +1,36 @@
 <template>
 <template>
   <div id="lesson-table">
   <div id="lesson-table">
-    <el-card>
-      <template #header>
-        <el-row type="flex" align="middle" justify="space-between">
-          <el-col :span="4">课程安排</el-col>
-        </el-row>
-      </template>
-      <el-table :data="lessonList" border stripe>
-        <el-table-column align="center" label="时间" prop="time"></el-table-column>
-        <el-table-column align="center" v-for="(i, index) in dateList" :key="index" :label="i" :prop="`subname_day${index + 1}`">
-          <template v-slot="{ row, $index }">
-            <el-row>
-              <el-col :span="24">{{ getProp(row, `subname_day${index + 1}`) }}</el-col>
-              <el-col
-                @click.native="searchTeacher(getProp(row, `teaid_day${index + 1}`))"
-                class="teaname"
-                :span="24"
-                v-if="getProp(row, `teaname_day${index + 1}`)"
-                >{{ getProp(row, `teaname_day${index + 1}`) }}</el-col
-              >
-            </el-row>
-          </template>
-        </el-table-column>
-      </el-table>
-      <el-dialog title="教师信息" :visible.sync="dialogVisible">
-        <teacherForm :teacherId="teacherId" style="height:1200px;"></teacherForm>
-      </el-dialog>
-    </el-card>
+    <detail-frame title="课程安排" :returns="toreturn">
+      <el-card>
+        <el-table :data="lessonList" border stripe>
+          <el-table-column align="center" label="时间" prop="time"></el-table-column>
+          <el-table-column align="center" v-for="(i, index) in dateList" :key="index" :label="i" :prop="`subname_day${index + 1}`">
+            <template v-slot="{ row, $index }">
+              <el-row>
+                <el-col :span="24">{{ getProp(row, `subname_day${index + 1}`) }}</el-col>
+                <el-col
+                  @click.native="searchTeacher(getProp(row, `teaid_day${index + 1}`))"
+                  class="teaname"
+                  :span="24"
+                  v-if="getProp(row, `teaname_day${index + 1}`)"
+                  >{{ getProp(row, `teaname_day${index + 1}`) }}</el-col
+                >
+              </el-row>
+            </template>
+          </el-table-column>
+        </el-table>
+        <el-dialog title="教师信息" :visible.sync="dialogVisible">
+          <teacherForm :teacherId="teacherId" style="height:1200px;"></teacherForm>
+        </el-dialog>
+      </el-card>
+    </detail-frame>
   </div>
   </div>
 </template>
 </template>
 
 
 <script>
 <script>
 var moment = require('moment');
 var moment = require('moment');
 import _ from 'lodash';
 import _ from 'lodash';
+import detailFrame from '@frame/layout/admin/detail-frame';
 import teacherForm from '@frame/parts/teacher';
 import teacherForm from '@frame/parts/teacher';
 import { mapState, createNamespacedHelpers } from 'vuex';
 import { mapState, createNamespacedHelpers } from 'vuex';
 const { mapActions: lesson } = createNamespacedHelpers('lesson');
 const { mapActions: lesson } = createNamespacedHelpers('lesson');
@@ -47,7 +45,7 @@ export default {
   props: {
   props: {
     classInfo: { type: Object, default: () => {} },
     classInfo: { type: Object, default: () => {} },
   },
   },
-  components: { teacherForm },
+  components: { teacherForm, detailFrame },
   data: function() {
   data: function() {
     var that = this;
     var that = this;
     return {
     return {
@@ -195,6 +193,9 @@ export default {
       this.teacherId = id;
       this.teacherId = id;
       console.log(id);
       console.log(id);
     },
     },
+    toreturn() {
+      window.history.go(-1);
+    },
   },
   },
   computed: {
   computed: {
     ...mapState(['user']),
     ...mapState(['user']),

+ 270 - 0
src/views/classes/namCard.vue

@@ -0,0 +1,270 @@
+<template>
+  <div id="namCard">
+    <detail-frame :title="mainTitle" :returns="toreturn">
+      <el-col :span="24" class="printingBtn">
+        <el-button type="primary" size="mini" @click="toPrint()">打印名牌</el-button>
+      </el-col>
+      <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>
+    </detail-frame>
+  </div>
+</template>
+
+<script>
+import detailFrame from '@frame/layout/admin/detail-frame';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions } = createNamespacedHelpers('student');
+export default {
+  metaInfo: { title: '学生名单' },
+  name: 'name-list',
+  props: {},
+  components: {
+    detailFrame,
+  },
+  data: function() {
+    return {
+      list: [
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟顾',
+        },
+        {
+          name: '顾红伟顾红',
+        },
+        {
+          name: '顾红伟顾红伟',
+        },
+        {
+          name: '顾红伟顾红伟顾',
+        },
+        {
+          name: '顾红伟顾红伟顾红',
+        },
+        {
+          name: '顾红伟顾红伟顾红伟',
+        },
+        {
+          name: '顾红伟顾红伟顾红伟顾',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+        {
+          name: '顾红伟',
+        },
+      ],
+    };
+  },
+  created() {},
+  methods: {
+    ...mapActions(['query']),
+    async search() {
+      const res = await this.query({ classid: this.id });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+      }
+    },
+    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: {
+    id: {
+      handler(val) {
+        if (val) this.search();
+      },
+      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>

+ 17 - 2
src/views/classes/name-list.vue

@@ -1,6 +1,9 @@
 <template>
 <template>
   <div id="name-list">
   <div id="name-list">
-    <list-frame :title="mainTitle" @query="search" :total="total" :needFilter="false" returns="/classes/index" :needAdd="false">
+    <list-frame :title="mainTitle" @query="search" :total="total" :needFilter="false" :returns="toreturn" :needAdd="false">
+      <el-col :span="24" class="printingBtn">
+        <el-button type="primary" size="mini" @click="toPrint()">打印名牌</el-button>
+      </el-col>
       <data-table :fields="fields" :data="list" :opera="opera" @edit="toEdit" @delete="toDelete" @post="toPost"></data-table>
       <data-table :fields="fields" :data="list" :opera="opera" @edit="toEdit" @delete="toDelete" @post="toPost"></data-table>
     </list-frame>
     </list-frame>
     <el-drawer title="任职" :visible.sync="drawer" direction="rtl" @close="toClose">
     <el-drawer title="任职" :visible.sync="drawer" direction="rtl" @close="toClose">
@@ -134,6 +137,13 @@ export default {
       this.drawer = false;
       this.drawer = false;
       this.form = {};
       this.form = {};
     },
     },
+    toreturn() {
+      window.history.go(-1);
+    },
+    // 打印名牌
+    toPrint() {
+      this.$router.push({ path: '/classes/namCard', query: { id: this.id } });
+    },
   },
   },
   computed: {
   computed: {
     id() {
     id() {
@@ -158,4 +168,9 @@ export default {
 };
 };
 </script>
 </script>
 
 
-<style lang="less" scoped></style>
+<style lang="less" scoped>
+.printingBtn {
+  text-align: right;
+  padding: 10px 0;
+}
+</style>

+ 34 - 0
src/views/classes/qingjia.vue

@@ -0,0 +1,34 @@
+<template>
+  <div id="qingjia">
+    <list-frame :title="pageTitle" @query="search" :total="total" :needFilter="false" :returns="toreturn" :needAdd="false"> </list-frame>
+  </div>
+</template>
+
+<script>
+import _ from 'lodash';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: mapLeave } = createNamespacedHelpers('leave');
+export default {
+  name: 'qingjia',
+  props: {},
+  components: {},
+  data: function() {
+    return {};
+  },
+  created() {},
+  methods: {
+    async search({ skip = 0, limit = 10, ...info } = {}) {},
+  },
+  computed: {
+    ...mapState(['user']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 1 - 1
src/views/register/login.vue

@@ -1,6 +1,6 @@
 <template>
 <template>
   <div id="login">
   <div id="login">
-    <login-detail></login-detail>
+    <login-detail title="培训会-班主任端登录"></login-detail>
   </div>
   </div>
 </template>
 </template>