基于el-cascader三级联动实现日报周报时间区间选择

做过日报周报月报需求的童鞋就会发现,这块需求好复杂,心想为啥不在提交表单的时候,直接验证就好了,为啥要在选择的时候,难为前端,无奈~~,产品童鞋说用户体验会更好,用户至上!!!

直接上效果图:

每天开始时间、截止时间选项联动规则:
a.时间范围:1小时 ≤ 时间 ≤ 24小时;
b.时间联动规则:当用户先设置开始时间,选择开始时间为 “当日 9时 15分” 时,截止时间可选范围为 “当日 10时 15分” 至 “次日 9时 15分”;当用户先设置截止时间,选择截止时间 “当日 20时 0分”时,开始时间可选范围为“当日 0时 0分” 至“当日 19时 0分”;

每周开始时间、截止时间选项联动规则:
a.时间范围:1小时 ≤ 时间 ≤ 7天;
b.时间联动规则:当用户先设置开始时间,选择开始时间为 “周三 10时 0分” 时,截止时间可选范围为 “周三 11时 0分” 至 “次周三 10时 0分”;当用户先设置截止时间,选择截止时间 “周三 11时 0分”时,开始时间可选范围为“周一 0时 0分” 至“周三 10时 0分”;

直接上代码:

<template>
  <div class="fill-time-select">
    <!-- 填写频率 -->
    <li class="template-setting__content">
      <span class="setting-item">
        填写频率
      </span>
      <div class="template-setting-period setting-value">
        <el-select v-model="defultSubmitCycle" @change="handlePeriodChange" popper-class="template-period-popper">
          <el-option v-for="item in timeOptions" :key="item.value" :label="item.label" :value="item.value">
          </el-option>
        </el-select>
      </div>
    </li>

    <!-- 提交时间段 -->
    <li class="template-setting__content">
      <span class="setting-item">
        开始时间
      </span>
      <div class="template-setting-time-solt setting-value">
        <el-cascader id="sub-startTime" ref="subStartTime" v-model="subStartTime" :options="optionsStartDate" :separator="' '" :placeholder="''" @change="handleStartDateChange" popper-class="template-time-popper log-template-setting">
        </el-cascader>
      </div>
    </li>
    <li class="template-setting__content">
      <span class="setting-item">
        截止时间
      </span>
      <div class="template-setting-time-solt setting-value">
        <el-cascader id="sub-endTime" ref="subEndTime" v-model="subEndTime" :options="optionsEndDate" :separator="' '" :placeholder="''" @change="handleEndDateChange" popper-class="template-time-popper log-template-setting">
        </el-cascader>
      </div>
    </li>
  </div>
</template>
<script>
let submitCycle = 1; //1 日报  2周报
let submitWeek = [
  '周一',
  '周二',
  '周三',
  '周四',
  '周五',
  '周六',
  '周日',
  '次周一',
  '次周二',
  '次周三',
  '次周四',
  '次周五',
  '次周六',
  '次周日',
];
let timeOptions = [
  {
    value: 1,
    label: '每天',
  },
  {
    value: 2,
    label: '每周',
  },
//   {
//     value: 3,
//     label: '每月',
//   },
//   {
//     value: 4,
//     label: '不重复',
//   },
];
let startWeekOptions = [
  {
    value: '周一',
    label: '周一',
    children: [],
  },
  {
    value: '周二',
    label: '周二',
    children: [],
  },
  {
    value: '周三',
    label: '周三',
    children: [],
  },
  {
    value: '周四',
    label: '周四',
    children: [],
  },
  {
    value: '周五',
    label: '周五',
    children: [],
  },
  {
    value: '周六',
    label: '周六',
    children: [],
  },
  {
    value: '周日',
    label: '周日',
    children: [],
  },
];
let endWeekOptions = [
  {
    value: '周二',
    label: '周二',
    children: [],
  },
  {
    value: '周三',
    label: '周三',
    children: [],
  },
  {
    value: '周四',
    label: '周四',
    children: [],
  },
  {
    value: '周五',
    label: '周五',
    children: [],
  },
  {
    value: '周六',
    label: '周六',
    children: [],
  },
  {
    value: '周日',
    label: '周日',
    children: [],
  },
  {
    value: '次周一',
    label: '次周一',
    children: [],
  },
  {
    value: '次周二',
    label: '次周二',
    children: [],
  },
];
let minutesArr = [
  { value: '0', label: '0分' },
  { value: '15', label: '15分' },
  { value: '30', label: '30分' },
  { value: '45', label: '45分' },
];
export default {
  data() {
    return {
      submitPeriod: submitWeek.slice(5),
      minutes: [0, 15, 30, 45],
      optionsStartDate: [],
      optionsEndDate: [],
      defultSubmitCycle: '1',
      subStartTime: ['当日', 0, 0],
      subEndTime: ['次日', 0, 0],
      timeOptions: timeOptions,
      startFirstOptions: [
        {
          value: '当日',
          label: '当日',
          children: [],
        },
      ],
      endFirstOptions: [
        {
          value: '当日',
          label: '当日',
          children: [],
        },
        {
          value: '次日',
          label: '次日',
          children: [],
        },
      ],
    };
  },
  created() {
    this.optionsStartDate = this.getStartDateOptionsDayList(24, 45); //24个小时4个分钟选择
    this.optionsEndDate = this.getEndDateOptionsDayList(0, 0);
    this.defultSubmitCycle = submitCycle;
  },
  components: {},
  computed: {},
  methods: {
    getStartDateOptionsDayList(currentHour, currentMinute) {
      currentHour = currentHour * 1;
      currentMinute = currentMinute * 1;
      let optionsDay = JSON.parse(JSON.stringify(this.startFirstOptions));
      let tempMinArr = []; //开始 当日0时15分,则结束 当日1时15分---次日0时15分
      const len = optionsDay.length;
      let tempWeekArr = JSON.parse(JSON.stringify(submitWeek));
      if (
        tempWeekArr.reverse().slice(7).includes(this.subEndTime[0]) ||
        this.subEndTime[0] == '当日'
      ) {
        for (let i = 0; i < currentHour; i++) {
          if (i === currentHour - 1) {
            tempMinArr = JSON.parse(JSON.stringify(minutesArr));
            tempMinArr.splice(this.minutes.indexOf(currentMinute) + 1);
          } else {
            tempMinArr = minutesArr;
          }
          //最后一天设置
          optionsDay[len - 1].children.push({
            value: i + '',
            label: i + '时',
            children: tempMinArr,
          });
        }
      } else {
        for (let i = 0; i < 24; i++) {
          //最后一天设置
          optionsDay[len - 1].children.push({
            value: i + '',
            label: i + '时',
            children: minutesArr,
          });
        }
      }

      if (optionsDay[0].value !== '当日') {
        for (let i = 0; i < 24; i++) {
          //开始时间第一天到倒数第二天设置
          optionsDay.map((v, index) => {
            if (index == len - 1) return;
            v.children.push({
              value: i + '',
              label: i + '时',
              children: minutesArr,
            });
          });
        }
      }
      return optionsDay;
    },
    getEndDateOptionsDayList(currentHour, currentMinute) {
      currentHour = currentHour * 1;
      currentMinute = currentMinute * 1;
      let optionsDay = JSON.parse(JSON.stringify(this.endFirstOptions));
      let tempMinArr = []; //开始 当日0时15分,则结束 当日1时15分---次日0时15分
      for (let i = currentHour + 1; i < 24; i++) {
        //结束时间首项设置
        if (i === currentHour + 1) {
          tempMinArr = JSON.parse(JSON.stringify(minutesArr));
          tempMinArr = tempMinArr.slice(this.minutes.indexOf(currentMinute));
        } else {
          tempMinArr = minutesArr;
        }
        optionsDay[0].children.push({
          value: i + '',
          label: i + '时',
          children: tempMinArr,
        });
      }
      for (let i = 0; i < currentHour + 1; i++) {
        //结束时间末项设置
        if (i === currentHour) {
          tempMinArr = JSON.parse(JSON.stringify(minutesArr));
          tempMinArr.splice(this.minutes.indexOf(currentMinute) + 1);
        } else {
          tempMinArr = minutesArr;
        }
        optionsDay[optionsDay.length - 1].children.push({
          value: i + '',
          label: i + '时',
          children: tempMinArr,
        });
      }
      if (optionsDay[0].value !== '当日') {
        for (let i = 0; i < 24; i++) {
          const lastIndex = optionsDay.length - 1;
          optionsDay.map((v, index) => {
            if (index === 0 || index === lastIndex) return;
            v.children.push({
              value: i + '',
              label: i + '时',
              children: minutesArr,
            });
          });
        }
      }
      return optionsDay;
    },
    handleStartDateChange(value) {
      this.subStartTime = value;
      console.log(this.subStartTime);
      const day = this.subStartTime[0];
      const hour = this.subStartTime[1];
      const min = this.subStartTime[2];

      const endDay = this.subEndTime[0];
      const endHour = this.subEndTime[1];
      const endMin = this.subEndTime[2];
      let needResetEndTime = false;

      switch (this.defultSubmitCycle) {
        case 1:
          needResetEndTime =
            endHour > hour || (endHour === hour && endMin > min);
          if (endDay === '次日' && needResetEndTime) {
            //保证默认值在范围内
            this.subEndTime[1] = hour;
            this.subEndTime[2] = min;
          }
          break;
        case 2:
          //刷新结束时间选择
          let startIndex = 0;
          this.startFirstOptions.map((item, index) => {
            if (item.value === day) {
              startIndex = index;
            }
          });
          let tempWeeks = JSON.parse(JSON.stringify(submitWeek));
          tempWeeks = tempWeeks.splice(startIndex);
          this.endFirstOptions = [];
          for (let i = 0; i < 8; i++) {
            this.endFirstOptions.push({
              value: tempWeeks[i],
              label: tempWeeks[i],
              children: [],
            });
          }
          //刷新结束时间默认值,保证默认值在范围内
          const endIndex = submitWeek.indexOf(this.subEndTime[0]);
          needResetEndTime =
            startIndex + 7 < endIndex ||
            (startIndex + 7 === endIndex && endHour > hour) ||
            (startIndex + 7 === endIndex && endHour === hour && endMin > min);
          if (needResetEndTime) {
            this.subEndTime[0] = submitWeek[startIndex + 7];
            this.subEndTime[1] = hour;
            this.subEndTime[2] = min;
          }
          break;
      }
      this.optionsEndDate = this.getEndDateOptionsDayList(hour, min);
    },
    handleEndDateChange(value) {
      this.subEndTime = value;
      console.log(this.subEndTime);
      const day = this.subEndTime[0];
      let hour = this.subEndTime[1];
      const min = this.subEndTime[2];
      hour = day === '次日' ? 24 : hour;

      switch (this.defultSubmitCycle) {
        case 1:
          break;
        case 2:
          let tempWeeks = JSON.parse(JSON.stringify(submitWeek));
          let endIndex = tempWeeks.indexOf(day);
          endIndex = endIndex > 6 ? 6 : endIndex;
          this.startFirstOptions = [];
          for (let i = 0; i < endIndex + 1; i++) {
            this.startFirstOptions.push({
              value: tempWeeks[i],
              label: tempWeeks[i],
              children: [],
            });
          }
          break;
      }

      this.optionsStartDate = this.getStartDateOptionsDayList(hour, min);
    },
    handlePeriodChange(value) {
      this.defultSubmitCycle = value;
      switch (value) {
        default:
        case 1:
          this.startFirstOptions = [
            {
              value: '当日',
              label: '当日',
              children: [],
            },
          ];
          this.endFirstOptions = [
            {
              value: '当日',
              label: '当日',
              children: [],
            },
            {
              value: '次日',
              label: '次日',
              children: [],
            },
          ];
          this.subStartTime = ['当日', '0', '0'];
          this.subEndTime = ['次日', '0', '0'];
          this.optionsStartDate = this.getStartDateOptionsDayList(24, 45); //24个小时4个分钟选择
          this.optionsEndDate = this.getEndDateOptionsDayList(0, 0);

          break;
        case 2:
          this.startFirstOptions = startWeekOptions;
          this.endFirstOptions = endWeekOptions;
          this.subStartTime = ['周二', '10', '0'];
          this.subEndTime = ['次周一', '10', '0'];
          this.optionsStartDate = this.getStartDateOptionsDayList(24, 45); //24个小时4个分钟选择
          this.optionsEndDate = this.getEndDateOptionsDayList(10, 0);
          break;
      }
    },
  },
};
</script>
<style lang="scss" scoped>
.setting-subtitle {
  font-size: 18px;
  font-family: PingFangSC-Semibold, PingFang SC;
  font-weight: 600;
  color: #2f3033;
  line-height: 25px;
  margin-bottom: 28px;
  margin-top: 28px;
}
.setting-item {
  font-size: 14px;
  font-family: PingFangSC-Medium, PingFang SC;
  color: #2f3033;
  line-height: 20px;
  margin-bottom: 10px;
  display: block;
}
.setting-value {
  font-size: 14px;
  font-family: PingFangSC-Regular, PingFang SC;
  font-weight: 400;
  color: #2f3033;
  line-height: 22px;
  margin-bottom: 24px;
}
.template-setting-period {
  /deep/ .el-select {
    width: 100%;
    height: 40px;

    &:hover .el-input__inner {
      border-color: #0181ff;
    }
    .el-input__inner {
      padding-left: 12px;
    }
    .el-icon-arrow-up:before {
      color: #b6c5d3;
    }
  }
}

.template-setting-time-solt {
  display: flex;
  justify-content: space-between;
  align-items: center;
  width: 100%;

  #sub-startTime {
    width: 100%;
    height: 40px;
    border-radius: 4px;
  }

  #sub-endTime {
    width: 100%;
    height: 40px;
    border-radius: 4px;
  }

  span {
    margin: auto 14px;
    width: 17px;
    font-size: 14px;
    font-family: PingFangSC, PingFangSC-Regular;
    color: #2f3033;
  }

  /deep/ .el-cascader .el-input .el-icon-arrow-down.is-reverse {
    transform: rotateZ(0);
  }
}
</style>

体验传送门:

https://www.yozocloud.cn/

点击免费使用,进入企业用户端,点击头像出现下拉列表选择管理后台,点击应用服务,日志模板管理,新建模板里的填写要求开关打开,然后就体验啦!!!

 

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值