index.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <template>
  2. <div
  3. class="bs-design-wrap"
  4. :class="`bs-time-count-down-${customTheme}`"
  5. >
  6. <span
  7. v-if="isPast"
  8. style="color: #ea0b30"
  9. >(已过期)</span>
  10. <div
  11. :class="[
  12. 'time',
  13. {
  14. 'light-theme': customTheme === 'light',
  15. 'auto-theme': customTheme == 'auto',
  16. 'dark-theme': customTheme == 'dark'
  17. }
  18. ]"
  19. class="time-text-box"
  20. :style="
  21. 'font-size:' +
  22. config.customize.fontSize +
  23. 'px;color:' +
  24. config.customize.color +
  25. ';font-weight:' +
  26. config.customize.fontWeight
  27. "
  28. >
  29. {{ dateDiff }}
  30. </div>
  31. </div>
  32. </template>
  33. <script>
  34. import paramsMixins from 'packages/js/mixins/paramsMixins'
  35. export default {
  36. name: 'TimeCountDown',
  37. mixins: [paramsMixins],
  38. props: {
  39. config: {
  40. type: Object,
  41. default: () => {}
  42. }
  43. },
  44. data () {
  45. return {
  46. timer: '',
  47. allTime: 0,
  48. date: '',
  49. time: new Date().getTime()
  50. }
  51. },
  52. computed: {
  53. isPast: {
  54. get () {
  55. if (new Date(this.config.endTime).getTime() - this.time < 0) {
  56. return true
  57. } else {
  58. return false
  59. }
  60. }
  61. },
  62. dateDiff: {
  63. // eslint-disable-next-line vue/return-in-computed-property
  64. get () {
  65. if (this.config.endTime) {
  66. return this.dateFormat(
  67. new Date(this.config.endTime).getTime() - this.time
  68. )
  69. }
  70. },
  71. set (val) {
  72. this.allTime = val
  73. }
  74. }
  75. },
  76. watch: {
  77. 'config.endTime': {
  78. handler () {
  79. this.getTime()
  80. },
  81. immediate: true
  82. }
  83. },
  84. mounted () {
  85. this.config.endTime = this.config.endTime
  86. ? new Date(this.config.endTime).getTime()
  87. : new Date().getTime() + 3 * 3600 * 1000 * 24 - 1000
  88. this.getTime()
  89. },
  90. // 销毁定时器
  91. destroyed () {
  92. if (this.timer) {
  93. clearInterval(this.timer) // 关闭
  94. }
  95. },
  96. methods: {
  97. getTime () {
  98. if (this.timer) {
  99. clearInterval(this.timer)
  100. }
  101. this.timer = setInterval(() => {
  102. this.time = this.time + 1000
  103. if (this.dateDiff <= 0) {
  104. clearInterval(this.timer)
  105. }
  106. }, 1000)
  107. },
  108. // 格式化时间
  109. dateFormat (dateDiff) {
  110. if (dateDiff < 0) {
  111. dateDiff = -dateDiff
  112. }
  113. const dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000)) // 计算出相差天数
  114. const leave1 = dateDiff % (24 * 3600 * 1000) // 计算天数后剩余的毫秒数
  115. const hours = Math.floor(leave1 / (3600 * 1000)) // 计算出小时数
  116. // 计算相差分钟数
  117. const leave2 = leave1 % (3600 * 1000) // 计算小时数后剩余的毫秒数
  118. const minutes = Math.floor(leave2 / (60 * 1000)) // 计算相差分钟数
  119. // 计算相差秒数
  120. const leave3 = leave2 % (60 * 1000) // 计算分钟数后剩余的毫秒数
  121. const seconds = Math.round(leave3 / 1000)
  122. // const leave4=leave3%(60*1000) //计算分钟数后剩余的毫秒数
  123. // const minseconds=Math.round(leave4/1000)
  124. const timeFn =
  125. dayDiff +
  126. ' 天 ' +
  127. hours +
  128. ' 小时 ' +
  129. minutes +
  130. ' 分钟 ' +
  131. seconds +
  132. ' 秒'
  133. return timeFn
  134. }
  135. }
  136. }
  137. </script>
  138. <style lang="scss" scoped>
  139. @import "~packages/BasicComponents/fonts/index.css";
  140. .bs-design-wrap{
  141. width: 100%;
  142. }
  143. .time {
  144. height: 100%;
  145. display: flex;
  146. align-items: center;
  147. justify-content: center;
  148. overflow: auto;
  149. }
  150. .light-theme {
  151. background-color: #ffffff;
  152. color: #000000;
  153. }
  154. .dark-theme {
  155. background-color: #000000;
  156. color: #ffffff;
  157. }
  158. .auto-theme {
  159. background-color: transparent;
  160. color: #000000;
  161. }
  162. .time-text-box{
  163. padding: 20px;
  164. display: flex;
  165. align-items: center;
  166. justify-content: center;
  167. white-space:nowrap;
  168. box-sizing: border-box;
  169. overflow: hidden;
  170. }
  171. </style>