lrf402788946 5 jaren geleden
bovenliggende
commit
3e70c6b09a

+ 1 - 0
src/main.js

@@ -8,6 +8,7 @@ import '@/plugins/check-res';
 import '@/plugins/setting';
 import '@/plugins/element';
 import InitStomp from '@/plugins/stomp';
+import '@frame/icon/iconfont.css';
 Vue.config.productionTip = false;
 
 new Vue({

+ 14 - 2
src/router/index.js

@@ -35,10 +35,22 @@ const routes = [
       },
       {
         path: '/classes/index',
-        name: 'classes_list',
-        meta: { title: '班级', sub: '管理' },
+        name: 'classes_index',
+        meta: { title: '班级管理' },
         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',
         name: 'classes_name_list',

+ 1 - 1
src/store/index.js

@@ -17,7 +17,7 @@ import director from '@frame/store/director';
 import termquest from '@frame/store/termquest';
 import questionnaire from '@frame/store/questionnaire';
 import login from '@frame/store/login';
-import util from "@frame/store/util";
+import util from '@frame/store/util';
 import * as ustate from '@frame/store/user/state';
 import * as umutations from '@frame/store/user/mutations';
 Vue.use(Vuex);

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

@@ -1,6 +1,6 @@
 <template>
   <div id="bedroom">
-    <detail-frame title="寝室安排" returns="/classes/index">
+    <detail-frame title="寝室安排" :returns="toreturn">
       <data-table :fields="fields" :data="list">
         <template #custom="{item, row}">
           <template v-if="item.prop === 'studentList'">
@@ -42,6 +42,9 @@ export default {
         this.$set(this, `list`, res.data);
       }
     },
+    toreturn() {
+      window.history.go(-1);
+    },
   },
   computed: {
     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>
   <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> -->
       <self-cards title="问卷列表" v-if="views === `quest`">
         <dataTable :fields="questFields" :data="questList" :opera="opera" @view="data => toView(data, 'term')"></dataTable>
@@ -92,6 +92,9 @@ export default {
     toReturns() {
       this.views = 'quest';
     },
+    toreturn() {
+      window.history.go(-1);
+    },
   },
   computed: {
     id() {

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

@@ -1,84 +1,85 @@
 <template>
   <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"></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>
   </div>
 </template>
 
 <script>
+var moment = require('moment');
+import _ from 'lodash';
+import Vue from 'vue';
 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,
+  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',
-      },
-    ],
-    fields: [
-      { label: '班级名称', prop: 'name' },
-      { label: '人数', prop: 'number' },
-      { label: '班级类型', prop: 'type', format: i => (i === '0' ? '正常班级' : '特殊班级') },
-    ],
-    filFields: [],
-    list: [],
-    total: 0,
-  }),
   created() {
     this.search();
   },
-  computed: {
-    ...mapState(['user']),
-  },
   methods: {
-    ...classes(['query', 'delete']),
+    ...trainplan(['query', 'create', 'delete', 'update', 'notice']),
+    ...classes({ getClasses: 'query' }),
     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)) {
         this.$set(this, `list`, res.data);
         this.$set(this, `total`, res.total);
       }
     },
-    toEdit({ data }) {
-      this.$router.push({ path: '/classes/name/list', query: { id: data.id } });
+    toClasses({ data }) {
+      this.$router.push({ path: './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 } });
+    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, '发送成功', '发送失败');
+        }
+      }
     },
-    toBedRoom({ data }) {
-      this.$router.push({ path: '/classes/bedroom', query: { id: data.id } });
+  },
+  computed: {
+    ...mapState(['user']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
     },
   },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
 };
 </script>
 

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

@@ -1,38 +1,36 @@
 <template>
   <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>
 </template>
 
 <script>
 var moment = require('moment');
 import _ from 'lodash';
+import detailFrame from '@frame/layout/admin/detail-frame';
 import teacherForm from '@frame/parts/teacher';
 import { mapState, createNamespacedHelpers } from 'vuex';
 const { mapActions: lesson } = createNamespacedHelpers('lesson');
@@ -47,7 +45,7 @@ export default {
   props: {
     classInfo: { type: Object, default: () => {} },
   },
-  components: { teacherForm },
+  components: { teacherForm, detailFrame },
   data: function() {
     var that = this;
     return {
@@ -195,6 +193,9 @@ export default {
       this.teacherId = id;
       console.log(id);
     },
+    toreturn() {
+      window.history.go(-1);
+    },
   },
   computed: {
     ...mapState(['user']),

+ 4 - 1
src/views/classes/name-list.vue

@@ -1,6 +1,6 @@
 <template>
   <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">
       <data-table :fields="fields" :data="list" :opera="opera" @edit="toEdit" @delete="toDelete" @post="toPost"></data-table>
     </list-frame>
     <el-drawer title="任职" :visible.sync="drawer" direction="rtl" @close="toClose">
@@ -134,6 +134,9 @@ export default {
       this.drawer = false;
       this.form = {};
     },
+    toreturn() {
+      window.history.go(-1);
+    },
   },
   computed: {
     id() {

+ 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>