zoukankan      html  css  js  c++  java
  • vue element -级联选择器,复杂操作,异步加载所有级联选项,并回显 解决因id 有部分重复后导致的bug问题 无法回显的问题

    
    
    <!-- @format -->

    <!-- 模块 校管-课程管理-课表管理 -修改课表信息弹框 -->
    <template>
      <div>
        <el-dialog
          width="600px"
          :title="dialogInfo.title"
          :close-on-click-modal="false"
          :visible="true"
          :before-close="closeSelf"
        >
          <div class="dialog-cont">
            <el-form
              class="create-form"
              :model="dataForm"
              :rules="dataRule"
              ref="ruleForm"
              label-width="110px"
            >
              <el-form-item label="课程名称:" prop="courseName">
                <!--<span class="course-name-box nowrap" :title="dataForm.courseName">{{
                  dataForm.courseName
                }}</span>-->
                <el-input
                  v-model="dataForm.courseName"
                  maxlength="100"
                  show-word-limit
                  placeholder="请输入课程名称"
                ></el-input>
              </el-form-item>
              <el-form-item
                v-if="dialogInfo.pageState === 'edit'"
                label="讲师:"
                prop="teacherName"
              >
                <span class="teacher-holder" v-show="dataForm.teacherName">{{
                  dataForm.teacherName
                }}</span>
                <span @click="showChildDialog">
                  <i class="icon-edit"></i>
                  <span class="edit">修改</span>
                </span>
              </el-form-item>
              <el-form-item label="学段:" prop="phase">
                <el-radio-group v-model="dataForm.phase" @change="getGrade">
                  <el-radio :label="'03'">小学</el-radio>
                  <el-radio :label="'04'">初中</el-radio>
                  <el-radio :label="'05'">高中</el-radio>
                </el-radio-group>
              </el-form-item>
              <el-form-item label="年级:" prop="grade">
                <el-select
                  v-model="dataForm.grade"
                  @change="handleGrade"
                  placeholder="请选择年级"
                >
                  <el-option
                    v-for="(itemindexin gradeArr"
                    :key="index"
                    :label="item.name"
                    :value="item.code"
                  >
                  </el-option>
                </el-select>
              </el-form-item>
              <el-form-item label="学科:" prop="courseNameArr">
                <el-cascader
                  v-if="showCascader"
                  :disabled="!editFlag"
                  ref="cascader"
                  class="cascader"
                  v-model="dataForm.courseNameArr"
                  :props="props"
                  @change="chooseCourse"
                ></el-cascader>
                <span class="tip-message">请先选择学段和年级,再选择学科!</span>
                <!-- <el-input v-model="dataForm.courseName" placeholder="请输入课程名称"></el-input> -->
              </el-form-item>
              <el-form-item
                v-if="dialogInfo.pageState !== 'edit'"
                label="课程简介:"
              >
                <el-input
                  type="textarea"
                  placeholder="请输入课程简介"
                  v-model="dataForm.courseIntroduce"
                  maxlength="50"
                  :rows="2"
                  show-word-limit
                >
                </el-input>
              </el-form-item>
            </el-form>
          </div>
          <div slot="footer" class="dialog-footer">
            <el-button @click="closeSelf()">取消</el-button>
            <el-button type="primary" @click="dataFormSubmit()">确定</el-button>
          </div>
          <el-dialog
            width="800px"
            title="选择讲师"
            :visible.sync="innerVisible"
            append-to-body
          >
            <div class="dialog-cont">
              <div>
                <el-form :inline="trueclass="create-form" label-width="50px">
                  <el-form-item label="姓名:">
                    <el-input
                      v-model="realName"
                      placeholder="请输入姓名"
                    ></el-input>
                  </el-form-item>
                  <el-form-item>
                    <el-button type="warning" @click="searchList">查询</el-button>
                  </el-form-item>
                </el-form>
              </div>
              <div class="table-view">
                <CommonTable
                  :columnsData="columnsData"
                  :tableData="tableData"
                ></CommonTable>
                <pagenation
                  :pageInfo="pageInfo"
                  v-if="tableData.length > 0"
                  @getNewPage="getNewData"
                >
                </pagenation>
              </div>
            </div>
          </el-dialog>
        </el-dialog>
      </div>
    </template>

    <script>
    import CommonTable from '@/components/common/common-table';
    import pagenation from '@/components/common/pagenation';
    import { timeFormatgetDateTime } from '@/utils';
    import { dateUtils } from '@/utils/dateUtils';

    export default {
      name: 'dialog-editCourseTable',
      components: { CommonTablepagenation },
      data() {
        let self = this;
        return {
          pageInfo: {
            total: 0,
            pageSize: 10,
            pageNum: 1
          },
          innerVisible: false,
          showCascader: true,
          dataForm: {
            courseNameArr: [],
            sn: null//为空时为新增,否则为修改
            courseName: '',
            teacherName: '',
            teacherId: '',
            subject: ''//科目
            grade: ''//年级
            phase: '03'//学段
            volume: ''//册别
            edition: ''//版本
            book: ''//教材
            bookUnit: ''//教材目录
            courseIntroduce: '' //课程简介
          },
          dataRule: {
            courseName: [
              { required: truemessage: '课程名称不能为空'trigger: 'change' }
            ],
            courseNameArr: [
              { required: truemessage: '学科不能为空'trigger: 'change' }
            ],
            teacherName: [
              { required: truemessage: '请选择讲师'trigger: 'change' }
            ],
            grade: [{ required: truemessage: '请选择年级'trigger: 'change' }],
            phase: [{ required: truemessage: '请选择学段'trigger: 'change' }]
          },
          gradeArr: [],
          realName: '',
          tableData: [],
          columnsData: [
            {
              label: '姓名',
              prop: 'userName',
               130
            },
            {
              label: '性别',
               130,
              formatter: row => {
                let sex = '男';
                if (row.genderCode === '0') {
                  sex = '男';
                } else if (row.genderCode === '1') {
                  sex = '女';
                } else {
                  sex = '未知';
                }
                return sex;
              }
            },
            {
              label: '账号',
              prop: 'loginName',
               146,
              showOverflowTooltip: true
            },
            {
              label: '授课关系',
               170,
              prop: 'relative'
            },
            {
              type: 'options',
              label: '操作',
              align: 'center',
              render: (h, { row }) => {
                const checkBtn = h(
                  'a',
                  {
                    class: 'btn-option',
                    on: {
                      click: () => {
                        this.chooseTeacher(row); //选择
                      }
                    }
                  },
                  '选择'
                );
                const disabledText = h(
                  'a',
                  {
                    class: 'btn-option disabled',
                    on: {}
                  },
                  '该老师已有课程,不可选择'
                );
                let operationViews = [];
                if (row.status === 1) {
                  operationViews.push(disabledText);
                } else {
                  operationViews.push(checkBtn);
                }
                return h(
                  'div',
                  {
                    class: 'table-opt-btns'
                  },
                  operationViews
                );
              }
            }
          ],
          props: {
            value: 'code',
            label: 'name',
            lazy: true,
            lazyLoad(noderesolve) {
              self.chooseCourseHandle(noderesolve);
            }
          }
        };
      },
      props: {
        checkedArr: {
          type: Array,
          default: () => {
            return [];
          }
        },
        dialogInfo: {
          type: Object,
          default: () => {
            return {
              title: '信息设置',
              pageState: 'edit'
            };
          }
        },
        weekInfo: {
          type: Object,
          default: () => {
            return {};
          }
        },
        tdItem: {
          type: Object,
          default: () => {
            return {};
          }
        },
        timeItem: {
          type: Object,
          default: () => {
            return {};
          }
        },
        selfTeacher: {
          type: Boolean,
          default: false
        }
      },
      watch: {},
      computed: {
        editFlag() {
          return !!(this.dataForm.grade && this.dataForm.phase);
        }
      },
      created() {
        if (!this.selfTeacher) {
          this.getTeachersPage();
        }

        /* 编辑该课程时 设置form 信息*/
        if (this.tdItem.teacherId) {
          this.resetting();
        }
        this.getGrade();
      },
      methods: {
        resetting() {
          this.dataForm = Object.assign(this.dataFormthis.tdItem);
          this.dataForm.courseIntroduce == '0'
            ? (this.dataForm.courseIntroduce = '')
            : null;
          this.dataForm.courseNameArr = [
            this.tdItem.subject + 'subjects',
            this.tdItem.edition + 'editions',
            this.tdItem.volume + 'volums',
            this.tdItem.book + 'books',
            this.tdItem.bookUnit + 'units'
          ];
        },
        //分页
        getNewData(num) {
          this.pageInfo.pageNum = num;
          this.getTeachersPage();
        },
        /* 点击查询 获取老师列表 */
        searchList() {
          this.pageInfo.pageNum = 1;
          this.getTeachersPage();
        },
        /* 获取老师列表 */
        getTeachersPage() {
          let nowTime = dateUtils.getDayByWeekDay(
            this.weekInfo.weekCount,
            this.tdItem.dayNum
          );
          this.$api['course/getTeachersPage']({
            realName: this.realName,
            pageNum: this.pageInfo.pageNum,
            pageSize: this.pageInfo.pageSize,
            startTime: getDateTime(nowTime + ' ' + this.timeItem.startTime),
            endTime: getDateTime(nowTime + ' ' + this.timeItem.endTime),
            dayNum: this.tdItem.dayNum
          })
            .then(res => {
              this.pageInfo.total = res.total;
              this.tableData = res.list;
            })
            .catch(err => {
              // this.$message.error(err);
            });
        },
        /* 提交表单 */
        dataFormSubmit() {
          this.$refs['ruleForm'].validate(valid => {
            if (valid) {
              this.$emit('setCourseInfo'this.dataForm);
              this.$parent.showDialog = false;
            } else {
              console.log('error submit!!');
              return false;
            }
          });
        },
        /* 关闭弹框 */
        closeSelf() {
          this.$parent.showDialog = false;
        },
        /* 打开老师列表弹框 */
        showChildDialog() {
          this.innerVisible = true;
        },
        /* 选择老师方法 */
        chooseTeacher(row) {
          this.dataForm.teacherId = row.id;
          this.dataForm.teacherName = row.userName;
          this.innerVisible = false;
          this.$refs.ruleForm.validateField('teacherName');
        },
        /*级联选择器 选择课程的学科等  */
        chooseCourse(data) {
          let nodeArr = this.$refs.cascader.getCheckedNodes();
          let courseName = '';
          let nameArr = nodeArr[0].pathLabels;
          let idArr = nodeArr[0].path;
          // let bookInfo = nodeArr[0].parent;
          courseName = nameArr[4] + '-' + nameArr[3];
          this.dataForm.courseName = courseName;
          this.dataForm.subject = idArr[0].replace('subjects''');
          this.dataForm.edition = idArr[1].replace('editions''');
          this.dataForm.volume = idArr[2].replace('volums''');
          this.dataForm.book = idArr[3].replace('books''');
          this.dataForm.bookUnit = idArr[4].replace('units''');
          this.$refs.ruleForm.validateField('courseName');
        },
        /* 获取年级 */
        getGrade(val) {
          if (val) {
            this.$nextTick(() => {
              this.dataForm.grade = '';
              this.dataForm.courseNameArr = [];
              this.$refs.cascader.$children[1].loadCount = 0;
              this.$refs.cascader.$children[1].menus = [];
              this.$refs.cascader.$children[1].lazyLoad();
            });
          }
          // this.showCascader = false;
          // this.showCascader = true;
          this.$api['common/getGrades']({
            phase: this.dataForm.phase
          })
            .then(res => {
              this.gradeArr = res;
            })
            .catch(err => {
              // this.$message.error(err);
            });
        },
        /* 下拉值改变 将下方学科级联给清空 */
        handleGrade(val) {
          this.dataForm.courseNameArr = [];
          this.$nextTick(() => {
            this.$refs.cascader.$children[1].loadCount = 0;
            this.$refs.cascader.$children[1].menus = [];
            this.$refs.cascader.$children[1].lazyLoad();
          });
        },
        /* 级联选择器的 回调 根据返回的node对象中的level的值进行判断 */
        chooseCourseHandle(noderesolve) {
          if (node.level == 0) {
            this.getSubjects(noderesolve);
          } else if (node.level == 1) {
            this.getEditions(noderesolve);
          } else if (node.level == 2) {
            this.getVolums(noderesolve);
          } else if (node.level == 3) {
            this.getBooks(noderesolve);
          } else if (node.level == 4) {
            this.getBookUnits(noderesolve);
          }
        },
        /* 获取学科 */
        getSubjects(noderesolve) {
          this.$api['common/getSubjects']({})
            .then(res => {
              res.forEach(item => {
                item.leaf = false;
                item.code = item.code + 'subjects';
              });
              resolve(res);
            })
            .catch(err => {
              // this.$message.error(err);
            });
        },
        /*获取教材版本数据 */
        getEditions(noderesolve) {
          this.dataForm.subject = node.value.replace('subjects''');
          this.$api['common/getEditions']({
            phase: this.dataForm.phase,
            subject: this.dataForm.subject
          })
            .then(res => {
              res.forEach(item => {
                item.leaf = false;
                item.code = item.code + 'editions';
              });
              resolve(res);
            })
            .catch(err => {
              // this.$message.error(err);
            });
        },
        /*获取册别数据 */
        getVolums(noderesolve) {
          this.dataForm.subject = node.path[0].replace(/subjects/g'');
          this.dataForm.edition = node.value.replace('editions''');
          this.$api['common/getVolums']({
            phase: this.dataForm.phase,
            subject: this.dataForm.subject,
            edition: this.dataForm.edition
          })
            .then(res => {
              res.forEach(item => {
                item.leaf = false;
                item.code = item.code + 'volums';
              });
              resolve(res);
            })
            .catch(err => {
              // this.$message.error(err);
            });
        },
        /*获取课本数据 */
        getBooks(noderesolve) {
          this.dataForm.subject = node.path[0].replace(/subjects/g'');
          this.dataForm.volume = node.value.replace('volums''');
          this.$api['common/getBooks']({
            phase: this.dataForm.phase,
            subject: this.dataForm.subject,
            edition: this.dataForm.edition,
            volume: this.dataForm.volume
            // grade: this.dataForm.grade
          })
            .then(res => {
              res.forEach(item => {
                item.leaf = false;
                item.code = item.bookCode + 'books';
                item.name = item.bookName;
              });
              resolve(res);
            })
            .catch(err => {
              // this.$message.error(err);
            });
        },
        /*获取课本目录数据 */
        getBookUnits(noderesolve) {
          this.dataForm.bookCode = node.value.replace('books''');
          this.$api['common/getBookUnits']({
            bookCode: this.dataForm.bookCode
          })
            .then(res => {
              res.forEach(item => {
                item.leaf = true;
                item.code = item.code + 'units';
              });
              resolve(res);
            })
            .catch(err => {
              // this.$message.error(err);
            });
        }
      }
    };
    </script>

    <style scoped lang="less">
    .dialog-cont {
      /deep/.el-cascader {
        line-height30px;
      }
    }
    /deep/.el-table__row {
      .cell {
        text-overflowellipsis;
        overflowhidden;
        white-spacenowrap;
      }
    }
    .cascader {
      width400px;
      positionrelative;
    }
    .teacher-holder {
      margin-right10px;
    }
    .icon-edit {
      backgroundurl('../../assets/images/icon/edit.png');
      width15px;
      height16px;
      displayinline-block;
      margin-right5px;
      margin-bottom-2px;
    }
    .edit {
      line-height24px;
      color#228cf9;
      cursorpointer;
    }
    .course-name-box {
      displayinline-block;
      background-color#fff;
      border-radius4px;
      border1px solid #dcdfe6;
      color#606266;
      font-sizeinherit;
      height30px;
      line-height30px;
      padding0 15px;
      -webkit-transitionborder-color 0.2s cubic-bezier(0.6450.0450.3551);
      transitionborder-color 0.2s cubic-bezier(0.6450.0450.3551);
      width400px;
    }
    .tip-message {
      font-size12px;
      displayinline-block;
      padding-left18px;
      backgroundurl('../../assets/images/icon/icon-tip.png') no-repeat left 2px;
      height16px;
      line-height16px;
      margin-left4px;
      color#999999;
      positionrelative;
      bottom2px;
    }
    </style>
  • 相关阅读:
    pyhon3 mysql的下载和配置
    python3 进程池和线程池
    python3 udp socketserver
    python3 多进程实现socket通讯
    python3 在一个进程内开启多个线程实现socket通讯
    python3 单线程(gevent)实现并发的socket通讯
    python3 协程gevent模块(遇到IO自动切换)
    python3 greenlet模块
    python3 协程函数yeild
    python3 线程队列queue
  • 原文地址:https://www.cnblogs.com/chenhuichao/p/12572228.html
Copyright © 2011-2022 走看看