index.vue 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. <template>
  2. <div class="flex flex-row items-center gap-2">
  3. <el-radio-group v-model="shortcutDays" @change="handleShortcutDaysChange">
  4. <el-radio-button :label="1">昨天</el-radio-button>
  5. <el-radio-button :label="7">最近7天</el-radio-button>
  6. <el-radio-button :label="30">最近30天</el-radio-button>
  7. </el-radio-group>
  8. <el-date-picker
  9. v-model="times"
  10. value-format="YYYY-MM-DD HH:mm:ss"
  11. type="daterange"
  12. start-placeholder="开始日期"
  13. end-placeholder="结束日期"
  14. :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
  15. :shortcuts="shortcuts"
  16. class="!w-240px"
  17. @change="emitDateRangePicker"
  18. />
  19. <slot></slot>
  20. </div>
  21. </template>
  22. <script lang="ts" setup>
  23. import dayjs from 'dayjs'
  24. import * as DateUtil from '@/utils/formatTime'
  25. /** 快捷日期范围选择组件 */
  26. defineOptions({ name: 'ShortcutDateRangePicker' })
  27. const shortcutDays = ref(7) // 日期快捷天数(单选按钮组), 默认7天
  28. const times = ref<[dayjs.ConfigType, dayjs.ConfigType]>(['', '']) // 时间范围参数
  29. defineExpose({ times }) // 暴露时间范围参数
  30. /** 日期快捷选择 */
  31. const shortcuts = [
  32. {
  33. text: '昨天',
  34. value: () => DateUtil.getDayRange(new Date(), -1)
  35. },
  36. {
  37. text: '最近7天',
  38. value: () => DateUtil.getLast7Days()
  39. },
  40. {
  41. text: '本月',
  42. value: () => [dayjs().startOf('M'), dayjs().subtract(1, 'd')]
  43. },
  44. {
  45. text: '最近30天',
  46. value: () => DateUtil.getLast30Days()
  47. },
  48. {
  49. text: '最近1年',
  50. value: () => DateUtil.getLast1Year()
  51. }
  52. ]
  53. /** 设置时间范围 */
  54. function setTimes() {
  55. const beginDate = dayjs().subtract(shortcutDays.value, 'd')
  56. const yesterday = dayjs().subtract(1, 'd')
  57. times.value = DateUtil.getDateRange(beginDate, yesterday)
  58. }
  59. /** 快捷日期单选按钮选中 */
  60. const handleShortcutDaysChange = async () => {
  61. // 设置时间范围
  62. setTimes()
  63. // 发送时间范围选中事件
  64. await emitDateRangePicker()
  65. }
  66. /** 触发事件:时间范围选中 */
  67. const emits = defineEmits<{
  68. (e: 'change', times: [dayjs.ConfigType, dayjs.ConfigType]): void
  69. }>()
  70. /** 触发时间范围选中事件 */
  71. const emitDateRangePicker = async () => {
  72. // 开始与截止在同一天的, 折线图出不来, 需要延长一天
  73. if (DateUtil.isSameDay(times.value[0], times.value[1])) {
  74. // 前天
  75. times.value[0] = DateUtil.formatDate(dayjs(times.value[0]).subtract(1, 'd'))
  76. }
  77. emits('change', times.value)
  78. }
  79. /** 初始化 **/
  80. onMounted(() => {
  81. handleShortcutDaysChange()
  82. })
  83. </script>