lrf402788946 4 lat temu
rodzic
commit
97dc21f110
1 zmienionych plików z 344 dodań i 321 usunięć
  1. 344 321
      src/views/lesson/detail.vue

+ 344 - 321
src/views/lesson/detail.vue

@@ -1,321 +1,344 @@
-<template>
-  <div id="detail">
-    <detail-frame :title="pageTitle" returns="./index">
-      <data-form :data="info" :fields="fields" :rules="rules" @save="handleSave" :isNew="isNew" :reset="false">
-        <template #radios="{item}">
-          <template v-if="item.model === 'type'">
-            <el-radio v-for="(i, index) in types" :key="index" :label="i.code">{{ i.name }}</el-radio>
-          </template>
-        </template>
-        <template #custom="{item}">
-          <template v-if="item.model === 'lesson'">
-            <el-row type="flex" align="middle" justify="end" class="btn_bar">
-              <el-col :span="2">
-                <el-button type="primary" size="mini" @click="reset">清空课表</el-button>
-              </el-col>
-              <el-col :span="2">
-                <el-button type="primary" size="mini" @click="toAddEvent">添加时间段</el-button>
-              </el-col>
-              <el-col :span="2">
-                <el-button type="primary" size="mini" @click="toAddDay">添加天数</el-button>
-              </el-col>
-            </el-row>
-            <el-row>
-              <el-col :span="24">
-                <el-table :data="lessons" stripe border>
-                  <el-table-column align="center" label="时间" prop="time"></el-table-column>
-                  <el-table-column align="center" v-for="(d, index) in dayList" :key="index" :label="d.label" :prop="d.prop"></el-table-column>
-                  <el-table-column label="操作" align="center">
-                    <template v-slot="{ row, $index }">
-                      <el-row type="flex" align="middle" justify="center">
-                        <el-col :span="4">
-                          <el-tooltip :key="$index" effect="dark" content="编辑" placement="bottom">
-                            <el-button type="text" size="mini" icon="el-icon-edit" @click="toEdit(row, $index)"></el-button>
-                          </el-tooltip>
-                        </el-col>
-                        <el-col :span="4">
-                          <el-tooltip :key="$index" effect="dark" content="删除" placement="bottom">
-                            <el-button type="text" size="mini" icon="el-icon-delete" @click="todelete(row, $index)"></el-button>
-                          </el-tooltip>
-                        </el-col>
-                      </el-row>
-                    </template>
-                  </el-table-column>
-                </el-table>
-              </el-col>
-            </el-row>
-          </template>
-        </template>
-      </data-form>
-    </detail-frame>
-    <el-drawer :visible.sync="drawer" @close="toClose" direction="rtl" :with-header="false">
-      <el-tabs style="padding:10px;">
-        <el-tab-pane label="课程安排" style="height:93vh;">
-          <el-scrollbar style="height:100%;overflow-x:hidden">
-            <data-form :styles="{ padding: 0 }" :data="form" :fields="oFields" :rules="{}" @save="handleOsave" :isNew="false">
-              <template #radios="{item, form}">
-                <template v-if="isType(item.model, 'radio')">
-                  <el-radio v-for="(i, index) in dayType" :key="index" :label="i.label">{{ i.label }}</el-radio>
-                </template>
-              </template>
-              <template #custom="{item, form}">
-                <template v-if="item.model === 'time'">
-                  <el-time-picker
-                    is-range
-                    v-model="form.time"
-                    range-separator="至"
-                    start-placeholder="开始时间"
-                    end-placeholder="结束时间"
-                    placeholder="选择时间范围"
-                    size="mini"
-                    value-format="HH:mm"
-                    format="HH:mm"
-                  >
-                  </el-time-picker>
-                </template>
-                <template v-if="isType(item.model, 'select')">
-                  <template v-if="form[`${item.model}type`] === '活动'">
-                    <el-select v-model="form[item.model]">
-                      <el-option v-for="(i, index) in actList" :key="index" :label="i.label" :value="i.label"></el-option>
-                    </el-select>
-                  </template>
-                  <template v-else-if="form[`${item.model}type`] === '课程'">
-                    <el-select v-model="form[`${item.model}subid`]">
-                      <el-option v-for="(i, index) in subjectList" :key="index" :label="i.name" :value="i.id"></el-option>
-                    </el-select>
-                  </template>
-                  <template v-else>
-                    请选择当前时间段活动类型
-                  </template>
-                </template>
-              </template>
-            </data-form>
-          </el-scrollbar>
-        </el-tab-pane>
-      </el-tabs>
-    </el-drawer>
-  </div>
-</template>
-
-<script>
-var moment = require('moment');
-import detailFrame from '@frame/layout/admin/detail-frame';
-import dataForm from '@frame/components/form';
-import { lesson as lessons } from '@frame/config/lesson-template';
-import _ from 'lodash';
-import { mapState, createNamespacedHelpers } from 'vuex';
-const { mapActions: subject } = createNamespacedHelpers('subject');
-const { mapActions: lesson } = createNamespacedHelpers('lesson');
-const { mapActions: classtype } = createNamespacedHelpers('classtype');
-export default {
-  name: 'detail',
-  props: {},
-  components: { detailFrame, dataForm },
-  data: () => {
-    return {
-      drawer: false,
-      info: { type: '0' },
-      form: {},
-      fields: [
-        { label: '模板名称', required: true, model: 'title' },
-        { label: '类型', required: true, model: 'type', type: 'radio' },
-        { label: '课程安排', model: 'lesson', custom: true },
-      ],
-      types: [],
-      rules: {
-        title: [{ required: true, message: '请输入模板名称' }],
-        type: [{ required: true, message: '请选择模板类型' }],
-      },
-      oFields: [
-        // { label: '时间', model: 'time', type: 'time', custom: true },
-        // { label: '第一天类型', model: 'day1type', type: 'radio' },
-        // { label: '第一天安排', model: 'day1', custom: true },
-      ],
-      lessons: lessons,
-      dayType: [{ label: '活动' }, { label: '课程' }],
-      actList: [
-        { label: '--' },
-        { label: '报到+开班仪式' },
-        { label: '午餐+休息' },
-        { label: '晚餐' },
-        { label: '团队组建' },
-        { label: '拓展交流' },
-        { label: '课程作业小组展示' },
-        { label: '课程作业' },
-        { label: '礼仪课小组面试' },
-        { label: '结业仪式' },
-      ],
-      dayList: [],
-      subjectList: [],
-      classTypeList: [],
-    };
-  },
-  created() {
-    this.getOtherList();
-  },
-  methods: {
-    ...classtype({ getClassType: 'query' }),
-    ...subject({ getSubjectList: 'query' }),
-    ...lesson(['modelFetch', 'modelCreate', 'modelUpdate']),
-    async search() {
-      const res = await this.modelFetch(this.id);
-      if (this.$checkRes(res)) {
-        this.$set(this, `info`, res.data);
-        let { lessons } = res.data;
-        lessons = JSON.parse(lessons);
-        // 设置天数
-        let keys = [];
-        for (const l of lessons) {
-          let ks = Object.keys(l).filter(f => f.endsWith('type'));
-          keys.push(...ks);
-        }
-        keys = _.uniq(keys);
-        this.toSetDayList(keys.length);
-        this.$set(this, `lessons`, lessons);
-      }
-      this.loading = false;
-    },
-    async handleSave({ isNew, data }) {
-      let res;
-      let msg;
-      data.lessons = JSON.stringify(this.lessons);
-      if (isNew) {
-        res = await this.modelCreate(data);
-        msg = `${this.pageTitle}添加成功`;
-      } else {
-        res = await this.modelUpdate(data);
-        msg = `${this.pageTitle}修改成功`;
-      }
-      if (this.$checkRes(res, msg)) this.$router.push({ path: './index' });
-    },
-    async toEdit(data, index) {
-      let newData = JSON.parse(JSON.stringify(data));
-      newData.index = index;
-      let times = newData.time.split('-');
-      if (times.length === 2) newData.time = times;
-      let subject = await this.getSubjectList({ type: this.info.type });
-      if (subject.errcode === 0) this.$set(this, `subjectList`, subject.data);
-      this.$set(this, `form`, newData);
-      this.toAddEvent();
-    },
-    handleOsave({ data }) {
-      //TODO 将对应另一天的课也改了
-      let { index } = data;
-      if (!_.isArray(_.get(data, 'time'))) {
-        this.$message.error('时间格式错误');
-        console.warning('时间不是数组,之后无法进行转换');
-        return;
-      }
-      data.time = _.join(data.time, '-');
-      if (index != undefined && index >= 0) {
-        let keys = Object.keys(data);
-        let midArr = keys.filter(f => /^day\d$/.test(f));
-        for (const key of midArr) {
-          if (data[`${key}type`] === '课程') data[key] = this.subjectList.find(f => f.id === data[`${key}subid`]).name;
-          else delete data[`${key}subid`];
-        }
-        data = _.omit(data, ['index']);
-        this.$set(this.lessons, index, data);
-      } else {
-        this.lessons.push(data);
-      }
-      this.$set(this, `lessons`, this.getOrderForTime(this.lessons));
-      this.drawer = false;
-    },
-    todelete(row, index) {
-      this.lessons.splice(index, 1);
-    },
-    //根据时间排序
-    getOrderForTime(data) {
-      let duplicate = JSON.parse(JSON.stringify(data));
-      duplicate = duplicate.sort((a, b) => {
-        let a_arr = a.time.split('-');
-        let b_arr = b.time.split('-');
-        let at = moment(`${moment().format('YYYY-MM-DD')} ${a_arr[0]}`).format('X');
-        let bt = moment(`${moment().format('YYYY-MM-DD')} ${b_arr[0]}`).format('X');
-        return at - bt;
-      });
-      return duplicate;
-    },
-    toClose() {
-      this.drawer = false;
-      this.form = {};
-    },
-    isType(model, type) {
-      let reg;
-      if (type === 'radio') reg = /^day\dtype$/;
-      else reg = /^day\d$/;
-      return reg.test(model);
-    },
-    //添加时间段
-    toAddEvent() {
-      let arr = [{ label: '时间', model: 'time', type: 'time', custom: true }];
-      let day = _.get(this.dayList, 'length', 0);
-      for (let i = 1; i <= day; i++) {
-        let obj1 = { label: `第${i}天类型`, model: `day${i}type`, type: 'radio' };
-        let obj2 = { label: `第${i}天安排`, model: `day${i}`, custom: true };
-        arr.push(obj1);
-        arr.push(obj2);
-      }
-      this.$set(this, `oFields`, arr);
-      this.drawer = true;
-    },
-    //添加天数
-    toAddDay() {
-      let len = _.get(this.dayList, 'length', 0);
-      this.toSetDayList(len + 1);
-    },
-    toSetDayList(day) {
-      let res = [];
-      for (let i = 1; i <= day; i++) {
-        let obj = {};
-        obj.label = `第${i}天`;
-        obj.prop = `day${i}`;
-        res.push(obj);
-      }
-      this.$set(this, `dayList`, res);
-    },
-    async getOtherList() {
-      const res = await this.getClassType();
-      if (this.$checkRes(res)) this.$set(this, `types`, res.data);
-    },
-    reset() {
-      this.$set(this, `lessons`, []);
-      this.$set(this, `dayList`, []);
-    },
-    toinit() {
-      this.toSetDayList(6);
-    },
-  },
-  watch: {
-    isNew: {
-      immediate: true,
-      handler(val) {
-        if (!val) this.search();
-        else this.toinit();
-      },
-    },
-  },
-  computed: {
-    ...mapState(['user']),
-    id() {
-      return this.$route.query.id;
-    },
-    isNew() {
-      return this.$route.query.id ? false : true;
-    },
-    pageTitle() {
-      return `${this.$route.meta.title}`;
-    },
-  },
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-};
-</script>
-
-<style lang="less">
-.el-scrollbar__wrap {
-  overflow-x: auto !important;
-}
-</style>
+<template>
+  <div id="detail">
+    <detail-frame :title="pageTitle" returns="./index">
+      <data-form :data="info" :fields="fields" :rules="rules" @save="handleSave" :isNew="isNew" :reset="false">
+        <template #radios="{item}">
+          <template v-if="item.model === 'type'">
+            <el-radio v-for="(i, index) in types" :key="index" :label="i.code">{{ i.name }}</el-radio>
+          </template>
+        </template>
+        <template #custom="{item}">
+          <template v-if="item.model === 'lesson'">
+            <el-row type="flex" align="middle" justify="end" class="btn_bar">
+              <el-col :span="2">
+                <el-button type="primary" size="mini" @click="reset">清空课表</el-button>
+              </el-col>
+              <el-col :span="2">
+                <el-button type="primary" size="mini" @click="toAddEvent">添加时间段</el-button>
+              </el-col>
+              <el-col :span="2">
+                <el-button type="primary" size="mini" @click="toAddDay">添加天数</el-button>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="24">
+                <el-table :data="lessons" stripe border>
+                  <el-table-column align="center" label="时间" prop="time"></el-table-column>
+                  <el-table-column align="center" v-for="(d, index) in dayList" :key="index" :label="d.label" :prop="d.prop">
+                    <template #header>
+                      {{ d.label }} <el-link size="mini" type="danger" icon="el-icon-delete" style="margin-left:5px" @click="deleteDay(d.prop)"></el-link>
+                    </template>
+                  </el-table-column>
+                  <el-table-column label="操作" align="center">
+                    <template v-slot="{ row, $index }">
+                      <el-row type="flex" align="middle" justify="center">
+                        <el-col :span="4">
+                          <el-tooltip :key="$index" effect="dark" content="编辑" placement="bottom">
+                            <el-button type="text" size="mini" icon="el-icon-edit" @click="toEdit(row, $index)"></el-button>
+                          </el-tooltip>
+                        </el-col>
+                        <el-col :span="4">
+                          <el-tooltip :key="$index" effect="dark" content="删除" placement="bottom">
+                            <el-button type="text" size="mini" icon="el-icon-delete" @click="todelete(row, $index)"></el-button>
+                          </el-tooltip>
+                        </el-col>
+                      </el-row>
+                    </template>
+                  </el-table-column>
+                </el-table>
+              </el-col>
+            </el-row>
+          </template>
+        </template>
+      </data-form>
+    </detail-frame>
+    <el-drawer :visible.sync="drawer" @close="toClose" direction="rtl" :with-header="false">
+      <el-tabs style="padding:10px;">
+        <el-tab-pane label="课程安排" style="height:93vh;">
+          <el-scrollbar style="height:100%;overflow-x:hidden">
+            <data-form :styles="{ padding: 0 }" :data="form" :fields="oFields" :rules="{}" @save="handleOsave" :isNew="false">
+              <template #radios="{item, form}">
+                <template v-if="isType(item.model, 'radio')">
+                  <el-radio v-for="(i, index) in dayType" :key="index" :label="i.label">{{ i.label }}</el-radio>
+                </template>
+              </template>
+              <template #custom="{item, form}">
+                <template v-if="item.model === 'time'">
+                  <el-time-picker
+                    is-range
+                    v-model="form.time"
+                    range-separator="至"
+                    start-placeholder="开始时间"
+                    end-placeholder="结束时间"
+                    placeholder="选择时间范围"
+                    size="mini"
+                    value-format="HH:mm"
+                    format="HH:mm"
+                  >
+                  </el-time-picker>
+                </template>
+                <template v-if="isType(item.model, 'select')">
+                  <template v-if="form[`${item.model}type`] === '活动'">
+                    <el-select v-model="form[item.model]">
+                      <el-option v-for="(i, index) in actList" :key="index" :label="i.label" :value="i.label"></el-option>
+                    </el-select>
+                  </template>
+                  <template v-else-if="form[`${item.model}type`] === '课程'">
+                    <el-select v-model="form[`${item.model}subid`]" @change="val => selectLesson(val, item.model)">
+                      <el-option v-for="(i, index) in subjectList" :key="index" :label="i.name" :value="i.id"></el-option>
+                    </el-select>
+                  </template>
+                  <template v-else>
+                    请选择当前时间段活动类型
+                  </template>
+                </template>
+              </template>
+            </data-form>
+          </el-scrollbar>
+        </el-tab-pane>
+      </el-tabs>
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+var moment = require('moment');
+import detailFrame from '@frame/layout/admin/detail-frame';
+import dataForm from '@frame/components/form';
+import { lesson as lessons } from '@frame/config/lesson-template';
+import _ from 'lodash';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: subject } = createNamespacedHelpers('subject');
+const { mapActions: lesson } = createNamespacedHelpers('lesson');
+const { mapActions: classtype } = createNamespacedHelpers('classtype');
+export default {
+  name: 'detail',
+  props: {},
+  components: { detailFrame, dataForm },
+  data: () => {
+    return {
+      drawer: false,
+      info: { type: '0' },
+      form: {},
+      fields: [
+        { label: '模板名称', required: true, model: 'title' },
+        { label: '类型', required: true, model: 'type', type: 'radio' },
+        { label: '课程安排', model: 'lesson', custom: true },
+      ],
+      types: [],
+      rules: {
+        title: [{ required: true, message: '请输入模板名称' }],
+        type: [{ required: true, message: '请选择模板类型' }],
+      },
+      oFields: [
+        // { label: '时间', model: 'time', type: 'time', custom: true },
+        // { label: '第一天类型', model: 'day1type', type: 'radio' },
+        // { label: '第一天安排', model: 'day1', custom: true },
+      ],
+      lessons: lessons,
+      dayType: [{ label: '活动' }, { label: '课程' }],
+      actList: [
+        { label: '--' },
+        { label: '报到+开班仪式' },
+        { label: '午餐+休息' },
+        { label: '晚餐' },
+        { label: '团队组建' },
+        { label: '拓展交流' },
+        { label: '课程作业小组展示' },
+        { label: '课程作业' },
+        { label: '礼仪课小组面试' },
+        { label: '结业仪式' },
+      ],
+      dayList: [],
+      subjectList: [],
+      classTypeList: [],
+    };
+  },
+  created() {
+    this.getOtherList();
+  },
+  methods: {
+    ...classtype({ getClassType: 'query' }),
+    ...subject({ getSubjectList: 'query' }),
+    ...lesson(['modelFetch', 'modelCreate', 'modelUpdate']),
+    async search() {
+      const res = await this.modelFetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `info`, res.data);
+        let { lessons } = res.data;
+        lessons = JSON.parse(lessons);
+        // 设置天数
+        let keys = [];
+        for (const l of lessons) {
+          let ks = Object.keys(l).filter(f => f.endsWith('type'));
+          keys.push(...ks);
+        }
+        keys = _.uniq(keys);
+        this.toSetDayList(keys.length);
+        this.$set(this, `lessons`, lessons);
+      }
+      this.loading = false;
+    },
+    async handleSave({ isNew, data }) {
+      let res;
+      let msg;
+      data.lessons = JSON.stringify(this.lessons);
+      if (isNew) {
+        res = await this.modelCreate(data);
+        msg = `${this.pageTitle}添加成功`;
+      } else {
+        res = await this.modelUpdate(data);
+        msg = `${this.pageTitle}修改成功`;
+      }
+      if (this.$checkRes(res, msg)) this.$router.push({ path: './index' });
+    },
+    async toEdit(data, index) {
+      let newData = JSON.parse(JSON.stringify(data));
+      newData.index = index;
+      let times = newData.time.split('-');
+      if (times.length === 2) newData.time = times;
+      let subject = await this.getSubjectList({ type: this.info.type });
+      if (subject.errcode === 0) this.$set(this, `subjectList`, subject.data);
+      this.$set(this, `form`, newData);
+      this.toAddEvent();
+    },
+    handleOsave({ data }) {
+      //TODO 将对应另一天的课也改了
+      let { index } = data;
+      if (!_.isArray(_.get(data, 'time'))) {
+        this.$message.error('时间格式错误');
+        console.warning('时间不是数组,之后无法进行转换');
+        return;
+      }
+      data.time = _.join(data.time, '-');
+      if (index != undefined && index >= 0) {
+        let keys = Object.keys(data);
+        let midArr = keys.filter(f => /^day\d$/.test(f));
+        for (const key of midArr) {
+          if (data[`${key}type`] === '课程') data[key] = this.subjectList.find(f => f.id === data[`${key}subid`]).name;
+          else delete data[`${key}subid`];
+        }
+        data = _.omit(data, ['index']);
+        this.$set(this.lessons, index, data);
+      } else {
+        this.lessons.push(data);
+      }
+      this.$set(this, `lessons`, this.getOrderForTime(this.lessons));
+      this.drawer = false;
+    },
+    todelete(row, index) {
+      this.lessons.splice(index, 1);
+    },
+    //根据时间排序
+    getOrderForTime(data) {
+      let duplicate = JSON.parse(JSON.stringify(data));
+      duplicate = duplicate.sort((a, b) => {
+        let a_arr = a.time.split('-');
+        let b_arr = b.time.split('-');
+        let at = moment(`${moment().format('YYYY-MM-DD')} ${a_arr[0]}`).format('X');
+        let bt = moment(`${moment().format('YYYY-MM-DD')} ${b_arr[0]}`).format('X');
+        return at - bt;
+      });
+      return duplicate;
+    },
+    toClose() {
+      this.drawer = false;
+      this.form = {};
+    },
+    isType(model, type) {
+      let reg;
+      if (type === 'radio') reg = /^day\dtype$/;
+      else reg = /^day\d$/;
+      return reg.test(model);
+    },
+    //添加时间段
+    toAddEvent() {
+      let arr = [{ label: '时间', model: 'time', type: 'time', custom: true }];
+      let day = _.get(this.dayList, 'length', 0);
+      for (let i = 1; i <= day; i++) {
+        let obj1 = { label: `第${i}天类型`, model: `day${i}type`, type: 'radio' };
+        let obj2 = { label: `第${i}天安排`, model: `day${i}`, custom: true };
+        arr.push(obj1);
+        arr.push(obj2);
+      }
+      this.$set(this, `oFields`, arr);
+      this.drawer = true;
+    },
+    //添加天数
+    toAddDay() {
+      let len = _.get(this.dayList, 'length', 0);
+      this.toSetDayList(len + 1);
+    },
+    toSetDayList(day) {
+      let res = [];
+      for (let i = 1; i <= day; i++) {
+        let obj = {};
+        obj.label = `第${i}天`;
+        obj.prop = `day${i}`;
+        res.push(obj);
+      }
+      this.$set(this, `dayList`, res);
+    },
+    async getOtherList() {
+      const res = await this.getClassType();
+      if (this.$checkRes(res)) this.$set(this, `types`, res.data);
+    },
+    reset() {
+      this.$set(this, `lessons`, []);
+      this.$set(this, `dayList`, []);
+    },
+    toinit() {
+      this.toSetDayList(6);
+    },
+    // 选择课程显示名称
+    selectLesson(val, model) {
+      console.log(val, model);
+      const r = this.subjectList.find(f => f._id === val);
+      if (r) this.$set(this.form, model, r.name);
+    },
+    // 删除天
+    deleteDay(day) {
+      console.log(day);
+      this.dayList = this.dayList.filter(f => f.prop !== day);
+      let dup = _.cloneDeep(this.lessons);
+      dup = dup.map(i =>
+        _.pick(
+          i,
+          Object.keys(i).filter(f => !f.includes(day))
+        )
+      );
+      this.$set(this, 'lessons', dup);
+    },
+  },
+  watch: {
+    isNew: {
+      immediate: true,
+      handler(val) {
+        if (!val) this.search();
+        else this.toinit();
+      },
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+    isNew() {
+      return this.$route.query.id ? false : true;
+    },
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less">
+.el-scrollbar__wrap {
+  overflow-x: auto !important;
+}
+</style>