index.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  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 'data-room-ui/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.changeStyle()
  86. },
  87. // 销毁定时器
  88. destroyed () {
  89. if (this.timer) {
  90. clearInterval(this.timer) // 关闭
  91. }
  92. },
  93. methods: {
  94. changeStyle (config) {
  95. this.config.endTime = this.config.endTime
  96. ? new Date(this.config.endTime).getTime()
  97. : new Date().getTime() + 3 * 3600 * 1000 * 24 - 1000
  98. this.getTime()
  99. },
  100. getTime () {
  101. if (this.timer) {
  102. clearInterval(this.timer)
  103. }
  104. this.timer = setInterval(() => {
  105. this.time = this.time + 1000
  106. if (this.dateDiff <= 0) {
  107. clearInterval(this.timer)
  108. }
  109. }, 1000)
  110. },
  111. // 格式化时间
  112. dateFormat (dateDiff) {
  113. if (dateDiff < 0) {
  114. dateDiff = -dateDiff
  115. }
  116. const dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000)) // 计算出相差天数
  117. const leave1 = dateDiff % (24 * 3600 * 1000) // 计算天数后剩余的毫秒数
  118. const hours = Math.floor(leave1 / (3600 * 1000)) // 计算出小时数
  119. // 计算相差分钟数
  120. const leave2 = leave1 % (3600 * 1000) // 计算小时数后剩余的毫秒数
  121. const minutes = Math.floor(leave2 / (60 * 1000)) // 计算相差分钟数
  122. // 计算相差秒数
  123. const leave3 = leave2 % (60 * 1000) // 计算分钟数后剩余的毫秒数
  124. const seconds = Math.round(leave3 / 1000)
  125. // const leave4=leave3%(60*1000) //计算分钟数后剩余的毫秒数
  126. // const minseconds=Math.round(leave4/1000)
  127. const timeFn =
  128. dayDiff +
  129. ' 天 ' +
  130. hours +
  131. ' 小时 ' +
  132. minutes +
  133. ' 分钟 ' +
  134. seconds +
  135. ' 秒'
  136. return timeFn
  137. }
  138. }
  139. }
  140. </script>
  141. <style lang="scss" scoped>
  142. @import "../../BasicComponents/fonts/index.css";
  143. .bs-design-wrap{
  144. width: 100%;
  145. }
  146. .time {
  147. height: 100%;
  148. display: flex;
  149. align-items: center;
  150. justify-content: center;
  151. overflow: auto;
  152. }
  153. .light-theme {
  154. background-color: #ffffff;
  155. color: #000000;
  156. }
  157. .dark-theme {
  158. background-color: #000000;
  159. color: #ffffff;
  160. }
  161. .auto-theme {
  162. background-color: transparent;
  163. color: #000000;
  164. }
  165. .time-text-box{
  166. padding: 20px;
  167. display: flex;
  168. align-items: center;
  169. justify-content: center;
  170. white-space:nowrap;
  171. box-sizing: border-box;
  172. overflow: hidden;
  173. }
  174. </style>